@adia-ai/web-components 0.0.18 → 0.0.20

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 (90) hide show
  1. package/components/accordion/accordion.css +101 -102
  2. package/components/agent-feedback-bar/agent-feedback-bar.js +8 -8
  3. package/components/agent-questions/agent-questions.css +2 -1
  4. package/components/agent-questions/agent-questions.js +6 -6
  5. package/components/agent-reasoning/agent-reasoning.js +20 -5
  6. package/components/agent-trace/agent-trace.a2ui.json +5 -5
  7. package/components/agent-trace/agent-trace.js +7 -5
  8. package/components/agent-trace/agent-trace.yaml +2 -2
  9. package/components/alert/alert.a2ui.json +1 -2
  10. package/components/alert/alert.css +4 -4
  11. package/components/alert/alert.yaml +1 -2
  12. package/components/avatar/avatar.a2ui.json +3 -3
  13. package/components/avatar/avatar.js +10 -0
  14. package/components/avatar/avatar.yaml +6 -6
  15. package/components/button/button.a2ui.json +14 -2
  16. package/components/button/button.css +19 -2
  17. package/components/button/button.js +1 -0
  18. package/components/button/button.yaml +20 -2
  19. package/components/calendar-picker/calendar-picker.css +2 -1
  20. package/components/calendar-picker/calendar-picker.js +12 -1
  21. package/components/chart/chart.css +11 -11
  22. package/components/chart/chart.js +26 -18
  23. package/components/chart-legend/chart-legend.a2ui.json +2 -2
  24. package/components/chart-legend/chart-legend.js +4 -1
  25. package/components/chart-legend/chart-legend.yaml +2 -2
  26. package/components/chat/chat-input.js +13 -5
  27. package/components/chat/chat.a2ui.json +2 -2
  28. package/components/chat/chat.js +14 -3
  29. package/components/chat/chat.yaml +2 -2
  30. package/components/code/code.css +16 -6
  31. package/components/command/command.js +9 -1
  32. package/components/field/field.a2ui.json +0 -5
  33. package/components/field/field.css +2 -2
  34. package/components/field/field.js +53 -5
  35. package/components/field/field.yaml +5 -8
  36. package/components/heatmap/heatmap.css +32 -23
  37. package/components/input/input.js +30 -1
  38. package/components/kbd/kbd.a2ui.json +5 -1
  39. package/components/kbd/kbd.yaml +5 -1
  40. package/components/menu/menu.css +20 -8
  41. package/components/menu/menu.js +9 -1
  42. package/components/modal/modal.css +101 -108
  43. package/components/noodles/noodles.js +25 -8
  44. package/components/pipeline-status/pipeline-status.css +4 -4
  45. package/components/pipeline-status/pipeline-status.js +6 -4
  46. package/components/popover/popover.js +4 -0
  47. package/components/progress-row/progress-row.a2ui.json +3 -2
  48. package/components/progress-row/progress-row.yaml +2 -1
  49. package/components/range/range.js +7 -0
  50. package/components/richtext/richtext.css +2 -2
  51. package/components/richtext/richtext.js +4 -1
  52. package/components/segment/segment.css +1 -1
  53. package/components/segmented/segmented.js +7 -1
  54. package/components/select/select.css +7 -4
  55. package/components/slider/slider.js +15 -8
  56. package/components/stepper/stepper.css +181 -144
  57. package/components/stepper/stepper.js +5 -2
  58. package/components/swiper/swiper.a2ui.json +3 -3
  59. package/components/swiper/swiper.css +11 -77
  60. package/components/swiper/swiper.js +6 -5
  61. package/components/swiper/swiper.yaml +3 -3
  62. package/components/switch/switch.a2ui.json +8 -1
  63. package/components/switch/switch.yaml +8 -1
  64. package/components/table/table.js +9 -1
  65. package/components/table-toolbar/table-toolbar.a2ui.json +21 -21
  66. package/components/table-toolbar/table-toolbar.css +32 -91
  67. package/components/table-toolbar/table-toolbar.js +219 -86
  68. package/components/table-toolbar/table-toolbar.yaml +21 -12
  69. package/components/tabs/tabs.css +3 -2
  70. package/components/tabs/tabs.js +7 -1
  71. package/components/tag/tag.a2ui.json +2 -2
  72. package/components/tag/tag.yaml +2 -2
  73. package/components/timeline/timeline.css +244 -204
  74. package/components/timeline/timeline.js +1 -3
  75. package/components/toast/toast.a2ui.json +2 -3
  76. package/components/toast/toast.yaml +5 -3
  77. package/components/toolbar/toolbar.css +6 -1
  78. package/components/toolbar/toolbar.js +10 -2
  79. package/components/tooltip/tooltip.css +8 -2
  80. package/components/tooltip/tooltip.js +12 -14
  81. package/components/tree/tree.css +21 -0
  82. package/core/icons.js +14 -0
  83. package/core/polyfills.js +17 -7
  84. package/package.json +1 -1
  85. package/patterns/a2ui-root/a2ui-root.js +21 -14
  86. package/patterns/app-shell/css/app-shell.main.css +30 -1
  87. package/patterns/app-shell/css/app-shell.tokens.css +1 -0
  88. package/patterns/gen-ui/gen-ui.js +1 -1
  89. package/styles/colors/semantics.css +59 -2
  90. package/styles/tokens.css +16 -12
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://adiaui.dev/a2ui/v0_9/components/Swiper.json",
4
4
  "title": "Swiper",
