From c4140f85df5845d581c8ac438e5b71a18f0bd851 Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Mon, 2 Mar 2026 16:33:40 +0100 Subject: [PATCH] chore(twenty-front): migrate small modules from Emotion to Linaria (PR 1/10) (#18314) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Emotion → Linaria migration — PR 1 of 10 First batch of the `twenty-front` migration from Emotion (runtime CSS-in-JS) to Linaria (zero-runtime, build-time extraction via wyw-in-js). Covers **100 files** across 10 small standalone modules — chosen as the lowest-risk starting point. ### Modules migrated spreadsheet-import (28) · navigation-menu-item (17) · views (14) · billing (10) · blocknote-editor (7) · advanced-text-editor (7) · favorites (7) · navigation (4) · information-banner (3) · sign-in-background-mock (3) ### Migration pattern Every file follows the same mechanical transformation: | Emotion | Linaria | |---|---| | `import styled from '@emotion/styled'` | `import { styled } from '@linaria/react'` | | `${({ theme }) => theme.font.color.primary}` | `${themeCssVariables.font.color.primary}` | | `${({ theme }) => theme.spacing(4)}` | `${themeCssVariables.spacing[4]}` | | `const theme = useTheme()` | `const { theme } = useContext(ThemeContext)` | | `import { type Theme } from '@emotion/react'` | `import { type ThemeType } from 'twenty-ui/theme'` | `themeCssVariables` is a build-time object where every leaf is a `var(--t-xxx)` CSS custom property reference, evaluated statically by wyw-in-js. Runtime theme access (icon sizes, colors passed as props) uses `useContext(ThemeContext)`. ### Gotchas encountered & fixed - **Interpolation return types** — wyw-in-js requires `string | number`, never `false`/`undefined`. Replaced `condition && 'css'` with `condition ? 'css' : ''`. - **`css` tag inside `styled` templates** — Linaria `css` returns a class name, not CSS text. Replaced with plain template strings. - **`styled(Component)` needs `className`** — added `className` prop to `NavigationDrawerSection`, `DropdownMenuItemsContainer`, and `Heading`. - **`shouldForwardProp` not supported** — Linaria filters invalid DOM props automatically for HTML elements. For custom components, used wrapper divs where needed. - **`FormFieldPlaceholderStyles`** — converted from Emotion `css` function to a static string using `themeCssVariables`. --- docs/emotion-to-linaria-migration-plan.md | 381 ++++++ .../components/AdvancedTextEditor.tsx | 27 +- .../components/BubbleMenuIconButton.tsx | 9 +- .../components/TextBubbleMenu.tsx | 12 +- .../components/TurnIntoBlockDropdown.tsx | 23 +- .../components/WorkflowAttachmentChip.tsx | 34 +- .../WorkflowSendEmailAttachments.tsx | 39 +- .../resizable-image/ResizableImageView.tsx | 111 +- .../SettingsBillingCreditsSection.tsx | 5 +- .../SettingsBillingSubscriptionInfo.tsx | 7 +- .../components/SubscriptionBenefit.tsx | 15 +- .../components/SubscriptionInfoContainer.tsx | 13 +- .../billing/components/SubscriptionPrice.tsx | 17 +- .../modules/billing/components/TrialCard.tsx | 13 +- .../internal/MeteredPriceSelector.tsx | 5 +- .../billing/components/internal/PlansTags.tsx | 5 +- .../SettingsBillingLabelValueItem.tsx | 19 +- .../internal/SubscriptionInfoRowContainer.tsx | 21 +- .../blocknote-editor/blocks/FileBlock.tsx | 11 +- .../blocks/MentionInlineContent.tsx | 8 +- .../components/BlockEditor.tsx | 43 +- .../components/CustomMentionMenu.tsx | 2 +- .../components/CustomSideMenu.tsx | 5 +- .../components/CustomSideMenuOptions.tsx | 14 +- .../components/CustomSlashMenu.tsx | 2 +- .../CurrentWorkspaceMemberOrphanFavorites.tsx | 5 +- .../favorites/components/FavoriteIcon.tsx | 5 +- .../components/FavoritesBackButton.tsx | 28 +- .../components/FavoritesDroppable.tsx | 24 +- .../components/FavoritesSkeletonLoader.tsx | 14 +- .../components/FavoriteFolderPickerFooter.tsx | 5 +- .../components/FavoriteFolderPickerList.tsx | 7 +- .../favorites/hooks/__mocks__/useFavorites.ts | 27 +- .../src/modules/file/components/FileIcon.tsx | 16 +- .../modules/file/hooks/useFileIconColors.ts | 21 + .../components/InformationBanner.tsx | 8 +- .../components/InformationBannerWrapper.tsx | 2 +- .../InformationBannerDeletedRecord.tsx | 2 +- .../components/AddToNavigationDragHandle.tsx | 24 +- ...rkspaceMemberOrphanNavigationMenuItems.tsx | 5 +- .../components/NavigationItemDropTarget.tsx | 36 +- .../components/NavigationMenuEditModeBar.tsx | 17 +- .../NavigationMenuItemBackButton.tsx | 28 +- .../NavigationMenuItemDroppable.tsx | 24 +- .../components/NavigationMenuItemIcon.tsx | 5 +- .../NavigationMenuItemIconContainer.tsx | 7 +- .../NavigationMenuItemSkeletonLoader.tsx | 14 +- .../NavigationMenuItemStyleIcon.tsx | 5 +- .../components/ObjectIconWithViewOverlay.tsx | 7 +- ...spaceNavigationMenuItemFolderDragClone.tsx | 5 +- .../WorkspaceNavigationMenuItems.tsx | 5 +- .../WorkspaceNavigationMenuItemsFolder.tsx | 16 +- .../utils/get-color-from-theme.util.ts | 5 +- ...-navigation-menu-item-icon-border-color.ts | 5 +- ...igation-menu-item-icon-style-from-color.ts | 4 +- .../MainNavigationDrawerAIChatContent.tsx | 2 +- .../MainNavigationDrawerNavigationContent.tsx | 2 +- .../MainNavigationDrawerScrollableItems.tsx | 5 +- .../MainNavigationDrawerTabsRow.tsx | 84 +- .../hooks/__mocks__/useFieldMetadataItem.ts | 4 +- .../hooks/__mocks__/useAggregateRecords.ts | 6 +- .../hooks/__mocks__/useDeleteOneRecord.ts | 2 +- .../constants/FormFieldPlaceholderStyles.ts | 13 +- .../record-table-cell/hooks/__mocks__/cell.ts | 9 +- .../RecordTableAggregateFooterCell.tsx | 2 +- .../SignInAppNavigationDrawerMock.tsx | 2 +- .../SignInBackgroundMockContainer.tsx | 2 +- .../components/SignInBackgroundMockPage.tsx | 2 +- .../__mocks__/mockRsiValues.ts | 4 +- .../spreadsheet-import/components/Heading.tsx | 22 +- ...ColumnSelectFieldSelectDropdownContent.tsx | 2 +- .../components/MatchColumnToFieldSelect.tsx | 9 +- .../SpreadSheetImportModalCloseButton.tsx | 2 +- .../SpreadSheetImportModalWrapper.tsx | 4 +- .../components/SpreadsheetImportTable.tsx | 71 +- .../components/StepNavigationButton.tsx | 9 +- .../components/SpreadsheetImportProvider.tsx | 6 +- .../steps/components/ImportDataStep.tsx | 19 +- .../MatchColumnsStep/MatchColumnsStep.tsx | 17 +- .../components/ColumnGrid.tsx | 45 +- .../SubMatchingSelectControlContainer.tsx | 17 +- .../SubMatchingSelectDropdownButton.tsx | 10 +- .../components/SubMatchingSelectRow.tsx | 7 +- .../SubMatchingSelectRowLeftSelect.tsx | 11 +- .../SubMatchingSelectRowRightDropdown.tsx | 2 +- .../components/TemplateColumn.tsx | 11 +- .../components/UnmatchColumn.tsx | 9 +- .../components/UnmatchColumnBanner.tsx | 59 +- .../components/UserTableColumn.tsx | 15 +- .../SelectHeaderStep/SelectHeaderStep.tsx | 5 +- .../SelectSheetStep/SelectSheetStep.tsx | 7 +- .../components/SpreadsheetImportStepper.tsx | 8 +- .../SpreadsheetImportStepperContainer.tsx | 14 +- .../components/UploadStep/UploadStep.tsx | 5 +- .../UploadStep/components/DropZone.tsx | 53 +- .../ValidationStep/ValidationStep.tsx | 27 +- .../ValidationStep/components/columns.tsx | 9 +- .../display/components/BooleanDisplay.tsx | 4 +- .../components/DropdownMenuItemsContainer.tsx | 5 +- .../components/NavigationDrawerSection.tsx | 4 +- .../views/components/SortOrFilterChip.tsx | 52 +- .../components/UpdateViewButtonGroup.tsx | 7 +- .../views/components/ViewBarDetails.tsx | 27 +- ...wBarFilterDropdownAdvancedFilterButton.tsx | 7 +- ...erDropdownAnyFieldSearchButtonMenuItem.tsx | 7 +- .../ViewBarFilterDropdownBottomMenu.tsx | 5 +- .../ViewBarFilterDropdownFieldSelectMenu.tsx | 17 +- .../components/ViewBarSkeletonLoader.tsx | 5 +- .../ViewPickerContentCreateMode.tsx | 9 +- .../components/ViewPickerDropdown.tsx | 17 +- .../ViewPickerIconAndNameContainer.tsx | 9 +- .../components/ViewPickerListContent.tsx | 5 +- .../ViewPickerSaveButtonContainer.tsx | 7 +- .../components/ViewPickerSelectContainer.tsx | 9 +- packages/twenty-front/vite.config.ts | 122 +- packages/twenty-ui/package.json | 9 + packages/twenty-ui/project.json | 18 + .../scripts/generateThemeConstants.ts | 129 ++ .../twenty-ui/src/components/Pill/Pill.tsx | 2 +- .../twenty-ui/src/components/chip/Chip.tsx | 2 +- packages/twenty-ui/src/components/tag/Tag.tsx | 3 +- .../src/display/banner/components/Banner.tsx | 2 +- .../components/SidePanelInformationBanner.tsx | 2 +- .../twenty-ui/src/display/callout/Callout.tsx | 2 +- .../checkmark/components/Checkmark.tsx | 3 +- .../display/color/components/ColorSample.tsx | 3 +- .../command-block/components/CommandBlock.tsx | 2 +- .../components/IllustrationIconWrapper.tsx | 2 +- .../src/display/info/components/Info.tsx | 3 +- .../src/display/status/components/Status.tsx | 7 +- .../text/components/SeparatorLineText.tsx | 2 +- .../src/display/tooltip/AppTooltip.tsx | 2 +- .../display/typography/components/H1Title.tsx | 2 +- .../display/typography/components/H2Title.tsx | 2 +- .../display/typography/components/H3Title.tsx | 2 +- .../display/typography/components/Label.tsx | 2 +- .../typography/components/StyledText.tsx | 2 +- .../src/feedback/loader/components/Loader.tsx | 3 +- .../progress-bar/components/ProgressBar.tsx | 2 +- .../button/components/AnimatedButton.tsx | 3 +- .../components/AnimatedLightIconButton.tsx | 3 +- .../input/button/components/Button/Button.tsx | 3 +- .../Button/internal/ButtonHotKeys.tsx | 2 +- .../components/Button/internal/ButtonIcon.tsx | 3 +- .../components/Button/internal/ButtonText.tsx | 2 +- .../input/button/components/ButtonGroup.tsx | 2 +- .../button/components/ColorPickerButton.tsx | 2 +- .../button/components/FloatingButton.tsx | 3 +- .../button/components/FloatingButtonGroup.tsx | 2 +- .../button/components/FloatingIconButton.tsx | 3 +- .../components/FloatingIconButtonGroup.tsx | 2 +- .../input/button/components/IconButton.tsx | 3 +- .../button/components/IconButtonGroup.tsx | 2 +- .../input/button/components/InsideButton.tsx | 3 +- .../input/button/components/LightButton.tsx | 3 +- .../button/components/LightIconButton.tsx | 3 +- .../input/button/components/MainButton.tsx | 3 +- .../button/components/RoundedIconButton.tsx | 3 +- .../internals/components/StyledTabBase.tsx | 2 +- .../__stories__/TabButton.stories.tsx | 2 +- .../code-editor/components/CodeEditor.tsx | 3 +- .../components/CodeEditorHeader.tsx | 2 +- .../components/ColorSchemeCard.tsx | 7 +- .../components/ColorSchemePicker.tsx | 3 +- .../src/input/components/CardPicker.tsx | 2 +- .../src/input/components/Checkbox.tsx | 2 +- .../twenty-ui/src/input/components/Radio.tsx | 2 +- .../src/input/components/RadioGroup.tsx | 2 +- .../src/input/components/SearchInput.tsx | 3 +- .../twenty-ui/src/input/components/Toggle.tsx | 2 +- .../components/JsonNestedNode.tsx | 3 +- .../components/JsonValueNode.tsx | 2 +- .../components/internal/JsonArrow.tsx | 3 +- .../components/internal/JsonList.tsx | 2 +- .../components/internal/JsonNodeLabel.tsx | 3 +- .../components/internal/JsonNodeValue.tsx | 2 +- .../components/EmptyPlaceholderStyled.tsx | 2 +- .../components/ErrorPlaceholderStyled.tsx | 2 +- .../src/layout/card/components/Card.tsx | 2 +- .../layout/card/components/CardContent.tsx | 2 +- .../src/layout/card/components/CardFooter.tsx | 2 +- .../src/layout/card/components/CardHeader.tsx | 2 +- .../src/layout/section/components/Section.tsx | 2 +- .../components/AdvancedSettingsToggle.tsx | 3 +- .../link/components/ClickToActionLink.tsx | 2 +- .../link/components/ContactLink.tsx | 2 +- .../link/components/RoundedLink.tsx | 2 +- .../navigation/menu/components/MenuPicker.tsx | 3 +- .../menu-item/components/MenuItemHotKeys.tsx | 2 +- .../components/MenuItemMultiSelect.tsx | 3 +- .../components/MenuItemMultiSelectAvatar.tsx | 2 +- .../menu-item/components/MenuItemSelect.tsx | 3 +- .../components/MenuItemSelectAvatar.tsx | 3 +- .../components/MenuItemSuggestion.tsx | 2 +- .../components/MenuItemIconBoxContainer.tsx | 2 +- .../components/MenuItemIconWithGripSwap.tsx | 3 +- .../components/StyledMenuItemBase.tsx | 2 +- .../components/NavigationBar.tsx | 2 +- .../components/NavigationBarItem.tsx | 3 +- .../components/NotificationCounter.tsx | 2 +- .../generated/themeCssVariables.ts | 1100 +++++++++++++++++ .../generated/themeDarkCssVariableEntries.ts | 996 +++++++++++++++ .../generated/themeLightCssVariableEntries.ts | 1000 +++++++++++++++ .../twenty-ui/src/theme-constants/index.ts | 15 + .../src/theme/constants/ThemeCssVariables.ts | 18 - packages/twenty-ui/src/theme/index.ts | 3 - .../ThemeCssVariableInjectorEffect.tsx | 28 +- ...ldThemeReferencingRootCssVariables.test.ts | 41 - ...reThemeForRootCssVariableInjection.test.ts | 41 - .../buildThemeReferencingRootCssVariables.ts | 63 - ...prepareThemeForRootCssVariableInjection.ts | 54 - 211 files changed, 4754 insertions(+), 1114 deletions(-) create mode 100644 docs/emotion-to-linaria-migration-plan.md create mode 100644 packages/twenty-front/src/modules/file/hooks/useFileIconColors.ts create mode 100644 packages/twenty-ui/scripts/generateThemeConstants.ts create mode 100644 packages/twenty-ui/src/theme-constants/generated/themeCssVariables.ts create mode 100644 packages/twenty-ui/src/theme-constants/generated/themeDarkCssVariableEntries.ts create mode 100644 packages/twenty-ui/src/theme-constants/generated/themeLightCssVariableEntries.ts create mode 100644 packages/twenty-ui/src/theme-constants/index.ts delete mode 100644 packages/twenty-ui/src/theme/constants/ThemeCssVariables.ts delete mode 100644 packages/twenty-ui/src/theme/utils/__tests__/buildThemeReferencingRootCssVariables.test.ts delete mode 100644 packages/twenty-ui/src/theme/utils/__tests__/prepareThemeForRootCssVariableInjection.test.ts delete mode 100644 packages/twenty-ui/src/theme/utils/buildThemeReferencingRootCssVariables.ts delete mode 100644 packages/twenty-ui/src/theme/utils/prepareThemeForRootCssVariableInjection.ts diff --git a/docs/emotion-to-linaria-migration-plan.md b/docs/emotion-to-linaria-migration-plan.md new file mode 100644 index 0000000000..d00a1844fa --- /dev/null +++ b/docs/emotion-to-linaria-migration-plan.md @@ -0,0 +1,381 @@ +# Emotion → Linaria Migration Plan: twenty-front + +## Overview + +Migrate all Emotion (`@emotion/styled`, `@emotion/react`) usages in +`packages/twenty-front/src` to Linaria (`@linaria/react`, `@linaria/core`), +following the same patterns already established in the `twenty-ui` package. + +Linaria is a **zero-runtime** CSS-in-JS library. Styles are extracted at +build time by [wyw-in-js](https://wyw-in-js.dev/) (the Vite plugin is +`@wyw-in-js/vite`, already configured in `twenty-front/vite.config.ts`). +This means every expression inside a `styled` or `css` template literal +must be statically evaluable at build time — no runtime theme objects, +no closures over component state, no side-effects. + +**Total files to migrate: ~998** + +| Category | Files | Description | +|---|---|---| +| styled-only | 694 | Import `@emotion/styled` but not `useTheme` | +| styled + useTheme | 224 | Import both `@emotion/styled` and `useTheme` | +| useTheme-only | 79 | Import `useTheme` but not `@emotion/styled` | +| css / Global only | 1 | Import `css` or `Global` from `@emotion/react` only | + +## Theme Architecture + +Two build-time utilities produce the theme system: + +- **`buildThemeReferencingRootCssVariables`** — walks the theme object and + builds a nested mirror where every leaf is a `var(--t-xxx)` string + (evaluated at build time by wyw-in-js) +- **`prepareThemeForRootCssVariableInjection`** — walks the runtime theme + and collects flat `[--css-variable-name, value]` pairs, injected onto + `document.documentElement` by `ThemeCssVariableInjectorEffect` + +`themeCssVariables` is the build-time object; every leaf resolves to a CSS +`var()` reference. It is safe to use inside `styled` and `css` templates +because wyw-in-js can evaluate it statically. + +## Migration Patterns + +### 1. `styled` import + +```diff +- import styled from '@emotion/styled'; ++ import { styled } from '@linaria/react'; +``` + +### 2. Theme access in styled components + +Replace Emotion's `({ theme }) =>` prop-function pattern with static +`themeCssVariables` references: + +```diff ++ import { themeCssVariables } from 'twenty-ui/theme'; + + const StyledTitle = styled.span` +- color: ${({ theme }) => theme.font.color.primary}; +- font-size: ${({ theme }) => theme.font.size.lg}; ++ color: ${themeCssVariables.font.color.primary}; ++ font-size: ${themeCssVariables.font.size.lg}; + `; +``` + +### 3. Spacing + +`theme.spacing(N)` is a function; in Linaria it becomes an indexed lookup: + +```diff +- margin-top: ${({ theme }) => theme.spacing(3)}; ++ margin-top: ${themeCssVariables.spacing[3]}; +``` + +For multi-arg spacing like `theme.spacing(2, 4)` → `"8px 16px"`: + +```diff +- padding: ${({ theme }) => theme.spacing(2, 4)}; ++ padding: ${themeCssVariables.spacing[2]} ${themeCssVariables.spacing[4]}; +``` + +The spacing scale covers integers 0–32 plus `0.5` and `1.5`. Any other +fractional values (`0.25`, `0.75`, `1.25`, `2.5`, `3.5`) must be replaced +with literal pixel values (e.g. `theme.spacing(2.5)` → `10px`). + +### 4. `useTheme` → `useContext(ThemeContext)` + +For runtime theme access (icon sizes, animation durations, conditional logic +outside of styled components): + +```diff +- import { useTheme } from '@emotion/react'; ++ import { useContext } from 'react'; ++ import { ThemeContext } from 'twenty-ui/theme'; + + const MyComponent = () => { +- const theme = useTheme(); ++ const { theme } = useContext(ThemeContext); + return ; + }; +``` + +### 5. `css` template literal + +Linaria's `css` (from `@linaria/core`) returns a **class name string**, not +a serialized style object like Emotion's `css`. This has two consequences: + +**Standalone usage** — apply via `className`, not the `css` prop: + +```diff +- import { css } from '@emotion/react'; ++ import { css } from '@linaria/core'; + + const myClass = css` + text-decoration: none; + `; + +- ++ +``` + +**Inside `styled` templates** — do NOT nest `css` tags. Linaria's `css` +returns a class name, not raw CSS text, so interpolating it inside `styled` +produces broken output. Use plain strings instead: + +```diff + // WRONG — css`` returns a class name, not CSS text + ${({ handle }) => + handle === 'left' +- ? css`left: ${themeCssVariables.spacing[1]};` +- : css`right: ${themeCssVariables.spacing[1]};`} ++ ? `left: ${themeCssVariables.spacing[1]};` ++ : `right: ${themeCssVariables.spacing[1]};`} +``` + +### 6. Interpolation return types + +wyw-in-js requires prop interpolation functions to return `string | number`. +They must **never** return `false`, `undefined`, or `null`. Replace +short-circuit `&&` with ternary expressions: + +```diff + // WRONG — returns false when condition is false +- ${({ isActive }) => isActive && `background: ${themeCssVariables.color.blue};`} + // CORRECT ++ ${({ isActive }) => isActive ? `background: ${themeCssVariables.color.blue};` : ''} +``` + +### 7. Block interpolations (multi-declaration returns) + +Linaria wraps each interpolation result in a single CSS custom property +(`var(--xxx)`). An interpolation that returns **multiple CSS declarations** +produces invalid CSS. Split into one interpolation per property: + +```diff + // WRONG — single interpolation returning multiple declarations +- ${({ divider, theme }) => { +- const border = `1px solid ${theme.border.color.light}`; +- return divider === 'left' ? `border-left: ${border}` : `border-right: ${border}`; +- }} + + // CORRECT — one interpolation per property ++ border-left: ${({ divider }) => ++ divider === 'left' ? `1px solid ${themeCssVariables.border.color.light}` : 'none'}; ++ border-right: ${({ divider }) => ++ divider === 'right' ? `1px solid ${themeCssVariables.border.color.light}` : 'none'}; +``` + +### 8. CSS var + unit concatenation + +CSS custom properties can't be concatenated with unit suffixes directly +(`var(--x)px` is invalid). Use `calc()` to attach units: + +```diff +- transition: background ${themeCssVariables.animation.duration.instant}s ease; ++ transition: background calc(${themeCssVariables.animation.duration.instant} * 1s) ease; +``` + +### 9. `styled(Component)` requires `className` + +Linaria's `styled(Component)` works by passing a generated `className` to +the wrapped component. The component **must** accept and forward a +`className` prop — otherwise the styles are silently lost. If the component +doesn't support it, either add `className` support or use a wrapper div. + +Linaria also does **not** support Emotion's `shouldForwardProp` option. +Custom props on HTML elements are automatically filtered by Linaria's +runtime (via `@emotion/is-prop-valid`). For custom components, all props are +forwarded — ensure the wrapped component ignores unknown props gracefully. + +### 10. `type Theme` → `type ThemeType` + +```diff +- import { type Theme } from '@emotion/react'; ++ import { type ThemeType } from 'twenty-ui/theme'; +``` + +### 11. Framer Motion integration + +Linaria doesn't support `styled(motion.div)` — wrapping a motion element +with `styled()` causes the component body to be stripped at build time by +wyw-in-js. Define the styled component first, then wrap with +`motion.create()`: + +```tsx +const StyledBarBase = styled.div` + background-color: ${themeCssVariables.font.color.primary}; + height: 100%; +`; + +const StyledBar = motion.create(StyledBarBase); +``` + +### 12. Dynamic styles via CSS variables + +When a component needs to compute styles from multiple props with complex +branching logic (e.g. combining `variant`, `accent`, `disabled`, `focus`), +Linaria's prop interpolations become unwieldy. Use a `computeDynamicStyles` +helper that returns a `CSSProperties` object injected via `style={}`, +referenced from the static CSS with `var()`: + +```tsx +const StyledButton = styled.button` + background: var(--btn-bg); + border-color: var(--btn-border-color); + &:hover { background: var(--btn-hover-bg); } +`; + +const dynamicStyles = useMemo(() => { + const s = computeButtonDynamicStyles(variant, accent, ...); + return { + '--btn-bg': s.background, + '--btn-hover-bg': s.hoverBackground, + } as CSSProperties; +}, [variant, accent, ...]); + +return ; +``` + +### 13. `Global` component + +Replace Emotion's `` with standard CSS or the +`ThemeCssVariableInjectorEffect` pattern from twenty-ui. + +### 14. `ThemeProvider` + +The `BaseThemeProvider` already wraps children with both Emotion's +`ThemeProvider` and Linaria's `ThemeContextProvider`. Once all Emotion usages +are gone, the Emotion `ThemeProvider` wrapper can be removed. + +--- + +## PR Breakdown + +Files are grouped to keep each PR around ~100 files with consistent review +surface. We start with the simplest, lowest-risk modules. + +### PR 1 (~97 files) — Small standalone modules + +Low-risk modules with mostly simple `styled`-only patterns. + +| Module | Files | +|---|---| +| spreadsheet-import | 28 | +| billing | 10 | +| views | 14 | +| navigation-menu-item | 14 | +| blocknote-editor | 7 | +| advanced-text-editor | 7 | +| favorites | 7 | +| navigation | 4 | +| information-banner | 3 | +| sign-in-background-mock | 3 | + +### PR 2 (~100 files) — Auth, tiny modules, loading, testing, pages (part 1) + +| Module | Files | +|---|---| +| auth | 19 | +| action-menu | 3 | +| object-metadata | 3 | +| onboarding | 2 | +| workspace | 2 | +| file | 2 | +| error-handler | 2 | +| front-components | 1 | +| geo-map | 1 | +| hooks | 1 | +| loading | 5 | +| testing | 5 | +| pages (first ~55 files) | ~55 | + +### PR 3 (~97 files) — Pages (remaining) + activities + AI + +| Module | Files | +|---|---| +| pages (remaining ~16 files) | ~16 | +| activities | 53 | +| ai | 28 | + +### PR 4 (~100 files) — Command-menu + workflow (part 1) + +| Module | Files | +|---|---| +| command-menu | 53 | +| workflow (first ~47 files) | ~47 | + +### PR 5 (~115 files) — Workflow (remaining) + page-layout + +| Module | Files | +|---|---| +| workflow (remaining ~32 files) | ~32 | +| page-layout | 83 | + +### PR 6 (~100 files) — UI module (part 1) + +| Module | Files | +|---|---| +| ui (first ~100 files) | ~100 | + +### PR 7 (~85 files) — UI module (remaining) + object-record (start) + +| Module | Files | +|---|---| +| ui (remaining ~23 files) | ~23 | +| object-record (first ~62 files) | ~62 | + +### PR 8 (~100 files) — Object-record (continued) + +| Module | Files | +|---|---| +| object-record (next ~100 files) | ~100 | + +### PR 9 (~100 files) — Settings (part 1) + +| Module | Files | +|---|---| +| settings (first ~100 files) | ~100 | + +### PR 10 (~102 files) — Settings (part 2) + final cleanup + +| Module | Files | +|---|---| +| settings (remaining ~102 files) | ~102 | +| css/Global-only file | 1 | + +### Post-migration PR — Remove Emotion + +Once all PRs are merged: + +- Remove `ThemeProvider` from `@emotion/react` in `BaseThemeProvider` +- Remove `@emotion/styled` and `@emotion/react` dependencies +- Remove `@styled/typescript-styled-plugin` from tsconfig +- Clean up any remaining Emotion-related configuration + +--- + +## Risk Assessment + +| Risk | Mitigation | +|---|---| +| wyw-in-js evaluates at build time; dynamic expressions may fail | Use `themeCssVariables` for static theme values; pass dynamic values as component props or via `style={}` CSS variables | +| `theme.spacing(N)` function → `themeCssVariables.spacing[N]` index | Pre-computed for integers 0–32 plus 0.5 and 1.5; other fractional values → literal pixel values | +| `useTheme` used for runtime logic (not just styles) | Replace with `useContext(ThemeContext)`, destructure `{ theme }` | +| Multi-arg `theme.spacing(a, b, c)` | Split into individual `themeCssVariables.spacing[N]` references | +| `css` tag inside `styled` templates | Linaria `css` returns class name, not CSS text; use plain strings inside `styled` | +| Interpolation returns `false` / `undefined` | wyw-in-js requires `string \| number`; use ternary `? : ''` instead of `&&` | +| Block interpolations (multiple declarations) | Split into one interpolation per CSS property | +| `var(--x)px` concatenation | Use `calc(var(--x) * 1px)` | +| `styled(motion.div)` stripped by wyw-in-js | Use `motion.create(StyledBase)` pattern | +| `styled(Component)` with no `className` prop | Add `className` support to wrapped component or use wrapper div | +| Complex multi-prop style branching | Use `computeDynamicStyles` + `style={}` + `var()` references | + +--- + +## Validation Checklist (per PR) + +- [ ] `npx nx lint:diff-with-main twenty-front` passes +- [ ] `npx nx typecheck twenty-front` passes +- [ ] `npx nx test twenty-front` passes +- [ ] Visual spot-check of affected components in the app +- [ ] No remaining `@emotion/styled` or `@emotion/react` imports in migrated files diff --git a/packages/twenty-front/src/modules/advanced-text-editor/components/AdvancedTextEditor.tsx b/packages/twenty-front/src/modules/advanced-text-editor/components/AdvancedTextEditor.tsx index f2bfe2259a..b472124ac1 100644 --- a/packages/twenty-front/src/modules/advanced-text-editor/components/AdvancedTextEditor.tsx +++ b/packages/twenty-front/src/modules/advanced-text-editor/components/AdvancedTextEditor.tsx @@ -2,8 +2,9 @@ import { ImageBubbleMenu } from '@/advanced-text-editor/components/ImageBubbleMe import { LinkBubbleMenu } from '@/advanced-text-editor/components/LinkBubbleMenu'; import { TextBubbleMenu } from '@/advanced-text-editor/components/TextBubbleMenu'; import { FORM_FIELD_PLACEHOLDER_STYLES } from '@/object-record/record-field/ui/form-types/constants/FormFieldPlaceholderStyles'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { EditorContent, type Editor } from '@tiptap/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledEditorContainer = styled.div<{ readonly?: boolean; @@ -24,14 +25,16 @@ const StyledEditorContainer = styled.div<{ } .tiptap { - padding: ${({ theme }) => `${theme.spacing(1)} ${theme.spacing(2)}`}; + padding: ${themeCssVariables.spacing[1]} ${themeCssVariables.spacing[2]}; box-sizing: border-box; height: 100%; - color: ${({ theme, readonly }) => - readonly ? theme.font.color.light : theme.font.color.primary}; - font-family: ${({ theme }) => theme.font.family}; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.regular}; + color: ${({ readonly }) => + readonly + ? themeCssVariables.font.color.light + : themeCssVariables.font.color.primary}; + font-family: ${themeCssVariables.font.family}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.regular}; border: none !important; p.is-editor-empty:first-of-type::before { @@ -48,10 +51,10 @@ const StyledEditorContainer = styled.div<{ } .variable-tag { - background-color: ${({ theme }) => theme.color.blue3}; - border-radius: ${({ theme }) => theme.border.radius.sm}; - color: ${({ theme }) => theme.color.blue}; - padding: ${({ theme }) => theme.spacing(1)}; + background-color: ${themeCssVariables.color.blue3}; + border-radius: ${themeCssVariables.border.radius.sm}; + color: ${themeCssVariables.color.blue}; + padding: ${themeCssVariables.spacing[1]}; } h1 { @@ -67,7 +70,7 @@ const StyledEditorContainer = styled.div<{ } li { - margin-bottom: ${({ theme }) => theme.spacing(2)}; + margin-bottom: ${themeCssVariables.spacing[2]}; line-height: 1.5; } } diff --git a/packages/twenty-front/src/modules/advanced-text-editor/components/BubbleMenuIconButton.tsx b/packages/twenty-front/src/modules/advanced-text-editor/components/BubbleMenuIconButton.tsx index 4e0c06aab5..062bc3958a 100644 --- a/packages/twenty-front/src/modules/advanced-text-editor/components/BubbleMenuIconButton.tsx +++ b/packages/twenty-front/src/modules/advanced-text-editor/components/BubbleMenuIconButton.tsx @@ -1,7 +1,8 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import React from 'react'; import type { IconComponent } from 'twenty-ui/display'; import { FloatingIconButton } from 'twenty-ui/input'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; type BubbleMenuIconButtonProps = { className?: string; @@ -14,9 +15,9 @@ type BubbleMenuIconButtonProps = { const StyledBubbleMenuIconButton = styled(FloatingIconButton)` border: none; - border-radius: ${({ theme }) => theme.spacing(1.5)}; - width: ${({ theme }) => theme.spacing(6)}; - height: ${({ theme }) => theme.spacing(6)}; + border-radius: ${themeCssVariables.spacing[1.5]}; + width: ${themeCssVariables.spacing[6]}; + height: ${themeCssVariables.spacing[6]}; `; export const BubbleMenuIconButton = ({ diff --git a/packages/twenty-front/src/modules/advanced-text-editor/components/TextBubbleMenu.tsx b/packages/twenty-front/src/modules/advanced-text-editor/components/TextBubbleMenu.tsx index 3aedcb9220..e7e87cbe71 100644 --- a/packages/twenty-front/src/modules/advanced-text-editor/components/TextBubbleMenu.tsx +++ b/packages/twenty-front/src/modules/advanced-text-editor/components/TextBubbleMenu.tsx @@ -3,7 +3,7 @@ import { EditLinkPopover } from '@/advanced-text-editor/components/EditLinkPopov import { TurnIntoBlockDropdown } from '@/advanced-text-editor/components/TurnIntoBlockDropdown'; import { useTextBubbleState } from '@/advanced-text-editor/hooks/useTextBubbleState'; import { isTextSelected } from '@/advanced-text-editor/utils/isTextSelected'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { type Editor } from '@tiptap/core'; import { BubbleMenu } from '@tiptap/react/menus'; import { @@ -14,13 +14,15 @@ import { IconStrikethrough, IconUnderline, } from 'twenty-ui/display'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; export const StyledBubbleMenuContainer = styled.div` backdrop-filter: blur(20px); - background-color: ${({ theme }) => theme.background.primary}; - border-radius: ${({ theme }) => theme.border.radius.md}; - box-shadow: ${({ theme }) => - `0px 2px 4px 0px ${theme.background.transparent.light}, 0px 0px 4px 0px ${theme.background.transparent.medium}`}; + background-color: ${themeCssVariables.background.primary}; + border-radius: ${themeCssVariables.border.radius.md}; + box-shadow: + 0px 2px 4px 0px ${themeCssVariables.background.transparent.light}, + 0px 0px 4px 0px ${themeCssVariables.background.transparent.medium}; display: inline-flex; gap: 2px; padding: 2px; diff --git a/packages/twenty-front/src/modules/advanced-text-editor/components/TurnIntoBlockDropdown.tsx b/packages/twenty-front/src/modules/advanced-text-editor/components/TurnIntoBlockDropdown.tsx index bde42a1484..eb1213e555 100644 --- a/packages/twenty-front/src/modules/advanced-text-editor/components/TurnIntoBlockDropdown.tsx +++ b/packages/twenty-front/src/modules/advanced-text-editor/components/TurnIntoBlockDropdown.tsx @@ -3,32 +3,33 @@ import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { DropdownContent } from '@/ui/layout/dropdown/components/DropdownContent'; import { DropdownMenuItemsContainer } from '@/ui/layout/dropdown/components/DropdownMenuItemsContainer'; import { useToggleDropdown } from '@/ui/layout/dropdown/hooks/useToggleDropdown'; -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { t } from '@lingui/core/macro'; import { type Editor } from '@tiptap/react'; -import { useId } from 'react'; +import { useContext, useId } from 'react'; import { IconPilcrow } from 'twenty-ui/display'; import { MenuItem } from 'twenty-ui/navigation'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledMenuItem = styled.button` align-items: center; background: none; border: none; - color: ${({ theme }) => theme.font.color.tertiary}; + color: ${themeCssVariables.font.color.tertiary}; cursor: pointer; display: flex; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.regular}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.regular}; gap: 4px; - height: ${({ theme }) => theme.spacing(6)}; + height: ${themeCssVariables.spacing[6]}; padding: 0; width: 100%; - padding: 0 ${({ theme }) => theme.spacing(1.5)}; - border-radius: ${({ theme }) => theme.spacing(1.5)}; + padding: 0 ${themeCssVariables.spacing[1.5]}; + border-radius: ${themeCssVariables.spacing[1.5]}; :hover { - background: ${({ theme }) => theme.background.transparent.medium}; + background: ${themeCssVariables.background.transparent.medium}; } :focus { @@ -43,7 +44,7 @@ type TurnIntoBlockDropdownProps = { export const TurnIntoBlockDropdown = ({ editor, }: TurnIntoBlockDropdownProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const instanceId = useId(); const dropdownId = `turn-into-block-dropdown-${instanceId}`; diff --git a/packages/twenty-front/src/modules/advanced-text-editor/components/WorkflowAttachmentChip.tsx b/packages/twenty-front/src/modules/advanced-text-editor/components/WorkflowAttachmentChip.tsx index 02294e3bc9..e2d4eb2564 100644 --- a/packages/twenty-front/src/modules/advanced-text-editor/components/WorkflowAttachmentChip.tsx +++ b/packages/twenty-front/src/modules/advanced-text-editor/components/WorkflowAttachmentChip.tsx @@ -1,11 +1,13 @@ import { getFileType } from '@/activities/files/utils/getFileType'; import { useFileCategoryColors } from '@/file/hooks/useFileCategoryColors'; import { IconMapping } from '@/file/utils/fileIconMappings'; -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { useContext } from 'react'; import { type WorkflowAttachment } from 'twenty-shared/workflow'; import { AvatarOrIcon } from 'twenty-ui/components'; import { IconX } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; type WorkflowAttachmentChipProps = { file: WorkflowAttachment; @@ -15,20 +17,20 @@ type WorkflowAttachmentChipProps = { const StyledChip = styled.div<{ deletable: boolean }>` align-items: center; - background-color: ${({ theme }) => theme.background.transparent.light}; - border: 1px solid ${({ theme }) => theme.border.color.medium}; - border-radius: ${({ theme }) => theme.border.radius.sm}; - column-gap: ${({ theme }) => theme.spacing(1)}; + background-color: ${themeCssVariables.background.transparent.light}; + border: 1px solid ${themeCssVariables.border.color.medium}; + border-radius: ${themeCssVariables.border.radius.sm}; + column-gap: ${themeCssVariables.spacing[1]}; display: inline-flex; flex-direction: row; flex-shrink: 0; max-width: 140px; - padding-left: ${({ theme }) => theme.spacing(1)}; + padding-left: ${themeCssVariables.spacing[1]}; `; const StyledLabel = styled.span` - color: ${({ theme }) => theme.font.color.primary}; - font-size: ${({ theme }) => theme.font.size.sm}; + color: ${themeCssVariables.font.color.primary}; + font-size: ${themeCssVariables.font.size.sm}; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; @@ -43,18 +45,18 @@ const StyledDelete = styled.button` margin: 0; padding: 0; cursor: pointer; - font-size: ${({ theme }) => theme.font.size.sm}; + font-size: ${themeCssVariables.font.size.sm}; user-select: none; flex-shrink: 0; background: none; border: none; - color: ${({ theme }) => theme.font.color.tertiary}; - border-top-right-radius: ${({ theme }) => theme.border.radius.sm}; - border-bottom-right-radius: ${({ theme }) => theme.border.radius.sm}; + color: ${themeCssVariables.font.color.tertiary}; + border-top-right-radius: ${themeCssVariables.border.radius.sm}; + border-bottom-right-radius: ${themeCssVariables.border.radius.sm}; &:hover { - background-color: ${({ theme }) => theme.background.transparent.medium}; - color: ${({ theme }) => theme.font.color.primary}; + background-color: ${themeCssVariables.background.transparent.medium}; + color: ${themeCssVariables.font.color.primary}; } `; @@ -64,7 +66,7 @@ export const WorkflowAttachmentChip = ({ readonly = false, }: WorkflowAttachmentChipProps) => { const iconColors = useFileCategoryColors(); - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( diff --git a/packages/twenty-front/src/modules/advanced-text-editor/components/WorkflowSendEmailAttachments.tsx b/packages/twenty-front/src/modules/advanced-text-editor/components/WorkflowSendEmailAttachments.tsx index a1e75ad70e..ce68b31bef 100644 --- a/packages/twenty-front/src/modules/advanced-text-editor/components/WorkflowSendEmailAttachments.tsx +++ b/packages/twenty-front/src/modules/advanced-text-editor/components/WorkflowSendEmailAttachments.tsx @@ -2,13 +2,14 @@ import { WorkflowAttachmentChip } from '@/advanced-text-editor/components/Workfl import { useUploadWorkflowFile } from '@/advanced-text-editor/hooks/useUploadWorkflowFile'; import { InputLabel } from '@/ui/input/components/InputLabel'; -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; -import { type ChangeEvent, useRef } from 'react'; +import { type ChangeEvent, useContext, useRef } from 'react'; import { isDefined } from 'twenty-shared/utils'; import { type WorkflowAttachment } from 'twenty-shared/workflow'; import { IconUpload } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; type WorkflowSendEmailAttachmentsProps = { files: WorkflowAttachment[]; @@ -26,21 +27,21 @@ const StyledFileInput = styled.input` `; const StyledUploadArea = styled.div<{ hasFiles: boolean }>` - background-color: ${({ theme }) => theme.background.transparent.lighter}; - border: 1px solid ${({ theme }) => theme.border.color.medium}; - border-radius: ${({ theme }) => theme.border.radius.sm}; + background-color: ${themeCssVariables.background.transparent.lighter}; + border: 1px solid ${themeCssVariables.border.color.medium}; + border-radius: ${themeCssVariables.border.radius.sm}; display: flex; flex-direction: column; min-height: ${({ hasFiles }) => (hasFiles ? 'auto' : '24px')}; justify-content: center; - padding-top: ${({ theme }) => theme.spacing(1)}; - padding-bottom: ${({ theme }) => theme.spacing(1)}; - padding-left: ${({ theme }) => theme.spacing(2)}; - padding-right: ${({ theme }) => theme.spacing(2)}; + padding-top: ${themeCssVariables.spacing[1]}; + padding-bottom: ${themeCssVariables.spacing[1]}; + padding-left: ${themeCssVariables.spacing[2]}; + padding-right: ${themeCssVariables.spacing[2]}; &:hover { - background-color: ${({ theme }) => theme.background.transparent.light}; - border-color: ${({ theme }) => theme.border.color.strong}; + background-color: ${themeCssVariables.background.transparent.light}; + border-color: ${themeCssVariables.border.color.strong}; } `; @@ -48,17 +49,17 @@ const StyledChipsContainer = styled.div` display: flex; flex-direction: row; flex-wrap: wrap; - gap: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[1]}; `; const StyledUploadAreaLabel = styled.div` justify-content: center; - color: ${({ theme }) => theme.font.color.tertiary}; + color: ${themeCssVariables.font.color.tertiary}; display: flex; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.medium}; - color: ${({ theme }) => theme.font.color.secondary}; - gap: ${({ theme }) => theme.spacing(1)}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.medium}; + color: ${themeCssVariables.font.color.secondary}; + gap: ${themeCssVariables.spacing[1]}; `; export const WorkflowSendEmailAttachments = ({ @@ -69,7 +70,7 @@ export const WorkflowSendEmailAttachments = ({ const fileInputRef = useRef(null); const { uploadWorkflowFile } = useUploadWorkflowFile(); const { t } = useLingui(); - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const handleAddFileClick = (e: React.MouseEvent) => { const target = e.target as HTMLElement; diff --git a/packages/twenty-front/src/modules/advanced-text-editor/extensions/resizable-image/ResizableImageView.tsx b/packages/twenty-front/src/modules/advanced-text-editor/extensions/resizable-image/ResizableImageView.tsx index fd57cdd153..12cec7ff09 100644 --- a/packages/twenty-front/src/modules/advanced-text-editor/extensions/resizable-image/ResizableImageView.tsx +++ b/packages/twenty-front/src/modules/advanced-text-editor/extensions/resizable-image/ResizableImageView.tsx @@ -1,29 +1,26 @@ -import { css } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { type NodeViewProps, NodeViewWrapper } from '@tiptap/react'; import React, { useCallback, useRef, useState } from 'react'; import { isDefined } from 'twenty-shared/utils'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const IMAGE_MIN_WIDTH = 32; const IMAGE_MAX_WIDTH = 600; -const StyledNodeViewWrapper = styled(NodeViewWrapper)` +const StyledNodeViewWrapperContainer = styled.div<{ + align?: string; +}>` height: 100%; ${({ align }) => { switch (align) { case 'left': - return css` - margin-left: 0; - `; + return 'margin-left: 0;'; case 'right': - return css` - margin-right: 0; - `; + return 'margin-right: 0;'; case 'center': - return css` - margin-left: auto; - margin-right: auto; - `; + return 'margin-left: auto; margin-right: auto;'; + default: + return ''; } }} `; @@ -43,28 +40,21 @@ const StyledImage = styled.img` `; const StyledImageHandle = styled.div<{ handle: 'left' | 'right' }>` - border-radius: ${({ theme }) => theme.border.radius.md}; - background-color: ${({ theme }) => theme.background.primaryInverted}; - border: 1px solid ${({ theme }) => theme.background.primary}; + border-radius: ${themeCssVariables.border.radius.md}; + background-color: ${themeCssVariables.background.primaryInverted}; + border: 1px solid ${themeCssVariables.background.primary}; cursor: col-resize; - height: ${({ theme }) => theme.spacing(8)}; + height: ${themeCssVariables.spacing[8]}; position: absolute; top: 50%; transform: translateY(-50%); - width: ${({ theme }) => theme.spacing(2)}; + width: ${themeCssVariables.spacing[2]}; z-index: 1; - ${({ handle, theme }) => { - if (handle === 'left') { - return css` - left: ${theme.spacing(1)}; - `; - } - - return css` - right: ${theme.spacing(1)}; - `; - }} + ${({ handle }) => + handle === 'left' + ? `left: ${themeCssVariables.spacing[1]};` + : `right: ${themeCssVariables.spacing[1]};`} `; type ResizeParams = { @@ -179,37 +169,38 @@ export const ResizableImageView = (props: ResizableImageViewProps) => { }, []); return ( - - + - - - {/* Show resize handles when hovering over image OR actively resizing */} - {(isHovering || isDefined(resizeParams)) && ( - <> - handleImageHandleMouseDown('left', e)} - /> - handleImageHandleMouseDown('right', e)} - /> - - )} - - - + + + + {(isHovering || isDefined(resizeParams)) && ( + <> + handleImageHandleMouseDown('left', e)} + /> + handleImageHandleMouseDown('right', e)} + /> + + )} + + + + ); }; diff --git a/packages/twenty-front/src/modules/billing/components/SettingsBillingCreditsSection.tsx b/packages/twenty-front/src/modules/billing/components/SettingsBillingCreditsSection.tsx index 2f7dda323b..28e4fae762 100644 --- a/packages/twenty-front/src/modules/billing/components/SettingsBillingCreditsSection.tsx +++ b/packages/twenty-front/src/modules/billing/components/SettingsBillingCreditsSection.tsx @@ -8,12 +8,13 @@ import { useCurrentMetered } from '@/billing/hooks/useCurrentMetered'; import { useGetWorkflowNodeExecutionUsage } from '@/billing/hooks/useGetWorkflowNodeExecutionUsage'; import { useNumberFormat } from '@/localization/hooks/useNumberFormat'; import { useSubscriptionStatus } from '@/workspace/hooks/useSubscriptionStatus'; -import { useTheme } from '@emotion/react'; import { t } from '@lingui/core/macro'; +import { useContext } from 'react'; import { formatToShortNumber } from 'twenty-shared/utils'; import { H2Title, HorizontalSeparator } from 'twenty-ui/display'; import { ProgressBar } from 'twenty-ui/feedback'; import { Section } from 'twenty-ui/layout'; +import { ThemeContext } from 'twenty-ui/theme'; import { SubscriptionStatus } from '~/generated-metadata/graphql'; export const SettingsBillingCreditsSection = ({ @@ -59,7 +60,7 @@ export const SettingsBillingCreditsSection = ({ currentBillingSubscription.interval, ); - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( <> diff --git a/packages/twenty-front/src/modules/billing/components/SettingsBillingSubscriptionInfo.tsx b/packages/twenty-front/src/modules/billing/components/SettingsBillingSubscriptionInfo.tsx index 396c5b8572..c9c4ec21b7 100644 --- a/packages/twenty-front/src/modules/billing/components/SettingsBillingSubscriptionInfo.tsx +++ b/packages/twenty-front/src/modules/billing/components/SettingsBillingSubscriptionInfo.tsx @@ -27,7 +27,7 @@ import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal'; import { useModal } from '@/ui/layout/modal/hooks/useModal'; import { useSubscriptionStatus } from '@/workspace/hooks/useSubscriptionStatus'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState'; import { useMemo, useState } from 'react'; @@ -45,6 +45,7 @@ import { } from 'twenty-ui/display'; import { Button } from 'twenty-ui/input'; import { Section } from 'twenty-ui/layout'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { BillingPlanKey, BillingProductKey, @@ -83,8 +84,8 @@ const CANCEL_SWITCH_METERED_PRICE_MODAL_ID = const StyledSwitchButtonContainer = styled.div` align-items: center; display: flex; - gap: ${({ theme }) => theme.spacing(2)}; - margin-top: ${({ theme }) => theme.spacing(4)}; + gap: ${themeCssVariables.spacing[2]}; + margin-top: ${themeCssVariables.spacing[4]}; `; export const SettingsBillingSubscriptionInfo = ({ diff --git a/packages/twenty-front/src/modules/billing/components/SubscriptionBenefit.tsx b/packages/twenty-front/src/modules/billing/components/SubscriptionBenefit.tsx index a7934896ff..f30be08d79 100644 --- a/packages/twenty-front/src/modules/billing/components/SubscriptionBenefit.tsx +++ b/packages/twenty-front/src/modules/billing/components/SubscriptionBenefit.tsx @@ -1,18 +1,19 @@ -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; -import React from 'react'; +import { styled } from '@linaria/react'; +import React, { useContext } from 'react'; import { IconCheck } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledBenefitContainer = styled.div` - color: ${({ theme }) => theme.font.color.secondary}; + color: ${themeCssVariables.font.color.secondary}; display: flex; flex-direction: row; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; `; const StyledCheckContainer = styled.div` align-items: center; - background-color: ${({ theme }) => theme.background.tertiary}; + background-color: ${themeCssVariables.background.tertiary}; border-radius: 50%; display: flex; height: 16px; @@ -23,7 +24,7 @@ type SubscriptionBenefitProps = { children: React.ReactNode; }; export const SubscriptionBenefit = ({ children }: SubscriptionBenefitProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( diff --git a/packages/twenty-front/src/modules/billing/components/SubscriptionInfoContainer.tsx b/packages/twenty-front/src/modules/billing/components/SubscriptionInfoContainer.tsx index 3cf74d2636..5e8984083b 100644 --- a/packages/twenty-front/src/modules/billing/components/SubscriptionInfoContainer.tsx +++ b/packages/twenty-front/src/modules/billing/components/SubscriptionInfoContainer.tsx @@ -1,13 +1,14 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledSubscriptionInfoContainer = styled.div` - background-color: ${({ theme }) => theme.background.secondary}; - border: 1px solid ${({ theme }) => theme.border.color.medium}; - border-radius: ${({ theme }) => theme.border.radius.md}; + background-color: ${themeCssVariables.background.secondary}; + border: 1px solid ${themeCssVariables.border.color.medium}; + border-radius: ${themeCssVariables.border.radius.md}; display: flex; flex-direction: column; - gap: ${({ theme }) => theme.spacing(3)}; - padding: ${({ theme }) => theme.spacing(3)}; + gap: ${themeCssVariables.spacing[3]}; + padding: ${themeCssVariables.spacing[3]}; width: 100%; `; diff --git a/packages/twenty-front/src/modules/billing/components/SubscriptionPrice.tsx b/packages/twenty-front/src/modules/billing/components/SubscriptionPrice.tsx index f2eaa95eb7..4e0a92621c 100644 --- a/packages/twenty-front/src/modules/billing/components/SubscriptionPrice.tsx +++ b/packages/twenty-front/src/modules/billing/components/SubscriptionPrice.tsx @@ -1,5 +1,6 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { SubscriptionInterval } from '~/generated-metadata/graphql'; type SubscriptionPriceProps = { @@ -8,16 +9,16 @@ type SubscriptionPriceProps = { }; const StyledPriceSpan = styled.span` - color: ${({ theme }) => theme.font.color.primary}; - font-size: ${({ theme }) => theme.font.size.xxl}; - font-weight: ${({ theme }) => theme.font.weight.semiBold}; - margin-bottom: ${({ theme }) => theme.spacing(1)}; + color: ${themeCssVariables.font.color.primary}; + font-size: ${themeCssVariables.font.size.xxl}; + font-weight: ${themeCssVariables.font.weight.semiBold}; + margin-bottom: ${themeCssVariables.spacing[1]}; `; const StyledPriceUnitSpan = styled.span` - color: ${({ theme }) => theme.font.color.light}; - font-size: ${({ theme }) => theme.font.size.md}; - font-weight: ${({ theme }) => theme.font.weight.medium}; + color: ${themeCssVariables.font.color.light}; + font-size: ${themeCssVariables.font.size.md}; + font-weight: ${themeCssVariables.font.weight.medium}; `; const formatYearlyPriceToMonthly = (price: number): number => { diff --git a/packages/twenty-front/src/modules/billing/components/TrialCard.tsx b/packages/twenty-front/src/modules/billing/components/TrialCard.tsx index e3b61f67af..b215930db0 100644 --- a/packages/twenty-front/src/modules/billing/components/TrialCard.tsx +++ b/packages/twenty-front/src/modules/billing/components/TrialCard.tsx @@ -1,5 +1,6 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; type TrialCardProps = { duration: number; @@ -12,15 +13,15 @@ const StyledTrialCardContainer = styled.div` `; const StyledTrialDurationContainer = styled.div` - color: ${({ theme }) => theme.font.color.secondary}; - font-size: ${({ theme }) => theme.font.size.md}; + color: ${themeCssVariables.font.color.secondary}; + font-size: ${themeCssVariables.font.size.md}; display: flex; - margin-bottom: ${({ theme }) => theme.spacing(2)}; + margin-bottom: ${themeCssVariables.spacing[2]}; `; const StyledCreditCardRequirementContainer = styled.div` - color: ${({ theme }) => theme.font.color.tertiary}; - font-size: ${({ theme }) => theme.font.size.md}; + color: ${themeCssVariables.font.color.tertiary}; + font-size: ${themeCssVariables.font.size.md}; display: flex; `; diff --git a/packages/twenty-front/src/modules/billing/components/internal/MeteredPriceSelector.tsx b/packages/twenty-front/src/modules/billing/components/internal/MeteredPriceSelector.tsx index 680c56acc0..21d623bb37 100644 --- a/packages/twenty-front/src/modules/billing/components/internal/MeteredPriceSelector.tsx +++ b/packages/twenty-front/src/modules/billing/components/internal/MeteredPriceSelector.tsx @@ -12,12 +12,13 @@ import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { Select } from '@/ui/input/components/Select'; import { ConfirmationModal } from '@/ui/layout/modal/components/ConfirmationModal'; import { useModal } from '@/ui/layout/modal/hooks/useModal'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { t } from '@lingui/core/macro'; import { useState } from 'react'; import { findOrThrow, isDefined } from 'twenty-shared/utils'; import { H2Title } from 'twenty-ui/display'; import { Button } from 'twenty-ui/input'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { useSetMeteredSubscriptionPriceMutation, SubscriptionInterval, @@ -27,7 +28,7 @@ const StyledRow = styled.div` align-items: flex-end; display: flex; flex-wrap: wrap; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; `; const StyledSelect = styled(Select)` diff --git a/packages/twenty-front/src/modules/billing/components/internal/PlansTags.tsx b/packages/twenty-front/src/modules/billing/components/internal/PlansTags.tsx index e40f3ac340..15011d719d 100644 --- a/packages/twenty-front/src/modules/billing/components/internal/PlansTags.tsx +++ b/packages/twenty-front/src/modules/billing/components/internal/PlansTags.tsx @@ -2,7 +2,8 @@ import React from 'react'; import { Tag } from 'twenty-ui/components'; import { t } from '@lingui/core/macro'; import { BillingPlanKey } from '~/generated-metadata/graphql'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; export type PlansTagsProps = { plan: BillingPlanKey; @@ -11,7 +12,7 @@ export type PlansTagsProps = { const StyledTagsWrapper = styled.div` display: flex; - gap: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[1]}; `; export const PlansTags = ({ plan, isTrialPeriod = false }: PlansTagsProps) => { diff --git a/packages/twenty-front/src/modules/billing/components/internal/SettingsBillingLabelValueItem.tsx b/packages/twenty-front/src/modules/billing/components/internal/SettingsBillingLabelValueItem.tsx index 0d76647192..5692c4f874 100644 --- a/packages/twenty-front/src/modules/billing/components/internal/SettingsBillingLabelValueItem.tsx +++ b/packages/twenty-front/src/modules/billing/components/internal/SettingsBillingLabelValueItem.tsx @@ -1,4 +1,5 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; type SettingsBillingLabelValueItemProps = { label: string; @@ -12,16 +13,18 @@ const StyledContainer = styled.div` `; const StyledLabelSpan = styled.span` - color: ${({ theme }) => theme.font.color.tertiary}; - font-size: ${({ theme }) => theme.font.size.xs}; - font-weight: ${({ theme }) => theme.font.weight.semiBold}; + color: ${themeCssVariables.font.color.tertiary}; + font-size: ${themeCssVariables.font.size.xs}; + font-weight: ${themeCssVariables.font.weight.semiBold}; `; const StyledValueSpan = styled.span<{ isPrimaryColor: boolean }>` - color: ${({ theme, isPrimaryColor }) => - isPrimaryColor ? theme.font.color.primary : theme.font.color.secondary}; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.medium}; + color: ${({ isPrimaryColor }) => + isPrimaryColor + ? themeCssVariables.font.color.primary + : themeCssVariables.font.color.secondary}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.medium}; `; export const SettingsBillingLabelValueItem = ({ diff --git a/packages/twenty-front/src/modules/billing/components/internal/SubscriptionInfoRowContainer.tsx b/packages/twenty-front/src/modules/billing/components/internal/SubscriptionInfoRowContainer.tsx index a9a2d5d005..2cbfd5c366 100644 --- a/packages/twenty-front/src/modules/billing/components/internal/SubscriptionInfoRowContainer.tsx +++ b/packages/twenty-front/src/modules/billing/components/internal/SubscriptionInfoRowContainer.tsx @@ -1,8 +1,9 @@ import { type IconComponent } from 'twenty-ui/display'; -import React from 'react'; -import styled from '@emotion/styled'; -import { useTheme } from '@emotion/react'; +import React, { useContext } from 'react'; +import { styled } from '@linaria/react'; import { t } from '@lingui/core/macro'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; type SubscriptionInfoRowContainerProps = { Icon: IconComponent; @@ -13,16 +14,16 @@ type SubscriptionInfoRowContainerProps = { const StyledContainer = styled.div` align-items: center; - gap: ${({ theme }) => theme.spacing(1)}; - color: ${({ theme }) => theme.font.color.primary}; + gap: ${themeCssVariables.spacing[1]}; + color: ${themeCssVariables.font.color.primary}; display: grid; grid-template-columns: repeat(3, 1fr); `; const StyledIconLabelContainer = styled.div` align-items: center; - gap: ${({ theme }) => theme.spacing(1)}; - color: ${({ theme }) => theme.font.color.tertiary}; + gap: ${themeCssVariables.spacing[1]}; + color: ${themeCssVariables.font.color.tertiary}; display: flex; `; @@ -33,8 +34,8 @@ const StyledLabelContainer = styled.div` `; const StyledHeaderText = styled.div` - color: ${({ theme }) => theme.font.color.tertiary}; - font-size: ${({ theme }) => theme.font.size.sm}; + color: ${themeCssVariables.font.color.tertiary}; + font-size: ${themeCssVariables.font.size.sm}; `; export const SubscriptionInfoHeaderRow = ({ show }: { show: boolean }) => { @@ -54,7 +55,7 @@ export const SubscriptionInfoRowContainer = ({ currentValue, nextValue, }: SubscriptionInfoRowContainerProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( diff --git a/packages/twenty-front/src/modules/blocknote-editor/blocks/FileBlock.tsx b/packages/twenty-front/src/modules/blocknote-editor/blocks/FileBlock.tsx index a2c93dbe4a..ea7475e95f 100644 --- a/packages/twenty-front/src/modules/blocknote-editor/blocks/FileBlock.tsx +++ b/packages/twenty-front/src/modules/blocknote-editor/blocks/FileBlock.tsx @@ -1,8 +1,9 @@ import { createReactBlockSpec } from '@blocknote/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { isNonEmptyString } from '@sniptt/guards'; import { type ChangeEvent, useRef } from 'react'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { type AttachmentFileCategory } from '@/activities/files/types/AttachmentFileCategory'; import { getFileType } from '@/activities/files/utils/getFileType'; @@ -18,23 +19,23 @@ const StyledFileInput = styled.input` const StyledFileLine = styled.div` align-items: center; display: flex; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; `; const StyledLink = styled.a` align-items: center; - color: ${({ theme }) => theme.font.color.primary}; + color: ${themeCssVariables.font.color.primary}; display: flex; text-decoration: none; :hover { - color: ${({ theme }) => theme.font.color.secondary}; + color: ${themeCssVariables.font.color.secondary}; } `; const StyledUploadFileContainer = styled.div` align-items: center; display: flex; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; `; export const FileBlock = createReactBlockSpec( diff --git a/packages/twenty-front/src/modules/blocknote-editor/blocks/MentionInlineContent.tsx b/packages/twenty-front/src/modules/blocknote-editor/blocks/MentionInlineContent.tsx index 8a6f120296..101a5851ea 100644 --- a/packages/twenty-front/src/modules/blocknote-editor/blocks/MentionInlineContent.tsx +++ b/packages/twenty-front/src/modules/blocknote-editor/blocks/MentionInlineContent.tsx @@ -3,26 +3,26 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat import { RecordChip } from '@/object-record/components/RecordChip'; import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord'; import { createReactInlineContentSpec } from '@blocknote/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { t } from '@lingui/core/macro'; import { isNonEmptyString } from '@sniptt/guards'; import { isDefined } from 'twenty-shared/utils'; import { Chip, ChipVariant } from 'twenty-ui/components'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; const StyledRecordChip = styled(RecordChip)` height: auto; margin: 0; - padding: ${({ theme }) => `0 ${theme.spacing(1)}`}; + padding: 0 ${themeCssVariables.spacing[1]}; `; const StyledInlineMentionRecordChip = styled(MentionRecordChip)` height: auto; margin: 0; - padding: ${({ theme }) => `0 ${theme.spacing(1)}`}; + padding: 0 ${themeCssVariables.spacing[1]}; `; -// Backward-compatible renderer for legacy notes that only stored objectMetadataId + recordId const LegacyMentionRenderer = ({ recordId, objectMetadataId, diff --git a/packages/twenty-front/src/modules/blocknote-editor/components/BlockEditor.tsx b/packages/twenty-front/src/modules/blocknote-editor/components/BlockEditor.tsx index ebab4264f7..a346a75a8b 100644 --- a/packages/twenty-front/src/modules/blocknote-editor/components/BlockEditor.tsx +++ b/packages/twenty-front/src/modules/blocknote-editor/components/BlockEditor.tsx @@ -1,9 +1,10 @@ import { filterSuggestionItems } from '@blocknote/core/extensions'; import { BlockNoteView } from '@blocknote/mantine'; import { SuggestionMenuController } from '@blocknote/react'; -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; -import { type ClipboardEvent } from 'react'; +import { styled } from '@linaria/react'; +import { type ClipboardEvent, useContext } from 'react'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { type BLOCK_SCHEMA } from '@/blocknote-editor/blocks/Schema'; import { getSlashMenu } from '@/blocknote-editor/utils/getSlashMenu'; @@ -31,11 +32,11 @@ const StyledEditor = styled.div` & .editor { background: transparent; font-size: 13px; - color: ${({ theme }) => theme.font.color.primary}; + color: ${themeCssVariables.font.color.primary}; min-height: 400px; } & .editor [class^='_inlineContent']:before { - color: ${({ theme }) => theme.font.color.tertiary}; + color: ${themeCssVariables.font.color.tertiary}; font-style: normal !important; } & .editor .bn-inline-content:has(> .ProseMirror-trailingBreak):before { @@ -55,8 +56,8 @@ const StyledEditor = styled.div` align-items: center; } & .bn-drag-handle-menu { - background: ${({ theme }) => theme.background.transparent.secondary}; - backdrop-filter: ${({ theme }) => theme.blur.medium}; + background: ${themeCssVariables.background.transparent.secondary}; + backdrop-filter: ${themeCssVariables.blur.medium}; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.04), 2px 4px 16px rgba(0, 0, 0, 0.12); @@ -64,7 +65,7 @@ const StyledEditor = styled.div` min-height: 96px; padding: 4px; border-radius: 8px; - border: 1px solid ${({ theme }) => theme.border.color.medium}; + border: 1px solid ${themeCssVariables.border.color.medium}; left: 26px; } @@ -83,9 +84,9 @@ const StyledEditor = styled.div` & .bn-suggestion-menu { padding: 4px; border-radius: 8px; - border: 1px solid ${({ theme }) => theme.border.color.medium}; - background: ${({ theme }) => theme.background.transparent.secondary}; - backdrop-filter: ${({ theme }) => theme.blur.medium}; + border: 1px solid ${themeCssVariables.border.color.medium}; + background: ${themeCssVariables.background.transparent.secondary}; + backdrop-filter: ${themeCssVariables.blur.medium}; } & .mantine-Menu-item { @@ -94,17 +95,17 @@ const StyledEditor = styled.div` min-height: 32px; font-style: normal; - font-family: ${({ theme }) => theme.font.family}; - font-weight: ${({ theme }) => theme.font.weight.regular}; - color: ${({ theme }) => theme.font.color.secondary}; + font-family: ${themeCssVariables.font.family}; + font-weight: ${themeCssVariables.font.weight.regular}; + color: ${themeCssVariables.font.color.secondary}; } & .mantine-ActionIcon-root:hover { box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.08), 0px 2px 4px rgba(0, 0, 0, 0.04); - background: ${({ theme }) => theme.background.transparent.primary}; + background: ${themeCssVariables.background.transparent.primary}; backdrop-filter: blur(20px); - border: 1px solid ${({ theme }) => theme.border.color.light}; + border: 1px solid ${themeCssVariables.border.color.light}; } & .bn-side-menu .mantine-UnstyledButton-root:not(.mantine-Menu-item) svg { height: 16px; @@ -119,17 +120,17 @@ const StyledEditor = styled.div` } & .bn-inline-content a { - color: ${({ theme }) => theme.color.blue}; + color: ${themeCssVariables.color.blue}; } & .bn-inline-content code { font-family: monospace; - color: ${({ theme }) => theme.font.color.danger}; + color: ${themeCssVariables.font.color.danger}; padding: 2px 4px; border-radius: 4px; - border: 1px solid ${({ theme }) => theme.font.color.extraLight}; + border: 1px solid ${themeCssVariables.font.color.extraLight}; font-size: 0.9rem; - background-color: ${({ theme }) => theme.background.transparent.light}; + background-color: ${themeCssVariables.background.transparent.light}; } `; @@ -141,7 +142,7 @@ export const BlockEditor = ({ onPaste, readonly, }: BlockEditorProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const blockNoteTheme = theme.name === 'light' ? 'light' : 'dark'; const getMentionItems = useMentionMenu(editor); diff --git a/packages/twenty-front/src/modules/blocknote-editor/components/CustomMentionMenu.tsx b/packages/twenty-front/src/modules/blocknote-editor/components/CustomMentionMenu.tsx index 82ffea690a..2ef358b2a1 100644 --- a/packages/twenty-front/src/modules/blocknote-editor/components/CustomMentionMenu.tsx +++ b/packages/twenty-front/src/modules/blocknote-editor/components/CustomMentionMenu.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { autoUpdate, useFloating } from '@floating-ui/react'; import { motion } from 'framer-motion'; import { type MouseEvent as ReactMouseEvent } from 'react'; diff --git a/packages/twenty-front/src/modules/blocknote-editor/components/CustomSideMenu.tsx b/packages/twenty-front/src/modules/blocknote-editor/components/CustomSideMenu.tsx index 9b5bee249b..bae5090053 100644 --- a/packages/twenty-front/src/modules/blocknote-editor/components/CustomSideMenu.tsx +++ b/packages/twenty-front/src/modules/blocknote-editor/components/CustomSideMenu.tsx @@ -9,16 +9,17 @@ import { SideMenu, SideMenuController, } from '@blocknote/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; import { IconColorSwatch, IconPlus, IconTrash } from 'twenty-ui/display'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; type CustomSideMenuProps = { editor: typeof BLOCK_SCHEMA.BlockNoteEditor; }; const StyledDivToCreateGap = styled.div` - width: ${({ theme }) => theme.spacing(2)}; + width: ${themeCssVariables.spacing[2]}; `; export const CustomSideMenu = ({ editor }: CustomSideMenuProps) => { diff --git a/packages/twenty-front/src/modules/blocknote-editor/components/CustomSideMenuOptions.tsx b/packages/twenty-front/src/modules/blocknote-editor/components/CustomSideMenuOptions.tsx index 7f2c81e201..9b6cc0dc28 100644 --- a/packages/twenty-front/src/modules/blocknote-editor/components/CustomSideMenuOptions.tsx +++ b/packages/twenty-front/src/modules/blocknote-editor/components/CustomSideMenuOptions.tsx @@ -1,14 +1,16 @@ -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { useContext } from 'react'; import { type IconComponent } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledContainer = styled.div<{ Variant: Variants }>` - color: ${({ theme, Variant }) => - Variant === 'danger' ? theme.color.red : 'inherit'}; + color: ${({ Variant }) => + Variant === 'danger' ? themeCssVariables.color.red : 'inherit'}; align-items: center; display: flex; flex-direction: row; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; `; const StyledTextContainer = styled.div``; @@ -26,7 +28,7 @@ export const CustomSideMenuOptions = ({ Variant, text, }: CustomSideMenuOptionsProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( theme.betweenSiblingsGap}; + margin-bottom: ${themeCssVariables.betweenSiblingsGap}; `; export const CurrentWorkspaceMemberOrphanFavorites = () => { diff --git a/packages/twenty-front/src/modules/favorites/components/FavoriteIcon.tsx b/packages/twenty-front/src/modules/favorites/components/FavoriteIcon.tsx index 03a7cb59ec..8de9d9d5b7 100644 --- a/packages/twenty-front/src/modules/favorites/components/FavoriteIcon.tsx +++ b/packages/twenty-front/src/modules/favorites/components/FavoriteIcon.tsx @@ -1,10 +1,11 @@ import { type ProcessedFavorite } from '@/favorites/utils/sortFavorites'; import { useGetStandardObjectIcon } from '@/object-metadata/hooks/useGetStandardObjectIcon'; -import { useTheme } from '@emotion/react'; +import { useContext } from 'react'; import { Avatar, useIcons } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; export const FavoriteIcon = ({ favorite }: { favorite: ProcessedFavorite }) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const { getIcon } = useIcons(); const { Icon: StandardIcon, IconColor } = useGetStandardObjectIcon( favorite.objectNameSingular || '', diff --git a/packages/twenty-front/src/modules/favorites/components/FavoritesBackButton.tsx b/packages/twenty-front/src/modules/favorites/components/FavoritesBackButton.tsx index daf1c01719..f614e2bc7c 100644 --- a/packages/twenty-front/src/modules/favorites/components/FavoritesBackButton.tsx +++ b/packages/twenty-front/src/modules/favorites/components/FavoritesBackButton.tsx @@ -1,29 +1,31 @@ import { currentFavoriteFolderIdState } from '@/ui/navigation/navigation-drawer/states/currentFavoriteFolderIdState'; import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState'; -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { useContext } from 'react'; import { IconX } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledBackButton = styled.button` display: flex; align-items: center; - gap: ${({ theme }) => theme.spacing(2)}; - padding-left: ${({ theme }) => theme.spacing(1)}; - padding-right: ${({ theme }) => theme.spacing(0.5)}; - padding-top: ${({ theme }) => theme.spacing(1)}; - padding-bottom: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[2]}; + padding-left: ${themeCssVariables.spacing[1]}; + padding-right: ${themeCssVariables.spacing[0.5]}; + padding-top: ${themeCssVariables.spacing[1]}; + padding-bottom: ${themeCssVariables.spacing[1]}; width: 100%; background: transparent; border: none; - color: ${({ theme }) => theme.font.color.secondary}; - font-weight: ${({ theme }) => theme.font.weight.medium}; - font-family: ${({ theme }) => theme.font.family}; + color: ${themeCssVariables.font.color.secondary}; + font-weight: ${themeCssVariables.font.weight.medium}; + font-family: ${themeCssVariables.font.family}; cursor: pointer; text-align: left; &:hover { - background: ${({ theme }) => theme.background.transparent.light}; - border-radius: ${({ theme }) => theme.border.radius.sm}; + background: ${themeCssVariables.background.transparent.light}; + border-radius: ${themeCssVariables.border.radius.sm}; } `; @@ -34,7 +36,7 @@ type FavoritesBackButtonProps = { export const FavoritesBackButton = ({ folderName, }: FavoritesBackButtonProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const setCurrentFavoriteFolderId = useSetAtomState( currentFavoriteFolderIdState, ); diff --git a/packages/twenty-front/src/modules/favorites/components/FavoritesDroppable.tsx b/packages/twenty-front/src/modules/favorites/components/FavoritesDroppable.tsx index e4d652dffb..6d045687b4 100644 --- a/packages/twenty-front/src/modules/favorites/components/FavoritesDroppable.tsx +++ b/packages/twenty-front/src/modules/favorites/components/FavoritesDroppable.tsx @@ -1,5 +1,6 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { Droppable } from '@hello-pangea/dnd'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; type FavoritesDroppableProps = { droppableId: string; @@ -17,15 +18,14 @@ const StyledDroppableWrapper = styled.div<{ transition: all 150ms ease-in-out; width: 100%; - ${({ isDraggingOver, isDragIndicatorVisible, showDropLine, theme }) => - isDraggingOver && - isDragIndicatorVisible && - ` - background-color: ${theme.background.transparent.blue}; + ${({ isDraggingOver, isDragIndicatorVisible, showDropLine }) => + isDraggingOver && isDragIndicatorVisible + ? ` + background-color: ${themeCssVariables.background.transparent.blue}; ${ - showDropLine && - ` + showDropLine + ? ` &::before { content: ''; position: absolute; @@ -33,12 +33,14 @@ const StyledDroppableWrapper = styled.div<{ left: 0; width: 100%; height: 2px; - background-color: ${theme.color.blue}; - border-radius: ${theme.border.radius.sm} ${theme.border.radius.sm} 0 0; + background-color: ${themeCssVariables.color.blue}; + border-radius: ${themeCssVariables.border.radius.sm} ${themeCssVariables.border.radius.sm} 0 0; } ` + : '' } - `} + ` + : ''} `; export const FavoritesDroppable = ({ diff --git a/packages/twenty-front/src/modules/favorites/components/FavoritesSkeletonLoader.tsx b/packages/twenty-front/src/modules/favorites/components/FavoritesSkeletonLoader.tsx index 5e5d1ea7f8..765dbb969b 100644 --- a/packages/twenty-front/src/modules/favorites/components/FavoritesSkeletonLoader.tsx +++ b/packages/twenty-front/src/modules/favorites/components/FavoritesSkeletonLoader.tsx @@ -1,24 +1,26 @@ import { SKELETON_LOADER_HEIGHT_SIZES } from '@/activities/components/SkeletonLoader'; -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { useContext } from 'react'; import Skeleton, { SkeletonTheme } from 'react-loading-skeleton'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledSkeletonContainer = styled.div` display: flex; flex-direction: column; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; height: 71px; - padding-left: ${({ theme }) => theme.spacing(1)}; + padding-left: ${themeCssVariables.spacing[1]}; `; const StyledSkeletonColumn = styled.div` display: flex; flex-direction: column; - gap: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[1]}; `; export const FavoritesSkeletonLoader = () => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( theme.spacing(1)}; - margin-top: ${({ theme }) => theme.spacing(1)}; + margin-bottom: ${themeCssVariables.spacing[1]}; + margin-top: ${themeCssVariables.spacing[1]}; `; type FavoriteFolderPickerListProps = { diff --git a/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts b/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts index 44239e5e0c..065062c376 100644 --- a/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts +++ b/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts @@ -109,23 +109,18 @@ export const sortedFavorites = [ const favoriteObjectMetadataItem = getMockObjectMetadataItemOrThrow('favorite'); const personObjectMetadataItem = getMockObjectMetadataItemOrThrow('person'); -const UPDATE_ONE_FAVORITE_MUTATION = generateUpdateOneRecordMutation( - { - objectMetadataItem: favoriteObjectMetadataItem, - objectMetadataItems: generatedMockObjectMetadataItems, - computeReferences: false, - objectPermissionsByObjectMetadataId: {}, - }, -) - -const CREATE_ONE_FAVORITE_MUTATION = generateCreateOneRecordMutation( - { - objectMetadataItem: favoriteObjectMetadataItem, - objectMetadataItems: generatedMockObjectMetadataItems, - objectPermissionsByObjectMetadataId: {}, - }, -) +const UPDATE_ONE_FAVORITE_MUTATION = generateUpdateOneRecordMutation({ + objectMetadataItem: favoriteObjectMetadataItem, + objectMetadataItems: generatedMockObjectMetadataItems, + computeReferences: false, + objectPermissionsByObjectMetadataId: {}, +}); +const CREATE_ONE_FAVORITE_MUTATION = generateCreateOneRecordMutation({ + objectMetadataItem: favoriteObjectMetadataItem, + objectMetadataItems: generatedMockObjectMetadataItems, + objectPermissionsByObjectMetadataId: {}, +}); export const mocks = [ { diff --git a/packages/twenty-front/src/modules/file/components/FileIcon.tsx b/packages/twenty-front/src/modules/file/components/FileIcon.tsx index e68f900cc7..fbfd9d80fc 100644 --- a/packages/twenty-front/src/modules/file/components/FileIcon.tsx +++ b/packages/twenty-front/src/modules/file/components/FileIcon.tsx @@ -1,4 +1,5 @@ import { type AttachmentFileCategory } from '@/activities/files/types/AttachmentFileCategory'; +import { useFileIconColors } from '@/file/hooks/useFileIconColors'; import { IconMapping } from '@/file/utils/fileIconMappings'; import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; @@ -20,21 +21,6 @@ const StyledIconContainer = styled.div<{ padding: 5px; `; -const useFileIconColors = () => { - const theme = useTheme(); - - return { - ARCHIVE: theme.color.gray, - AUDIO: theme.color.pink, - IMAGE: theme.color.amber, - PRESENTATION: theme.color.orange, - SPREADSHEET: theme.color.turquoise, - TEXT_DOCUMENT: theme.color.blue, - VIDEO: theme.color.purple, - OTHER: theme.color.gray, - }; -}; - export const FileIcon = ({ fileCategory, size = 'medium', diff --git a/packages/twenty-front/src/modules/file/hooks/useFileIconColors.ts b/packages/twenty-front/src/modules/file/hooks/useFileIconColors.ts new file mode 100644 index 0000000000..81efa70c4f --- /dev/null +++ b/packages/twenty-front/src/modules/file/hooks/useFileIconColors.ts @@ -0,0 +1,21 @@ +import { type AttachmentFileCategory } from '@/activities/files/types/AttachmentFileCategory'; +import { useTheme } from '@emotion/react'; +import { type FileCategory } from 'twenty-shared/types'; + +export const useFileIconColors = (): Record< + AttachmentFileCategory | FileCategory, + string +> => { + const theme = useTheme(); + + return { + ARCHIVE: theme.color.gray, + AUDIO: theme.color.pink, + IMAGE: theme.color.amber, + PRESENTATION: theme.color.orange, + SPREADSHEET: theme.color.turquoise, + TEXT_DOCUMENT: theme.color.blue, + VIDEO: theme.color.purple, + OTHER: theme.color.gray, + }; +}; diff --git a/packages/twenty-front/src/modules/information-banner/components/InformationBanner.tsx b/packages/twenty-front/src/modules/information-banner/components/InformationBanner.tsx index 5b771222da..7f3bb8ce83 100644 --- a/packages/twenty-front/src/modules/information-banner/components/InformationBanner.tsx +++ b/packages/twenty-front/src/modules/information-banner/components/InformationBanner.tsx @@ -1,7 +1,7 @@ import { InformationBannerComponentInstanceContext } from '@/information-banner/states/contexts/InformationBannerComponentInstanceContext'; import { informationBannerIsOpenComponentState } from '@/information-banner/states/informationBannerIsOpenComponentState'; import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { t } from '@lingui/core/macro'; import { Banner, @@ -10,7 +10,7 @@ import { IconX, } from 'twenty-ui/display'; import { Button, IconButton } from 'twenty-ui/input'; -import { GRAY_SCALE_LIGHT } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledText = styled.div` overflow: hidden; @@ -19,7 +19,7 @@ const StyledText = styled.div` `; const StyledCloseButton = styled(IconButton)` - color: ${GRAY_SCALE_LIGHT.gray1}; + color: ${themeCssVariables.grayScale.gray1}; display: flex; `; @@ -29,7 +29,7 @@ const StyledContent = styled.div<{ hasCloseButton: boolean }>` display: flex; flex: 1; margin-left: ${({ hasCloseButton }) => (hasCloseButton ? '24px' : '0')}; - gap: ${({ theme }) => theme.spacing(3)}; + gap: ${themeCssVariables.spacing[3]}; `; export const InformationBanner = ({ diff --git a/packages/twenty-front/src/modules/information-banner/components/InformationBannerWrapper.tsx b/packages/twenty-front/src/modules/information-banner/components/InformationBannerWrapper.tsx index f11d3449d3..aaa5492fef 100644 --- a/packages/twenty-front/src/modules/information-banner/components/InformationBannerWrapper.tsx +++ b/packages/twenty-front/src/modules/information-banner/components/InformationBannerWrapper.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { isDefined } from 'twenty-shared/utils'; import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; diff --git a/packages/twenty-front/src/modules/information-banner/components/deleted-record/InformationBannerDeletedRecord.tsx b/packages/twenty-front/src/modules/information-banner/components/deleted-record/InformationBannerDeletedRecord.tsx index 81d3c77fd5..3b145d4acc 100644 --- a/packages/twenty-front/src/modules/information-banner/components/deleted-record/InformationBannerDeletedRecord.tsx +++ b/packages/twenty-front/src/modules/information-banner/components/deleted-record/InformationBannerDeletedRecord.tsx @@ -1,6 +1,6 @@ import { InformationBanner } from '@/information-banner/components/InformationBanner'; import { useRestoreManyRecords } from '@/object-record/hooks/useRestoreManyRecords'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { t } from '@lingui/core/macro'; import { IconRefresh } from 'twenty-ui/display'; diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/AddToNavigationDragHandle.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/AddToNavigationDragHandle.tsx index f7790807e6..1b049d20c9 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/AddToNavigationDragHandle.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/AddToNavigationDragHandle.tsx @@ -1,9 +1,10 @@ -import { css, useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { isNonEmptyString } from '@sniptt/guards'; -import type { ReactNode } from 'react'; +import { type ReactNode, useContext } from 'react'; import { isDefined } from 'twenty-shared/utils'; import { IconGripVertical, type IconComponent } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { NavigationMenuItemStyleIcon } from '@/navigation-menu-item/components/NavigationMenuItemStyleIcon'; import { DEFAULT_NAVIGATION_MENU_ITEM_COLOR_FOLDER } from '@/navigation-menu-item/constants/NavigationMenuItemDefaultColorFolder'; @@ -18,12 +19,13 @@ const StyledIconSlot = styled.div<{ $hasFixedSize: boolean }>` flex-shrink: 0; justify-content: center; - ${({ theme, $hasFixedSize }) => - $hasFixedSize && - css` - height: ${theme.spacing(4)}; - width: ${theme.spacing(4)}; - `} + ${({ $hasFixedSize }) => + $hasFixedSize + ? ` + height: ${themeCssVariables.spacing[4]}; + width: ${themeCssVariables.spacing[4]}; + ` + : ''} &:active { cursor: grabbing; @@ -41,7 +43,7 @@ const AddToNavigationDragHandleIcon = ({ customIconContent, iconColor, }: AddToNavigationDragHandleIconProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const iconSize = theme.icon.size.md; const iconStroke = theme.icon.stroke.sm; @@ -74,7 +76,7 @@ export const AddToNavigationDragHandle = ({ payload, isHovered, }: AddToNavigationDragHandleProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const effectiveColor = payload.type === 'object' && isNonEmptyString(payload.iconColor) ? payload.iconColor diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/CurrentWorkspaceMemberOrphanNavigationMenuItems.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/CurrentWorkspaceMemberOrphanNavigationMenuItems.tsx index f395bf5bab..b487230212 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/CurrentWorkspaceMemberOrphanNavigationMenuItems.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/CurrentWorkspaceMemberOrphanNavigationMenuItems.tsx @@ -1,8 +1,9 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useContext } from 'react'; import { useLocation } from 'react-router-dom'; import { IconHeartOff } from 'twenty-ui/display'; import { LightIconButton } from 'twenty-ui/input'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { NavigationItemDropTarget } from '@/navigation-menu-item/components/NavigationItemDropTarget'; import { NavigationMenuItemDroppable } from '@/navigation-menu-item/components/NavigationMenuItemDroppable'; @@ -25,7 +26,7 @@ const StyledEmptyContainer = styled.div` `; const StyledOrphanNavigationMenuItemsContainer = styled.div` - margin-bottom: ${({ theme }) => theme.betweenSiblingsGap}; + margin-bottom: ${themeCssVariables.betweenSiblingsGap}; `; export const CurrentWorkspaceMemberOrphanNavigationMenuItems = () => { diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationItemDropTarget.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationItemDropTarget.tsx index 2f506513aa..82a3672ca2 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationItemDropTarget.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationItemDropTarget.tsx @@ -1,5 +1,6 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { type ReactNode, useContext } from 'react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { type NavigationSections } from '@/navigation-menu-item/constants/NavigationSections.constants'; import { NavigationDropTargetContext } from '@/navigation-menu-item/contexts/NavigationDropTargetContext'; @@ -9,14 +10,15 @@ const StyledDropTarget = styled.div<{ $isDropForbidden: boolean; $compact?: boolean; }>` - min-height: ${({ theme, $compact }) => ($compact ? 0 : theme.spacing(2))}; + min-height: ${({ $compact }) => + $compact ? 0 : themeCssVariables.spacing[2]}; position: relative; transition: all 150ms ease-in-out; - ${({ $isDragOver, theme }) => - $isDragOver && - ` - background-color: ${theme.background.transparent.blue}; + ${({ $isDragOver }) => + $isDragOver + ? ` + background-color: ${themeCssVariables.background.transparent.blue}; &::before { content: ''; @@ -25,15 +27,16 @@ const StyledDropTarget = styled.div<{ left: 0; width: 100%; height: 2px; - background-color: ${theme.color.blue}; - border-radius: ${theme.border.radius.sm} ${theme.border.radius.sm} 0 0; + background-color: ${themeCssVariables.color.blue}; + border-radius: ${themeCssVariables.border.radius.sm} ${themeCssVariables.border.radius.sm} 0 0; } - `} + ` + : ''} - ${({ $isDropForbidden, theme }) => - $isDropForbidden && - ` - background-color: ${theme.background.transparent.danger}; + ${({ $isDropForbidden }) => + $isDropForbidden + ? ` + background-color: ${themeCssVariables.background.transparent.danger}; cursor: not-allowed; &::after { @@ -43,10 +46,11 @@ const StyledDropTarget = styled.div<{ left: 0; width: 100%; height: 2px; - background-color: ${theme.color.red}; - border-radius: ${theme.border.radius.sm} ${theme.border.radius.sm} 0 0; + background-color: ${themeCssVariables.color.red}; + border-radius: ${themeCssVariables.border.radius.sm} ${themeCssVariables.border.radius.sm} 0 0; } - `} + ` + : ''} `; type NavigationItemDropTargetProps = { diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuEditModeBar.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuEditModeBar.tsx index 50a489a8fd..1bc26faaa1 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuEditModeBar.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuEditModeBar.tsx @@ -10,33 +10,34 @@ import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState'; import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; -import { useState } from 'react'; +import { useContext, useState } from 'react'; import { CommandMenuPages } from 'twenty-shared/types'; import { IconCheck, useIcons } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { FeatureFlagKey } from '~/generated-metadata/graphql'; const StyledContainer = styled.div` align-items: center; - background: ${({ theme }) => theme.color.blue}; + background: ${themeCssVariables.color.blue}; box-sizing: border-box; - color: ${({ theme }) => theme.font.color.inverted}; + color: ${themeCssVariables.font.color.inverted}; display: flex; justify-content: space-between; - padding: ${({ theme }) => theme.spacing(2, 3)}; + padding: ${themeCssVariables.spacing[2]} ${themeCssVariables.spacing[3]}; width: 100%; `; const StyledTitle = styled.span` align-items: center; display: flex; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; `; export const NavigationMenuEditModeBar = () => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const { t } = useLingui(); const { getIcon } = useIcons(); const [isSaving, setIsSaving] = useState(false); diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemBackButton.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemBackButton.tsx index f789ec84ff..4959937849 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemBackButton.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemBackButton.tsx @@ -1,6 +1,8 @@ -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { useContext } from 'react'; import { IconX } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { currentNavigationMenuItemFolderIdState } from '@/ui/navigation/navigation-drawer/states/currentNavigationMenuItemFolderIdState'; import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomState'; @@ -8,23 +10,23 @@ import { useSetAtomState } from '@/ui/utilities/state/jotai/hooks/useSetAtomStat const StyledBackButton = styled.button` display: flex; align-items: center; - gap: ${({ theme }) => theme.spacing(2)}; - padding-left: ${({ theme }) => theme.spacing(1)}; - padding-right: ${({ theme }) => theme.spacing(0.5)}; - padding-top: ${({ theme }) => theme.spacing(1)}; - padding-bottom: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[2]}; + padding-left: ${themeCssVariables.spacing[1]}; + padding-right: ${themeCssVariables.spacing[0.5]}; + padding-top: ${themeCssVariables.spacing[1]}; + padding-bottom: ${themeCssVariables.spacing[1]}; width: 100%; background: transparent; border: none; - color: ${({ theme }) => theme.font.color.secondary}; - font-weight: ${({ theme }) => theme.font.weight.medium}; - font-family: ${({ theme }) => theme.font.family}; + color: ${themeCssVariables.font.color.secondary}; + font-weight: ${themeCssVariables.font.weight.medium}; + font-family: ${themeCssVariables.font.family}; cursor: pointer; text-align: left; &:hover { - background: ${({ theme }) => theme.background.transparent.light}; - border-radius: ${({ theme }) => theme.border.radius.sm}; + background: ${themeCssVariables.background.transparent.light}; + border-radius: ${themeCssVariables.border.radius.sm}; } `; @@ -35,7 +37,7 @@ type NavigationMenuItemBackButtonProps = { export const NavigationMenuItemBackButton = ({ folderName, }: NavigationMenuItemBackButtonProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const setCurrentNavigationMenuItemFolderId = useSetAtomState( currentNavigationMenuItemFolderIdState, ); diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemDroppable.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemDroppable.tsx index 8576f7831d..c86d01d0f6 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemDroppable.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemDroppable.tsx @@ -1,5 +1,6 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { Droppable } from '@hello-pangea/dnd'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { useIsDropDisabledForSection } from '@/navigation-menu-item/hooks/useIsDropDisabledForSection'; @@ -20,15 +21,14 @@ const StyledDroppableWrapper = styled.div<{ transition: all 150ms ease-in-out; width: 100%; - ${({ isDraggingOver, isDragIndicatorVisible, showDropLine, theme }) => - isDraggingOver && - isDragIndicatorVisible && - ` - background-color: ${theme.background.transparent.blue}; + ${({ isDraggingOver, isDragIndicatorVisible, showDropLine }) => + isDraggingOver && isDragIndicatorVisible + ? ` + background-color: ${themeCssVariables.background.transparent.blue}; ${ - showDropLine && - ` + showDropLine + ? ` &::before { content: ''; position: absolute; @@ -36,12 +36,14 @@ const StyledDroppableWrapper = styled.div<{ left: 0; width: 100%; height: 2px; - background-color: ${theme.color.blue}; - border-radius: ${theme.border.radius.sm} ${theme.border.radius.sm} 0 0; + background-color: ${themeCssVariables.color.blue}; + border-radius: ${themeCssVariables.border.radius.sm} ${themeCssVariables.border.radius.sm} 0 0; } ` + : '' } - `} + ` + : ''} `; export const NavigationMenuItemDroppable = ({ diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemIcon.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemIcon.tsx index b43c31960e..82b27d1953 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemIcon.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemIcon.tsx @@ -1,7 +1,8 @@ -import { useTheme } from '@emotion/react'; import { isNonEmptyString } from '@sniptt/guards'; +import { useContext } from 'react'; import { isDefined } from 'twenty-shared/utils'; import { Avatar, useIcons } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; import { FeatureFlagKey } from '~/generated-metadata/graphql'; import { StyledNavigationMenuItemIconContainer } from '@/navigation-menu-item/components/NavigationMenuItemIconContainer'; @@ -22,7 +23,7 @@ export const NavigationMenuItemIcon = ({ }: { navigationMenuItem: ProcessedNavigationMenuItem; }) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const { getIcon } = useIcons(); const isNavigationMenuItemEditingEnabled = useIsFeatureEnabled( FeatureFlagKey.IS_NAVIGATION_MENU_ITEM_EDITING_ENABLED, diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemIconContainer.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemIconContainer.tsx index a73e8ac832..51df1dfa49 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemIconContainer.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemIconContainer.tsx @@ -1,4 +1,5 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; export const StyledNavigationMenuItemIconContainer = styled.div<{ $backgroundColor?: string; @@ -9,9 +10,9 @@ export const StyledNavigationMenuItemIconContainer = styled.div<{ box-sizing: border-box; display: flex; flex-shrink: 0; - height: ${({ theme }) => theme.spacing(4)}; + height: ${themeCssVariables.spacing[4]}; justify-content: center; - width: ${({ theme }) => theme.spacing(4)}; + width: ${themeCssVariables.spacing[4]}; ${({ $backgroundColor }) => $backgroundColor ? `background-color: ${$backgroundColor};` : ''} diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemSkeletonLoader.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemSkeletonLoader.tsx index 58e55445de..d0701ce8bb 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemSkeletonLoader.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/NavigationMenuItemSkeletonLoader.tsx @@ -1,24 +1,26 @@ import { SKELETON_LOADER_HEIGHT_SIZES } from '@/activities/components/SkeletonLoader'; -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { useContext } from 'react'; import Skeleton, { SkeletonTheme } from 'react-loading-skeleton'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledSkeletonContainer = styled.div` display: flex; flex-direction: column; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; height: 71px; - padding-left: ${({ theme }) => theme.spacing(1)}; + padding-left: ${themeCssVariables.spacing[1]}; `; const StyledSkeletonColumn = styled.div` display: flex; flex-direction: column; - gap: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[1]}; `; export const NavigationMenuItemSkeletonLoader = () => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const style = getNavigationMenuItemIconStyleFromColor(theme, color); return ( { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const objectStyle = getNavigationMenuItemIconStyleFromColor( theme, objectColor, diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItemFolderDragClone.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItemFolderDragClone.tsx index 2e9c33c804..39c7f74d57 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItemFolderDragClone.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItemFolderDragClone.tsx @@ -1,10 +1,11 @@ -import { useTheme } from '@emotion/react'; import { type DraggableProvided, type DraggableRubric, type DraggableStateSnapshot, } from '@hello-pangea/dnd'; +import { useContext } from 'react'; import { isDefined } from 'twenty-shared/utils'; +import { ThemeContext } from 'twenty-ui/theme'; import { NavigationMenuItemIcon } from '@/navigation-menu-item/components/NavigationMenuItemIcon'; import { getNavigationMenuItemSecondaryLabel } from '@/navigation-menu-item/utils/getNavigationMenuItemSecondaryLabel'; @@ -32,7 +33,7 @@ export const WorkspaceNavigationMenuItemFolderDragClone = ({ navigationMenuItemFolderContentLength, selectedNavigationMenuItemIndex, }: WorkspaceNavigationMenuItemFolderDragCloneProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const objectMetadataItems = useAtomStateValue(objectMetadataItemsState); const navigationMenuItem = navigationMenuItems[rubric.source.index]; diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItems.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItems.tsx index c9d07a64ae..2a30dc4bb9 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItems.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItems.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; import { IconColumnInsertRight, @@ -8,6 +8,7 @@ import { useIcons, } from 'twenty-ui/display'; import { LightIconButton } from 'twenty-ui/input'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { FeatureFlagKey } from '~/generated-metadata/graphql'; import { useNavigateCommandMenu } from '@/command-menu/hooks/useNavigateCommandMenu'; @@ -39,7 +40,7 @@ import { isDefined } from 'twenty-shared/utils'; const StyledRightIconsContainer = styled.div` align-items: center; display: flex; - gap: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[1]}; `; export const WorkspaceNavigationMenuItems = () => { diff --git a/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItemsFolder.tsx b/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItemsFolder.tsx index 5362d5e8b0..92223d454d 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItemsFolder.tsx +++ b/packages/twenty-front/src/modules/navigation-menu-item/components/WorkspaceNavigationMenuItemsFolder.tsx @@ -1,5 +1,4 @@ -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { Droppable } from '@hello-pangea/dnd'; import { useLingui } from '@lingui/react/macro'; import { isNonEmptyString } from '@sniptt/guards'; @@ -12,6 +11,8 @@ import { IconPlus, useIcons, } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { useIsDropDisabledForSection } from '@/navigation-menu-item/hooks/useIsDropDisabledForSection'; import { useOpenAddItemToFolderPage } from '@/navigation-menu-item/hooks/useOpenAddItemToFolderPage'; @@ -47,11 +48,11 @@ import { ViewKey } from '@/views/types/ViewKey'; import { convertCoreViewToView } from '@/views/utils/convertCoreViewToView'; const StyledFolderContainer = styled.div<{ $isSelectedInEditMode: boolean }>` - border: ${({ theme, $isSelectedInEditMode }) => + border: ${({ $isSelectedInEditMode }) => $isSelectedInEditMode - ? `1px solid ${theme.color.blue}` + ? `1px solid ${themeCssVariables.color.blue}` : '1px solid transparent'}; - border-radius: ${({ theme }) => theme.border.radius.sm}; + border-radius: ${themeCssVariables.border.radius.sm}; `; const StyledFolderDroppableContent = styled.div<{ @@ -59,7 +60,8 @@ const StyledFolderDroppableContent = styled.div<{ }>` display: flex; flex-direction: column; - padding-bottom: ${({ theme, $compact }) => ($compact ? 0 : theme.spacing(2))}; + padding-bottom: ${({ $compact }) => + $compact ? 0 : themeCssVariables.spacing[2]}; `; const StyledFolderExpandableWrapper = styled.div` @@ -97,7 +99,7 @@ export const WorkspaceNavigationMenuItemsFolder = ({ selectedNavigationMenuItemId = null, isDragging = false, }: WorkspaceNavigationMenuItemsFolderProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const { getIcon } = useIcons(); const FolderIcon = getIcon(folderIconKey ?? FOLDER_ICON_DEFAULT); const objectMetadataItems = useAtomStateValue(objectMetadataItemsState); diff --git a/packages/twenty-front/src/modules/navigation-menu-item/utils/get-color-from-theme.util.ts b/packages/twenty-front/src/modules/navigation-menu-item/utils/get-color-from-theme.util.ts index 9ecfa585e1..4a39885dd0 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/utils/get-color-from-theme.util.ts +++ b/packages/twenty-front/src/modules/navigation-menu-item/utils/get-color-from-theme.util.ts @@ -1,8 +1,7 @@ -import type { Theme } from '@emotion/react'; -import type { ThemeColor } from 'twenty-ui/theme'; +import type { ThemeColor, ThemeType } from 'twenty-ui/theme'; export const getColorFromTheme = ( - theme: Theme, + theme: ThemeType, themeColor: ThemeColor, shade: number, ): string => { diff --git a/packages/twenty-front/src/modules/navigation-menu-item/utils/get-navigation-menu-item-icon-border-color.ts b/packages/twenty-front/src/modules/navigation-menu-item/utils/get-navigation-menu-item-icon-border-color.ts index 75e76cbf68..4b90228c59 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/utils/get-navigation-menu-item-icon-border-color.ts +++ b/packages/twenty-front/src/modules/navigation-menu-item/utils/get-navigation-menu-item-icon-border-color.ts @@ -1,10 +1,9 @@ -import type { Theme } from '@emotion/react'; -import type { ThemeColor } from 'twenty-ui/theme'; +import type { ThemeColor, ThemeType } from 'twenty-ui/theme'; import { getColorFromTheme } from '@/navigation-menu-item/utils/get-color-from-theme.util'; import { COLOR_SHADE_BORDER } from '@/navigation-menu-item/utils/NavigationMenuItemIconColorShadeBorder.constant'; export const getNavigationMenuItemIconBorderColor = ( - theme: Theme, + theme: ThemeType, themeColor: ThemeColor, ): string => getColorFromTheme(theme, themeColor, COLOR_SHADE_BORDER); diff --git a/packages/twenty-front/src/modules/navigation-menu-item/utils/get-navigation-menu-item-icon-style-from-color.ts b/packages/twenty-front/src/modules/navigation-menu-item/utils/get-navigation-menu-item-icon-style-from-color.ts index d21f33c406..f8b6d69663 100644 --- a/packages/twenty-front/src/modules/navigation-menu-item/utils/get-navigation-menu-item-icon-style-from-color.ts +++ b/packages/twenty-front/src/modules/navigation-menu-item/utils/get-navigation-menu-item-icon-style-from-color.ts @@ -1,4 +1,4 @@ -import type { Theme } from '@emotion/react'; +import type { ThemeType } from 'twenty-ui/theme'; import { DEFAULT_NAV_ITEM_ICON_COLOR } from '@/navigation-menu-item/constants/NavigationMenuItemDefaultIconColor.constant'; import { getColorFromTheme } from '@/navigation-menu-item/utils/get-color-from-theme.util'; @@ -9,7 +9,7 @@ import { type NavigationMenuItemIconStyle } from '@/navigation-menu-item/utils/n import { parseThemeColor } from '@/navigation-menu-item/utils/parseThemeColor'; export const getNavigationMenuItemIconStyleFromColor = ( - theme: Theme, + theme: ThemeType, color: string | null | undefined, ): NavigationMenuItemIconStyle => { const themeColor = parseThemeColor(color ?? DEFAULT_NAV_ITEM_ICON_COLOR); diff --git a/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerAIChatContent.tsx b/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerAIChatContent.tsx index 313a9bea46..0739dc9420 100644 --- a/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerAIChatContent.tsx +++ b/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerAIChatContent.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { NavigationDrawerAIChatThreadsList } from '@/ai/components/NavigationDrawerAIChatThreadsList'; diff --git a/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerNavigationContent.tsx b/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerNavigationContent.tsx index f284731abf..ba66c74153 100644 --- a/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerNavigationContent.tsx +++ b/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerNavigationContent.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useFavoritesByFolder } from '@/favorites/hooks/useFavoritesByFolder'; import { NavigationMenuItemFolderContentDispatcherEffect } from '@/navigation-menu-item/components/NavigationMenuItemFolderContentDispatcher'; diff --git a/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerScrollableItems.tsx b/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerScrollableItems.tsx index c4b5bb7f92..5508e98d5a 100644 --- a/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerScrollableItems.tsx +++ b/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerScrollableItems.tsx @@ -1,9 +1,10 @@ import { NavigationDrawerOpenedSection } from '@/object-metadata/components/NavigationDrawerOpenedSection'; import { RemoteNavigationDrawerSection } from '@/object-metadata/components/RemoteNavigationDrawerSection'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { lazy, Suspense } from 'react'; import { NavigationDrawerOtherSection } from '@/navigation/components/NavigationDrawerOtherSection'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const CurrentWorkspaceMemberNavigationMenuItemFoldersDispatcher = lazy(() => import( @@ -24,7 +25,7 @@ const WorkspaceNavigationMenuItemsDispatcher = lazy(() => const StyledScrollableItemsContainer = styled.div` display: flex; flex-direction: column; - gap: ${({ theme }) => theme.spacing(3)}; + gap: ${themeCssVariables.spacing[3]}; `; export const MainNavigationDrawerScrollableItems = () => { diff --git a/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx b/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx index 84f8e454ae..3ac89399ae 100644 --- a/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx +++ b/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerTabsRow.tsx @@ -1,11 +1,13 @@ -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { t } from '@lingui/core/macro'; +import { useContext } from 'react'; import { IconComment, IconHome, IconMessageCirclePlus, } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { useIsMobile } from 'twenty-ui/utilities'; import { useCreateNewAIChatThread } from '@/ai/hooks/useCreateNewAIChatThread'; @@ -27,31 +29,33 @@ const StyledRow = styled.div<{ isExpanded: boolean }>` display: flex; justify-content: ${({ isExpanded }) => isExpanded ? 'space-between' : 'center'}; - gap: ${({ theme, isExpanded }) => (isExpanded ? theme.spacing(2) : 0)}; + gap: ${({ isExpanded }) => (isExpanded ? themeCssVariables.spacing[2] : 0)}; width: 100%; - transition: gap ${({ theme }) => theme.animation.duration.normal}s ease; + transition: gap calc(${themeCssVariables.animation.duration.normal} * 1s) ease; `; const StyledTabsPill = styled.div` align-items: center; - border: 1px solid ${({ theme }) => theme.border.color.medium}; - background: ${({ theme }) => theme.background.secondary}; - border-radius: ${({ theme }) => theme.border.radius.pill}; + border: 1px solid ${themeCssVariables.border.color.medium}; + background: ${themeCssVariables.background.secondary}; + border-radius: ${themeCssVariables.border.radius.pill}; padding: 3px; - height: ${({ theme }) => theme.spacing(7)}; + height: ${themeCssVariables.spacing[7]}; display: flex; - width: ${({ theme }) => theme.spacing(18)}; - gap: ${({ theme }) => theme.spacing(0.5)}; + width: ${themeCssVariables.spacing[18]}; + gap: ${themeCssVariables.spacing[0.5]}; box-sizing: border-box; `; const StyledTabWrapper = styled.div<{ isActive: boolean }>` - border-radius: ${({ theme }) => theme.border.radius.pill}; + border-radius: ${themeCssVariables.border.radius.pill}; align-items: center; - background: ${({ theme, isActive }) => - isActive ? theme.background.transparent.light : 'transparent'}; - color: ${({ theme, isActive }) => - isActive ? theme.font.color.primary : theme.font.color.tertiary}; + background: ${({ isActive }) => + isActive ? themeCssVariables.background.transparent.light : 'transparent'}; + color: ${({ isActive }) => + isActive + ? themeCssVariables.font.color.primary + : themeCssVariables.font.color.tertiary}; cursor: pointer; display: flex; justify-content: center; @@ -59,10 +63,10 @@ const StyledTabWrapper = styled.div<{ isActive: boolean }>` flex: 1; &:hover { - background: ${({ theme, isActive }) => + background: ${({ isActive }) => isActive - ? theme.background.transparent.light - : theme.background.transparent.lighter}; + ? themeCssVariables.background.transparent.light + : themeCssVariables.background.transparent.lighter}; } `; @@ -70,27 +74,27 @@ const StyledTabIcon = styled.div` align-items: center; display: flex; justify-content: center; - height: ${({ theme }) => theme.spacing(5)}; - width: ${({ theme }) => theme.spacing(5)}; + height: ${themeCssVariables.spacing[5]}; + width: ${themeCssVariables.spacing[5]}; `; const StyledNewChatButtonWrapper = styled.div<{ isExpanded: boolean }>` align-items: center; - border: 1px solid ${({ theme }) => theme.border.color.medium}; - background: ${({ theme }) => theme.background.secondary}; - border-radius: ${({ theme }) => theme.border.radius.pill}; + border: 1px solid ${themeCssVariables.border.color.medium}; + background: ${themeCssVariables.background.secondary}; + border-radius: ${themeCssVariables.border.radius.pill}; box-sizing: border-box; display: flex; - height: ${({ theme, isExpanded }) => - isExpanded ? theme.spacing(7) : theme.spacing(6)}; + height: ${({ isExpanded }) => + isExpanded ? themeCssVariables.spacing[7] : themeCssVariables.spacing[6]}; justify-content: center; - padding: ${({ theme, isExpanded }) => - isExpanded ? '3px' : theme.spacing(0.5)}; - width: ${({ theme, isExpanded }) => - isExpanded ? theme.spacing(25.75) : theme.spacing(6)}; + padding: ${({ isExpanded }) => + isExpanded ? '3px' : themeCssVariables.spacing[0.5]}; + width: ${({ isExpanded }) => + isExpanded ? '103px' : themeCssVariables.spacing[6]}; transition: - height ${({ theme }) => theme.animation.duration.normal}s ease, - padding ${({ theme }) => theme.animation.duration.normal}s ease; + height calc(${themeCssVariables.animation.duration.normal} * 1s) ease, + padding calc(${themeCssVariables.animation.duration.normal} * 1s) ease; `; const StyledNewChatButton = styled.div` @@ -98,25 +102,25 @@ const StyledNewChatButton = styled.div` justify-content: center; display: flex; cursor: pointer; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.medium}; - gap: ${({ theme }) => theme.spacing(1)}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.medium}; + gap: ${themeCssVariables.spacing[1]}; height: 100%; width: 100%; border-radius: inherit; - color: ${({ theme }) => theme.font.color.secondary}; + color: ${themeCssVariables.font.color.secondary}; transition: - background ${({ theme }) => theme.animation.duration.fast}s ease, - color ${({ theme }) => theme.animation.duration.fast}s ease; + background calc(${themeCssVariables.animation.duration.fast} * 1s) ease, + color calc(${themeCssVariables.animation.duration.fast} * 1s) ease; &:hover { - background: ${({ theme }) => theme.background.transparent.light}; - color: ${({ theme }) => theme.font.color.primary}; + background: ${themeCssVariables.background.transparent.light}; + color: ${themeCssVariables.font.color.primary}; } `; export const MainNavigationDrawerTabsRow = () => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const isMobile = useIsMobile(); const isNavigationDrawerExpanded = useAtomStateValue( isNavigationDrawerExpandedState, diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useFieldMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useFieldMetadataItem.ts index 850bce9174..aa1701e8e8 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useFieldMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useFieldMetadataItem.ts @@ -194,7 +194,7 @@ export const responseData = { metadataVersion: 1, currentBillingSubscription: null, workspaceMembersCount: 1, - defaultRole: { + defaultRole: { id: 'default-role-id', label: 'Default Role', description: 'Default Role Description', @@ -204,7 +204,7 @@ export const responseData = { canUpdateAllObjectRecords: true, canSoftDeleteAllObjectRecords: true, canDestroyAllObjectRecords: true, - } + }, }, currentBillingSubscription: null, billingSubscriptions: [], diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useAggregateRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useAggregateRecords.ts index b590efc57a..04abc2276e 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useAggregateRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useAggregateRecords.ts @@ -14,6 +14,6 @@ export const mockResponse = { opportunities: { totalCount: 42, sumAmount: 1000000, - avgAmount: 23800 - } -}; \ No newline at end of file + avgAmount: 23800, + }, +}; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useDeleteOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useDeleteOneRecord.ts index 19314a79ca..c56e5bcb77 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useDeleteOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useDeleteOneRecord.ts @@ -8,4 +8,4 @@ export const query = gql` id } } -`; \ No newline at end of file +`; diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/form-types/constants/FormFieldPlaceholderStyles.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/form-types/constants/FormFieldPlaceholderStyles.ts index 41ceae8a63..0f127b1adf 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/form-types/constants/FormFieldPlaceholderStyles.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/form-types/constants/FormFieldPlaceholderStyles.ts @@ -1,10 +1,7 @@ -import { css } from '@emotion/react'; -import { type ThemeType } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; -export const FORM_FIELD_PLACEHOLDER_STYLES = (props: { - theme: ThemeType; -}) => css` - color: ${props.theme.font.color.light}; - font-size: ${props.theme.font.size.md}; - font-weight: ${props.theme.font.weight.medium}; +export const FORM_FIELD_PLACEHOLDER_STYLES = ` + color: ${themeCssVariables.font.color.light}; + font-size: ${themeCssVariables.font.size.md}; + font-weight: ${themeCssVariables.font.weight.medium}; `; diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__mocks__/cell.ts b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__mocks__/cell.ts index d3c967642c..af8729f4cd 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__mocks__/cell.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__mocks__/cell.ts @@ -10,10 +10,11 @@ export const recordTableRowContextValue: RecordTableRowContextValue = { objectNameSingular: 'objectNameSingular', }; -export const recordTableRowDraggableContextValue: RecordTableRowDraggableContextValue = { - dragHandleProps: {} as any, - isDragging: false, -}; +export const recordTableRowDraggableContextValue: RecordTableRowDraggableContextValue = + { + dragHandleProps: {} as any, + isDragging: false, + }; export const recordTableCellContextValue: RecordTableCellContextValue = { recordField: { diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/components/RecordTableAggregateFooterCell.tsx b/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/components/RecordTableAggregateFooterCell.tsx index 143cd90d9e..d1b5414ac6 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/components/RecordTableAggregateFooterCell.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-footer/components/RecordTableAggregateFooterCell.tsx @@ -12,7 +12,7 @@ import { RecordTableColumnFooterWithDropdown } from '@/object-record/record-tabl import { getRecordTableColumnFieldWidthClassName } from '@/object-record/record-table/utils/getRecordTableColumnFieldWidthClassName'; import { cx } from '@linaria/core'; import { findByProperty, isDefined } from 'twenty-shared/utils'; -import { MOBILE_VIEWPORT } from 'twenty-ui/theme'; +import { MOBILE_VIEWPORT } from 'twenty-ui/theme-constants'; const StyledColumnFooterCell = styled.div<{ columnWidth: number; diff --git a/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInAppNavigationDrawerMock.tsx b/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInAppNavigationDrawerMock.tsx index a3b25307ce..651e886962 100644 --- a/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInAppNavigationDrawerMock.tsx +++ b/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInAppNavigationDrawerMock.tsx @@ -6,7 +6,7 @@ import { NavigationDrawerItem } from '@/ui/navigation/navigation-drawer/componen import { NavigationDrawerSection } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSection'; import { DEFAULT_WORKSPACE_NAME } from '@/ui/navigation/navigation-drawer/constants/DefaultWorkspaceName'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; import { SettingsPath } from 'twenty-shared/types'; import { getSettingsPath } from 'twenty-shared/utils'; diff --git a/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockContainer.tsx b/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockContainer.tsx index 239b2ecc86..0bcbf64dff 100644 --- a/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockContainer.tsx +++ b/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockContainer.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { ActionMenuComponentInstanceContext } from '@/action-menu/states/contexts/ActionMenuComponentInstanceContext'; import { MAIN_CONTEXT_STORE_INSTANCE_ID } from '@/context-store/constants/MainContextStoreInstanceId'; diff --git a/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockPage.tsx b/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockPage.tsx index 8e32e659be..8f030db2bf 100644 --- a/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockPage.tsx +++ b/packages/twenty-front/src/modules/sign-in-background-mock/components/SignInBackgroundMockPage.tsx @@ -1,5 +1,5 @@ import { t } from '@lingui/core/macro'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { SignInBackgroundMockContainer } from '@/sign-in-background-mock/components/SignInBackgroundMockContainer'; import { PageBody } from '@/ui/layout/page/components/PageBody'; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/__mocks__/mockRsiValues.ts b/packages/twenty-front/src/modules/spreadsheet-import/__mocks__/mockRsiValues.ts index 346942c284..b5c7fc81c4 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/__mocks__/mockRsiValues.ts +++ b/packages/twenty-front/src/modules/spreadsheet-import/__mocks__/mockRsiValues.ts @@ -1,7 +1,7 @@ import { defaultSpreadsheetImportProps } from '@/spreadsheet-import/provider/components/SpreadsheetImport'; import { SpreadsheetImportDialogOptions, - SpreadsheetImportFields + SpreadsheetImportFields, } from '@/spreadsheet-import/types'; import { SpreadsheetColumns } from '@/spreadsheet-import/types/SpreadsheetColumns'; import { FieldMetadataType } from 'twenty-shared/types'; @@ -162,7 +162,7 @@ export const mockRsiValues = mockComponentBehaviourForTypes({ await sleep(4000, (resolve) => resolve(data)); return data; }, - availableFieldMetadataItems: [] + availableFieldMetadataItems: [], }); export const editableTableInitialData = [ diff --git a/packages/twenty-front/src/modules/spreadsheet-import/components/Heading.tsx b/packages/twenty-front/src/modules/spreadsheet-import/components/Heading.tsx index 26b7fccd70..1c027183a2 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/components/Heading.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/components/Heading.tsx @@ -1,9 +1,11 @@ import React from 'react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; export type HeadingProps = { title: string; description?: string; + className?: string; }; const StyledContainer = styled.div` @@ -13,22 +15,22 @@ const StyledContainer = styled.div` `; const StyledTitle = styled.span` - color: ${({ theme }) => theme.font.color.primary}; - font-size: ${({ theme }) => theme.font.size.lg}; - font-weight: ${({ theme }) => theme.font.weight.semiBold}; + color: ${themeCssVariables.font.color.primary}; + font-size: ${themeCssVariables.font.size.lg}; + font-weight: ${themeCssVariables.font.weight.semiBold}; text-align: center; `; const StyledDescription = styled.span` - color: ${({ theme }) => theme.font.color.secondary}; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.regular}; - margin-top: ${({ theme }) => theme.spacing(3)}; + color: ${themeCssVariables.font.color.secondary}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.regular}; + margin-top: ${themeCssVariables.spacing[3]}; text-align: center; `; -export const Heading = ({ title, description }: HeadingProps) => ( - +export const Heading = ({ title, description, className }: HeadingProps) => ( + {title} {description && {description}} diff --git a/packages/twenty-front/src/modules/spreadsheet-import/components/MatchColumnSelectFieldSelectDropdownContent.tsx b/packages/twenty-front/src/modules/spreadsheet-import/components/MatchColumnSelectFieldSelectDropdownContent.tsx index 62c79705f5..ea3ce68da9 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/components/MatchColumnSelectFieldSelectDropdownContent.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/components/MatchColumnSelectFieldSelectDropdownContent.tsx @@ -14,7 +14,7 @@ import { DropdownMenuSectionLabel } from '@/ui/layout/dropdown/components/Dropdo import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownMenuSeparator'; import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth'; import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; import { isNonEmptyString } from '@sniptt/guards'; import { IconForbid, IconX, useIcons } from 'twenty-ui/display'; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/components/MatchColumnToFieldSelect.tsx b/packages/twenty-front/src/modules/spreadsheet-import/components/MatchColumnToFieldSelect.tsx index 0c889a1b59..eab8a45cc8 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/components/MatchColumnToFieldSelect.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/components/MatchColumnToFieldSelect.tsx @@ -10,7 +10,8 @@ import { type SpreadsheetImportFieldOption } from '@/spreadsheet-import/types/Sp import { hasNestedFields } from '@/spreadsheet-import/utils/spreadsheetImportHasNestedFields'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { isDefined } from 'twenty-shared/utils'; import { IconChevronDown } from 'twenty-ui/display'; import { type SelectOption } from 'twenty-ui/input'; @@ -26,9 +27,9 @@ interface MatchColumnToFieldSelectProps { } const StyledMenuItem = styled(MenuItem)` - background-color: ${({ theme }) => theme.background.transparent.lighter}; - border: 1px solid ${({ theme }) => theme.border.color.medium}; - border-radius: ${({ theme }) => theme.border.radius.sm}; + background-color: ${themeCssVariables.background.transparent.lighter}; + border: 1px solid ${themeCssVariables.border.color.medium}; + border-radius: ${themeCssVariables.border.radius.sm}; `; export const MatchColumnToFieldSelect = ({ onChange, diff --git a/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadSheetImportModalCloseButton.tsx b/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadSheetImportModalCloseButton.tsx index 9ffcd272a1..b48f0693c2 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadSheetImportModalCloseButton.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadSheetImportModalCloseButton.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { IconX } from 'twenty-ui/display'; import { IconButton } from 'twenty-ui/input'; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadSheetImportModalWrapper.tsx b/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadSheetImportModalWrapper.tsx index e6352d538d..1c4f6994ea 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadSheetImportModalWrapper.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadSheetImportModalWrapper.tsx @@ -1,9 +1,9 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useSpreadsheetImportInternal } from '@/spreadsheet-import/hooks/useSpreadsheetImportInternal'; import { Modal } from '@/ui/layout/modal/components/Modal'; -import { MOBILE_VIEWPORT } from 'twenty-ui/theme'; +import { MOBILE_VIEWPORT } from 'twenty-ui/theme-constants'; import { SpreadSheetImportModalCloseButton } from './SpreadSheetImportModalCloseButton'; const StyledModal = styled(Modal)` diff --git a/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadsheetImportTable.tsx b/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadsheetImportTable.tsx index c45ce0e2e8..68e4e00f48 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadsheetImportTable.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/components/SpreadsheetImportTable.tsx @@ -1,31 +1,31 @@ -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { useContext } from 'react'; // @ts-expect-error // Todo: remove usage of react-data-grid import DataGrid, { type DataGridProps } from 'react-data-grid'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { useSpreadsheetImportInternal } from '@/spreadsheet-import/hooks/useSpreadsheetImportInternal'; const StyledDataGrid = styled(DataGrid)` - --rdg-background-color: ${({ theme }) => theme.background.primary}; - --rdg-border-color: ${({ theme }) => theme.border.color.medium}; - --rdg-color: ${({ theme }) => theme.font.color.primary}; - --rdg-error-cell-background-color: ${({ theme }) => - theme.color.transparent.red5}; - --rdg-font-size: ${({ theme }) => theme.font.size.sm}; + --rdg-background-color: ${themeCssVariables.background.primary}; + --rdg-border-color: ${themeCssVariables.border.color.medium}; + --rdg-color: ${themeCssVariables.font.color.primary}; + --rdg-error-cell-background-color: ${themeCssVariables.color.transparent + .red5}; + --rdg-font-size: ${themeCssVariables.font.size.sm}; --rdg-frozen-cell-box-shadow: none; - --rdg-header-background-color: ${({ theme }) => theme.background.primary}; - --rdg-info-cell-background-color: ${({ theme }) => theme.color.blue}; - --rdg-row-hover-background-color: ${({ theme }) => - theme.background.secondary}; - --rdg-row-selected-background-color: ${({ theme }) => - theme.background.primary}; - --rdg-row-selected-hover-background-color: ${({ theme }) => - theme.background.secondary}; - --rdg-selection-color: ${({ theme }) => theme.color.blue}; - --rdg-summary-border-color: ${({ theme }) => theme.border.color.medium}; - --rdg-warning-cell-background-color: ${({ theme }) => theme.color.orange}; - --row-selected-hover-background-color: ${({ theme }) => - theme.background.secondary}; + --rdg-header-background-color: ${themeCssVariables.background.primary}; + --rdg-info-cell-background-color: ${themeCssVariables.color.blue}; + --rdg-row-hover-background-color: ${themeCssVariables.background.secondary}; + --rdg-row-selected-background-color: ${themeCssVariables.background.primary}; + --rdg-row-selected-hover-background-color: ${themeCssVariables.background + .secondary}; + --rdg-selection-color: ${themeCssVariables.color.blue}; + --rdg-summary-border-color: ${themeCssVariables.border.color.medium}; + --rdg-warning-cell-background-color: ${themeCssVariables.color.orange}; + --row-selected-hover-background-color: ${themeCssVariables.background + .secondary}; border: none; block-size: 100%; @@ -33,22 +33,21 @@ const StyledDataGrid = styled(DataGrid)` .rdg-header-row .rdg-cell { box-shadow: none; - color: ${({ theme }) => theme.font.color.tertiary}; - background-color: ${({ theme }) => theme.background.secondary}; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.semiBold}; + color: ${themeCssVariables.font.color.tertiary}; + background-color: ${themeCssVariables.background.secondary}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.semiBold}; letter-spacing: wider; - ${({ headerRowHeight }) => { - if (headerRowHeight === 0) { - return ` + ${({ headerRowHeight }) => + headerRowHeight === 0 + ? ` border: none; - `; - } - }}; + ` + : ''}; } .rdg-cell { - border-bottom: 1px solid ${({ theme }) => theme.border.color.medium}; + border-bottom: 1px solid ${themeCssVariables.border.color.medium}; border-inline-end: none; border-right: none; box-shadow: none; @@ -66,15 +65,15 @@ const StyledDataGrid = styled(DataGrid)` } .rdg-cell-error { - background-color: ${({ theme }) => theme.color.yellow3}; + background-color: ${themeCssVariables.color.yellow3}; } .rdg-cell-warning { - background-color: ${({ theme }) => theme.color.transparent.orange2}; + background-color: ${themeCssVariables.color.transparent.orange2}; } .rdg-cell-info { - background-color: ${({ theme }) => theme.color.transparent.blue2}; + background-color: ${themeCssVariables.color.transparent.blue2}; } .rdg-static { @@ -136,7 +135,7 @@ export const SpreadsheetImportTable = ({ selectedRows, }: SpreadsheetImportTableProps) => { const { rtl } = useSpreadsheetImportInternal(); - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const themeClassName = theme.name === 'dark' ? 'rdg-dark' : 'rdg-light'; if (!rows?.length || !columns?.length) return null; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/components/StepNavigationButton.tsx b/packages/twenty-front/src/modules/spreadsheet-import/components/StepNavigationButton.tsx index 9f77dc3ed2..1e64f28dc1 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/components/StepNavigationButton.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/components/StepNavigationButton.tsx @@ -1,4 +1,5 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { Modal } from '@/ui/layout/modal/components/Modal'; import { t } from '@lingui/core/macro'; @@ -7,11 +8,11 @@ import { MainButton } from 'twenty-ui/input'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; const StyledFooter = styled(Modal.Footer)` - border-top: 1px solid ${({ theme }) => theme.border.color.medium}; - box-shadow: ${({ theme }) => theme.boxShadow.strong}; + border-top: 1px solid ${themeCssVariables.border.color.medium}; + box-shadow: ${themeCssVariables.boxShadow.strong}; gap: 10px; justify-content: space-between; - padding: ${({ theme }) => theme.spacing(4)}; + padding: ${themeCssVariables.spacing[4]}; height: auto; `; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/provider/components/SpreadsheetImportProvider.tsx b/packages/twenty-front/src/modules/spreadsheet-import/provider/components/SpreadsheetImportProvider.tsx index 3ab2ba8d14..a6221468a9 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/provider/components/SpreadsheetImportProvider.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/provider/components/SpreadsheetImportProvider.tsx @@ -1,5 +1,5 @@ -import { useTheme } from '@emotion/react'; -import React from 'react'; +import React, { useContext } from 'react'; +import { ThemeContext } from 'twenty-ui/theme'; import Skeleton, { SkeletonTheme } from 'react-loading-skeleton'; import { SKELETON_LOADER_HEIGHT_SIZES } from '@/activities/components/SkeletonLoader'; @@ -17,7 +17,7 @@ const SpreadsheetImport = React.lazy(() => ); const LoadingSkeleton = () => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( theme.font.color.primary}; - font-size: ${({ theme }) => theme.font.size.md}; - font-weight: ${({ theme }) => theme.font.weight.medium}; - margin-bottom: ${({ theme }) => theme.spacing(2)}; + color: ${themeCssVariables.font.color.primary}; + font-size: ${themeCssVariables.font.size.md}; + font-weight: ${themeCssVariables.font.weight.medium}; + margin-bottom: ${themeCssVariables.spacing[2]}; `; const StyledDescription = styled.span` - color: ${({ theme }) => theme.font.color.tertiary}; - font-size: ${({ theme }) => theme.font.size.md}; - font-weight: ${({ theme }) => theme.font.weight.regular}; - margin-bottom: ${({ theme }) => theme.spacing(5)}; + color: ${themeCssVariables.font.color.tertiary}; + font-size: ${themeCssVariables.font.size.md}; + font-weight: ${themeCssVariables.font.weight.regular}; + margin-bottom: ${themeCssVariables.spacing[5]}; `; type ImportDataStepProps = { diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep.tsx index 3e68bf43e1..eefa904c91 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useCallback, useMemo, useState } from 'react'; import { StepNavigationButton } from '@/spreadsheet-import/components/StepNavigationButton'; @@ -31,6 +31,7 @@ import { type SpreadsheetImportField } from '@/spreadsheet-import/types/Spreadsh import { useAtomFamilySelectorState } from '@/ui/utilities/state/jotai/hooks/useAtomFamilySelectorState'; import { ScrollWrapper } from '@/ui/utilities/scroll/components/ScrollWrapper'; import { Trans, useLingui } from '@lingui/react/macro'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledContent = styled(Modal.Content)` align-items: center; @@ -41,19 +42,19 @@ const StyledColumnsContainer = styled.div` align-items: center; display: flex; flex-direction: column; - margin-bottom: ${({ theme }) => theme.spacing(4)}; + margin-bottom: ${themeCssVariables.spacing[4]}; `; const StyledColumns = styled.span` - color: ${({ theme }) => theme.font.color.primary}; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.medium}; + color: ${themeCssVariables.font.color.primary}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.medium}; `; const StyledColumn = styled.span` - color: ${({ theme }) => theme.font.color.primary}; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.regular}; + color: ${themeCssVariables.font.color.primary}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.regular}; `; export type MatchColumnsStepProps = { diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/ColumnGrid.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/ColumnGrid.tsx index 4690deaf7d..bbc4512489 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/ColumnGrid.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/ColumnGrid.tsx @@ -1,6 +1,7 @@ import { type SpreadsheetColumns } from '@/spreadsheet-import/types/SpreadsheetColumns'; import { t } from '@lingui/core/macro'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import React from 'react'; const StyledGridContainer = styled.div` @@ -25,8 +26,8 @@ type HeightProps = { }; const StyledGridRow = styled.div` - border-bottom: ${({ withBorder, theme }) => - withBorder && `1px solid ${theme.border.color.medium}`}; + border-bottom: ${({ withBorder }) => + withBorder ? `1px solid ${themeCssVariables.border.color.medium}` : 'none'}; box-sizing: border-box; display: flex; flex-direction: row; @@ -43,44 +44,44 @@ const StyledGridCell = styled.div` display: flex; flex: 1; overflow-x: auto; - padding-bottom: ${({ theme }) => theme.spacing(4)}; - padding-top: ${({ theme }) => theme.spacing(4)}; - ${({ position, theme }) => { + padding-bottom: ${themeCssVariables.spacing[4]}; + padding-top: ${themeCssVariables.spacing[4]}; + ${({ position }) => { if (position === 'left') { return ` - padding-left: ${theme.spacing(4)}; - padding-right: ${theme.spacing(2)}; - padding-top: ${theme.spacing(4)}; + padding-left: ${themeCssVariables.spacing[4]}; + padding-right: ${themeCssVariables.spacing[2]}; + padding-top: ${themeCssVariables.spacing[4]}; `; } if (position === 'full-line') { return ` - padding-left: ${theme.spacing(2)}; - padding-right: ${theme.spacing(4)}; - padding-top: ${theme.spacing(0)}; + padding-left: ${themeCssVariables.spacing[2]}; + padding-right: ${themeCssVariables.spacing[4]}; + padding-top: ${themeCssVariables.spacing[0]}; width: 100%; `; } return ` - padding-left: ${theme.spacing(2)}; - padding-right: ${theme.spacing(4)}; - padding-top: ${theme.spacing(4)}; + padding-left: ${themeCssVariables.spacing[2]}; + padding-right: ${themeCssVariables.spacing[4]}; + padding-top: ${themeCssVariables.spacing[4]}; `; }}; `; const StyledGridHeader = styled.div` align-items: center; - background-color: ${({ theme }) => theme.background.secondary}; - border-bottom: 1px solid ${({ theme }) => theme.border.color.medium}; + background-color: ${themeCssVariables.background.secondary}; + border-bottom: 1px solid ${themeCssVariables.border.color.medium}; box-sizing: border-box; - color: ${({ theme }) => theme.font.color.light}; + color: ${themeCssVariables.font.color.light}; display: flex; flex: 1; - font-size: ${({ theme }) => theme.font.size.xs}; - font-weight: ${({ theme }) => theme.font.weight.semiBold}; - padding-left: ${({ theme }) => theme.spacing(4)}; - padding-right: ${({ theme }) => theme.spacing(4)}; + font-size: ${themeCssVariables.font.size.xs}; + font-weight: ${themeCssVariables.font.weight.semiBold}; + padding-left: ${themeCssVariables.spacing[4]}; + padding-right: ${themeCssVariables.spacing[4]}; `; type ColumnGridProps = { diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectControlContainer.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectControlContainer.tsx index 6842b31363..bd6556ee6b 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectControlContainer.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectControlContainer.tsx @@ -1,18 +1,19 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledControlContainer = styled.div<{ cursor: string }>` align-items: center; - background-color: ${({ theme }) => theme.background.transparent.lighter}; - border: 1px solid ${({ theme }) => theme.border.color.medium}; + background-color: ${themeCssVariables.background.transparent.lighter}; + border: 1px solid ${themeCssVariables.border.color.medium}; box-sizing: border-box; - border-radius: ${({ theme }) => theme.border.radius.sm}; - color: ${({ theme }) => theme.font.color.primary}; + border-radius: ${themeCssVariables.border.radius.sm}; + color: ${themeCssVariables.font.color.primary}; cursor: ${({ cursor }) => cursor}; display: flex; - gap: ${({ theme }) => theme.spacing(1)}; - height: ${({ theme }) => theme.spacing(8)}; + gap: ${themeCssVariables.spacing[1]}; + height: ${themeCssVariables.spacing[8]}; justify-content: space-between; - padding: 0 ${({ theme }) => theme.spacing(2)}; + padding: 0 ${themeCssVariables.spacing[2]}; width: 100%; `; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectDropdownButton.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectDropdownButton.tsx index 5d862fb411..69e0a8b0d7 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectDropdownButton.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectDropdownButton.tsx @@ -7,13 +7,15 @@ import { import { type SpreadsheetMatchedOptions } from '@/spreadsheet-import/types/SpreadsheetMatchedOptions'; import { getFieldOptions } from '@/spreadsheet-import/utils/getFieldOptions'; -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { useContext } from 'react'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { Tag, type TagColor } from 'twenty-ui/components'; import { IconChevronDown } from 'twenty-ui/display'; import { type SelectOption } from 'twenty-ui/input'; const StyledIconChevronDown = styled(IconChevronDown)` - color: ${({ theme }) => theme.font.color.tertiary}; + color: ${themeCssVariables.font.color.tertiary}; `; export type SubMatchingSelectDropdownButtonProps = { @@ -33,7 +35,7 @@ export const SubMatchingSelectDropdownButton = ({ const options = getFieldOptions(fields, column.value) as SelectOption[]; const value = options.find((opt) => opt.value === option.value); - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRow.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRow.tsx index 401de20452..375a4a2694 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRow.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRow.tsx @@ -5,14 +5,15 @@ import { type SpreadsheetMatchedSelectOptionsColumn, } from '@/spreadsheet-import/types/SpreadsheetColumn'; import { type SpreadsheetMatchedOptions } from '@/spreadsheet-import/types/SpreadsheetMatchedOptions'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledRowContainer = styled.div` align-items: center; display: flex; - gap: ${({ theme }) => theme.spacing(4)}; + gap: ${themeCssVariables.spacing[4]}; justify-content: space-between; - padding-bottom: ${({ theme }) => theme.spacing(1)}; + padding-bottom: ${themeCssVariables.spacing[1]}; `; interface SubMatchingSelectRowProps { diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRowLeftSelect.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRowLeftSelect.tsx index e8b771b858..bdf9d9fd4a 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRowLeftSelect.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRowLeftSelect.tsx @@ -1,18 +1,19 @@ import { SubMatchingSelectControlContainer } from '@/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectControlContainer'; import { type SpreadsheetMatchedOptions } from '@/spreadsheet-import/types/SpreadsheetMatchedOptions'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledLabel = styled.span` - color: ${({ theme }) => theme.font.color.primary}; - font-weight: ${({ theme }) => theme.font.weight.regular}; - font-size: ${({ theme }) => theme.font.size.md}; + color: ${themeCssVariables.font.color.primary}; + font-weight: ${themeCssVariables.font.weight.regular}; + font-size: ${themeCssVariables.font.size.md}; `; const StyledControlLabel = styled.div` align-items: center; display: flex; - gap: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[1]}; `; export type SubMatchingSelectRowLeftSelectProps = { diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRowRightDropdown.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRowRightDropdown.tsx index 6c216e7a6e..6718edb0f5 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRowRightDropdown.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/SubMatchingSelectRowRightDropdown.tsx @@ -11,7 +11,7 @@ import { import { type SpreadsheetMatchedOptions } from '@/spreadsheet-import/types/SpreadsheetMatchedOptions'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { useCloseDropdown } from '@/ui/layout/dropdown/hooks/useCloseDropdown'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { type SelectOption } from 'twenty-ui/input'; const StyledDropdownContainer = styled.div` diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/TemplateColumn.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/TemplateColumn.tsx index e7a1e18c22..30e7c3fcc8 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/TemplateColumn.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/TemplateColumn.tsx @@ -1,4 +1,5 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { MatchColumnToFieldSelect } from '@/spreadsheet-import/components/MatchColumnToFieldSelect'; import { DO_NOT_IMPORT_OPTION_KEY } from '@/spreadsheet-import/constants/DoNotImportOptionKey'; @@ -19,10 +20,10 @@ const StyledContainer = styled.div` `; const StyledErrorMessage = styled.span` - color: ${({ theme }) => theme.font.color.danger}; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.regular}; - margin-top: ${({ theme }) => theme.spacing(1)}; + color: ${themeCssVariables.font.color.danger}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.regular}; + margin-top: ${themeCssVariables.spacing[1]}; `; type TemplateColumnProps = { diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UnmatchColumn.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UnmatchColumn.tsx index dfe030ccd3..781ed52db4 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UnmatchColumn.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UnmatchColumn.tsx @@ -5,7 +5,8 @@ import { type SpreadsheetImportFields } from '@/spreadsheet-import/types'; import { type SpreadsheetColumn } from '@/spreadsheet-import/types/SpreadsheetColumn'; import { type SpreadsheetColumns } from '@/spreadsheet-import/types/SpreadsheetColumns'; import { SpreadsheetColumnType } from '@/spreadsheet-import/types/SpreadsheetColumnType'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { t } from '@lingui/core/macro'; import { useLingui } from '@lingui/react/macro'; import { useState } from 'react'; @@ -41,9 +42,9 @@ const StyledContainer = styled.div` const StyledContentWrapper = styled.div` display: flex; flex-direction: column; - gap: ${({ theme }) => theme.spacing(3)}; - margin-top: ${({ theme }) => theme.spacing(4)}; - padding-bottom: ${({ theme }) => theme.spacing(4)}; + gap: ${themeCssVariables.spacing[3]}; + margin-top: ${themeCssVariables.spacing[4]}; + padding-bottom: ${themeCssVariables.spacing[4]}; `; export const UnmatchColumn = ({ diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UnmatchColumnBanner.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UnmatchColumnBanner.tsx index 0a1f555529..1525deb9c5 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UnmatchColumnBanner.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UnmatchColumnBanner.tsx @@ -1,43 +1,45 @@ -import { useTheme } from '@emotion/react'; -import isPropValid from '@emotion/is-prop-valid'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { useContext } from 'react'; import { isDefined } from 'twenty-shared/utils'; import { Banner, IconChevronDown, IconInfoCircle } from 'twenty-ui/display'; +import { ThemeContext } from 'twenty-ui/theme'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; -const StyledBanner = styled(Banner, { - shouldForwardProp: (prop) => isPropValid(prop) && prop !== 'allMatched', -})<{ allMatched: boolean }>` - background: ${({ allMatched, theme }) => - allMatched ? theme.accent.secondary : theme.background.transparent.light}; - border-radius: ${({ theme }) => theme.spacing(2)}; - padding: ${({ theme }) => theme.spacing(2) + ' 10px'}; +const StyledBanner = styled(Banner)<{ allMatched: boolean }>` + background: ${({ allMatched }) => + allMatched + ? themeCssVariables.accent.secondary + : themeCssVariables.background.transparent.light}; + border-radius: ${themeCssVariables.spacing[2]}; + padding: ${themeCssVariables.spacing[2]} 10px; `; -const StyledText = styled('div', { - shouldForwardProp: (prop) => isPropValid(prop) && prop !== 'allMatched', -})<{ allMatched: boolean }>` - color: ${({ allMatched, theme }) => - allMatched ? theme.color.blue : theme.font.color.secondary}; +const StyledText = styled.div<{ allMatched: boolean }>` + color: ${({ allMatched }) => + allMatched + ? themeCssVariables.color.blue + : themeCssVariables.font.color.secondary}; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; `; -const StyledTransitionedIconChevronDown = styled(IconChevronDown, { - shouldForwardProp: (prop) => - isPropValid(prop) && !['isExpanded', 'allMatched'].includes(prop), -})<{ +const StyledIconChevronDownWrapper = styled.div<{ isExpanded: boolean; allMatched: boolean; }>` - color: ${({ allMatched, theme }) => - allMatched ? theme.color.blue : theme.font.color.secondary}; + align-items: center; + color: ${({ allMatched }) => + allMatched + ? themeCssVariables.color.blue + : themeCssVariables.font.color.secondary}; + cursor: pointer; + display: flex; transform: ${({ isExpanded }) => isExpanded ? 'rotate(180deg)' : 'rotate(0deg)'}; - transition: ${({ theme }) => - `transform ${theme.animation.duration.normal}s ease`}; - cursor: pointer; + transition: transform + calc(${themeCssVariables.animation.duration.normal} * 1s) ease; `; const StyledClickableContainer = styled.div` @@ -61,7 +63,7 @@ export const UnmatchColumnBanner = ({ buttonOnClick?: () => void; allMatched: boolean; }) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( @@ -72,11 +74,12 @@ export const UnmatchColumnBanner = ({ {isDefined(buttonOnClick) ? ( {message} - + > + + ) : ( {message} diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UserTableColumn.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UserTableColumn.tsx index a92be3f86c..ab8fa59f5e 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UserTableColumn.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/components/UserTableColumn.tsx @@ -1,4 +1,5 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { type ImportedRow } from '@/spreadsheet-import/types'; @@ -12,18 +13,18 @@ const StyledContainer = styled.div` `; const StyledValue = styled.span` - color: ${({ theme }) => theme.font.color.primary}; - font-size: ${({ theme }) => theme.font.size.md}; - font-weight: ${({ theme }) => theme.font.weight.medium}; + color: ${themeCssVariables.font.color.primary}; + font-size: ${themeCssVariables.font.size.md}; + font-weight: ${themeCssVariables.font.weight.medium}; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; `; const StyledExample = styled.span` - color: ${({ theme }) => theme.font.color.tertiary}; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.medium}; + color: ${themeCssVariables.font.color.tertiary}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.medium}; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SelectHeaderStep/SelectHeaderStep.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SelectHeaderStep/SelectHeaderStep.tsx index 1785cce333..8ee0beef4d 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SelectHeaderStep/SelectHeaderStep.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SelectHeaderStep/SelectHeaderStep.tsx @@ -1,4 +1,5 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { useCallback, useState } from 'react'; import { Heading } from '@/spreadsheet-import/components/Heading'; @@ -15,7 +16,7 @@ import { useLingui } from '@lingui/react/macro'; import { SelectHeaderTable } from './components/SelectHeaderTable'; const StyledHeading = styled(Heading)` - margin-bottom: ${({ theme }) => theme.spacing(8)}; + margin-bottom: ${themeCssVariables.spacing[8]}; `; const StyledTableContainer = styled.div` diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SelectSheetStep/SelectSheetStep.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SelectSheetStep/SelectSheetStep.tsx index 07470139f5..7b3a65d26a 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SelectSheetStep/SelectSheetStep.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SelectSheetStep/SelectSheetStep.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useCallback, useState } from 'react'; import { Heading } from '@/spreadsheet-import/components/Heading'; @@ -12,6 +12,7 @@ import { mapWorkbook } from '@/spreadsheet-import/utils/mapWorkbook'; import { Modal } from '@/ui/layout/modal/components/Modal'; import { useLingui } from '@lingui/react/macro'; import { Radio, RadioGroup } from 'twenty-ui/input'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { type WorkBook } from 'xlsx-ugnis'; const StyledContent = styled(Modal.Content)` @@ -19,7 +20,7 @@ const StyledContent = styled(Modal.Content)` display: flex; flex-direction: column; justify-content: center; - gap: ${({ theme }) => theme.spacing(8)}; + gap: ${themeCssVariables.spacing[8]}; `; const StyledHeading = styled(Heading)` @@ -32,7 +33,7 @@ const StyledRadioContainer = styled.div` `; const StyledRadio = styled(Radio)` - margin-bottom: ${({ theme }) => theme.spacing(6)}; + margin-bottom: ${themeCssVariables.spacing[6]}; `; type SelectSheetStepProps = { diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SpreadsheetImportStepper.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SpreadsheetImportStepper.tsx index dda1d0dd28..37c16883c6 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SpreadsheetImportStepper.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SpreadsheetImportStepper.tsx @@ -1,6 +1,6 @@ -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; -import { useCallback, useState } from 'react'; +import { styled } from '@linaria/react'; +import { useCallback, useContext, useState } from 'react'; +import { ThemeContext } from 'twenty-ui/theme'; import { useSpreadsheetImportInternal } from '@/spreadsheet-import/hooks/useSpreadsheetImportInternal'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; @@ -31,7 +31,7 @@ export const SpreadsheetImportStepper = ({ nextStep, prevStep, }: SpreadsheetImportStepperProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const { initialStepState } = useSpreadsheetImportInternal(); diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SpreadsheetImportStepperContainer.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SpreadsheetImportStepperContainer.tsx index be540b46a1..8c593ed396 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SpreadsheetImportStepperContainer.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/SpreadsheetImportStepperContainer.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useSpreadsheetImportInitialStep } from '@/spreadsheet-import/hooks/useSpreadsheetImportInitialStep'; import { useSpreadsheetImportInternal } from '@/spreadsheet-import/hooks/useSpreadsheetImportInternal'; @@ -10,18 +10,18 @@ import { spreadsheetImportDialogState } from '@/spreadsheet-import/states/spread import { Modal } from '@/ui/layout/modal/components/Modal'; import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; import { useLingui } from '@lingui/react/macro'; -import { MOBILE_VIEWPORT } from 'twenty-ui/theme'; +import { MOBILE_VIEWPORT, themeCssVariables } from 'twenty-ui/theme-constants'; import { SpreadsheetImportStepper } from './SpreadsheetImportStepper'; const StyledHeader = styled(Modal.Header)` - background-color: ${({ theme }) => theme.background.secondary}; - border-bottom: 1px solid ${({ theme }) => theme.border.color.medium}; - padding: 0px ${({ theme }) => theme.spacing(30)}; + background-color: ${themeCssVariables.background.secondary}; + border-bottom: 1px solid ${themeCssVariables.border.color.medium}; + padding: 0px ${themeCssVariables.spacing[30]}; height: 60px; flex-shrink: 0; @media (max-width: ${MOBILE_VIEWPORT}px) { - padding-left: ${({ theme }) => theme.spacing(4)}; - padding-right: ${({ theme }) => theme.spacing(4)}; + padding-left: ${themeCssVariables.spacing[4]}; + padding-right: ${themeCssVariables.spacing[4]}; } `; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/UploadStep.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/UploadStep.tsx index ef67fd1748..c911280664 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/UploadStep.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/UploadStep.tsx @@ -1,5 +1,6 @@ import { t } from '@lingui/core/macro'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { useCallback, useState } from 'react'; import { type WorkBook } from 'xlsx-ugnis'; @@ -14,7 +15,7 @@ import { mapWorkbook } from '@/spreadsheet-import/utils/mapWorkbook'; import { DropZone } from './components/DropZone'; const StyledContent = styled(Modal.Content)` - padding: ${({ theme }) => theme.spacing(6)}; + padding: ${themeCssVariables.spacing[6]}; `; type UploadStepProps = { diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/components/DropZone.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/components/DropZone.tsx index e8dab6ed76..bc24de46d1 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/components/DropZone.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/UploadStep/components/DropZone.tsx @@ -1,4 +1,5 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { useState } from 'react'; import { useDropzone } from 'react-dropzone'; import { read, type WorkBook } from 'xlsx-ugnis'; @@ -14,40 +15,38 @@ import { MainButton } from 'twenty-ui/input'; const StyledContainer = styled.div` align-items: center; - background: ${({ theme }) => ` - repeating-linear-gradient( + background: repeating-linear-gradient( 0deg, - ${theme.font.color.primary}, - ${theme.font.color.primary} 10px, + ${themeCssVariables.font.color.primary}, + ${themeCssVariables.font.color.primary} 10px, transparent 10px, transparent 20px, - ${theme.font.color.primary} 20px + ${themeCssVariables.font.color.primary} 20px ), repeating-linear-gradient( 90deg, - ${theme.font.color.primary}, - ${theme.font.color.primary} 10px, + ${themeCssVariables.font.color.primary}, + ${themeCssVariables.font.color.primary} 10px, transparent 10px, transparent 20px, - ${theme.font.color.primary} 20px + ${themeCssVariables.font.color.primary} 20px ), repeating-linear-gradient( 180deg, - ${theme.font.color.primary}, - ${theme.font.color.primary} 10px, + ${themeCssVariables.font.color.primary}, + ${themeCssVariables.font.color.primary} 10px, transparent 10px, transparent 20px, - ${theme.font.color.primary} 20px + ${themeCssVariables.font.color.primary} 20px ), repeating-linear-gradient( 270deg, - ${theme.font.color.primary}, - ${theme.font.color.primary} 10px, + ${themeCssVariables.font.color.primary}, + ${themeCssVariables.font.color.primary} 10px, transparent 10px, transparent 20px, - ${theme.font.color.primary} 20px + ${themeCssVariables.font.color.primary} 20px ); - `}; background-position: 0 0, 0 0, @@ -59,7 +58,7 @@ const StyledContainer = styled.div` 100% 2px, 2px 100%, 100% 2px; - border-radius: ${({ theme }) => theme.border.radius.sm}; + border-radius: ${themeCssVariables.border.radius.sm}; display: flex; flex: 1; flex-direction: column; @@ -68,8 +67,8 @@ const StyledContainer = styled.div` `; const StyledOverlay = styled.div` - background: ${({ theme }) => theme.background.transparent.medium}; - border-radius: ${({ theme }) => theme.border.radius.sm}; + background: ${themeCssVariables.background.transparent.medium}; + border-radius: ${themeCssVariables.border.radius.sm}; bottom: 0px; left: 0px; position: absolute; @@ -78,20 +77,20 @@ const StyledOverlay = styled.div` `; const StyledText = styled.span` - color: ${({ theme }) => theme.font.color.primary}; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.medium}; + color: ${themeCssVariables.font.color.primary}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.medium}; text-align: center; padding: 16px; `; const StyledFooterText = styled.span` - color: ${({ theme }) => theme.font.color.tertiary}; - font-size: ${({ theme }) => theme.font.size.xs}; - font-weight: ${({ theme }) => theme.font.weight.regular}; + color: ${themeCssVariables.font.color.tertiary}; + font-size: ${themeCssVariables.font.size.xs}; + font-weight: ${themeCssVariables.font.weight.regular}; text-align: center; position: absolute; - bottom: ${({ theme }) => theme.spacing(4)}; + bottom: ${themeCssVariables.spacing[4]}; left: 50%; transform: translateX(-50%); width: 100%; @@ -101,7 +100,7 @@ const StyledButtonsContainer = styled.div` align-items: center; display: flex; flex-direction: column; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; max-width: 200px; width: 100%; `; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx index 2928c44aa8..1dcdd5cca8 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/ValidationStep.tsx @@ -13,7 +13,8 @@ import { SpreadsheetColumnType } from '@/spreadsheet-import/types/SpreadsheetCol import { addErrorsAndRunHooks } from '@/spreadsheet-import/utils/dataMutations'; import { useDialogManager } from '@/ui/feedback/dialog-manager/hooks/useDialogManager'; import { Modal } from '@/ui/layout/modal/components/Modal'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { Trans, useLingui } from '@lingui/react/macro'; import { type Dispatch, @@ -37,10 +38,10 @@ const StyledContent = styled(Modal.Content)` const StyledToolbar = styled.div` align-items: center; - border-radius: ${({ theme }) => theme.border.radius.md}; - border: 1px solid ${({ theme }) => theme.border.color.medium}; - background-color: ${({ theme }) => theme.background.secondary}; - bottom: ${({ theme }) => theme.spacing(3)}; + border-radius: ${themeCssVariables.border.radius.md}; + border: 1px solid ${themeCssVariables.border.color.medium}; + background-color: ${themeCssVariables.background.secondary}; + bottom: ${themeCssVariables.spacing[3]}; display: flex; flex-direction: row; justify-content: space-between; @@ -48,9 +49,9 @@ const StyledToolbar = styled.div` position: absolute; transform: translateX(-50%); width: 400px; - padding: ${({ theme }) => theme.spacing(3)}; + padding: ${themeCssVariables.spacing[3]}; z-index: 1; - box-shadow: ${({ theme }) => theme.boxShadow.strong}; + box-shadow: ${themeCssVariables.boxShadow.strong}; `; const StyledButton = styled(Button)` @@ -64,10 +65,10 @@ const StyledErrorToggle = styled.div` `; const StyledErrorToggleDescription = styled.span` - color: ${({ theme }) => theme.font.color.secondary}; - font-size: ${({ theme }) => theme.font.size.md}; - font-weight: ${({ theme }) => theme.font.weight.regular}; - margin-left: ${({ theme }) => theme.spacing(2)}; + color: ${themeCssVariables.font.color.secondary}; + font-size: ${themeCssVariables.font.size.md}; + font-weight: ${themeCssVariables.font.weight.regular}; + margin-left: ${themeCssVariables.spacing[2]}; `; const StyledScrollContainer = styled.div` @@ -82,11 +83,11 @@ const StyledNoRowsContainer = styled.div` display: flex; grid-column: 1/-1; justify-content: center; - margin-top: ${({ theme }) => theme.spacing(8)}; + margin-top: ${themeCssVariables.spacing[8]}; `; const StyledNoRowsWithErrorsContainer = styled.div` - color: ${({ theme }) => theme.font.color.tertiary}; + color: ${themeCssVariables.font.color.tertiary}; display: flex; justify-content: center; margin: auto 0; diff --git a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx index ce59b26b9e..73b9fad5b8 100644 --- a/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx +++ b/packages/twenty-front/src/modules/spreadsheet-import/steps/components/ValidationStep/components/columns.tsx @@ -1,5 +1,6 @@ import { t } from '@lingui/core/macro'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; // @ts-expect-error // Todo: remove usage of react-data-grid import { type Column, useRowSelection } from 'react-data-grid'; import { createPortal } from 'react-dom'; @@ -19,7 +20,7 @@ import { type ImportedStructuredRowMetadata } from '@/spreadsheet-import/steps/c const StyledHeaderContainer = styled.div` align-items: center; display: flex; - gap: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[1]}; position: relative; `; @@ -52,7 +53,7 @@ const StyledInputContainer = styled.div` display: flex; min-height: 100%; min-width: 100%; - padding-right: ${({ theme }) => theme.spacing(2)}; + padding-right: ${themeCssVariables.spacing[2]}; `; const StyledDefaultContainer = styled.div` @@ -63,7 +64,7 @@ const StyledDefaultContainer = styled.div` `; const StyledSelectReadonlyValueContianer = styled.div` - padding-left: ${({ theme }) => theme.spacing(2)}; + padding-left: ${themeCssVariables.spacing[2]}; `; const SELECT_COLUMN_KEY = 'select-row'; diff --git a/packages/twenty-front/src/modules/ui/field/display/components/BooleanDisplay.tsx b/packages/twenty-front/src/modules/ui/field/display/components/BooleanDisplay.tsx index ee2851d6ec..19c9596ece 100644 --- a/packages/twenty-front/src/modules/ui/field/display/components/BooleanDisplay.tsx +++ b/packages/twenty-front/src/modules/ui/field/display/components/BooleanDisplay.tsx @@ -1,9 +1,7 @@ import { styled } from '@linaria/react'; import { t } from '@lingui/core/macro'; import { IconCheck, IconX } from 'twenty-ui/display'; -import { THEME_COMMON } from 'twenty-ui/theme'; - -const iconSizeSm = THEME_COMMON.icon.size.sm; +const iconSizeSm = 14; const StyledBooleanFieldValue = styled.div` margin-left: 4px; diff --git a/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenuItemsContainer.tsx b/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenuItemsContainer.tsx index 7181312f5b..b53ff596de 100644 --- a/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenuItemsContainer.tsx +++ b/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenuItemsContainer.tsx @@ -50,13 +50,16 @@ export const DropdownMenuItemsContainer = ({ children, hasMaxHeight, scrollable = true, + className, }: { children: React.ReactNode; hasMaxHeight?: boolean; scrollable?: boolean; + className?: string; }) => { return scrollable === true ? ( ) : ( - + {children} ); diff --git a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx index ccb18ba0cd..3e535e3271 100644 --- a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx +++ b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerSection.tsx @@ -21,13 +21,15 @@ const StyledSectionInnerContainerMinusScrollPadding = styled.div<{ export const NavigationDrawerSection = ({ children, + className, }: { children: React.ReactNode; + className?: string; }) => { const isMobile = useIsMobile(); const isSettingsDrawer = useIsSettingsDrawer(); return ( - + ` align-items: center; - background-color: ${({ theme, variant }) => { + background-color: ${({ variant }) => { switch (variant) { case 'danger': - return theme.background.danger; + return themeCssVariables.background.danger; case 'default': default: - return theme.accent.quaternary; + return themeCssVariables.accent.quaternary; } }}; border: 1px solid - ${({ theme, variant }) => { + ${({ variant }) => { switch (variant) { case 'danger': - return theme.border.color.danger; + return themeCssVariables.border.color.danger; case 'default': default: - return theme.accent.tertiary; + return themeCssVariables.accent.tertiary; } }}; border-radius: 4px; - color: ${({ theme, variant }) => { + color: ${({ variant }) => { switch (variant) { case 'danger': - return theme.color.red; + return themeCssVariables.color.red; case 'default': default: - return theme.color.blue; + return themeCssVariables.color.blue; } }}; height: 24px; @@ -39,11 +41,11 @@ const StyledChip = styled.div<{ variant: SortOrFilterChipVariant }>` display: flex; flex-direction: row; flex-shrink: 0; - font-size: ${({ theme }) => theme.font.size.sm}; - font-weight: ${({ theme }) => theme.font.weight.medium}; - padding: ${({ theme }) => theme.spacing(0.5)}; - padding-left: ${({ theme }) => theme.spacing(1)}; - column-gap: ${({ theme }) => theme.spacing(1)}; + font-size: ${themeCssVariables.font.size.sm}; + font-weight: ${themeCssVariables.font.weight.medium}; + padding: ${themeCssVariables.spacing[0.5]}; + padding-left: ${themeCssVariables.spacing[1]}; + column-gap: ${themeCssVariables.spacing[1]}; user-select: none; white-space: nowrap; `; @@ -61,7 +63,7 @@ const StyledDelete = styled.button<{ variant: SortOrFilterChipVariant }>` justify-content: center; align-items: center; cursor: pointer; - font-size: ${({ theme }) => theme.font.size.sm}; + font-size: ${themeCssVariables.font.size.sm}; user-select: none; padding: 0; margin: 0; @@ -70,29 +72,29 @@ const StyledDelete = styled.button<{ variant: SortOrFilterChipVariant }>` color: inherit; &:hover { - background-color: ${({ theme, variant }) => { + background-color: ${({ variant }) => { switch (variant) { case 'danger': - return theme.color.red5; + return themeCssVariables.color.red5; case 'default': default: - return theme.accent.secondary; + return themeCssVariables.accent.secondary; } }}; - border-radius: ${({ theme }) => theme.border.radius.sm}; + border-radius: ${themeCssVariables.border.radius.sm}; } `; const StyledLabelKey = styled.div` - font-weight: ${({ theme }) => theme.font.weight.medium}; + font-weight: ${themeCssVariables.font.weight.medium}; `; const StyledFilterValue = styled.span` - font-weight: ${({ theme }) => theme.font.weight.regular}; + font-weight: ${themeCssVariables.font.weight.regular}; `; const StyledSortValue = styled.span` - font-weight: ${({ theme }) => theme.font.weight.medium}; + font-weight: ${themeCssVariables.font.weight.medium}; `; const StyledKeyLabelContainer = styled.div` @@ -124,7 +126,7 @@ export const SortOrFilterChip = ({ onClick, type, }: SortOrFilterChipProps) => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const handleDeleteClick = (e: React.MouseEvent) => { e.stopPropagation(); diff --git a/packages/twenty-front/src/modules/views/components/UpdateViewButtonGroup.tsx b/packages/twenty-front/src/modules/views/components/UpdateViewButtonGroup.tsx index fd43a35034..35000db344 100644 --- a/packages/twenty-front/src/modules/views/components/UpdateViewButtonGroup.tsx +++ b/packages/twenty-front/src/modules/views/components/UpdateViewButtonGroup.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { contextStoreCurrentViewIdComponentState } from '@/context-store/states/contextStoreCurrentViewIdComponentState'; import { useRecordIndexContextOrThrow } from '@/object-record/record-index/contexts/RecordIndexContext'; @@ -26,11 +26,12 @@ import { t } from '@lingui/core/macro'; import { IconChevronDown, IconPlus } from 'twenty-ui/display'; import { Button, ButtonGroup, IconButton } from 'twenty-ui/input'; import { MenuItem } from 'twenty-ui/navigation'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledContainer = styled.div` - border-radius: ${({ theme }) => theme.border.radius.md}; + border-radius: ${themeCssVariables.border.radius.md}; display: inline-flex; - margin-right: ${({ theme }) => theme.spacing(2)}; + margin-right: ${themeCssVariables.spacing[2]}; position: relative; `; diff --git a/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx b/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx index c63a066be1..65715be302 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarDetails.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { type ReactNode, useMemo } from 'react'; import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural'; @@ -36,6 +36,7 @@ import { t } from '@lingui/core/macro'; import { isNonEmptyArray, isNonEmptyString } from '@sniptt/guards'; import { isDefined } from 'twenty-shared/utils'; import { LightButton } from 'twenty-ui/input'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; export type ViewBarDetailsProps = { hasFilterButton?: boolean; @@ -46,15 +47,13 @@ export type ViewBarDetailsProps = { const StyledBar = styled.div` align-items: center; - align-items: center; - border-top: 1px solid ${({ theme }) => theme.border.color.light}; - border-top: 1px solid ${({ theme }) => theme.border.color.light}; + border-top: 1px solid ${themeCssVariables.border.color.light}; display: flex; flex-direction: row; justify-content: space-between; min-height: 32px; - padding-top: ${({ theme }) => theme.spacing(1)}; - padding-bottom: ${({ theme }) => theme.spacing(1)}; + padding-top: ${themeCssVariables.spacing[1]}; + padding-bottom: ${themeCssVariables.spacing[1]}; z-index: 4; `; @@ -62,20 +61,20 @@ const StyledChipContainer = styled.div` align-items: center; display: flex; flex-direction: row; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; z-index: 1; `; const StyledActionButtonContainer = styled.div` display: flex; flex-direction: row; - gap: ${({ theme }) => theme.spacing(2)}; + gap: ${themeCssVariables.spacing[2]}; `; const StyledFilterContainer = styled.div` align-items: center; display: flex; - gap: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[1]}; overflow-x: hidden; `; @@ -84,15 +83,15 @@ const StyledSeparatorContainer = styled.div` align-items: flex-start; align-self: stretch; display: flex; - padding-bottom: ${({ theme }) => theme.spacing(2)}; - padding-left: ${({ theme }) => theme.spacing(1)}; - padding-right: ${({ theme }) => theme.spacing(1)}; - padding-top: ${({ theme }) => theme.spacing(2)}; + padding-bottom: ${themeCssVariables.spacing[2]}; + padding-left: ${themeCssVariables.spacing[1]}; + padding-right: ${themeCssVariables.spacing[1]}; + padding-top: ${themeCssVariables.spacing[2]}; `; const StyledSeparator = styled.div` align-self: stretch; - background: ${({ theme }) => theme.background.quaternary}; + background: ${themeCssVariables.background.quaternary}; width: 1px; `; diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx index ec5a1c6172..7011e4263f 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAdvancedFilterButton.tsx @@ -16,18 +16,19 @@ import { useOpenDropdown } from '@/ui/layout/dropdown/hooks/useOpenDropdown'; import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue'; import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { useGetCurrentViewOnly } from '@/views/hooks/useGetCurrentViewOnly'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; import { RecordFilterGroupLogicalOperator } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { Pill } from 'twenty-ui/components'; import { IconFilter } from 'twenty-ui/display'; import { MenuItem } from 'twenty-ui/navigation'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { v4 } from 'uuid'; const StyledPill = styled(Pill)` - background: ${({ theme }) => theme.color.blue3}; - color: ${({ theme }) => theme.color.blue}; + background: ${themeCssVariables.color.blue3}; + color: ${themeCssVariables.color.blue}; `; export const ViewBarFilterDropdownAdvancedFilterButton = () => { diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAnyFieldSearchButtonMenuItem.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAnyFieldSearchButtonMenuItem.tsx index 4a19b51397..99694df6af 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAnyFieldSearchButtonMenuItem.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownAnyFieldSearchButtonMenuItem.tsx @@ -2,18 +2,19 @@ import { SelectableListItem } from '@/ui/layout/selectable-list/components/Selec import { isSelectedItemIdComponentFamilyState } from '@/ui/layout/selectable-list/states/isSelectedItemIdComponentFamilyState'; import { useAtomComponentFamilyStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentFamilyStateValue'; import { useAtomComponentStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomComponentStateValue'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { useLingui } from '@lingui/react/macro'; import { IconSearch } from 'twenty-ui/display'; import { MenuItem } from 'twenty-ui/navigation'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { VIEW_BAR_FILTER_BOTTOM_MENU_ITEM_IDS } from '@/views/constants/ViewBarFilterBottomMenuItemIds'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; const StyledSearchText = styled.span` - color: ${({ theme }) => theme.font.color.light}; - margin-left: ${({ theme }) => theme.spacing(1)}; + color: ${themeCssVariables.font.color.light}; + margin-left: ${themeCssVariables.spacing[1]}; `; type ViewBarFilterDropdownAnyFieldSearchButtonMenuItemProps = { diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownBottomMenu.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownBottomMenu.tsx index 116ae1b5bf..73974a323f 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownBottomMenu.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownBottomMenu.tsx @@ -1,13 +1,14 @@ import { ViewBarFilterDropdownAdvancedFilterButton } from '@/views/components/ViewBarFilterDropdownAdvancedFilterButton'; import { ViewBarFilterDropdownAnyFieldSearchButton } from '@/views/components/ViewBarFilterDropdownAnyFieldSearchButton'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledContainer = styled.div` display: flex; flex-direction: column; align-items: center; justify-content: space-between; - padding: ${({ theme }) => theme.spacing(1)}; + padding: ${themeCssVariables.spacing[1]}; `; export const ViewBarFilterDropdownBottomMenu = () => { diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFieldSelectMenu.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFieldSelectMenu.tsx index f1f8f20ca6..a468d6aca0 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFieldSelectMenu.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterDropdownFieldSelectMenu.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import React from 'react'; import { objectFilterDropdownSearchInputComponentState } from '@/object-record/object-filter-dropdown/states/objectFilterDropdownSearchInputComponentState'; @@ -24,22 +24,23 @@ import { VIEW_BAR_FILTER_BOTTOM_MENU_ITEM_IDS } from '@/views/constants/ViewBarF import { ViewBarFilterDropdownIds } from '@/views/constants/ViewBarFilterDropdownIds'; import { useLingui } from '@lingui/react/macro'; import { IconX } from 'twenty-ui/display'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; export const StyledInput = styled.input` background: transparent; border: none; border-top: none; - border-bottom: 1px solid ${({ theme }) => theme.border.color.light}; + border-bottom: 1px solid ${themeCssVariables.border.color.light}; border-radius: 0; - border-top-left-radius: ${({ theme }) => theme.border.radius.md}; - border-top-right-radius: ${({ theme }) => theme.border.radius.md}; - color: ${({ theme }) => theme.font.color.primary}; + border-top-left-radius: ${themeCssVariables.border.radius.md}; + border-top-right-radius: ${themeCssVariables.border.radius.md}; + color: ${themeCssVariables.font.color.primary}; margin: 0; outline: none; - padding: ${({ theme }) => theme.spacing(2)}; + padding: ${themeCssVariables.spacing[2]}; min-height: 19px; font-family: inherit; - font-size: ${({ theme }) => theme.font.size.sm}; + font-size: ${themeCssVariables.font.size.sm}; font-weight: inherit; max-width: 100%; @@ -47,7 +48,7 @@ export const StyledInput = styled.input` text-decoration: none; &::placeholder { - color: ${({ theme }) => theme.font.color.light}; + color: ${themeCssVariables.font.color.light}; } `; diff --git a/packages/twenty-front/src/modules/views/components/ViewBarSkeletonLoader.tsx b/packages/twenty-front/src/modules/views/components/ViewBarSkeletonLoader.tsx index a82565afa8..eba2279312 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarSkeletonLoader.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarSkeletonLoader.tsx @@ -1,9 +1,10 @@ import { SKELETON_LOADER_HEIGHT_SIZES } from '@/activities/components/SkeletonLoader'; -import { useTheme } from '@emotion/react'; +import { useContext } from 'react'; import Skeleton, { SkeletonTheme } from 'react-loading-skeleton'; +import { ThemeContext } from 'twenty-ui/theme'; export const ViewBarSkeletonLoader = () => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); return ( theme.font.color.light}; + color: ${themeCssVariables.font.color.light}; display: flex; - margin: ${({ theme }) => theme.spacing(1, 2)}; + margin: ${themeCssVariables.spacing[1]} ${themeCssVariables.spacing[2]}; user-select: none; - width: calc(100% - ${({ theme }) => theme.spacing(4)}); + width: calc(100% - ${themeCssVariables.spacing[4]}); `; export const ViewPickerContentCreateMode = () => { diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerDropdown.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerDropdown.tsx index ebe458784a..6945b5345f 100644 --- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerDropdown.tsx +++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerDropdown.tsx @@ -1,6 +1,6 @@ -import { useTheme } from '@emotion/react'; -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { t } from '@lingui/core/macro'; +import { useContext } from 'react'; import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { StyledDropdownButtonContainer } from '@/ui/layout/dropdown/components/StyledDropdownButtonContainer'; @@ -23,7 +23,8 @@ import { OverflowingTextWithTooltip, useIcons, } from 'twenty-ui/display'; -import { MOBILE_VIEWPORT } from 'twenty-ui/theme'; +import { ThemeContext } from 'twenty-ui/theme'; +import { MOBILE_VIEWPORT, themeCssVariables } from 'twenty-ui/theme-constants'; const StyledIconContainer = styled.span` display: flex; @@ -32,15 +33,15 @@ const StyledIconContainer = styled.span` const StyledDropdownLabelAdornments = styled.span` align-items: center; - color: ${({ theme }) => theme.grayScale.gray8}; + color: ${themeCssVariables.grayScale.gray8}; display: flex; flex-shrink: 0; - gap: ${({ theme }) => theme.spacing(1)}; - margin-left: ${({ theme }) => theme.spacing(1)}; + gap: ${themeCssVariables.spacing[1]}; + margin-left: ${themeCssVariables.spacing[1]}; `; const StyledViewName = styled.span` - margin-left: ${({ theme }) => theme.spacing(1)}; + margin-left: ${themeCssVariables.spacing[1]}; max-width: 130px; min-width: 0; overflow: hidden; @@ -53,7 +54,7 @@ const StyledViewName = styled.span` `; export const ViewPickerDropdown = () => { - const theme = useTheme(); + const { theme } = useContext(ThemeContext); const { currentView } = useGetCurrentViewOnly(); diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerIconAndNameContainer.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerIconAndNameContainer.tsx index 78b332b808..38835594e8 100644 --- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerIconAndNameContainer.tsx +++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerIconAndNameContainer.tsx @@ -1,11 +1,12 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledIconAndNameContainer = styled.div` align-items: center; display: flex; - margin-left: ${({ theme }) => theme.spacing(1)}; - margin-right: ${({ theme }) => theme.spacing(1)}; - gap: ${({ theme }) => theme.spacing(1)}; + margin-left: ${themeCssVariables.spacing[1]}; + margin-right: ${themeCssVariables.spacing[1]}; + gap: ${themeCssVariables.spacing[1]}; `; export { StyledIconAndNameContainer as ViewPickerIconAndNameContainer }; diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx index aa3a97ca50..bb88f89df2 100644 --- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx +++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerListContent.tsx @@ -1,4 +1,4 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; import { type DropResult } from '@hello-pangea/dnd'; import { type MouseEvent, useCallback } from 'react'; @@ -24,11 +24,12 @@ import { viewPickerReferenceViewIdComponentState } from '@/views/view-picker/sta import { useLingui } from '@lingui/react/macro'; import { IconPlus } from 'twenty-ui/display'; import { MenuItem } from 'twenty-ui/navigation'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; import { ViewVisibility } from '~/generated-metadata/graphql'; import { moveArrayItem } from '~/utils/array/moveArrayItem'; const StyledBoldDropdownMenuItemsContainer = styled(DropdownMenuItemsContainer)` - font-weight: ${({ theme }) => theme.font.weight.regular}; + font-weight: ${themeCssVariables.font.weight.regular}; `; export const ViewPickerListContent = () => { diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerSaveButtonContainer.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerSaveButtonContainer.tsx index 6dd2763eec..90e4b95126 100644 --- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerSaveButtonContainer.tsx +++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerSaveButtonContainer.tsx @@ -1,9 +1,10 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledSaveButtonContainer = styled.div` display: flex; - padding: ${({ theme }) => theme.spacing(1)}; - width: calc(100% - ${({ theme }) => theme.spacing(2)}); + padding: ${themeCssVariables.spacing[1]}; + width: calc(100% - ${themeCssVariables.spacing[2]}); `; export { StyledSaveButtonContainer as ViewPickerSaveButtonContainer }; diff --git a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerSelectContainer.tsx b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerSelectContainer.tsx index c72ebc6860..babe7753ba 100644 --- a/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerSelectContainer.tsx +++ b/packages/twenty-front/src/modules/views/view-picker/components/ViewPickerSelectContainer.tsx @@ -1,10 +1,11 @@ -import styled from '@emotion/styled'; +import { styled } from '@linaria/react'; +import { themeCssVariables } from 'twenty-ui/theme-constants'; const StyledSelectContainer = styled.div` display: flex; - width: calc(100% - ${({ theme }) => theme.spacing(2)}); - margin: ${({ theme }) => theme.spacing(1)}; - color: ${({ theme }) => theme.font.color.light}; + width: calc(100% - ${themeCssVariables.spacing[2]}); + margin: ${themeCssVariables.spacing[1]}; + color: ${themeCssVariables.font.color.light}; user-select: none; `; diff --git a/packages/twenty-front/vite.config.ts b/packages/twenty-front/vite.config.ts index d63368cabb..bd7e481bdb 100644 --- a/packages/twenty-front/vite.config.ts +++ b/packages/twenty-front/vite.config.ts @@ -112,19 +112,121 @@ export default defineConfig(({ command, mode }) => { ...wyw({ include: [ '**/twenty-ui/src/**/*.{ts,tsx}', - '**/EllipsisDisplay.tsx', - '**/BooleanDisplay.tsx', - '**/RatingInput.tsx', - '**/RecordTableCellDisplayContainer.tsx', + '**/AdvancedTextEditor.tsx', + '**/BubbleMenuIconButton.tsx', + '**/TextBubbleMenu.tsx', + '**/TurnIntoBlockDropdown.tsx', + '**/WorkflowAttachmentChip.tsx', + '**/WorkflowSendEmailAttachments.tsx', + '**/ResizableImageView.tsx', + '**/SettingsBillingSubscriptionInfo.tsx', + '**/SubscriptionBenefit.tsx', + '**/SubscriptionInfoContainer.tsx', + '**/SubscriptionPrice.tsx', + '**/TrialCard.tsx', + '**/MeteredPriceSelector.tsx', + '**/PlansTags.tsx', + '**/SettingsBillingLabelValueItem.tsx', + '**/SubscriptionInfoRowContainer.tsx', + '**/FileBlock.tsx', + '**/MentionInlineContent.tsx', + '**/BlockEditor.tsx', + '**/CustomMentionMenu.tsx', + '**/CustomSideMenu.tsx', + '**/CustomSideMenuOptions.tsx', + '**/CustomSlashMenu.tsx', + '**/CurrentWorkspaceMemberOrphanFavorites.tsx', + '**/FavoritesBackButton.tsx', + '**/FavoritesDroppable.tsx', + '**/FavoritesSkeletonLoader.tsx', + '**/FavoriteFolderPickerList.tsx', + '**/InformationBanner.tsx', + '**/InformationBannerWrapper.tsx', + '**/InformationBannerDeletedRecord.tsx', + '**/AddToNavigationDragHandle.tsx', + '**/CurrentWorkspaceMemberOrphanNavigationMenuItems.tsx', + '**/NavigationItemDropTarget.tsx', + '**/NavigationMenuEditModeBar.tsx', + '**/NavigationMenuItemBackButton.tsx', + '**/NavigationMenuItemDroppable.tsx', + '**/NavigationMenuItemIconContainer.tsx', + '**/NavigationMenuItemSkeletonLoader.tsx', + '**/ObjectIconWithViewOverlay.tsx', + '**/WorkspaceNavigationMenuItems.tsx', + '**/WorkspaceNavigationMenuItemsFolder.tsx', + '**/MainNavigationDrawerAIChatContent.tsx', + '**/MainNavigationDrawerNavigationContent.tsx', + '**/MainNavigationDrawerScrollableItems.tsx', + '**/MainNavigationDrawerTabsRow.tsx', '**/RecordTableCellBaseContainer.tsx', + '**/RecordTableCellDisplayContainer.tsx', + '**/RecordTableCellFirstRowFirstColumn.tsx', + '**/RecordTableCellLoading.tsx', '**/RecordTableCellStyleWrapper.tsx', - '**/TextDisplay.tsx', - '**/EmailsDisplay.tsx', - '**/PhonesDisplay.tsx', - '**/MultiSelectDisplay.tsx', + '**/RecordTableDragAndDropPlaceholderCell.tsx', + '**/RecordTableAggregateFooterCell.tsx', + '**/RecordTableHeaderAddColumnButton.tsx', + '**/RecordTableHeaderCell.tsx', + '**/RecordTableHeaderCheckboxColumn.tsx', + '**/RecordTableHeaderDragDropColumn.tsx', + '**/RecordTableHeaderFirstCell.tsx', + '**/RecordTableHeaderFirstScrollableCell.tsx', + '**/RecordTableHeaderLastEmptyColumn.tsx', + '**/RecordTableAddButtonPlaceholderCell.tsx', + '**/RecordTableGroupSectionLastDynamicFillingCell.tsx', + '**/RecordTableLastDynamicFillingCell.tsx', '**/RecordTableRowVirtualizedContainer.tsx', '**/RecordTableVirtualizedBodyPlaceholder.tsx', - '**/RecordTableCellLoading.tsx', + '**/SignInAppNavigationDrawerMock.tsx', + '**/SignInBackgroundMockContainer.tsx', + '**/SignInBackgroundMockPage.tsx', + '**/Heading.tsx', + '**/MatchColumnSelectFieldSelectDropdownContent.tsx', + '**/MatchColumnToFieldSelect.tsx', + '**/SpreadSheetImportModalCloseButton.tsx', + '**/SpreadSheetImportModalWrapper.tsx', + '**/SpreadsheetImportTable.tsx', + '**/StepNavigationButton.tsx', + '**/ImportDataStep.tsx', + '**/MatchColumnsStep.tsx', + '**/ColumnGrid.tsx', + '**/SubMatchingSelectControlContainer.tsx', + '**/SubMatchingSelectDropdownButton.tsx', + '**/SubMatchingSelectRow.tsx', + '**/SubMatchingSelectRowLeftSelect.tsx', + '**/SubMatchingSelectRowRightDropdown.tsx', + '**/TemplateColumn.tsx', + '**/UnmatchColumn.tsx', + '**/UnmatchColumnBanner.tsx', + '**/UserTableColumn.tsx', + '**/SelectHeaderStep.tsx', + '**/SelectSheetStep.tsx', + '**/SpreadsheetImportStepper.tsx', + '**/SpreadsheetImportStepperContainer.tsx', + '**/UploadStep.tsx', + '**/DropZone.tsx', + '**/ValidationStep.tsx', + '**/columns.tsx', + '**/BooleanDisplay.tsx', + '**/EllipsisDisplay.tsx', + '**/EmailsDisplay.tsx', + '**/MultiSelectDisplay.tsx', + '**/PhonesDisplay.tsx', + '**/TextDisplay.tsx', + '**/RatingInput.tsx', + '**/SortOrFilterChip.tsx', + '**/UpdateViewButtonGroup.tsx', + '**/ViewBarDetails.tsx', + '**/ViewBarFilterDropdownAdvancedFilterButton.tsx', + '**/ViewBarFilterDropdownAnyFieldSearchButtonMenuItem.tsx', + '**/ViewBarFilterDropdownBottomMenu.tsx', + '**/ViewBarFilterDropdownFieldSelectMenu.tsx', + '**/ViewPickerContentCreateMode.tsx', + '**/ViewPickerDropdown.tsx', + '**/ViewPickerIconAndNameContainer.tsx', + '**/ViewPickerListContent.tsx', + '**/ViewPickerSaveButtonContainer.tsx', + '**/ViewPickerSelectContainer.tsx', ], babelOptions: { presets: ['@babel/preset-typescript', '@babel/preset-react'], @@ -257,8 +359,6 @@ export default defineConfig(({ command, mode }) => { resolve: { alias: { path: 'rollup-plugin-node-polyfills/polyfills/path', - // https://github.com/twentyhq/twenty/pull/10782/files - // This will likely be migrated to twenty-ui package when built separately '@tabler/icons-react': '@tabler/icons-react/dist/esm/icons/index.mjs', }, }, diff --git a/packages/twenty-ui/package.json b/packages/twenty-ui/package.json index c090bb9df3..0aeeef25ed 100644 --- a/packages/twenty-ui/package.json +++ b/packages/twenty-ui/package.json @@ -61,6 +61,7 @@ "navigation", "testing", "theme", + "theme-constants", "utilities" ], "exports": { @@ -125,6 +126,11 @@ "import": "./dist/theme.mjs", "require": "./dist/theme.cjs" }, + "./theme-constants": { + "types": "./dist/theme-constants/index.d.ts", + "import": "./dist/theme-constants.mjs", + "require": "./dist/theme-constants.cjs" + }, "./utilities": { "types": "./dist/utilities/index.d.ts", "import": "./dist/utilities.mjs", @@ -166,6 +172,9 @@ "theme": [ "dist/theme/index.d.ts" ], + "theme-constants": [ + "dist/theme-constants/index.d.ts" + ], "utilities": [ "dist/utilities/index.d.ts" ] diff --git a/packages/twenty-ui/project.json b/packages/twenty-ui/project.json index 3751d98d5a..2494d12d6e 100644 --- a/packages/twenty-ui/project.json +++ b/packages/twenty-ui/project.json @@ -36,10 +36,28 @@ "{projectRoot}/testing/dist", "{projectRoot}/theme/package.json", "{projectRoot}/theme/dist", + "{projectRoot}/theme-constants/package.json", + "{projectRoot}/theme-constants/dist", "{projectRoot}/utilities/package.json", "{projectRoot}/utilities/dist" ] }, + "generateThemeConstants": { + "executor": "nx:run-commands", + "dependsOn": [ + "build" + ], + "cache": true, + "inputs": [ + "{projectRoot}/scripts/generateThemeConstants.ts" + ], + "outputs": [ + "{projectRoot}/src/theme-constants/generated" + ], + "options": { + "command": "tsx {projectRoot}/scripts/generateThemeConstants.ts" + } + }, "generateBarrels": { "executor": "nx:run-commands", "cache": true, diff --git a/packages/twenty-ui/scripts/generateThemeConstants.ts b/packages/twenty-ui/scripts/generateThemeConstants.ts new file mode 100644 index 0000000000..3e34080d45 --- /dev/null +++ b/packages/twenty-ui/scripts/generateThemeConstants.ts @@ -0,0 +1,129 @@ +// Generates static TypeScript files with pre-computed theme constants. +// These values are string literals with no runtime imports, so wyw-in-js +// can evaluate them in its restricted sandbox without triggering the +// twenty-ui dist bundle's dependency chain (safe-regex-test / get-intrinsic). +// +// Usage (from workspace root): +// npx tsx packages/twenty-ui/scripts/generateThemeConstants.ts +// +// Prerequisites: twenty-ui must be built first (npx nx build twenty-ui). + +import { createRequire } from 'node:module'; +import { writeFileSync, mkdirSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const scriptDir = dirname(fileURLToPath(import.meta.url)); +const require = createRequire(import.meta.url); + +const { + MOBILE_VIEWPORT, + THEME_LIGHT, + THEME_DARK, + prepareThemeForRootCssVariableInjection, +} = require('../dist/theme.cjs'); + +const { themeCssVariables: existingThemeCssVariables } = + require('../dist/theme-constants.cjs'); + +const themeCssVariables = + existingThemeCssVariables ?? + (() => { + const { buildThemeReferencingRootCssVariables } = + require('../dist/theme.cjs'); + return buildThemeReferencingRootCssVariables({ + themeNode: THEME_LIGHT, + prefix: 't', + }); + })(); + +const HEADER = `\ +// Auto-generated by scripts/generateThemeConstants.ts — do not edit manually. +// Regenerate: npx tsx packages/twenty-ui/scripts/generateThemeConstants.ts +`; + +const serializeObject = ( + obj: Record, + indent = 2, +): string => { + const spaces = ' '.repeat(indent); + const entries = Object.entries(obj).map(([key, value]) => { + const safeKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key) + ? key + : JSON.stringify(key); + + if (typeof value === 'object' && value !== null) { + return `${spaces}${safeKey}: ${serializeObject(value as Record, indent + 2)},`; + } + return `${spaces}${safeKey}: ${JSON.stringify(value)},`; + }); + + return `{\n${entries.join('\n')}\n${' '.repeat(indent - 2)}}`; +}; + +const serializeTupleArray = (entries: [string, string][]): string => { + const lines = entries.map( + ([name, value]) => ` [${JSON.stringify(name)}, ${JSON.stringify(value)}],`, + ); + return `[\n${lines.join('\n')}\n]`; +}; + +const outputDir = resolve(scriptDir, '../src/theme-constants/generated'); +mkdirSync(outputDir, { recursive: true }); + +// --- themeCssVariables.ts --- + +writeFileSync( + resolve(outputDir, 'themeCssVariables.ts'), + `${HEADER} +import type { ThemeType } from '@ui/theme/types/ThemeType'; + +type DeepCSSVariableRefs = { + [K in keyof T]: T[K] extends (...args: never[]) => unknown + ? Record + : T[K] extends Record + ? DeepCSSVariableRefs + : string; +}; + +export const themeCssVariables = ${serializeObject(themeCssVariables)} as DeepCSSVariableRefs; +`, + 'utf-8', +); +console.log('Generated themeCssVariables.ts'); + +// --- themeLightCssVariableEntries.ts --- + +const lightEntries = prepareThemeForRootCssVariableInjection({ + themeNode: THEME_LIGHT, + prefix: 't', +}) as [string, string][]; + +writeFileSync( + resolve(outputDir, 'themeLightCssVariableEntries.ts'), + `${HEADER} +// CSS custom properties don't work in media queries, so MOBILE_VIEWPORT +// must be a static number rather than a var(--...) reference. +export const MOBILE_VIEWPORT = ${MOBILE_VIEWPORT}; + +export const THEME_LIGHT_CSS_VARIABLE_ENTRIES: [string, string][] = ${serializeTupleArray(lightEntries)}; +`, + 'utf-8', +); +console.log('Generated themeLightCssVariableEntries.ts'); + +// --- themeDarkCssVariableEntries.ts --- + +const darkEntries = prepareThemeForRootCssVariableInjection({ + themeNode: THEME_DARK, + prefix: 't', +}) as [string, string][]; + +writeFileSync( + resolve(outputDir, 'themeDarkCssVariableEntries.ts'), + `${HEADER} +export const THEME_DARK_CSS_VARIABLE_ENTRIES: [string, string][] = ${serializeTupleArray(darkEntries)}; +`, + 'utf-8', +); +console.log('Generated themeDarkCssVariableEntries.ts'); diff --git a/packages/twenty-ui/src/components/Pill/Pill.tsx b/packages/twenty-ui/src/components/Pill/Pill.tsx index 069ee0af95..4c433225a4 100644 --- a/packages/twenty-ui/src/components/Pill/Pill.tsx +++ b/packages/twenty-ui/src/components/Pill/Pill.tsx @@ -1,6 +1,6 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; type PillProps = { className?: string; diff --git a/packages/twenty-ui/src/components/chip/Chip.tsx b/packages/twenty-ui/src/components/chip/Chip.tsx index 4aca3d53be..6c1a7d45d9 100644 --- a/packages/twenty-ui/src/components/chip/Chip.tsx +++ b/packages/twenty-ui/src/components/chip/Chip.tsx @@ -2,7 +2,7 @@ import { styled } from '@linaria/react'; import { type ReactNode } from 'react'; import { OverflowingTextWithTooltip } from '@ui/display/tooltip/OverflowingTextWithTooltip'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; export enum ChipSize { Large = 'large', diff --git a/packages/twenty-ui/src/components/tag/Tag.tsx b/packages/twenty-ui/src/components/tag/Tag.tsx index 634815c574..c93bfb5cbf 100644 --- a/packages/twenty-ui/src/components/tag/Tag.tsx +++ b/packages/twenty-ui/src/components/tag/Tag.tsx @@ -3,7 +3,8 @@ import { useContext } from 'react'; import { type IconComponent } from '@ui/display/icon/types/IconComponent'; import { OverflowingTextWithTooltip } from '@ui/display/tooltip/OverflowingTextWithTooltip'; -import { type ThemeColor, ThemeContext, themeCssVariables } from '@ui/theme'; +import { type ThemeColor, ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { isDefined } from 'twenty-shared/utils'; const StyledTag = styled.h3<{ diff --git a/packages/twenty-ui/src/display/banner/components/Banner.tsx b/packages/twenty-ui/src/display/banner/components/Banner.tsx index 0a394a157f..240e19d672 100644 --- a/packages/twenty-ui/src/display/banner/components/Banner.tsx +++ b/packages/twenty-ui/src/display/banner/components/Banner.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledBanner = styled.div<{ variant?: BannerVariant }>` align-items: center; diff --git a/packages/twenty-ui/src/display/banner/components/SidePanelInformationBanner.tsx b/packages/twenty-ui/src/display/banner/components/SidePanelInformationBanner.tsx index cecd05f0ab..1fe0f2a072 100644 --- a/packages/twenty-ui/src/display/banner/components/SidePanelInformationBanner.tsx +++ b/packages/twenty-ui/src/display/banner/components/SidePanelInformationBanner.tsx @@ -1,6 +1,6 @@ import { styled } from '@linaria/react'; import { isDefined } from 'twenty-shared/utils'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { IconAlertTriangle, IconInfoCircle, diff --git a/packages/twenty-ui/src/display/callout/Callout.tsx b/packages/twenty-ui/src/display/callout/Callout.tsx index dacc3be4af..f59bb1d55b 100644 --- a/packages/twenty-ui/src/display/callout/Callout.tsx +++ b/packages/twenty-ui/src/display/callout/Callout.tsx @@ -4,7 +4,7 @@ import { type IconComponent } from '@ui/display/icon/types/IconComponent'; import { LightButton, LightIconButton } from '@ui/input'; import { useState } from 'react'; import { isDefined } from 'twenty-shared/utils'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; export type CalloutVariant = | 'info' diff --git a/packages/twenty-ui/src/display/checkmark/components/Checkmark.tsx b/packages/twenty-ui/src/display/checkmark/components/Checkmark.tsx index f2c51ea31c..68cc37b0ba 100644 --- a/packages/twenty-ui/src/display/checkmark/components/Checkmark.tsx +++ b/packages/twenty-ui/src/display/checkmark/components/Checkmark.tsx @@ -3,7 +3,8 @@ import React, { useContext } from 'react'; import { styled } from '@linaria/react'; import { IconCheck } from '@ui/display/icon/components/TablerIcons'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledContainer = styled.div` align-items: center; diff --git a/packages/twenty-ui/src/display/color/components/ColorSample.tsx b/packages/twenty-ui/src/display/color/components/ColorSample.tsx index 1c9b048224..dd0602f44f 100644 --- a/packages/twenty-ui/src/display/color/components/ColorSample.tsx +++ b/packages/twenty-ui/src/display/color/components/ColorSample.tsx @@ -1,6 +1,7 @@ import { styled } from '@linaria/react'; -import { type ThemeColor, themeCssVariables } from '@ui/theme'; +import { type ThemeColor } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { isDefined } from 'twenty-shared/utils'; export type ColorSampleVariant = 'default' | 'pipeline'; diff --git a/packages/twenty-ui/src/display/command-block/components/CommandBlock.tsx b/packages/twenty-ui/src/display/command-block/components/CommandBlock.tsx index f51b71b69e..55882d63fe 100644 --- a/packages/twenty-ui/src/display/command-block/components/CommandBlock.tsx +++ b/packages/twenty-ui/src/display/command-block/components/CommandBlock.tsx @@ -1,6 +1,6 @@ import { type ReactElement } from 'react'; import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledContainer = styled.div` border-radius: ${themeCssVariables.border.radius.sm}; diff --git a/packages/twenty-ui/src/display/icon/components/IllustrationIconWrapper.tsx b/packages/twenty-ui/src/display/icon/components/IllustrationIconWrapper.tsx index fdff3d204a..ed484f6636 100644 --- a/packages/twenty-ui/src/display/icon/components/IllustrationIconWrapper.tsx +++ b/packages/twenty-ui/src/display/icon/components/IllustrationIconWrapper.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; // eslint-disable-next-line twenty/styled-components-prefixed-with-styled export const IllustrationIconWrapper = styled.div` diff --git a/packages/twenty-ui/src/display/info/components/Info.tsx b/packages/twenty-ui/src/display/info/components/Info.tsx index afb4ae5d35..60a7e43c61 100644 --- a/packages/twenty-ui/src/display/info/components/Info.tsx +++ b/packages/twenty-ui/src/display/info/components/Info.tsx @@ -1,6 +1,7 @@ import { styled } from '@linaria/react'; import { IconInfoCircle } from '@ui/display/icon/components/TablerIcons'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { Button } from '@ui/input/button/components/Button/Button'; import React, { useContext } from 'react'; diff --git a/packages/twenty-ui/src/display/status/components/Status.tsx b/packages/twenty-ui/src/display/status/components/Status.tsx index 99b4d1043b..aa5b44f214 100644 --- a/packages/twenty-ui/src/display/status/components/Status.tsx +++ b/packages/twenty-ui/src/display/status/components/Status.tsx @@ -1,9 +1,6 @@ import { styled } from '@linaria/react'; -import { - MAIN_COLOR_NAMES, - themeCssVariables, - type ThemeColor, -} from '@ui/theme'; +import { MAIN_COLOR_NAMES, type ThemeColor } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { Loader } from '@ui/feedback/loader/components/Loader'; diff --git a/packages/twenty-ui/src/display/text/components/SeparatorLineText.tsx b/packages/twenty-ui/src/display/text/components/SeparatorLineText.tsx index 88f87a6ab1..5cb2292252 100644 --- a/packages/twenty-ui/src/display/text/components/SeparatorLineText.tsx +++ b/packages/twenty-ui/src/display/text/components/SeparatorLineText.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledContainer = styled.div` display: flex; diff --git a/packages/twenty-ui/src/display/tooltip/AppTooltip.tsx b/packages/twenty-ui/src/display/tooltip/AppTooltip.tsx index b2354fe9dd..2d1944e4b3 100644 --- a/packages/twenty-ui/src/display/tooltip/AppTooltip.tsx +++ b/packages/twenty-ui/src/display/tooltip/AppTooltip.tsx @@ -1,6 +1,6 @@ import { styled } from '@linaria/react'; import { type PlacesType, type PositionStrategy, Tooltip } from 'react-tooltip'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; export enum TooltipPosition { Top = 'top', diff --git a/packages/twenty-ui/src/display/typography/components/H1Title.tsx b/packages/twenty-ui/src/display/typography/components/H1Title.tsx index 7e11ab0d44..6e79a46c1c 100644 --- a/packages/twenty-ui/src/display/typography/components/H1Title.tsx +++ b/packages/twenty-ui/src/display/typography/components/H1Title.tsx @@ -1,6 +1,6 @@ import { type ReactNode } from 'react'; import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; type H1TitleProps = { title: ReactNode; diff --git a/packages/twenty-ui/src/display/typography/components/H2Title.tsx b/packages/twenty-ui/src/display/typography/components/H2Title.tsx index d71823a981..2468951aca 100644 --- a/packages/twenty-ui/src/display/typography/components/H2Title.tsx +++ b/packages/twenty-ui/src/display/typography/components/H2Title.tsx @@ -1,6 +1,6 @@ import { styled } from '@linaria/react'; import { OverflowingTextWithTooltip } from '@ui/display/tooltip/OverflowingTextWithTooltip'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; type H2TitleProps = { title: string; diff --git a/packages/twenty-ui/src/display/typography/components/H3Title.tsx b/packages/twenty-ui/src/display/typography/components/H3Title.tsx index 8af5341dea..bb2322d4a3 100644 --- a/packages/twenty-ui/src/display/typography/components/H3Title.tsx +++ b/packages/twenty-ui/src/display/typography/components/H3Title.tsx @@ -1,7 +1,7 @@ import { type ReactNode } from 'react'; import { styled } from '@linaria/react'; import { OverflowingTextWithTooltip } from '@ui/display/tooltip/OverflowingTextWithTooltip'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; type H3TitleProps = { title: ReactNode; diff --git a/packages/twenty-ui/src/display/typography/components/Label.tsx b/packages/twenty-ui/src/display/typography/components/Label.tsx index f5ef78788a..54412405c9 100644 --- a/packages/twenty-ui/src/display/typography/components/Label.tsx +++ b/packages/twenty-ui/src/display/typography/components/Label.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; export type LabelVariant = 'default' | 'small'; diff --git a/packages/twenty-ui/src/display/typography/components/StyledText.tsx b/packages/twenty-ui/src/display/typography/components/StyledText.tsx index 57c0000463..2a97b2546e 100644 --- a/packages/twenty-ui/src/display/typography/components/StyledText.tsx +++ b/packages/twenty-ui/src/display/typography/components/StyledText.tsx @@ -1,6 +1,6 @@ import { type ReactElement, type ReactNode } from 'react'; import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; type StyledTextProps = { PrefixComponent?: ReactElement; diff --git a/packages/twenty-ui/src/feedback/loader/components/Loader.tsx b/packages/twenty-ui/src/feedback/loader/components/Loader.tsx index e16ce9733c..11d4eaf851 100644 --- a/packages/twenty-ui/src/feedback/loader/components/Loader.tsx +++ b/packages/twenty-ui/src/feedback/loader/components/Loader.tsx @@ -1,5 +1,6 @@ import { styled } from '@linaria/react'; -import { type ThemeColor, themeCssVariables } from '@ui/theme'; +import { type ThemeColor } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { motion } from 'framer-motion'; const StyledLoaderContainer = styled.div<{ diff --git a/packages/twenty-ui/src/feedback/progress-bar/components/ProgressBar.tsx b/packages/twenty-ui/src/feedback/progress-bar/components/ProgressBar.tsx index b93438cb46..24bb3ce6fb 100644 --- a/packages/twenty-ui/src/feedback/progress-bar/components/ProgressBar.tsx +++ b/packages/twenty-ui/src/feedback/progress-bar/components/ProgressBar.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { motion } from 'framer-motion'; import { useState } from 'react'; diff --git a/packages/twenty-ui/src/input/button/components/AnimatedButton.tsx b/packages/twenty-ui/src/input/button/components/AnimatedButton.tsx index 5b5e55ec47..6524425a8a 100644 --- a/packages/twenty-ui/src/input/button/components/AnimatedButton.tsx +++ b/packages/twenty-ui/src/input/button/components/AnimatedButton.tsx @@ -6,7 +6,8 @@ import React, { useContext, useMemo } from 'react'; import { Link } from 'react-router-dom'; import { Pill } from '@ui/components/Pill/Pill'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type ButtonAccent, type ButtonPosition, diff --git a/packages/twenty-ui/src/input/button/components/AnimatedLightIconButton.tsx b/packages/twenty-ui/src/input/button/components/AnimatedLightIconButton.tsx index c4f53328eb..7240b25a9a 100644 --- a/packages/twenty-ui/src/input/button/components/AnimatedLightIconButton.tsx +++ b/packages/twenty-ui/src/input/button/components/AnimatedLightIconButton.tsx @@ -4,7 +4,8 @@ import { type LightIconButtonAccent, type LightIconButtonSize, } from '@ui/input/button/components/LightIconButton'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { motion, type MotionProps } from 'framer-motion'; import { type ComponentProps, type MouseEvent, useContext } from 'react'; diff --git a/packages/twenty-ui/src/input/button/components/Button/Button.tsx b/packages/twenty-ui/src/input/button/components/Button/Button.tsx index 93f65040f4..e1eb330d87 100644 --- a/packages/twenty-ui/src/input/button/components/Button/Button.tsx +++ b/packages/twenty-ui/src/input/button/components/Button/Button.tsx @@ -3,7 +3,8 @@ import { type IconComponent } from '@ui/display/icon/types/IconComponent'; import { ButtonHotkeys } from '@ui/input/button/components/Button/internal/ButtonHotKeys'; import { ButtonIcon } from '@ui/input/button/components/Button/internal/ButtonIcon'; import { ButtonSoon } from '@ui/input/button/components/Button/internal/ButtonSoon'; -import { GRAY_SCALE_LIGHT, themeCssVariables } from '@ui/theme'; +import { GRAY_SCALE_LIGHT } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { useIsMobile } from '@ui/utilities'; import { type ClickOutsideAttributes } from '@ui/utilities/types/ClickOutsideAttributes'; import React, { useMemo, useState } from 'react'; diff --git a/packages/twenty-ui/src/input/button/components/Button/internal/ButtonHotKeys.tsx b/packages/twenty-ui/src/input/button/components/Button/internal/ButtonHotKeys.tsx index a0dd63949f..8474757bd9 100644 --- a/packages/twenty-ui/src/input/button/components/Button/internal/ButtonHotKeys.tsx +++ b/packages/twenty-ui/src/input/button/components/Button/internal/ButtonHotKeys.tsx @@ -5,7 +5,7 @@ import { type ButtonSize, type ButtonVariant, } from '@ui/input'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { getOsShortcutSeparator } from '@ui/utilities'; const StyledSeparator = styled.div<{ diff --git a/packages/twenty-ui/src/input/button/components/Button/internal/ButtonIcon.tsx b/packages/twenty-ui/src/input/button/components/Button/internal/ButtonIcon.tsx index 347d6e78ff..d90a7af5ba 100644 --- a/packages/twenty-ui/src/input/button/components/Button/internal/ButtonIcon.tsx +++ b/packages/twenty-ui/src/input/button/components/Button/internal/ButtonIcon.tsx @@ -2,7 +2,8 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; import { Loader } from '@ui/feedback'; import { baseTransitionTiming } from '@ui/input/button/components/Button/constant'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { useContext } from 'react'; const StyledIcon = styled.div<{ diff --git a/packages/twenty-ui/src/input/button/components/Button/internal/ButtonText.tsx b/packages/twenty-ui/src/input/button/components/Button/internal/ButtonText.tsx index 52b139ab59..818bbc6ff8 100644 --- a/packages/twenty-ui/src/input/button/components/Button/internal/ButtonText.tsx +++ b/packages/twenty-ui/src/input/button/components/Button/internal/ButtonText.tsx @@ -1,7 +1,7 @@ import { styled } from '@linaria/react'; import { baseTransitionTiming } from '@ui/input/button/components/Button/constant'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledEllipsis = styled.div<{ isLoading?: boolean }>` right: 0; diff --git a/packages/twenty-ui/src/input/button/components/ButtonGroup.tsx b/packages/twenty-ui/src/input/button/components/ButtonGroup.tsx index 278eb8f6b0..6e479959a9 100644 --- a/packages/twenty-ui/src/input/button/components/ButtonGroup.tsx +++ b/packages/twenty-ui/src/input/button/components/ButtonGroup.tsx @@ -2,7 +2,7 @@ import { styled } from '@linaria/react'; import React, { type ReactNode } from 'react'; import { type ButtonPosition, type ButtonProps } from './Button/Button'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { isDefined } from 'twenty-shared/utils'; const StyledButtonGroupContainer = styled.div` diff --git a/packages/twenty-ui/src/input/button/components/ColorPickerButton.tsx b/packages/twenty-ui/src/input/button/components/ColorPickerButton.tsx index 9fa25a714e..fb45afb77f 100644 --- a/packages/twenty-ui/src/input/button/components/ColorPickerButton.tsx +++ b/packages/twenty-ui/src/input/button/components/ColorPickerButton.tsx @@ -1,6 +1,6 @@ import { styled } from '@linaria/react'; import { ColorSample, type ColorSampleProps } from '@ui/display'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { LightIconButton, type LightIconButtonProps, diff --git a/packages/twenty-ui/src/input/button/components/FloatingButton.tsx b/packages/twenty-ui/src/input/button/components/FloatingButton.tsx index 2a7e57123d..691d3439b0 100644 --- a/packages/twenty-ui/src/input/button/components/FloatingButton.tsx +++ b/packages/twenty-ui/src/input/button/components/FloatingButton.tsx @@ -1,6 +1,7 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { useContext } from 'react'; import { Link } from 'react-router-dom'; diff --git a/packages/twenty-ui/src/input/button/components/FloatingButtonGroup.tsx b/packages/twenty-ui/src/input/button/components/FloatingButtonGroup.tsx index 0dd37245ee..38e448ac2e 100644 --- a/packages/twenty-ui/src/input/button/components/FloatingButtonGroup.tsx +++ b/packages/twenty-ui/src/input/button/components/FloatingButtonGroup.tsx @@ -5,7 +5,7 @@ import { type FloatingButtonPosition, type FloatingButtonProps, } from './FloatingButton'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { isDefined } from 'twenty-shared/utils'; const StyledFloatingButtonGroupContainer = styled.div` diff --git a/packages/twenty-ui/src/input/button/components/FloatingIconButton.tsx b/packages/twenty-ui/src/input/button/components/FloatingIconButton.tsx index 2e711dec30..23a85a55ae 100644 --- a/packages/twenty-ui/src/input/button/components/FloatingIconButton.tsx +++ b/packages/twenty-ui/src/input/button/components/FloatingIconButton.tsx @@ -1,6 +1,7 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import React, { useContext } from 'react'; export type FloatingIconButtonSize = 'small' | 'medium'; diff --git a/packages/twenty-ui/src/input/button/components/FloatingIconButtonGroup.tsx b/packages/twenty-ui/src/input/button/components/FloatingIconButtonGroup.tsx index edbee251bc..897f8744e4 100644 --- a/packages/twenty-ui/src/input/button/components/FloatingIconButtonGroup.tsx +++ b/packages/twenty-ui/src/input/button/components/FloatingIconButtonGroup.tsx @@ -7,7 +7,7 @@ import { type FloatingIconButtonPosition, type FloatingIconButtonProps, } from './FloatingIconButton'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledFloatingIconButtonGroupContainer = styled.div` backdrop-filter: blur(20px); diff --git a/packages/twenty-ui/src/input/button/components/IconButton.tsx b/packages/twenty-ui/src/input/button/components/IconButton.tsx index a404673d97..e6eb594e4b 100644 --- a/packages/twenty-ui/src/input/button/components/IconButton.tsx +++ b/packages/twenty-ui/src/input/button/components/IconButton.tsx @@ -1,6 +1,7 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; -import { GRAY_SCALE_LIGHT, ThemeContext, themeCssVariables } from '@ui/theme'; +import { GRAY_SCALE_LIGHT, ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import React, { useContext, useMemo } from 'react'; export type IconButtonSize = 'medium' | 'small'; diff --git a/packages/twenty-ui/src/input/button/components/IconButtonGroup.tsx b/packages/twenty-ui/src/input/button/components/IconButtonGroup.tsx index 65ad4e429a..5441942169 100644 --- a/packages/twenty-ui/src/input/button/components/IconButtonGroup.tsx +++ b/packages/twenty-ui/src/input/button/components/IconButtonGroup.tsx @@ -3,7 +3,7 @@ import { type IconComponent } from '@ui/display'; import { type MouseEvent } from 'react'; import { InsideButton } from '@ui/input/button/components/InsideButton'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; export type IconButtonGroupProps = { disabled?: boolean; diff --git a/packages/twenty-ui/src/input/button/components/InsideButton.tsx b/packages/twenty-ui/src/input/button/components/InsideButton.tsx index ba3c34fb3c..d02048905c 100644 --- a/packages/twenty-ui/src/input/button/components/InsideButton.tsx +++ b/packages/twenty-ui/src/input/button/components/InsideButton.tsx @@ -1,6 +1,7 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import React, { useContext } from 'react'; export type InsideButtonProps = { diff --git a/packages/twenty-ui/src/input/button/components/LightButton.tsx b/packages/twenty-ui/src/input/button/components/LightButton.tsx index 7d8caa603c..15a49d5854 100644 --- a/packages/twenty-ui/src/input/button/components/LightButton.tsx +++ b/packages/twenty-ui/src/input/button/components/LightButton.tsx @@ -1,6 +1,7 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type MouseEvent, useContext } from 'react'; export type LightButtonAccent = 'secondary' | 'tertiary'; diff --git a/packages/twenty-ui/src/input/button/components/LightIconButton.tsx b/packages/twenty-ui/src/input/button/components/LightIconButton.tsx index 04d0487e2e..4b222b1334 100644 --- a/packages/twenty-ui/src/input/button/components/LightIconButton.tsx +++ b/packages/twenty-ui/src/input/button/components/LightIconButton.tsx @@ -1,6 +1,7 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type ComponentProps, type MouseEvent, useContext } from 'react'; export type LightIconButtonAccent = 'secondary' | 'tertiary'; diff --git a/packages/twenty-ui/src/input/button/components/MainButton.tsx b/packages/twenty-ui/src/input/button/components/MainButton.tsx index 408b6ebc96..8c09bc1448 100644 --- a/packages/twenty-ui/src/input/button/components/MainButton.tsx +++ b/packages/twenty-ui/src/input/button/components/MainButton.tsx @@ -1,6 +1,7 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import React, { type FunctionComponent, useContext } from 'react'; export type MainButtonVariant = 'primary' | 'secondary'; diff --git a/packages/twenty-ui/src/input/button/components/RoundedIconButton.tsx b/packages/twenty-ui/src/input/button/components/RoundedIconButton.tsx index f913a6a869..a12f275d0f 100644 --- a/packages/twenty-ui/src/input/button/components/RoundedIconButton.tsx +++ b/packages/twenty-ui/src/input/button/components/RoundedIconButton.tsx @@ -1,6 +1,7 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { useContext } from 'react'; export type RoundedIconButtonSize = 'small' | 'medium'; diff --git a/packages/twenty-ui/src/input/button/components/TabButton/internals/components/StyledTabBase.tsx b/packages/twenty-ui/src/input/button/components/TabButton/internals/components/StyledTabBase.tsx index 7602e0dd00..1b29ab221a 100644 --- a/packages/twenty-ui/src/input/button/components/TabButton/internals/components/StyledTabBase.tsx +++ b/packages/twenty-ui/src/input/button/components/TabButton/internals/components/StyledTabBase.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; export const StyledTabButton = styled.button<{ active?: boolean; diff --git a/packages/twenty-ui/src/input/button/components/__stories__/TabButton.stories.tsx b/packages/twenty-ui/src/input/button/components/__stories__/TabButton.stories.tsx index b45e97fd33..ae11df7cc4 100644 --- a/packages/twenty-ui/src/input/button/components/__stories__/TabButton.stories.tsx +++ b/packages/twenty-ui/src/input/button/components/__stories__/TabButton.stories.tsx @@ -17,7 +17,7 @@ import { JotaiRootDecorator, } from '@ui/testing'; import { type ReactNode } from 'react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledTabContainer = styled.div` display: flex; diff --git a/packages/twenty-ui/src/input/code-editor/components/CodeEditor.tsx b/packages/twenty-ui/src/input/code-editor/components/CodeEditor.tsx index 35bfd31acd..14d89414b7 100644 --- a/packages/twenty-ui/src/input/code-editor/components/CodeEditor.tsx +++ b/packages/twenty-ui/src/input/code-editor/components/CodeEditor.tsx @@ -3,7 +3,8 @@ import Editor, { type EditorProps, type Monaco } from '@monaco-editor/react'; import { Loader } from '@ui/feedback/loader/components/Loader'; import { BASE_CODE_EDITOR_THEME_ID } from '@ui/input/code-editor/constants/BaseCodeEditorThemeId'; import { getBaseCodeEditorTheme } from '@ui/input/code-editor/theme/utils/getBaseCodeEditorTheme'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type editor } from 'monaco-editor'; import { type KeyboardEvent, useContext, useState } from 'react'; import { isDefined } from 'twenty-shared/utils'; diff --git a/packages/twenty-ui/src/input/code-editor/components/CodeEditorHeader.tsx b/packages/twenty-ui/src/input/code-editor/components/CodeEditorHeader.tsx index d1212e0f94..4c06146484 100644 --- a/packages/twenty-ui/src/input/code-editor/components/CodeEditorHeader.tsx +++ b/packages/twenty-ui/src/input/code-editor/components/CodeEditorHeader.tsx @@ -1,6 +1,6 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledEditorHeader = styled.div` align-items: center; diff --git a/packages/twenty-ui/src/input/color-scheme/components/ColorSchemeCard.tsx b/packages/twenty-ui/src/input/color-scheme/components/ColorSchemeCard.tsx index 67cde275d3..0ac79f1f74 100644 --- a/packages/twenty-ui/src/input/color-scheme/components/ColorSchemeCard.tsx +++ b/packages/twenty-ui/src/input/color-scheme/components/ColorSchemeCard.tsx @@ -1,11 +1,8 @@ import { styled } from '@linaria/react'; import { Checkmark } from '@ui/display/checkmark/components/Checkmark'; import { type ColorScheme } from '@ui/input/types/ColorScheme'; -import { - GRAY_SCALE_DARK, - GRAY_SCALE_LIGHT, - themeCssVariables, -} from '@ui/theme'; +import { GRAY_SCALE_DARK, GRAY_SCALE_LIGHT } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { AnimatePresence, type AnimationControls, diff --git a/packages/twenty-ui/src/input/color-scheme/components/ColorSchemePicker.tsx b/packages/twenty-ui/src/input/color-scheme/components/ColorSchemePicker.tsx index 76e21fe20d..8b6e9f0068 100644 --- a/packages/twenty-ui/src/input/color-scheme/components/ColorSchemePicker.tsx +++ b/packages/twenty-ui/src/input/color-scheme/components/ColorSchemePicker.tsx @@ -1,7 +1,8 @@ import { styled } from '@linaria/react'; import { type ColorScheme } from '@ui/input/types/ColorScheme'; -import { MOBILE_VIEWPORT, themeCssVariables } from '@ui/theme'; +import { MOBILE_VIEWPORT } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { ColorSchemeCard } from './ColorSchemeCard'; const StyledContainer = styled.div` diff --git a/packages/twenty-ui/src/input/components/CardPicker.tsx b/packages/twenty-ui/src/input/components/CardPicker.tsx index 6e77868ef8..eb9a4b0932 100644 --- a/packages/twenty-ui/src/input/components/CardPicker.tsx +++ b/packages/twenty-ui/src/input/components/CardPicker.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { Radio } from './Radio'; const StyledSubscriptionCardContainer = styled.button` diff --git a/packages/twenty-ui/src/input/components/Checkbox.tsx b/packages/twenty-ui/src/input/components/Checkbox.tsx index 9d17519680..d73dae3c22 100644 --- a/packages/twenty-ui/src/input/components/Checkbox.tsx +++ b/packages/twenty-ui/src/input/components/Checkbox.tsx @@ -1,7 +1,7 @@ import { styled } from '@linaria/react'; import { IconCheck, IconMinus } from '@ui/display/icon/components/TablerIcons'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import * as React from 'react'; export enum CheckboxVariant { diff --git a/packages/twenty-ui/src/input/components/Radio.tsx b/packages/twenty-ui/src/input/components/Radio.tsx index 8b338acba4..2740b81df8 100644 --- a/packages/twenty-ui/src/input/components/Radio.tsx +++ b/packages/twenty-ui/src/input/components/Radio.tsx @@ -2,7 +2,7 @@ import { styled } from '@linaria/react'; import { motion } from 'framer-motion'; import * as React from 'react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { RadioGroup } from './RadioGroup'; export enum RadioSize { diff --git a/packages/twenty-ui/src/input/components/RadioGroup.tsx b/packages/twenty-ui/src/input/components/RadioGroup.tsx index 6fc7806d0d..1671b09d47 100644 --- a/packages/twenty-ui/src/input/components/RadioGroup.tsx +++ b/packages/twenty-ui/src/input/components/RadioGroup.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { type RadioProps } from './Radio'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; type RadioGroupProps = React.PropsWithChildren & { value?: string; diff --git a/packages/twenty-ui/src/input/components/SearchInput.tsx b/packages/twenty-ui/src/input/components/SearchInput.tsx index d2373d31f5..52aa0e0f55 100644 --- a/packages/twenty-ui/src/input/components/SearchInput.tsx +++ b/packages/twenty-ui/src/input/components/SearchInput.tsx @@ -1,7 +1,8 @@ import { styled } from '@linaria/react'; import { IconFilter, IconSearch } from '@ui/display'; import { IconButton } from '@ui/input/button/components/IconButton'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type ChangeEvent, type ReactNode, useContext, useState } from 'react'; export type SearchInputProps = { diff --git a/packages/twenty-ui/src/input/components/Toggle.tsx b/packages/twenty-ui/src/input/components/Toggle.tsx index 83ea7fcf5d..44ad6b73ad 100644 --- a/packages/twenty-ui/src/input/components/Toggle.tsx +++ b/packages/twenty-ui/src/input/components/Toggle.tsx @@ -1,6 +1,6 @@ import { styled } from '@linaria/react'; import { VisibilityHiddenInput } from '@ui/accessibility'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { motion } from 'framer-motion'; export type ToggleSize = 'small' | 'medium'; diff --git a/packages/twenty-ui/src/json-visualizer/components/JsonNestedNode.tsx b/packages/twenty-ui/src/json-visualizer/components/JsonNestedNode.tsx index 935bd21a4d..738e2fe92b 100644 --- a/packages/twenty-ui/src/json-visualizer/components/JsonNestedNode.tsx +++ b/packages/twenty-ui/src/json-visualizer/components/JsonNestedNode.tsx @@ -7,7 +7,8 @@ import { JsonNodeValue } from '@ui/json-visualizer/components/internal/JsonNodeV import { JsonNode } from '@ui/json-visualizer/components/JsonNode'; import { useJsonTreeContextOrThrow } from '@ui/json-visualizer/hooks/useJsonTreeContextOrThrow'; import { type JsonNodeHighlighting } from '@ui/json-visualizer/types/JsonNodeHighlighting'; -import { ANIMATION, themeCssVariables } from '@ui/theme'; +import { ANIMATION } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { AnimatePresence, motion } from 'framer-motion'; import { useState } from 'react'; import { isDefined } from 'twenty-shared/utils'; diff --git a/packages/twenty-ui/src/json-visualizer/components/JsonValueNode.tsx b/packages/twenty-ui/src/json-visualizer/components/JsonValueNode.tsx index fe1e48618d..30925a4d37 100644 --- a/packages/twenty-ui/src/json-visualizer/components/JsonValueNode.tsx +++ b/packages/twenty-ui/src/json-visualizer/components/JsonValueNode.tsx @@ -4,7 +4,7 @@ import { JsonListItem } from '@ui/json-visualizer/components/internal/JsonListIt import { JsonNodeLabel } from '@ui/json-visualizer/components/internal/JsonNodeLabel'; import { JsonNodeValue } from '@ui/json-visualizer/components/internal/JsonNodeValue'; import { type JsonNodeHighlighting } from '@ui/json-visualizer/types/JsonNodeHighlighting'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledListItem = styled(JsonListItem)` column-gap: ${themeCssVariables.spacing[2]}; diff --git a/packages/twenty-ui/src/json-visualizer/components/internal/JsonArrow.tsx b/packages/twenty-ui/src/json-visualizer/components/internal/JsonArrow.tsx index 8e2b8a9a7f..870f9764ff 100644 --- a/packages/twenty-ui/src/json-visualizer/components/internal/JsonArrow.tsx +++ b/packages/twenty-ui/src/json-visualizer/components/internal/JsonArrow.tsx @@ -2,7 +2,8 @@ import { styled } from '@linaria/react'; import { VisibilityHidden } from '@ui/accessibility'; import { IconChevronDown } from '@ui/display'; import { useJsonTreeContextOrThrow } from '@ui/json-visualizer/hooks/useJsonTreeContextOrThrow'; -import { ANIMATION, ThemeContext, themeCssVariables } from '@ui/theme'; +import { ANIMATION, ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { motion } from 'framer-motion'; import { useContext } from 'react'; diff --git a/packages/twenty-ui/src/json-visualizer/components/internal/JsonList.tsx b/packages/twenty-ui/src/json-visualizer/components/internal/JsonList.tsx index c6a5b560b9..a8ac3fbad0 100644 --- a/packages/twenty-ui/src/json-visualizer/components/internal/JsonList.tsx +++ b/packages/twenty-ui/src/json-visualizer/components/internal/JsonList.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledList = styled.ul<{ depth: number }>` margin: 0; diff --git a/packages/twenty-ui/src/json-visualizer/components/internal/JsonNodeLabel.tsx b/packages/twenty-ui/src/json-visualizer/components/internal/JsonNodeLabel.tsx index 8a7ad25c26..4899c7ded6 100644 --- a/packages/twenty-ui/src/json-visualizer/components/internal/JsonNodeLabel.tsx +++ b/packages/twenty-ui/src/json-visualizer/components/internal/JsonNodeLabel.tsx @@ -1,7 +1,8 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display'; import { type JsonNodeHighlighting } from '@ui/json-visualizer/types/JsonNodeHighlighting'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { useContext } from 'react'; const StyledLabelContainer = styled.span<{ diff --git a/packages/twenty-ui/src/json-visualizer/components/internal/JsonNodeValue.tsx b/packages/twenty-ui/src/json-visualizer/components/internal/JsonNodeValue.tsx index f5254df4f8..42a7e90224 100644 --- a/packages/twenty-ui/src/json-visualizer/components/internal/JsonNodeValue.tsx +++ b/packages/twenty-ui/src/json-visualizer/components/internal/JsonNodeValue.tsx @@ -1,7 +1,7 @@ import { styled } from '@linaria/react'; import { useJsonTreeContextOrThrow } from '@ui/json-visualizer/hooks/useJsonTreeContextOrThrow'; import { type JsonNodeHighlighting } from '@ui/json-visualizer/types/JsonNodeHighlighting'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledText = styled.span<{ highlighting: JsonNodeHighlighting | undefined; diff --git a/packages/twenty-ui/src/layout/animated-placeholder/components/EmptyPlaceholderStyled.tsx b/packages/twenty-ui/src/layout/animated-placeholder/components/EmptyPlaceholderStyled.tsx index de93d2d3dc..419c681fe5 100644 --- a/packages/twenty-ui/src/layout/animated-placeholder/components/EmptyPlaceholderStyled.tsx +++ b/packages/twenty-ui/src/layout/animated-placeholder/components/EmptyPlaceholderStyled.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type HTMLMotionProps, motion } from 'framer-motion'; import { type ReactNode } from 'react'; diff --git a/packages/twenty-ui/src/layout/animated-placeholder/components/ErrorPlaceholderStyled.tsx b/packages/twenty-ui/src/layout/animated-placeholder/components/ErrorPlaceholderStyled.tsx index ec5066817f..cb2c0babcd 100644 --- a/packages/twenty-ui/src/layout/animated-placeholder/components/ErrorPlaceholderStyled.tsx +++ b/packages/twenty-ui/src/layout/animated-placeholder/components/ErrorPlaceholderStyled.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; // eslint-disable-next-line twenty/styled-components-prefixed-with-styled export const AnimatedPlaceholderErrorContainer = styled.div` diff --git a/packages/twenty-ui/src/layout/card/components/Card.tsx b/packages/twenty-ui/src/layout/card/components/Card.tsx index eb3891da75..f2091cd4c2 100644 --- a/packages/twenty-ui/src/layout/card/components/Card.tsx +++ b/packages/twenty-ui/src/layout/card/components/Card.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type ComponentPropsWithoutRef } from 'react'; const StyledCard = styled.div<{ diff --git a/packages/twenty-ui/src/layout/card/components/CardContent.tsx b/packages/twenty-ui/src/layout/card/components/CardContent.tsx index 90cf9b1803..c150984f77 100644 --- a/packages/twenty-ui/src/layout/card/components/CardContent.tsx +++ b/packages/twenty-ui/src/layout/card/components/CardContent.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { motion } from 'framer-motion'; import { type ComponentProps, type ReactNode } from 'react'; diff --git a/packages/twenty-ui/src/layout/card/components/CardFooter.tsx b/packages/twenty-ui/src/layout/card/components/CardFooter.tsx index 40461f5215..7d581c41fd 100644 --- a/packages/twenty-ui/src/layout/card/components/CardFooter.tsx +++ b/packages/twenty-ui/src/layout/card/components/CardFooter.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type ComponentPropsWithoutRef } from 'react'; const StyledCardFooter = styled.div<{ divider?: boolean }>` diff --git a/packages/twenty-ui/src/layout/card/components/CardHeader.tsx b/packages/twenty-ui/src/layout/card/components/CardHeader.tsx index 595b5e22ee..6d7708ae81 100644 --- a/packages/twenty-ui/src/layout/card/components/CardHeader.tsx +++ b/packages/twenty-ui/src/layout/card/components/CardHeader.tsx @@ -1,5 +1,5 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type ComponentPropsWithoutRef } from 'react'; const StyledCardHeader = styled.div` diff --git a/packages/twenty-ui/src/layout/section/components/Section.tsx b/packages/twenty-ui/src/layout/section/components/Section.tsx index 15a832ca88..92738a0924 100644 --- a/packages/twenty-ui/src/layout/section/components/Section.tsx +++ b/packages/twenty-ui/src/layout/section/components/Section.tsx @@ -1,6 +1,6 @@ import { type ReactNode } from 'react'; import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; type SectionProps = { children: ReactNode; diff --git a/packages/twenty-ui/src/navigation/link/components/AdvancedSettingsToggle.tsx b/packages/twenty-ui/src/navigation/link/components/AdvancedSettingsToggle.tsx index fa4108a6c8..70477372b2 100644 --- a/packages/twenty-ui/src/navigation/link/components/AdvancedSettingsToggle.tsx +++ b/packages/twenty-ui/src/navigation/link/components/AdvancedSettingsToggle.tsx @@ -1,7 +1,8 @@ import { styled } from '@linaria/react'; import { IconPoint } from '@ui/display'; import { Toggle } from '@ui/input'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { useContext, useId } from 'react'; const StyledContainer = styled.div` diff --git a/packages/twenty-ui/src/navigation/link/components/ClickToActionLink.tsx b/packages/twenty-ui/src/navigation/link/components/ClickToActionLink.tsx index dc50951d3c..16175e6fff 100644 --- a/packages/twenty-ui/src/navigation/link/components/ClickToActionLink.tsx +++ b/packages/twenty-ui/src/navigation/link/components/ClickToActionLink.tsx @@ -1,7 +1,7 @@ import { styled } from '@linaria/react'; import React from 'react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledButtonLink = styled.a` align-items: center; diff --git a/packages/twenty-ui/src/navigation/link/components/ContactLink.tsx b/packages/twenty-ui/src/navigation/link/components/ContactLink.tsx index 04b6bdaa8a..43a7221a15 100644 --- a/packages/twenty-ui/src/navigation/link/components/ContactLink.tsx +++ b/packages/twenty-ui/src/navigation/link/components/ContactLink.tsx @@ -1,7 +1,7 @@ import { styled } from '@linaria/react'; import * as React from 'react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledClickableLink = styled.a<{ maxWidth?: number; diff --git a/packages/twenty-ui/src/navigation/link/components/RoundedLink.tsx b/packages/twenty-ui/src/navigation/link/components/RoundedLink.tsx index a3b5f9452c..34577d6879 100644 --- a/packages/twenty-ui/src/navigation/link/components/RoundedLink.tsx +++ b/packages/twenty-ui/src/navigation/link/components/RoundedLink.tsx @@ -1,6 +1,6 @@ import { styled } from '@linaria/react'; import { isNonEmptyString } from '@sniptt/guards'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type MouseEvent } from 'react'; type RoundedLinkProps = { diff --git a/packages/twenty-ui/src/navigation/menu/components/MenuPicker.tsx b/packages/twenty-ui/src/navigation/menu/components/MenuPicker.tsx index 431d235470..d177bb9fe1 100644 --- a/packages/twenty-ui/src/navigation/menu/components/MenuPicker.tsx +++ b/packages/twenty-ui/src/navigation/menu/components/MenuPicker.tsx @@ -7,7 +7,8 @@ import { TooltipPosition, type IconComponent, } from '@ui/display'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { isDefined } from 'twenty-shared/utils'; const StyledMenuPicker = styled.button<{ diff --git a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemHotKeys.tsx b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemHotKeys.tsx index 37c622af03..bf8a8e446e 100644 --- a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemHotKeys.tsx +++ b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemHotKeys.tsx @@ -1,7 +1,7 @@ import { styled } from '@linaria/react'; import React from 'react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledCommandTextContainer = styled.div` align-items: center; diff --git a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemMultiSelect.tsx b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemMultiSelect.tsx index b94345b1bb..8f2cb20baf 100644 --- a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemMultiSelect.tsx +++ b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemMultiSelect.tsx @@ -4,7 +4,8 @@ import { Tag } from '@ui/components'; import { type IconComponent } from '@ui/display'; import { Checkbox } from '@ui/input/components/Checkbox'; import { MenuItemLeftContent } from '@ui/navigation/menu/menu-item/internals/components/MenuItemLeftContent'; -import { type ThemeColor, themeCssVariables } from '@ui/theme'; +import { type ThemeColor } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { StyledMenuItemBase } from '../internals/components/StyledMenuItemBase'; const StyledLeftContentWithCheckboxContainer = styled.div` diff --git a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemMultiSelectAvatar.tsx b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemMultiSelectAvatar.tsx index c75d33cc95..76c5932616 100644 --- a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemMultiSelectAvatar.tsx +++ b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemMultiSelectAvatar.tsx @@ -3,7 +3,7 @@ import { type ReactNode } from 'react'; import { OverflowingTextWithTooltip } from '@ui/display'; import { Checkbox } from '@ui/input/components/Checkbox'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { StyledMenuItemBase, StyledMenuItemLabel, diff --git a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSelect.tsx b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSelect.tsx index 22b6b06b99..3875fd0002 100644 --- a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSelect.tsx +++ b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSelect.tsx @@ -8,7 +8,8 @@ import { type IconComponent, } from '@ui/display'; import { type ReactNode, useContext } from 'react'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { MenuItemLeftContent } from '../internals/components/MenuItemLeftContent'; import { StyledMenuItemBase, diff --git a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSelectAvatar.tsx b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSelectAvatar.tsx index 6fbf7a6736..d1c397b6aa 100644 --- a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSelectAvatar.tsx +++ b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSelectAvatar.tsx @@ -9,7 +9,8 @@ import { import { styled } from '@linaria/react'; import { OverflowingTextWithTooltip } from '@ui/display'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { StyledMenuItemSelect } from './MenuItemSelect'; type MenuItemSelectAvatarProps = { diff --git a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSuggestion.tsx b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSuggestion.tsx index 51ea57cf36..0be9286d81 100644 --- a/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSuggestion.tsx +++ b/packages/twenty-ui/src/navigation/menu/menu-item/components/MenuItemSuggestion.tsx @@ -2,7 +2,7 @@ import { styled } from '@linaria/react'; import { type MouseEvent } from 'react'; import { type IconComponent } from '@ui/display'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { MenuItemLeftContent } from '../internals/components/MenuItemLeftContent'; import { StyledMenuItemLeftContent } from '../internals/components/StyledMenuItemBase'; diff --git a/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/MenuItemIconBoxContainer.tsx b/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/MenuItemIconBoxContainer.tsx index 14be9cef5e..b45d2cf1e3 100644 --- a/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/MenuItemIconBoxContainer.tsx +++ b/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/MenuItemIconBoxContainer.tsx @@ -1,7 +1,7 @@ import { styled } from '@linaria/react'; import { type ReactNode } from 'react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledIconContainerBase = styled.div` align-items: flex-start; diff --git a/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/MenuItemIconWithGripSwap.tsx b/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/MenuItemIconWithGripSwap.tsx index 22c5bf40fc..6877a7b6eb 100644 --- a/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/MenuItemIconWithGripSwap.tsx +++ b/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/MenuItemIconWithGripSwap.tsx @@ -2,7 +2,8 @@ import { useContext } from 'react'; import { styled } from '@linaria/react'; import { type IconComponent, IconGripVertical } from '@ui/display'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { MenuItemIconBoxContainer } from './MenuItemIconBoxContainer'; const StyledIconSwapContainer = styled.div` diff --git a/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/StyledMenuItemBase.tsx b/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/StyledMenuItemBase.tsx index c668ed4d76..b291c45ee3 100644 --- a/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/StyledMenuItemBase.tsx +++ b/packages/twenty-ui/src/navigation/menu/menu-item/internals/components/StyledMenuItemBase.tsx @@ -3,7 +3,7 @@ import { styled } from '@linaria/react'; import { isUndefined } from '@sniptt/guards'; import { IconCheck } from '@ui/display'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { type MenuItemAccent } from '../../types/MenuItemAccent'; export type MenuItemBaseProps = { diff --git a/packages/twenty-ui/src/navigation/navigation-bar/components/NavigationBar.tsx b/packages/twenty-ui/src/navigation/navigation-bar/components/NavigationBar.tsx index 2d81eefe92..423c52d5fb 100644 --- a/packages/twenty-ui/src/navigation/navigation-bar/components/NavigationBar.tsx +++ b/packages/twenty-ui/src/navigation/navigation-bar/components/NavigationBar.tsx @@ -1,7 +1,7 @@ import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display/icon/types/IconComponent'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; import { NavigationBarItem } from './NavigationBarItem'; diff --git a/packages/twenty-ui/src/navigation/navigation-bar/components/NavigationBarItem.tsx b/packages/twenty-ui/src/navigation/navigation-bar/components/NavigationBarItem.tsx index 085d6266a6..ea2a86dc41 100644 --- a/packages/twenty-ui/src/navigation/navigation-bar/components/NavigationBarItem.tsx +++ b/packages/twenty-ui/src/navigation/navigation-bar/components/NavigationBarItem.tsx @@ -2,7 +2,8 @@ import { useContext } from 'react'; import { styled } from '@linaria/react'; import { type IconComponent } from '@ui/display/icon/types/IconComponent'; -import { ThemeContext, themeCssVariables } from '@ui/theme'; +import { ThemeContext } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledIconButton = styled.div<{ isActive?: boolean }>` align-items: center; diff --git a/packages/twenty-ui/src/navigation/notification-counter/components/NotificationCounter.tsx b/packages/twenty-ui/src/navigation/notification-counter/components/NotificationCounter.tsx index 83aa886ff3..d950e7f97f 100644 --- a/packages/twenty-ui/src/navigation/notification-counter/components/NotificationCounter.tsx +++ b/packages/twenty-ui/src/navigation/notification-counter/components/NotificationCounter.tsx @@ -1,6 +1,6 @@ import { styled } from '@linaria/react'; -import { themeCssVariables } from '@ui/theme'; +import { themeCssVariables } from '@ui/theme-constants'; const StyledNotificationCounter = styled.div<{ variant: 'primary' | 'secondary'; diff --git a/packages/twenty-ui/src/theme-constants/generated/themeCssVariables.ts b/packages/twenty-ui/src/theme-constants/generated/themeCssVariables.ts new file mode 100644 index 0000000000..337c2c06c0 --- /dev/null +++ b/packages/twenty-ui/src/theme-constants/generated/themeCssVariables.ts @@ -0,0 +1,1100 @@ +// Auto-generated by scripts/generateThemeConstants.ts — do not edit manually. +// Regenerate: npx tsx packages/twenty-ui/scripts/generateThemeConstants.ts + +import type { ThemeType } from '@ui/theme/types/ThemeType'; + +type DeepCSSVariableRefs = { + [K in keyof T]: T[K] extends (...args: never[]) => unknown + ? Record + : T[K] extends Record + ? DeepCSSVariableRefs + : string; +}; + +export const themeCssVariables = { + icon: { + size: { + sm: "var(--t-icon-size-sm)", + md: "var(--t-icon-size-md)", + lg: "var(--t-icon-size-lg)", + xl: "var(--t-icon-size-xl)", + }, + stroke: { + sm: "var(--t-icon-stroke-sm)", + md: "var(--t-icon-stroke-md)", + lg: "var(--t-icon-stroke-lg)", + }, + }, + modal: { + size: { + sm: { + width: "var(--t-modal-size-sm-width)", + }, + md: { + width: "var(--t-modal-size-md-width)", + }, + lg: { + width: "var(--t-modal-size-lg-width)", + }, + xl: { + width: "var(--t-modal-size-xl-width)", + height: "var(--t-modal-size-xl-height)", + }, + fullscreen: { + width: "var(--t-modal-size-fullscreen-width)", + height: "var(--t-modal-size-fullscreen-height)", + }, + }, + }, + text: { + lineHeight: { + lg: "var(--t-text-line-height-lg)", + md: "var(--t-text-line-height-md)", + }, + iconSizeMedium: "var(--t-text-icon-size-medium)", + iconSizeSmall: "var(--t-text-icon-size-small)", + iconStrikeLight: "var(--t-text-icon-strike-light)", + iconStrikeMedium: "var(--t-text-icon-strike-medium)", + iconStrikeBold: "var(--t-text-icon-strike-bold)", + }, + animation: { + duration: { + instant: "var(--t-animation-duration-instant)", + fast: "var(--t-animation-duration-fast)", + normal: "var(--t-animation-duration-normal)", + slow: "var(--t-animation-duration-slow)", + }, + }, + spacingMultiplicator: "var(--t-spacing-multiplicator)", + spacing: { + "0": "var(--t-spacing-0)", + "1": "var(--t-spacing-1)", + "2": "var(--t-spacing-2)", + "3": "var(--t-spacing-3)", + "4": "var(--t-spacing-4)", + "5": "var(--t-spacing-5)", + "6": "var(--t-spacing-6)", + "7": "var(--t-spacing-7)", + "8": "var(--t-spacing-8)", + "9": "var(--t-spacing-9)", + "10": "var(--t-spacing-10)", + "11": "var(--t-spacing-11)", + "12": "var(--t-spacing-12)", + "13": "var(--t-spacing-13)", + "14": "var(--t-spacing-14)", + "15": "var(--t-spacing-15)", + "16": "var(--t-spacing-16)", + "17": "var(--t-spacing-17)", + "18": "var(--t-spacing-18)", + "19": "var(--t-spacing-19)", + "20": "var(--t-spacing-20)", + "21": "var(--t-spacing-21)", + "22": "var(--t-spacing-22)", + "23": "var(--t-spacing-23)", + "24": "var(--t-spacing-24)", + "25": "var(--t-spacing-25)", + "26": "var(--t-spacing-26)", + "27": "var(--t-spacing-27)", + "28": "var(--t-spacing-28)", + "29": "var(--t-spacing-29)", + "30": "var(--t-spacing-30)", + "31": "var(--t-spacing-31)", + "32": "var(--t-spacing-32)", + "0.5": "var(--t-spacing-0_5)", + "1.5": "var(--t-spacing-1_5)", + }, + betweenSiblingsGap: "var(--t-between-siblings-gap)", + table: { + horizontalCellMargin: "var(--t-table-horizontal-cell-margin)", + checkboxColumnWidth: "var(--t-table-checkbox-column-width)", + horizontalCellPadding: "var(--t-table-horizontal-cell-padding)", + }, + rightDrawerWidth: "var(--t-right-drawer-width)", + clickableElementBackgroundTransition: "var(--t-clickable-element-background-transition)", + lastLayerZIndex: "var(--t-last-layer-z-index)", + buttons: { + secondaryTextColor: "var(--t-buttons-secondary-text-color)", + }, + accent: { + primary: "var(--t-accent-primary)", + secondary: "var(--t-accent-secondary)", + tertiary: "var(--t-accent-tertiary)", + quaternary: "var(--t-accent-quaternary)", + accent3570: "var(--t-accent-accent3570)", + accent4060: "var(--t-accent-accent4060)", + accent1: "var(--t-accent-accent1)", + accent2: "var(--t-accent-accent2)", + accent3: "var(--t-accent-accent3)", + accent4: "var(--t-accent-accent4)", + accent5: "var(--t-accent-accent5)", + accent6: "var(--t-accent-accent6)", + accent7: "var(--t-accent-accent7)", + accent8: "var(--t-accent-accent8)", + accent9: "var(--t-accent-accent9)", + accent10: "var(--t-accent-accent10)", + accent11: "var(--t-accent-accent11)", + accent12: "var(--t-accent-accent12)", + }, + background: { + noisy: "var(--t-background-noisy)", + primary: "var(--t-background-primary)", + secondary: "var(--t-background-secondary)", + tertiary: "var(--t-background-tertiary)", + quaternary: "var(--t-background-quaternary)", + invertedPrimary: "var(--t-background-inverted-primary)", + invertedSecondary: "var(--t-background-inverted-secondary)", + danger: "var(--t-background-danger)", + transparent: { + primary: "var(--t-background-transparent-primary)", + secondary: "var(--t-background-transparent-secondary)", + strong: "var(--t-background-transparent-strong)", + medium: "var(--t-background-transparent-medium)", + light: "var(--t-background-transparent-light)", + lighter: "var(--t-background-transparent-lighter)", + danger: "var(--t-background-transparent-danger)", + blue: "var(--t-background-transparent-blue)", + orange: "var(--t-background-transparent-orange)", + success: "var(--t-background-transparent-success)", + }, + overlayPrimary: "var(--t-background-overlay-primary)", + overlaySecondary: "var(--t-background-overlay-secondary)", + overlayTertiary: "var(--t-background-overlay-tertiary)", + radialGradient: "var(--t-background-radial-gradient)", + radialGradientHover: "var(--t-background-radial-gradient-hover)", + primaryInverted: "var(--t-background-primary-inverted)", + primaryInvertedHover: "var(--t-background-primary-inverted-hover)", + }, + blur: { + light: "var(--t-blur-light)", + medium: "var(--t-blur-medium)", + strong: "var(--t-blur-strong)", + }, + border: { + color: { + strong: "var(--t-border-color-strong)", + medium: "var(--t-border-color-medium)", + light: "var(--t-border-color-light)", + secondaryInverted: "var(--t-border-color-secondary-inverted)", + inverted: "var(--t-border-color-inverted)", + danger: "var(--t-border-color-danger)", + blue: "var(--t-border-color-blue)", + transparentStrong: "var(--t-border-color-transparent-strong)", + }, + radius: { + xs: "var(--t-border-radius-xs)", + sm: "var(--t-border-radius-sm)", + md: "var(--t-border-radius-md)", + xl: "var(--t-border-radius-xl)", + xxl: "var(--t-border-radius-xxl)", + pill: "var(--t-border-radius-pill)", + rounded: "var(--t-border-radius-rounded)", + }, + }, + boxShadow: { + color: "var(--t-box-shadow-color)", + light: "var(--t-box-shadow-light)", + strong: "var(--t-box-shadow-strong)", + underline: "var(--t-box-shadow-underline)", + superHeavy: "var(--t-box-shadow-super-heavy)", + }, + font: { + color: { + primary: "var(--t-font-color-primary)", + secondary: "var(--t-font-color-secondary)", + tertiary: "var(--t-font-color-tertiary)", + light: "var(--t-font-color-light)", + extraLight: "var(--t-font-color-extra-light)", + inverted: "var(--t-font-color-inverted)", + danger: "var(--t-font-color-danger)", + }, + size: { + xxs: "var(--t-font-size-xxs)", + xs: "var(--t-font-size-xs)", + sm: "var(--t-font-size-sm)", + md: "var(--t-font-size-md)", + lg: "var(--t-font-size-lg)", + xl: "var(--t-font-size-xl)", + xxl: "var(--t-font-size-xxl)", + }, + weight: { + regular: "var(--t-font-weight-regular)", + medium: "var(--t-font-weight-medium)", + semiBold: "var(--t-font-weight-semi-bold)", + }, + family: "var(--t-font-family)", + }, + name: "var(--t-name)", + snackBar: { + success: { + color: "var(--t-snack-bar-success-color)", + backgroundColor: "var(--t-snack-bar-success-background-color)", + }, + error: { + color: "var(--t-snack-bar-error-color)", + backgroundColor: "var(--t-snack-bar-error-background-color)", + }, + warning: { + color: "var(--t-snack-bar-warning-color)", + backgroundColor: "var(--t-snack-bar-warning-background-color)", + }, + info: { + color: "var(--t-snack-bar-info-color)", + backgroundColor: "var(--t-snack-bar-info-background-color)", + }, + default: { + color: "var(--t-snack-bar-default-color)", + backgroundColor: "var(--t-snack-bar-default-background-color)", + }, + }, + tag: { + text: { + gray: "var(--t-tag-text-gray)", + mauve: "var(--t-tag-text-mauve)", + slate: "var(--t-tag-text-slate)", + sage: "var(--t-tag-text-sage)", + olive: "var(--t-tag-text-olive)", + sand: "var(--t-tag-text-sand)", + tomato: "var(--t-tag-text-tomato)", + red: "var(--t-tag-text-red)", + ruby: "var(--t-tag-text-ruby)", + crimson: "var(--t-tag-text-crimson)", + pink: "var(--t-tag-text-pink)", + plum: "var(--t-tag-text-plum)", + purple: "var(--t-tag-text-purple)", + violet: "var(--t-tag-text-violet)", + iris: "var(--t-tag-text-iris)", + cyan: "var(--t-tag-text-cyan)", + turquoise: "var(--t-tag-text-turquoise)", + sky: "var(--t-tag-text-sky)", + blue: "var(--t-tag-text-blue)", + jade: "var(--t-tag-text-jade)", + green: "var(--t-tag-text-green)", + grass: "var(--t-tag-text-grass)", + mint: "var(--t-tag-text-mint)", + lime: "var(--t-tag-text-lime)", + bronze: "var(--t-tag-text-bronze)", + gold: "var(--t-tag-text-gold)", + brown: "var(--t-tag-text-brown)", + orange: "var(--t-tag-text-orange)", + amber: "var(--t-tag-text-amber)", + yellow: "var(--t-tag-text-yellow)", + }, + background: { + gray: "var(--t-tag-background-gray)", + mauve: "var(--t-tag-background-mauve)", + slate: "var(--t-tag-background-slate)", + sage: "var(--t-tag-background-sage)", + olive: "var(--t-tag-background-olive)", + sand: "var(--t-tag-background-sand)", + tomato: "var(--t-tag-background-tomato)", + red: "var(--t-tag-background-red)", + ruby: "var(--t-tag-background-ruby)", + crimson: "var(--t-tag-background-crimson)", + pink: "var(--t-tag-background-pink)", + plum: "var(--t-tag-background-plum)", + purple: "var(--t-tag-background-purple)", + violet: "var(--t-tag-background-violet)", + iris: "var(--t-tag-background-iris)", + cyan: "var(--t-tag-background-cyan)", + turquoise: "var(--t-tag-background-turquoise)", + sky: "var(--t-tag-background-sky)", + blue: "var(--t-tag-background-blue)", + jade: "var(--t-tag-background-jade)", + green: "var(--t-tag-background-green)", + grass: "var(--t-tag-background-grass)", + mint: "var(--t-tag-background-mint)", + lime: "var(--t-tag-background-lime)", + bronze: "var(--t-tag-background-bronze)", + gold: "var(--t-tag-background-gold)", + brown: "var(--t-tag-background-brown)", + orange: "var(--t-tag-background-orange)", + amber: "var(--t-tag-background-amber)", + yellow: "var(--t-tag-background-yellow)", + }, + }, + code: { + text: { + gray: "var(--t-code-text-gray)", + sky: "var(--t-code-text-sky)", + pink: "var(--t-code-text-pink)", + orange: "var(--t-code-text-orange)", + green: "var(--t-code-text-green)", + }, + font: { + family: "var(--t-code-font-family)", + }, + }, + IllustrationIcon: { + color: { + blue: "var(--t--illustration-icon-color-blue)", + gray: "var(--t--illustration-icon-color-gray)", + }, + fill: { + blue: "var(--t--illustration-icon-fill-blue)", + gray: "var(--t--illustration-icon-fill-gray)", + }, + }, + grayScale: { + gray1: "var(--t-gray-scale-gray1)", + gray2: "var(--t-gray-scale-gray2)", + gray3: "var(--t-gray-scale-gray3)", + gray4: "var(--t-gray-scale-gray4)", + gray5: "var(--t-gray-scale-gray5)", + gray6: "var(--t-gray-scale-gray6)", + gray7: "var(--t-gray-scale-gray7)", + gray8: "var(--t-gray-scale-gray8)", + gray9: "var(--t-gray-scale-gray9)", + gray10: "var(--t-gray-scale-gray10)", + gray11: "var(--t-gray-scale-gray11)", + gray12: "var(--t-gray-scale-gray12)", + }, + color: { + red: "var(--t-color-red)", + ruby: "var(--t-color-ruby)", + crimson: "var(--t-color-crimson)", + tomato: "var(--t-color-tomato)", + orange: "var(--t-color-orange)", + amber: "var(--t-color-amber)", + yellow: "var(--t-color-yellow)", + lime: "var(--t-color-lime)", + grass: "var(--t-color-grass)", + green: "var(--t-color-green)", + jade: "var(--t-color-jade)", + mint: "var(--t-color-mint)", + turquoise: "var(--t-color-turquoise)", + cyan: "var(--t-color-cyan)", + sky: "var(--t-color-sky)", + blue: "var(--t-color-blue)", + iris: "var(--t-color-iris)", + violet: "var(--t-color-violet)", + purple: "var(--t-color-purple)", + plum: "var(--t-color-plum)", + pink: "var(--t-color-pink)", + bronze: "var(--t-color-bronze)", + gold: "var(--t-color-gold)", + brown: "var(--t-color-brown)", + gray: "var(--t-color-gray)", + yellow1: "var(--t-color-yellow1)", + yellow2: "var(--t-color-yellow2)", + yellow3: "var(--t-color-yellow3)", + yellow4: "var(--t-color-yellow4)", + yellow5: "var(--t-color-yellow5)", + yellow6: "var(--t-color-yellow6)", + yellow7: "var(--t-color-yellow7)", + yellow8: "var(--t-color-yellow8)", + yellow9: "var(--t-color-yellow9)", + yellow10: "var(--t-color-yellow10)", + yellow11: "var(--t-color-yellow11)", + yellow12: "var(--t-color-yellow12)", + green1: "var(--t-color-green1)", + green2: "var(--t-color-green2)", + green3: "var(--t-color-green3)", + green4: "var(--t-color-green4)", + green5: "var(--t-color-green5)", + green6: "var(--t-color-green6)", + green7: "var(--t-color-green7)", + green8: "var(--t-color-green8)", + green9: "var(--t-color-green9)", + green10: "var(--t-color-green10)", + green11: "var(--t-color-green11)", + green12: "var(--t-color-green12)", + turquoise1: "var(--t-color-turquoise1)", + turquoise2: "var(--t-color-turquoise2)", + turquoise3: "var(--t-color-turquoise3)", + turquoise4: "var(--t-color-turquoise4)", + turquoise5: "var(--t-color-turquoise5)", + turquoise6: "var(--t-color-turquoise6)", + turquoise7: "var(--t-color-turquoise7)", + turquoise8: "var(--t-color-turquoise8)", + turquoise9: "var(--t-color-turquoise9)", + turquoise10: "var(--t-color-turquoise10)", + turquoise11: "var(--t-color-turquoise11)", + turquoise12: "var(--t-color-turquoise12)", + sky1: "var(--t-color-sky1)", + sky2: "var(--t-color-sky2)", + sky3: "var(--t-color-sky3)", + sky4: "var(--t-color-sky4)", + sky5: "var(--t-color-sky5)", + sky6: "var(--t-color-sky6)", + sky7: "var(--t-color-sky7)", + sky8: "var(--t-color-sky8)", + sky9: "var(--t-color-sky9)", + sky10: "var(--t-color-sky10)", + sky11: "var(--t-color-sky11)", + sky12: "var(--t-color-sky12)", + blue1: "var(--t-color-blue1)", + blue2: "var(--t-color-blue2)", + blue3: "var(--t-color-blue3)", + blue4: "var(--t-color-blue4)", + blue5: "var(--t-color-blue5)", + blue6: "var(--t-color-blue6)", + blue7: "var(--t-color-blue7)", + blue8: "var(--t-color-blue8)", + blue9: "var(--t-color-blue9)", + blue10: "var(--t-color-blue10)", + blue11: "var(--t-color-blue11)", + blue12: "var(--t-color-blue12)", + purple1: "var(--t-color-purple1)", + purple2: "var(--t-color-purple2)", + purple3: "var(--t-color-purple3)", + purple4: "var(--t-color-purple4)", + purple5: "var(--t-color-purple5)", + purple6: "var(--t-color-purple6)", + purple7: "var(--t-color-purple7)", + purple8: "var(--t-color-purple8)", + purple9: "var(--t-color-purple9)", + purple10: "var(--t-color-purple10)", + purple11: "var(--t-color-purple11)", + purple12: "var(--t-color-purple12)", + pink1: "var(--t-color-pink1)", + pink2: "var(--t-color-pink2)", + pink3: "var(--t-color-pink3)", + pink4: "var(--t-color-pink4)", + pink5: "var(--t-color-pink5)", + pink6: "var(--t-color-pink6)", + pink7: "var(--t-color-pink7)", + pink8: "var(--t-color-pink8)", + pink9: "var(--t-color-pink9)", + pink10: "var(--t-color-pink10)", + pink11: "var(--t-color-pink11)", + pink12: "var(--t-color-pink12)", + red1: "var(--t-color-red1)", + red2: "var(--t-color-red2)", + red3: "var(--t-color-red3)", + red4: "var(--t-color-red4)", + red5: "var(--t-color-red5)", + red6: "var(--t-color-red6)", + red7: "var(--t-color-red7)", + red8: "var(--t-color-red8)", + red9: "var(--t-color-red9)", + red10: "var(--t-color-red10)", + red11: "var(--t-color-red11)", + red12: "var(--t-color-red12)", + orange1: "var(--t-color-orange1)", + orange2: "var(--t-color-orange2)", + orange3: "var(--t-color-orange3)", + orange4: "var(--t-color-orange4)", + orange5: "var(--t-color-orange5)", + orange6: "var(--t-color-orange6)", + orange7: "var(--t-color-orange7)", + orange8: "var(--t-color-orange8)", + orange9: "var(--t-color-orange9)", + orange10: "var(--t-color-orange10)", + orange11: "var(--t-color-orange11)", + orange12: "var(--t-color-orange12)", + gray1: "var(--t-color-gray1)", + gray2: "var(--t-color-gray2)", + gray3: "var(--t-color-gray3)", + gray4: "var(--t-color-gray4)", + gray5: "var(--t-color-gray5)", + gray6: "var(--t-color-gray6)", + gray7: "var(--t-color-gray7)", + gray8: "var(--t-color-gray8)", + gray9: "var(--t-color-gray9)", + gray10: "var(--t-color-gray10)", + gray11: "var(--t-color-gray11)", + gray12: "var(--t-color-gray12)", + mauve1: "var(--t-color-mauve1)", + mauve2: "var(--t-color-mauve2)", + mauve3: "var(--t-color-mauve3)", + mauve4: "var(--t-color-mauve4)", + mauve5: "var(--t-color-mauve5)", + mauve6: "var(--t-color-mauve6)", + mauve7: "var(--t-color-mauve7)", + mauve8: "var(--t-color-mauve8)", + mauve9: "var(--t-color-mauve9)", + mauve10: "var(--t-color-mauve10)", + mauve11: "var(--t-color-mauve11)", + mauve12: "var(--t-color-mauve12)", + slate1: "var(--t-color-slate1)", + slate2: "var(--t-color-slate2)", + slate3: "var(--t-color-slate3)", + slate4: "var(--t-color-slate4)", + slate5: "var(--t-color-slate5)", + slate6: "var(--t-color-slate6)", + slate7: "var(--t-color-slate7)", + slate8: "var(--t-color-slate8)", + slate9: "var(--t-color-slate9)", + slate10: "var(--t-color-slate10)", + slate11: "var(--t-color-slate11)", + slate12: "var(--t-color-slate12)", + sage1: "var(--t-color-sage1)", + sage2: "var(--t-color-sage2)", + sage3: "var(--t-color-sage3)", + sage4: "var(--t-color-sage4)", + sage5: "var(--t-color-sage5)", + sage6: "var(--t-color-sage6)", + sage7: "var(--t-color-sage7)", + sage8: "var(--t-color-sage8)", + sage9: "var(--t-color-sage9)", + sage10: "var(--t-color-sage10)", + sage11: "var(--t-color-sage11)", + sage12: "var(--t-color-sage12)", + olive1: "var(--t-color-olive1)", + olive2: "var(--t-color-olive2)", + olive3: "var(--t-color-olive3)", + olive4: "var(--t-color-olive4)", + olive5: "var(--t-color-olive5)", + olive6: "var(--t-color-olive6)", + olive7: "var(--t-color-olive7)", + olive8: "var(--t-color-olive8)", + olive9: "var(--t-color-olive9)", + olive10: "var(--t-color-olive10)", + olive11: "var(--t-color-olive11)", + olive12: "var(--t-color-olive12)", + sand1: "var(--t-color-sand1)", + sand2: "var(--t-color-sand2)", + sand3: "var(--t-color-sand3)", + sand4: "var(--t-color-sand4)", + sand5: "var(--t-color-sand5)", + sand6: "var(--t-color-sand6)", + sand7: "var(--t-color-sand7)", + sand8: "var(--t-color-sand8)", + sand9: "var(--t-color-sand9)", + sand10: "var(--t-color-sand10)", + sand11: "var(--t-color-sand11)", + sand12: "var(--t-color-sand12)", + tomato1: "var(--t-color-tomato1)", + tomato2: "var(--t-color-tomato2)", + tomato3: "var(--t-color-tomato3)", + tomato4: "var(--t-color-tomato4)", + tomato5: "var(--t-color-tomato5)", + tomato6: "var(--t-color-tomato6)", + tomato7: "var(--t-color-tomato7)", + tomato8: "var(--t-color-tomato8)", + tomato9: "var(--t-color-tomato9)", + tomato10: "var(--t-color-tomato10)", + tomato11: "var(--t-color-tomato11)", + tomato12: "var(--t-color-tomato12)", + ruby1: "var(--t-color-ruby1)", + ruby2: "var(--t-color-ruby2)", + ruby3: "var(--t-color-ruby3)", + ruby4: "var(--t-color-ruby4)", + ruby5: "var(--t-color-ruby5)", + ruby6: "var(--t-color-ruby6)", + ruby7: "var(--t-color-ruby7)", + ruby8: "var(--t-color-ruby8)", + ruby9: "var(--t-color-ruby9)", + ruby10: "var(--t-color-ruby10)", + ruby11: "var(--t-color-ruby11)", + ruby12: "var(--t-color-ruby12)", + crimson1: "var(--t-color-crimson1)", + crimson2: "var(--t-color-crimson2)", + crimson3: "var(--t-color-crimson3)", + crimson4: "var(--t-color-crimson4)", + crimson5: "var(--t-color-crimson5)", + crimson6: "var(--t-color-crimson6)", + crimson7: "var(--t-color-crimson7)", + crimson8: "var(--t-color-crimson8)", + crimson9: "var(--t-color-crimson9)", + crimson10: "var(--t-color-crimson10)", + crimson11: "var(--t-color-crimson11)", + crimson12: "var(--t-color-crimson12)", + plum1: "var(--t-color-plum1)", + plum2: "var(--t-color-plum2)", + plum3: "var(--t-color-plum3)", + plum4: "var(--t-color-plum4)", + plum5: "var(--t-color-plum5)", + plum6: "var(--t-color-plum6)", + plum7: "var(--t-color-plum7)", + plum8: "var(--t-color-plum8)", + plum9: "var(--t-color-plum9)", + plum10: "var(--t-color-plum10)", + plum11: "var(--t-color-plum11)", + plum12: "var(--t-color-plum12)", + violet1: "var(--t-color-violet1)", + violet2: "var(--t-color-violet2)", + violet3: "var(--t-color-violet3)", + violet4: "var(--t-color-violet4)", + violet5: "var(--t-color-violet5)", + violet6: "var(--t-color-violet6)", + violet7: "var(--t-color-violet7)", + violet8: "var(--t-color-violet8)", + violet9: "var(--t-color-violet9)", + violet10: "var(--t-color-violet10)", + violet11: "var(--t-color-violet11)", + violet12: "var(--t-color-violet12)", + iris1: "var(--t-color-iris1)", + iris2: "var(--t-color-iris2)", + iris3: "var(--t-color-iris3)", + iris4: "var(--t-color-iris4)", + iris5: "var(--t-color-iris5)", + iris6: "var(--t-color-iris6)", + iris7: "var(--t-color-iris7)", + iris8: "var(--t-color-iris8)", + iris9: "var(--t-color-iris9)", + iris10: "var(--t-color-iris10)", + iris11: "var(--t-color-iris11)", + iris12: "var(--t-color-iris12)", + cyan1: "var(--t-color-cyan1)", + cyan2: "var(--t-color-cyan2)", + cyan3: "var(--t-color-cyan3)", + cyan4: "var(--t-color-cyan4)", + cyan5: "var(--t-color-cyan5)", + cyan6: "var(--t-color-cyan6)", + cyan7: "var(--t-color-cyan7)", + cyan8: "var(--t-color-cyan8)", + cyan9: "var(--t-color-cyan9)", + cyan10: "var(--t-color-cyan10)", + cyan11: "var(--t-color-cyan11)", + cyan12: "var(--t-color-cyan12)", + jade1: "var(--t-color-jade1)", + jade2: "var(--t-color-jade2)", + jade3: "var(--t-color-jade3)", + jade4: "var(--t-color-jade4)", + jade5: "var(--t-color-jade5)", + jade6: "var(--t-color-jade6)", + jade7: "var(--t-color-jade7)", + jade8: "var(--t-color-jade8)", + jade9: "var(--t-color-jade9)", + jade10: "var(--t-color-jade10)", + jade11: "var(--t-color-jade11)", + jade12: "var(--t-color-jade12)", + grass1: "var(--t-color-grass1)", + grass2: "var(--t-color-grass2)", + grass3: "var(--t-color-grass3)", + grass4: "var(--t-color-grass4)", + grass5: "var(--t-color-grass5)", + grass6: "var(--t-color-grass6)", + grass7: "var(--t-color-grass7)", + grass8: "var(--t-color-grass8)", + grass9: "var(--t-color-grass9)", + grass10: "var(--t-color-grass10)", + grass11: "var(--t-color-grass11)", + grass12: "var(--t-color-grass12)", + mint1: "var(--t-color-mint1)", + mint2: "var(--t-color-mint2)", + mint3: "var(--t-color-mint3)", + mint4: "var(--t-color-mint4)", + mint5: "var(--t-color-mint5)", + mint6: "var(--t-color-mint6)", + mint7: "var(--t-color-mint7)", + mint8: "var(--t-color-mint8)", + mint9: "var(--t-color-mint9)", + mint10: "var(--t-color-mint10)", + mint11: "var(--t-color-mint11)", + mint12: "var(--t-color-mint12)", + lime1: "var(--t-color-lime1)", + lime2: "var(--t-color-lime2)", + lime3: "var(--t-color-lime3)", + lime4: "var(--t-color-lime4)", + lime5: "var(--t-color-lime5)", + lime6: "var(--t-color-lime6)", + lime7: "var(--t-color-lime7)", + lime8: "var(--t-color-lime8)", + lime9: "var(--t-color-lime9)", + lime10: "var(--t-color-lime10)", + lime11: "var(--t-color-lime11)", + lime12: "var(--t-color-lime12)", + bronze1: "var(--t-color-bronze1)", + bronze2: "var(--t-color-bronze2)", + bronze3: "var(--t-color-bronze3)", + bronze4: "var(--t-color-bronze4)", + bronze5: "var(--t-color-bronze5)", + bronze6: "var(--t-color-bronze6)", + bronze7: "var(--t-color-bronze7)", + bronze8: "var(--t-color-bronze8)", + bronze9: "var(--t-color-bronze9)", + bronze10: "var(--t-color-bronze10)", + bronze11: "var(--t-color-bronze11)", + bronze12: "var(--t-color-bronze12)", + gold1: "var(--t-color-gold1)", + gold2: "var(--t-color-gold2)", + gold3: "var(--t-color-gold3)", + gold4: "var(--t-color-gold4)", + gold5: "var(--t-color-gold5)", + gold6: "var(--t-color-gold6)", + gold7: "var(--t-color-gold7)", + gold8: "var(--t-color-gold8)", + gold9: "var(--t-color-gold9)", + gold10: "var(--t-color-gold10)", + gold11: "var(--t-color-gold11)", + gold12: "var(--t-color-gold12)", + brown1: "var(--t-color-brown1)", + brown2: "var(--t-color-brown2)", + brown3: "var(--t-color-brown3)", + brown4: "var(--t-color-brown4)", + brown5: "var(--t-color-brown5)", + brown6: "var(--t-color-brown6)", + brown7: "var(--t-color-brown7)", + brown8: "var(--t-color-brown8)", + brown9: "var(--t-color-brown9)", + brown10: "var(--t-color-brown10)", + brown11: "var(--t-color-brown11)", + brown12: "var(--t-color-brown12)", + amber1: "var(--t-color-amber1)", + amber2: "var(--t-color-amber2)", + amber3: "var(--t-color-amber3)", + amber4: "var(--t-color-amber4)", + amber5: "var(--t-color-amber5)", + amber6: "var(--t-color-amber6)", + amber7: "var(--t-color-amber7)", + amber8: "var(--t-color-amber8)", + amber9: "var(--t-color-amber9)", + amber10: "var(--t-color-amber10)", + amber11: "var(--t-color-amber11)", + amber12: "var(--t-color-amber12)", + transparent: { + green1: "var(--t-color-transparent-green1)", + green2: "var(--t-color-transparent-green2)", + green3: "var(--t-color-transparent-green3)", + green4: "var(--t-color-transparent-green4)", + green5: "var(--t-color-transparent-green5)", + green6: "var(--t-color-transparent-green6)", + green7: "var(--t-color-transparent-green7)", + green8: "var(--t-color-transparent-green8)", + green9: "var(--t-color-transparent-green9)", + green10: "var(--t-color-transparent-green10)", + green11: "var(--t-color-transparent-green11)", + green12: "var(--t-color-transparent-green12)", + turquoise1: "var(--t-color-transparent-turquoise1)", + turquoise2: "var(--t-color-transparent-turquoise2)", + turquoise3: "var(--t-color-transparent-turquoise3)", + turquoise4: "var(--t-color-transparent-turquoise4)", + turquoise5: "var(--t-color-transparent-turquoise5)", + turquoise6: "var(--t-color-transparent-turquoise6)", + turquoise7: "var(--t-color-transparent-turquoise7)", + turquoise8: "var(--t-color-transparent-turquoise8)", + turquoise9: "var(--t-color-transparent-turquoise9)", + turquoise10: "var(--t-color-transparent-turquoise10)", + turquoise11: "var(--t-color-transparent-turquoise11)", + turquoise12: "var(--t-color-transparent-turquoise12)", + sky1: "var(--t-color-transparent-sky1)", + sky2: "var(--t-color-transparent-sky2)", + sky3: "var(--t-color-transparent-sky3)", + sky4: "var(--t-color-transparent-sky4)", + sky5: "var(--t-color-transparent-sky5)", + sky6: "var(--t-color-transparent-sky6)", + sky7: "var(--t-color-transparent-sky7)", + sky8: "var(--t-color-transparent-sky8)", + sky9: "var(--t-color-transparent-sky9)", + sky10: "var(--t-color-transparent-sky10)", + sky11: "var(--t-color-transparent-sky11)", + sky12: "var(--t-color-transparent-sky12)", + blue1: "var(--t-color-transparent-blue1)", + blue2: "var(--t-color-transparent-blue2)", + blue3: "var(--t-color-transparent-blue3)", + blue4: "var(--t-color-transparent-blue4)", + blue5: "var(--t-color-transparent-blue5)", + blue6: "var(--t-color-transparent-blue6)", + blue7: "var(--t-color-transparent-blue7)", + blue8: "var(--t-color-transparent-blue8)", + blue9: "var(--t-color-transparent-blue9)", + blue10: "var(--t-color-transparent-blue10)", + blue11: "var(--t-color-transparent-blue11)", + blue12: "var(--t-color-transparent-blue12)", + purple1: "var(--t-color-transparent-purple1)", + purple2: "var(--t-color-transparent-purple2)", + purple3: "var(--t-color-transparent-purple3)", + purple4: "var(--t-color-transparent-purple4)", + purple5: "var(--t-color-transparent-purple5)", + purple6: "var(--t-color-transparent-purple6)", + purple7: "var(--t-color-transparent-purple7)", + purple8: "var(--t-color-transparent-purple8)", + purple9: "var(--t-color-transparent-purple9)", + purple10: "var(--t-color-transparent-purple10)", + purple11: "var(--t-color-transparent-purple11)", + purple12: "var(--t-color-transparent-purple12)", + pink1: "var(--t-color-transparent-pink1)", + pink2: "var(--t-color-transparent-pink2)", + pink3: "var(--t-color-transparent-pink3)", + pink4: "var(--t-color-transparent-pink4)", + pink5: "var(--t-color-transparent-pink5)", + pink6: "var(--t-color-transparent-pink6)", + pink7: "var(--t-color-transparent-pink7)", + pink8: "var(--t-color-transparent-pink8)", + pink9: "var(--t-color-transparent-pink9)", + pink10: "var(--t-color-transparent-pink10)", + pink11: "var(--t-color-transparent-pink11)", + pink12: "var(--t-color-transparent-pink12)", + red1: "var(--t-color-transparent-red1)", + red2: "var(--t-color-transparent-red2)", + red3: "var(--t-color-transparent-red3)", + red4: "var(--t-color-transparent-red4)", + red5: "var(--t-color-transparent-red5)", + red6: "var(--t-color-transparent-red6)", + red7: "var(--t-color-transparent-red7)", + red8: "var(--t-color-transparent-red8)", + red9: "var(--t-color-transparent-red9)", + red10: "var(--t-color-transparent-red10)", + red11: "var(--t-color-transparent-red11)", + red12: "var(--t-color-transparent-red12)", + orange1: "var(--t-color-transparent-orange1)", + orange2: "var(--t-color-transparent-orange2)", + orange3: "var(--t-color-transparent-orange3)", + orange4: "var(--t-color-transparent-orange4)", + orange5: "var(--t-color-transparent-orange5)", + orange6: "var(--t-color-transparent-orange6)", + orange7: "var(--t-color-transparent-orange7)", + orange8: "var(--t-color-transparent-orange8)", + orange9: "var(--t-color-transparent-orange9)", + orange10: "var(--t-color-transparent-orange10)", + orange11: "var(--t-color-transparent-orange11)", + orange12: "var(--t-color-transparent-orange12)", + yellow1: "var(--t-color-transparent-yellow1)", + yellow2: "var(--t-color-transparent-yellow2)", + yellow3: "var(--t-color-transparent-yellow3)", + yellow4: "var(--t-color-transparent-yellow4)", + yellow5: "var(--t-color-transparent-yellow5)", + yellow6: "var(--t-color-transparent-yellow6)", + yellow7: "var(--t-color-transparent-yellow7)", + yellow8: "var(--t-color-transparent-yellow8)", + yellow9: "var(--t-color-transparent-yellow9)", + yellow10: "var(--t-color-transparent-yellow10)", + yellow11: "var(--t-color-transparent-yellow11)", + yellow12: "var(--t-color-transparent-yellow12)", + gray1: "var(--t-color-transparent-gray1)", + gray2: "var(--t-color-transparent-gray2)", + gray3: "var(--t-color-transparent-gray3)", + gray4: "var(--t-color-transparent-gray4)", + gray5: "var(--t-color-transparent-gray5)", + gray6: "var(--t-color-transparent-gray6)", + gray7: "var(--t-color-transparent-gray7)", + gray8: "var(--t-color-transparent-gray8)", + gray9: "var(--t-color-transparent-gray9)", + gray10: "var(--t-color-transparent-gray10)", + gray11: "var(--t-color-transparent-gray11)", + gray12: "var(--t-color-transparent-gray12)", + mauve1: "var(--t-color-transparent-mauve1)", + mauve2: "var(--t-color-transparent-mauve2)", + mauve3: "var(--t-color-transparent-mauve3)", + mauve4: "var(--t-color-transparent-mauve4)", + mauve5: "var(--t-color-transparent-mauve5)", + mauve6: "var(--t-color-transparent-mauve6)", + mauve7: "var(--t-color-transparent-mauve7)", + mauve8: "var(--t-color-transparent-mauve8)", + mauve9: "var(--t-color-transparent-mauve9)", + mauve10: "var(--t-color-transparent-mauve10)", + mauve11: "var(--t-color-transparent-mauve11)", + mauve12: "var(--t-color-transparent-mauve12)", + slate1: "var(--t-color-transparent-slate1)", + slate2: "var(--t-color-transparent-slate2)", + slate3: "var(--t-color-transparent-slate3)", + slate4: "var(--t-color-transparent-slate4)", + slate5: "var(--t-color-transparent-slate5)", + slate6: "var(--t-color-transparent-slate6)", + slate7: "var(--t-color-transparent-slate7)", + slate8: "var(--t-color-transparent-slate8)", + slate9: "var(--t-color-transparent-slate9)", + slate10: "var(--t-color-transparent-slate10)", + slate11: "var(--t-color-transparent-slate11)", + slate12: "var(--t-color-transparent-slate12)", + sage1: "var(--t-color-transparent-sage1)", + sage2: "var(--t-color-transparent-sage2)", + sage3: "var(--t-color-transparent-sage3)", + sage4: "var(--t-color-transparent-sage4)", + sage5: "var(--t-color-transparent-sage5)", + sage6: "var(--t-color-transparent-sage6)", + sage7: "var(--t-color-transparent-sage7)", + sage8: "var(--t-color-transparent-sage8)", + sage9: "var(--t-color-transparent-sage9)", + sage10: "var(--t-color-transparent-sage10)", + sage11: "var(--t-color-transparent-sage11)", + sage12: "var(--t-color-transparent-sage12)", + olive1: "var(--t-color-transparent-olive1)", + olive2: "var(--t-color-transparent-olive2)", + olive3: "var(--t-color-transparent-olive3)", + olive4: "var(--t-color-transparent-olive4)", + olive5: "var(--t-color-transparent-olive5)", + olive6: "var(--t-color-transparent-olive6)", + olive7: "var(--t-color-transparent-olive7)", + olive8: "var(--t-color-transparent-olive8)", + olive9: "var(--t-color-transparent-olive9)", + olive10: "var(--t-color-transparent-olive10)", + olive11: "var(--t-color-transparent-olive11)", + olive12: "var(--t-color-transparent-olive12)", + sand1: "var(--t-color-transparent-sand1)", + sand2: "var(--t-color-transparent-sand2)", + sand3: "var(--t-color-transparent-sand3)", + sand4: "var(--t-color-transparent-sand4)", + sand5: "var(--t-color-transparent-sand5)", + sand6: "var(--t-color-transparent-sand6)", + sand7: "var(--t-color-transparent-sand7)", + sand8: "var(--t-color-transparent-sand8)", + sand9: "var(--t-color-transparent-sand9)", + sand10: "var(--t-color-transparent-sand10)", + sand11: "var(--t-color-transparent-sand11)", + sand12: "var(--t-color-transparent-sand12)", + tomato1: "var(--t-color-transparent-tomato1)", + tomato2: "var(--t-color-transparent-tomato2)", + tomato3: "var(--t-color-transparent-tomato3)", + tomato4: "var(--t-color-transparent-tomato4)", + tomato5: "var(--t-color-transparent-tomato5)", + tomato6: "var(--t-color-transparent-tomato6)", + tomato7: "var(--t-color-transparent-tomato7)", + tomato8: "var(--t-color-transparent-tomato8)", + tomato9: "var(--t-color-transparent-tomato9)", + tomato10: "var(--t-color-transparent-tomato10)", + tomato11: "var(--t-color-transparent-tomato11)", + tomato12: "var(--t-color-transparent-tomato12)", + ruby1: "var(--t-color-transparent-ruby1)", + ruby2: "var(--t-color-transparent-ruby2)", + ruby3: "var(--t-color-transparent-ruby3)", + ruby4: "var(--t-color-transparent-ruby4)", + ruby5: "var(--t-color-transparent-ruby5)", + ruby6: "var(--t-color-transparent-ruby6)", + ruby7: "var(--t-color-transparent-ruby7)", + ruby8: "var(--t-color-transparent-ruby8)", + ruby9: "var(--t-color-transparent-ruby9)", + ruby10: "var(--t-color-transparent-ruby10)", + ruby11: "var(--t-color-transparent-ruby11)", + ruby12: "var(--t-color-transparent-ruby12)", + crimson1: "var(--t-color-transparent-crimson1)", + crimson2: "var(--t-color-transparent-crimson2)", + crimson3: "var(--t-color-transparent-crimson3)", + crimson4: "var(--t-color-transparent-crimson4)", + crimson5: "var(--t-color-transparent-crimson5)", + crimson6: "var(--t-color-transparent-crimson6)", + crimson7: "var(--t-color-transparent-crimson7)", + crimson8: "var(--t-color-transparent-crimson8)", + crimson9: "var(--t-color-transparent-crimson9)", + crimson10: "var(--t-color-transparent-crimson10)", + crimson11: "var(--t-color-transparent-crimson11)", + crimson12: "var(--t-color-transparent-crimson12)", + plum1: "var(--t-color-transparent-plum1)", + plum2: "var(--t-color-transparent-plum2)", + plum3: "var(--t-color-transparent-plum3)", + plum4: "var(--t-color-transparent-plum4)", + plum5: "var(--t-color-transparent-plum5)", + plum6: "var(--t-color-transparent-plum6)", + plum7: "var(--t-color-transparent-plum7)", + plum8: "var(--t-color-transparent-plum8)", + plum9: "var(--t-color-transparent-plum9)", + plum10: "var(--t-color-transparent-plum10)", + plum11: "var(--t-color-transparent-plum11)", + plum12: "var(--t-color-transparent-plum12)", + violet1: "var(--t-color-transparent-violet1)", + violet2: "var(--t-color-transparent-violet2)", + violet3: "var(--t-color-transparent-violet3)", + violet4: "var(--t-color-transparent-violet4)", + violet5: "var(--t-color-transparent-violet5)", + violet6: "var(--t-color-transparent-violet6)", + violet7: "var(--t-color-transparent-violet7)", + violet8: "var(--t-color-transparent-violet8)", + violet9: "var(--t-color-transparent-violet9)", + violet10: "var(--t-color-transparent-violet10)", + violet11: "var(--t-color-transparent-violet11)", + violet12: "var(--t-color-transparent-violet12)", + iris1: "var(--t-color-transparent-iris1)", + iris2: "var(--t-color-transparent-iris2)", + iris3: "var(--t-color-transparent-iris3)", + iris4: "var(--t-color-transparent-iris4)", + iris5: "var(--t-color-transparent-iris5)", + iris6: "var(--t-color-transparent-iris6)", + iris7: "var(--t-color-transparent-iris7)", + iris8: "var(--t-color-transparent-iris8)", + iris9: "var(--t-color-transparent-iris9)", + iris10: "var(--t-color-transparent-iris10)", + iris11: "var(--t-color-transparent-iris11)", + iris12: "var(--t-color-transparent-iris12)", + cyan1: "var(--t-color-transparent-cyan1)", + cyan2: "var(--t-color-transparent-cyan2)", + cyan3: "var(--t-color-transparent-cyan3)", + cyan4: "var(--t-color-transparent-cyan4)", + cyan5: "var(--t-color-transparent-cyan5)", + cyan6: "var(--t-color-transparent-cyan6)", + cyan7: "var(--t-color-transparent-cyan7)", + cyan8: "var(--t-color-transparent-cyan8)", + cyan9: "var(--t-color-transparent-cyan9)", + cyan10: "var(--t-color-transparent-cyan10)", + cyan11: "var(--t-color-transparent-cyan11)", + cyan12: "var(--t-color-transparent-cyan12)", + jade1: "var(--t-color-transparent-jade1)", + jade2: "var(--t-color-transparent-jade2)", + jade3: "var(--t-color-transparent-jade3)", + jade4: "var(--t-color-transparent-jade4)", + jade5: "var(--t-color-transparent-jade5)", + jade6: "var(--t-color-transparent-jade6)", + jade7: "var(--t-color-transparent-jade7)", + jade8: "var(--t-color-transparent-jade8)", + jade9: "var(--t-color-transparent-jade9)", + jade10: "var(--t-color-transparent-jade10)", + jade11: "var(--t-color-transparent-jade11)", + jade12: "var(--t-color-transparent-jade12)", + grass1: "var(--t-color-transparent-grass1)", + grass2: "var(--t-color-transparent-grass2)", + grass3: "var(--t-color-transparent-grass3)", + grass4: "var(--t-color-transparent-grass4)", + grass5: "var(--t-color-transparent-grass5)", + grass6: "var(--t-color-transparent-grass6)", + grass7: "var(--t-color-transparent-grass7)", + grass8: "var(--t-color-transparent-grass8)", + grass9: "var(--t-color-transparent-grass9)", + grass10: "var(--t-color-transparent-grass10)", + grass11: "var(--t-color-transparent-grass11)", + grass12: "var(--t-color-transparent-grass12)", + mint1: "var(--t-color-transparent-mint1)", + mint2: "var(--t-color-transparent-mint2)", + mint3: "var(--t-color-transparent-mint3)", + mint4: "var(--t-color-transparent-mint4)", + mint5: "var(--t-color-transparent-mint5)", + mint6: "var(--t-color-transparent-mint6)", + mint7: "var(--t-color-transparent-mint7)", + mint8: "var(--t-color-transparent-mint8)", + mint9: "var(--t-color-transparent-mint9)", + mint10: "var(--t-color-transparent-mint10)", + mint11: "var(--t-color-transparent-mint11)", + mint12: "var(--t-color-transparent-mint12)", + lime1: "var(--t-color-transparent-lime1)", + lime2: "var(--t-color-transparent-lime2)", + lime3: "var(--t-color-transparent-lime3)", + lime4: "var(--t-color-transparent-lime4)", + lime5: "var(--t-color-transparent-lime5)", + lime6: "var(--t-color-transparent-lime6)", + lime7: "var(--t-color-transparent-lime7)", + lime8: "var(--t-color-transparent-lime8)", + lime9: "var(--t-color-transparent-lime9)", + lime10: "var(--t-color-transparent-lime10)", + lime11: "var(--t-color-transparent-lime11)", + lime12: "var(--t-color-transparent-lime12)", + bronze1: "var(--t-color-transparent-bronze1)", + bronze2: "var(--t-color-transparent-bronze2)", + bronze3: "var(--t-color-transparent-bronze3)", + bronze4: "var(--t-color-transparent-bronze4)", + bronze5: "var(--t-color-transparent-bronze5)", + bronze6: "var(--t-color-transparent-bronze6)", + bronze7: "var(--t-color-transparent-bronze7)", + bronze8: "var(--t-color-transparent-bronze8)", + bronze9: "var(--t-color-transparent-bronze9)", + bronze10: "var(--t-color-transparent-bronze10)", + bronze11: "var(--t-color-transparent-bronze11)", + bronze12: "var(--t-color-transparent-bronze12)", + gold1: "var(--t-color-transparent-gold1)", + gold2: "var(--t-color-transparent-gold2)", + gold3: "var(--t-color-transparent-gold3)", + gold4: "var(--t-color-transparent-gold4)", + gold5: "var(--t-color-transparent-gold5)", + gold6: "var(--t-color-transparent-gold6)", + gold7: "var(--t-color-transparent-gold7)", + gold8: "var(--t-color-transparent-gold8)", + gold9: "var(--t-color-transparent-gold9)", + gold10: "var(--t-color-transparent-gold10)", + gold11: "var(--t-color-transparent-gold11)", + gold12: "var(--t-color-transparent-gold12)", + brown1: "var(--t-color-transparent-brown1)", + brown2: "var(--t-color-transparent-brown2)", + brown3: "var(--t-color-transparent-brown3)", + brown4: "var(--t-color-transparent-brown4)", + brown5: "var(--t-color-transparent-brown5)", + brown6: "var(--t-color-transparent-brown6)", + brown7: "var(--t-color-transparent-brown7)", + brown8: "var(--t-color-transparent-brown8)", + brown9: "var(--t-color-transparent-brown9)", + brown10: "var(--t-color-transparent-brown10)", + brown11: "var(--t-color-transparent-brown11)", + brown12: "var(--t-color-transparent-brown12)", + amber1: "var(--t-color-transparent-amber1)", + amber2: "var(--t-color-transparent-amber2)", + amber3: "var(--t-color-transparent-amber3)", + amber4: "var(--t-color-transparent-amber4)", + amber5: "var(--t-color-transparent-amber5)", + amber6: "var(--t-color-transparent-amber6)", + amber7: "var(--t-color-transparent-amber7)", + amber8: "var(--t-color-transparent-amber8)", + amber9: "var(--t-color-transparent-amber9)", + amber10: "var(--t-color-transparent-amber10)", + amber11: "var(--t-color-transparent-amber11)", + amber12: "var(--t-color-transparent-amber12)", + }, + }, +} as DeepCSSVariableRefs; diff --git a/packages/twenty-ui/src/theme-constants/generated/themeDarkCssVariableEntries.ts b/packages/twenty-ui/src/theme-constants/generated/themeDarkCssVariableEntries.ts new file mode 100644 index 0000000000..e6b5db38b8 --- /dev/null +++ b/packages/twenty-ui/src/theme-constants/generated/themeDarkCssVariableEntries.ts @@ -0,0 +1,996 @@ +// Auto-generated by scripts/generateThemeConstants.ts — do not edit manually. +// Regenerate: npx tsx packages/twenty-ui/scripts/generateThemeConstants.ts + +export const THEME_DARK_CSS_VARIABLE_ENTRIES: [string, string][] = [ + ["--t-icon-size-sm", "14"], + ["--t-icon-size-md", "16"], + ["--t-icon-size-lg", "20"], + ["--t-icon-size-xl", "24"], + ["--t-icon-stroke-sm", "1.6"], + ["--t-icon-stroke-md", "2"], + ["--t-icon-stroke-lg", "2.5"], + ["--t-modal-size-sm-width", "300px"], + ["--t-modal-size-md-width", "400px"], + ["--t-modal-size-lg-width", "53%"], + ["--t-modal-size-xl-width", "1200px"], + ["--t-modal-size-xl-height", "800px"], + ["--t-modal-size-fullscreen-width", "100dvw"], + ["--t-modal-size-fullscreen-height", "100dvh"], + ["--t-text-line-height-lg", "1.5"], + ["--t-text-line-height-md", "1.1"], + ["--t-text-icon-size-medium", "16"], + ["--t-text-icon-size-small", "14"], + ["--t-text-icon-strike-light", "1.6"], + ["--t-text-icon-strike-medium", "2"], + ["--t-text-icon-strike-bold", "2.5"], + ["--t-animation-duration-instant", "0.075"], + ["--t-animation-duration-fast", "0.15"], + ["--t-animation-duration-normal", "0.3"], + ["--t-animation-duration-slow", "1.5"], + ["--t-spacing-multiplicator", "4"], + ["--t-spacing-0", "0px"], + ["--t-spacing-1", "4px"], + ["--t-spacing-2", "8px"], + ["--t-spacing-3", "12px"], + ["--t-spacing-4", "16px"], + ["--t-spacing-5", "20px"], + ["--t-spacing-6", "24px"], + ["--t-spacing-7", "28px"], + ["--t-spacing-8", "32px"], + ["--t-spacing-9", "36px"], + ["--t-spacing-10", "40px"], + ["--t-spacing-11", "44px"], + ["--t-spacing-12", "48px"], + ["--t-spacing-13", "52px"], + ["--t-spacing-14", "56px"], + ["--t-spacing-15", "60px"], + ["--t-spacing-16", "64px"], + ["--t-spacing-17", "68px"], + ["--t-spacing-18", "72px"], + ["--t-spacing-19", "76px"], + ["--t-spacing-20", "80px"], + ["--t-spacing-21", "84px"], + ["--t-spacing-22", "88px"], + ["--t-spacing-23", "92px"], + ["--t-spacing-24", "96px"], + ["--t-spacing-25", "100px"], + ["--t-spacing-26", "104px"], + ["--t-spacing-27", "108px"], + ["--t-spacing-28", "112px"], + ["--t-spacing-29", "116px"], + ["--t-spacing-30", "120px"], + ["--t-spacing-31", "124px"], + ["--t-spacing-32", "128px"], + ["--t-spacing-0_5", "2px"], + ["--t-spacing-1_5", "6px"], + ["--t-between-siblings-gap", "2px"], + ["--t-table-horizontal-cell-margin", "8px"], + ["--t-table-checkbox-column-width", "32px"], + ["--t-table-horizontal-cell-padding", "8px"], + ["--t-right-drawer-width", "500px"], + ["--t-clickable-element-background-transition", "background 0.1s ease"], + ["--t-last-layer-z-index", "2147483647"], + ["--t-buttons-secondary-text-color", "color(display-p3 0.63 0.69 1)"], + ["--t-accent-primary", "color(display-p3 0.163 0.22 0.439)"], + ["--t-accent-secondary", "color(display-p3 0.163 0.22 0.439)"], + ["--t-accent-tertiary", "color(display-p3 0.105 0.141 0.275)"], + ["--t-accent-quaternary", "color(display-p3 0.081 0.089 0.144)"], + ["--t-accent-accent3570", "color(display-p3 0.285 0.362 0.674)"], + ["--t-accent-accent4060", "color(display-p3 0.285 0.362 0.674)"], + ["--t-accent-accent1", "color(display-p3 0.068 0.074 0.118)"], + ["--t-accent-accent2", "color(display-p3 0.081 0.089 0.144)"], + ["--t-accent-accent3", "color(display-p3 0.105 0.141 0.275)"], + ["--t-accent-accent4", "color(display-p3 0.129 0.18 0.369)"], + ["--t-accent-accent5", "color(display-p3 0.163 0.22 0.439)"], + ["--t-accent-accent6", "color(display-p3 0.203 0.262 0.5)"], + ["--t-accent-accent7", "color(display-p3 0.245 0.309 0.575)"], + ["--t-accent-accent8", "color(display-p3 0.285 0.362 0.674)"], + ["--t-accent-accent9", "color(display-p3 0.276 0.384 0.837)"], + ["--t-accent-accent10", "color(display-p3 0.354 0.445 0.866)"], + ["--t-accent-accent11", "color(display-p3 0.63 0.69 1)"], + ["--t-accent-accent12", "color(display-p3 0.848 0.881 0.99)"], + ["--t-background-noisy", "url(data:image/jpeg;base64,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);"], + ["--t-background-primary", "color(display-p3 0.09 0.09 0.09)"], + ["--t-background-secondary", "color(display-p3 0.106 0.106 0.106)"], + ["--t-background-tertiary", "color(display-p3 0.114 0.114 0.114)"], + ["--t-background-quaternary", "color(display-p3 0.133 0.133 0.133)"], + ["--t-background-inverted-primary", "color(display-p3 0.922 0.922 0.922)"], + ["--t-background-inverted-secondary", "color(display-p3 0.702 0.702 0.702)"], + ["--t-background-danger", "color(display-p3 0.211 0.081 0.099)"], + ["--t-background-transparent-primary", "color(display-p3 0 0 0 / 0.5)"], + ["--t-background-transparent-secondary", "color(display-p3 0 0 0 / 0.4)"], + ["--t-background-transparent-strong", "color(display-p3 1 1 1 / 0.141)"], + ["--t-background-transparent-medium", "color(display-p3 1 1 1 / 0.102)"], + ["--t-background-transparent-light", "color(display-p3 1 1 1 / 0.059)"], + ["--t-background-transparent-lighter", "color(display-p3 1 1 1 / 0.031)"], + ["--t-background-transparent-danger", "#ff173f2d"], + ["--t-background-transparent-blue", "#3566ff57"], + ["--t-background-transparent-orange", "#ff590039"], + ["--t-background-transparent-success", "#11ff992d"], + ["--t-background-overlay-primary", "#000000b8"], + ["--t-background-overlay-secondary", "#0000005c"], + ["--t-background-overlay-tertiary", "#0000005c"], + ["--t-background-radial-gradient", "radial-gradient(50% 62.62% at 50% 0%, color(display-p3 0.506 0.506 0.506) 0%, color(display-p3 0.482 0.482 0.482) 100%)"], + ["--t-background-radial-gradient-hover", "radial-gradient(76.32% 95.59% at 50% 0%, color(display-p3 0.482 0.482 0.482) 0%, color(display-p3 0.702 0.702 0.702) 100%)"], + ["--t-background-primary-inverted", "color(display-p3 0.922 0.922 0.922)"], + ["--t-background-primary-inverted-hover", "color(display-p3 0.702 0.702 0.702)"], + ["--t-blur-light", "blur(6px) saturate(200%) contrast(100%) brightness(130%)"], + ["--t-blur-medium", "blur(12px) saturate(200%) contrast(100%) brightness(130%)"], + ["--t-blur-strong", "blur(20px) saturate(200%) contrast(100%) brightness(130%)"], + ["--t-border-color-strong", "color(display-p3 0.282 0.282 0.282)"], + ["--t-border-color-medium", "color(display-p3 0.133 0.133 0.133)"], + ["--t-border-color-light", "color(display-p3 0.114 0.114 0.114)"], + ["--t-border-color-secondary-inverted", "color(display-p3 0.702 0.702 0.702)"], + ["--t-border-color-inverted", "color(display-p3 0.922 0.922 0.922)"], + ["--t-border-color-danger", "color(display-p3 0.348 0.11 0.142)"], + ["--t-border-color-blue", "color(display-p3 0.245 0.309 0.575)"], + ["--t-border-color-transparent-strong", "color(display-p3 1 1 1 / 0.071)"], + ["--t-border-radius-xs", "2px"], + ["--t-border-radius-sm", "4px"], + ["--t-border-radius-md", "8px"], + ["--t-border-radius-xl", "20px"], + ["--t-border-radius-xxl", "40px"], + ["--t-border-radius-pill", "999px"], + ["--t-border-radius-rounded", "100%"], + ["--t-box-shadow-color", "rgba(0,0,0,0.6)"], + ["--t-box-shadow-light", "0px 2px 4px 0px rgba(0,0,0,0.04), 0px 0px 4px 0px rgba(0,0,0,0.08)"], + ["--t-box-shadow-strong", "2px 4px 16px 0px rgba(0,0,0,0.16), 0px 2px 4px 0px rgba(0,0,0,0.08)"], + ["--t-box-shadow-underline", "0px 1px 0px 0px rgba(0,0,0,0.32)"], + ["--t-box-shadow-super-heavy", "2px 4px 16px 0px rgba(0,0,0,0.12), 0px 2px 4px 0px rgba(0,0,0,0.04)"], + ["--t-font-color-primary", "color(display-p3 0.922 0.922 0.922)"], + ["--t-font-color-secondary", "color(display-p3 0.702 0.702 0.702)"], + ["--t-font-color-tertiary", "color(display-p3 0.506 0.506 0.506)"], + ["--t-font-color-light", "color(display-p3 0.4 0.4 0.4)"], + ["--t-font-color-extra-light", "color(display-p3 0.298 0.298 0.298)"], + ["--t-font-color-inverted", "color(display-p3 0.09 0.09 0.09)"], + ["--t-font-color-danger", "color(display-p3 0.83 0.329 0.324)"], + ["--t-font-size-xxs", "0.625rem"], + ["--t-font-size-xs", "0.85rem"], + ["--t-font-size-sm", "0.92rem"], + ["--t-font-size-md", "1rem"], + ["--t-font-size-lg", "1.23rem"], + ["--t-font-size-xl", "1.54rem"], + ["--t-font-size-xxl", "1.85rem"], + ["--t-font-weight-regular", "400"], + ["--t-font-weight-medium", "500"], + ["--t-font-weight-semi-bold", "600"], + ["--t-font-family", "Inter, sans-serif"], + ["--t-name", "dark"], + ["--t-snack-bar-success-color", "color(display-p3 0.297 0.637 0.581)"], + ["--t-snack-bar-success-background-color", "#11ff992d"], + ["--t-snack-bar-error-color", "color(display-p3 0.83 0.329 0.324)"], + ["--t-snack-bar-error-background-color", "#ff173f2d"], + ["--t-snack-bar-warning-color", "color(display-p3 0.9 0.45 0.2)"], + ["--t-snack-bar-warning-background-color", "#ff590039"], + ["--t-snack-bar-info-color", "color(display-p3 0.276 0.384 0.837)"], + ["--t-snack-bar-info-background-color", "#3566ff57"], + ["--t-snack-bar-default-color", "color(display-p3 0.922 0.922 0.922)"], + ["--t-snack-bar-default-background-color", "color(display-p3 1 1 1 / 0.059)"], + ["--t-tag-text-gray", "color(display-p3 0.702 0.702 0.702)"], + ["--t-tag-text-mauve", "color(display-p3 0.707 0.7 0.735)"], + ["--t-tag-text-slate", "color(display-p3 0.692 0.704 0.728)"], + ["--t-tag-text-sage", "color(display-p3 0.685 0.709 0.697)"], + ["--t-tag-text-olive", "color(display-p3 0.69 0.709 0.682)"], + ["--t-tag-text-sand", "color(display-p3 0.707 0.703 0.68)"], + ["--t-tag-text-tomato", "color(display-p3 1 0.585 0.455)"], + ["--t-tag-text-red", "color(display-p3 1 0.57 0.55)"], + ["--t-tag-text-ruby", "color(display-p3 1 0.57 0.59)"], + ["--t-tag-text-crimson", "color(display-p3 1 0.56 0.66)"], + ["--t-tag-text-pink", "color(display-p3 1 0.535 0.78)"], + ["--t-tag-text-plum", "color(display-p3 0.86 0.602 0.933)"], + ["--t-tag-text-purple", "color(display-p3 0.8 0.62 1)"], + ["--t-tag-text-violet", "color(display-p3 0.72 0.65 1)"], + ["--t-tag-text-iris", "color(display-p3 0.685 0.662 1)"], + ["--t-tag-text-cyan", "color(display-p3 0.446 0.79 0.887)"], + ["--t-tag-text-turquoise", "color(display-p3 0.388 0.835 0.719)"], + ["--t-tag-text-sky", "color(display-p3 0.536 0.772 0.924)"], + ["--t-tag-text-blue", "color(display-p3 0.63 0.69 1)"], + ["--t-tag-text-jade", "color(display-p3 0.4 0.835 0.656)"], + ["--t-tag-text-green", "color(display-p3 0.434 0.828 0.573)"], + ["--t-tag-text-grass", "color(display-p3 0.535 0.807 0.542)"], + ["--t-tag-text-mint", "color(display-p3 0.482 0.825 0.733)"], + ["--t-tag-text-lime", "color(display-p3 0.771 0.893 0.485)"], + ["--t-tag-text-bronze", "color(display-p3 0.81 0.707 0.655)"], + ["--t-tag-text-gold", "color(display-p3 0.784 0.728 0.635)"], + ["--t-tag-text-brown", "color(display-p3 0.835 0.715 0.597)"], + ["--t-tag-text-orange", "color(display-p3 1 0.63 0.38)"], + ["--t-tag-text-amber", "color(display-p3 1 0.8 0.29)"], + ["--t-tag-text-yellow", "color(display-p3 0.948 0.885 0.392)"], + ["--t-tag-background-gray", "color(display-p3 0.098 0.098 0.098)"], + ["--t-tag-background-mauve", "color(display-p3 0.138 0.134 0.144)"], + ["--t-tag-background-slate", "color(display-p3 0.13 0.135 0.145)"], + ["--t-tag-background-sage", "color(display-p3 0.128 0.135 0.131)"], + ["--t-tag-background-olive", "color(display-p3 0.131 0.135 0.126)"], + ["--t-tag-background-sand", "color(display-p3 0.135 0.135 0.129)"], + ["--t-tag-background-tomato", "color(display-p3 0.205 0.097 0.083)"], + ["--t-tag-background-red", "color(display-p3 0.211 0.081 0.099)"], + ["--t-tag-background-ruby", "color(display-p3 0.208 0.088 0.117)"], + ["--t-tag-background-crimson", "color(display-p3 0.203 0.091 0.143)"], + ["--t-tag-background-pink", "color(display-p3 0.198 0.098 0.179)"], + ["--t-tag-background-plum", "color(display-p3 0.192 0.105 0.202)"], + ["--t-tag-background-purple", "color(display-p3 0.175 0.112 0.224)"], + ["--t-tag-background-violet", "color(display-p3 0.154 0.123 0.256)"], + ["--t-tag-background-iris", "color(display-p3 0.128 0.134 0.272)"], + ["--t-tag-background-cyan", "color(display-p3 0.073 0.168 0.209)"], + ["--t-tag-background-turquoise", "color(display-p3 0.087 0.175 0.165)"], + ["--t-tag-background-sky", "color(display-p3 0.089 0.154 0.244)"], + ["--t-tag-background-blue", "color(display-p3 0.105 0.141 0.275)"], + ["--t-tag-background-jade", "color(display-p3 0.091 0.176 0.138)"], + ["--t-tag-background-green", "color(display-p3 0.1 0.173 0.133)"], + ["--t-tag-background-grass", "color(display-p3 0.118 0.163 0.122)"], + ["--t-tag-background-mint", "color(display-p3 0.077 0.17 0.168)"], + ["--t-tag-background-lime", "color(display-p3 0.13 0.16 0.099)"], + ["--t-tag-background-bronze", "color(display-p3 0.147 0.132 0.125)"], + ["--t-tag-background-gold", "color(display-p3 0.141 0.136 0.122)"], + ["--t-tag-background-brown", "color(display-p3 0.151 0.13 0.115)"], + ["--t-tag-background-orange", "color(display-p3 0.189 0.12 0.056)"], + ["--t-tag-background-amber", "color(display-p3 0.178 0.128 0.049)"], + ["--t-tag-background-yellow", "color(display-p3 0.168 0.137 0.039)"], + ["--t-code-text-gray", "color(display-p3 0.482 0.482 0.482)"], + ["--t-code-text-sky", "color(display-p3 0.718 0.925 0.991)"], + ["--t-code-text-pink", "color(display-p3 0.808 0.356 0.645)"], + ["--t-code-text-orange", "color(display-p3 0.601 0.359 0.201)"], + ["--t-code-text-green", "color(display-p3 0.365 0.456 0.25)"], + ["--t-code-font-family", "DM Mono"], + ["--t--illustration-icon-color-blue", "color(display-p3 0.354 0.445 0.866)"], + ["--t--illustration-icon-color-gray", "color(display-p3 0.4 0.4 0.4)"], + ["--t--illustration-icon-fill-blue", "color(display-p3 0.848 0.881 0.99)"], + ["--t--illustration-icon-fill-gray", "color(display-p3 0.133 0.133 0.133)"], + ["--t-gray-scale-gray1", "color(display-p3 0.09 0.09 0.09)"], + ["--t-gray-scale-gray2", "color(display-p3 0.106 0.106 0.106)"], + ["--t-gray-scale-gray3", "color(display-p3 0.098 0.098 0.098)"], + ["--t-gray-scale-gray4", "color(display-p3 0.114 0.114 0.114)"], + ["--t-gray-scale-gray5", "color(display-p3 0.133 0.133 0.133)"], + ["--t-gray-scale-gray6", "color(display-p3 0.282 0.282 0.282)"], + ["--t-gray-scale-gray7", "color(display-p3 0.298 0.298 0.298)"], + ["--t-gray-scale-gray8", "color(display-p3 0.4 0.4 0.4)"], + ["--t-gray-scale-gray9", "color(display-p3 0.506 0.506 0.506)"], + ["--t-gray-scale-gray10", "color(display-p3 0.482 0.482 0.482)"], + ["--t-gray-scale-gray11", "color(display-p3 0.702 0.702 0.702)"], + ["--t-gray-scale-gray12", "color(display-p3 0.922 0.922 0.922)"], + ["--t-color-red", "color(display-p3 0.83 0.329 0.324)"], + ["--t-color-ruby", "color(display-p3 0.83 0.323 0.408)"], + ["--t-color-crimson", "color(display-p3 0.843 0.298 0.507)"], + ["--t-color-tomato", "color(display-p3 0.831 0.345 0.231)"], + ["--t-color-orange", "color(display-p3 0.9 0.45 0.2)"], + ["--t-color-amber", "color(display-p3 1 0.77 0.26)"], + ["--t-color-yellow", "color(display-p3 1 0.92 0.22)"], + ["--t-color-lime", "color(display-p3 0.78 0.928 0.466)"], + ["--t-color-grass", "color(display-p3 0.38 0.647 0.378)"], + ["--t-color-green", "color(display-p3 0.332 0.634 0.442)"], + ["--t-color-jade", "color(display-p3 0.319 0.63 0.521)"], + ["--t-color-mint", "color(display-p3 0.62 0.908 0.834)"], + ["--t-color-turquoise", "color(display-p3 0.297 0.637 0.581)"], + ["--t-color-cyan", "color(display-p3 0.282 0.627 0.765)"], + ["--t-color-sky", "color(display-p3 0.585 0.877 0.983)"], + ["--t-color-blue", "color(display-p3 0.276 0.384 0.837)"], + ["--t-color-iris", "color(display-p3 0.357 0.357 0.81)"], + ["--t-color-violet", "color(display-p3 0.417 0.341 0.784)"], + ["--t-color-purple", "color(display-p3 0.523 0.318 0.751)"], + ["--t-color-plum", "color(display-p3 0.624 0.313 0.708)"], + ["--t-color-pink", "color(display-p3 0.775 0.297 0.61)"], + ["--t-color-bronze", "color(display-p3 0.611 0.507 0.455)"], + ["--t-color-gold", "color(display-p3 0.579 0.517 0.41)"], + ["--t-color-brown", "color(display-p3 0.651 0.505 0.368)"], + ["--t-color-gray", "color(display-p3 0.298 0.298 0.298)"], + ["--t-color-yellow1", "color(display-p3 0.078 0.069 0.047)"], + ["--t-color-yellow2", "color(display-p3 0.103 0.094 0.063)"], + ["--t-color-yellow3", "color(display-p3 0.168 0.137 0.039)"], + ["--t-color-yellow4", "color(display-p3 0.209 0.169 0)"], + ["--t-color-yellow5", "color(display-p3 0.255 0.209 0)"], + ["--t-color-yellow6", "color(display-p3 0.31 0.261 0.07)"], + ["--t-color-yellow7", "color(display-p3 0.389 0.331 0.135)"], + ["--t-color-yellow8", "color(display-p3 0.497 0.42 0.182)"], + ["--t-color-yellow9", "color(display-p3 1 0.92 0.22)"], + ["--t-color-yellow10", "color(display-p3 1 1 0.456)"], + ["--t-color-yellow11", "color(display-p3 0.948 0.885 0.392)"], + ["--t-color-yellow12", "color(display-p3 0.959 0.934 0.731)"], + ["--t-color-green1", "color(display-p3 0.062 0.083 0.071)"], + ["--t-color-green2", "color(display-p3 0.079 0.106 0.09)"], + ["--t-color-green3", "color(display-p3 0.1 0.173 0.133)"], + ["--t-color-green4", "color(display-p3 0.115 0.229 0.166)"], + ["--t-color-green5", "color(display-p3 0.147 0.282 0.206)"], + ["--t-color-green6", "color(display-p3 0.185 0.338 0.25)"], + ["--t-color-green7", "color(display-p3 0.227 0.403 0.298)"], + ["--t-color-green8", "color(display-p3 0.27 0.479 0.351)"], + ["--t-color-green9", "color(display-p3 0.332 0.634 0.442)"], + ["--t-color-green10", "color(display-p3 0.357 0.682 0.474)"], + ["--t-color-green11", "color(display-p3 0.434 0.828 0.573)"], + ["--t-color-green12", "color(display-p3 0.747 0.938 0.807)"], + ["--t-color-turquoise1", "color(display-p3 0.059 0.083 0.079)"], + ["--t-color-turquoise2", "color(display-p3 0.075 0.11 0.107)"], + ["--t-color-turquoise3", "color(display-p3 0.087 0.175 0.165)"], + ["--t-color-turquoise4", "color(display-p3 0.087 0.227 0.214)"], + ["--t-color-turquoise5", "color(display-p3 0.12 0.277 0.261)"], + ["--t-color-turquoise6", "color(display-p3 0.162 0.335 0.314)"], + ["--t-color-turquoise7", "color(display-p3 0.205 0.406 0.379)"], + ["--t-color-turquoise8", "color(display-p3 0.245 0.489 0.453)"], + ["--t-color-turquoise9", "color(display-p3 0.297 0.637 0.581)"], + ["--t-color-turquoise10", "color(display-p3 0.319 0.69 0.62)"], + ["--t-color-turquoise11", "color(display-p3 0.388 0.835 0.719)"], + ["--t-color-turquoise12", "color(display-p3 0.734 0.934 0.87)"], + ["--t-color-sky1", "color(display-p3 0.056 0.078 0.116)"], + ["--t-color-sky2", "color(display-p3 0.075 0.101 0.149)"], + ["--t-color-sky3", "color(display-p3 0.089 0.154 0.244)"], + ["--t-color-sky4", "color(display-p3 0.106 0.207 0.323)"], + ["--t-color-sky5", "color(display-p3 0.135 0.261 0.394)"], + ["--t-color-sky6", "color(display-p3 0.17 0.322 0.469)"], + ["--t-color-sky7", "color(display-p3 0.205 0.394 0.557)"], + ["--t-color-sky8", "color(display-p3 0.232 0.48 0.665)"], + ["--t-color-sky9", "color(display-p3 0.585 0.877 0.983)"], + ["--t-color-sky10", "color(display-p3 0.718 0.925 0.991)"], + ["--t-color-sky11", "color(display-p3 0.536 0.772 0.924)"], + ["--t-color-sky12", "color(display-p3 0.799 0.947 0.993)"], + ["--t-color-blue1", "color(display-p3 0.068 0.074 0.118)"], + ["--t-color-blue2", "color(display-p3 0.081 0.089 0.144)"], + ["--t-color-blue3", "color(display-p3 0.105 0.141 0.275)"], + ["--t-color-blue4", "color(display-p3 0.129 0.18 0.369)"], + ["--t-color-blue5", "color(display-p3 0.163 0.22 0.439)"], + ["--t-color-blue6", "color(display-p3 0.203 0.262 0.5)"], + ["--t-color-blue7", "color(display-p3 0.245 0.309 0.575)"], + ["--t-color-blue8", "color(display-p3 0.285 0.362 0.674)"], + ["--t-color-blue9", "color(display-p3 0.276 0.384 0.837)"], + ["--t-color-blue10", "color(display-p3 0.354 0.445 0.866)"], + ["--t-color-blue11", "color(display-p3 0.63 0.69 1)"], + ["--t-color-blue12", "color(display-p3 0.848 0.881 0.99)"], + ["--t-color-purple1", "color(display-p3 0.09 0.068 0.103)"], + ["--t-color-purple2", "color(display-p3 0.113 0.082 0.134)"], + ["--t-color-purple3", "color(display-p3 0.175 0.112 0.224)"], + ["--t-color-purple4", "color(display-p3 0.224 0.137 0.297)"], + ["--t-color-purple5", "color(display-p3 0.264 0.167 0.349)"], + ["--t-color-purple6", "color(display-p3 0.311 0.208 0.406)"], + ["--t-color-purple7", "color(display-p3 0.381 0.266 0.496)"], + ["--t-color-purple8", "color(display-p3 0.49 0.349 0.649)"], + ["--t-color-purple9", "color(display-p3 0.523 0.318 0.751)"], + ["--t-color-purple10", "color(display-p3 0.57 0.373 0.791)"], + ["--t-color-purple11", "color(display-p3 0.8 0.62 1)"], + ["--t-color-purple12", "color(display-p3 0.913 0.854 0.971)"], + ["--t-color-pink1", "color(display-p3 0.093 0.068 0.089)"], + ["--t-color-pink2", "color(display-p3 0.121 0.073 0.11)"], + ["--t-color-pink3", "color(display-p3 0.198 0.098 0.179)"], + ["--t-color-pink4", "color(display-p3 0.271 0.095 0.231)"], + ["--t-color-pink5", "color(display-p3 0.32 0.127 0.273)"], + ["--t-color-pink6", "color(display-p3 0.382 0.177 0.326)"], + ["--t-color-pink7", "color(display-p3 0.477 0.238 0.405)"], + ["--t-color-pink8", "color(display-p3 0.612 0.304 0.51)"], + ["--t-color-pink9", "color(display-p3 0.775 0.297 0.61)"], + ["--t-color-pink10", "color(display-p3 0.808 0.356 0.645)"], + ["--t-color-pink11", "color(display-p3 1 0.535 0.78)"], + ["--t-color-pink12", "color(display-p3 0.964 0.826 0.912)"], + ["--t-color-red1", "color(display-p3 0.093 0.068 0.067)"], + ["--t-color-red2", "color(display-p3 0.118 0.077 0.079)"], + ["--t-color-red3", "color(display-p3 0.211 0.081 0.099)"], + ["--t-color-red4", "color(display-p3 0.287 0.079 0.113)"], + ["--t-color-red5", "color(display-p3 0.348 0.11 0.142)"], + ["--t-color-red6", "color(display-p3 0.414 0.16 0.183)"], + ["--t-color-red7", "color(display-p3 0.508 0.224 0.236)"], + ["--t-color-red8", "color(display-p3 0.659 0.298 0.297)"], + ["--t-color-red9", "color(display-p3 0.83 0.329 0.324)"], + ["--t-color-red10", "color(display-p3 0.861 0.403 0.387)"], + ["--t-color-red11", "color(display-p3 1 0.57 0.55)"], + ["--t-color-red12", "color(display-p3 0.971 0.826 0.852)"], + ["--t-color-orange1", "color(display-p3 0.088 0.07 0.057)"], + ["--t-color-orange2", "color(display-p3 0.113 0.089 0.061)"], + ["--t-color-orange3", "color(display-p3 0.189 0.12 0.056)"], + ["--t-color-orange4", "color(display-p3 0.262 0.132 0)"], + ["--t-color-orange5", "color(display-p3 0.315 0.168 0.016)"], + ["--t-color-orange6", "color(display-p3 0.376 0.219 0.088)"], + ["--t-color-orange7", "color(display-p3 0.465 0.283 0.147)"], + ["--t-color-orange8", "color(display-p3 0.601 0.359 0.201)"], + ["--t-color-orange9", "color(display-p3 0.9 0.45 0.2)"], + ["--t-color-orange10", "color(display-p3 0.98 0.51 0.23)"], + ["--t-color-orange11", "color(display-p3 1 0.63 0.38)"], + ["--t-color-orange12", "color(display-p3 0.98 0.883 0.775)"], + ["--t-color-gray1", "color(display-p3 0.09 0.09 0.09)"], + ["--t-color-gray2", "color(display-p3 0.106 0.106 0.106)"], + ["--t-color-gray3", "color(display-p3 0.098 0.098 0.098)"], + ["--t-color-gray4", "color(display-p3 0.114 0.114 0.114)"], + ["--t-color-gray5", "color(display-p3 0.133 0.133 0.133)"], + ["--t-color-gray6", "color(display-p3 0.282 0.282 0.282)"], + ["--t-color-gray7", "color(display-p3 0.298 0.298 0.298)"], + ["--t-color-gray8", "color(display-p3 0.4 0.4 0.4)"], + ["--t-color-gray9", "color(display-p3 0.506 0.506 0.506)"], + ["--t-color-gray10", "color(display-p3 0.482 0.482 0.482)"], + ["--t-color-gray11", "color(display-p3 0.702 0.702 0.702)"], + ["--t-color-gray12", "color(display-p3 0.922 0.922 0.922)"], + ["--t-color-mauve1", "color(display-p3 0.07 0.067 0.074)"], + ["--t-color-mauve2", "color(display-p3 0.101 0.098 0.105)"], + ["--t-color-mauve3", "color(display-p3 0.138 0.134 0.144)"], + ["--t-color-mauve4", "color(display-p3 0.167 0.161 0.175)"], + ["--t-color-mauve5", "color(display-p3 0.196 0.189 0.206)"], + ["--t-color-mauve6", "color(display-p3 0.232 0.225 0.245)"], + ["--t-color-mauve7", "color(display-p3 0.286 0.277 0.302)"], + ["--t-color-mauve8", "color(display-p3 0.383 0.373 0.408)"], + ["--t-color-mauve9", "color(display-p3 0.434 0.428 0.467)"], + ["--t-color-mauve10", "color(display-p3 0.487 0.48 0.519)"], + ["--t-color-mauve11", "color(display-p3 0.707 0.7 0.735)"], + ["--t-color-mauve12", "color(display-p3 0.933 0.933 0.94)"], + ["--t-color-slate1", "color(display-p3 0.067 0.067 0.074)"], + ["--t-color-slate2", "color(display-p3 0.095 0.098 0.105)"], + ["--t-color-slate3", "color(display-p3 0.13 0.135 0.145)"], + ["--t-color-slate4", "color(display-p3 0.156 0.163 0.176)"], + ["--t-color-slate5", "color(display-p3 0.183 0.191 0.206)"], + ["--t-color-slate6", "color(display-p3 0.215 0.226 0.244)"], + ["--t-color-slate7", "color(display-p3 0.265 0.28 0.302)"], + ["--t-color-slate8", "color(display-p3 0.357 0.381 0.409)"], + ["--t-color-slate9", "color(display-p3 0.415 0.431 0.463)"], + ["--t-color-slate10", "color(display-p3 0.469 0.483 0.514)"], + ["--t-color-slate11", "color(display-p3 0.692 0.704 0.728)"], + ["--t-color-slate12", "color(display-p3 0.93 0.933 0.94)"], + ["--t-color-sage1", "color(display-p3 0.064 0.07 0.067)"], + ["--t-color-sage2", "color(display-p3 0.092 0.098 0.094)"], + ["--t-color-sage3", "color(display-p3 0.128 0.135 0.131)"], + ["--t-color-sage4", "color(display-p3 0.155 0.164 0.159)"], + ["--t-color-sage5", "color(display-p3 0.183 0.193 0.188)"], + ["--t-color-sage6", "color(display-p3 0.218 0.23 0.224)"], + ["--t-color-sage7", "color(display-p3 0.269 0.285 0.277)"], + ["--t-color-sage8", "color(display-p3 0.362 0.382 0.373)"], + ["--t-color-sage9", "color(display-p3 0.398 0.438 0.421)"], + ["--t-color-sage10", "color(display-p3 0.453 0.49 0.474)"], + ["--t-color-sage11", "color(display-p3 0.685 0.709 0.697)"], + ["--t-color-sage12", "color(display-p3 0.927 0.933 0.93)"], + ["--t-color-olive1", "color(display-p3 0.067 0.07 0.063)"], + ["--t-color-olive2", "color(display-p3 0.095 0.098 0.091)"], + ["--t-color-olive3", "color(display-p3 0.131 0.135 0.126)"], + ["--t-color-olive4", "color(display-p3 0.158 0.163 0.153)"], + ["--t-color-olive5", "color(display-p3 0.186 0.192 0.18)"], + ["--t-color-olive6", "color(display-p3 0.221 0.229 0.215)"], + ["--t-color-olive7", "color(display-p3 0.273 0.284 0.266)"], + ["--t-color-olive8", "color(display-p3 0.365 0.382 0.359)"], + ["--t-color-olive9", "color(display-p3 0.414 0.438 0.404)"], + ["--t-color-olive10", "color(display-p3 0.467 0.49 0.458)"], + ["--t-color-olive11", "color(display-p3 0.69 0.709 0.682)"], + ["--t-color-olive12", "color(display-p3 0.927 0.933 0.926)"], + ["--t-color-sand1", "color(display-p3 0.067 0.067 0.063)"], + ["--t-color-sand2", "color(display-p3 0.098 0.098 0.094)"], + ["--t-color-sand3", "color(display-p3 0.135 0.135 0.129)"], + ["--t-color-sand4", "color(display-p3 0.164 0.163 0.156)"], + ["--t-color-sand5", "color(display-p3 0.193 0.192 0.183)"], + ["--t-color-sand6", "color(display-p3 0.23 0.229 0.217)"], + ["--t-color-sand7", "color(display-p3 0.285 0.282 0.267)"], + ["--t-color-sand8", "color(display-p3 0.384 0.378 0.357)"], + ["--t-color-sand9", "color(display-p3 0.434 0.428 0.403)"], + ["--t-color-sand10", "color(display-p3 0.487 0.481 0.456)"], + ["--t-color-sand11", "color(display-p3 0.707 0.703 0.68)"], + ["--t-color-sand12", "color(display-p3 0.933 0.933 0.926)"], + ["--t-color-tomato1", "color(display-p3 0.09 0.068 0.067)"], + ["--t-color-tomato2", "color(display-p3 0.115 0.084 0.076)"], + ["--t-color-tomato3", "color(display-p3 0.205 0.097 0.083)"], + ["--t-color-tomato4", "color(display-p3 0.282 0.099 0.077)"], + ["--t-color-tomato5", "color(display-p3 0.339 0.129 0.101)"], + ["--t-color-tomato6", "color(display-p3 0.398 0.179 0.141)"], + ["--t-color-tomato7", "color(display-p3 0.487 0.245 0.194)"], + ["--t-color-tomato8", "color(display-p3 0.629 0.322 0.248)"], + ["--t-color-tomato9", "color(display-p3 0.831 0.345 0.231)"], + ["--t-color-tomato10", "color(display-p3 0.862 0.415 0.298)"], + ["--t-color-tomato11", "color(display-p3 1 0.585 0.455)"], + ["--t-color-tomato12", "color(display-p3 0.959 0.833 0.802)"], + ["--t-color-ruby1", "color(display-p3 0.093 0.068 0.074)"], + ["--t-color-ruby2", "color(display-p3 0.113 0.083 0.089)"], + ["--t-color-ruby3", "color(display-p3 0.208 0.088 0.117)"], + ["--t-color-ruby4", "color(display-p3 0.279 0.092 0.147)"], + ["--t-color-ruby5", "color(display-p3 0.337 0.12 0.18)"], + ["--t-color-ruby6", "color(display-p3 0.401 0.166 0.223)"], + ["--t-color-ruby7", "color(display-p3 0.495 0.224 0.281)"], + ["--t-color-ruby8", "color(display-p3 0.652 0.295 0.359)"], + ["--t-color-ruby9", "color(display-p3 0.83 0.323 0.408)"], + ["--t-color-ruby10", "color(display-p3 0.857 0.392 0.455)"], + ["--t-color-ruby11", "color(display-p3 1 0.57 0.59)"], + ["--t-color-ruby12", "color(display-p3 0.968 0.83 0.88)"], + ["--t-color-crimson1", "color(display-p3 0.093 0.068 0.078)"], + ["--t-color-crimson2", "color(display-p3 0.117 0.078 0.095)"], + ["--t-color-crimson3", "color(display-p3 0.203 0.091 0.143)"], + ["--t-color-crimson4", "color(display-p3 0.277 0.087 0.182)"], + ["--t-color-crimson5", "color(display-p3 0.332 0.115 0.22)"], + ["--t-color-crimson6", "color(display-p3 0.394 0.162 0.268)"], + ["--t-color-crimson7", "color(display-p3 0.489 0.222 0.336)"], + ["--t-color-crimson8", "color(display-p3 0.638 0.289 0.429)"], + ["--t-color-crimson9", "color(display-p3 0.843 0.298 0.507)"], + ["--t-color-crimson10", "color(display-p3 0.864 0.364 0.539)"], + ["--t-color-crimson11", "color(display-p3 1 0.56 0.66)"], + ["--t-color-crimson12", "color(display-p3 0.966 0.834 0.906)"], + ["--t-color-plum1", "color(display-p3 0.09 0.068 0.092)"], + ["--t-color-plum2", "color(display-p3 0.118 0.077 0.121)"], + ["--t-color-plum3", "color(display-p3 0.192 0.105 0.202)"], + ["--t-color-plum4", "color(display-p3 0.25 0.121 0.271)"], + ["--t-color-plum5", "color(display-p3 0.293 0.152 0.319)"], + ["--t-color-plum6", "color(display-p3 0.343 0.198 0.372)"], + ["--t-color-plum7", "color(display-p3 0.424 0.262 0.461)"], + ["--t-color-plum8", "color(display-p3 0.54 0.341 0.595)"], + ["--t-color-plum9", "color(display-p3 0.624 0.313 0.708)"], + ["--t-color-plum10", "color(display-p3 0.666 0.365 0.748)"], + ["--t-color-plum11", "color(display-p3 0.86 0.602 0.933)"], + ["--t-color-plum12", "color(display-p3 0.936 0.836 0.949)"], + ["--t-color-violet1", "color(display-p3 0.077 0.071 0.118)"], + ["--t-color-violet2", "color(display-p3 0.101 0.084 0.141)"], + ["--t-color-violet3", "color(display-p3 0.154 0.123 0.256)"], + ["--t-color-violet4", "color(display-p3 0.191 0.148 0.345)"], + ["--t-color-violet5", "color(display-p3 0.226 0.182 0.396)"], + ["--t-color-violet6", "color(display-p3 0.269 0.223 0.449)"], + ["--t-color-violet7", "color(display-p3 0.326 0.277 0.53)"], + ["--t-color-violet8", "color(display-p3 0.399 0.346 0.656)"], + ["--t-color-violet9", "color(display-p3 0.417 0.341 0.784)"], + ["--t-color-violet10", "color(display-p3 0.477 0.402 0.823)"], + ["--t-color-violet11", "color(display-p3 0.72 0.65 1)"], + ["--t-color-violet12", "color(display-p3 0.883 0.867 0.986)"], + ["--t-color-iris1", "color(display-p3 0.075 0.075 0.114)"], + ["--t-color-iris2", "color(display-p3 0.089 0.086 0.14)"], + ["--t-color-iris3", "color(display-p3 0.128 0.134 0.272)"], + ["--t-color-iris4", "color(display-p3 0.153 0.165 0.382)"], + ["--t-color-iris5", "color(display-p3 0.192 0.201 0.44)"], + ["--t-color-iris6", "color(display-p3 0.239 0.241 0.491)"], + ["--t-color-iris7", "color(display-p3 0.291 0.289 0.565)"], + ["--t-color-iris8", "color(display-p3 0.35 0.345 0.673)"], + ["--t-color-iris9", "color(display-p3 0.357 0.357 0.81)"], + ["--t-color-iris10", "color(display-p3 0.428 0.416 0.843)"], + ["--t-color-iris11", "color(display-p3 0.685 0.662 1)"], + ["--t-color-iris12", "color(display-p3 0.878 0.875 0.986)"], + ["--t-color-cyan1", "color(display-p3 0.053 0.085 0.098)"], + ["--t-color-cyan2", "color(display-p3 0.072 0.105 0.122)"], + ["--t-color-cyan3", "color(display-p3 0.073 0.168 0.209)"], + ["--t-color-cyan4", "color(display-p3 0.063 0.216 0.277)"], + ["--t-color-cyan5", "color(display-p3 0.091 0.267 0.336)"], + ["--t-color-cyan6", "color(display-p3 0.137 0.324 0.4)"], + ["--t-color-cyan7", "color(display-p3 0.186 0.398 0.484)"], + ["--t-color-cyan8", "color(display-p3 0.23 0.496 0.6)"], + ["--t-color-cyan9", "color(display-p3 0.282 0.627 0.765)"], + ["--t-color-cyan10", "color(display-p3 0.331 0.675 0.801)"], + ["--t-color-cyan11", "color(display-p3 0.446 0.79 0.887)"], + ["--t-color-cyan12", "color(display-p3 0.757 0.919 0.962)"], + ["--t-color-jade1", "color(display-p3 0.059 0.083 0.071)"], + ["--t-color-jade2", "color(display-p3 0.078 0.11 0.094)"], + ["--t-color-jade3", "color(display-p3 0.091 0.176 0.138)"], + ["--t-color-jade4", "color(display-p3 0.102 0.228 0.177)"], + ["--t-color-jade5", "color(display-p3 0.133 0.279 0.221)"], + ["--t-color-jade6", "color(display-p3 0.174 0.334 0.273)"], + ["--t-color-jade7", "color(display-p3 0.219 0.402 0.335)"], + ["--t-color-jade8", "color(display-p3 0.263 0.488 0.411)"], + ["--t-color-jade9", "color(display-p3 0.319 0.63 0.521)"], + ["--t-color-jade10", "color(display-p3 0.338 0.68 0.555)"], + ["--t-color-jade11", "color(display-p3 0.4 0.835 0.656)"], + ["--t-color-jade12", "color(display-p3 0.734 0.934 0.838)"], + ["--t-color-grass1", "color(display-p3 0.062 0.083 0.067)"], + ["--t-color-grass2", "color(display-p3 0.083 0.103 0.085)"], + ["--t-color-grass3", "color(display-p3 0.118 0.163 0.122)"], + ["--t-color-grass4", "color(display-p3 0.142 0.225 0.15)"], + ["--t-color-grass5", "color(display-p3 0.178 0.279 0.186)"], + ["--t-color-grass6", "color(display-p3 0.217 0.337 0.224)"], + ["--t-color-grass7", "color(display-p3 0.258 0.4 0.264)"], + ["--t-color-grass8", "color(display-p3 0.302 0.47 0.305)"], + ["--t-color-grass9", "color(display-p3 0.38 0.647 0.378)"], + ["--t-color-grass10", "color(display-p3 0.426 0.694 0.426)"], + ["--t-color-grass11", "color(display-p3 0.535 0.807 0.542)"], + ["--t-color-grass12", "color(display-p3 0.797 0.936 0.776)"], + ["--t-color-mint1", "color(display-p3 0.059 0.082 0.081)"], + ["--t-color-mint2", "color(display-p3 0.068 0.104 0.105)"], + ["--t-color-mint3", "color(display-p3 0.077 0.17 0.168)"], + ["--t-color-mint4", "color(display-p3 0.068 0.224 0.22)"], + ["--t-color-mint5", "color(display-p3 0.104 0.275 0.264)"], + ["--t-color-mint6", "color(display-p3 0.154 0.332 0.313)"], + ["--t-color-mint7", "color(display-p3 0.207 0.403 0.373)"], + ["--t-color-mint8", "color(display-p3 0.258 0.49 0.441)"], + ["--t-color-mint9", "color(display-p3 0.62 0.908 0.834)"], + ["--t-color-mint10", "color(display-p3 0.725 0.954 0.898)"], + ["--t-color-mint11", "color(display-p3 0.482 0.825 0.733)"], + ["--t-color-mint12", "color(display-p3 0.807 0.955 0.887)"], + ["--t-color-lime1", "color(display-p3 0.067 0.073 0.048)"], + ["--t-color-lime2", "color(display-p3 0.086 0.1 0.067)"], + ["--t-color-lime3", "color(display-p3 0.13 0.16 0.099)"], + ["--t-color-lime4", "color(display-p3 0.172 0.214 0.126)"], + ["--t-color-lime5", "color(display-p3 0.213 0.266 0.153)"], + ["--t-color-lime6", "color(display-p3 0.257 0.321 0.182)"], + ["--t-color-lime7", "color(display-p3 0.307 0.383 0.215)"], + ["--t-color-lime8", "color(display-p3 0.365 0.456 0.25)"], + ["--t-color-lime9", "color(display-p3 0.78 0.928 0.466)"], + ["--t-color-lime10", "color(display-p3 0.865 0.995 0.519)"], + ["--t-color-lime11", "color(display-p3 0.771 0.893 0.485)"], + ["--t-color-lime12", "color(display-p3 0.905 0.966 0.753)"], + ["--t-color-bronze1", "color(display-p3 0.076 0.067 0.063)"], + ["--t-color-bronze2", "color(display-p3 0.106 0.097 0.093)"], + ["--t-color-bronze3", "color(display-p3 0.147 0.132 0.125)"], + ["--t-color-bronze4", "color(display-p3 0.185 0.166 0.156)"], + ["--t-color-bronze5", "color(display-p3 0.227 0.202 0.19)"], + ["--t-color-bronze6", "color(display-p3 0.278 0.246 0.23)"], + ["--t-color-bronze7", "color(display-p3 0.343 0.302 0.281)"], + ["--t-color-bronze8", "color(display-p3 0.426 0.374 0.347)"], + ["--t-color-bronze9", "color(display-p3 0.611 0.507 0.455)"], + ["--t-color-bronze10", "color(display-p3 0.66 0.556 0.504)"], + ["--t-color-bronze11", "color(display-p3 0.81 0.707 0.655)"], + ["--t-color-bronze12", "color(display-p3 0.921 0.88 0.854)"], + ["--t-color-gold1", "color(display-p3 0.071 0.071 0.067)"], + ["--t-color-gold2", "color(display-p3 0.104 0.101 0.09)"], + ["--t-color-gold3", "color(display-p3 0.141 0.136 0.122)"], + ["--t-color-gold4", "color(display-p3 0.177 0.17 0.152)"], + ["--t-color-gold5", "color(display-p3 0.217 0.207 0.185)"], + ["--t-color-gold6", "color(display-p3 0.265 0.252 0.225)"], + ["--t-color-gold7", "color(display-p3 0.327 0.31 0.277)"], + ["--t-color-gold8", "color(display-p3 0.407 0.384 0.342)"], + ["--t-color-gold9", "color(display-p3 0.579 0.517 0.41)"], + ["--t-color-gold10", "color(display-p3 0.628 0.566 0.463)"], + ["--t-color-gold11", "color(display-p3 0.784 0.728 0.635)"], + ["--t-color-gold12", "color(display-p3 0.906 0.887 0.855)"], + ["--t-color-brown1", "color(display-p3 0.071 0.067 0.059)"], + ["--t-color-brown2", "color(display-p3 0.107 0.095 0.087)"], + ["--t-color-brown3", "color(display-p3 0.151 0.13 0.115)"], + ["--t-color-brown4", "color(display-p3 0.191 0.161 0.138)"], + ["--t-color-brown5", "color(display-p3 0.235 0.194 0.162)"], + ["--t-color-brown6", "color(display-p3 0.291 0.237 0.192)"], + ["--t-color-brown7", "color(display-p3 0.365 0.295 0.232)"], + ["--t-color-brown8", "color(display-p3 0.469 0.377 0.287)"], + ["--t-color-brown9", "color(display-p3 0.651 0.505 0.368)"], + ["--t-color-brown10", "color(display-p3 0.697 0.557 0.423)"], + ["--t-color-brown11", "color(display-p3 0.835 0.715 0.597)"], + ["--t-color-brown12", "color(display-p3 0.938 0.885 0.802)"], + ["--t-color-amber1", "color(display-p3 0.082 0.07 0.05)"], + ["--t-color-amber2", "color(display-p3 0.111 0.094 0.064)"], + ["--t-color-amber3", "color(display-p3 0.178 0.128 0.049)"], + ["--t-color-amber4", "color(display-p3 0.239 0.156 0)"], + ["--t-color-amber5", "color(display-p3 0.29 0.193 0)"], + ["--t-color-amber6", "color(display-p3 0.344 0.245 0.076)"], + ["--t-color-amber7", "color(display-p3 0.422 0.314 0.141)"], + ["--t-color-amber8", "color(display-p3 0.535 0.399 0.189)"], + ["--t-color-amber9", "color(display-p3 1 0.77 0.26)"], + ["--t-color-amber10", "color(display-p3 1 0.87 0.15)"], + ["--t-color-amber11", "color(display-p3 1 0.8 0.29)"], + ["--t-color-amber12", "color(display-p3 0.984 0.909 0.726)"], + ["--t-color-transparent-green1", "#00de4505"], + ["--t-color-transparent-green2", "#29f99d0b"], + ["--t-color-transparent-green3", "#22ff991e"], + ["--t-color-transparent-green4", "#11ff992d"], + ["--t-color-transparent-green5", "#2bffa23c"], + ["--t-color-transparent-green6", "#44ffaa4b"], + ["--t-color-transparent-green7", "#50fdac5e"], + ["--t-color-transparent-green8", "#54ffad73"], + ["--t-color-transparent-green9", "#44ffa49e"], + ["--t-color-transparent-green10", "#43fea4ab"], + ["--t-color-transparent-green11", "#46fea5d4"], + ["--t-color-transparent-green12", "#bbffd7f0"], + ["--t-color-transparent-turquoise1", "#00deab05"], + ["--t-color-transparent-turquoise2", "#12fbe60c"], + ["--t-color-transparent-turquoise3", "#00ffe61e"], + ["--t-color-transparent-turquoise4", "#00ffe92d"], + ["--t-color-transparent-turquoise5", "#00ffea3b"], + ["--t-color-transparent-turquoise6", "#1cffe84b"], + ["--t-color-transparent-turquoise7", "#2efde85f"], + ["--t-color-transparent-turquoise8", "#32ffe775"], + ["--t-color-transparent-turquoise9", "#13ffe49f"], + ["--t-color-transparent-turquoise10", "#0dffe0ae"], + ["--t-color-transparent-turquoise11", "#0afed5d6"], + ["--t-color-transparent-turquoise12", "#b8ffebef"], + ["--t-color-transparent-sky1", "#0044ff0f"], + ["--t-color-transparent-sky2", "#1171fb18"], + ["--t-color-transparent-sky3", "#1184fc33"], + ["--t-color-transparent-sky4", "#128fff49"], + ["--t-color-transparent-sky5", "#1c9dfd5d"], + ["--t-color-transparent-sky6", "#28a5ff72"], + ["--t-color-transparent-sky7", "#2badfe8b"], + ["--t-color-transparent-sky8", "#1db2fea9"], + ["--t-color-transparent-sky9", "#7ce3fffe"], + ["--t-color-transparent-sky10", "#a8eeff"], + ["--t-color-transparent-sky11", "#7cd3ffef"], + ["--t-color-transparent-sky12", "#c2f3ff"], + ["--t-color-transparent-blue1", "#1133ff0f"], + ["--t-color-transparent-blue2", "#3354fa17"], + ["--t-color-transparent-blue3", "#2f62ff3c"], + ["--t-color-transparent-blue4", "#3566ff57"], + ["--t-color-transparent-blue5", "#4171fd6b"], + ["--t-color-transparent-blue6", "#5178fd7c"], + ["--t-color-transparent-blue7", "#5a7fff90"], + ["--t-color-transparent-blue8", "#5b81feac"], + ["--t-color-transparent-blue9", "#4671ffdb"], + ["--t-color-transparent-blue10", "#5c7efee3"], + ["--t-color-transparent-blue11", "#9eb1ff"], + ["--t-color-transparent-blue12", "#d6e1ff"], + ["--t-color-transparent-purple1", "#b412f90b"], + ["--t-color-transparent-purple2", "#b744f714"], + ["--t-color-transparent-purple3", "#c150ff2d"], + ["--t-color-transparent-purple4", "#bb53fd42"], + ["--t-color-transparent-purple5", "#be5cfd51"], + ["--t-color-transparent-purple6", "#c16dfd61"], + ["--t-color-transparent-purple7", "#c378fd7a"], + ["--t-color-transparent-purple8", "#c47effa4"], + ["--t-color-transparent-purple9", "#b661ffc2"], + ["--t-color-transparent-purple10", "#bc6fffcd"], + ["--t-color-transparent-purple11", "#d19dff"], + ["--t-color-transparent-purple12", "#f1ddfffa"], + ["--t-color-transparent-pink1", "#f412bc09"], + ["--t-color-transparent-pink2", "#f420bb12"], + ["--t-color-transparent-pink3", "#fe37cc29"], + ["--t-color-transparent-pink4", "#fc1ec43f"], + ["--t-color-transparent-pink5", "#fd35c24e"], + ["--t-color-transparent-pink6", "#fd51c75f"], + ["--t-color-transparent-pink7", "#fd62c87b"], + ["--t-color-transparent-pink8", "#ff68c8a2"], + ["--t-color-transparent-pink9", "#fe49bcd4"], + ["--t-color-transparent-pink10", "#ff5cc0dc"], + ["--t-color-transparent-pink11", "#ff8dcc"], + ["--t-color-transparent-pink12", "#ffd3ecfd"], + ["--t-color-transparent-red1", "#f4121209"], + ["--t-color-transparent-red2", "#f22f3e11"], + ["--t-color-transparent-red3", "#ff173f2d"], + ["--t-color-transparent-red4", "#fe0a3b44"], + ["--t-color-transparent-red5", "#ff204756"], + ["--t-color-transparent-red6", "#ff3e5668"], + ["--t-color-transparent-red7", "#ff536184"], + ["--t-color-transparent-red8", "#ff5d61b0"], + ["--t-color-transparent-red9", "#fe4e54e4"], + ["--t-color-transparent-red10", "#ff6465eb"], + ["--t-color-transparent-red11", "#ff9592"], + ["--t-color-transparent-red12", "#ffd1d9"], + ["--t-color-transparent-orange1", "#ec360007"], + ["--t-color-transparent-orange2", "#fe6d000e"], + ["--t-color-transparent-orange3", "#fb6a0025"], + ["--t-color-transparent-orange4", "#ff590039"], + ["--t-color-transparent-orange5", "#ff61004a"], + ["--t-color-transparent-orange6", "#fd75045c"], + ["--t-color-transparent-orange7", "#ff832c75"], + ["--t-color-transparent-orange8", "#fe84389d"], + ["--t-color-transparent-orange9", "#fe6d15f7"], + ["--t-color-transparent-orange10", "#ff801f"], + ["--t-color-transparent-orange11", "#ffa057"], + ["--t-color-transparent-orange12", "#ffe0c2"], + ["--t-color-transparent-yellow1", "#d1510004"], + ["--t-color-transparent-yellow2", "#f9b4000b"], + ["--t-color-transparent-yellow3", "#ffaa001e"], + ["--t-color-transparent-yellow4", "#fdb70028"], + ["--t-color-transparent-yellow5", "#febb0036"], + ["--t-color-transparent-yellow6", "#fec40046"], + ["--t-color-transparent-yellow7", "#fdcb225c"], + ["--t-color-transparent-yellow8", "#fdca327b"], + ["--t-color-transparent-yellow9", "#ffe629"], + ["--t-color-transparent-yellow10", "#ffff57"], + ["--t-color-transparent-yellow11", "#fee949f5"], + ["--t-color-transparent-yellow12", "#fef6baf6"], + ["--t-color-transparent-gray1", "color(display-p3 1 1 1 / 0.031)"], + ["--t-color-transparent-gray2", "color(display-p3 1 1 1 / 0.059)"], + ["--t-color-transparent-gray3", "color(display-p3 1 1 1 / 0.047)"], + ["--t-color-transparent-gray4", "color(display-p3 1 1 1 / 0.071)"], + ["--t-color-transparent-gray5", "color(display-p3 1 1 1 / 0.102)"], + ["--t-color-transparent-gray6", "color(display-p3 1 1 1 / 0.114)"], + ["--t-color-transparent-gray7", "color(display-p3 1 1 1 / 0.141)"], + ["--t-color-transparent-gray8", "color(display-p3 1 1 1 / 0.22)"], + ["--t-color-transparent-gray9", "color(display-p3 1 1 1 / 0.427)"], + ["--t-color-transparent-gray10", "color(display-p3 1 1 1 / 0.478)"], + ["--t-color-transparent-gray11", "color(display-p3 1 1 1 / 0.565)"], + ["--t-color-transparent-gray12", "color(display-p3 1 1 1 / 0.91)"], + ["--t-color-transparent-mauve1", "#00000000"], + ["--t-color-transparent-mauve2", "#f5f4f609"], + ["--t-color-transparent-mauve3", "#ebeaf814"], + ["--t-color-transparent-mauve4", "#eee5f81d"], + ["--t-color-transparent-mauve5", "#efe6fe25"], + ["--t-color-transparent-mauve6", "#f1e6fd30"], + ["--t-color-transparent-mauve7", "#eee9ff40"], + ["--t-color-transparent-mauve8", "#eee7ff5d"], + ["--t-color-transparent-mauve9", "#eae6fd6e"], + ["--t-color-transparent-mauve10", "#ece9fd7c"], + ["--t-color-transparent-mauve11", "#f5f1ffb7"], + ["--t-color-transparent-mauve12", "#fdfdffef"], + ["--t-color-transparent-slate1", "#00000000"], + ["--t-color-transparent-slate2", "#d8f4f609"], + ["--t-color-transparent-slate3", "#ddeaf814"], + ["--t-color-transparent-slate4", "#d3edf81d"], + ["--t-color-transparent-slate5", "#d9edfe25"], + ["--t-color-transparent-slate6", "#d6ebfd30"], + ["--t-color-transparent-slate7", "#d9edff40"], + ["--t-color-transparent-slate8", "#d9edff5d"], + ["--t-color-transparent-slate9", "#dfebfd6d"], + ["--t-color-transparent-slate10", "#e5edfd7b"], + ["--t-color-transparent-slate11", "#f1f7feb5"], + ["--t-color-transparent-slate12", "#fcfdffef"], + ["--t-color-transparent-sage1", "#00000000"], + ["--t-color-transparent-sage2", "#f0f2f108"], + ["--t-color-transparent-sage3", "#f3f5f412"], + ["--t-color-transparent-sage4", "#f2fefd1a"], + ["--t-color-transparent-sage5", "#f1fbfa22"], + ["--t-color-transparent-sage6", "#edfbf42d"], + ["--t-color-transparent-sage7", "#edfcf73c"], + ["--t-color-transparent-sage8", "#ebfdf657"], + ["--t-color-transparent-sage9", "#dffdf266"], + ["--t-color-transparent-sage10", "#e5fdf674"], + ["--t-color-transparent-sage11", "#f4fefbb0"], + ["--t-color-transparent-sage12", "#fdfffeed"], + ["--t-color-transparent-olive1", "#00000000"], + ["--t-color-transparent-olive2", "#f1f2f008"], + ["--t-color-transparent-olive3", "#f4f5f312"], + ["--t-color-transparent-olive4", "#f3fef21a"], + ["--t-color-transparent-olive5", "#f2fbf122"], + ["--t-color-transparent-olive6", "#f4faed2c"], + ["--t-color-transparent-olive7", "#f2fced3b"], + ["--t-color-transparent-olive8", "#edfdeb57"], + ["--t-color-transparent-olive9", "#ebfde766"], + ["--t-color-transparent-olive10", "#f0fdec74"], + ["--t-color-transparent-olive11", "#f6fef4b0"], + ["--t-color-transparent-olive12", "#fdfffded"], + ["--t-color-transparent-sand1", "#00000000"], + ["--t-color-transparent-sand2", "#f4f4f309"], + ["--t-color-transparent-sand3", "#f6f6f513"], + ["--t-color-transparent-sand4", "#fefef31b"], + ["--t-color-transparent-sand5", "#fbfbeb23"], + ["--t-color-transparent-sand6", "#fffaed2d"], + ["--t-color-transparent-sand7", "#fffbed3c"], + ["--t-color-transparent-sand8", "#fff9eb57"], + ["--t-color-transparent-sand9", "#fffae965"], + ["--t-color-transparent-sand10", "#fffdee73"], + ["--t-color-transparent-sand11", "#fffcf4b0"], + ["--t-color-transparent-sand12", "#fffffded"], + ["--t-color-transparent-tomato1", "#f1121208"], + ["--t-color-transparent-tomato2", "#ff55330f"], + ["--t-color-transparent-tomato3", "#ff35232b"], + ["--t-color-transparent-tomato4", "#fd201142"], + ["--t-color-transparent-tomato5", "#fe332153"], + ["--t-color-transparent-tomato6", "#ff4f3864"], + ["--t-color-transparent-tomato7", "#fd644a7d"], + ["--t-color-transparent-tomato8", "#fe6d4ea7"], + ["--t-color-transparent-tomato9", "#fe5431e4"], + ["--t-color-transparent-tomato10", "#ff6847eb"], + ["--t-color-transparent-tomato11", "#ff977d"], + ["--t-color-transparent-tomato12", "#ffd6cefb"], + ["--t-color-transparent-ruby1", "#f4124a09"], + ["--t-color-transparent-ruby2", "#fe5a7f0e"], + ["--t-color-transparent-ruby3", "#ff235d2c"], + ["--t-color-transparent-ruby4", "#fd195e42"], + ["--t-color-transparent-ruby5", "#fe2d6b53"], + ["--t-color-transparent-ruby6", "#ff447665"], + ["--t-color-transparent-ruby7", "#ff577d80"], + ["--t-color-transparent-ruby8", "#ff5c7cae"], + ["--t-color-transparent-ruby9", "#fe4c70e4"], + ["--t-color-transparent-ruby10", "#ff617beb"], + ["--t-color-transparent-ruby11", "#ff949d"], + ["--t-color-transparent-ruby12", "#ffd3e2fe"], + ["--t-color-transparent-crimson1", "#f4126709"], + ["--t-color-transparent-crimson2", "#f22f7a11"], + ["--t-color-transparent-crimson3", "#fe2a8b2a"], + ["--t-color-transparent-crimson4", "#fd158741"], + ["--t-color-transparent-crimson5", "#fd278f51"], + ["--t-color-transparent-crimson6", "#fe459763"], + ["--t-color-transparent-crimson7", "#fd559b7f"], + ["--t-color-transparent-crimson8", "#fe5b9bab"], + ["--t-color-transparent-crimson9", "#fe418de8"], + ["--t-color-transparent-crimson10", "#ff5693ed"], + ["--t-color-transparent-crimson11", "#ff92ad"], + ["--t-color-transparent-crimson12", "#ffd5eafd"], + ["--t-color-transparent-plum1", "#f112f108"], + ["--t-color-transparent-plum2", "#f22ff211"], + ["--t-color-transparent-plum3", "#fd4cfd27"], + ["--t-color-transparent-plum4", "#f646ff3a"], + ["--t-color-transparent-plum5", "#f455ff48"], + ["--t-color-transparent-plum6", "#f66dff56"], + ["--t-color-transparent-plum7", "#f07cfd70"], + ["--t-color-transparent-plum8", "#ee84ff95"], + ["--t-color-transparent-plum9", "#e961feb6"], + ["--t-color-transparent-plum10", "#ed70ffc0"], + ["--t-color-transparent-plum11", "#f19cfef3"], + ["--t-color-transparent-plum12", "#feddfef4"], + ["--t-color-transparent-violet1", "#4422ff0f"], + ["--t-color-transparent-violet2", "#853ff916"], + ["--t-color-transparent-violet3", "#8354fe36"], + ["--t-color-transparent-violet4", "#7d51fd50"], + ["--t-color-transparent-violet5", "#845ffd5f"], + ["--t-color-transparent-violet6", "#8f6cfd6d"], + ["--t-color-transparent-violet7", "#9879ff83"], + ["--t-color-transparent-violet8", "#977dfea8"], + ["--t-color-transparent-violet9", "#8668ffcc"], + ["--t-color-transparent-violet10", "#9176fed7"], + ["--t-color-transparent-violet11", "#baa7ff"], + ["--t-color-transparent-violet12", "#e3defffe"], + ["--t-color-transparent-iris1", "#3636fe0e"], + ["--t-color-transparent-iris2", "#564bf916"], + ["--t-color-transparent-iris3", "#525bff3b"], + ["--t-color-transparent-iris4", "#4d58ff5a"], + ["--t-color-transparent-iris5", "#5b62fd6b"], + ["--t-color-transparent-iris6", "#6d6ffd7a"], + ["--t-color-transparent-iris7", "#7777fe8e"], + ["--t-color-transparent-iris8", "#7b7afeac"], + ["--t-color-transparent-iris9", "#6a6afed4"], + ["--t-color-transparent-iris10", "#7d79ffdc"], + ["--t-color-transparent-iris11", "#b1a9ff"], + ["--t-color-transparent-iris12", "#e1e0fffe"], + ["--t-color-transparent-cyan1", "#0091f70a"], + ["--t-color-transparent-cyan2", "#02a7f211"], + ["--t-color-transparent-cyan3", "#00befd28"], + ["--t-color-transparent-cyan4", "#00baff3b"], + ["--t-color-transparent-cyan5", "#00befd4d"], + ["--t-color-transparent-cyan6", "#00c7fd5e"], + ["--t-color-transparent-cyan7", "#14cdff75"], + ["--t-color-transparent-cyan8", "#11cfff95"], + ["--t-color-transparent-cyan9", "#00cfffc3"], + ["--t-color-transparent-cyan10", "#28d6ffcd"], + ["--t-color-transparent-cyan11", "#52e1fee5"], + ["--t-color-transparent-cyan12", "#bbf3fef7"], + ["--t-color-transparent-jade1", "#00de4505"], + ["--t-color-transparent-jade2", "#27fba60c"], + ["--t-color-transparent-jade3", "#02f99920"], + ["--t-color-transparent-jade4", "#00ffaa2d"], + ["--t-color-transparent-jade5", "#11ffb63b"], + ["--t-color-transparent-jade6", "#34ffc24b"], + ["--t-color-transparent-jade7", "#45fdc75e"], + ["--t-color-transparent-jade8", "#48ffcf75"], + ["--t-color-transparent-jade9", "#38feca9d"], + ["--t-color-transparent-jade10", "#31fec7ab"], + ["--t-color-transparent-jade11", "#21fec0d6"], + ["--t-color-transparent-jade12", "#b8ffe1ef"], + ["--t-color-transparent-grass1", "#00de1205"], + ["--t-color-transparent-grass2", "#5ef7780a"], + ["--t-color-transparent-grass3", "#70fe8c1b"], + ["--t-color-transparent-grass4", "#57ff802c"], + ["--t-color-transparent-grass5", "#68ff8b3b"], + ["--t-color-transparent-grass6", "#71ff8f4b"], + ["--t-color-transparent-grass7", "#77fd925d"], + ["--t-color-transparent-grass8", "#77fd9070"], + ["--t-color-transparent-grass9", "#65ff82a1"], + ["--t-color-transparent-grass10", "#72ff8dae"], + ["--t-color-transparent-grass11", "#89ff9fcd"], + ["--t-color-transparent-grass12", "#ceffceef"], + ["--t-color-transparent-mint1", "#00dede05"], + ["--t-color-transparent-mint2", "#00f9f90b"], + ["--t-color-transparent-mint3", "#00fff61d"], + ["--t-color-transparent-mint4", "#00fff42c"], + ["--t-color-transparent-mint5", "#00fff23a"], + ["--t-color-transparent-mint6", "#0effeb4a"], + ["--t-color-transparent-mint7", "#34fde55e"], + ["--t-color-transparent-mint8", "#41ffdf76"], + ["--t-color-transparent-mint9", "#92ffe7e9"], + ["--t-color-transparent-mint10", "#aefeedf5"], + ["--t-color-transparent-mint11", "#67ffded2"], + ["--t-color-transparent-mint12", "#cbfee9f5"], + ["--t-color-transparent-lime1", "#11bb0003"], + ["--t-color-transparent-lime2", "#78f7000a"], + ["--t-color-transparent-lime3", "#9bfd4c1a"], + ["--t-color-transparent-lime4", "#a7fe5c29"], + ["--t-color-transparent-lime5", "#affe6537"], + ["--t-color-transparent-lime6", "#b2fe6d46"], + ["--t-color-transparent-lime7", "#b6ff6f57"], + ["--t-color-transparent-lime8", "#b6fd6d6c"], + ["--t-color-transparent-lime9", "#caff69ed"], + ["--t-color-transparent-lime10", "#d4ff70"], + ["--t-color-transparent-lime11", "#d1fe77e4"], + ["--t-color-transparent-lime12", "#e9febff7"], + ["--t-color-transparent-bronze1", "#d1110004"], + ["--t-color-transparent-bronze2", "#fbbc910c"], + ["--t-color-transparent-bronze3", "#faceb817"], + ["--t-color-transparent-bronze4", "#facdb622"], + ["--t-color-transparent-bronze5", "#ffd2c12d"], + ["--t-color-transparent-bronze6", "#ffd1c03c"], + ["--t-color-transparent-bronze7", "#fdd0c04f"], + ["--t-color-transparent-bronze8", "#ffd6c565"], + ["--t-color-transparent-bronze9", "#fec7b09b"], + ["--t-color-transparent-bronze10", "#fecab5a9"], + ["--t-color-transparent-bronze11", "#ffd7c6d1"], + ["--t-color-transparent-bronze12", "#fff1e9ec"], + ["--t-color-transparent-gold1", "#91911102"], + ["--t-color-transparent-gold2", "#f9e29d0b"], + ["--t-color-transparent-gold3", "#f8ecbb15"], + ["--t-color-transparent-gold4", "#ffeec41e"], + ["--t-color-transparent-gold5", "#feecc22a"], + ["--t-color-transparent-gold6", "#feebcb37"], + ["--t-color-transparent-gold7", "#ffedcd48"], + ["--t-color-transparent-gold8", "#fdeaca5f"], + ["--t-color-transparent-gold9", "#ffdba690"], + ["--t-color-transparent-gold10", "#fedfb09d"], + ["--t-color-transparent-gold11", "#fee7c6c8"], + ["--t-color-transparent-gold12", "#fef7ede7"], + ["--t-color-transparent-brown1", "#91110002"], + ["--t-color-transparent-brown2", "#fba67c0c"], + ["--t-color-transparent-brown3", "#fcb58c19"], + ["--t-color-transparent-brown4", "#fbbb8a24"], + ["--t-color-transparent-brown5", "#fcb88931"], + ["--t-color-transparent-brown6", "#fdba8741"], + ["--t-color-transparent-brown7", "#ffbb8856"], + ["--t-color-transparent-brown8", "#ffbe8773"], + ["--t-color-transparent-brown9", "#feb87da8"], + ["--t-color-transparent-brown10", "#ffc18cb3"], + ["--t-color-transparent-brown11", "#fed1aad9"], + ["--t-color-transparent-brown12", "#feecd4f2"], + ["--t-color-transparent-amber1", "#e63c0006"], + ["--t-color-transparent-amber2", "#fd9b000d"], + ["--t-color-transparent-amber3", "#fa820022"], + ["--t-color-transparent-amber4", "#fc820032"], + ["--t-color-transparent-amber5", "#fd8b0041"], + ["--t-color-transparent-amber6", "#fd9b0051"], + ["--t-color-transparent-amber7", "#ffab2567"], + ["--t-color-transparent-amber8", "#ffae3587"], + ["--t-color-transparent-amber9", "#ffc53d"], + ["--t-color-transparent-amber10", "#ffd60a"], + ["--t-color-transparent-amber11", "#ffca16"], + ["--t-color-transparent-amber12", "#ffe7b3"], +]; diff --git a/packages/twenty-ui/src/theme-constants/generated/themeLightCssVariableEntries.ts b/packages/twenty-ui/src/theme-constants/generated/themeLightCssVariableEntries.ts new file mode 100644 index 0000000000..aa39ac572e --- /dev/null +++ b/packages/twenty-ui/src/theme-constants/generated/themeLightCssVariableEntries.ts @@ -0,0 +1,1000 @@ +// Auto-generated by scripts/generateThemeConstants.ts — do not edit manually. +// Regenerate: npx tsx packages/twenty-ui/scripts/generateThemeConstants.ts + +// CSS custom properties don't work in media queries, so MOBILE_VIEWPORT +// must be a static number rather than a var(--...) reference. +export const MOBILE_VIEWPORT = 768; + +export const THEME_LIGHT_CSS_VARIABLE_ENTRIES: [string, string][] = [ + ["--t-icon-size-sm", "14"], + ["--t-icon-size-md", "16"], + ["--t-icon-size-lg", "20"], + ["--t-icon-size-xl", "24"], + ["--t-icon-stroke-sm", "1.6"], + ["--t-icon-stroke-md", "2"], + ["--t-icon-stroke-lg", "2.5"], + ["--t-modal-size-sm-width", "300px"], + ["--t-modal-size-md-width", "400px"], + ["--t-modal-size-lg-width", "53%"], + ["--t-modal-size-xl-width", "1200px"], + ["--t-modal-size-xl-height", "800px"], + ["--t-modal-size-fullscreen-width", "100dvw"], + ["--t-modal-size-fullscreen-height", "100dvh"], + ["--t-text-line-height-lg", "1.5"], + ["--t-text-line-height-md", "1.1"], + ["--t-text-icon-size-medium", "16"], + ["--t-text-icon-size-small", "14"], + ["--t-text-icon-strike-light", "1.6"], + ["--t-text-icon-strike-medium", "2"], + ["--t-text-icon-strike-bold", "2.5"], + ["--t-animation-duration-instant", "0.075"], + ["--t-animation-duration-fast", "0.15"], + ["--t-animation-duration-normal", "0.3"], + ["--t-animation-duration-slow", "1.5"], + ["--t-spacing-multiplicator", "4"], + ["--t-spacing-0", "0px"], + ["--t-spacing-1", "4px"], + ["--t-spacing-2", "8px"], + ["--t-spacing-3", "12px"], + ["--t-spacing-4", "16px"], + ["--t-spacing-5", "20px"], + ["--t-spacing-6", "24px"], + ["--t-spacing-7", "28px"], + ["--t-spacing-8", "32px"], + ["--t-spacing-9", "36px"], + ["--t-spacing-10", "40px"], + ["--t-spacing-11", "44px"], + ["--t-spacing-12", "48px"], + ["--t-spacing-13", "52px"], + ["--t-spacing-14", "56px"], + ["--t-spacing-15", "60px"], + ["--t-spacing-16", "64px"], + ["--t-spacing-17", "68px"], + ["--t-spacing-18", "72px"], + ["--t-spacing-19", "76px"], + ["--t-spacing-20", "80px"], + ["--t-spacing-21", "84px"], + ["--t-spacing-22", "88px"], + ["--t-spacing-23", "92px"], + ["--t-spacing-24", "96px"], + ["--t-spacing-25", "100px"], + ["--t-spacing-26", "104px"], + ["--t-spacing-27", "108px"], + ["--t-spacing-28", "112px"], + ["--t-spacing-29", "116px"], + ["--t-spacing-30", "120px"], + ["--t-spacing-31", "124px"], + ["--t-spacing-32", "128px"], + ["--t-spacing-0_5", "2px"], + ["--t-spacing-1_5", "6px"], + ["--t-between-siblings-gap", "2px"], + ["--t-table-horizontal-cell-margin", "8px"], + ["--t-table-checkbox-column-width", "32px"], + ["--t-table-horizontal-cell-padding", "8px"], + ["--t-right-drawer-width", "500px"], + ["--t-clickable-element-background-transition", "background 0.1s ease"], + ["--t-last-layer-z-index", "2147483647"], + ["--t-buttons-secondary-text-color", "color(display-p3 0.63 0.69 1)"], + ["--t-accent-primary", "color(display-p3 0.831 0.87 1)"], + ["--t-accent-secondary", "color(display-p3 0.831 0.87 1)"], + ["--t-accent-tertiary", "color(display-p3 0.933 0.948 0.992)"], + ["--t-accent-quaternary", "color(display-p3 0.971 0.977 0.998)"], + ["--t-accent-accent3570", "color(display-p3 0.569 0.639 0.916)"], + ["--t-accent-accent4060", "color(display-p3 0.569 0.639 0.916)"], + ["--t-accent-accent1", "color(display-p3 0.992 0.992 0.996)"], + ["--t-accent-accent2", "color(display-p3 0.971 0.977 0.998)"], + ["--t-accent-accent3", "color(display-p3 0.933 0.948 0.992)"], + ["--t-accent-accent4", "color(display-p3 0.885 0.914 1)"], + ["--t-accent-accent5", "color(display-p3 0.831 0.87 1)"], + ["--t-accent-accent6", "color(display-p3 0.767 0.814 0.995)"], + ["--t-accent-accent7", "color(display-p3 0.685 0.74 0.957)"], + ["--t-accent-accent8", "color(display-p3 0.569 0.639 0.916)"], + ["--t-accent-accent9", "color(display-p3 0.276 0.384 0.837)"], + ["--t-accent-accent10", "color(display-p3 0.234 0.343 0.801)"], + ["--t-accent-accent11", "color(display-p3 0.256 0.354 0.755)"], + ["--t-accent-accent12", "color(display-p3 0.133 0.175 0.348)"], + ["--t-background-noisy", "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIYAAABQCAIAAABTfJr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAF0WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuOWNjYzRkZTkzLCAyMDIyLzAzLzE0LTE0OjA3OjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjMuMyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDctMThUMTI6MjY6MzQrMDI6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTA3LTE4VDEyOjI4OjMyKzAyOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTA3LTE4VDEyOjI4OjMyKzAyOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDphZWU5ZDg2OC04OWRmLTRiMDAtYWQ5ZS0zZDQyMTJjZjNhM2UiIHhtcE1NOkRvY3VtZW50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);"], + ["--t-background-primary", "color(display-p3 1 1 1)"], + ["--t-background-secondary", "color(display-p3 0.988 0.988 0.988)"], + ["--t-background-tertiary", "color(display-p3 0.945 0.945 0.945)"], + ["--t-background-quaternary", "color(display-p3 0.922 0.922 0.922)"], + ["--t-background-inverted-primary", "color(display-p3 0.2 0.2 0.2)"], + ["--t-background-inverted-secondary", "color(display-p3 0.4 0.4 0.4)"], + ["--t-background-danger", "color(display-p3 0.985 0.925 0.925)"], + ["--t-background-transparent-primary", "color(display-p3 1 1 1 / 0.5)"], + ["--t-background-transparent-secondary", "color(display-p3 1 1 1 / 0.4)"], + ["--t-background-transparent-strong", "color(display-p3 0 0 0 / 0.161)"], + ["--t-background-transparent-medium", "color(display-p3 0 0 0 / 0.078)"], + ["--t-background-transparent-light", "color(display-p3 0 0 0 / 0.039)"], + ["--t-background-transparent-lighter", "color(display-p3 0 0 0 / 0.02)"], + ["--t-background-transparent-danger", "#f3000d14"], + ["--t-background-transparent-blue", "#0047f112"], + ["--t-background-transparent-orange", "#ff9c0029"], + ["--t-background-transparent-success", "#00a43319"], + ["--t-background-overlay-primary", "color(display-p3 0 0 0 / 0.722)"], + ["--t-background-overlay-secondary", "color(display-p3 0 0 0 / 0.361)"], + ["--t-background-overlay-tertiary", "color(display-p3 0 0 0 / 0.071)"], + ["--t-background-radial-gradient", "radial-gradient(50% 62.62% at 50% 0%, color(display-p3 0.6 0.6 0.6) 0%, color(display-p3 0.514 0.514 0.514) 100%)"], + ["--t-background-radial-gradient-hover", "radial-gradient(76.32% 95.59% at 50% 0%, color(display-p3 0.514 0.514 0.514) 0%, color(display-p3 0.4 0.4 0.4) 100%)"], + ["--t-background-primary-inverted", "color(display-p3 0.2 0.2 0.2)"], + ["--t-background-primary-inverted-hover", "color(display-p3 0.4 0.4 0.4)"], + ["--t-blur-light", "blur(6px) saturate(200%) contrast(50%) brightness(130%)"], + ["--t-blur-medium", "blur(12px) saturate(200%) contrast(50%) brightness(130%)"], + ["--t-blur-strong", "blur(20px) saturate(200%) contrast(50%) brightness(130%)"], + ["--t-border-color-strong", "color(display-p3 0.839 0.839 0.839)"], + ["--t-border-color-medium", "color(display-p3 0.922 0.922 0.922)"], + ["--t-border-color-light", "color(display-p3 0.945 0.945 0.945)"], + ["--t-border-color-secondary-inverted", "color(display-p3 0.4 0.4 0.4)"], + ["--t-border-color-inverted", "color(display-p3 0.2 0.2 0.2)"], + ["--t-border-color-danger", "color(display-p3 0.984 0.812 0.811)"], + ["--t-border-color-blue", "color(display-p3 0.685 0.74 0.957)"], + ["--t-border-color-transparent-strong", "color(display-p3 0 0 0 / 0.071)"], + ["--t-border-radius-xs", "2px"], + ["--t-border-radius-sm", "4px"], + ["--t-border-radius-md", "8px"], + ["--t-border-radius-xl", "20px"], + ["--t-border-radius-xxl", "40px"], + ["--t-border-radius-pill", "999px"], + ["--t-border-radius-rounded", "100%"], + ["--t-box-shadow-color", "color(display-p3 0 0 0 / 0.039)"], + ["--t-box-shadow-light", "0px 2px 4px 0px color(display-p3 0 0 0 / 0.039), 0px 0px 4px 0px color(display-p3 0 0 0 / 0.078)"], + ["--t-box-shadow-strong", "2px 4px 16px 0px color(display-p3 0 0 0 / 0.161), 0px 2px 4px 0px color(display-p3 0 0 0 / 0.078)"], + ["--t-box-shadow-underline", "0px 1px 0px 0px color(display-p3 0 0 0 / 0.361)"], + ["--t-box-shadow-super-heavy", "0px 0px 8px 0px color(display-p3 0 0 0 / 0.161), 0px 8px 64px -16px color(display-p3 0 0 0 / 0.478), 0px 24px 56px -16px color(display-p3 0 0 0 / 0.078)"], + ["--t-font-color-primary", "color(display-p3 0.2 0.2 0.2)"], + ["--t-font-color-secondary", "color(display-p3 0.4 0.4 0.4)"], + ["--t-font-color-tertiary", "color(display-p3 0.6 0.6 0.6)"], + ["--t-font-color-light", "color(display-p3 0.702 0.702 0.702)"], + ["--t-font-color-extra-light", "color(display-p3 0.8 0.8 0.8)"], + ["--t-font-color-inverted", "color(display-p3 1 1 1)"], + ["--t-font-color-danger", "color(display-p3 0.83 0.329 0.324)"], + ["--t-font-size-xxs", "0.625rem"], + ["--t-font-size-xs", "0.85rem"], + ["--t-font-size-sm", "0.92rem"], + ["--t-font-size-md", "1rem"], + ["--t-font-size-lg", "1.23rem"], + ["--t-font-size-xl", "1.54rem"], + ["--t-font-size-xxl", "1.85rem"], + ["--t-font-weight-regular", "400"], + ["--t-font-weight-medium", "500"], + ["--t-font-weight-semi-bold", "600"], + ["--t-font-family", "Inter, sans-serif"], + ["--t-name", "light"], + ["--t-snack-bar-success-color", "color(display-p3 0.297 0.637 0.581)"], + ["--t-snack-bar-success-background-color", "#00a43319"], + ["--t-snack-bar-error-color", "color(display-p3 0.83 0.329 0.324)"], + ["--t-snack-bar-error-background-color", "#f3000d14"], + ["--t-snack-bar-warning-color", "color(display-p3 0.9 0.45 0.2)"], + ["--t-snack-bar-warning-background-color", "#ff9c0029"], + ["--t-snack-bar-info-color", "color(display-p3 0.276 0.384 0.837)"], + ["--t-snack-bar-info-background-color", "#0047f112"], + ["--t-snack-bar-default-color", "color(display-p3 0.2 0.2 0.2)"], + ["--t-snack-bar-default-background-color", "color(display-p3 0 0 0 / 0.039)"], + ["--t-tag-text-gray", "color(display-p3 0.4 0.4 0.4)"], + ["--t-tag-text-mauve", "color(display-p3 0.395 0.388 0.424)"], + ["--t-tag-text-slate", "color(display-p3 0.379 0.392 0.421)"], + ["--t-tag-text-sage", "color(display-p3 0.377 0.395 0.389)"], + ["--t-tag-text-olive", "color(display-p3 0.38 0.395 0.374)"], + ["--t-tag-text-sand", "color(display-p3 0.388 0.388 0.37)"], + ["--t-tag-text-tomato", "color(display-p3 0.755 0.259 0.152)"], + ["--t-tag-text-red", "color(display-p3 0.744 0.234 0.222)"], + ["--t-tag-text-ruby", "color(display-p3 0.728 0.211 0.311)"], + ["--t-tag-text-crimson", "color(display-p3 0.731 0.195 0.388)"], + ["--t-tag-text-pink", "color(display-p3 0.698 0.219 0.528)"], + ["--t-tag-text-plum", "color(display-p3 0.543 0.263 0.619)"], + ["--t-tag-text-purple", "color(display-p3 0.473 0.281 0.687)"], + ["--t-tag-text-violet", "color(display-p3 0.383 0.317 0.702)"], + ["--t-tag-text-iris", "color(display-p3 0.337 0.326 0.748)"], + ["--t-tag-text-cyan", "color(display-p3 0.08 0.48 0.63)"], + ["--t-tag-text-turquoise", "color(display-p3 0.08 0.5 0.43)"], + ["--t-tag-text-sky", "color(display-p3 0.193 0.448 0.605)"], + ["--t-tag-text-blue", "color(display-p3 0.256 0.354 0.755)"], + ["--t-tag-text-jade", "color(display-p3 0.15 0.5 0.37)"], + ["--t-tag-text-green", "color(display-p3 0.19 0.5 0.32)"], + ["--t-tag-text-grass", "color(display-p3 0.263 0.488 0.261)"], + ["--t-tag-text-mint", "color(display-p3 0.203 0.463 0.397)"], + ["--t-tag-text-lime", "color(display-p3 0.386 0.482 0.227)"], + ["--t-tag-text-bronze", "color(display-p3 0.471 0.373 0.336)"], + ["--t-tag-text-gold", "color(display-p3 0.433 0.386 0.305)"], + ["--t-tag-text-brown", "color(display-p3 0.485 0.374 0.288)"], + ["--t-tag-text-orange", "color(display-p3 0.76 0.34 0)"], + ["--t-tag-text-amber", "color(display-p3 0.64 0.4 0)"], + ["--t-tag-text-yellow", "color(display-p3 0.6 0.44 0)"], + ["--t-tag-background-gray", "color(display-p3 0.976 0.976 0.976)"], + ["--t-tag-background-mauve", "color(display-p3 0.946 0.938 0.952)"], + ["--t-tag-background-slate", "color(display-p3 0.94 0.941 0.953)"], + ["--t-tag-background-sage", "color(display-p3 0.935 0.944 0.94)"], + ["--t-tag-background-olive", "color(display-p3 0.939 0.945 0.937)"], + ["--t-tag-background-sand", "color(display-p3 0.943 0.942 0.936)"], + ["--t-tag-background-tomato", "color(display-p3 0.985 0.924 0.909)"], + ["--t-tag-background-red", "color(display-p3 0.985 0.925 0.925)"], + ["--t-tag-background-ruby", "color(display-p3 0.983 0.92 0.928)"], + ["--t-tag-background-crimson", "color(display-p3 0.987 0.917 0.941)"], + ["--t-tag-background-pink", "color(display-p3 0.981 0.917 0.96)"], + ["--t-tag-background-plum", "color(display-p3 0.973 0.923 0.98)"], + ["--t-tag-background-purple", "color(display-p3 0.963 0.931 0.989)"], + ["--t-tag-background-violet", "color(display-p3 0.953 0.943 0.993)"], + ["--t-tag-background-iris", "color(display-p3 0.943 0.945 0.992)"], + ["--t-tag-background-cyan", "color(display-p3 0.888 0.965 0.975)"], + ["--t-tag-background-turquoise", "color(display-p3 0.895 0.971 0.952)"], + ["--t-tag-background-sky", "color(display-p3 0.899 0.963 0.989)"], + ["--t-tag-background-blue", "color(display-p3 0.933 0.948 0.992)"], + ["--t-tag-background-jade", "color(display-p3 0.912 0.965 0.932)"], + ["--t-tag-background-green", "color(display-p3 0.913 0.964 0.925)"], + ["--t-tag-background-grass", "color(display-p3 0.923 0.965 0.917)"], + ["--t-tag-background-mint", "color(display-p3 0.888 0.972 0.95)"], + ["--t-tag-background-lime", "color(display-p3 0.939 0.965 0.851)"], + ["--t-tag-background-bronze", "color(display-p3 0.958 0.932 0.919)"], + ["--t-tag-background-gold", "color(display-p3 0.947 0.94 0.909)"], + ["--t-tag-background-brown", "color(display-p3 0.959 0.936 0.909)"], + ["--t-tag-background-orange", "color(display-p3 0.989 0.938 0.85)"], + ["--t-tag-background-amber", "color(display-p3 0.994 0.969 0.782)"], + ["--t-tag-background-yellow", "color(display-p3 0.997 0.982 0.749)"], + ["--t-code-text-gray", "color(display-p3 0.514 0.514 0.514)"], + ["--t-code-text-sky", "color(display-p3 0.555 0.845 0.959)"], + ["--t-code-text-pink", "color(display-p3 0.748 0.27 0.581)"], + ["--t-code-text-orange", "color(display-p3 0.877 0.597 0.379)"], + ["--t-code-text-green", "color(display-p3 0.585 0.707 0.378)"], + ["--t-code-font-family", "DM Mono"], + ["--t--illustration-icon-color-blue", "color(display-p3 0.569 0.639 0.916)"], + ["--t--illustration-icon-color-gray", "color(display-p3 0.6 0.6 0.6)"], + ["--t--illustration-icon-fill-blue", "color(display-p3 0.831 0.87 1)"], + ["--t--illustration-icon-fill-gray", "color(display-p3 0.922 0.922 0.922)"], + ["--t-gray-scale-gray1", "color(display-p3 1 1 1)"], + ["--t-gray-scale-gray2", "color(display-p3 0.988 0.988 0.988)"], + ["--t-gray-scale-gray3", "color(display-p3 0.976 0.976 0.976)"], + ["--t-gray-scale-gray4", "color(display-p3 0.945 0.945 0.945)"], + ["--t-gray-scale-gray5", "color(display-p3 0.922 0.922 0.922)"], + ["--t-gray-scale-gray6", "color(display-p3 0.839 0.839 0.839)"], + ["--t-gray-scale-gray7", "color(display-p3 0.8 0.8 0.8)"], + ["--t-gray-scale-gray8", "color(display-p3 0.702 0.702 0.702)"], + ["--t-gray-scale-gray9", "color(display-p3 0.6 0.6 0.6)"], + ["--t-gray-scale-gray10", "color(display-p3 0.514 0.514 0.514)"], + ["--t-gray-scale-gray11", "color(display-p3 0.4 0.4 0.4)"], + ["--t-gray-scale-gray12", "color(display-p3 0.2 0.2 0.2)"], + ["--t-color-red", "color(display-p3 0.83 0.329 0.324)"], + ["--t-color-ruby", "color(display-p3 0.83 0.323 0.408)"], + ["--t-color-crimson", "color(display-p3 0.843 0.298 0.507)"], + ["--t-color-tomato", "color(display-p3 0.831 0.345 0.231)"], + ["--t-color-orange", "color(display-p3 0.9 0.45 0.2)"], + ["--t-color-amber", "color(display-p3 1 0.77 0.26)"], + ["--t-color-yellow", "color(display-p3 1 0.92 0.22)"], + ["--t-color-lime", "color(display-p3 0.78 0.928 0.466)"], + ["--t-color-grass", "color(display-p3 0.38 0.647 0.378)"], + ["--t-color-green", "color(display-p3 0.332 0.634 0.442)"], + ["--t-color-jade", "color(display-p3 0.319 0.63 0.521)"], + ["--t-color-mint", "color(display-p3 0.62 0.908 0.834)"], + ["--t-color-turquoise", "color(display-p3 0.297 0.637 0.581)"], + ["--t-color-cyan", "color(display-p3 0.282 0.627 0.765)"], + ["--t-color-sky", "color(display-p3 0.585 0.877 0.983)"], + ["--t-color-blue", "color(display-p3 0.276 0.384 0.837)"], + ["--t-color-iris", "color(display-p3 0.357 0.357 0.81)"], + ["--t-color-violet", "color(display-p3 0.417 0.341 0.784)"], + ["--t-color-purple", "color(display-p3 0.523 0.318 0.751)"], + ["--t-color-plum", "color(display-p3 0.624 0.313 0.708)"], + ["--t-color-pink", "color(display-p3 0.775 0.297 0.61)"], + ["--t-color-bronze", "color(display-p3 0.611 0.507 0.455)"], + ["--t-color-gold", "color(display-p3 0.579 0.517 0.41)"], + ["--t-color-brown", "color(display-p3 0.651 0.505 0.368)"], + ["--t-color-gray", "color(display-p3 0.6 0.6 0.6)"], + ["--t-color-yellow1", "color(display-p3 0.992 0.992 0.978)"], + ["--t-color-yellow2", "color(display-p3 0.995 0.99 0.922)"], + ["--t-color-yellow3", "color(display-p3 0.997 0.982 0.749)"], + ["--t-color-yellow4", "color(display-p3 0.992 0.953 0.627)"], + ["--t-color-yellow5", "color(display-p3 0.984 0.91 0.51)"], + ["--t-color-yellow6", "color(display-p3 0.934 0.847 0.474)"], + ["--t-color-yellow7", "color(display-p3 0.876 0.785 0.46)"], + ["--t-color-yellow8", "color(display-p3 0.811 0.689 0.313)"], + ["--t-color-yellow9", "color(display-p3 1 0.92 0.22)"], + ["--t-color-yellow10", "color(display-p3 0.977 0.868 0.291)"], + ["--t-color-yellow11", "color(display-p3 0.6 0.44 0)"], + ["--t-color-yellow12", "color(display-p3 0.271 0.233 0.137)"], + ["--t-color-green1", "color(display-p3 0.986 0.996 0.989)"], + ["--t-color-green2", "color(display-p3 0.963 0.983 0.967)"], + ["--t-color-green3", "color(display-p3 0.913 0.964 0.925)"], + ["--t-color-green4", "color(display-p3 0.859 0.94 0.879)"], + ["--t-color-green5", "color(display-p3 0.796 0.907 0.826)"], + ["--t-color-green6", "color(display-p3 0.718 0.863 0.761)"], + ["--t-color-green7", "color(display-p3 0.61 0.801 0.675)"], + ["--t-color-green8", "color(display-p3 0.451 0.715 0.559)"], + ["--t-color-green9", "color(display-p3 0.332 0.634 0.442)"], + ["--t-color-green10", "color(display-p3 0.308 0.595 0.417)"], + ["--t-color-green11", "color(display-p3 0.19 0.5 0.32)"], + ["--t-color-green12", "color(display-p3 0.132 0.228 0.18)"], + ["--t-color-turquoise1", "color(display-p3 0.983 0.996 0.992)"], + ["--t-color-turquoise2", "color(display-p3 0.958 0.983 0.976)"], + ["--t-color-turquoise3", "color(display-p3 0.895 0.971 0.952)"], + ["--t-color-turquoise4", "color(display-p3 0.831 0.949 0.92)"], + ["--t-color-turquoise5", "color(display-p3 0.761 0.914 0.878)"], + ["--t-color-turquoise6", "color(display-p3 0.682 0.864 0.825)"], + ["--t-color-turquoise7", "color(display-p3 0.581 0.798 0.756)"], + ["--t-color-turquoise8", "color(display-p3 0.433 0.716 0.671)"], + ["--t-color-turquoise9", "color(display-p3 0.297 0.637 0.581)"], + ["--t-color-turquoise10", "color(display-p3 0.275 0.599 0.542)"], + ["--t-color-turquoise11", "color(display-p3 0.08 0.5 0.43)"], + ["--t-color-turquoise12", "color(display-p3 0.11 0.235 0.219)"], + ["--t-color-sky1", "color(display-p3 0.98 0.995 0.999)"], + ["--t-color-sky2", "color(display-p3 0.953 0.98 0.99)"], + ["--t-color-sky3", "color(display-p3 0.899 0.963 0.989)"], + ["--t-color-sky4", "color(display-p3 0.842 0.937 0.977)"], + ["--t-color-sky5", "color(display-p3 0.777 0.9 0.954)"], + ["--t-color-sky6", "color(display-p3 0.701 0.851 0.921)"], + ["--t-color-sky7", "color(display-p3 0.604 0.785 0.879)"], + ["--t-color-sky8", "color(display-p3 0.457 0.696 0.829)"], + ["--t-color-sky9", "color(display-p3 0.585 0.877 0.983)"], + ["--t-color-sky10", "color(display-p3 0.555 0.845 0.959)"], + ["--t-color-sky11", "color(display-p3 0.193 0.448 0.605)"], + ["--t-color-sky12", "color(display-p3 0.145 0.241 0.329)"], + ["--t-color-blue1", "color(display-p3 0.992 0.992 0.996)"], + ["--t-color-blue2", "color(display-p3 0.971 0.977 0.998)"], + ["--t-color-blue3", "color(display-p3 0.933 0.948 0.992)"], + ["--t-color-blue4", "color(display-p3 0.885 0.914 1)"], + ["--t-color-blue5", "color(display-p3 0.831 0.87 1)"], + ["--t-color-blue6", "color(display-p3 0.767 0.814 0.995)"], + ["--t-color-blue7", "color(display-p3 0.685 0.74 0.957)"], + ["--t-color-blue8", "color(display-p3 0.569 0.639 0.916)"], + ["--t-color-blue9", "color(display-p3 0.276 0.384 0.837)"], + ["--t-color-blue10", "color(display-p3 0.234 0.343 0.801)"], + ["--t-color-blue11", "color(display-p3 0.256 0.354 0.755)"], + ["--t-color-blue12", "color(display-p3 0.133 0.175 0.348)"], + ["--t-color-purple1", "color(display-p3 0.995 0.988 0.996)"], + ["--t-color-purple2", "color(display-p3 0.983 0.971 0.993)"], + ["--t-color-purple3", "color(display-p3 0.963 0.931 0.989)"], + ["--t-color-purple4", "color(display-p3 0.937 0.888 0.981)"], + ["--t-color-purple5", "color(display-p3 0.904 0.837 0.966)"], + ["--t-color-purple6", "color(display-p3 0.86 0.774 0.942)"], + ["--t-color-purple7", "color(display-p3 0.799 0.69 0.91)"], + ["--t-color-purple8", "color(display-p3 0.719 0.583 0.874)"], + ["--t-color-purple9", "color(display-p3 0.523 0.318 0.751)"], + ["--t-color-purple10", "color(display-p3 0.483 0.289 0.7)"], + ["--t-color-purple11", "color(display-p3 0.473 0.281 0.687)"], + ["--t-color-purple12", "color(display-p3 0.234 0.132 0.363)"], + ["--t-color-pink1", "color(display-p3 0.998 0.989 0.996)"], + ["--t-color-pink2", "color(display-p3 0.992 0.97 0.985)"], + ["--t-color-pink3", "color(display-p3 0.981 0.917 0.96)"], + ["--t-color-pink4", "color(display-p3 0.963 0.867 0.932)"], + ["--t-color-pink5", "color(display-p3 0.939 0.815 0.899)"], + ["--t-color-pink6", "color(display-p3 0.907 0.756 0.859)"], + ["--t-color-pink7", "color(display-p3 0.869 0.683 0.81)"], + ["--t-color-pink8", "color(display-p3 0.825 0.59 0.751)"], + ["--t-color-pink9", "color(display-p3 0.775 0.297 0.61)"], + ["--t-color-pink10", "color(display-p3 0.748 0.27 0.581)"], + ["--t-color-pink11", "color(display-p3 0.698 0.219 0.528)"], + ["--t-color-pink12", "color(display-p3 0.363 0.101 0.279)"], + ["--t-color-red1", "color(display-p3 0.998 0.989 0.988)"], + ["--t-color-red2", "color(display-p3 0.995 0.971 0.971)"], + ["--t-color-red3", "color(display-p3 0.985 0.925 0.925)"], + ["--t-color-red4", "color(display-p3 0.999 0.866 0.866)"], + ["--t-color-red5", "color(display-p3 0.984 0.812 0.811)"], + ["--t-color-red6", "color(display-p3 0.955 0.751 0.749)"], + ["--t-color-red7", "color(display-p3 0.915 0.675 0.672)"], + ["--t-color-red8", "color(display-p3 0.872 0.575 0.572)"], + ["--t-color-red9", "color(display-p3 0.83 0.329 0.324)"], + ["--t-color-red10", "color(display-p3 0.798 0.294 0.285)"], + ["--t-color-red11", "color(display-p3 0.744 0.234 0.222)"], + ["--t-color-red12", "color(display-p3 0.36 0.115 0.143)"], + ["--t-color-orange1", "color(display-p3 0.995 0.988 0.985)"], + ["--t-color-orange2", "color(display-p3 0.994 0.968 0.934)"], + ["--t-color-orange3", "color(display-p3 0.989 0.938 0.85)"], + ["--t-color-orange4", "color(display-p3 1 0.874 0.687)"], + ["--t-color-orange5", "color(display-p3 1 0.821 0.583)"], + ["--t-color-orange6", "color(display-p3 0.975 0.767 0.545)"], + ["--t-color-orange7", "color(display-p3 0.919 0.693 0.486)"], + ["--t-color-orange8", "color(display-p3 0.877 0.597 0.379)"], + ["--t-color-orange9", "color(display-p3 0.9 0.45 0.2)"], + ["--t-color-orange10", "color(display-p3 0.87 0.409 0.164)"], + ["--t-color-orange11", "color(display-p3 0.76 0.34 0)"], + ["--t-color-orange12", "color(display-p3 0.323 0.185 0.127)"], + ["--t-color-gray1", "color(display-p3 1 1 1)"], + ["--t-color-gray2", "color(display-p3 0.988 0.988 0.988)"], + ["--t-color-gray3", "color(display-p3 0.976 0.976 0.976)"], + ["--t-color-gray4", "color(display-p3 0.945 0.945 0.945)"], + ["--t-color-gray5", "color(display-p3 0.922 0.922 0.922)"], + ["--t-color-gray6", "color(display-p3 0.839 0.839 0.839)"], + ["--t-color-gray7", "color(display-p3 0.8 0.8 0.8)"], + ["--t-color-gray8", "color(display-p3 0.702 0.702 0.702)"], + ["--t-color-gray9", "color(display-p3 0.6 0.6 0.6)"], + ["--t-color-gray10", "color(display-p3 0.514 0.514 0.514)"], + ["--t-color-gray11", "color(display-p3 0.4 0.4 0.4)"], + ["--t-color-gray12", "color(display-p3 0.2 0.2 0.2)"], + ["--t-color-mauve1", "color(display-p3 0.991 0.988 0.992)"], + ["--t-color-mauve2", "color(display-p3 0.98 0.976 0.984)"], + ["--t-color-mauve3", "color(display-p3 0.946 0.938 0.952)"], + ["--t-color-mauve4", "color(display-p3 0.915 0.906 0.925)"], + ["--t-color-mauve5", "color(display-p3 0.886 0.876 0.901)"], + ["--t-color-mauve6", "color(display-p3 0.856 0.846 0.875)"], + ["--t-color-mauve7", "color(display-p3 0.814 0.804 0.84)"], + ["--t-color-mauve8", "color(display-p3 0.735 0.728 0.777)"], + ["--t-color-mauve9", "color(display-p3 0.555 0.549 0.596)"], + ["--t-color-mauve10", "color(display-p3 0.514 0.508 0.552)"], + ["--t-color-mauve11", "color(display-p3 0.395 0.388 0.424)"], + ["--t-color-mauve12", "color(display-p3 0.128 0.122 0.147)"], + ["--t-color-slate1", "color(display-p3 0.988 0.988 0.992)"], + ["--t-color-slate2", "color(display-p3 0.976 0.976 0.984)"], + ["--t-color-slate3", "color(display-p3 0.94 0.941 0.953)"], + ["--t-color-slate4", "color(display-p3 0.908 0.909 0.925)"], + ["--t-color-slate5", "color(display-p3 0.88 0.881 0.901)"], + ["--t-color-slate6", "color(display-p3 0.85 0.852 0.876)"], + ["--t-color-slate7", "color(display-p3 0.805 0.808 0.838)"], + ["--t-color-slate8", "color(display-p3 0.727 0.733 0.773)"], + ["--t-color-slate9", "color(display-p3 0.547 0.553 0.592)"], + ["--t-color-slate10", "color(display-p3 0.503 0.512 0.549)"], + ["--t-color-slate11", "color(display-p3 0.379 0.392 0.421)"], + ["--t-color-slate12", "color(display-p3 0.113 0.125 0.14)"], + ["--t-color-sage1", "color(display-p3 0.986 0.992 0.988)"], + ["--t-color-sage2", "color(display-p3 0.97 0.977 0.974)"], + ["--t-color-sage3", "color(display-p3 0.935 0.944 0.94)"], + ["--t-color-sage4", "color(display-p3 0.904 0.913 0.909)"], + ["--t-color-sage5", "color(display-p3 0.875 0.885 0.88)"], + ["--t-color-sage6", "color(display-p3 0.844 0.854 0.849)"], + ["--t-color-sage7", "color(display-p3 0.8 0.811 0.806)"], + ["--t-color-sage8", "color(display-p3 0.725 0.738 0.732)"], + ["--t-color-sage9", "color(display-p3 0.531 0.556 0.546)"], + ["--t-color-sage10", "color(display-p3 0.492 0.515 0.506)"], + ["--t-color-sage11", "color(display-p3 0.377 0.395 0.389)"], + ["--t-color-sage12", "color(display-p3 0.107 0.129 0.118)"], + ["--t-color-olive1", "color(display-p3 0.989 0.992 0.989)"], + ["--t-color-olive2", "color(display-p3 0.974 0.98 0.973)"], + ["--t-color-olive3", "color(display-p3 0.939 0.945 0.937)"], + ["--t-color-olive4", "color(display-p3 0.907 0.914 0.905)"], + ["--t-color-olive5", "color(display-p3 0.878 0.885 0.875)"], + ["--t-color-olive6", "color(display-p3 0.846 0.855 0.843)"], + ["--t-color-olive7", "color(display-p3 0.803 0.812 0.8)"], + ["--t-color-olive8", "color(display-p3 0.727 0.738 0.723)"], + ["--t-color-olive9", "color(display-p3 0.541 0.556 0.532)"], + ["--t-color-olive10", "color(display-p3 0.5 0.515 0.491)"], + ["--t-color-olive11", "color(display-p3 0.38 0.395 0.374)"], + ["--t-color-olive12", "color(display-p3 0.117 0.129 0.111)"], + ["--t-color-sand1", "color(display-p3 0.992 0.992 0.989)"], + ["--t-color-sand2", "color(display-p3 0.977 0.977 0.973)"], + ["--t-color-sand3", "color(display-p3 0.943 0.942 0.936)"], + ["--t-color-sand4", "color(display-p3 0.913 0.912 0.903)"], + ["--t-color-sand5", "color(display-p3 0.885 0.883 0.873)"], + ["--t-color-sand6", "color(display-p3 0.854 0.852 0.839)"], + ["--t-color-sand7", "color(display-p3 0.813 0.81 0.794)"], + ["--t-color-sand8", "color(display-p3 0.738 0.734 0.713)"], + ["--t-color-sand9", "color(display-p3 0.553 0.553 0.528)"], + ["--t-color-sand10", "color(display-p3 0.511 0.511 0.488)"], + ["--t-color-sand11", "color(display-p3 0.388 0.388 0.37)"], + ["--t-color-sand12", "color(display-p3 0.129 0.126 0.111)"], + ["--t-color-tomato1", "color(display-p3 0.998 0.989 0.988)"], + ["--t-color-tomato2", "color(display-p3 0.994 0.974 0.969)"], + ["--t-color-tomato3", "color(display-p3 0.985 0.924 0.909)"], + ["--t-color-tomato4", "color(display-p3 0.996 0.868 0.835)"], + ["--t-color-tomato5", "color(display-p3 0.98 0.812 0.77)"], + ["--t-color-tomato6", "color(display-p3 0.953 0.75 0.698)"], + ["--t-color-tomato7", "color(display-p3 0.917 0.673 0.611)"], + ["--t-color-tomato8", "color(display-p3 0.875 0.575 0.502)"], + ["--t-color-tomato9", "color(display-p3 0.831 0.345 0.231)"], + ["--t-color-tomato10", "color(display-p3 0.802 0.313 0.2)"], + ["--t-color-tomato11", "color(display-p3 0.755 0.259 0.152)"], + ["--t-color-tomato12", "color(display-p3 0.335 0.165 0.132)"], + ["--t-color-ruby1", "color(display-p3 0.998 0.989 0.992)"], + ["--t-color-ruby2", "color(display-p3 0.995 0.971 0.974)"], + ["--t-color-ruby3", "color(display-p3 0.983 0.92 0.928)"], + ["--t-color-ruby4", "color(display-p3 0.987 0.869 0.885)"], + ["--t-color-ruby5", "color(display-p3 0.968 0.817 0.839)"], + ["--t-color-ruby6", "color(display-p3 0.937 0.758 0.786)"], + ["--t-color-ruby7", "color(display-p3 0.897 0.685 0.721)"], + ["--t-color-ruby8", "color(display-p3 0.851 0.588 0.639)"], + ["--t-color-ruby9", "color(display-p3 0.83 0.323 0.408)"], + ["--t-color-ruby10", "color(display-p3 0.795 0.286 0.375)"], + ["--t-color-ruby11", "color(display-p3 0.728 0.211 0.311)"], + ["--t-color-ruby12", "color(display-p3 0.36 0.115 0.171)"], + ["--t-color-crimson1", "color(display-p3 0.998 0.989 0.992)"], + ["--t-color-crimson2", "color(display-p3 0.991 0.969 0.976)"], + ["--t-color-crimson3", "color(display-p3 0.987 0.917 0.941)"], + ["--t-color-crimson4", "color(display-p3 0.975 0.866 0.904)"], + ["--t-color-crimson5", "color(display-p3 0.953 0.813 0.864)"], + ["--t-color-crimson6", "color(display-p3 0.921 0.755 0.817)"], + ["--t-color-crimson7", "color(display-p3 0.88 0.683 0.761)"], + ["--t-color-crimson8", "color(display-p3 0.834 0.592 0.694)"], + ["--t-color-crimson9", "color(display-p3 0.843 0.298 0.507)"], + ["--t-color-crimson10", "color(display-p3 0.807 0.266 0.468)"], + ["--t-color-crimson11", "color(display-p3 0.731 0.195 0.388)"], + ["--t-color-crimson12", "color(display-p3 0.352 0.111 0.221)"], + ["--t-color-plum1", "color(display-p3 0.995 0.988 0.999)"], + ["--t-color-plum2", "color(display-p3 0.988 0.971 0.99)"], + ["--t-color-plum3", "color(display-p3 0.973 0.923 0.98)"], + ["--t-color-plum4", "color(display-p3 0.953 0.875 0.966)"], + ["--t-color-plum5", "color(display-p3 0.926 0.825 0.945)"], + ["--t-color-plum6", "color(display-p3 0.89 0.765 0.916)"], + ["--t-color-plum7", "color(display-p3 0.84 0.686 0.877)"], + ["--t-color-plum8", "color(display-p3 0.775 0.58 0.832)"], + ["--t-color-plum9", "color(display-p3 0.624 0.313 0.708)"], + ["--t-color-plum10", "color(display-p3 0.587 0.29 0.667)"], + ["--t-color-plum11", "color(display-p3 0.543 0.263 0.619)"], + ["--t-color-plum12", "color(display-p3 0.299 0.114 0.352)"], + ["--t-color-violet1", "color(display-p3 0.991 0.988 0.995)"], + ["--t-color-violet2", "color(display-p3 0.978 0.974 0.998)"], + ["--t-color-violet3", "color(display-p3 0.953 0.943 0.993)"], + ["--t-color-violet4", "color(display-p3 0.916 0.897 1)"], + ["--t-color-violet5", "color(display-p3 0.876 0.851 1)"], + ["--t-color-violet6", "color(display-p3 0.825 0.793 0.981)"], + ["--t-color-violet7", "color(display-p3 0.752 0.712 0.943)"], + ["--t-color-violet8", "color(display-p3 0.654 0.602 0.902)"], + ["--t-color-violet9", "color(display-p3 0.417 0.341 0.784)"], + ["--t-color-violet10", "color(display-p3 0.381 0.306 0.741)"], + ["--t-color-violet11", "color(display-p3 0.383 0.317 0.702)"], + ["--t-color-violet12", "color(display-p3 0.179 0.15 0.359)"], + ["--t-color-iris1", "color(display-p3 0.992 0.992 0.999)"], + ["--t-color-iris2", "color(display-p3 0.972 0.973 0.998)"], + ["--t-color-iris3", "color(display-p3 0.943 0.945 0.992)"], + ["--t-color-iris4", "color(display-p3 0.902 0.906 1)"], + ["--t-color-iris5", "color(display-p3 0.857 0.861 1)"], + ["--t-color-iris6", "color(display-p3 0.799 0.805 0.987)"], + ["--t-color-iris7", "color(display-p3 0.721 0.727 0.955)"], + ["--t-color-iris8", "color(display-p3 0.61 0.619 0.918)"], + ["--t-color-iris9", "color(display-p3 0.357 0.357 0.81)"], + ["--t-color-iris10", "color(display-p3 0.318 0.318 0.774)"], + ["--t-color-iris11", "color(display-p3 0.337 0.326 0.748)"], + ["--t-color-iris12", "color(display-p3 0.154 0.161 0.371)"], + ["--t-color-cyan1", "color(display-p3 0.982 0.992 0.996)"], + ["--t-color-cyan2", "color(display-p3 0.955 0.981 0.984)"], + ["--t-color-cyan3", "color(display-p3 0.888 0.965 0.975)"], + ["--t-color-cyan4", "color(display-p3 0.821 0.941 0.959)"], + ["--t-color-cyan5", "color(display-p3 0.751 0.907 0.935)"], + ["--t-color-cyan6", "color(display-p3 0.671 0.862 0.9)"], + ["--t-color-cyan7", "color(display-p3 0.564 0.8 0.854)"], + ["--t-color-cyan8", "color(display-p3 0.388 0.715 0.798)"], + ["--t-color-cyan9", "color(display-p3 0.282 0.627 0.765)"], + ["--t-color-cyan10", "color(display-p3 0.264 0.583 0.71)"], + ["--t-color-cyan11", "color(display-p3 0.08 0.48 0.63)"], + ["--t-color-cyan12", "color(display-p3 0.108 0.232 0.277)"], + ["--t-color-jade1", "color(display-p3 0.986 0.996 0.992)"], + ["--t-color-jade2", "color(display-p3 0.962 0.983 0.969)"], + ["--t-color-jade3", "color(display-p3 0.912 0.965 0.932)"], + ["--t-color-jade4", "color(display-p3 0.858 0.941 0.893)"], + ["--t-color-jade5", "color(display-p3 0.795 0.909 0.847)"], + ["--t-color-jade6", "color(display-p3 0.715 0.864 0.791)"], + ["--t-color-jade7", "color(display-p3 0.603 0.802 0.718)"], + ["--t-color-jade8", "color(display-p3 0.44 0.72 0.629)"], + ["--t-color-jade9", "color(display-p3 0.319 0.63 0.521)"], + ["--t-color-jade10", "color(display-p3 0.299 0.592 0.488)"], + ["--t-color-jade11", "color(display-p3 0.15 0.5 0.37)"], + ["--t-color-jade12", "color(display-p3 0.142 0.229 0.194)"], + ["--t-color-grass1", "color(display-p3 0.986 0.996 0.985)"], + ["--t-color-grass2", "color(display-p3 0.966 0.983 0.964)"], + ["--t-color-grass3", "color(display-p3 0.923 0.965 0.917)"], + ["--t-color-grass4", "color(display-p3 0.872 0.94 0.865)"], + ["--t-color-grass5", "color(display-p3 0.811 0.908 0.802)"], + ["--t-color-grass6", "color(display-p3 0.733 0.864 0.724)"], + ["--t-color-grass7", "color(display-p3 0.628 0.803 0.622)"], + ["--t-color-grass8", "color(display-p3 0.477 0.72 0.482)"], + ["--t-color-grass9", "color(display-p3 0.38 0.647 0.378)"], + ["--t-color-grass10", "color(display-p3 0.344 0.598 0.342)"], + ["--t-color-grass11", "color(display-p3 0.263 0.488 0.261)"], + ["--t-color-grass12", "color(display-p3 0.151 0.233 0.153)"], + ["--t-color-mint1", "color(display-p3 0.98 0.995 0.992)"], + ["--t-color-mint2", "color(display-p3 0.957 0.985 0.977)"], + ["--t-color-mint3", "color(display-p3 0.888 0.972 0.95)"], + ["--t-color-mint4", "color(display-p3 0.819 0.951 0.916)"], + ["--t-color-mint5", "color(display-p3 0.747 0.918 0.873)"], + ["--t-color-mint6", "color(display-p3 0.668 0.87 0.818)"], + ["--t-color-mint7", "color(display-p3 0.567 0.805 0.744)"], + ["--t-color-mint8", "color(display-p3 0.42 0.724 0.649)"], + ["--t-color-mint9", "color(display-p3 0.62 0.908 0.834)"], + ["--t-color-mint10", "color(display-p3 0.585 0.871 0.797)"], + ["--t-color-mint11", "color(display-p3 0.203 0.463 0.397)"], + ["--t-color-mint12", "color(display-p3 0.136 0.259 0.236)"], + ["--t-color-lime1", "color(display-p3 0.989 0.992 0.981)"], + ["--t-color-lime2", "color(display-p3 0.975 0.98 0.954)"], + ["--t-color-lime3", "color(display-p3 0.939 0.965 0.851)"], + ["--t-color-lime4", "color(display-p3 0.896 0.94 0.76)"], + ["--t-color-lime5", "color(display-p3 0.843 0.903 0.678)"], + ["--t-color-lime6", "color(display-p3 0.778 0.852 0.599)"], + ["--t-color-lime7", "color(display-p3 0.694 0.784 0.508)"], + ["--t-color-lime8", "color(display-p3 0.585 0.707 0.378)"], + ["--t-color-lime9", "color(display-p3 0.78 0.928 0.466)"], + ["--t-color-lime10", "color(display-p3 0.734 0.896 0.397)"], + ["--t-color-lime11", "color(display-p3 0.386 0.482 0.227)"], + ["--t-color-lime12", "color(display-p3 0.222 0.25 0.128)"], + ["--t-color-bronze1", "color(display-p3 0.991 0.988 0.988)"], + ["--t-color-bronze2", "color(display-p3 0.989 0.97 0.961)"], + ["--t-color-bronze3", "color(display-p3 0.958 0.932 0.919)"], + ["--t-color-bronze4", "color(display-p3 0.929 0.894 0.877)"], + ["--t-color-bronze5", "color(display-p3 0.898 0.853 0.832)"], + ["--t-color-bronze6", "color(display-p3 0.861 0.805 0.778)"], + ["--t-color-bronze7", "color(display-p3 0.812 0.739 0.706)"], + ["--t-color-bronze8", "color(display-p3 0.741 0.647 0.606)"], + ["--t-color-bronze9", "color(display-p3 0.611 0.507 0.455)"], + ["--t-color-bronze10", "color(display-p3 0.563 0.461 0.414)"], + ["--t-color-bronze11", "color(display-p3 0.471 0.373 0.336)"], + ["--t-color-bronze12", "color(display-p3 0.251 0.191 0.172)"], + ["--t-color-gold1", "color(display-p3 0.992 0.992 0.989)"], + ["--t-color-gold2", "color(display-p3 0.98 0.976 0.953)"], + ["--t-color-gold3", "color(display-p3 0.947 0.94 0.909)"], + ["--t-color-gold4", "color(display-p3 0.914 0.904 0.865)"], + ["--t-color-gold5", "color(display-p3 0.88 0.865 0.816)"], + ["--t-color-gold6", "color(display-p3 0.84 0.818 0.756)"], + ["--t-color-gold7", "color(display-p3 0.788 0.753 0.677)"], + ["--t-color-gold8", "color(display-p3 0.715 0.66 0.565)"], + ["--t-color-gold9", "color(display-p3 0.579 0.517 0.41)"], + ["--t-color-gold10", "color(display-p3 0.538 0.479 0.38)"], + ["--t-color-gold11", "color(display-p3 0.433 0.386 0.305)"], + ["--t-color-gold12", "color(display-p3 0.227 0.209 0.173)"], + ["--t-color-brown1", "color(display-p3 0.995 0.992 0.989)"], + ["--t-color-brown2", "color(display-p3 0.987 0.976 0.964)"], + ["--t-color-brown3", "color(display-p3 0.959 0.936 0.909)"], + ["--t-color-brown4", "color(display-p3 0.934 0.897 0.855)"], + ["--t-color-brown5", "color(display-p3 0.909 0.856 0.798)"], + ["--t-color-brown6", "color(display-p3 0.88 0.808 0.73)"], + ["--t-color-brown7", "color(display-p3 0.841 0.742 0.639)"], + ["--t-color-brown8", "color(display-p3 0.782 0.647 0.514)"], + ["--t-color-brown9", "color(display-p3 0.651 0.505 0.368)"], + ["--t-color-brown10", "color(display-p3 0.601 0.465 0.344)"], + ["--t-color-brown11", "color(display-p3 0.485 0.374 0.288)"], + ["--t-color-brown12", "color(display-p3 0.236 0.202 0.183)"], + ["--t-color-amber1", "color(display-p3 0.995 0.992 0.985)"], + ["--t-color-amber2", "color(display-p3 0.994 0.986 0.921)"], + ["--t-color-amber3", "color(display-p3 0.994 0.969 0.782)"], + ["--t-color-amber4", "color(display-p3 0.989 0.937 0.65)"], + ["--t-color-amber5", "color(display-p3 0.97 0.902 0.527)"], + ["--t-color-amber6", "color(display-p3 0.936 0.844 0.506)"], + ["--t-color-amber7", "color(display-p3 0.89 0.762 0.443)"], + ["--t-color-amber8", "color(display-p3 0.85 0.65 0.3)"], + ["--t-color-amber9", "color(display-p3 1 0.77 0.26)"], + ["--t-color-amber10", "color(display-p3 0.959 0.741 0.274)"], + ["--t-color-amber11", "color(display-p3 0.64 0.4 0)"], + ["--t-color-amber12", "color(display-p3 0.294 0.208 0.145)"], + ["--t-color-transparent-green1", "#00c04004"], + ["--t-color-transparent-green2", "#00a32f0b"], + ["--t-color-transparent-green3", "#00a43319"], + ["--t-color-transparent-green4", "#00a83829"], + ["--t-color-transparent-green5", "#019c393b"], + ["--t-color-transparent-green6", "#00963c52"], + ["--t-color-transparent-green7", "#00914071"], + ["--t-color-transparent-green8", "#00924ba4"], + ["--t-color-transparent-green9", "#008f4acf"], + ["--t-color-transparent-green10", "#008647d4"], + ["--t-color-transparent-green11", "#00713fde"], + ["--t-color-transparent-green12", "#002616e6"], + ["--t-color-transparent-turquoise1", "#00cc9905"], + ["--t-color-transparent-turquoise2", "#00aa800c"], + ["--t-color-transparent-turquoise3", "#00c69d1f"], + ["--t-color-transparent-turquoise4", "#00c39633"], + ["--t-color-transparent-turquoise5", "#00b49047"], + ["--t-color-transparent-turquoise6", "#00a6855e"], + ["--t-color-transparent-turquoise7", "#0099807c"], + ["--t-color-transparent-turquoise8", "#009783ac"], + ["--t-color-transparent-turquoise9", "#009e8ced"], + ["--t-color-transparent-turquoise10", "#009684f2"], + ["--t-color-transparent-turquoise11", "#008573"], + ["--t-color-transparent-turquoise12", "#00332df2"], + ["--t-color-transparent-sky1", "#00d5ff06"], + ["--t-color-transparent-sky2", "#00a4db0e"], + ["--t-color-transparent-sky3", "#00b3ee1e"], + ["--t-color-transparent-sky4", "#00ace42e"], + ["--t-color-transparent-sky5", "#00a1d841"], + ["--t-color-transparent-sky6", "#0092ca56"], + ["--t-color-transparent-sky7", "#0089c172"], + ["--t-color-transparent-sky8", "#0085bf9f"], + ["--t-color-transparent-sky9", "#00c7fe83"], + ["--t-color-transparent-sky10", "#00bcf38b"], + ["--t-color-transparent-sky11", "#00749e"], + ["--t-color-transparent-sky12", "#002540e2"], + ["--t-color-transparent-blue1", "#00008002"], + ["--t-color-transparent-blue2", "#0040ff08"], + ["--t-color-transparent-blue3", "#0047f112"], + ["--t-color-transparent-blue4", "#0044ff1e"], + ["--t-color-transparent-blue5", "#0044ff2d"], + ["--t-color-transparent-blue6", "#003eff3e"], + ["--t-color-transparent-blue7", "#0037ed54"], + ["--t-color-transparent-blue8", "#0034dc72"], + ["--t-color-transparent-blue9", "#0031d2c1"], + ["--t-color-transparent-blue10", "#002ec9cc"], + ["--t-color-transparent-blue11", "#002bb7c5"], + ["--t-color-transparent-blue12", "#001046e0"], + ["--t-color-transparent-purple1", "#aa00aa03"], + ["--t-color-transparent-purple2", "#8000e008"], + ["--t-color-transparent-purple3", "#8e00f112"], + ["--t-color-transparent-purple4", "#8d00e51d"], + ["--t-color-transparent-purple5", "#8000db2a"], + ["--t-color-transparent-purple6", "#7a01d03b"], + ["--t-color-transparent-purple7", "#6d00c350"], + ["--t-color-transparent-purple8", "#6600c06c"], + ["--t-color-transparent-purple9", "#5c00adb1"], + ["--t-color-transparent-purple10", "#53009eb8"], + ["--t-color-transparent-purple11", "#52009aba"], + ["--t-color-transparent-purple12", "#250049df"], + ["--t-color-transparent-pink1", "#ff00aa03"], + ["--t-color-transparent-pink2", "#e0008008"], + ["--t-color-transparent-pink3", "#f4008c16"], + ["--t-color-transparent-pink4", "#e2008b23"], + ["--t-color-transparent-pink5", "#d1008331"], + ["--t-color-transparent-pink6", "#c0007840"], + ["--t-color-transparent-pink7", "#b6006f53"], + ["--t-color-transparent-pink8", "#af006f6c"], + ["--t-color-transparent-pink9", "#c8007fbf"], + ["--t-color-transparent-pink10", "#c2007ac7"], + ["--t-color-transparent-pink11", "#b60074d6"], + ["--t-color-transparent-pink12", "#59003bed"], + ["--t-color-transparent-red1", "#ff000003"], + ["--t-color-transparent-red2", "#ff000008"], + ["--t-color-transparent-red3", "#f3000d14"], + ["--t-color-transparent-red4", "#ff000824"], + ["--t-color-transparent-red5", "#ff000632"], + ["--t-color-transparent-red6", "#f8000442"], + ["--t-color-transparent-red7", "#df000356"], + ["--t-color-transparent-red8", "#d2000571"], + ["--t-color-transparent-red9", "#db0007b7"], + ["--t-color-transparent-red10", "#d10005c1"], + ["--t-color-transparent-red11", "#c40006d3"], + ["--t-color-transparent-red12", "#55000de8"], + ["--t-color-transparent-orange1", "#c0400004"], + ["--t-color-transparent-orange2", "#ff8e0012"], + ["--t-color-transparent-orange3", "#ff9c0029"], + ["--t-color-transparent-orange4", "#ff91014a"], + ["--t-color-transparent-orange5", "#ff8b0065"], + ["--t-color-transparent-orange6", "#ff81007d"], + ["--t-color-transparent-orange7", "#ed6c008c"], + ["--t-color-transparent-orange8", "#e35f00aa"], + ["--t-color-transparent-orange9", "#f65e00ea"], + ["--t-color-transparent-orange10", "#ef5f00"], + ["--t-color-transparent-orange11", "#cc4e00"], + ["--t-color-transparent-orange12", "#431200e2"], + ["--t-color-transparent-yellow1", "#aaaa0006"], + ["--t-color-transparent-yellow2", "#f4dd0016"], + ["--t-color-transparent-yellow3", "#ffee0047"], + ["--t-color-transparent-yellow4", "#ffe3016b"], + ["--t-color-transparent-yellow5", "#ffd5008f"], + ["--t-color-transparent-yellow6", "#ebbc0097"], + ["--t-color-transparent-yellow7", "#d2a10098"], + ["--t-color-transparent-yellow8", "#c99700c6"], + ["--t-color-transparent-yellow9", "#ffe100d6"], + ["--t-color-transparent-yellow10", "#ffdc00"], + ["--t-color-transparent-yellow11", "#9e6c00"], + ["--t-color-transparent-yellow12", "#2e2000e0"], + ["--t-color-transparent-gray1", "color(display-p3 0 0 0 / 0.02)"], + ["--t-color-transparent-gray2", "color(display-p3 0 0 0 / 0.039)"], + ["--t-color-transparent-gray3", "color(display-p3 0 0 0 / 0.047)"], + ["--t-color-transparent-gray4", "color(display-p3 0 0 0 / 0.071)"], + ["--t-color-transparent-gray5", "color(display-p3 0 0 0 / 0.078)"], + ["--t-color-transparent-gray6", "color(display-p3 0 0 0 / 0.114)"], + ["--t-color-transparent-gray7", "color(display-p3 0 0 0 / 0.161)"], + ["--t-color-transparent-gray8", "color(display-p3 0 0 0 / 0.22)"], + ["--t-color-transparent-gray9", "color(display-p3 0 0 0 / 0.361)"], + ["--t-color-transparent-gray10", "color(display-p3 0 0 0 / 0.478)"], + ["--t-color-transparent-gray11", "color(display-p3 0 0 0 / 0.722)"], + ["--t-color-transparent-gray12", "color(display-p3 0 0 0 / 0.91)"], + ["--t-color-transparent-mauve1", "#55005503"], + ["--t-color-transparent-mauve2", "#2b005506"], + ["--t-color-transparent-mauve3", "#30004010"], + ["--t-color-transparent-mauve4", "#20003618"], + ["--t-color-transparent-mauve5", "#20003820"], + ["--t-color-transparent-mauve6", "#14003527"], + ["--t-color-transparent-mauve7", "#10003332"], + ["--t-color-transparent-mauve8", "#08003145"], + ["--t-color-transparent-mauve9", "#05001d73"], + ["--t-color-transparent-mauve10", "#0500197d"], + ["--t-color-transparent-mauve11", "#0400119c"], + ["--t-color-transparent-mauve12", "#020008e0"], + ["--t-color-transparent-slate1", "#00005503"], + ["--t-color-transparent-slate2", "#00005506"], + ["--t-color-transparent-slate3", "#0000330f"], + ["--t-color-transparent-slate4", "#00002d17"], + ["--t-color-transparent-slate5", "#0009321f"], + ["--t-color-transparent-slate6", "#00002f26"], + ["--t-color-transparent-slate7", "#00062e32"], + ["--t-color-transparent-slate8", "#00083046"], + ["--t-color-transparent-slate9", "#00051d74"], + ["--t-color-transparent-slate10", "#00071b7f"], + ["--t-color-transparent-slate11", "#0007149f"], + ["--t-color-transparent-slate12", "#000509e3"], + ["--t-color-transparent-sage1", "#00804004"], + ["--t-color-transparent-sage2", "#00402008"], + ["--t-color-transparent-sage3", "#002d1e11"], + ["--t-color-transparent-sage4", "#001f1519"], + ["--t-color-transparent-sage5", "#00180820"], + ["--t-color-transparent-sage6", "#00140d28"], + ["--t-color-transparent-sage7", "#00140a34"], + ["--t-color-transparent-sage8", "#000f0847"], + ["--t-color-transparent-sage9", "#00110b79"], + ["--t-color-transparent-sage10", "#00100a83"], + ["--t-color-transparent-sage11", "#000a07a0"], + ["--t-color-transparent-sage12", "#000805e5"], + ["--t-color-transparent-olive1", "#00550003"], + ["--t-color-transparent-olive2", "#00490007"], + ["--t-color-transparent-olive3", "#00200010"], + ["--t-color-transparent-olive4", "#00160018"], + ["--t-color-transparent-olive5", "#00180020"], + ["--t-color-transparent-olive6", "#00140028"], + ["--t-color-transparent-olive7", "#000f0033"], + ["--t-color-transparent-olive8", "#040f0047"], + ["--t-color-transparent-olive9", "#050f0078"], + ["--t-color-transparent-olive10", "#040e0082"], + ["--t-color-transparent-olive11", "#020a00a0"], + ["--t-color-transparent-olive12", "#010600e3"], + ["--t-color-transparent-sand1", "#55550003"], + ["--t-color-transparent-sand2", "#25250007"], + ["--t-color-transparent-sand3", "#20100010"], + ["--t-color-transparent-sand4", "#1f150019"], + ["--t-color-transparent-sand5", "#1f180021"], + ["--t-color-transparent-sand6", "#19130029"], + ["--t-color-transparent-sand7", "#19140035"], + ["--t-color-transparent-sand8", "#1915014a"], + ["--t-color-transparent-sand9", "#0f0f0079"], + ["--t-color-transparent-sand10", "#0c0c0083"], + ["--t-color-transparent-sand11", "#080800a1"], + ["--t-color-transparent-sand12", "#060500e3"], + ["--t-color-transparent-tomato1", "#ff000003"], + ["--t-color-transparent-tomato2", "#ff200008"], + ["--t-color-transparent-tomato3", "#f52b0018"], + ["--t-color-transparent-tomato4", "#ff35002c"], + ["--t-color-transparent-tomato5", "#ff2e003d"], + ["--t-color-transparent-tomato6", "#f92d0050"], + ["--t-color-transparent-tomato7", "#e7280067"], + ["--t-color-transparent-tomato8", "#db250084"], + ["--t-color-transparent-tomato9", "#df2600d1"], + ["--t-color-transparent-tomato10", "#d72400da"], + ["--t-color-transparent-tomato11", "#cd2200ea"], + ["--t-color-transparent-tomato12", "#460900e0"], + ["--t-color-transparent-ruby1", "#ff005503"], + ["--t-color-transparent-ruby2", "#ff002008"], + ["--t-color-transparent-ruby3", "#f3002515"], + ["--t-color-transparent-ruby4", "#ff002523"], + ["--t-color-transparent-ruby5", "#ff002a31"], + ["--t-color-transparent-ruby6", "#e4002440"], + ["--t-color-transparent-ruby7", "#ce002553"], + ["--t-color-transparent-ruby8", "#c300286d"], + ["--t-color-transparent-ruby9", "#db002cb9"], + ["--t-color-transparent-ruby10", "#d2002cc4"], + ["--t-color-transparent-ruby11", "#c10030db"], + ["--t-color-transparent-ruby12", "#550016e8"], + ["--t-color-transparent-crimson1", "#ff005503"], + ["--t-color-transparent-crimson2", "#e0004008"], + ["--t-color-transparent-crimson3", "#ff005216"], + ["--t-color-transparent-crimson4", "#f8005123"], + ["--t-color-transparent-crimson5", "#e5004f31"], + ["--t-color-transparent-crimson6", "#d0004b41"], + ["--t-color-transparent-crimson7", "#bf004753"], + ["--t-color-transparent-crimson8", "#b6004a6c"], + ["--t-color-transparent-crimson9", "#e2005bc2"], + ["--t-color-transparent-crimson10", "#d70056cb"], + ["--t-color-transparent-crimson11", "#c4004fe2"], + ["--t-color-transparent-crimson12", "#530026e9"], + ["--t-color-transparent-plum1", "#aa00ff03"], + ["--t-color-transparent-plum2", "#c000c008"], + ["--t-color-transparent-plum3", "#cc00cc14"], + ["--t-color-transparent-plum4", "#c200c921"], + ["--t-color-transparent-plum5", "#b700bd2e"], + ["--t-color-transparent-plum6", "#a400b03d"], + ["--t-color-transparent-plum7", "#9900a852"], + ["--t-color-transparent-plum8", "#9000a56e"], + ["--t-color-transparent-plum9", "#89009eb5"], + ["--t-color-transparent-plum10", "#7f0092bb"], + ["--t-color-transparent-plum11", "#730086c1"], + ["--t-color-transparent-plum12", "#40004be6"], + ["--t-color-transparent-violet1", "#5500aa03"], + ["--t-color-transparent-violet2", "#4900ff07"], + ["--t-color-transparent-violet3", "#4400ee0f"], + ["--t-color-transparent-violet4", "#4300ff1b"], + ["--t-color-transparent-violet5", "#3600ff26"], + ["--t-color-transparent-violet6", "#3100fb35"], + ["--t-color-transparent-violet7", "#2d01dd4a"], + ["--t-color-transparent-violet8", "#2b00d066"], + ["--t-color-transparent-violet9", "#2400b7a9"], + ["--t-color-transparent-violet10", "#2300abb2"], + ["--t-color-transparent-violet11", "#1f0099af"], + ["--t-color-transparent-violet12", "#0b0043d9"], + ["--t-color-transparent-iris1", "#0000ff02"], + ["--t-color-transparent-iris2", "#0000ff07"], + ["--t-color-transparent-iris3", "#0011ee0f"], + ["--t-color-transparent-iris4", "#000bff19"], + ["--t-color-transparent-iris5", "#000eff25"], + ["--t-color-transparent-iris6", "#000aff34"], + ["--t-color-transparent-iris7", "#0008e647"], + ["--t-color-transparent-iris8", "#0008d964"], + ["--t-color-transparent-iris9", "#0000c0a4"], + ["--t-color-transparent-iris10", "#0000b6ae"], + ["--t-color-transparent-iris11", "#0600abac"], + ["--t-color-transparent-iris12", "#000246d8"], + ["--t-color-transparent-cyan1", "#0099cc05"], + ["--t-color-transparent-cyan2", "#009db10d"], + ["--t-color-transparent-cyan3", "#00c2d121"], + ["--t-color-transparent-cyan4", "#00bcd435"], + ["--t-color-transparent-cyan5", "#01b4cc4a"], + ["--t-color-transparent-cyan6", "#00a7c162"], + ["--t-color-transparent-cyan7", "#009fbb82"], + ["--t-color-transparent-cyan8", "#00a3c0c2"], + ["--t-color-transparent-cyan9", "#00a2c7"], + ["--t-color-transparent-cyan10", "#0094b7f8"], + ["--t-color-transparent-cyan11", "#007491ef"], + ["--t-color-transparent-cyan12", "#00323ef2"], + ["--t-color-transparent-jade1", "#00c08004"], + ["--t-color-transparent-jade2", "#00a3460b"], + ["--t-color-transparent-jade3", "#00ae4819"], + ["--t-color-transparent-jade4", "#00a85129"], + ["--t-color-transparent-jade5", "#00a2553c"], + ["--t-color-transparent-jade6", "#009a5753"], + ["--t-color-transparent-jade7", "#00945f74"], + ["--t-color-transparent-jade8", "#00976ea9"], + ["--t-color-transparent-jade9", "#00916bd6"], + ["--t-color-transparent-jade10", "#008764d9"], + ["--t-color-transparent-jade11", "#007152df"], + ["--t-color-transparent-jade12", "#002217e2"], + ["--t-color-transparent-grass1", "#00c00004"], + ["--t-color-transparent-grass2", "#0099000a"], + ["--t-color-transparent-grass3", "#00970016"], + ["--t-color-transparent-grass4", "#009f0725"], + ["--t-color-transparent-grass5", "#00930536"], + ["--t-color-transparent-grass6", "#008f0a4d"], + ["--t-color-transparent-grass7", "#018b0f6b"], + ["--t-color-transparent-grass8", "#008d199a"], + ["--t-color-transparent-grass9", "#008619b9"], + ["--t-color-transparent-grass10", "#007b17c1"], + ["--t-color-transparent-grass11", "#006514d5"], + ["--t-color-transparent-grass12", "#002006df"], + ["--t-color-transparent-mint1", "#00d5aa06"], + ["--t-color-transparent-mint2", "#00b18a0d"], + ["--t-color-transparent-mint3", "#00d29e22"], + ["--t-color-transparent-mint4", "#00cc9937"], + ["--t-color-transparent-mint5", "#00c0914c"], + ["--t-color-transparent-mint6", "#00b08663"], + ["--t-color-transparent-mint7", "#00a17d81"], + ["--t-color-transparent-mint8", "#009e7fb3"], + ["--t-color-transparent-mint9", "#00d3a579"], + ["--t-color-transparent-mint10", "#00c39982"], + ["--t-color-transparent-mint11", "#007763fd"], + ["--t-color-transparent-mint12", "#00312ae9"], + ["--t-color-transparent-lime1", "#66990005"], + ["--t-color-transparent-lime2", "#6b95000c"], + ["--t-color-transparent-lime3", "#96c80029"], + ["--t-color-transparent-lime4", "#8fc60042"], + ["--t-color-transparent-lime5", "#81bb0059"], + ["--t-color-transparent-lime6", "#72aa006e"], + ["--t-color-transparent-lime7", "#61990087"], + ["--t-color-transparent-lime8", "#559200ab"], + ["--t-color-transparent-lime9", "#93e4009c"], + ["--t-color-transparent-lime10", "#8fdc00b3"], + ["--t-color-transparent-lime11", "#375f00d0"], + ["--t-color-transparent-lime12", "#1e2900e3"], + ["--t-color-transparent-bronze1", "#55000003"], + ["--t-color-transparent-bronze2", "#cc33000a"], + ["--t-color-transparent-bronze3", "#92250015"], + ["--t-color-transparent-bronze4", "#80280020"], + ["--t-color-transparent-bronze5", "#7423002c"], + ["--t-color-transparent-bronze6", "#7324003a"], + ["--t-color-transparent-bronze7", "#6c1f004c"], + ["--t-color-transparent-bronze8", "#671c0066"], + ["--t-color-transparent-bronze9", "#551a008d"], + ["--t-color-transparent-bronze10", "#4c150097"], + ["--t-color-transparent-bronze11", "#3d0f00ab"], + ["--t-color-transparent-bronze12", "#1d0600d4"], + ["--t-color-transparent-gold1", "#55550003"], + ["--t-color-transparent-gold2", "#9d8a000d"], + ["--t-color-transparent-gold3", "#75600018"], + ["--t-color-transparent-gold4", "#6b4e0024"], + ["--t-color-transparent-gold5", "#60460030"], + ["--t-color-transparent-gold6", "#64440040"], + ["--t-color-transparent-gold7", "#63420055"], + ["--t-color-transparent-gold8", "#633d0072"], + ["--t-color-transparent-gold9", "#5332009a"], + ["--t-color-transparent-gold10", "#492d00a1"], + ["--t-color-transparent-gold11", "#362100b4"], + ["--t-color-transparent-gold12", "#130c00d4"], + ["--t-color-transparent-brown1", "#aa550003"], + ["--t-color-transparent-brown2", "#aa550009"], + ["--t-color-transparent-brown3", "#a04b0018"], + ["--t-color-transparent-brown4", "#9b4a0026"], + ["--t-color-transparent-brown5", "#9f4d0035"], + ["--t-color-transparent-brown6", "#a04e0048"], + ["--t-color-transparent-brown7", "#a34e0060"], + ["--t-color-transparent-brown8", "#9f4a0081"], + ["--t-color-transparent-brown9", "#823c00a7"], + ["--t-color-transparent-brown10", "#723300ac"], + ["--t-color-transparent-brown11", "#522100b9"], + ["--t-color-transparent-brown12", "#140600d1"], + ["--t-color-transparent-amber1", "#c0800004"], + ["--t-color-transparent-amber2", "#f4d10016"], + ["--t-color-transparent-amber3", "#ffde003d"], + ["--t-color-transparent-amber4", "#ffd40063"], + ["--t-color-transparent-amber5", "#f8cf0088"], + ["--t-color-transparent-amber6", "#eab5008c"], + ["--t-color-transparent-amber7", "#dc9b009d"], + ["--t-color-transparent-amber8", "#da8a00c9"], + ["--t-color-transparent-amber9", "#ffb300c2"], + ["--t-color-transparent-amber10", "#ffb300e7"], + ["--t-color-transparent-amber11", "#ab6400"], + ["--t-color-transparent-amber12", "#341500dd"], +]; diff --git a/packages/twenty-ui/src/theme-constants/index.ts b/packages/twenty-ui/src/theme-constants/index.ts new file mode 100644 index 0000000000..4798d0446f --- /dev/null +++ b/packages/twenty-ui/src/theme-constants/index.ts @@ -0,0 +1,15 @@ +/* + * _____ _ + *|_ _|_ _____ _ __ | |_ _ _ + * | | \ \ /\ / / _ \ '_ \| __| | | | Auto-generated file + * | | \ V V / __/ | | | |_| |_| | Any edits to this will be overridden + * |_| \_/\_/ \___|_| |_|\__|\__, | + * |___/ + */ + +export { themeCssVariables } from './generated/themeCssVariables'; +export { THEME_DARK_CSS_VARIABLE_ENTRIES } from './generated/themeDarkCssVariableEntries'; +export { + MOBILE_VIEWPORT, + THEME_LIGHT_CSS_VARIABLE_ENTRIES, +} from './generated/themeLightCssVariableEntries'; diff --git a/packages/twenty-ui/src/theme/constants/ThemeCssVariables.ts b/packages/twenty-ui/src/theme/constants/ThemeCssVariables.ts deleted file mode 100644 index 7c15a272a2..0000000000 --- a/packages/twenty-ui/src/theme/constants/ThemeCssVariables.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { THEME_LIGHT } from '@ui/theme/constants/ThemeLight'; -import { type ThemeType } from '@ui/theme/types/ThemeType'; -import { buildThemeReferencingRootCssVariables } from '@ui/theme/utils/buildThemeReferencingRootCssVariables'; - -type DeepCSSVariableRefs = { - [K in keyof T]: T[K] extends (...args: never[]) => unknown - ? Record - : T[K] extends Record - ? DeepCSSVariableRefs - : string; -}; - -// eslint-disable-next-line @typescript-eslint/naming-convention -export const themeCssVariables: DeepCSSVariableRefs = - buildThemeReferencingRootCssVariables({ - themeNode: THEME_LIGHT, - prefix: 't', - }) as DeepCSSVariableRefs; diff --git a/packages/twenty-ui/src/theme/index.ts b/packages/twenty-ui/src/theme/index.ts index f4baf1a7e2..061326eec3 100644 --- a/packages/twenty-ui/src/theme/index.ts +++ b/packages/twenty-ui/src/theme/index.ts @@ -51,7 +51,6 @@ export { TAG_LIGHT } from './constants/TagLight'; export { TEXT } from './constants/Text'; export { TEXT_INPUT_STYLE } from './constants/TextInputStyle'; export { THEME_COMMON } from './constants/ThemeCommon'; -export { themeCssVariables } from './constants/ThemeCssVariables'; export { THEME_DARK } from './constants/ThemeDark'; export { THEME_LIGHT } from './constants/ThemeLight'; export { TRANSPARENT_COLORS_DARK } from './constants/TransparentColorsDark'; @@ -64,7 +63,5 @@ export { export { ThemeCssVariableInjectorEffect } from './provider/ThemeCssVariableInjectorEffect'; export { ThemeProvider } from './provider/ThemeProvider'; export type { ThemeType } from './types/ThemeType'; -export { buildThemeReferencingRootCssVariables } from './utils/buildThemeReferencingRootCssVariables'; export { getNextThemeColor } from './utils/getNextThemeColor'; -export { prepareThemeForRootCssVariableInjection } from './utils/prepareThemeForRootCssVariableInjection'; export { SPACING_VALUES } from './utils/spacingValues'; diff --git a/packages/twenty-ui/src/theme/provider/ThemeCssVariableInjectorEffect.tsx b/packages/twenty-ui/src/theme/provider/ThemeCssVariableInjectorEffect.tsx index 9ccd51cf75..bd4267c221 100644 --- a/packages/twenty-ui/src/theme/provider/ThemeCssVariableInjectorEffect.tsx +++ b/packages/twenty-ui/src/theme/provider/ThemeCssVariableInjectorEffect.tsx @@ -1,33 +1,31 @@ -import { useLayoutEffect, useMemo } from 'react'; +import { useLayoutEffect } from 'react'; -import { type ThemeType } from '@ui/theme/types/ThemeType'; -import { prepareThemeForRootCssVariableInjection } from '@ui/theme/utils/prepareThemeForRootCssVariableInjection'; +import { + THEME_DARK_CSS_VARIABLE_ENTRIES, + THEME_LIGHT_CSS_VARIABLE_ENTRIES, +} from '@ui/theme-constants'; export const ThemeCssVariableInjectorEffect = ({ theme, }: { - theme: ThemeType; + theme: { name: string }; }) => { - const themeCssVariableEntries = useMemo( - () => - prepareThemeForRootCssVariableInjection({ - themeNode: theme as unknown as Record, - prefix: 't', - }), - [theme], - ); + const entries = + theme.name === 'dark' + ? THEME_DARK_CSS_VARIABLE_ENTRIES + : THEME_LIGHT_CSS_VARIABLE_ENTRIES; useLayoutEffect(() => { const root = document.documentElement; - for (const [name, value] of themeCssVariableEntries) { + for (const [name, value] of entries) { root.style.setProperty(name, value); } return () => { - for (const [name] of themeCssVariableEntries) { + for (const [name] of entries) { root.style.removeProperty(name); } }; - }, [themeCssVariableEntries]); + }, [entries]); return null; }; diff --git a/packages/twenty-ui/src/theme/utils/__tests__/buildThemeReferencingRootCssVariables.test.ts b/packages/twenty-ui/src/theme/utils/__tests__/buildThemeReferencingRootCssVariables.test.ts deleted file mode 100644 index 93af1419c2..0000000000 --- a/packages/twenty-ui/src/theme/utils/__tests__/buildThemeReferencingRootCssVariables.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { buildThemeReferencingRootCssVariables } from '../buildThemeReferencingRootCssVariables'; - -describe('buildThemeReferencingRootCssVariables', () => { - it('replaces primitive leaves with var() references', () => { - const result = buildThemeReferencingRootCssVariables({ - themeNode: { fontSize: '14px', lineHeight: 1.5 }, - prefix: 't', - }); - - expect(result).toEqual({ - fontSize: 'var(--t-font-size)', - lineHeight: 'var(--t-line-height)', - }); - }); - - it('recurses into nested objects', () => { - const result = buildThemeReferencingRootCssVariables({ - themeNode: { font: { color: { primary: 'someValue' } } }, - prefix: 't', - }); - - expect(result).toEqual({ - font: { - color: { primary: 'var(--t-font-color-primary)' }, - }, - }); - }); - - it('expands spacing functions into keyed var() refs', () => { - const result = buildThemeReferencingRootCssVariables({ - themeNode: { spacing: (n: number) => `${n * 4}px` }, - prefix: 't', - }); - - const spacing = result.spacing as Record; - expect(spacing[0]).toBe('var(--t-spacing-0)'); - expect(spacing[4]).toBe('var(--t-spacing-4)'); - expect(spacing[0.5]).toBe('var(--t-spacing-0_5)'); - expect(spacing[1.5]).toBe('var(--t-spacing-1_5)'); - }); -}); diff --git a/packages/twenty-ui/src/theme/utils/__tests__/prepareThemeForRootCssVariableInjection.test.ts b/packages/twenty-ui/src/theme/utils/__tests__/prepareThemeForRootCssVariableInjection.test.ts deleted file mode 100644 index 4e4cef5202..0000000000 --- a/packages/twenty-ui/src/theme/utils/__tests__/prepareThemeForRootCssVariableInjection.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { prepareThemeForRootCssVariableInjection } from '../prepareThemeForRootCssVariableInjection'; - -describe('prepareThemeForRootCssVariableInjection', () => { - it('collects flat entries from primitive leaves', () => { - const entries = prepareThemeForRootCssVariableInjection({ - themeNode: { fontSize: '14px' }, - prefix: 't', - }); - - expect(entries).toEqual([['--t-font-size', '14px']]); - }); - - it('recurses into nested objects', () => { - const entries = prepareThemeForRootCssVariableInjection({ - themeNode: { font: { color: { primary: 'someValue' } } }, - prefix: 't', - }); - - expect(entries).toEqual([['--t-font-color-primary', 'someValue']]); - }); - - it('expands spacing functions into entries', () => { - const entries = prepareThemeForRootCssVariableInjection({ - themeNode: { spacing: (n: number) => `${n * 4}px` }, - prefix: 't', - }); - - expect(entries).toContainEqual(['--t-spacing-0', '0px']); - expect(entries).toContainEqual(['--t-spacing-4', '16px']); - expect(entries).toContainEqual(['--t-spacing-0_5', '2px']); - }); - - it('stringifies numeric values', () => { - const entries = prepareThemeForRootCssVariableInjection({ - themeNode: { opacity: 0.5 }, - prefix: 't', - }); - - expect(entries).toEqual([['--t-opacity', '0.5']]); - }); -}); diff --git a/packages/twenty-ui/src/theme/utils/buildThemeReferencingRootCssVariables.ts b/packages/twenty-ui/src/theme/utils/buildThemeReferencingRootCssVariables.ts deleted file mode 100644 index 1cccbde2dd..0000000000 --- a/packages/twenty-ui/src/theme/utils/buildThemeReferencingRootCssVariables.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { SPACING_VALUES } from '@ui/theme/utils/spacingValues'; - -const camelToKebab = (str: string): string => - str.replace(/([A-Z])/g, (match) => `-${match.toLowerCase()}`); - -const isPlainObject = (value: unknown): value is Record => - typeof value === 'object' && value !== null && !Array.isArray(value); - -const formatSpacingKey = (n: number): string => String(n).replace('.', '_'); - -const buildSpacingVariableRefs = ( - name: string, -): Record => { - const spacing: Record = {}; - for (const n of SPACING_VALUES) { - spacing[n] = `var(--${name}-${formatSpacingKey(n)})`; - } - return spacing; -}; - -const buildVariableRefForEntry = ({ - key, - value, - name, -}: { - key: string; - value: unknown; - name: string; -}): unknown => { - if (typeof value === 'function' && key === 'spacing') { - return buildSpacingVariableRefs(name); - } - - if (isPlainObject(value)) { - return buildThemeReferencingRootCssVariables({ - themeNode: value, - prefix: name, - }); - } - - return `var(--${name})`; -}; - -// Builds a nested object that mirrors the theme shape, where every leaf -// is replaced with a CSS var(--t-…) reference string. -// { font: { color: { primary: '#333' } } } -// → { font: { color: { primary: 'var(--t-font-color-primary)' } } } -export const buildThemeReferencingRootCssVariables = ({ - themeNode, - prefix, -}: { - themeNode: Record; - prefix: string; -}): Record => { - const result: Record = {}; - - for (const [key, value] of Object.entries(themeNode)) { - const name = `${prefix}-${camelToKebab(key)}`; - result[key] = buildVariableRefForEntry({ key, value, name }); - } - - return result; -}; diff --git a/packages/twenty-ui/src/theme/utils/prepareThemeForRootCssVariableInjection.ts b/packages/twenty-ui/src/theme/utils/prepareThemeForRootCssVariableInjection.ts deleted file mode 100644 index 2d22ccfed2..0000000000 --- a/packages/twenty-ui/src/theme/utils/prepareThemeForRootCssVariableInjection.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { SPACING_VALUES } from '@ui/theme/utils/spacingValues'; - -const camelToKebab = (str: string): string => - str.replace(/([A-Z])/g, (match) => `-${match.toLowerCase()}`); - -const isPlainObject = (value: unknown): value is Record => - typeof value === 'object' && value !== null && !Array.isArray(value); - -const formatSpacingKey = (n: number): string => String(n).replace('.', '_'); - -const collectSpacingEntries = ( - name: string, - spacingFn: (...args: number[]) => string, -): [string, string][] => - SPACING_VALUES.map((n) => [`--${name}-${formatSpacingKey(n)}`, spacingFn(n)]); - -const collectEntriesForValue = ({ - key, - value, - name, -}: { - key: string; - value: unknown; - name: string; -}): [string, string][] => { - if (typeof value === 'function' && key === 'spacing') { - return collectSpacingEntries(name, value as (...args: number[]) => string); - } - - if (isPlainObject(value)) { - return prepareThemeForRootCssVariableInjection({ - themeNode: value, - prefix: name, - }); - } - - return [[`--${name}`, String(value)]]; -}; - -// Collects a flat [--css-variable-name, value] list by walking a runtime -// theme object. Used to inject custom properties onto the DOM root. -// { font: { color: { primary: '#333' } } } -// → [['--t-font-color-primary', '#333']] -export const prepareThemeForRootCssVariableInjection = ({ - themeNode, - prefix, -}: { - themeNode: Record; - prefix: string; -}): [string, string][] => - Object.entries(themeNode).flatMap(([key, value]) => { - const name = `${prefix}-${camelToKebab(key)}`; - return collectEntriesForValue({ key, value, name }); - });