@adea-ai/ui 0.118.3 → 0.119.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +7 -3
  2. package/dist/components/composites/settings/index.d.ts +1 -1
  3. package/dist/components/composites/settings/index.d.ts.map +1 -1
  4. package/dist/components/composites/settings/settings-layout.d.ts +18 -2
  5. package/dist/components/composites/settings/settings-layout.d.ts.map +1 -1
  6. package/dist/components/composites/settings/settings-layout.js +40 -5
  7. package/dist/components/composites/settings/settings-layout.js.map +1 -1
  8. package/dist/components/composites/settings/settings-navigation.d.ts.map +1 -1
  9. package/dist/components/composites/settings/settings-navigation.js +36 -14
  10. package/dist/components/composites/settings/settings-navigation.js.map +1 -1
  11. package/dist/components/ui/code-block/code-block.d.ts +13 -0
  12. package/dist/components/ui/code-block/code-block.d.ts.map +1 -1
  13. package/dist/components/ui/code-block/code-block.js +22 -3
  14. package/dist/components/ui/code-block/code-block.js.map +1 -1
  15. package/dist/components/ui/item/index.d.ts +1 -1
  16. package/dist/components/ui/item/index.d.ts.map +1 -1
  17. package/dist/components/ui/item/item.d.ts +17 -1
  18. package/dist/components/ui/item/item.d.ts.map +1 -1
  19. package/dist/components/ui/item/item.js +17 -10
  20. package/dist/components/ui/item/item.js.map +1 -1
  21. package/dist/lib/themes.d.ts +6 -0
  22. package/dist/lib/themes.d.ts.map +1 -1
  23. package/dist/lib/themes.js +11 -3
  24. package/dist/lib/themes.js.map +1 -1
  25. package/dist/r/appearance-editor.json +1 -1
  26. package/dist/r/lib.json +1 -1
  27. package/dist/r/registry.json +6 -4
  28. package/dist/r/settings.json +3 -1
  29. package/dist/r/src/components/composites/settings/index.ts +5 -1
  30. package/dist/r/src/components/composites/settings/settings-layout.tsx +48 -5
  31. package/dist/r/src/components/composites/settings/settings-navigation.tsx +44 -16
  32. package/dist/r/src/components/ui/code-block/code-block.tsx +27 -2
  33. package/dist/r/src/components/ui/item/index.ts +1 -0
  34. package/dist/r/src/components/ui/item/item.tsx +41 -5
  35. package/dist/r/src/lib/themes.ts +23 -5
  36. package/dist/r/src/styles/theme.css +17 -13
  37. package/dist/r/theming.json +1 -1
  38. package/package.json +2 -2
  39. package/registry.json +6 -4
  40. package/src/components/composites/settings/index.ts +5 -1
  41. package/src/components/composites/settings/settings-layout.tsx +48 -5
  42. package/src/components/composites/settings/settings-navigation.tsx +44 -16
  43. package/src/components/ui/code-block/code-block.tsx +27 -2
  44. package/src/components/ui/item/index.ts +1 -0
  45. package/src/components/ui/item/item.tsx +41 -5
  46. package/src/lib/themes.ts +23 -5
  47. package/src/styles/theme.css +17 -13
@@ -1,5 +1,6 @@
1
+ import { useTabsContext } from '@kobalte/core/tabs'
1
2
  import type { JSX } from 'solid-js'
2
- import { createEffect, createUniqueId, onCleanup, splitProps } from 'solid-js'
3
+ import { createEffect, createUniqueId, onCleanup, Show, splitProps } from 'solid-js'
3
4
  import { cn } from '#lib/utils'
4
5
  import { sidebarNavItemClass, sidebarNavItemStateClass } from '../../layout/sidebar-nav/sidebar-nav'
5
6
  import { TabsList, TabsTrigger, type TabsListProps } from '../../ui/tabs'
@@ -47,6 +48,14 @@ export type SettingsNavigationProps = Omit<
47
48
  * the controlled value, panel content, icons and any persistence or routing.