5
- "description": "CSS-first carousel with scroll-snap. Supports autoplay, loop, peek, and native scroll markers.",
5
+ "description": "CSS-first carousel with scroll-snap. Supports autoplay, loop, and peek; JS-stamped pagination dots and paddles.",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -77,8 +77,8 @@
77
77
  "autoplay-resume": {
78
78
  "description": "Fired on autoplay-resume."
79
79
  },
80
- "slide-change": {
81
- "description": "Fired on slide-change."
80
+ "change": {
81
+ "description": "Fired when the active slide changes. Detail: { index, slide }."
82
82
  }
83
83
  },
84
84
  "examples": [
@@ -1,7 +1,7 @@
1
1
  /* ═══════════════════════════════════════════════════════════════
2
2
  SWIPER-N — CSS-first carousel
3
- Scroll-snap positioning, native ::scroll-marker dots,
4
- ::scroll-button prev/next, container-query responsive.
3
+ Scroll-snap positioning, container-query responsive,
4
+ JS-stamped pagination dots + prev/next paddles.
5
5
 
6
6
  Structure (JS-stamped):
7
7
  swiper-ui ← flex column wrapper
@@ -10,6 +10,12 @@
10
10
  [data-swiper-dots] ← pagination dots (below track)
11
11
  [data-swiper-btn prev] ← absolute left paddle
12
12
  [data-swiper-btn next] ← absolute right paddle
13
+
14
+ Native ::scroll-marker / ::scroll-button is Chrome-135-only and
15
+ not yet on Safari/Firefox roadmaps. Until cross-engine, JS-stamped
16
+ dots are the single source of pagination UI; re-introduce native
17
+ paths gated on CSS.supports('selector(::scroll-marker)') when both
18
+ other engines ship.
13
19
  ═══════════════════════════════════════════════════════════════ */
14
20
 
15
21
  @scope (swiper-ui) {
@@ -31,9 +37,6 @@
31
37
  /* ── Host vertical rhythm ── */
32
38
  --swiper-gap-vertical: var(--a-space-3);
33
39
 
34
- /* ── Native scroll-marker group padding ── */
35
- --swiper-marker-group-py: var(--a-space-3);
36
-
37
40
  /* ── Paddle bottom offset ── */
38
41
  --swiper-btn-bottom: var(--a-space-3);
39
42
 
@@ -127,80 +130,11 @@
127
130
  :scope:not([slides-per-view]) { --swiper-columns: 3; }
128
131
  }
129
132
 
130
- /* ── Native scroll markers (Chrome 135+) ── */
131
-
132
- :scope > [data-swiper-track]::scroll-marker-group {
133
- display: flex;
134
- gap: var(--swiper-dot-gap);
135
- justify-content: center;
136
- padding-block: var(--swiper-marker-group-py);
137
- position: sticky;
138
- bottom: 0;
139
- align-self: end;
140
- grid-column: 1 / -1;
141
- }
142
-
143
- :scope > [data-swiper-track] > *::scroll-marker {
144
- content: '';
145
- width: var(--swiper-dot-size);
146
- height: var(--swiper-dot-size);
147
- border-radius: var(--swiper-dot-radius);
148
- background: var(--swiper-dot-bg);
149
- border: none;
150
- cursor: pointer;
151
- transition: background var(--swiper-duration) var(--swiper-easing),
152
- transform var(--swiper-duration) var(--swiper-easing);
153
- }
154
-
155
- :scope > [data-swiper-track] > *::scroll-marker:target-current {
156
- background: var(--swiper-dot-bg-active);
157
- }
158
-
159
- /* ── Native scroll buttons (Chrome 135+) ──
160
- Disabled — we always stamp JS paddles for consistent
161
- cross-browser appearance. Uncomment to use native instead. */
162
-
163
- /*
164
- :scope > [data-swiper-track]::scroll-button(inline-start),
165
- :scope > [data-swiper-track]::scroll-button(inline-end) {
166
- position: absolute;
167
- top: 50%;
168
- transform: translateY(-50%);
169
- width: var(--swiper-btn-size);
170
- height: var(--swiper-btn-size);
171
- display: flex;
172
- align-items: center;
173
- justify-content: center;
174
- border-radius: var(--swiper-btn-radius);
175
- background: var(--swiper-btn-bg);
176
- color: var(--swiper-btn-fg);
177
- border: none;
178
- box-shadow: var(--swiper-btn-shadow);
179
- cursor: pointer;
180
- z-index: 2;
181
- font-size: 1.25em;
182
- transition: background var(--swiper-duration) var(--swiper-easing),
183
- opacity var(--swiper-duration) var(--swiper-easing);
184
- }
185
-
186
- :scope > [data-swiper-track]::scroll-button(inline-start) { content: '\2039'; left: var(--swiper-btn-offset); }
187
- :scope > [data-swiper-track]::scroll-button(inline-end) { content: '\203A'; right: var(--swiper-btn-offset); }
188
-
189
- :scope > [data-swiper-track]::scroll-button(inline-start):hover,
190
- :scope > [data-swiper-track]::scroll-button(inline-end):hover {
191
- background: var(--swiper-btn-bg-hover);
192
- }
193
-
194
- :scope > [data-swiper-track]::scroll-button(inline-start):disabled,
195
- :scope > [data-swiper-track]::scroll-button(inline-end):disabled {
196
- opacity: 0;
197
- pointer-events: none;
198
- }
199
- */
200
-
201
133
  /* ══════════════════════════════════════════════════════════
202
- JS-stamped fallback paddles
134
+ JS-stamped paddles
203
135
  Centered vertically on the track area only.
136
+ Native ::scroll-button is Chrome-135-only — re-introduce
137
+ when cross-engine.
204
138
  ══════════════════════════════════════════════════════════ */
205
139
 
206
140
  :scope > [data-swiper-btn] {
@@ -6,16 +6,17 @@
6
6
  * </swiper-ui>
7
7
  *
8
8
  * CSS-first carousel. Scroll-snap does all positioning.
9
- * JS handles: auto-advance, programmatic API, ARIA, fallback nav.
9
+ * JS handles: auto-advance, programmatic API, ARIA, paddles + dots.
10
10
  *
11
11
  * On connect, wraps user children into a [data-swiper-track] scroll
12
12
  * container so pagination dots can sit below (outside overflow).
13
13
  *
14
- * Native ::scroll-marker / ::scroll-button in Chrome 135+.
15
- * JS-stamped button-ui fallback + dots in other browsers.
14
+ * Pagination dots and prev/next paddles are JS-stamped on every
15
+ * engine. Native ::scroll-marker / ::scroll-button are Chrome-135-only
16
+ * with no Safari / Firefox roadmap; re-evaluate when cross-engine.
16
17
  *
17
18
  * Events:
18
- * slide-change — { detail: { index, slide } }
19
+ * change — { detail: { index, slide } }
19
20
  * autoplay-pause — { detail: { reason } }
20
21
  * autoplay-resume
21
22
  */
@@ -180,7 +181,7 @@ class AdiaSwiper extends AdiaElement {
180
181
  if (index !== -1 && index !== this.#activeIndex) {
181
182
  this.#activeIndex = index;
182
183
  this.#updateFallbackDots();
183
- this.dispatchEvent(new CustomEvent('slide-change', {
184
+ this.dispatchEvent(new CustomEvent('change', {
184
185
  bubbles: true,
185
186
  detail: { index, slide: entry.target },
186
187
  }));
@@ -6,7 +6,7 @@ tag: swiper-ui
6
6
  component: Swiper
7
7
  category: layout
8
8
  version: 1
9
- description: CSS-first carousel with scroll-snap. Supports autoplay, loop, peek, and native scroll markers.
9
+ description: CSS-first carousel with scroll-snap. Supports autoplay, loop, and peek; JS-stamped pagination dots and paddles.
10
10
  props:
11
11
  autoplay:
12
12
  description: Enable auto-advance
@@ -49,8 +49,8 @@ events:
49
49
  description: "Fired on autoplay-pause."
50
50
  autoplay-resume:
51
51
  description: "Fired on autoplay-resume."
52
- slide-change:
53
- description: "Fired on slide-change."
52
+ change:
53
+ description: "Fired when the active slide changes. Detail: { index, slide }."
54
54
  slots:
55
55
  default:
56
56
  description: "Default slot — primary child content."
@@ -47,8 +47,15 @@
47
47
  "default": ""
48
48
  },
49
49
  "size": {
50
- "description": "Sizing scale (xs/sm/md/lg/xl).",
50
+ "description": "Sizing scale (full tier — xs / sm / md / lg / xl).",
51
51
  "type": "string",
52
+ "enum": [
53
+ "xs",
54
+ "sm",
55
+ "md",
56
+ "lg",
57
+ "xl"
58
+ ],
52
59
  "default": ""
53
60
  },
54
61
  "value": {
@@ -36,9 +36,16 @@ props:
36
36
  type: string
37
37
  default: ""
38
38
  size:
39
- description: "Sizing scale (xs/sm/md/lg/xl)."
39
+ description: Sizing scale (full tier — xs / sm / md / lg / xl).
40
40
  type: string
41
41
  default: ""
42
+ enum:
43
+ - xs
44
+ - sm
45
+ - md
46
+ - lg
47
+ - xl
48
+ reflect: true
42
49
  value:
43
50
  description: Form value (submitted as 'on' when checked)
44
51
  type: string
@@ -107,6 +107,7 @@ class AdiaTable extends AdiaElement {
107
107
  #bound = false;
108
108
  #lastSelectedIndex = -1; // for shift-click range select
109
109
  #openFilter = null; // column key of open filter dropdown
110
+ #filterFocusRaf = null;
110
111
 
111
112
  // ── Public API: columns ──
112
113
 
@@ -264,6 +265,10 @@ class AdiaTable extends AdiaElement {
264
265
  cancelAnimationFrame(this.#renderRaf);
265
266
  this.#renderRaf = null;
266
267
  }
268
+ if (this.#filterFocusRaf != null) {
269
+ cancelAnimationFrame(this.#filterFocusRaf);
270
+ this.#filterFocusRaf = null;
271
+ }
267
272
  }
268
273
 
269
274
  // ── <col-def> Parsing ──────────────────────────────────────────────────────
@@ -989,7 +994,10 @@ class AdiaTable extends AdiaElement {
989
994
  }
990
995
 
991
996
  // Auto-focus input
992
- requestAnimationFrame(() => {
997
+ if (this.#filterFocusRaf != null) cancelAnimationFrame(this.#filterFocusRaf);
998
+ this.#filterFocusRaf = requestAnimationFrame(() => {
999
+ this.#filterFocusRaf = null;
1000
+ if (!this.isConnected) return;
993
1001
  const input = dropdown.querySelector('input');
994
1002
  if (input) input.focus();
995
1003
  });
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://adiaui.dev/a2ui/v0_9/components/TableToolbar.json",
4
4
  "title": "TableToolbar",
5
- "description": "Header / companion bar for a sibling table-ui. Renders title + count badge, filter / sort / columns popovers, and a search input — all wired to the target table via an [for] id-ref. Modeled on chart-legend-ui's [for] binding pattern. Drop next to (or above) any table-ui to add the standard data-grid toolbar without re-implementing search, filter, sort, or column visibility.",
5
+ "description": "Header / companion bar for a sibling table-ui. Renders title + count badge, filter / sort / columns popovers, and a search input — all wired to the target table via an [for] id-ref. Modeled on chart-legend-ui's [for] binding pattern. Drop next to (or above) any table-ui to add the standard data-grid toolbar without re-implementing search, filter, sort, or column visibility. Filter rows auto-pick a primitive per column: ≤ 50 distinct values → multi- select (searchable above 12 options), id-like keys → free-text contains. The column descriptor's `filter` field overrides the auto-detect: `'select'` forces multi-select even on high-cardinality columns; `'text'` forces a contains input even on small enums.",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -13,11 +13,6 @@
13
13
  }
14
14
  ],
15
15
  "properties": {
16
- "columns": {
17
- "description": "Show the Columns visibility popover button.",
18
- "type": "boolean",
19
- "default": true
20
- },
21
16
  "component": {
22
17
  "const": "TableToolbar"
23
18
  },
@@ -26,30 +21,35 @@
26
21
  "type": "string",
27
22
  "default": ""
28
23
  },
29
- "filterable": {
30
- "description": "Show the Filter popover button.",
31
- "type": "boolean",
32
- "default": true
33
- },
34
24
  "for": {
35
25
  "description": "id-ref of the table-ui to control. Falls back to the first sibling table-ui within the same parent when omitted.",
36
26
  "type": "string",
37
27
  "default": ""
38
28
  },
39
- "placeholder": {
40
- "description": "Placeholder text for the search input.",
41
- "type": "string",
42
- "default": "Search..."
29
+ "noColumns": {
30
+ "description": "Hide the Columns visibility popover button. Columns control is shown by default; set to opt out.",
31
+ "type": "boolean",
32
+ "default": false
33
+ },
34
+ "noFilter": {
35
+ "description": "Hide the Filter popover button. Filter is shown by default; set to opt out.",
36
+ "type": "boolean",
37
+ "default": false
43
38
  },
44
- "searchable": {
45
- "description": "Show the search input.",
39
+ "noSearch": {
40
+ "description": "Hide the search input. Search is shown by default; set to opt out.",
46
41
  "type": "boolean",
47
- "default": true
42
+ "default": false
48
43
  },
49
- "sortable": {
50
- "description": "Show the Sort popover button.",
44
+ "noSort": {
45
+ "description": "Hide the Sort popover button. Sort is shown by default; set to opt out.",
51
46
  "type": "boolean",
52
- "default": true
47
+ "default": false
48
+ },
49
+ "placeholder": {
50
+ "description": "Placeholder text for the search input.",
51
+ "type": "string",
52
+ "default": "Search..."
53
53
  },
54
54
  "text": {
55
55
  "description": "Title text shown on the left. Alternative to slotted heading content.",
@@ -9,6 +9,7 @@
9
9
  /* ── Surface ── */
10
10
  --table-toolbar-bg: transparent;
11
11
  --table-toolbar-border: transparent;
12
+ --table-toolbar-border-width: 0;
12
13
  --table-toolbar-radius: var(--a-radius-lg);
13
14
 
14
15
  /* ── Title ── */
@@ -60,16 +61,23 @@
60
61
  align-items: center;
61
62
  gap: var(--table-toolbar-gap);
62
63
  padding: var(--table-toolbar-py) var(--table-toolbar-px);
64
+ background: var(--table-toolbar-bg);
65
+ border: var(--table-toolbar-border-width) solid var(--table-toolbar-border);
66
+ border-radius: var(--table-toolbar-radius);
63
67
  min-width: 0;
64
68
  }
65
69
 
66
- /* ═══════ Variant: card ═══════ */
67
-
68
- :scope[variant="card"] [data-toolbar] {
69
- background: var(--table-toolbar-bg);
70
- border: 1px solid var(--table-toolbar-border);
71
- border-radius: var(--table-toolbar-radius);
72
- padding: var(--a-space-3) var(--a-space-4);
70
+ /* ═══════ Variant: card ═══════
71
+ Variant only re-assigns surface tokens; base layout above consumes
72
+ them unchanged. Matches contract §"Variants override TOKENS, never
73
+ base styles". */
74
+
75
+ :scope[variant="card"] {
76
+ --table-toolbar-bg: var(--a-bg);
77
+ --table-toolbar-border: var(--a-border-subtle);
78
+ --table-toolbar-border-width: 1px;
79
+ --table-toolbar-py: var(--a-space-3);
80
+ --table-toolbar-px: var(--a-space-4);
73
81
  }
74
82
 
75
83
  /* ═══════ Title cluster ═══════ */
@@ -150,12 +158,16 @@
150
158
  gap: var(--a-space-1);
151
159
  }
152
160
 
161
+ /* The popover head + empty hint are <text-ui variant="kicker"|caption">,
162
+ so their typography (uppercase, tracking, muted color) comes from
163
+ text-ui's own variant rules — no rule needed here.
164
+ Sort rows are <menu-item-ui> — hover/focus/danger styling comes from
165
+ menu-item-ui's @scope block.
166
+ Filter and columns rows are <field-ui inline> — label/control geometry
167
+ comes from field-ui's @scope block. */
168
+
153
169
  [data-toolbar-popover] [data-popover-head] {
154
- font-size: var(--a-ui-tiny);
155
- text-transform: uppercase;
156
- letter-spacing: 0.06em;
157
- color: var(--a-fg-muted);
158
- padding: var(--a-space-1) var(--a-ui-px, var(--a-space-2));
170
+ padding: var(--a-space-1) var(--a-space-2);
159
171
  }
160
172
 
161
173
  [data-toolbar-popover] [data-popover-list] {
@@ -178,92 +190,21 @@
178
190
  padding-top: var(--a-space-1);
179
191
  }
180
192
 
181
- /* ── Filter rows ── */
182
-
183
- [data-toolbar-popover] [data-filter-row] {
184
- display: grid;
185
- grid-template-columns: 1fr minmax(8rem, 1.2fr);
186
- align-items: center;
187
- gap: var(--a-space-2);
193
+ [data-toolbar-popover] [data-filter-row],
194
+ [data-toolbar-popover] [data-columns-row] {
188
195
  padding: var(--a-space-1) var(--a-space-2);
189
- border-radius: var(--a-radius-sm);
190
- color: var(--a-fg-subtle);
191
- transition:
192
- background var(--a-duration-fast) var(--a-easing),
193
- color var(--a-duration-fast) var(--a-easing);
194
- }
195
-
196
- [data-toolbar-popover] [data-filter-row]:hover {
197
- background: var(--a-bg-hover);
198
- color: var(--a-fg-hover);
199
- }
200
-
201
- [data-toolbar-popover] [data-filter-label] {
202
- font-size: var(--a-ui-sm);
203
- color: inherit;
204
- white-space: nowrap;
205
- overflow: hidden;
206
- text-overflow: ellipsis;
207
196
  }
208
197
 
209
198
  [data-toolbar-popover] [data-filter-input] {
210
199
  min-width: 0;
211
200
  }
212
201
 
213
- /* ── Sort rows ── */
214
-
215
- [data-toolbar-popover] [data-sort-row] {
216
- all: unset;
217
- cursor: pointer;
218
- display: flex;
219
- align-items: center;
220
- justify-content: space-between;
221
- gap: var(--a-space-2);
222
- padding: var(--a-space-1) var(--a-space-2);
223
- font-size: var(--a-ui-sm);
224
- color: var(--a-fg-subtle);
225
- border-radius: var(--a-radius-sm);
226
- transition:
227
- background var(--a-duration-fast) var(--a-easing),
228
- color var(--a-duration-fast) var(--a-easing);
229
- }
230
-
231
- [data-toolbar-popover] [data-sort-row]:hover {
232
- background: var(--a-bg-hover);
233
- color: var(--a-fg-hover);
234
- }
235
-
202
+ /* Active sort row: lift the menu-item-ui's bg/fg via CSS-var override —
203
+ menu-item-ui exposes --menu-item-bg / --menu-item-fg / --menu-item-icon-fg
204
+ for exactly this. Stays inside the menu-item-ui token contract. */
236
205
  [data-toolbar-popover] [data-sort-row][data-active] {
237
- color: var(--a-fg);
238
- background: var(--a-bg-selected);
206
+ --menu-item-bg: var(--a-bg-selected);
207
+ --menu-item-fg: var(--a-fg);
208
+ --menu-item-icon-fg: var(--a-fg);
239
209
  font-weight: var(--a-ui-weight, var(--a-weight-medium));
240
210
  }
241
-
242
- [data-toolbar-popover] [data-sort-indicator] {
243
- color: var(--a-fg-muted);
244
- }
245
-
246
- [data-toolbar-popover] [data-sort-row][data-active] [data-sort-indicator] {
247
- color: var(--a-fg);
248
- }
249
-
250
- /* ── Columns rows ── */
251
-
252
- [data-toolbar-popover] [data-columns-row] {
253
- display: flex;
254
- align-items: center;
255
- gap: var(--a-space-2);
256
- padding: var(--a-space-1) var(--a-space-2);
257
- font-size: var(--a-ui-sm);
258
- color: var(--a-fg-subtle);
259
- border-radius: var(--a-radius-sm);
260
- cursor: pointer;
261
- transition:
262
- background var(--a-duration-fast) var(--a-easing),
263
- color var(--a-duration-fast) var(--a-easing);
264
- }
265
-
266
- [data-toolbar-popover] [data-columns-row]:hover {
267
- background: var(--a-bg-hover);
268
- color: var(--a-fg-hover);
269
- }