@robr0/design-system 0.14.0 → 0.16.0

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/README.md +11 -8
  2. package/behaviors/focusable.d.ts +26 -0
  3. package/behaviors/focusable.js +18 -0
  4. package/behaviors/useFocusScope.d.ts +38 -0
  5. package/behaviors/useFocusScope.js +82 -0
  6. package/behaviors/useLayer.d.ts +43 -0
  7. package/behaviors/useLayer.js +55 -0
  8. package/behaviors/useMounted.d.ts +7 -0
  9. package/behaviors/useMounted.js +14 -0
  10. package/behaviors/useScrollLock.d.ts +55 -0
  11. package/behaviors/useScrollLock.js +59 -0
  12. package/charts.d.ts +1 -0
  13. package/charts.js +2 -0
  14. package/components/AgentPlan/AgentPlan.css +12 -3
  15. package/components/AiButton/AiButton.css +327 -0
  16. package/components/AiButton/AiButton.d.ts +42 -0
  17. package/components/AiButton/AiButton.js +140 -16
  18. package/components/AlertDialog/AlertDialog.js +13 -58
  19. package/components/AnchorNav/AnchorNav.css +74 -0
  20. package/components/AnchorNav/AnchorNav.d.ts +7 -0
  21. package/components/AnchorNav/AnchorNav.js +74 -21
  22. package/components/Button/Button.css +54 -0
  23. package/components/Button/Button.d.ts +2 -2
  24. package/components/Chart/Chart.css +4 -1
  25. package/components/CircularButton/CircularButton.css +46 -0
  26. package/components/CircularButton/CircularButton.d.ts +13 -2
  27. package/components/CircularButton/CircularButton.js +19 -16
  28. package/components/Combobox/Combobox.js +2 -1
  29. package/components/CommandPalette/CommandPalette.css +36 -8
  30. package/components/CommandPalette/CommandPalette.js +9 -54
  31. package/components/Composer/Composer.css +72 -0
  32. package/components/Composer/Composer.d.ts +25 -6
  33. package/components/Composer/Composer.js +8 -0
  34. package/components/ContributionGraph/ContributionGraph.css +21 -0
  35. package/components/ContributionGraph/ContributionGraph.js +18 -10
  36. package/components/Dialog/Dialog.js +9 -62
  37. package/components/Drawer/Drawer.js +9 -62
  38. package/components/Dropdown/Dropdown.js +2 -1
  39. package/components/DropdownMenu/DropdownMenu.js +11 -3
  40. package/components/Figure/Figure.css +14 -4
  41. package/components/Figure/Figure.js +11 -20
  42. package/components/FunnelChart/FunnelChart.css +11 -36
  43. package/components/FunnelChart/FunnelChart.d.ts +19 -16
  44. package/components/FunnelChart/FunnelChart.js +67 -39
  45. package/components/Gauge/Gauge.css +11 -1
  46. package/components/Meter/Meter.css +10 -1
  47. package/components/ModelPicker/ModelPicker.js +2 -1
  48. package/components/Popover/Popover.js +3 -0
  49. package/components/ProgressBar/ProgressBar.css +1 -1
  50. package/components/SegmentedControl/SegmentedControl.css +27 -2
  51. package/components/SegmentedControl/SegmentedControl.d.ts +3 -1
  52. package/components/SegmentedControl/SegmentedControl.js +3 -1
  53. package/components/Slider/Slider.css +1 -1
  54. package/components/Slider/Slider.js +1 -1
  55. package/components/SourceTrail/SourceTrail.css +209 -0
  56. package/components/SourceTrail/SourceTrail.d.ts +49 -0
  57. package/components/SourceTrail/SourceTrail.js +108 -0
  58. package/components/Sparkline/Sparkline.css +26 -2
  59. package/components/Sparkline/Sparkline.js +2 -1
  60. package/components/Spinner/Spinner.css +1 -1
  61. package/components/SplitButton/SplitButton.d.ts +1 -1
  62. package/components/SplitButton/SplitButton.js +1 -0
  63. package/components/TimePicker/TimePicker.js +2 -1
  64. package/components/ToggleGroup/ToggleGroup.css +17 -0
  65. package/components/ToggleGroup/ToggleGroup.d.ts +2 -0
  66. package/components/ToggleGroup/ToggleGroup.js +2 -0
  67. package/components/ToolCall/ToolCall.css +16 -3
  68. package/components/Tooltip/Tooltip.css +24 -7
  69. package/components/Tooltip/Tooltip.d.ts +2 -1
  70. package/components/Tooltip/Tooltip.js +6 -0
  71. package/components/UsageCard/UsageCard.css +30 -0
  72. package/components/UsageCard/UsageCard.d.ts +48 -0
  73. package/components/UsageCard/UsageCard.js +54 -0
  74. package/components/registry.d.ts +8 -2
  75. package/components/registry.json +43 -16
  76. package/components/registry.json.d.ts +43 -16
  77. package/components/registry.json.js +1 -1
  78. package/index.d.ts +2 -1
  79. package/index.js +4 -2
  80. package/package.json +5 -1
  81. package/tokens/motion.d.ts +10 -4
  82. package/tokens/motion.js +7 -1
  83. package/tokens/registry.json +10 -0
  84. package/tokens/registry.json.d.ts +10 -0
  85. package/tokens/registry.json.js +1 -1
  86. package/tokens/tokens-dark.css +22 -2
  87. package/tokens/tokens-light.css +38 -11
  88. package/tokens/tokens-primitives.css +3 -0