48
49
  * Use ordinary tabs for a short, ungrouped row of view choices.
49
50
  *
51
+ * The shape follows the enclosing `Tabs` orientation rather than a prop of its
52
+ * own, so the visual axis can never disagree with the arrow keys Kobalte
53
+ * binds: `vertical` is the grouped rail, `horizontal` is a single scrollable
54
+ * strip of tabs (what `SettingsLayout` shows below 48rem). The strip keeps the
55
+ * groups in order, separated by a rule; their visible headings drop out, since
56
+ * an overline between tabs reads as another tab, but each tab still carries its
57
+ * group as its accessible description.
58
+ *
50
59
  * Kobalte owns roving focus, arrow keys, selection and tab/panel ARIA. This
51
60
  * component adds no URL, storage or host-specific state. Set
52
61
  * `revealSelected={false}` when the surrounding layout does not use an internal
@@ -88,12 +97,16 @@ export function SettingsNavigation(props: SettingsNavigationProps) {
88
97
  'onReselect',
89
98
  'revealSelected',
90
99
  ])
100
+ const tabs = useTabsContext()
101
+ const strip = () => tabs.orientation() === 'horizontal'
91
102
  const triggers = new Map<string, HTMLButtonElement>()
92
103
  const groupIdPrefix = `settings-navigation-${createUniqueId()}`
93
104
 
