@mindlogic-ai/logician-ui 4.0.0-alpha.21 → 4.0.0-alpha.23

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 (88) hide show
  1. package/dist/components/ErrorFallback/ErrorFallback.d.ts.map +1 -1
  2. package/dist/components/ErrorFallback/ErrorFallback.js +13 -2
  3. package/dist/components/ErrorFallback/ErrorFallback.js.map +1 -1
  4. package/dist/components/ErrorFallback/ErrorFallback.mjs +13 -2
  5. package/dist/components/ErrorFallback/ErrorFallback.mjs.map +1 -1
  6. package/dist/components/FileInput/FileInput.d.ts.map +1 -1
  7. package/dist/components/FileInput/FileInput.js +7 -1
  8. package/dist/components/FileInput/FileInput.js.map +1 -1
  9. package/dist/components/FileInput/FileInput.mjs +7 -1
  10. package/dist/components/FileInput/FileInput.mjs.map +1 -1
  11. package/dist/components/Markdown/Markdown.d.ts.map +1 -1
  12. package/dist/components/Markdown/Markdown.js +6 -1
  13. package/dist/components/Markdown/Markdown.js.map +1 -1
  14. package/dist/components/Markdown/Markdown.mjs +6 -1
  15. package/dist/components/Markdown/Markdown.mjs.map +1 -1
  16. package/dist/components/Pagination/Pagination.d.ts.map +1 -1
  17. package/dist/components/Pagination/Pagination.js +6 -1
  18. package/dist/components/Pagination/Pagination.js.map +1 -1
  19. package/dist/components/Pagination/Pagination.mjs +6 -1
  20. package/dist/components/Pagination/Pagination.mjs.map +1 -1
  21. package/dist/components/Radio/RadioControl.d.ts.map +1 -1
  22. package/dist/components/Radio/RadioControl.js +14 -1
  23. package/dist/components/Radio/RadioControl.js.map +1 -1
  24. package/dist/components/Radio/RadioControl.mjs +15 -2
  25. package/dist/components/Radio/RadioControl.mjs.map +1 -1
  26. package/dist/components/Select/ComboboxField.d.ts +1 -1
  27. package/dist/components/Select/ComboboxField.d.ts.map +1 -1
  28. package/dist/components/Select/ComboboxField.js +2 -2
  29. package/dist/components/Select/ComboboxField.js.map +1 -1
  30. package/dist/components/Select/ComboboxField.mjs +2 -2
  31. package/dist/components/Select/ComboboxField.mjs.map +1 -1
  32. package/dist/components/Select/Select.types.d.ts +16 -0
  33. package/dist/components/Select/Select.types.d.ts.map +1 -1
  34. package/dist/components/Select/SelectField.d.ts +1 -1
  35. package/dist/components/Select/SelectField.d.ts.map +1 -1
  36. package/dist/components/Select/SelectField.js +2 -2
  37. package/dist/components/Select/SelectField.js.map +1 -1
  38. package/dist/components/Select/SelectField.mjs +2 -2
  39. package/dist/components/Select/SelectField.mjs.map +1 -1
  40. package/dist/components/Slider/Slider.d.ts.map +1 -1
  41. package/dist/components/Slider/Slider.js +2 -2
  42. package/dist/components/Slider/Slider.js.map +1 -1
  43. package/dist/components/Slider/Slider.mjs +3 -3
  44. package/dist/components/Slider/Slider.mjs.map +1 -1
  45. package/dist/components/Slider/Slider.types.d.ts +15 -0
  46. package/dist/components/Slider/Slider.types.d.ts.map +1 -1
  47. package/dist/components/Typography/Link.d.ts +25 -0
  48. package/dist/components/Typography/Link.d.ts.map +1 -1
  49. package/dist/components/Typography/Link.js +44 -7
  50. package/dist/components/Typography/Link.js.map +1 -1
  51. package/dist/components/Typography/Link.mjs +44 -8
  52. package/dist/components/Typography/Link.mjs.map +1 -1
  53. package/dist/components/Typography/Subtitle.d.ts +17 -0
  54. package/dist/components/Typography/Subtitle.d.ts.map +1 -1
  55. package/dist/components/Typography/Subtitle.js +18 -1
  56. package/dist/components/Typography/Subtitle.js.map +1 -1
  57. package/dist/components/Typography/Subtitle.mjs +18 -1
  58. package/dist/components/Typography/Subtitle.mjs.map +1 -1
  59. package/dist/components/Typography/index.d.ts +1 -1
  60. package/dist/components/Typography/index.d.ts.map +1 -1
  61. package/dist/components/Workflow/canvas/NodePalette/NodePalette.d.ts.map +1 -1
  62. package/dist/components/Workflow/canvas/NodePalette/NodePalette.js +19 -2
  63. package/dist/components/Workflow/canvas/NodePalette/NodePalette.js.map +1 -1
  64. package/dist/components/Workflow/canvas/NodePalette/NodePalette.mjs +19 -2
  65. package/dist/components/Workflow/canvas/NodePalette/NodePalette.mjs.map +1 -1
  66. package/dist/theme/colors.d.ts +145 -37
  67. package/dist/theme/colors.d.ts.map +1 -1
  68. package/dist/theme/colors.js +98 -68
  69. package/dist/theme/colors.js.map +1 -1
  70. package/dist/theme/colors.mjs +98 -68
  71. package/dist/theme/colors.mjs.map +1 -1
  72. package/package.json +2 -1
  73. package/src/components/ErrorFallback/ErrorFallback.tsx +30 -3
  74. package/src/components/FileInput/FileInput.tsx +11 -2
  75. package/src/components/Markdown/Markdown.tsx +6 -1
  76. package/src/components/Pagination/Pagination.tsx +5 -0
  77. package/src/components/Radio/RadioControl.tsx +20 -6
  78. package/src/components/Select/ComboboxField.tsx +11 -1
  79. package/src/components/Select/Select.types.ts +16 -0
  80. package/src/components/Select/SelectField.tsx +14 -1
  81. package/src/components/Slider/Slider.tsx +16 -1
  82. package/src/components/Slider/Slider.types.ts +15 -0
  83. package/src/components/Typography/Link.tsx +44 -7
  84. package/src/components/Typography/Subtitle.tsx +17 -1
  85. package/src/components/Typography/index.ts +1 -1
  86. package/src/components/Workflow/canvas/NodePalette/NodePalette.tsx +12 -2
  87. package/src/components/a11y.kwcag.test.tsx +412 -0
  88. package/src/theme/colors.ts +99 -69