package/tokens/motion.js CHANGED
@@ -7,14 +7,20 @@ const MOTION_SCROLL_SETTLE_MS = 600;
7
7
  const MOTION_STREAM_FLOOR_CPS = 70;
8
8
  const MOTION_STREAM_DRAIN_MS = 250;
9
9
  const MOTION_STREAM_CHAR_INTERVAL_MS = 15;
10
+ const MOTION_HOVER_EXIT_GRACE_MS = 600;
11
+ const MOTION_SUMMARY_THINK_MS = 900;
12
+ const MOTION_SUMMARY_REVEAL_MS = 1600;
10
13
  export {
11
14
  MOTION_AUTOPLAY_INTERVAL_MS,
12
15
  MOTION_AUTO_DISMISS_MS,
13
16
  MOTION_FEEDBACK_RESET_MS,
17
+ MOTION_HOVER_EXIT_GRACE_MS,
14
18
  MOTION_HOVER_HIDE_DELAY_MS,
15
19
  MOTION_HOVER_SHOW_DELAY_MS,
16
20
  MOTION_SCROLL_SETTLE_MS,
17
21
  MOTION_STREAM_CHAR_INTERVAL_MS,
18
22
  MOTION_STREAM_DRAIN_MS,
19
- MOTION_STREAM_FLOOR_CPS
23
+ MOTION_STREAM_FLOOR_CPS,
24
+ MOTION_SUMMARY_REVEAL_MS,
25
+ MOTION_SUMMARY_THINK_MS
20
26
  };