94
105
  createEffect(() => {
95
106
  const value = local.value
96
107
  const reveal = local.revealSelected
108
+ // Tracked so a rail that becomes a strip (or back) re-reveals on the new axis.
109
+ strip()
97
110
  if (reveal === false) return
98
111
 
99
112
  const revealCurrent = () => {
@@ -111,9 +124,17 @@ export function SettingsNavigation(props: SettingsNavigationProps) {
111
124
  <TabsList
112
125
  data-slot="settings-navigation"
113
126
  aria-label={local['aria-label']}
114
- orientation="vertical"
127
+ orientation={tabs.orientation()}
115
128
  class={cn(
116
- 'flex max-h-full min-h-0 min-w-0 shrink-0 flex-col items-stretch justify-start gap-2 overflow-x-hidden overflow-y-auto px-2 py-2',
129
+ // Positioned so the visually hidden group names are laid out (and
130
+ // clipped) inside the list: unpositioned, their absolute boxes escape a
131
+ // scrolled strip and widen the page by however far it has scrolled.
132
+ 'relative flex min-w-0 shrink-0 justify-start',
133
+ strip()
134
+ ? // The block padding is the room the focus ring needs: a scroller
135
+ // clips at its padding edge, and this one scrolls sideways only.
136
+ 'scroll-fade w-full flex-row items-center gap-1 overflow-x-auto overflow-y-hidden border-b border-border px-2 py-1.5'
137
+ : 'max-h-full min-h-0 flex-col items-stretch gap-2 overflow-x-hidden overflow-y-auto px-2 py-2',
117
138
  local.class
118
139
  )}
119
140
  {...rest}
@@ -124,24 +145,30 @@ export function SettingsNavigation(props: SettingsNavigationProps) {
124
145
  <div
125
146
  role="none"
126
147
  data-slot="settings-navigation-group"
127
- class="flex min-w-0 flex-col gap-0.5"
148
+ class={cn(
149
+ 'flex gap-0.5',
150
+ strip()
151
+ ? 'shrink-0 flex-row items-center not-first:ms-1 not-first:border-s not-first:border-border not-first:ps-2'
152
+ : 'min-w-0 flex-col'
153
+ )}
128
154
  >
129
155
  <span id={groupId} class="sr-only">
130
156
  {group.label}
131
157
  </span>
132
- {/* The overline role on the sidebar's own muted foreground. */}
133
- <Text
134
- variant="overline"
135
- tone="inherit"
136
- aria-hidden="true"
137
- class="px-2 py-1.5 text-sidebar-muted-foreground"
138
- >
139
- {group.label}
140
- </Text>
158
+ <Show when={!strip()}>
159
+ {/* The overline role on the sidebar's own muted foreground. */}
160
+ <Text
161
+ variant="overline"
162
+ tone="inherit"
163
+ aria-hidden="true"
164
+ class="px-2 py-1.5 text-sidebar-muted-foreground"
165
+ >
166
+ {group.label}
167
+ </Text>
168
+ </Show>
141
169
  {group.items.map((item) => (
142
170
  <TabsTrigger
143
171
  data-slot="settings-navigation-trigger"
144
- orientation="vertical"
145
172
  aria-describedby={groupId}
146
173
  value={item.value}
147
174
  disabled={item.disabled}
@@ -155,11 +182,12 @@ export function SettingsNavigation(props: SettingsNavigationProps) {
155
182
  class={cn(
156
183
  sidebarNavItemClass,
157
184
  sidebarNavItemStateClass.idle,
158
- 'h-row-lg w-full justify-start border-0 px-3 py-2 text-left data-[selected]:bg-primary-subtle data-[selected]:text-foreground'
185
+ 'h-row-lg justify-start border-0 px-3 py-2 text-left data-[selected]:bg-primary-subtle data-[selected]:text-foreground',
186
+ strip() ? 'w-auto shrink-0' : 'w-full'
159
187
  )}
160
188
  >
161
189
  {item.icon}
162
- <span class="min-w-0 truncate">{item.label}</span>
190
+ <span class={cn('min-w-0', { truncate: !strip() })}>{item.label}</span>
163
191
  </TabsTrigger>
164
192
  ))}
165
193
  </div>
@@ -69,6 +69,19 @@ export type CodeBlockProps = Omit<ComponentProps<'div'>, 'children'> & {
69
69
  showLineNumbers?: boolean
70
70
  /** The height above which the action row is repeated below the block. */
71
71
  tallThreshold?: number
72
+ /**
73
+ * Cap the code body's height and scroll it vertically past that. A number is
74
+ * pixels; a string is any CSS length (`'20rem'`, `'50vh'`). Unset, the block
75
+ * grows with its content.
76
+ */
77
+ maxHeight?: number | string
78
+ /**
79
+ * Soft-wrap long lines inside the block instead of scrolling sideways. Off by
80
+ * default: wrapped code loses its column alignment, so it is for prose-like
81
+ * output (logs, long commands) in a narrow column. Wraps the plain renderer and
82
+ * any `pre` inside `highlight` output; line numbers stay on the first visual line.
83
+ */
84
+ wrap?: boolean
72
85
  }
73
86
 
74
87
  /** The height a block must exceed before its actions are repeated. */
@@ -103,6 +116,8 @@ export function CodeBlock(props: CodeBlockProps) {
103
116
  'lineHeight',
104
117
  'showLineNumbers',
105
118
  'tallThreshold',
119
+ 'maxHeight',
120
+ 'wrap',
106
121
  'class',
107
122
  'ref',
108
123
  ])
@@ -114,6 +129,8 @@ export function CodeBlock(props: CodeBlockProps) {
114
129
  const label = () => local.title ?? local.language ?? 'code'
115
130
  const regionLabel = () => (local.language ? `${local.language} code` : 'code')
116
131
  const lines = createMemo(() => local.code.replace(/\n$/, '').split('\n'))
132
+ const maxHeight = () =>
133
+ typeof local.maxHeight === 'number' ? `${local.maxHeight}px` : local.maxHeight
117
134
 
118
135
  const copy = async () => {
119
136
  const ok = await copyText(local.code)
@@ -160,7 +177,15 @@ export function CodeBlock(props: CodeBlockProps) {
160
177
  <Actions />
161
178
  </div>
162
179
  <div
163
- class="scroll-fade overflow-x-auto"
180
+ data-slot="code-block-body"
181
+ data-wrap={local.wrap ? '' : undefined}
182
+ class={cn('scroll-fade overflow-x-auto', {
183
+ // A capped body scrolls on both axes; the region is already a tab stop,
184
+ // so the keyboard reaches the vertical overflow the same way.
185
+ 'overflow-y-auto': local.maxHeight !== undefined,
186
+ '[&_pre]:whitespace-pre-wrap [&_pre]:[overflow-wrap:anywhere]': local.wrap,
187
+ })}
188
+ style={maxHeight() === undefined ? undefined : { 'max-height': maxHeight() }}
164
189
  // A region that scrolls must be focusable, and a tab stop needs a name.
165
190
  tabindex="0"
166
191
  role="region"
@@ -181,7 +206,7 @@ export function CodeBlock(props: CodeBlockProps) {
181
206
  >
182
207
  {index() + 1}
183
208
  </span>
184
- <span>{line || ' '}</span>
209
+ <span class={cn({ 'min-w-0': local.wrap })}>{line || ' '}</span>
185
210
  </span>
186
211
  )}
187
212
  </For>
@@ -6,5 +6,6 @@ export {
6
6
  ItemGroupEntry,
7
7
  ItemTitle,
8
8
  itemVariants,
9
+ type ItemDescriptionProps,
9
10
  type ItemProps,
10
11
  } from './item'
@@ -47,6 +47,14 @@ export type ItemProps = ComponentProps<'div'> &
47
47
  media?: JSX.Element
48
48
  /** A trailing slot: a badge, a timestamp, a menu trigger. */
49
49
  trailing?: JSX.Element
50
+ /**
51
+ * Move the trailing slot onto its own line, end-aligned under the body, once
52
+ * the item is narrower than 28rem — the width `ListRow` stacks its trailing
53
+ * controls at. Off by default: a row of badges and an icon button fits beside
54
+ * the body, but a pair of labelled buttons squeezes a phone-width body to a
55
+ * few characters.
56
+ */
57
+ stackTrailing?: boolean
50
58
  }
51
59
 
52
60
  export function Item(props: ItemProps) {
@@ -56,13 +64,22 @@ export function Item(props: ItemProps) {
56
64
  'size',
57
65
  'media',
58
66
  'trailing',
67
+ 'stackTrailing',
59
68
  'children',
60
69
  ])
61
70
 
62
71
  return (
63
72
  <div
64
73
  data-slot="item"
65
- class={cn(itemVariants({ variant: local.variant, size: local.size }), local.class)}
74
+ data-stack-trailing={local.stackTrailing ? '' : undefined}
75
+ class={cn(
76
+ itemVariants({ variant: local.variant, size: local.size }),
77
+ // The item is its own query container: the trailing slot answers to the
78
+ // width the item was given, not the viewport, so an item in a narrow
79
+ // column of a wide window stacks too.
80
+ { '@container/item flex-wrap': local.stackTrailing },
81
+ local.class
82
+ )}
66
83
  {...rest}
67
84
  >
68
85
  <Show when={local.media}>
@@ -77,7 +94,13 @@ export function Item(props: ItemProps) {
77
94
  {local.children}
78
95
  </div>
79
96
  <Show when={local.trailing}>
80
- <span data-slot="item-trailing" class="flex shrink-0 items-center gap-2">
97
+ <span
98
+ data-slot="item-trailing"
99
+ class={cn('flex shrink-0 items-center gap-2', {
100
+ '@max-md/item:w-full @max-md/item:flex-wrap @max-md/item:justify-end':
101
+ local.stackTrailing,
102
+ })}
103
+ >
81
104
  {local.trailing}
82
105
  </span>
83
106
  </Show>
@@ -90,12 +113,25 @@ export function ItemTitle(props: ComponentProps<'div'>) {
90
113
  return <div data-slot="item-title" class={cn('truncate font-medium', local.class)} {...rest} />
91
114
  }
92
115
 
93
- export function ItemDescription(props: ComponentProps<'div'>) {
94
- const [local, rest] = splitProps(props, ['class'])
116
+ export type ItemDescriptionProps = ComponentProps<'div'> & {
117
+ /**
118
+ * Clamp to two lines. On by default, so a grid of items keeps one height; pass
119
+ * `false` where the description is the content — a setting's explanation, an
120
+ * error the reader has to read in full.
121
+ */
122
+ clamp?: boolean
123
+ }
124
+
125
+ export function ItemDescription(props: ItemDescriptionProps) {
126
+ const [local, rest] = splitProps(props, ['class', 'clamp'])
95
127
  return (
96
128
  <div
97
129
  data-slot="item-description"
98
- class={cn('text-muted-foreground line-clamp-2 text-xs text-pretty', local.class)}
130
+ class={cn(
131
+ 'text-muted-foreground text-xs text-pretty',
132
+ { 'line-clamp-2': local.clamp !== false },
133
+ local.class
134
+ )}
99
135
  {...rest}
100
136
  />
101
137
  )
package/src/lib/themes.ts CHANGED
@@ -296,6 +296,16 @@ function toVariant(theme: AdeaThemeRecord): ThemeVariant {
296
296
  }
297
297
  }
298
298
 
299
+ /**
300
+ * A variant's `--primary-subtle`: the tint over `var(--primary)` at the strength its
301
+ * catalogue record measures (`primarySubtleAlpha`). A variant that is not in the
302
+ * catalogue has nothing to measure, and gets its appearance's ceiling.
303
+ */
304
+ export function primarySubtleFor(theme: Pick<ThemeVariant, 'id' | 'appearance'>): string {
305
+ const record = getTheme(theme.id)
306
+ return record ? primarySubtleCss(record) : primarySubtleCss(theme.appearance)
307
+ }
308
+
299
309
  /** The catalogue, in catalogue order. */
300
310
  export const builtinThemes: readonly ThemeVariant[] = Object.freeze(catalogue.map(toVariant))
301
311
 
@@ -462,12 +472,17 @@ export function accentVariables(
462
472
  const preset = resolveAccentPreset(accentId, light, dark)
463
473
  if (!preset) return undefined
464
474
 
475
+ // `--primary-subtle` is deliberately not here. It is a `color-mix()` over
476
+ // `var(--primary)`, so the theme's own declaration (`themeCssVariables`, or the
477
+ // default block in `theme.css`) already follows the accent; and its strength is the
478
+ // *theme's*, measured by `primarySubtleAlpha` to hold body text at 4.5:1 for every
479
+ // accent the theme offers. Writing one here would replace that measured strength
480
+ // with whatever this function was given, which is how an accent used to undo it.
465
481
  const roles = accentRoles(preset, appearance)
466
482
  return {
467
483
  '--primary': roles.primary,
468
484
  '--primary-foreground': roles.primaryForeground,
469
485
  '--primary-hover': roles.primaryHover,
470
- '--primary-subtle': roles.primarySubtle,
471
486
  '--ring': roles.ring,
472
487
  }
473
488
  }
@@ -502,12 +517,15 @@ export function themeCssVariables(theme: ThemeVariant): Record<string, string> {
502
517
  * step cannot be expressed as a mix (see `primaryHover`). Left out, a theme switch
503
518
  * would keep the previous theme's hover on the new theme's primary.
504
519
  *
505
- * `--primary-subtle` is a mix over `--primary`, so it would follow on its own —
506
- * it is written anyway so the pair is applied together and neither is left to
507
- * depend on which stylesheet happened to load.
520
+ * `--primary-subtle` is a mix over `--primary`, so it follows an accent on its
521
+ * own, but its *strength* is per theme: `primarySubtleCss(record)` lowers the
522
+ * appearance ceiling only as far as this theme needs for body text to clear 4.5:1
523
+ * on the tint, over every surface, for every accent it offers. It has to be
524
+ * written per theme for that reason — the appearance-wide value is not legible on
525
+ * every palette.
508
526
  */
509
527
  '--primary-hover': primaryHover(c.primary, theme.appearance),
510
- '--primary-subtle': primarySubtleCss(theme.appearance),
528
+ '--primary-subtle': primarySubtleFor(theme),
511
529
  '--secondary': c.secondary,
512
530
  '--secondary-foreground': c.secondaryForeground,
513
531
  '--muted': c.muted,
@@ -153,6 +153,11 @@
153
153
  * rule rather than a matching one — which is what they were not, before.
154
154
  */
155
155
  --primary-hover: oklch(0.4643 0.1668 301.69);
156
+ /*
157
+ * The selected-state tint. A share of `--primary`, so it follows an accent with
158
+ * no block of its own; the share is this theme's, measured by @adea-ai/themes so
159
+ * body text clears 4.5:1 on it over every surface, for every accent it offers.
160
+ */
156
161
  --primary-subtle: color-mix(in oklch, var(--primary) 10%, transparent);
157
162
  /* The window chrome, one step off the canvas. */
158
163
  --chrome: var(--surface);
@@ -283,6 +288,11 @@
283
288
  * rule rather than a matching one — which is what they were not, before.
284
289
  */
285
290
  --primary-hover: oklch(0.7823 0.1668 301.69);
291
+ /*
292
+ * The selected-state tint. A share of `--primary`, so it follows an accent with
293
+ * no block of its own; the share is this theme's, measured by @adea-ai/themes so
294
+ * body text clears 4.5:1 on it over every surface, for every accent it offers.
295
+ */
286
296
  --primary-subtle: color-mix(in oklch, var(--primary) 16%, transparent);
287
297
  /* The window chrome, one step off the canvas. */
288
298
  --chrome: var(--surface);
@@ -310,7 +320,13 @@
310
320
  * adea's six accent presets, as a selection rather than a constant. `data-accent` sits on
311
321
  * the same element as `dark` — in both applications that is `<html>` — and each
312
322
  * block overrides the roles an accent owns: the interactive primary, its label,
313
- * its hover rung, its tint and the focus ring.
323
+ * its hover rung and the focus ring.
324
+ *
325
+ * The tint, `--primary-subtle`, is not one of them. It is a share of `var(--primary)`
326
+ * declared on the same element, so it already follows the accent; and the share is
327
+ * the theme's own, measured by @adea-ai/themes so body text clears 4.5:1 on it. A
328
+ * block keyed only on the appearance could carry only the appearance-wide ceiling,
329
+ * which would undo that measurement for every theme that needs a lighter wash.
314
330
  *
315
331
  * The values are adea's accent presets, passed through the same two rules
316
332
  * `deriveAccentRoles` applies in the product:
@@ -330,14 +346,12 @@
330
346
  --primary: oklch(0.4907 0.2412 292.58);
331
347
  --primary-foreground: oklch(1 0 0);
332
348
  --primary-hover: oklch(0.4407 0.2412 292.58);
333
- --primary-subtle: color-mix(in oklch, var(--primary) 10%, transparent);
334
349
  --ring: oklch(0.4907 0.2412 292.58);
335
350
  }
336
351
  .dark[data-accent='violet'] {
337
352
  --primary: oklch(0.709 0.1592 293.54);
338
353
  --primary-foreground: oklch(0 0 0);
339
354
  --primary-hover: oklch(0.759 0.1592 293.54);
340
- --primary-subtle: color-mix(in oklch, var(--primary) 16%, transparent);
341
355
  --ring: oklch(0.709 0.1592 293.54);
342
356
  }
343
357
 
@@ -345,14 +359,12 @@
345
359
  --primary: oklch(0.5461 0.2152 262.88);
346
360
  --primary-foreground: oklch(1 0 0);
347
361
  --primary-hover: oklch(0.4961 0.2152 262.88);
348
- --primary-subtle: color-mix(in oklch, var(--primary) 10%, transparent);
349
362
  --ring: oklch(0.5461 0.2152 262.88);
350
363
  }
351
364
  .dark[data-accent='blue'] {
352
365
  --primary: oklch(0.7137 0.1434 254.62);
353
366
  --primary-foreground: oklch(0 0 0);
354
367
  --primary-hover: oklch(0.7637 0.1434 254.62);
355
- --primary-subtle: color-mix(in oklch, var(--primary) 16%, transparent);
356
368
  --ring: oklch(0.7137 0.1434 254.62);
357
369
  }
358
370
 
@@ -360,14 +372,12 @@
360
372
  --primary: oklch(0.5273 0.1371 150.07);
361
373
  --primary-foreground: oklch(1 0 0);
362
374
  --primary-hover: oklch(0.4773 0.1371 150.07);
363
- --primary-subtle: color-mix(in oklch, var(--primary) 10%, transparent);
364
375
  --ring: oklch(0.5273 0.1371 150.07);
365
376
  }
366
377
  .dark[data-accent='green'] {
367
378
  --primary: oklch(0.8003 0.1821 151.71);
368
379
  --primary-foreground: oklch(0 0 0);
369
380
  --primary-hover: oklch(0.8503 0.1363 151.71);
370
- --primary-subtle: color-mix(in oklch, var(--primary) 16%, transparent);
371
381
  --ring: oklch(0.8003 0.1821 151.71);
372
382
  }
373
383
 
@@ -375,14 +385,12 @@
375
385
  --primary: oklch(0.5553 0.1455 49);
376
386
  --primary-foreground: oklch(1 0 0);
377
387
  --primary-hover: oklch(0.5053 0.1455 49);
378
- --primary-subtle: color-mix(in oklch, var(--primary) 10%, transparent);
379
388
  --ring: oklch(0.5553 0.1455 49);
380
389
  }
381
390
  .dark[data-accent='amber'] {
382
391
  --primary: oklch(0.8369 0.1644 84.43);
383
392
  --primary-foreground: oklch(0 0 0);
384
393
  --primary-hover: oklch(0.8869 0.0991 84.43);
385
- --primary-subtle: color-mix(in oklch, var(--primary) 16%, transparent);
386
394
  --ring: oklch(0.8369 0.1644 84.43);
387
395
  }
388
396
 
@@ -390,14 +398,12 @@
390
398
  --primary: oklch(0.5198 0.0936 223.13);
391
399
  --primary-foreground: oklch(1 0 0);
392
400
  --primary-hover: oklch(0.4698 0.0936 223.13);
393
- --primary-subtle: color-mix(in oklch, var(--primary) 10%, transparent);
394
401
  --ring: oklch(0.5198 0.0936 223.13);
395
402
  }
396
403
  .dark[data-accent='cyan'] {
397
404
  --primary: oklch(0.7971 0.1339 211.53);
398
405
  --primary-foreground: oklch(0 0 0);
399
406
  --primary-hover: oklch(0.8471 0.102 211.53);
400
- --primary-subtle: color-mix(in oklch, var(--primary) 16%, transparent);
401
407
  --ring: oklch(0.7971 0.1339 211.53);
402
408
  }
403
409
 
@@ -405,14 +411,12 @@
405
411
  --primary: oklch(0.5246 0.199 3.96);
406
412
  --primary-foreground: oklch(1 0 0);
407
413
  --primary-hover: oklch(0.4746 0.199 3.96);
408
- --primary-subtle: color-mix(in oklch, var(--primary) 10%, transparent);
409
414
  --ring: oklch(0.5246 0.199 3.96);
410
415
  }
411
416
  .dark[data-accent='pink'] {
412
417
  --primary: oklch(0.7253 0.1752 349.76);
413
418
  --primary-foreground: oklch(0 0 0);
414
419
  --primary-hover: oklch(0.7753 0.1752 349.76);
415
- --primary-subtle: color-mix(in oklch, var(--primary) 16%, transparent);
416
420
  --ring: oklch(0.7253 0.1752 349.76);
417
421
  }
418
422
  /* @end generated accents */