@@ -60,36 +60,11 @@
60
60
  * <Badge bgColor="success.lightest" color="success.dark" />
61
61
  * ```
62
62
  */
63
- /**
64
- * Halved-saturation counterpart of each primitive `gray.N` — same hue and
65
- * lightness, HSL saturation cut by ~50% (e.g. `gray.1300` #1E2433 @ 26% →
66
- * #23262E @ 13%). The blue-tinted `gray` ramp reads as the right neutral in
67
- * light mode but turns muddy/over-chromatic as a dark surface, so every
68
- * dark-mode neutral below (`slate.*`, and the `_dark` of `bg`/`fg`/`border`)
69
- * resolves to this desaturated mirror instead of the raw `gray` step. Light
70
- * mode is untouched — it keeps referencing `{colors.gray.*}` verbatim.
71
- *
72
- * Single source of truth: change a dark neutral here, not at each token.
73
- */
74
- const desaturatedGray = {
75
- 0: '#FEFEFF',
76
- 50: '#F8F9FB',
77
- 100: '#F2F4F7',
78
- 200: '#E5E8EC',
79
- 300: '#D2D5DB',
80
- 400: '#B6BAC3',
81
- 500: '#A2A6B1',
82
- 600: '#8E939F',
83
- 700: '#7C818D',
84
- 800: '#6A6F7C',
85
- 900: '#595E6B',
86
- 1000: '#4A4E5A',
87
- 1100: '#3C404B',
88
- 1200: '#30343C',
89
- 1300: '#23262E',
90
- 1400: '#181A20',
91
- 1500: '#0E1014',
92
- } as const;
63
+ // The dark-mode neutral family now lives in `colors.grayDark` (see below) so
64
+ // consumers can retint dark surfaces by overriding a primitive scale — exactly
65
+ // like `blue.*` for the brand ramp — instead of these values being unreachable
66
+ // hex literals. Every dark-mode neutral in the semantic tokens (`slate.*`, and
67
+ // the `_dark` of `bg`/`fg`/`border`) references `{colors.grayDark.N}`.
93
68
 
94
69
  export const semanticTokens = {
95
70
  colors: {
@@ -303,48 +278,56 @@ export const semanticTokens = {
303
278
  * dark canvas/surface — the straight mirrors measured ~3.0–3.9 there.
304
279
  */
305
280
  slate: {
306
- 0: { value: { base: '{colors.gray.0}', _dark: desaturatedGray[1500] } },
307
- 50: { value: { base: '{colors.gray.50}', _dark: desaturatedGray[1400] } },
281
+ 0: {
282
+ value: { base: '{colors.gray.0}', _dark: '{colors.grayDark.1500}' },
283
+ },
284
+ 50: {
285
+ value: { base: '{colors.gray.50}', _dark: '{colors.grayDark.1400}' },
286
+ },
308
287
  100: {
309
- value: { base: '{colors.gray.100}', _dark: desaturatedGray[1300] },
288
+ value: { base: '{colors.gray.100}', _dark: '{colors.grayDark.1300}' },
310
289
  },
311
290
  200: {
312
- value: { base: '{colors.gray.200}', _dark: desaturatedGray[1200] },
291
+ value: { base: '{colors.gray.200}', _dark: '{colors.grayDark.1200}' },
313
292
  },
314
293
  300: {
315
- value: { base: '{colors.gray.300}', _dark: desaturatedGray[1100] },
294
+ value: { base: '{colors.gray.300}', _dark: '{colors.grayDark.1100}' },
316
295
  },
317
296
  400: {
318
- value: { base: '{colors.gray.400}', _dark: desaturatedGray[1000] },
297
+ value: { base: '{colors.gray.400}', _dark: '{colors.grayDark.1000}' },
319
298
  },
320
299
  500: {
321
- value: { base: '{colors.gray.500}', _dark: desaturatedGray[900] },
300
+ value: { base: '{colors.gray.500}', _dark: '{colors.grayDark.900}' },
301
+ },
302
+ 600: {
303
+ value: { base: '{colors.gray.600}', _dark: '{colors.grayDark.fg600}' },
304
+ },
305
+ 700: {
306
+ value: { base: '{colors.gray.700}', _dark: '{colors.grayDark.fg700}' },
322
307
  },
323
- 600: { value: { base: '{colors.gray.600}', _dark: '#898E99' } },
324
- 700: { value: { base: '{colors.gray.700}', _dark: '#8D919D' } },
325
308
  800: {
326
- value: { base: '{colors.gray.800}', _dark: desaturatedGray[600] },
309
+ value: { base: '{colors.gray.800}', _dark: '{colors.grayDark.600}' },
327
310
  },
328
311
  900: {
329
- value: { base: '{colors.gray.900}', _dark: desaturatedGray[500] },
312
+ value: { base: '{colors.gray.900}', _dark: '{colors.grayDark.500}' },
330
313
  },
331
314
  1000: {
332
- value: { base: '{colors.gray.1000}', _dark: desaturatedGray[400] },
315
+ value: { base: '{colors.gray.1000}', _dark: '{colors.grayDark.400}' },
333
316
  },
334
317
  1100: {
335
- value: { base: '{colors.gray.1100}', _dark: desaturatedGray[300] },
318
+ value: { base: '{colors.gray.1100}', _dark: '{colors.grayDark.300}' },
336
319
  },
337
320
  1200: {
338
- value: { base: '{colors.gray.1200}', _dark: desaturatedGray[200] },
321
+ value: { base: '{colors.gray.1200}', _dark: '{colors.grayDark.200}' },
339
322
  },
340
323
  1300: {
341
- value: { base: '{colors.gray.1300}', _dark: desaturatedGray[100] },
324
+ value: { base: '{colors.gray.1300}', _dark: '{colors.grayDark.100}' },
342
325
  },
343
326
  1400: {
344
- value: { base: '{colors.gray.1400}', _dark: desaturatedGray[50] },
327
+ value: { base: '{colors.gray.1400}', _dark: '{colors.grayDark.50}' },
345
328
  },
346
329
  1500: {
347
- value: { base: '{colors.gray.1500}', _dark: desaturatedGray[0] },
330
+ value: { base: '{colors.gray.1500}', _dark: '{colors.grayDark.0}' },
348
331
  },
349
332
  },
350
333
 
@@ -366,13 +349,13 @@ export const semanticTokens = {
366
349
  // value, so light is untouched); `_dark` rejoins our neutral floor instead
367
350
  // of Chakra's off-palette black.
368
351
  DEFAULT: {
369
- value: { _light: '{colors.white}', _dark: desaturatedGray[1500] },
352
+ value: { _light: '{colors.white}', _dark: '{colors.grayDark.1500}' },
370
353
  },
371
354
  canvas: {
372
- value: { base: '{colors.gray.0}', _dark: desaturatedGray[1500] },
355
+ value: { base: '{colors.gray.0}', _dark: '{colors.grayDark.1500}' },
373
356
  },
374
357
  surface: {
375
- value: { base: '{colors.white}', _dark: desaturatedGray[1400] },
358
+ value: { base: '{colors.white}', _dark: '{colors.grayDark.1400}' },
376
359
  },
377
360
  // Strongly-raised neutral surface — one level above `surface` (e.g. the
378
361
  // selected thumb of a SegmentedControl). In dark this is the *lightest*
@@ -384,7 +367,7 @@ export const semanticTokens = {
384
367
  // cannot be overridden via semanticTokens in this setup (it keeps
385
368
  // resolving to Chakra's own gray.200), whereas a fresh name is honoured.
386
369
  raised: {
387
- value: { base: '{colors.white}', _dark: desaturatedGray[1100] },
370
+ value: { base: '{colors.white}', _dark: '{colors.grayDark.1100}' },
388
371
  },
389
372
  // `_light` (not `base`): Chakra's defaults for `bg.subtle`/`bg.muted` are
390
373
  // `{ _light: gray.50 }` / `{ _light: gray.100 }`, which outrank `base` in
@@ -393,13 +376,13 @@ export const semanticTokens = {
393
376
  // either value ever diverges (as `border.subtle`/`fg.muted`/`fg.subtle`
394
377
  // already did). No visible change.
395
378
  subtle: {
396
- value: { _light: '{colors.gray.50}', _dark: desaturatedGray[1300] },
379
+ value: { _light: '{colors.gray.50}', _dark: '{colors.grayDark.1300}' },
397
380
  },
398
381
  muted: {
399
- value: { _light: '{colors.gray.100}', _dark: desaturatedGray[1200] },
382
+ value: { _light: '{colors.gray.100}', _dark: '{colors.grayDark.1200}' },
400
383
  },
401
384
  inverse: {
402
- value: { base: '{colors.gray.1300}', _dark: desaturatedGray[50] },
385
+ value: { base: '{colors.gray.1300}', _dark: '{colors.grayDark.50}' },
403
386
  },
404
387
  // Sunken page wash for list/overview surfaces: a gray floor in light so
405
388
  // `bg.surface` cards read as raised above it. In dark the `bg.*` ramp is
@@ -407,7 +390,7 @@ export const semanticTokens = {
407
390
  // that elevation — so the dark value drops to the canvas floor instead.
408
391
  // Component-level fills (hover, chips, inner blocks) keep using `bg.subtle`.
409
392
  sunken: {
410
- value: { base: '{colors.gray.50}', _dark: desaturatedGray[1500] },
393
+ value: { base: '{colors.gray.50}', _dark: '{colors.grayDark.1500}' },
411
394
  },
412
395
  // Recessed control-track surface for "meter"-style components whose
413
396
  // unfilled track carries meaning (Switch off-state, Slider rail,
@@ -415,11 +398,11 @@ export const semanticTokens = {
415
398
  // `bg.muted` (gray.50 / gray.100), which collapse into the `bg.sunken`
416
399
  // page wash in light mode, this sits at gray.300 so the track reads as a
417
400
  // filled surface on any background. Dark keeps the `bg.muted` value
418
- // (desaturatedGray[1200]) — already lighter than the dark canvas/surface,
401
+ // (grayDark.1200) — already lighter than the dark canvas/surface,
419
402
  // so it reads there without change. Use this only for control tracks, not
420
403
  // as a general fill (that stays `bg.subtle` / `bg.muted`).
421
404
  track: {
422
- value: { base: '{colors.gray.300}', _dark: desaturatedGray[1200] },
405
+ value: { base: '{colors.gray.300}', _dark: '{colors.grayDark.1200}' },
423
406
  },
424
407
  // Override Chakra's default `bg.panel` (whose `_dark` resolves to Chakra's
425
408
  // own gray.950 = #111111, off our slate palette). Light value is white —
@@ -428,7 +411,7 @@ export const semanticTokens = {
428
411
  // (not `base`) for the same reason as `bg.subtle`/`bg.muted`: Chakra's
429
412
  // default `bg.panel` is `{ _light: white }`, which would outrank `base`.
430
413
  panel: {
431
- value: { _light: '{colors.white}', _dark: desaturatedGray[1400] },
414
+ value: { _light: '{colors.white}', _dark: '{colors.grayDark.1400}' },
432
415
  },
433
416
  /**
434
417
  * Row/selection state tints. Use these for selected rows,
@@ -466,14 +449,14 @@ export const semanticTokens = {
466
449
  // `_light` repeats Chakra's value (black); `_dark` rejoins our desaturated
467
450
  // neutral so legacy html-level text tracks `fg.default`.
468
451
  DEFAULT: {
469
- value: { _light: '{colors.black}', _dark: desaturatedGray[50] },
452
+ value: { _light: '{colors.black}', _dark: '{colors.grayDark.50}' },
470
453
  },
471
454
  // Strongest text — headings, titles, key figures, emphasis. This is the
472
455
  // near-black step that `fg.default` used to be; `default` is now re-pegged
473
456
  // to a lighter body weight (see below), so reach for `emphasized` when you
474
457
  // specifically want maximum contrast.
475
458
  emphasized: {
476
- value: { base: '{colors.gray.1300}', _dark: desaturatedGray[200] },
459
+ value: { base: '{colors.gray.1300}', _dark: '{colors.grayDark.200}' },
477
460
  },
478
461
  default: {
479
462
  // Primary *body* text. Re-pegged from gray.1300 → gray.1000: near-black
@@ -481,7 +464,7 @@ export const semanticTokens = {
481
464
  // real product usage clustered well below it. gray.1000 (~9:1) is a
482
465
  // comfortable AAA body weight; the old near-black step lives on as
483
466
  // `fg.emphasized`. _dark drops one step from emphasized for hierarchy.
484
- value: { base: '{colors.gray.1000}', _dark: desaturatedGray[300] },
467
+ value: { base: '{colors.gray.1000}', _dark: '{colors.grayDark.300}' },
485
468
  },
486
469
  muted: {
487
470
  // Secondary text. `_light` (not `base`): Chakra's default `fg.muted` is
@@ -489,19 +472,22 @@ export const semanticTokens = {
489
472
  // was shadowed and secondary text rendered gray.600, lighter than our
490
473
  // intended gray.900. _dark sits one step below `default` (~9.5:1 on the
491
474
  // dark canvas) to keep the default→muted hierarchy gap.
492
- value: { _light: '{colors.gray.900}', _dark: desaturatedGray[400] },
475
+ value: { _light: '{colors.gray.900}', _dark: '{colors.grayDark.400}' },
493
476
  },
494
477
  subtle: {
495
478
  // Tertiary / placeholder / icon text. `_light` (not `base`): Chakra's
496
479
  // default `fg.subtle` is `{ _light: gray.400 }`, which outranks `base` in
497
480
  // light mode — so `base` was shadowed and this rendered gray.400, much
498
481
  // lighter than our intended gray.700. _dark a11y-bumped from the straight
499
- // mirror (desaturatedGray[600] #8E939F, ~4.06:1 on bg.muted) to #989DA9
482
+ // mirror (grayDark.600 #8E939F, ~4.06:1 on bg.muted) to #989DA9
500
483
  // (~4.6:1) so it clears AA while staying below fg.muted.
501
- value: { _light: '{colors.gray.700}', _dark: '#989DA9' },
484
+ value: {
485
+ _light: '{colors.gray.700}',
486
+ _dark: '{colors.grayDark.fgSubtle}',
487
+ },
502
488
  },
503
489
  inverse: {
504
- value: { base: '{colors.gray.0}', _dark: desaturatedGray[1400] },
490
+ value: { base: '{colors.gray.0}', _dark: '{colors.grayDark.1400}' },
505
491
  },
506
492
  },
507
493
 
@@ -518,10 +504,10 @@ export const semanticTokens = {
518
504
  // straight halved-saturation mirror (no a11y bump). `_light` repeats
519
505
  // Chakra's value so light is untouched.
520
506
  DEFAULT: {
521
- value: { _light: '{colors.gray.200}', _dark: desaturatedGray[800] },
507
+ value: { _light: '{colors.gray.200}', _dark: '{colors.grayDark.800}' },
522
508
  },
523
509
  default: {
524
- value: { base: '{colors.gray.300}', _dark: desaturatedGray[1100] },
510
+ value: { base: '{colors.gray.300}', _dark: '{colors.grayDark.1100}' },
525
511
  },
526
512
  subtle: {
527
513
  // `_light` (not `base`): Chakra's default `border.subtle` is
@@ -530,10 +516,10 @@ export const semanticTokens = {
530
516
  // Chakra's near-white gray.50 (dividers/frames vanish). Pin `_light` so
531
517
  // our gray.200 wins. (`border.default`/`strong` are safe: Chakra has no
532
518
  // default for those names, so `base` is honoured.)
533
- value: { _light: '{colors.gray.200}', _dark: desaturatedGray[1300] },
519
+ value: { _light: '{colors.gray.200}', _dark: '{colors.grayDark.1300}' },
534
520
  },
535
521
  strong: {
536
- value: { base: '{colors.gray.500}', _dark: desaturatedGray[900] },
522
+ value: { base: '{colors.gray.500}', _dark: '{colors.grayDark.900}' },
537
523
  },
538
524
  },
539
525
  },
@@ -748,6 +734,50 @@ export const colors = {
748
734
  1500: { value: '#0B0E17' }, // Darkest background
749
735
  },
750
736
 
737
+ /**
738
+ * Dark-mode neutral palette — the halved-saturation counterpart of each
739
+ * primitive `gray.N` (same hue and lightness, HSL saturation cut by ~50%,
740
+ * e.g. `gray.1300` #1E2433 @ 26% → #23262E @ 13%). The blue-tinted `gray`
741
+ * ramp reads as the right neutral in light mode but turns muddy/
742
+ * over-chromatic as a dark surface, so every dark-mode neutral in the
743
+ * semantic layer (`slate.*`, and the `_dark` of `bg`/`fg`/`border`) resolves
744
+ * to a step of this scale instead of a raw `gray` step. Light mode is
745
+ * untouched — it keeps referencing `{colors.gray.*}` verbatim.
746
+ *
747
+ * Exposed as a primitive scale (rather than the previous inlined hex
748
+ * literals) so a consumer theme — e.g. FactChat's per-tenant
749
+ * `theme_color_overrides` — can rebrand dark mode by overriding these
750
+ * tokens, the same way overriding `blue.*` retints the `primary.*` ramp.
751
+ *
752
+ * The three `fg*` steps are the hand-tuned a11y lifts documented at their
753
+ * consuming tokens (`slate.600`/`slate.700`/`fg.subtle` in dark mode): the
754
+ * straight mirrors measured under WCAG AA 4.5:1 on the dark canvas/surface,
755
+ * so these sit slightly lighter than their scale neighbours.
756
+ */
757
+ grayDark: {
758
+ 0: { value: '#FEFEFF' },
759
+ 50: { value: '#F8F9FB' },
760
+ 100: { value: '#F2F4F7' },
761
+ 200: { value: '#E5E8EC' },
762
+ 300: { value: '#D2D5DB' },
763
+ 400: { value: '#B6BAC3' },
764
+ 500: { value: '#A2A6B1' },
765
+ 600: { value: '#8E939F' },
766
+ 700: { value: '#7C818D' },
767
+ 800: { value: '#6A6F7C' },
768
+ 900: { value: '#595E6B' },
769
+ 1000: { value: '#4A4E5A' },
770
+ 1100: { value: '#3C404B' },
771
+ 1200: { value: '#30343C' },
772
+ 1300: { value: '#23262E' },
773
+ 1400: { value: '#181A20' },
774
+ 1500: { value: '#0E1014' },
775
+ // A11y-lifted foreground steps (see scale doc above).
776
+ fg600: { value: '#898E99' },
777
+ fg700: { value: '#8D919D' },
778
+ fgSubtle: { value: '#989DA9' },
779
+ },
780
+
751
781
  /**
752
782
  * Legacy purple palette (aliased to violet for backwards compatibility)
753
783
  * @deprecated Use `violet` instead