@@ -4,6 +4,10 @@
4
4
  "colour": [
5
5
  "--color-action-icon-active",
6
6
  "--color-action-icon-default",
7
+ "--color-action-neutral-bg",
8
+ "--color-action-neutral-bg-active",
9
+ "--color-action-neutral-bg-hover",
10
+ "--color-action-neutral-text",
7
11
  "--color-action-passive-bg",
8
12
  "--color-action-passive-bg-active",
9
13
  "--color-action-passive-bg-hover",
@@ -47,6 +51,7 @@
47
51
  "--color-chat-bubble-received-text",
48
52
  "--color-chat-bubble-sent-bg",
49
53
  "--color-chat-bubble-sent-text",
54
+ "--color-chat-context-bg",
50
55
  "--color-control-thumb",
51
56
  "--color-core-accent-amber",
52
57
  "--color-core-accent-cobalt",
@@ -72,18 +77,23 @@
72
77
  "--color-scrim",
73
78
  "--color-status-error-bg",
74
79
  "--color-status-error-border",
80
+ "--color-status-error-icon",
75
81
  "--color-status-error-text",
76
82
  "--color-status-info-bg",
77
83
  "--color-status-info-border",
84
+ "--color-status-info-icon",
78
85
  "--color-status-info-text",
79
86
  "--color-status-neutral-bg",
80
87
  "--color-status-neutral-border",
88
+ "--color-status-neutral-icon",
81
89
  "--color-status-neutral-text",
82
90
  "--color-status-positive-bg",
83
91
  "--color-status-positive-border",
92
+ "--color-status-positive-icon",
84
93
  "--color-status-positive-text",
85
94
  "--color-status-warning-bg",
86
95
  "--color-status-warning-border",
96
+ "--color-status-warning-icon",
87
97
  "--color-status-warning-text",
88
98
  "--color-text-inverse",
89
99
  "--color-text-on-inverse",
@@ -4,6 +4,10 @@ declare const _default: {
4
4
  "colour": [
5
5
  "--color-action-icon-active",
6
6
  "--color-action-icon-default",
7
+ "--color-action-neutral-bg",
8
+ "--color-action-neutral-bg-active",
9
+ "--color-action-neutral-bg-hover",
10
+ "--color-action-neutral-text",
7
11
  "--color-action-passive-bg",
8
12
  "--color-action-passive-bg-active",
9
13
  "--color-action-passive-bg-hover",
@@ -47,6 +51,7 @@ declare const _default: {
47
51
  "--color-chat-bubble-received-text",
48
52
  "--color-chat-bubble-sent-bg",
49
53
  "--color-chat-bubble-sent-text",
54
+ "--color-chat-context-bg",
50
55
  "--color-control-thumb",
51
56
  "--color-core-accent-amber",
52
57
  "--color-core-accent-cobalt",
@@ -72,18 +77,23 @@ declare const _default: {
72
77
  "--color-scrim",
73
78
  "--color-status-error-bg",
74
79
  "--color-status-error-border",
80
+ "--color-status-error-icon",
75
81
  "--color-status-error-text",
76
82
  "--color-status-info-bg",
77
83
  "--color-status-info-border",
84
+ "--color-status-info-icon",
78
85
  "--color-status-info-text",
79
86
  "--color-status-neutral-bg",
80
87
  "--color-status-neutral-border",
88
+ "--color-status-neutral-icon",
81
89
  "--color-status-neutral-text",
82
90
  "--color-status-positive-bg",
83
91
  "--color-status-positive-border",
92
+ "--color-status-positive-icon",
84
93
  "--color-status-positive-text",
85
94
  "--color-status-warning-bg",
86
95
  "--color-status-warning-border",
96
+ "--color-status-warning-icon",
87
97
  "--color-status-warning-text",
88
98
  "--color-text-inverse",
89
99
  "--color-text-on-inverse",
@@ -1,4 +1,4 @@
1
- const categories = { "colour": ["--color-action-icon-active", "--color-action-icon-default", "--color-action-passive-bg", "--color-action-passive-bg-active", "--color-action-passive-bg-hover", "--color-action-passive-text", "--color-action-primary-bg", "--color-action-primary-bg-active", "--color-action-primary-bg-hover", "--color-action-primary-border", "--color-action-primary-border-secondary", "--color-action-primary-border-tertiary", "--color-action-primary-text", "--color-action-primary-text-active", "--color-action-primary-text-secondary", "--color-action-primary-text-tertiary", "--color-ai-gradient-end", "--color-ai-gradient-mid", "--color-ai-gradient-start", "--color-bg-container-border", "--color-bg-container-inverse", "--color-bg-container-primary", "--color-bg-container-primary-semi", "--color-bg-container-primary-transparent", "--color-bg-container-secondary", "--color-bg-container-tertiary", "--color-bg-glass", "--color-bg-page-inverse", "--color-bg-page-primary", "--color-chart-contribution-0", "--color-chart-contribution-1", "--color-chart-contribution-2", "--color-chart-contribution-3", "--color-chart-contribution-4", "--color-chart-series-1", "--color-chart-series-2", "--color-chart-series-3", "--color-chart-series-4", "--color-chart-series-5", "--color-chart-series-6", "--color-chart-series-7", "--color-chat-bubble-received-bg", "--color-chat-bubble-received-text", "--color-chat-bubble-sent-bg", "--color-chat-bubble-sent-text", "--color-control-thumb", "--color-core-accent-amber", "--color-core-accent-cobalt", "--color-core-accent-coral", "--color-core-accent-gold", "--color-core-accent-mint", "--color-core-accent-violet", "--color-core-ui-primary", "--color-core-ui-secondary", "--color-divider", "--color-icon-primary", "--color-icon-secondary", "--color-input-bg-disabled", "--color-input-bg-primary", "--color-input-border-disabled", "--color-input-border-hover", "--color-input-border-primary", "--color-input-border-selected", "--color-input-text-disabled", "--color-input-text-inverse", "--color-input-text-placeholder", "--color-input-text-primary", "--color-scrim", "--color-status-error-bg", "--color-status-error-border", "--color-status-error-text", "--color-status-info-bg", "--color-status-info-border", "--color-status-info-text", "--color-status-neutral-bg", "--color-status-neutral-border", "--color-status-neutral-text", "--color-status-positive-bg", "--color-status-positive-border", "--color-status-positive-text", "--color-status-warning-bg", "--color-status-warning-border", "--color-status-warning-text", "--color-text-inverse", "--color-text-on-inverse", "--color-text-primary", "--color-text-secondary", "--color-text-tertiary", "--color-trend-down", "--color-trend-up"], "typography": ["--font-caption-family", "--font-caption-letter-spacing", "--font-caption-line-height", "--font-caption-size", "--font-caption-weight", "--font-display-1-family", "--font-display-1-letter-spacing", "--font-display-1-line-height", "--font-display-1-size", "--font-display-1-weight", "--font-display-2-family", "--font-display-2-letter-spacing", "--font-display-2-line-height", "--font-display-2-size", "--font-display-2-weight", "--font-family-code", "--font-family-primary", "--font-heading-1-family", "--font-heading-1-letter-spacing", "--font-heading-1-line-height", "--font-heading-1-size", "--font-heading-1-weight", "--font-heading-2-family", "--font-heading-2-letter-spacing", "--font-heading-2-line-height", "--font-heading-2-size", "--font-heading-2-weight", "--font-heading-3-family", "--font-heading-3-letter-spacing", "--font-heading-3-line-height", "--font-heading-3-size", "--font-heading-3-weight", "--font-mega-1-family", "--font-mega-1-letter-spacing", "--font-mega-1-line-height", "--font-mega-1-size", "--font-mega-1-weight", "--font-mega-2-family", "--font-mega-2-letter-spacing", "--font-mega-2-line-height", "--font-mega-2-size", "--font-mega-2-weight", "--font-overline-family", "--font-overline-letter-spacing", "--font-overline-line-height", "--font-overline-size", "--font-overline-weight", "--font-paragraph-em-family", "--font-paragraph-em-letter-spacing", "--font-paragraph-em-line-height", "--font-paragraph-em-size", "--font-paragraph-em-weight", "--font-paragraph-family", "--font-paragraph-letter-spacing", "--font-paragraph-line-height", "--font-paragraph-size", "--font-paragraph-sm-em-family", "--font-paragraph-sm-em-letter-spacing", "--font-paragraph-sm-em-line-height", "--font-paragraph-sm-em-size", "--font-paragraph-sm-em-weight", "--font-paragraph-sm-family", "--font-paragraph-sm-letter-spacing", "--font-paragraph-sm-line-height", "--font-paragraph-sm-size", "--font-paragraph-sm-weight", "--font-paragraph-weight", "--font-sub-display-family", "--font-sub-display-letter-spacing", "--font-sub-display-line-height", "--font-sub-display-size", "--font-sub-display-weight", "--font-title-body-family", "--font-title-body-letter-spacing", "--font-title-body-line-height", "--font-title-body-size", "--font-title-body-weight"], "spacing": ["--gap-lg", "--gap-md", "--gap-sm", "--gap-sm-md", "--gap-xl", "--gap-xs", "--gap-xxl", "--gap-xxs", "--gap-xxxl", "--gap-xxxxl", "--padding-lg", "--padding-md", "--padding-sm", "--padding-sm-md", "--padding-xl", "--padding-xs", "--padding-xxl", "--padding-xxs", "--padding-xxxs"], "radius": ["--radius-composer", "--radius-full", "--radius-lg", "--radius-md", "--radius-sm", "--radius-xl", "--radius-xs", "--radius-xxl", "--radius-xxs"], "border": ["--border-md", "--border-xs"], "shadow": ["--shadow-floating", "--shadow-modal"], "icons": ["--icon-size-lg", "--icon-size-md", "--icon-size-sm", "--icon-size-xl"], "motion": ["--motion-duration-base", "--motion-duration-deliberate", "--motion-duration-fast", "--motion-duration-instant", "--motion-duration-loop-matrix", "--motion-duration-loop-shimmer", "--motion-duration-loop-spin", "--motion-duration-slow", "--motion-duration-slower", "--motion-ease-emphasized", "--motion-ease-entrance", "--motion-ease-linear", "--motion-ease-spring", "--motion-ease-standard"] };
1
+ const categories = { "colour": ["--color-action-icon-active", "--color-action-icon-default", "--color-action-neutral-bg", "--color-action-neutral-bg-active", "--color-action-neutral-bg-hover", "--color-action-neutral-text", "--color-action-passive-bg", "--color-action-passive-bg-active", "--color-action-passive-bg-hover", "--color-action-passive-text", "--color-action-primary-bg", "--color-action-primary-bg-active", "--color-action-primary-bg-hover", "--color-action-primary-border", "--color-action-primary-border-secondary", "--color-action-primary-border-tertiary", "--color-action-primary-text", "--color-action-primary-text-active", "--color-action-primary-text-secondary", "--color-action-primary-text-tertiary", "--color-ai-gradient-end", "--color-ai-gradient-mid", "--color-ai-gradient-start", "--color-bg-container-border", "--color-bg-container-inverse", "--color-bg-container-primary", "--color-bg-container-primary-semi", "--color-bg-container-primary-transparent", "--color-bg-container-secondary", "--color-bg-container-tertiary", "--color-bg-glass", "--color-bg-page-inverse", "--color-bg-page-primary", "--color-chart-contribution-0", "--color-chart-contribution-1", "--color-chart-contribution-2", "--color-chart-contribution-3", "--color-chart-contribution-4", "--color-chart-series-1", "--color-chart-series-2", "--color-chart-series-3", "--color-chart-series-4", "--color-chart-series-5", "--color-chart-series-6", "--color-chart-series-7", "--color-chat-bubble-received-bg", "--color-chat-bubble-received-text", "--color-chat-bubble-sent-bg", "--color-chat-bubble-sent-text", "--color-chat-context-bg", "--color-control-thumb", "--color-core-accent-amber", "--color-core-accent-cobalt", "--color-core-accent-coral", "--color-core-accent-gold", "--color-core-accent-mint", "--color-core-accent-violet", "--color-core-ui-primary", "--color-core-ui-secondary", "--color-divider", "--color-icon-primary", "--color-icon-secondary", "--color-input-bg-disabled", "--color-input-bg-primary", "--color-input-border-disabled", "--color-input-border-hover", "--color-input-border-primary", "--color-input-border-selected", "--color-input-text-disabled", "--color-input-text-inverse", "--color-input-text-placeholder", "--color-input-text-primary", "--color-scrim", "--color-status-error-bg", "--color-status-error-border", "--color-status-error-icon", "--color-status-error-text", "--color-status-info-bg", "--color-status-info-border", "--color-status-info-icon", "--color-status-info-text", "--color-status-neutral-bg", "--color-status-neutral-border", "--color-status-neutral-icon", "--color-status-neutral-text", "--color-status-positive-bg", "--color-status-positive-border", "--color-status-positive-icon", "--color-status-positive-text", "--color-status-warning-bg", "--color-status-warning-border", "--color-status-warning-icon", "--color-status-warning-text", "--color-text-inverse", "--color-text-on-inverse", "--color-text-primary", "--color-text-secondary", "--color-text-tertiary", "--color-trend-down", "--color-trend-up"], "typography": ["--font-caption-family", "--font-caption-letter-spacing", "--font-caption-line-height", "--font-caption-size", "--font-caption-weight", "--font-display-1-family", "--font-display-1-letter-spacing", "--font-display-1-line-height", "--font-display-1-size", "--font-display-1-weight", "--font-display-2-family", "--font-display-2-letter-spacing", "--font-display-2-line-height", "--font-display-2-size", "--font-display-2-weight", "--font-family-code", "--font-family-primary", "--font-heading-1-family", "--font-heading-1-letter-spacing", "--font-heading-1-line-height", "--font-heading-1-size", "--font-heading-1-weight", "--font-heading-2-family", "--font-heading-2-letter-spacing", "--font-heading-2-line-height", "--font-heading-2-size", "--font-heading-2-weight", "--font-heading-3-family", "--font-heading-3-letter-spacing", "--font-heading-3-line-height", "--font-heading-3-size", "--font-heading-3-weight", "--font-mega-1-family", "--font-mega-1-letter-spacing", "--font-mega-1-line-height", "--font-mega-1-size", "--font-mega-1-weight", "--font-mega-2-family", "--font-mega-2-letter-spacing", "--font-mega-2-line-height", "--font-mega-2-size", "--font-mega-2-weight", "--font-overline-family", "--font-overline-letter-spacing", "--font-overline-line-height", "--font-overline-size", "--font-overline-weight", "--font-paragraph-em-family", "--font-paragraph-em-letter-spacing", "--font-paragraph-em-line-height", "--font-paragraph-em-size", "--font-paragraph-em-weight", "--font-paragraph-family", "--font-paragraph-letter-spacing", "--font-paragraph-line-height", "--font-paragraph-size", "--font-paragraph-sm-em-family", "--font-paragraph-sm-em-letter-spacing", "--font-paragraph-sm-em-line-height", "--font-paragraph-sm-em-size", "--font-paragraph-sm-em-weight", "--font-paragraph-sm-family", "--font-paragraph-sm-letter-spacing", "--font-paragraph-sm-line-height", "--font-paragraph-sm-size", "--font-paragraph-sm-weight", "--font-paragraph-weight", "--font-sub-display-family", "--font-sub-display-letter-spacing", "--font-sub-display-line-height", "--font-sub-display-size", "--font-sub-display-weight", "--font-title-body-family", "--font-title-body-letter-spacing", "--font-title-body-line-height", "--font-title-body-size", "--font-title-body-weight"], "spacing": ["--gap-lg", "--gap-md", "--gap-sm", "--gap-sm-md", "--gap-xl", "--gap-xs", "--gap-xxl", "--gap-xxs", "--gap-xxxl", "--gap-xxxxl", "--padding-lg", "--padding-md", "--padding-sm", "--padding-sm-md", "--padding-xl", "--padding-xs", "--padding-xxl", "--padding-xxs", "--padding-xxxs"], "radius": ["--radius-composer", "--radius-full", "--radius-lg", "--radius-md", "--radius-sm", "--radius-xl", "--radius-xs", "--radius-xxl", "--radius-xxs"], "border": ["--border-md", "--border-xs"], "shadow": ["--shadow-floating", "--shadow-modal"], "icons": ["--icon-size-lg", "--icon-size-md", "--icon-size-sm", "--icon-size-xl"], "motion": ["--motion-duration-base", "--motion-duration-deliberate", "--motion-duration-fast", "--motion-duration-instant", "--motion-duration-loop-matrix", "--motion-duration-loop-shimmer", "--motion-duration-loop-spin", "--motion-duration-slow", "--motion-duration-slower", "--motion-ease-emphasized", "--motion-ease-entrance", "--motion-ease-linear", "--motion-ease-spring", "--motion-ease-standard"] };
2
2
  const registry = {
3
3
  categories
4
4
  };
@@ -40,6 +40,8 @@
40
40
  --color-chat-bubble-sent-text: var(--color-text-primary);
41
41
  --color-chat-bubble-received-bg: var(--color-bg-container-secondary);
42
42
  --color-chat-bubble-received-text: var(--color-text-primary);
43
+ /* The composer's context note — one step off the #050505 shell */
44
+ --color-chat-context-bg: var(--primitive-neutral-09);
43
45
 
44
46
  /* Overlay & controls */
45
47
  --color-scrim: var(--primitive-true-black-strong);
@@ -75,33 +77,51 @@
75
77
  --color-action-passive-bg-hover: var(--primitive-neutral-08-semi);
76
78
  --color-action-passive-bg-active: var(--primitive-neutral-07-semi);
77
79
 
80
+ /* Action - Neutral (grey filled buttons). The fill stays visible at
81
+ rest, one step above the container greys; hover and active brighten
82
+ toward the page's opposite, like the primary family. */
83
+ --color-action-neutral-bg: var(--primitive-neutral-08);
84
+ --color-action-neutral-bg-hover: var(--primitive-neutral-07);
85
+ --color-action-neutral-bg-active: var(--primitive-neutral-06);
86
+ --color-action-neutral-text: var(--primitive-neutral-01);
87
+
78
88
  /* Status - Positive */
79
89
  --color-status-positive-bg: var(--primitive-green-10);
80
90
  --color-status-positive-border: var(--primitive-green-07);
81
91
  --color-status-positive-text: var(--primitive-green-01);
92
+ --color-status-positive-icon: var(--primitive-green-07);
82
93
 
83
94
  /* Status - Warning */
84
95
  --color-status-warning-bg: var(--primitive-orange-10);
85
96
  --color-status-warning-border: var(--primitive-orange-07);
86
97
  --color-status-warning-text: var(--primitive-orange-01);
98
+ --color-status-warning-icon: var(--primitive-orange-07);
87
99
 
88
100
  /* Status - Error */
89
101
  --color-status-error-bg: var(--primitive-red-10);
90
102
  --color-status-error-border: var(--primitive-red-07);
91
103
  --color-status-error-text: var(--primitive-red-01);
104
+ --color-status-error-icon: var(--primitive-red-06);
92
105
 
93
106
  /* Status - Info */
94
107
  --color-status-info-bg: var(--primitive-blue-10);
95
108
  --color-status-info-border: var(--primitive-blue-07);
96
109
  --color-status-info-text: var(--primitive-blue-01);
110
+ --color-status-info-icon: var(--primitive-blue-05);
97
111
 
98
112
  /* Status - Neutral */
99
113
  --color-status-neutral-bg: var(--primitive-neutral-08);
100
114
  --color-status-neutral-border: var(--primitive-neutral-06);
101
115
  --color-status-neutral-text: var(--primitive-neutral-01);
116
+ --color-status-neutral-icon: var(--primitive-neutral-04);
117
+
118
+ /* The -icon step (status glyphs on plain surfaces) runs brighter here
119
+ than the light-theme inks: mid-ramp hues that hold ≥3:1 on the dark
120
+ container floor, where the near-white -text tints all read as grey. */
102
121
 
103
- /* AI - The gradient accent, one step brighter than light mode so the ring
104
- stays luminous on dark surfaces. */
122
+ /* AI - The gradient accent: the same luminous stops as light. One set
123
+ works on both floors, so the AI signature never shifts hue with the
124
+ theme. */
105
125
  --color-ai-gradient-start: var(--primitive-red-05);
106
126
  --color-ai-gradient-mid: var(--primitive-blue-05);
107
127
  --color-ai-gradient-end: var(--primitive-teal-07);
@@ -19,22 +19,25 @@
19
19
  --color-icon-secondary: var(--primitive-neutral-04);
20
20
 
21
21
  /* Background - Page */
22
- --color-bg-page-primary: var(--primitive-neutral-00);
22
+ --color-bg-page-primary: var(--primitive-neutral-01);
23
23
  --color-bg-page-inverse: var(--primitive-neutral-10);
24
24
 
25
25
  /* Background - Container */
26
- --color-bg-container-primary: var(--primitive-neutral-01);
27
- --color-bg-container-primary-transparent: var(--primitive-neutral-01-transparent);
28
- --color-bg-container-primary-semi: var(--primitive-neutral-01-semi);
29
- --color-bg-container-secondary: var(--primitive-neutral-02);
30
- --color-bg-container-tertiary: var(--primitive-neutral-03);
26
+ --color-bg-container-primary: var(--primitive-neutral-00);
27
+ --color-bg-container-primary-transparent: var(--primitive-neutral-00-transparent);
28
+ /* The semi surface rides the glass-strength white, not the 60% one: light
29
+ containers should read bright white, with the ambient background only
30
+ whispering through. */
31
+ --color-bg-container-primary-semi: var(--primitive-neutral-00-glass);
32
+ --color-bg-container-secondary: var(--primitive-neutral-01);
33
+ --color-bg-container-tertiary: var(--primitive-neutral-02);
31
34
  --color-bg-container-inverse: var(--primitive-neutral-09);
32
35
  --color-bg-container-border: var(--primitive-neutral-02);
33
36
 
34
37
  /* Glass: the translucent floating-surface fill (chat panel, floating
35
38
  sidebar). Deliberately translucent in both themes so the page's
36
39
  colours reach the surface; pair it with backdrop-filter: blur(24px). */
37
- --color-bg-glass: var(--primitive-neutral-01-glass);
40
+ --color-bg-glass: var(--primitive-neutral-00-glass);
38
41
 
39
42
  /* Divider */
40
43
  --color-divider: var(--primitive-neutral-02-semi);
@@ -47,6 +50,10 @@
47
50
  --color-chat-bubble-sent-text: var(--color-text-primary);
48
51
  --color-chat-bubble-received-bg: var(--color-bg-container-secondary);
49
52
  --color-chat-bubble-received-text: var(--color-text-primary);
53
+ /* The composer's context note — the quietest tint per theme, the nearest
54
+ neutral to each shell that still separates from it. Its own role, not a
55
+ container alias, because it deliberately sits off the container ramp. */
56
+ --color-chat-context-bg: var(--primitive-neutral-01);
50
57
 
51
58
  /* Overlay & controls */
52
59
  --color-scrim: var(--primitive-true-black-semi);
@@ -81,6 +88,15 @@
81
88
  --color-action-passive-bg-hover: var(--primitive-neutral-02-semi);
82
89
  --color-action-passive-bg-active: var(--primitive-neutral-03-semi);
83
90
 
91
+ /* Action - Neutral (grey filled buttons). Unlike passive, the fill is a
92
+ solid grey step that stays visible at rest — a filled button without
93
+ the action teal's "click here" weight. Hover and active deepen in
94
+ light mode and brighten in dark, like the primary family. */
95
+ --color-action-neutral-bg: var(--primitive-neutral-02);
96
+ --color-action-neutral-bg-hover: var(--primitive-neutral-03);
97
+ --color-action-neutral-bg-active: var(--primitive-neutral-04);
98
+ --color-action-neutral-text: var(--primitive-neutral-10);
99
+
84
100
  /* Core colours */
85
101
  --color-core-ui-primary: var(--primitive-teal-08);
86
102
  --color-core-ui-secondary: var(--primitive-teal-10);
@@ -101,34 +117,45 @@
101
117
  --color-status-positive-bg: var(--primitive-green-01);
102
118
  --color-status-positive-border: var(--primitive-green-07);
103
119
  --color-status-positive-text: var(--primitive-green-10);
120
+ --color-status-positive-icon: var(--primitive-green-08);
104
121
 
105
122
  /* Status - Warning */
106
123
  --color-status-warning-bg: var(--primitive-orange-01);
107
124
  --color-status-warning-border: var(--primitive-orange-07);
108
125
  --color-status-warning-text: var(--primitive-orange-10);
126
+ --color-status-warning-icon: var(--primitive-orange-08);
109
127
 
110
128
  /* Status - Error */
111
129
  --color-status-error-bg: var(--primitive-red-01);
112
130
  --color-status-error-border: var(--primitive-red-07);
113
131
  --color-status-error-text: var(--primitive-red-10);
132
+ --color-status-error-icon: var(--primitive-red-08);
114
133
 
115
134
  /* Status - Info */
116
135
  --color-status-info-bg: var(--primitive-blue-01);
117
136
  --color-status-info-border: var(--primitive-blue-07);
118
137
  --color-status-info-text: var(--primitive-blue-10);
138
+ --color-status-info-icon: var(--primitive-blue-06);
119
139
 
120
140
  /* Status - Neutral */
121
141
  --color-status-neutral-bg: var(--primitive-neutral-02);
122
142
  --color-status-neutral-border: var(--primitive-neutral-07);
123
143
  --color-status-neutral-text: var(--primitive-neutral-08);
144
+ --color-status-neutral-icon: var(--primitive-neutral-06);
145
+
146
+ /* The -icon step is the status glyph colour for plain surfaces (a step
147
+ indicator, a tool-call state) — -text is tuned for the tinted status
148
+ bg and washes out on a bare container, especially in dark mode. */
124
149
 
125
150
  /* AI - The gradient accent reserved for AI entry points and surfaces.
126
151
  Red → blue → teal, so the AI affordance is its own signature and the
127
152
  flat action teal keeps meaning "click here". Used as gradient stops
128
- (AiButton's ring and glow), never as fills for ordinary chrome. */
129
- --color-ai-gradient-start: var(--primitive-red-06);
130
- --color-ai-gradient-mid: var(--primitive-blue-06);
131
- --color-ai-gradient-end: var(--primitive-teal-08);
153
+ (AiButton's ring and glow), never as fills for ordinary chrome.
154
+ One luminous set, shared with dark: the deeper inks read as a heavy
155
+ dark border on white surfaces. */
156
+ --color-ai-gradient-start: var(--primitive-red-05);
157
+ --color-ai-gradient-mid: var(--primitive-blue-05);
158
+ --color-ai-gradient-end: var(--primitive-teal-07);
132
159
 
133
160
  /* Chart - Contribution heatmap ramp (level 0 = none → level 4 = most) */
134
161
  --color-chart-contribution-0: var(--color-bg-container-primary);
@@ -11,6 +11,9 @@
11
11
 
12
12
  /* Neutral Scale */
13
13
  --primitive-neutral-00: #FFFFFF;
14
+ --primitive-neutral-00-transparent: rgba(255, 255, 255, 0.01);
15
+ --primitive-neutral-00-semi: rgba(255, 255, 255, 0.6);
16
+ --primitive-neutral-00-glass: rgba(255, 255, 255, 0.9);
14
17
  --primitive-neutral-01: #F1F1F1;
15
18
  --primitive-neutral-01-transparent: rgba(241, 241, 241, 0.01);
16
19
  --primitive-neutral-01-semi: rgba(241, 241, 241, 0.6);