From d067e81a696808240094066d0272e2cc1f295aa1 Mon Sep 17 00:00:00 2001 From: Danny White <3104761+dnywh@users.noreply.github.com> Date: Thu, 24 Sep 2026 09:56:31 +1000 Subject: [PATCH] fix(ui): align primary colours across text, buttons, and controls (#50697) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem Primary colour serves readable text and selected controls, but those uses need different shades. Light mode needs darker text, while dark mode needs a deeper button fill. Fixed brand green on interactive chrome also prevents a custom primary hue from carrying through the interface. Some slider tracks and selected text are hard to read. ## Solution - Keep `--primary` for accessible text and small selected indicators. Use `--primary-solid` for button fills, which need a deeper shade in dark mode. - Add `--primary-bright` for focus rings, selected control chrome, chart accents, and other interactive highlights. It follows `--primary-hue`; `brand-*` stays fixed for Supabase identity. - Make slider troughs clearer and text selection translucent with theme foreground text. - Document the split in the design-system colour guide. | Before | After | | --- | --- | | Before: light mode primary
controls | After: light mode primary
controls | | Before: slider track | After: slider track | | Before: dark mode controls | After: dark mode controls | ## Review instructions 1. Compare light and dark mode in the [colour usage guide](https://design-system-git-dnywh-fix-bright-brand-chrome-supabase.vercel.app/design-system/docs/color-usage#primary-and-brand-colors). Check primary ink, primary-solid, primary-bright, and fixed brand swatches. 2. In Studio, open the ‘new table’ sheet in [Table Editor](https://studio-staging-git-dnywh-fix-bright-brand-chrome-supabase.vercel.app/dashboard/project/_/editor). Tab through the new table sheet's fields and toggles. Check the focus rings, selected controls, and the sheet's edges in both themes. You do not need to save a table. 3. Select text in Studio in both themes, including a link or primary-coloured label. The selection and text should remain legible. 4. Check the [Field](https://design-system-git-dnywh-fix-bright-brand-chrome-supabase.vercel.app/design-system/docs/components/field) Price Range slider: the unused track should remain visible in both themes. The selected field card border should follow primary-bright. 5. Check the [Button](https://design-system-git-dnywh-fix-bright-brand-chrome-supabase.vercel.app/design-system/docs/components/button) and [Radio Group](https://design-system-git-dnywh-fix-bright-brand-chrome-supabase.vercel.app/design-system/docs/components/radio-group) previews. In dark mode, `primary` button fill should be deeper than primary [text](https://design-system-git-dnywh-fix-bright-brand-chrome-supabase.vercel.app/design-system/docs/color-usage#text); selected radios should remain readable. --- apps/design-system/components/colors.tsx | 6 +- .../content/docs/accessibility.mdx | 4 +- .../content/docs/color-usage.mdx | 53 ++++++++++-- .../design-system/content/docs/typography.mdx | 5 +- .../content/docs/ui-patterns/charts.mdx | 82 +++++++++---------- .../default/block/chart-composed-basic.tsx | 2 +- .../example/page-layout-edge-function.tsx | 6 +- .../example/success-check-selected.tsx | 4 +- .../components/grid/components/grid/Grid.tsx | 2 +- .../Connect/OrganizationSelector.tsx | 4 +- .../DestinationForm/BigQuery/Fields.tsx | 2 +- .../ReplicationPipelineLayout.test.tsx | 2 +- .../Database/Replication/RowMenu.tsx | 2 +- .../Database/Schemas/DefaultEdge.tsx | 4 +- .../Database/Schemas/SchemaTableNode.tsx | 4 +- .../ComputeAndDiskUsageCharts.tsx | 4 +- .../DiskManagement/ui/DiskSpaceBar.tsx | 2 +- .../ExplainVisualizer.Header.tsx | 2 +- .../Explorer/QueryEditor/QueryResultChart.tsx | 2 +- .../EdgeFunctionOverview.utils.ts | 8 +- .../ConnectedResourceGroupSection.tsx | 2 +- .../JwtSecrets/algorithm-hover-card.tsx | 2 +- .../DatabaseConnections/ActivityRow.tsx | 2 +- .../BillingBreakdown/BillingMetric.tsx | 2 +- .../BillingBreakdown/ComputeMetric.tsx | 4 +- .../BillingSettings/Subscription/PlanCard.tsx | 4 +- .../SubscriptionPlanUpdateDialog.tsx | 2 +- .../ProjectHome/CustomReportSection.tsx | 2 +- .../interfaces/Reports/utils/geo.ts | 20 ++--- .../SQLEditor/UtilityPanel/UtilityActions.tsx | 4 +- .../CustomDomainConfig/CustomDomainDelete.tsx | 2 +- .../InstanceNode.tsx | 2 +- .../InfrastructureConfiguration/MapView.tsx | 4 +- .../Settings/Logs/PreviewFilterPanel.tsx | 2 +- .../TableGridEditor/InsertButton.tsx | 4 +- .../SidePanelEditor/SidePanelEditor.utils.tsx | 4 +- .../layouts/AppLayout/AdvisorButton.test.tsx | 4 +- .../layouts/AppLayout/AdvisorButton.tsx | 2 +- .../LayoutHeader/MergeRequestButton.tsx | 2 +- .../layouts/ProjectLayout/BuildingState.tsx | 2 +- .../SQLEditorNavV2/SQLEditorTreeViewItem.tsx | 2 +- .../ui/AIAssistantPanel/AIOnboarding.tsx | 2 +- .../components/ui/Charts/Charts.constants.ts | 4 +- .../ui/DataTable/primitives/Slider.tsx | 6 +- apps/studio/components/ui/DotPing.tsx | 4 +- .../components/ui/ReactFlow/EdgeVisual.tsx | 2 +- .../[ref]/database/backups/scheduled.tsx | 2 +- .../project/[ref]/logs/explorer/templates.tsx | 4 +- apps/studio/styles/grid.css | 7 +- apps/studio/styles/react-data-grid-logs.css | 6 +- apps/studio/styles/ui.css | 15 ++-- packages/config/css/theme.css | 7 +- .../src/Chart/charts/chart-bar.tsx | 8 +- .../src/Chart/charts/chart-line.tsx | 6 +- packages/ui-patterns/src/Chart/index.tsx | 10 +-- .../src/FilterBar/FilterCondition.tsx | 2 +- packages/ui-patterns/src/MetricCard/index.tsx | 6 +- packages/ui/build/css/source/semantic.css | 42 ++++++++-- packages/ui/build/css/themes/light.css | 7 +- .../ui/src/components/Button/Button.test.tsx | 4 +- packages/ui/src/components/Button/Button.tsx | 22 ++--- packages/ui/src/components/Menu/Menu.tsx | 2 +- .../ui/src/components/shadcn/ui/button.tsx | 3 +- .../ui/src/components/shadcn/ui/calendar.tsx | 11 ++- .../ui/src/components/shadcn/ui/field.tsx | 2 +- .../ui/src/components/shadcn/ui/slider.tsx | 2 +- .../ui/src/components/shadcn/ui/switch.tsx | 4 +- packages/ui/src/lib/tailwind-demo-classes.ts | 1 + 68 files changed, 276 insertions(+), 189 deletions(-) diff --git a/apps/design-system/components/colors.tsx b/apps/design-system/components/colors.tsx index 23948a3802a..d50fc829a9e 100644 --- a/apps/design-system/components/colors.tsx +++ b/apps/design-system/components/colors.tsx @@ -7,10 +7,14 @@ const color = colors['default'] const Colors = ({ definition, + classes, }: { definition: 'background' | 'border' | 'text' | 'colors' | 'palletes' + /** Optional subset of utility classes. Defaults to the full set for `definition`. */ + classes?: string[] }) => { const [copiedIndex, setCopiedIndex] = useState(null) + const items = classes ?? color[definition] const handleCopy = async (value: string, index: number) => { try { @@ -63,7 +67,7 @@ const Colors = ({ return ( <> - {color[definition].map((x: string, i) => { + {items.map((x: string, i) => { return ( `s, use `focus-inset` only. `focus-ring` will look fine in some browsers and invisible in others diff --git a/apps/design-system/content/docs/color-usage.mdx b/apps/design-system/content/docs/color-usage.mdx index 51e5b530f87..c31587550d0 100644 --- a/apps/design-system/content/docs/color-usage.mdx +++ b/apps/design-system/content/docs/color-usage.mdx @@ -5,21 +5,58 @@ description: Colors system breakdown with best practices. The shorthand utility classes below simplify our full color palette by providing sensible, contrast-checked defaults. Use them whenever possible to ensure accessible text colors and balanced background fills. +## Primary and brand colors + +Primary is the theme's functional accent. Changing `--primary-hue` updates primary text, buttons, selected controls, and focus rings. Brand is the fixed Supabase palette for product identity. + +| Role | Tokens | Follows the primary hue? | +| ----------------- | ------------------------------------------------------------ | ------------------------ | +| Functional accent | `--primary`, `--primary-solid`, `--primary-bright`, `--ring` | Yes | +| Supabase identity | `brand-default`, `brand-*` | No | + +### Primary ink + +`--primary` is for readable UI: links, labels, radios, step dots, and other small indicators. Utilities include `text-primary`, `bg-primary`, and `border-primary`. + +In light mode it is darkened to meet WCAG AA for normal text. In dark mode it stays bright so those controls remain visible on dark surfaces. + +### Primary solid + +`--primary-solid` is the deeper fill for primary buttons. In dark mode it is darker than `--primary` so buttons do not read as lime. In light mode it matches `--primary`, so ink and buttons share one green. Primary Button uses `bg-primary-solid` / `text-primary-solid-foreground`. + +### Bright primary + +`--primary-bright` gives focus rings, selected controls, and other interactive chrome a brighter version of the primary hue. It stays vivid when light-mode `--primary` is darkened for readable text. Use `bg-primary-bright`, `border-primary-bright`, and the shared `ring-ring` focus treatment. + +### Brand green + +`brand-default` remains the fixed Supabase green for explicitly branded surfaces. + +Toggle the theme to compare the swatches below. Light mode collapses primary and primary-solid; dark mode separates bright ink from the deeper button plate: + + + +See also [Typography](../docs/typography) (`text-primary`) and [Accessibility](../docs/accessibility#focus-management) (shared focus ring). + ## Text Use accent text colors (e.g. text-destructive, text-warning) sparingly to avoid visual overload. -Use `text-primary` for readable branded text such as links, labels, and statuses. On light-theme -surfaces it meets the 4.5:1 WCAG AA requirement for normal text. Use `bg-brand-default` / -`border-brand-default` when you need the canonical bright Supabase green as a fill or border. +Use `text-primary` for readable branded text such as links, labels, and statuses. It meets +WCAG AA for normal text on the surfaces used by the apps: darkened in light mode, bright in +dark mode. Primary buttons use a separate solid plate in dark mode; focus chrome uses +the brighter primary hue. See [Primary and brand colors](#primary-and-brand-colors). ## Background -Use `bg-brand-default` when the canonical Supabase green is required as a fill. The same -`brand-default` suffix applies to borders and other non-text utilities, such as -`border-brand-default`. +Use `bg-primary-bright` for selected controls that need a vivid fill, and `bg-primary` +for smaller indicators such as radios and step dots. Use `bg-brand-default` only when +the canonical Supabase green is required. Details in [Primary and brand colors](#primary-and-brand-colors). @@ -40,7 +77,7 @@ We use backgrounds in 2 different ways. In the ./www and ./docs sites, we use a {children} ``` -### Backgrounds and Surfaces +### Backgrounds and surfaces #### `./apps/www` + `./apps/docs` @@ -72,7 +109,7 @@ This is not to be confused with `Dialogs`, they require to use the same app back -## Other Colors +## Other colors These can also be accessed with `foreground`. Like `text-foreground-light`. diff --git a/apps/design-system/content/docs/typography.mdx b/apps/design-system/content/docs/typography.mdx index ec6302c945b..80b5ed96808 100644 --- a/apps/design-system/content/docs/typography.mdx +++ b/apps/design-system/content/docs/typography.mdx @@ -14,4 +14,7 @@ The shorthands below are composed of core [Tailwind utility classes](../docs/tai | `text-code-inline` | Apply to a `code` element for inline code or similar custom inline content | | `text-primary` | Accessible Supabase green for readable branded text | -`text-primary` is independent from `bg-brand-default`, `border-brand-default`, and other non-text brand utilities. Its light-mode value has at least 4.5:1 contrast against the light surfaces used by the apps, meeting WCAG AA for normal text. +`text-primary` meets WCAG AA for normal text on app surfaces: darkened in light mode, +bright in dark mode. Focus rings and selected controls derive their brighter fill from +the same primary hue. See [Primary and brand colors](../docs/color-usage#primary-and-brand-colors) for when +to use each green. diff --git a/apps/design-system/content/docs/ui-patterns/charts.mdx b/apps/design-system/content/docs/ui-patterns/charts.mdx index db889d46815..849a4a273bc 100644 --- a/apps/design-system/content/docs/ui-patterns/charts.mdx +++ b/apps/design-system/content/docs/ui-patterns/charts.mdx @@ -222,27 +222,27 @@ type ChartConfig = { Line chart component for displaying time-series data. -| Prop | Type | Default | Description | -| ------------------- | --------------------------------------------------------------------- | ----------------------------- | ----------------------------------------------------------------- | -| `data` | `ChartLineTick[]` | - | Array of data points with timestamp | -| `dataKey` | `string` | - | Key in data object to plot | -| `config` | `ChartConfig?` | - | Chart configuration for styling | -| `onLineClick` | `(datum: ChartLineTick, tooltipData?: CategoricalChartState) => void` | - | Click handler for line points | -| `DateTimeFormat` | `string` | `'MMM D, YYYY, hh:mma'` | Date format for tooltips and labels | -| `isFullHeight` | `boolean` | `false` | Whether chart should take full height | -| `className` | `string` | - | Additional CSS classes | -| `color` | `string` | `'hsl(var(--brand-default))'` | Line color | -| `hoverColor` | `string` | `'hsl(var(--brand-500))'` | Line color on hover | -| `chartHighlight` | `ChartHighlight` | - | Highlight selection configuration | -| `updateDateRange` | `(from: string, to: string) => void` | - | Callback when date range is updated via highlight | -| `highlightActions` | `ChartHighlightAction[]` | - | Actions to show when area is highlighted | -| `syncId` | `string` | - | ID to sync multiple charts | -| `showHighlightArea` | `boolean` | `true` | Whether to show highlight area | -| `cursor` | `string` | - | Cursor style (defaults to 'crosshair' if chartHighlight provided) | -| `showGrid` | `boolean` | `false` | Whether to show grid lines | -| `showYAxis` | `boolean` | `false` | Whether to show Y-axis | -| `YAxisProps` | `object` | - | Additional Y-axis props (tick, tickFormatter, width, etc.) | -| `strokeWidth` | `number` | `1.5` | Line stroke width | +| Prop | Type | Default | Description | +| ------------------- | --------------------------------------------------------------------- | ------------------------- | ----------------------------------------------------------------- | +| `data` | `ChartLineTick[]` | - | Array of data points with timestamp | +| `dataKey` | `string` | - | Key in data object to plot | +| `config` | `ChartConfig?` | - | Chart configuration for styling | +| `onLineClick` | `(datum: ChartLineTick, tooltipData?: CategoricalChartState) => void` | - | Click handler for line points | +| `DateTimeFormat` | `string` | `'MMM D, YYYY, hh:mma'` | Date format for tooltips and labels | +| `isFullHeight` | `boolean` | `false` | Whether chart should take full height | +| `className` | `string` | - | Additional CSS classes | +| `color` | `string` | `'var(--primary-bright)'` | Line color | +| `hoverColor` | `string` | `'hsl(var(--brand-500))'` | Line color on hover | +| `chartHighlight` | `ChartHighlight` | - | Highlight selection configuration | +| `updateDateRange` | `(from: string, to: string) => void` | - | Callback when date range is updated via highlight | +| `highlightActions` | `ChartHighlightAction[]` | - | Actions to show when area is highlighted | +| `syncId` | `string` | - | ID to sync multiple charts | +| `showHighlightArea` | `boolean` | `true` | Whether to show highlight area | +| `cursor` | `string` | - | Cursor style (defaults to 'crosshair' if chartHighlight provided) | +| `showGrid` | `boolean` | `false` | Whether to show grid lines | +| `showYAxis` | `boolean` | `false` | Whether to show Y-axis | +| `YAxisProps` | `object` | - | Additional Y-axis props (tick, tickFormatter, width, etc.) | +| `strokeWidth` | `number` | `1.5` | Line stroke width | #### ChartLineTick Type @@ -275,26 +275,26 @@ Line chart component for displaying time-series data. Bar chart component for displaying time-series data. -| Prop | Type | Default | Description | -| ------------------- | -------------------------------------------------------------------- | ----------------------------- | ----------------------------------------------------------------- | -| `data` | `ChartBarTick[]` | - | Array of data points with timestamp | -| `dataKey` | `string` | - | Key in data object to plot | -| `config` | `ChartConfig?` | - | Chart configuration for styling | -| `onBarClick` | `(datum: ChartBarTick, tooltipData?: CategoricalChartState) => void` | - | Click handler for bars | -| `DateTimeFormat` | `string` | `'MMM D, YYYY, hh:mma'` | Date format for tooltips and labels | -| `isFullHeight` | `boolean` | `false` | Whether chart should take full height | -| `className` | `string` | - | Additional CSS classes | -| `color` | `string` | `'hsl(var(--brand-default))'` | Bar color | -| `hoverColor` | `string` | `'hsl(var(--brand-500))'` | Bar color on hover | -| `chartHighlight` | `ChartHighlight` | - | Highlight selection configuration | -| `updateDateRange` | `(from: string, to: string) => void` | - | Callback when date range is updated via highlight | -| `highlightActions` | `ChartHighlightAction[]` | - | Actions to show when area is highlighted | -| `syncId` | `string` | - | ID to sync multiple charts | -| `showHighlightArea` | `boolean` | `true` | Whether to show highlight area | -| `cursor` | `string` | - | Cursor style (defaults to 'crosshair' if chartHighlight provided) | -| `showGrid` | `boolean` | `false` | Whether to show grid lines | -| `showYAxis` | `boolean` | `false` | Whether to show Y-axis | -| `YAxisProps` | `object` | - | Additional Y-axis props (tick, tickFormatter, width, etc.) | +| Prop | Type | Default | Description | +| ------------------- | -------------------------------------------------------------------- | ------------------------------- | ----------------------------------------------------------------- | +| `data` | `ChartBarTick[]` | - | Array of data points with timestamp | +| `dataKey` | `string` | - | Key in data object to plot | +| `config` | `ChartConfig?` | - | Chart configuration for styling | +| `onBarClick` | `(datum: ChartBarTick, tooltipData?: CategoricalChartState) => void` | - | Click handler for bars | +| `DateTimeFormat` | `string` | `'MMM D, YYYY, hh:mma'` | Date format for tooltips and labels | +| `isFullHeight` | `boolean` | `false` | Whether chart should take full height | +| `className` | `string` | - | Additional CSS classes | +| `color` | `string` | `'var(--primary-bright)'` | Bar color | +| `hoverColor` | `string` | `'var(--primary-bright-hover)'` | Bar color on hover | +| `chartHighlight` | `ChartHighlight` | - | Highlight selection configuration | +| `updateDateRange` | `(from: string, to: string) => void` | - | Callback when date range is updated via highlight | +| `highlightActions` | `ChartHighlightAction[]` | - | Actions to show when area is highlighted | +| `syncId` | `string` | - | ID to sync multiple charts | +| `showHighlightArea` | `boolean` | `true` | Whether to show highlight area | +| `cursor` | `string` | - | Cursor style (defaults to 'crosshair' if chartHighlight provided) | +| `showGrid` | `boolean` | `false` | Whether to show grid lines | +| `showYAxis` | `boolean` | `false` | Whether to show Y-axis | +| `YAxisProps` | `object` | - | Additional Y-axis props (tick, tickFormatter, width, etc.) | #### ChartBarTick Type diff --git a/apps/design-system/registry/default/block/chart-composed-basic.tsx b/apps/design-system/registry/default/block/chart-composed-basic.tsx index d185c5e79bb..50452e943a6 100644 --- a/apps/design-system/registry/default/block/chart-composed-basic.tsx +++ b/apps/design-system/registry/default/block/chart-composed-basic.tsx @@ -48,7 +48,7 @@ export default function ComposedChartBasic() { const chartConfig = { standard_score: { label: 'Standard Score', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, performance: { label: 'Performance', diff --git a/apps/design-system/registry/default/example/page-layout-edge-function.tsx b/apps/design-system/registry/default/example/page-layout-edge-function.tsx index 431de74c788..5d9a4233150 100644 --- a/apps/design-system/registry/default/example/page-layout-edge-function.tsx +++ b/apps/design-system/registry/default/example/page-layout-edge-function.tsx @@ -154,21 +154,21 @@ const EXECUTION_TIME_CHART_CONFIG = { }, max_execution_time: { label: 'Max Execution Time', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, } satisfies ChartConfig const CPU_TIME_CHART_CONFIG = { max_cpu_time_used: { label: 'Max CPU Time', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, } satisfies ChartConfig const MEMORY_CHART_CONFIG = { avg_memory_used: { label: 'Memory Usage', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, } satisfies ChartConfig diff --git a/apps/design-system/registry/default/example/success-check-selected.tsx b/apps/design-system/registry/default/example/success-check-selected.tsx index 3a8894a1819..aa6f05d70f2 100644 --- a/apps/design-system/registry/default/example/success-check-selected.tsx +++ b/apps/design-system/registry/default/example/success-check-selected.tsx @@ -23,13 +23,13 @@ export default function SuccessCheckSelected() { className={cn( 'relative flex w-full items-center rounded-md border px-4 py-3 text-left text-sm transition-colors', isSelected - ? 'border-brand-default bg-brand-200/20 pr-10 dark:bg-brand-300' + ? 'border-primary-bright bg-primary-bright/10 pr-10' : 'hover:border-default hover:bg-surface-200' )} > {option} {isSelected && ( - + )} ) diff --git a/apps/studio/components/grid/components/grid/Grid.tsx b/apps/studio/components/grid/components/grid/Grid.tsx index cd65a0a148f..bea8bd30757 100644 --- a/apps/studio/components/grid/components/grid/Grid.tsx +++ b/apps/studio/components/grid/components/grid/Grid.tsx @@ -311,7 +311,7 @@ export const Grid = memo( 'flex flex-col items-center justify-center w-full h-full mt-9 transition', isTableEmpty && isDraggedOver && - 'border-2 border-dashed border-brand-default' + 'border-2 border-dashed border-primary-bright' )} >

This table is empty

diff --git a/apps/studio/components/interfaces/Connect/OrganizationSelector.tsx b/apps/studio/components/interfaces/Connect/OrganizationSelector.tsx index 7eff2bafc43..ad010de0a53 100644 --- a/apps/studio/components/interfaces/Connect/OrganizationSelector.tsx +++ b/apps/studio/components/interfaces/Connect/OrganizationSelector.tsx @@ -210,11 +210,11 @@ const ConnectOrganizationButton = ({ 'pointer-events-none shadow-none transition-colors', !disabled && !selected && 'group-hover:border-default group-hover:bg-surface-200', selected && - 'border-brand-default bg-brand-200/20 dark:bg-brand-300 pr-10 group-hover:border-brand-default group-hover:bg-brand-200/20' + 'border-primary-bright bg-primary-bright/10 pr-10 group-hover:border-primary-bright group-hover:bg-primary-bright/10' )} /> {selected && ( - + )} ) diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/BigQuery/Fields.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/BigQuery/Fields.tsx index a1d76098de4..2a308b9a3c2 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/BigQuery/Fields.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/BigQuery/Fields.tsx @@ -183,7 +183,7 @@ export const BigQueryFields = ({ {isDraggingFile ? ( diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineLayout.test.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineLayout.test.tsx index 7b54e31d441..aef947ac1b2 100644 --- a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineLayout.test.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineLayout.test.tsx @@ -325,7 +325,7 @@ describe('ReplicationPipelineLayout', () => { renderLayout() const updateButton = await screen.findByRole('button', { name: 'Update available' }) - expect(updateButton).toHaveClass('bg-primary') + expect(updateButton).toHaveClass('bg-primary-solid') await userEvent.click(updateButton) // The trigger button shares this name, so match the dialog's heading specifically expect(await screen.findByRole('heading', { name: 'Update available' })).toBeVisible() diff --git a/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx b/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx index 35fb8b73edd..6c3a4eb60a2 100644 --- a/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx +++ b/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx @@ -166,7 +166,7 @@ export const RowMenu = ({ /> {hasUpdate && ( )} diff --git a/apps/studio/components/interfaces/Database/Schemas/DefaultEdge.tsx b/apps/studio/components/interfaces/Database/Schemas/DefaultEdge.tsx index 2925695d662..fc2034776c5 100644 --- a/apps/studio/components/interfaces/Database/Schemas/DefaultEdge.tsx +++ b/apps/studio/components/interfaces/Database/Schemas/DefaultEdge.tsx @@ -53,7 +53,7 @@ const DefaultEdgeComponent = ({ id={id} path={edgePath} className={cn( - selected ? 'stroke-brand-default!' : isDownloading ? 'stroke-black!' : undefined + selected ? 'stroke-primary-bright!' : isDownloading ? 'stroke-black!' : undefined )} stroke="#000000" {...props} @@ -143,7 +143,7 @@ const EdgeRelationInfo = ({ {data.name} @@ -89,7 +89,7 @@ const TableNodeComponent = ({
diff --git a/apps/studio/components/interfaces/DiskManagement/ComputeAndDiskUsageCharts.tsx b/apps/studio/components/interfaces/DiskManagement/ComputeAndDiskUsageCharts.tsx index ec8d8b68dbc..2a2f8aeff6a 100644 --- a/apps/studio/components/interfaces/DiskManagement/ComputeAndDiskUsageCharts.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ComputeAndDiskUsageCharts.tsx @@ -56,7 +56,7 @@ const getRollingWindow = () => { const COMPUTE_CHART_CONFIG = { maxCpuUsage: { label: 'CPU', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, ramUsage: { label: 'Memory', @@ -71,7 +71,7 @@ const COMPUTE_CHART_CONFIG = { const DISK_CHART_CONFIG = { databaseUsagePercent: { label: 'Database', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, walUsagePercent: { label: 'WAL', diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx index 64abade0edb..8f5950d4d25 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx @@ -101,7 +101,7 @@ export const DiskSpaceBar = ({ form }: DiskSpaceBarProps) => {
diff --git a/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.Header.tsx b/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.Header.tsx index 7c74cc10aaf..4b52951057f 100644 --- a/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.Header.tsx +++ b/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.Header.tsx @@ -98,7 +98,7 @@ export function ExplainHeader({ mode, onToggleMode, summary, id, rows }: Explain Seq Scan (slow)
- + Index Scan (fast)
diff --git a/apps/studio/components/interfaces/Explorer/QueryEditor/QueryResultChart.tsx b/apps/studio/components/interfaces/Explorer/QueryEditor/QueryResultChart.tsx index 25412b9ea91..cd268828422 100644 --- a/apps/studio/components/interfaces/Explorer/QueryEditor/QueryResultChart.tsx +++ b/apps/studio/components/interfaces/Explorer/QueryEditor/QueryResultChart.tsx @@ -17,7 +17,7 @@ interface QueryResultChartProps { result?: QueryResult } -const Y_SERIES_COLORS = ['hsl(var(--brand-default))', 'var(--chart-2)', 'var(--chart-3)'] +const Y_SERIES_COLORS = ['var(--primary-bright)', 'var(--chart-2)', 'var(--chart-3)'] const toChartValue = (value: unknown): string | number => { if (typeof value === 'number' || typeof value === 'string') return value diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.utils.ts b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.utils.ts index a0d90f31fd9..c40caa6dab7 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.utils.ts +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.utils.ts @@ -84,7 +84,7 @@ export const EDGE_FUNCTION_CHART_INTERVALS: ChartIntervals[] = [ export const INVOCATION_CHART_CONFIG = { ok_count: { label: 'Ok', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, warning_count: { label: 'Warnings', @@ -99,7 +99,7 @@ export const INVOCATION_CHART_CONFIG = { export const CPU_TIME_CHART_CONFIG = { max_cpu_time_used: { label: 'Max CPU Time', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, } satisfies ChartConfig @@ -110,14 +110,14 @@ export const EXECUTION_TIME_CHART_CONFIG = { }, max_execution_time: { label: 'Max Execution Time', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, } satisfies ChartConfig export const MEMORY_CHART_CONFIG = { avg_memory_used: { label: 'Memory Usage', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, } satisfies ChartConfig diff --git a/apps/studio/components/interfaces/Integrations/Integration/ConnectedResourceGroupSection.tsx b/apps/studio/components/interfaces/Integrations/Integration/ConnectedResourceGroupSection.tsx index c5db730973c..b7b644d1662 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/ConnectedResourceGroupSection.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/ConnectedResourceGroupSection.tsx @@ -26,7 +26,7 @@ export const ResourceGroupSection = ({ ) : ( group.badge && ( - + {group.badge} ) diff --git a/apps/studio/components/interfaces/JwtSecrets/algorithm-hover-card.tsx b/apps/studio/components/interfaces/JwtSecrets/algorithm-hover-card.tsx index 373fd1206d3..3af6bc593ad 100644 --- a/apps/studio/components/interfaces/JwtSecrets/algorithm-hover-card.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/algorithm-hover-card.tsx @@ -53,7 +53,7 @@ export const AlgorithmHoverCard = ({ algorithm, legacy }: AlgorithmHoverCardProp href={link.url} target="_blank" rel="noopener noreferrer" - className="text-xs text-primary hover:text-brand-600 flex items-center" + className="text-xs text-primary hover:text-primary-hover flex items-center" > {link.label} diff --git a/apps/studio/components/interfaces/Observability/DatabaseConnections/ActivityRow.tsx b/apps/studio/components/interfaces/Observability/DatabaseConnections/ActivityRow.tsx index 14c0a8eb1ea..5bcabe4be1e 100644 --- a/apps/studio/components/interfaces/Observability/DatabaseConnections/ActivityRow.tsx +++ b/apps/studio/components/interfaces/Observability/DatabaseConnections/ActivityRow.tsx @@ -210,7 +210,7 @@ export const ActivityRow = ({ > {selectedPid === activity.pid && ( -
+
)} {/* Absolute (not inline in the flex row) so top-0/bottom-0 ignore the cell's padding and touch the adjacent row */} diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingMetric.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingMetric.tsx index 254d95d95c1..849182d7c50 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingMetric.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingMetric.tsx @@ -190,7 +190,7 @@ export const BillingMetric = ({ {metric.docLink.title} diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/ComputeMetric.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/ComputeMetric.tsx index ba6d5818cbf..07762f2f9da 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/ComputeMetric.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/ComputeMetric.tsx @@ -77,7 +77,7 @@ export const ComputeMetric = ({ Read more @@ -90,7 +90,7 @@ export const ComputeMetric = ({ Read more diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCard.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCard.tsx index ee1a08b9199..ba86f00b8f2 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCard.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanCard.tsx @@ -169,7 +169,7 @@ function ControlCard({ 'px-4 py-4 flex flex-col items-start justify-between', 'border rounded-md col-span-12 md:col-span-4 bg-surface-200', shouldHighlight && - 'ring-4 ring-brand-default animate-[pulse_1.5s_ease-in-out_1] motion-reduce:animate-none shadow-md shadow-brand-default/40' + 'ring-4 ring-primary-bright animate-[pulse_1.5s_ease-in-out_1] motion-reduce:animate-none shadow-md shadow-primary-bright/40' )} >
@@ -264,7 +264,7 @@ function ParityCard({ 'flex flex-col items-start justify-between', 'border rounded-md col-span-12 md:col-span-4 bg-surface-200', shouldHighlight && - 'ring-4 ring-brand-default animate-[pulse_1.5s_ease-in-out_1] motion-reduce:animate-none shadow-md shadow-brand-default/40' + 'ring-4 ring-primary-bright animate-[pulse_1.5s_ease-in-out_1] motion-reduce:animate-none shadow-md shadow-primary-bright/40' )} >
diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx index bee25de3588..af4f8760da7 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx @@ -436,7 +436,7 @@ export const SubscriptionPlanUpdateDialog = ({ {' '} + current spend diff --git a/apps/studio/components/interfaces/ProjectHome/CustomReportSection.tsx b/apps/studio/components/interfaces/ProjectHome/CustomReportSection.tsx index 72572ebed2c..af6bfd14ea3 100644 --- a/apps/studio/components/interfaces/ProjectHome/CustomReportSection.tsx +++ b/apps/studio/components/interfaces/ProjectHome/CustomReportSection.tsx @@ -396,7 +396,7 @@ export function CustomReportSection() {
{isDraggingOver && ( -
+
)} {layout.length === 0 ? (
high opacities boundaryStroke: string boundaryStrokeHover: string @@ -16,20 +16,20 @@ export interface MapChartTheme { export const MAP_CHART_THEME: { light: MapChartTheme; dark: MapChartTheme } = { light: { zeroFill: 'var(--background-surface-400)', - brandFill: 'hsl(var(--brand-default))', + primaryFill: 'var(--primary-bright)', opacityScale: [0.18, 0.32, 0.5, 0.68, 0.86], - boundaryStroke: 'hsl(var(--brand-300) / 0.6)', - boundaryStrokeHover: 'hsl(var(--brand-500))', - markerFill: 'hsl(var(--brand-default))', + boundaryStroke: 'oklch(from var(--primary-bright) l c h / 60%)', + boundaryStrokeHover: 'var(--primary-bright-hover)', + markerFill: 'var(--primary-bright)', oceanFill: 'transparent', }, dark: { zeroFill: 'var(--background-selection)', - brandFill: 'hsl(var(--brand-default))', + primaryFill: 'var(--primary-bright)', opacityScale: [0.18, 0.32, 0.5, 0.68, 0.86], - boundaryStroke: 'hsl(var(--brand-300) / 0.6)', - boundaryStrokeHover: 'hsl(var(--brand-500))', - markerFill: 'hsl(var(--brand-default))', + boundaryStroke: 'oklch(from var(--primary-bright) l c h / 60%)', + boundaryStrokeHover: 'var(--primary-bright-hover)', + markerFill: 'var(--primary-bright)', oceanFill: 'transparent', }, } @@ -52,7 +52,7 @@ export const getFillColor = ( theme: MapChartTheme = MAP_CHART_THEME.dark ): string => { if (max <= 0 || !value) return theme.zeroFill - return theme.brandFill + return theme.primaryFill } export const getFillOpacity = ( diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityActions.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityActions.tsx index a580b03b282..1f632ef9ad4 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityActions.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityActions.tsx @@ -140,7 +140,7 @@ export const UtilityActions = ({ strokeWidth={2} className={ isFavorite - ? 'fill-brand-default stroke-none' + ? 'fill-primary-bright stroke-none' : 'fill-none stroke-foreground-light' } /> @@ -200,7 +200,7 @@ export const UtilityActions = ({ size="tiny" onClick={() => saveFavorite(id, false)} className="px-1" - icon={} + icon={} aria-label="Remove from favorites" /> ) : ( diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainDelete.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainDelete.tsx index 1defb988137..ae3282f90bc 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainDelete.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainDelete.tsx @@ -46,7 +46,7 @@ export const CustomDomainDelete = ({ projectRef, customDomain }: CustomDomainDel

Active custom domain:

-
+
{customDomain.hostname} diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceNode.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceNode.tsx index 2fc7960e9ac..5a20b9637dd 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceNode.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceNode.tsx @@ -311,7 +311,7 @@ export const ReplicaNode = ({ data }: NodeProps>) => { type="horizontal" value={stagePercent * 100} max={100} - barClass="bg-brand-default" + barClass="bg-primary-bright" />
diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/MapView.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/MapView.tsx index 503c973d494..3081274ab3c 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/MapView.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/MapView.tsx @@ -178,7 +178,7 @@ const MapView = () => { )} @@ -188,7 +188,7 @@ const MapView = () => { hasNoDatabases ? 'fill-background-surface-300 stroke-border-stronger' : hasPrimary - ? 'fill-brand-default stroke-brand-500' + ? 'fill-primary-bright stroke-brand-500' : 'fill-brand-500 stroke-brand-400' }`} /> diff --git a/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanel.tsx b/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanel.tsx index 4c65a2629f0..d172a3787d4 100644 --- a/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanel.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanel.tsx @@ -196,7 +196,7 @@ export const PreviewFilterPanel = ({
{newCount > 0 && (
-
+
{newCount > 1000 ? `${Math.floor(newCount / 100) / 10}K` : newCount}
diff --git a/apps/studio/components/interfaces/TableGridEditor/InsertButton.tsx b/apps/studio/components/interfaces/TableGridEditor/InsertButton.tsx index 6a0c3565d71..73b27d1d818 100644 --- a/apps/studio/components/interfaces/TableGridEditor/InsertButton.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/InsertButton.tsx @@ -76,7 +76,7 @@ export const InsertButton = () => {
@@ -97,7 +97,7 @@ export const InsertButton = () => {
diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx index b93c3856de4..c8dbb0c617e 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx @@ -592,7 +592,7 @@ export const createTable = async ({ value={progress} max={100} type="horizontal" - barClass="bg-brand-default" + barClass="bg-primary-bright" labelBottom={`Adding ${importContent.rowCount.toLocaleString()} rows to ${table.name}`} labelBottomClass="" labelTop={`${progress.toFixed(2)}%`} @@ -629,7 +629,7 @@ export const createTable = async ({ value={progress} max={100} type="horizontal" - barClass="bg-brand-default" + barClass="bg-primary-bright" labelBottom={`Adding ${importContent.rows.length.toLocaleString()} rows to ${table.name}`} labelTop={`${progress.toFixed(2)}%`} labelTopClass="tabular-nums" diff --git a/apps/studio/components/layouts/AppLayout/AdvisorButton.test.tsx b/apps/studio/components/layouts/AppLayout/AdvisorButton.test.tsx index 72438ce15b1..78241055072 100644 --- a/apps/studio/components/layouts/AppLayout/AdvisorButton.test.tsx +++ b/apps/studio/components/layouts/AppLayout/AdvisorButton.test.tsx @@ -84,7 +84,7 @@ describe('AdvisorButton', () => { expect(container.querySelector('.bg-warning')).toBeInTheDocument() expect(container.querySelector('.bg-destructive')).not.toBeInTheDocument() - expect(container.querySelector('.bg-brand-default')).not.toBeInTheDocument() + expect(container.querySelector('.bg-primary-bright')).not.toBeInTheDocument() }) it('keeps the destructive dot when a critical issue is present', () => { @@ -151,7 +151,7 @@ describe('AdvisorButton', () => { const { container } = render() - expect(container.querySelector('.bg-brand-default')).toBeInTheDocument() + expect(container.querySelector('.bg-primary-bright')).toBeInTheDocument() expect(container.querySelector('.bg-warning')).not.toBeInTheDocument() expect(container.querySelector('.bg-destructive')).not.toBeInTheDocument() expect(screen.getByRole('button')).toBeInTheDocument() diff --git a/apps/studio/components/layouts/AppLayout/AdvisorButton.tsx b/apps/studio/components/layouts/AppLayout/AdvisorButton.tsx index 286152ec0b3..f64f9511e3e 100644 --- a/apps/studio/components/layouts/AppLayout/AdvisorButton.tsx +++ b/apps/studio/components/layouts/AppLayout/AdvisorButton.tsx @@ -86,7 +86,7 @@ export const AdvisorButton = ({ projectRef }: { projectRef?: string }) => { ) : hasWarningIssues ? ( ) : hasUnreadNotifications ? ( - + ) : null}
) diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/MergeRequestButton.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/MergeRequestButton.tsx index ce40f77066a..0bc91dedd7d 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/MergeRequestButton.tsx +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/MergeRequestButton.tsx @@ -73,7 +73,7 @@ export const MergeRequestButton = () => { icon={
{hasReviewRequested && ( - + )}
diff --git a/apps/studio/components/layouts/ProjectLayout/BuildingState.tsx b/apps/studio/components/layouts/ProjectLayout/BuildingState.tsx index 7bfd8a5af8f..4363321c07a 100644 --- a/apps/studio/components/layouts/ProjectLayout/BuildingState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/BuildingState.tsx @@ -96,7 +96,7 @@ const BuildingState = () => { Browse the Supabase{' '} diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx index a17c94089a4..dfb2560c9c6 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx @@ -429,7 +429,7 @@ export const SQLEditorTreeViewItem = ({ size={14} className={cn( isFavorite - ? 'fill-brand-default stroke-none' + ? 'fill-primary-bright stroke-none' : 'fill-none stroke-foreground-light' )} /> diff --git a/apps/studio/components/ui/AIAssistantPanel/AIOnboarding.tsx b/apps/studio/components/ui/AIAssistantPanel/AIOnboarding.tsx index 74771eb8ecb..e8896945bfe 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIOnboarding.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIOnboarding.tsx @@ -60,7 +60,7 @@ export const AIOnboarding = ({ key={template.title} type="button" tabIndex={0} - className="rounded-md text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand" + className="rounded-md text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" onClick={() => { onValueChange(template.initialMessage) onFocusInput?.() diff --git a/apps/studio/components/ui/Charts/Charts.constants.ts b/apps/studio/components/ui/Charts/Charts.constants.ts index 8abe3c3b32c..2d9c76cd7ff 100644 --- a/apps/studio/components/ui/Charts/Charts.constants.ts +++ b/apps/studio/components/ui/Charts/Charts.constants.ts @@ -5,8 +5,8 @@ export const CHART_COLORS = { TICK: 'var(--background-overlay-hover)', AXIS: 'var(--background-overlay-hover)', - GREEN_1: 'hsl(var(--brand-default))', - GREEN_2: 'hsl(var(--brand-500))', + GREEN_1: 'var(--primary-bright)', + GREEN_2: 'var(--primary-solid)', RED_1: 'hsl(var(--destructive-default))', RED_2: 'hsl(var(--destructive-500))', REFERENCE_LINE: 'var(--foreground-muted)', diff --git a/apps/studio/components/ui/DataTable/primitives/Slider.tsx b/apps/studio/components/ui/DataTable/primitives/Slider.tsx index c3b0cec7aae..b117c50bdb5 100644 --- a/apps/studio/components/ui/DataTable/primitives/Slider.tsx +++ b/apps/studio/components/ui/DataTable/primitives/Slider.tsx @@ -17,12 +17,12 @@ export const Slider = forwardRef< className={cn('relative flex w-full touch-none select-none items-center', className)} {...props} > - - + + {initialValue.map((_, index) => ( - + ))} diff --git a/apps/studio/components/ui/DotPing.tsx b/apps/studio/components/ui/DotPing.tsx index 711103c9fdc..c36162c6647 100644 --- a/apps/studio/components/ui/DotPing.tsx +++ b/apps/studio/components/ui/DotPing.tsx @@ -12,7 +12,7 @@ export const DotPing = ({ animate = true, variant = 'primary' }: DotPingProps) = className={cn( 'absolute inset-0 rounded-full', animate && 'animate-ping', - variant === 'primary' && 'bg-brand-default/20', + variant === 'primary' && 'bg-primary-bright/20', variant === 'default' && 'bg-selection/20', variant === 'warning' && 'bg-warning/20' )} @@ -24,7 +24,7 @@ export const DotPing = ({ animate = true, variant = 'primary' }: DotPingProps) = { restore to a specific time (down to the second) within your selected PITR retention period.{' '} Learn more diff --git a/apps/studio/pages/project/[ref]/logs/explorer/templates.tsx b/apps/studio/pages/project/[ref]/logs/explorer/templates.tsx index 7a960b9f3f4..62bfa1bdc77 100644 --- a/apps/studio/pages/project/[ref]/logs/explorer/templates.tsx +++ b/apps/studio/pages/project/[ref]/logs/explorer/templates.tsx @@ -62,9 +62,9 @@ const Template = ({ projectRef, template }: { projectRef?: string; template: Log className={cn( 'duration-400 flex h-6 w-6 items-center justify-center rounded-sm transition-colors', 'border bg-background-200', - 'group-hover:bg-brand-300 group-hover:text-brand-600 group-hover:border-brand-500', + 'group-hover:bg-primary-bright/15 group-hover:text-primary group-hover:border-primary-bright', 'dark:border-background-selection dark:bg-background-200 dark:text-foreground', - 'dark:group-hover:border-brand-600 dark:group-hover:bg-brand-300 dark:group-hover:text-brand-600' + 'dark:group-hover:border-primary-bright dark:group-hover:bg-primary-bright/15 dark:group-hover:text-primary' )} >
diff --git a/apps/studio/styles/grid.css b/apps/studio/styles/grid.css index 1c272a8d16d..a2f79b5ba2f 100644 --- a/apps/studio/styles/grid.css +++ b/apps/studio/styles/grid.css @@ -59,13 +59,13 @@ } .rdg-cell { - border-left-color: hsl(var(--brand-default)); + border-left-color: var(--primary-bright); color: var(--primary); } /* First cell gets a stronger left border to indicate new row */ .rdg-cell:first-child { - box-shadow: inset 2px 0 0 0 hsl(var(--brand-default)); + box-shadow: inset 2px 0 0 0 var(--primary-bright); } } @@ -329,7 +329,7 @@ } .sb-grid-column-header__inner svg { - @apply border-brand-default text-primary; + @apply border-primary-bright text-primary; } /* @@ -345,6 +345,5 @@ } .sb-grid-select-cell__header__input { - /* @apply focus:ring-brand-300; */ @apply border-background-surface-100; } diff --git a/apps/studio/styles/react-data-grid-logs.css b/apps/studio/styles/react-data-grid-logs.css index 577a243a5fb..dfae7f777c0 100644 --- a/apps/studio/styles/react-data-grid-logs.css +++ b/apps/studio/styles/react-data-grid-logs.css @@ -29,7 +29,7 @@ .rdg-row { &.rdg-row--focused { - @apply border-r border-brand-default; + @apply border-r border-primary-bright; border-right-width: 4px; } @@ -71,7 +71,7 @@ .rdg-row { &.rdg-row--focused { - @apply border-r border-brand-default; + @apply border-r border-primary-bright; border-right-width: 4px; } @@ -105,7 +105,7 @@ background: linear-gradient( to right, var(--background-default) 0%, - hsl(var(--brand-default)) 25%, + var(--primary-bright) 25%, hsl(var(--brand-300)) 35%, var(--background-default) 45%, var(--background-surface-100) 75% diff --git a/apps/studio/styles/ui.css b/apps/studio/styles/ui.css index 5096e35154d..04db282fe9d 100644 --- a/apps/studio/styles/ui.css +++ b/apps/studio/styles/ui.css @@ -267,7 +267,7 @@ } a:hover { - @apply text-brand-600; + @apply text-primary; } p:last-child { @@ -301,15 +301,14 @@ } } -::-moz-selection { - /* Code for Firefox */ - @apply bg-brand-default; - color: #333 !important; +::selection { + background-color: oklch(from var(--primary-bright) l c h / 40%); + color: var(--foreground) !important; } -::selection { - background-color: #6ee7b7; - color: #333 !important; +::-moz-selection { + background-color: oklch(from var(--primary-bright) l c h / 40%); + color: var(--foreground) !important; } .has-hidden-children { diff --git a/packages/config/css/theme.css b/packages/config/css/theme.css index a93a6b5e121..4a31e180e0b 100644 --- a/packages/config/css/theme.css +++ b/packages/config/css/theme.css @@ -14,7 +14,11 @@ --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); --color-primary: var(--primary); + --color-primary-hover: var(--primary-hover); + --color-primary-bright: var(--primary-bright); --color-primary-foreground: var(--primary-foreground); + --color-primary-solid: var(--primary-solid); + --color-primary-solid-foreground: var(--primary-solid-foreground); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-tertiary: var(--tertiary); @@ -74,7 +78,7 @@ --color-brand-400: hsl(var(--brand-400)); --color-brand-500: hsl(var(--brand-500)); --color-brand-600: hsl(var(--brand-600)); - /* Alias leftover bg-brand / border-brand to the bright fill. Prefer brand-default / primary. */ + /* Brand remains the fixed Supabase palette. Functional chrome uses primary. */ --color-brand: hsl(var(--brand-default)); --color-brand-default: hsl(var(--brand-default)); --color-_secondary-200: hsl(var(--secondary-200)); @@ -334,6 +338,7 @@ --color-border-warning: var(--border-warning); --color-border-info: var(--border-info); --color-border-brand-default: var(--border-brand-default); + --color-border-primary-bright: var(--border-primary-bright); /* * This will generate colors only for border utilities * i.e. bg-muted and they'll only have border-color: var(--border-muted) rule diff --git a/packages/ui-patterns/src/Chart/charts/chart-bar.tsx b/packages/ui-patterns/src/Chart/charts/chart-bar.tsx index 1418ac7ab9a..6a7c839d292 100644 --- a/packages/ui-patterns/src/Chart/charts/chart-bar.tsx +++ b/packages/ui-patterns/src/Chart/charts/chart-bar.tsx @@ -20,8 +20,8 @@ const DIMMED_FILL_OPACITY = 0.35 const CHART_COLORS = { TICK: 'var(--background-overlay-hover)', AXIS: 'var(--background-overlay-hover)', - BRAND: 'hsl(var(--brand-default))', - BRAND_HOVER: 'hsl(var(--brand-500))', + PRIMARY: 'var(--primary-bright)', + PRIMARY_HOVER: 'var(--primary-bright-hover)', } export type ChartBarTick = @@ -97,8 +97,8 @@ export const ChartBar = ({ DateTimeFormat = 'MMM D, YYYY, hh:mma', isFullHeight = false, className, - color = CHART_COLORS.BRAND, - hoverColor = CHART_COLORS.BRAND_HOVER, + color = CHART_COLORS.PRIMARY, + hoverColor = CHART_COLORS.PRIMARY_HOVER, chartHighlight, syncId, showHighlightArea = true, diff --git a/packages/ui-patterns/src/Chart/charts/chart-line.tsx b/packages/ui-patterns/src/Chart/charts/chart-line.tsx index 9ef6069064e..0bd3fb62413 100644 --- a/packages/ui-patterns/src/Chart/charts/chart-line.tsx +++ b/packages/ui-patterns/src/Chart/charts/chart-line.tsx @@ -18,8 +18,8 @@ import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, cn } fr const CHART_COLORS = { TICK: 'var(--background-overlay-hover)', AXIS: 'var(--background-overlay-hover)', - BRAND: 'hsl(var(--brand-default))', - BRAND_HOVER: 'hsl(var(--brand-500))', + PRIMARY: 'var(--primary-bright)', + PRIMARY_HOVER: 'var(--primary-bright-hover)', } export type ChartLineTick = @@ -104,7 +104,7 @@ export const ChartLine = ({ DateTimeFormat = 'MMM D, YYYY, hh:mma', isFullHeight = false, className, - color = CHART_COLORS.BRAND, + color = CHART_COLORS.PRIMARY, chartHighlight, syncId, showHighlightArea = true, diff --git a/packages/ui-patterns/src/Chart/index.tsx b/packages/ui-patterns/src/Chart/index.tsx index bce8fb58749..946d5fa9df9 100644 --- a/packages/ui-patterns/src/Chart/index.tsx +++ b/packages/ui-patterns/src/Chart/index.tsx @@ -448,7 +448,7 @@ const ChartDisabledState = ({ icon, label, description, actions }: ChartDisabled { demo: { label: 'Demo', - color: 'hsl(var(--brand-default))', + color: 'var(--primary-bright)', }, } satisfies ChartConfig } @@ -457,7 +457,7 @@ const ChartDisabledState = ({ icon, label, description, actions }: ChartDisabled - +
@@ -584,8 +584,8 @@ const ChartSparkline = React.forwardRef( - - + + } /> @@ -594,7 +594,7 @@ const ChartSparkline = React.forwardRef( dataKey={dataKey || 'value'} fill="url(#sparklineGradient)" fillOpacity={0.1} - stroke="hsl(var(--brand-default))" + stroke="var(--primary-bright)" strokeWidth={1.5} /> diff --git a/packages/ui-patterns/src/FilterBar/FilterCondition.tsx b/packages/ui-patterns/src/FilterBar/FilterCondition.tsx index 9bf3aed1ad2..6a512c7d79f 100644 --- a/packages/ui-patterns/src/FilterBar/FilterCondition.tsx +++ b/packages/ui-patterns/src/FilterBar/FilterCondition.tsx @@ -265,7 +265,7 @@ export function FilterCondition({ className={cn( 'flex items-stretch px-0 h-[26px] bg-muted group shrink-0', variant === 'pill' ? 'rounded-sm border' : 'border-r', - isHighlighted && 'ring-2 ring-primary' + isHighlighted && 'ring-2 ring-primary-bright' )} data-testid={`filter-condition-${property.name}`} data-highlighted={isHighlighted} diff --git a/packages/ui-patterns/src/MetricCard/index.tsx b/packages/ui-patterns/src/MetricCard/index.tsx index 45fb432c80b..6a3470ac96f 100644 --- a/packages/ui-patterns/src/MetricCard/index.tsx +++ b/packages/ui-patterns/src/MetricCard/index.tsx @@ -263,8 +263,8 @@ const MetricCardSparkline = React.forwardRef - - + + } /> @@ -273,7 +273,7 @@ const MetricCardSparkline = React.forwardRef diff --git a/packages/ui/build/css/source/semantic.css b/packages/ui/build/css/source/semantic.css index 4542dbb13c9..4a51e400faa 100644 --- a/packages/ui/build/css/source/semantic.css +++ b/packages/ui/build/css/source/semantic.css @@ -13,7 +13,7 @@ * and the brand, so the two could never drift apart. They are now split so a * theme can run, say, a cool-gray surface against the green brand: * --surface-hue tints backgrounds, text and borders (the neutral ramp) - * --primary-hue is the brand hue that --primary is built from + * --primary-hue is the spot hue that functional primary colors use * Both default to --hue (Supabase green ≈157.5° in OKLCH), so a theme that only * sets --hue keeps surfaces and brand locked together as before; override * either one to let them diverge. */ @@ -150,7 +150,7 @@ ); /* Inverse of --foreground: canvas-coloured text for use on inverted fills (bg-foreground, bg-black / dark:bg-white, etc). Not the same as - --primary-foreground, which stays light for the dark primary fill. */ + --primary-solid-foreground, which stays light on the deep button plate. */ --foreground-contrast: oklch(var(--surface) calc(var(--chroma) * 0.55) var(--surface-hue)); --card: oklch(from var(--background) calc(l + var(--elevation-step) * var(--elevation-1)) c h); @@ -159,14 +159,22 @@ --popover-foreground: var(--foreground); /* - * Primary is the accessible functional green (text, controls). Bright - * expressive fills use brand-default. Light theme overrides --primary for AA text. + * Primary ink vs primary solid fill: + * --primary Readable branded text / small indicators. Root + * values mirror dark theme (bright). Light theme + * overrides for AA text on light surfaces. + * --primary-solid Deeper button plate (dark mode). Light theme + * aliases these to --primary so ink and buttons + * share one green there. + * --primary-bright keeps rings and selected chrome vivid while sharing the + * hue of --primary. It is brighter than readable ink in light mode. * * Hover shifts lightness only (preserves hue/chroma). Mixing with --foreground * pulls light-mode surface-hue (warm) into the green and reads as yellow. * Sign of --tone-span: darken in light, lighten in dark. */ --primary: oklch(0.76 0.15 var(--primary-hue)); + --primary-bright: oklch(from var(--primary) max(l, 0.7) max(c, 0.15) h); --button-fill-hover-delta: 0.04; --primary-hover: oklch( from var(--primary) @@ -176,10 +184,29 @@ ) c h ); + --primary-bright-hover: oklch( + from var(--primary-bright) + calc( + l + var(--button-fill-hover-delta) * var(--tone-span) / + max(var(--tone-span), calc(var(--tone-span) * -1)) + ) + c h + ); --primary-foreground: oklch( min(var(--surface), var(--foreground-lightness)) calc(var(--chroma) * 0.45) var(--primary-hue) ); + --primary-solid: oklch(0.43627 0.11 var(--primary-hue)); + --primary-solid-hover: oklch( + from var(--primary-solid) + calc( + l + var(--button-fill-hover-delta) * var(--tone-span) / + max(var(--tone-span), calc(var(--tone-span) * -1)) + ) + c h + ); + --primary-solid-foreground: oklch(0.95 0.00275 var(--primary-hue)); + --secondary: oklch( from var(--background) calc(l + var(--elevation-step) * var(--elevation-3)) c h ); @@ -274,7 +301,9 @@ --border-destructive: oklch(from var(--destructive) l c h / 30%); --border-warning: oklch(from var(--warning) l c h / 30%); --border-info: oklch(from var(--info) l c h / 30%); - --border-brand-default: oklch(from var(--primary) l c h / 30%); + /* Keep the brand border for explicitly Supabase-branded surfaces. */ + --border-brand-default: oklch(from hsl(var(--brand-default)) l c h / 30%); + --border-primary-bright: oklch(from var(--primary-bright) l c h / 30%); --border: oklch( from var(--foreground) l calc(c * 0.54) h / calc(2% + 20% * var(--contrast-border)) @@ -290,5 +319,6 @@ --border-control-hover: oklch( from var(--foreground) l calc(c * 0.5) h / calc(12% + 58% * var(--contrast-border)) ); - --ring: oklch(from var(--primary) l c h / 55%); + /* Focus chrome follows the theme's primary hue without muddy light-mode ink. */ + --ring: oklch(from var(--primary-bright) l c h / 55%); } diff --git a/packages/ui/build/css/themes/light.css b/packages/ui/build/css/themes/light.css index 7a5770def36..40cae7a0efc 100644 --- a/packages/ui/build/css/themes/light.css +++ b/packages/ui/build/css/themes/light.css @@ -16,9 +16,14 @@ --foreground-lightness: 0.1; --muted-foreground-level: 0.65; --tertiary-foreground-level: 0.5; - /* Accessible primary for text/controls (~4.5:1+ on light surfaces). */ + /* Accessible primary for text and small indicators on light surfaces (~4.5:1+). + Solid button plates alias to the same green in light mode. Focus rings and + bright interactive chrome uses --primary-bright. */ --primary: oklch(0.525 0.12 var(--primary-hue)); --primary-foreground: oklch(0.99 0.00275 var(--primary-hue)); + --primary-solid: var(--primary); + --primary-solid-foreground: var(--primary-foreground); + --primary-solid-hover: var(--primary-hover); /* * Expressive fills run darker than the dark-theme anchors so they hold contrast * against the near-white surface (a light amber on white disappears). Lightness diff --git a/packages/ui/src/components/Button/Button.test.tsx b/packages/ui/src/components/Button/Button.test.tsx index 029449293fc..117fb0a8fdc 100644 --- a/packages/ui/src/components/Button/Button.test.tsx +++ b/packages/ui/src/components/Button/Button.test.tsx @@ -32,7 +32,7 @@ describe('#Button', () => { const button = screen.getByRole('button', { name: 'Neutral' }) expect(button.className).toContain('bg-card') expect(button.className).toContain('hover:bg-muted') - expect(button.className).not.toContain('bg-primary') + expect(button.className).not.toContain('bg-primary-solid') }) it('should apply tiny size classes when buttonVariants omits size', () => { @@ -45,7 +45,7 @@ describe('#Button', () => { render() const button = screen.getByRole('button', { name: 'Primary' }) - expect(button.className).toContain('bg-primary') + expect(button.className).toContain('bg-primary-solid') }) it('should render different text', () => { diff --git a/packages/ui/src/components/Button/Button.tsx b/packages/ui/src/components/Button/Button.tsx index df2c182c84f..9c4a6672f1d 100644 --- a/packages/ui/src/components/Button/Button.tsx +++ b/packages/ui/src/components/Button/Button.tsx @@ -38,12 +38,12 @@ const buttonVariants = cva( variant: { primary: ` border-0 - bg-primary + bg-primary-solid bg-[linear-gradient(to_bottom,hsl(var(--colors-white)/0.015),hsl(var(--colors-black)/0.01))] - text-primary-foreground + text-primary-solid-foreground shadow-[var(--button-shadow-raised)] - hover:bg-[var(--primary-hover)] - data-[state=open]:bg-[var(--primary-hover)] + hover:bg-[var(--primary-solid-hover)] + data-[state=open]:bg-[var(--primary-solid-hover)] `, default: ` text-foreground @@ -76,12 +76,12 @@ const buttonVariants = cva( data-[state=open]:border-control-hover `, link: ` - text-brand-600 + text-primary border border-transparent/0 - hover:bg-brand-400 + hover:bg-primary-bright/15 shadow-none - data-[state=open]:bg-brand-400 + data-[state=open]:bg-primary-bright/15 `, text: ` text-foreground @@ -155,13 +155,13 @@ const IconContainerVariants = cva('inline-flex items-center justify-center shrin xxxlarge: '[&_svg]:h-[42px] [&_svg]:w-[42px]', }, variant: { - primary: 'text-primary-foreground/50', + primary: 'text-primary-solid-foreground/50', default: 'text-foreground-lighter', secondary: 'text-background', alternative: 'text-foreground-lighter', outline: 'text-foreground-lighter', dashed: 'text-foreground-lighter', - link: 'text-brand-600', + link: 'text-primary', text: 'text-foreground-lighter', danger: 'text-destructive-foreground/50', warning: 'text-warning-foreground/50', @@ -173,13 +173,13 @@ export type LoadingVariantProps = VariantProps const loadingVariants = cva('', { variants: { variant: { - primary: 'text-primary-foreground/50', + primary: 'text-primary-solid-foreground/50', default: 'text-foreground-lighter', secondary: 'text-background', alternative: 'text-foreground-lighter', outline: 'text-foreground-lighter', dashed: 'text-foreground-lighter', - link: 'text-brand-600', + link: 'text-primary', text: 'text-foreground-muted', danger: 'text-destructive-foreground/50', warning: 'text-warning-foreground/50', diff --git a/packages/ui/src/components/Menu/Menu.tsx b/packages/ui/src/components/Menu/Menu.tsx index 5279c353220..2f6fdc1d569 100644 --- a/packages/ui/src/components/Menu/Menu.tsx +++ b/packages/ui/src/components/Menu/Menu.tsx @@ -75,7 +75,7 @@ export const menuItemVariants = cva( type: 'border', active: true, className: - 'text-foreground-muted border-l border-brand-default group-hover:border-brand-default', + 'text-foreground-muted border-l border-primary-bright group-hover:border-primary-bright', }, { type: 'border', diff --git a/packages/ui/src/components/shadcn/ui/button.tsx b/packages/ui/src/components/shadcn/ui/button.tsx index 960c86492e5..83c96e22017 100644 --- a/packages/ui/src/components/shadcn/ui/button.tsx +++ b/packages/ui/src/components/shadcn/ui/button.tsx @@ -12,7 +12,8 @@ const buttonVariants = cva( { variants: { variant: { - default: 'bg-primary text-primary-foreground hover:bg-[var(--primary-hover)]', + default: + 'bg-primary-solid text-primary-solid-foreground hover:bg-[var(--primary-solid-hover)]', destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90', outline: 'border border-control bg-background hover:bg-accent hover:text-accent-foreground', secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80', diff --git a/packages/ui/src/components/shadcn/ui/calendar.tsx b/packages/ui/src/components/shadcn/ui/calendar.tsx index 05fa59a7bdd..5a744d621a0 100644 --- a/packages/ui/src/components/shadcn/ui/calendar.tsx +++ b/packages/ui/src/components/shadcn/ui/calendar.tsx @@ -83,7 +83,8 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }: C day_button ), selected: cn( - !fullDateRangeSelected && 'bg-brand-400! dark:bg-brand-500! text-foreground rounded-md', + !fullDateRangeSelected && + 'bg-primary-bright/70! dark:bg-primary-bright/25! text-foreground rounded-md', selected ), // Plain accent — range/selected fills use ! so they still win when today is in the selection @@ -94,15 +95,17 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }: C ), disabled: cn('text-foreground-muted opacity-50', disabled), range_start: cn( - fullDateRangeSelected && 'bg-brand-400! dark:bg-brand-500! text-foreground rounded-l-md', + fullDateRangeSelected && + 'bg-primary-bright/70! dark:bg-primary-bright/25! text-foreground rounded-l-md', range_start ), range_middle: cn( - 'bg-brand-200! dark:bg-brand-400! text-foreground rounded-none', + 'bg-primary-bright/25! dark:bg-primary-bright/12! text-foreground rounded-none', range_middle ), range_end: cn( - fullDateRangeSelected && 'bg-brand-400! dark:bg-brand-500! text-foreground rounded-r-md', + fullDateRangeSelected && + 'bg-primary-bright/70! dark:bg-primary-bright/25! text-foreground rounded-r-md', range_end ), hidden: cn('invisible', hidden), diff --git a/packages/ui/src/components/shadcn/ui/field.tsx b/packages/ui/src/components/shadcn/ui/field.tsx index 894e658129b..3b49ed96bbc 100644 --- a/packages/ui/src/components/shadcn/ui/field.tsx +++ b/packages/ui/src/components/shadcn/ui/field.tsx @@ -106,7 +106,7 @@ function FieldLabel({ className, ...props }: React.ComponentProps) className={cn( 'group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50', 'has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border *:data-[slot=field]:p-4', - 'has-data-[state=checked]:bg-primary/5 has-data-[state=checked]:border-primary dark:has-data-[state=checked]:bg-primary/10', + 'has-data-[state=checked]:bg-primary-bright/5 has-data-[state=checked]:border-primary-bright dark:has-data-[state=checked]:bg-primary-bright/10', className )} {...props} diff --git a/packages/ui/src/components/shadcn/ui/slider.tsx b/packages/ui/src/components/shadcn/ui/slider.tsx index 9a3655cfde2..176ddea3946 100644 --- a/packages/ui/src/components/shadcn/ui/slider.tsx +++ b/packages/ui/src/components/shadcn/ui/slider.tsx @@ -30,7 +30,7 @@ function Slider({ >