@adia-ai/web-components 0.6.38 → 0.6.40

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog — @adia-ai/web-components
2
2
 
3
+ ## [0.6.40] — 2026-05-26
4
+
5
+ ### Fixed — `index.js` barrel side-effect-imports `core/provider.js` (cold-start `<router-ui>` registration)
6
+
7
+ - **`packages/web-components/index.js`** — the barrel now side-effect-imports `core/provider.js`, which registers `<router-ui>` from the default cold-start path. Closes the FB-69-class regression where consumers importing the cluster-barrel hit "router-ui is not registered" when first navigating in a cold session. Files: `packages/web-components/index.js`.
8
+
9
+ ## [0.6.39] — 2026-05-26
10
+
11
+ ### Added — `<tour-ui>` spotlight-driven product tour primitive (Wave 5e last P1, #259)
12
+
13
+ - **`<tour-ui>`** — spotlight-driven product tour primitive. Closes the last Wave 5e P1. Component count 177 → 179 (+2 with tour + tour-step sub-primitive).
14
+
15
+ ### Fixed — substrate defensive slot-selector sweep + admin-entity-item icon size
16
+
17
+ - **Substrate sweep**: slot selectors changed from direct-child to descendant across remaining primitives. Defensive companion to the v0.6.38 `<list-item-ui>` fix — same drift class in adjacent components.
18
+ - **`<admin-entity-item>`**: icon size now matches `<nav-item-ui>`'s row icon (24px) instead of hardcoded 16px. Brings the canonical brand-chrome pattern into visual parity with the nav-item it sits next to.
19
+ - **`<list-item-ui>`**: now declares `slot="action"` — closes P2 from the v0.6.38 `dogfood:status` gate.
20
+
3
21
  ## [0.6.38] — 2026-05-26
4
22
 
5
23
  ### Added — Wave 5e cohort: 3 new primitives + slot-vocab-vs-css backlog closed
@@ -81,7 +81,7 @@
81
81
  stamped by date-range-picker.class.js — these rules override button-ui's defaults at
82
82
  equal specificity so the picker trigger reads as part of the
83
83
  input/picker family rather than a generic button. */
84
- :scope > [slot="trigger"] {
84
+ :scope [slot="trigger"] {
85
85
  min-width: var(--date-range-picker-trigger-min-width, var(--date-range-picker-trigger-min-width-default));
86
86
  min-height: var(--date-range-picker-trigger-height, var(--date-range-picker-trigger-height-default));
87
87
  padding: 0 var(--date-range-picker-trigger-px, var(--date-range-picker-trigger-px-default));
@@ -101,12 +101,12 @@
101
101
  border-color var(--date-range-picker-duration, var(--date-range-picker-duration-default)) var(--date-range-picker-easing, var(--date-range-picker-easing-default)),
102
102
  background var(--date-range-picker-duration, var(--date-range-picker-duration-default)) var(--date-range-picker-easing, var(--date-range-picker-easing-default));
103
103
  }
104
- :scope > [slot="trigger"]:hover {
104
+ :scope [slot="trigger"]:hover {
105
105
  border-color: var(--date-range-picker-trigger-border-hover, var(--date-range-picker-trigger-border-hover-default));
106
106
  background: var(--date-range-picker-trigger-bg-hover, var(--date-range-picker-trigger-bg-hover-default));
107
107
  }
108
108
  :scope:focus-visible { outline: none; }
109
- :scope:focus-visible > [slot="trigger"] {
109
+ :scope:focus-visible [slot="trigger"] {
110
110
  box-shadow: var(--date-range-picker-trigger-focus-ring, var(--date-range-picker-trigger-focus-ring-default));
111
111
  }
112
112
 
@@ -115,7 +115,7 @@
115
115
  opacity: 0.5;
116
116
  pointer-events: none;
117
117
  }
118
- :scope[readonly] > [slot="trigger"] {
118
+ :scope[readonly] [slot="trigger"] {
119
119
  cursor: default;
120
120
  }
121
121
  }
@@ -55,7 +55,7 @@
55
55
 
56
56
  /* Default trigger sizing — composes button-ui's surface; just
57
57
  stretches the min-width so "Jan 1, 2026 14:30" fits. */
58
- :scope > [slot="trigger"] {
58
+ :scope [slot="trigger"] {
59
59
  min-width: var(--datetime-picker-trigger-min-width, var(--datetime-picker-trigger-min-width-default));
60
60
  }
61
61
 
@@ -64,7 +64,7 @@
64
64
  opacity: 0.5;
65
65
  pointer-events: none;
66
66
  }
67
- :scope[readonly] > [slot="trigger"] {
67
+ :scope[readonly] [slot="trigger"] {
68
68
  cursor: default;
69
69
  }
70
70
  }
@@ -131,7 +131,7 @@ datetime-picker-ui [slot="popover"] > [data-time-pane] {
131
131
 
132
132
  /* Footer area (consumer-supplied [slot="footer"]) — spans all three
133
133
  columns under the panes. */
134
- datetime-picker-ui [slot="popover"] > [slot="footer"] {
134
+ datetime-picker-ui [slot="popover"] [slot="footer"] {
135
135
  grid-column: 1 / -1;
136
136
  display: flex;
137
137
  justify-content: flex-end;
@@ -57,15 +57,15 @@
57
57
  /* -- Stage area (where the slotted content lives) -- */
58
58
  /* Slotted children are anything that isn't the [slot="bar"]. They sit in
59
59
  the second flex row; default mode shows only the active slot. */
60
- :scope > [slot="on"],
61
- :scope > [slot="off"] {
60
+ :scope [slot="on"],
61
+ :scope [slot="off"] {
62
62
  box-sizing: border-box;
63
63
  width: 100%;
64
64
  padding: var(--demo-toggle-stage-padding, var(--demo-toggle-stage-padding-default));
65
65
  }
66
66
 
67
- :scope[data-state="on"] > [slot="off"] { display: none; }
68
- :scope[data-state="off"] > [slot="on"] { display: none; }
67
+ :scope[data-state="on"] [slot="off"] { display: none; }
68
+ :scope[data-state="off"] [slot="on"] { display: none; }
69
69
 
70
70
  /* Overlay mode — both slots stack on the same coordinates so toggling
71
71
  never reflows the surrounding layout. The inactive slot is
@@ -76,8 +76,8 @@
76
76
  /* The bar is row 1; the stage cell is row 2. The cell's children all
77
77
  claim the same grid-area so they overlap. */
78
78
  }
79
- :scope[data-mode="overlay"] > [slot="on"],
80
- :scope[data-mode="overlay"] > [slot="off"] {
79
+ :scope[data-mode="overlay"] [slot="on"],
80
+ :scope[data-mode="overlay"] [slot="off"] {
81
81
  display: block;
82
82
  }
83
83
  :scope[data-mode="overlay"] {
@@ -86,7 +86,7 @@
86
86
  via the second slot's positioning. */
87
87
  position: relative;
88
88
  }
89
- :scope[data-mode="overlay"] > [slot="on"] {
89
+ :scope[data-mode="overlay"] [slot="on"] {
90
90
  position: absolute;
91
91
  inset: 0;
92
92
  /* Bar height — the slot starts beneath the bar. We can't query the
@@ -98,17 +98,17 @@
98
98
  top: auto;
99
99
  height: auto;
100
100
  }
101
- :scope[data-mode="overlay"][data-state="on"] > [slot="off"] {
101
+ :scope[data-mode="overlay"][data-state="on"] [slot="off"] {
102
102
  visibility: hidden;
103
103
  }
104
- :scope[data-mode="overlay"][data-state="off"] > [slot="on"] {
104
+ :scope[data-mode="overlay"][data-state="off"] [slot="on"] {
105
105
  visibility: hidden;
106
106
  }
107
107
  /* Reset display:none branches above for overlay — already handled by
108
108
  visibility:hidden, but the default-mode display:none rules above
109
109
  would otherwise fight overlay. Override here. */
110
- :scope[data-mode="overlay"][data-state="on"] > [slot="off"],
111
- :scope[data-mode="overlay"][data-state="off"] > [slot="on"] {
110
+ :scope[data-mode="overlay"][data-state="on"] [slot="off"],
111
+ :scope[data-mode="overlay"][data-state="off"] [slot="on"] {
112
112
  display: block;
113
113
  }
114
114
 
@@ -144,14 +144,14 @@ feed-item-ui[data-closing] {
144
144
  transform: translateY(0.5rem);
145
145
  pointer-events: auto;
146
146
  }
147
- :scope > [slot="body"] {
147
+ :scope [slot="body"] {
148
148
  flex: 1;
149
149
  min-width: 0;
150
150
  display: flex;
151
151
  flex-direction: column;
152
152
  gap: 0.125rem;
153
153
  }
154
- :scope > [slot="body"] strong {
154
+ :scope [slot="body"] strong {
155
155
  font-weight: var(--a-weight-semibold);
156
156
  }
157
157
  :scope > [data-feed-close] {
@@ -42,7 +42,7 @@
42
42
  (~7-8 px) than non-field-ui siblings in a `<row-ui align="center">`.
43
43
  FB-54 (v0.6.32) — closes the trap for compact filter bars that
44
44
  mix field-ui with bare primitives. */
45
- :scope:has(> [slot="hint"], > [slot="error"]) {
45
+ :scope:has([slot="hint"], [slot="error"]) {
46
46
  row-gap: var(--field-gap, var(--field-gap-default));
47
47
  }
48
48
 
@@ -56,12 +56,12 @@
56
56
  }
57
57
 
58
58
  /* Stacked + no label, no trailing → drop the empty top row. */
59
- :scope:not([label]):not(:has(> [slot="trailing"])) {
59
+ :scope:not([label]):not(:has([slot="trailing"])) {
60
60
  grid-template-areas:
61
61
  "control"
62
62
  "message";
63
63
  }
64
- :scope:not([label]):not(:has(> [slot="trailing"])):has(> [slot="action"]) {
64
+ :scope:not([label]):not(:has([slot="trailing"])):has([slot="action"]) {
65
65
  grid-template-columns: minmax(0, 1fr) auto;
66
66
  grid-template-areas:
67
67
  "control action"
@@ -69,10 +69,10 @@
69
69
  }
70
70
 
71
71
  /* Hide the label cell when the label attr is absent. */
72
- :scope:not([label]) > [slot="label"] { display: none; }
72
+ :scope:not([label]) [slot="label"] { display: none; }
73
73
 
74
74
  /* ── Slot styling ── */
75
- :scope > [slot="label"] {
75
+ :scope [slot="label"] {
76
76
  grid-area: label;
77
77
  color: var(--field-label-color, var(--field-label-color-default));
78
78
  font-size: var(--field-label-size, var(--field-label-size-default));
@@ -80,12 +80,12 @@
80
80
  cursor: pointer;
81
81
  min-width: 0;
82
82
  }
83
- :scope > [slot="label"] > [data-field-required] {
83
+ :scope [slot="label"] > [data-field-required] {
84
84
  color: var(--field-required-color, var(--field-required-color-default));
85
85
  margin-inline-start: 0.15em;
86
86
  font-weight: var(--a-weight-bold);
87
87
  }
88
- :scope > [slot="trailing"] {
88
+ :scope [slot="trailing"] {
89
89
  grid-area: trailing;
90
90
  justify-self: end;
91
91
  color: var(--field-trailing-color, var(--field-trailing-color-default));
@@ -95,20 +95,20 @@
95
95
  grid-area: control;
96
96
  min-width: 0;
97
97
  }
98
- :scope > [slot="action"] {
98
+ :scope [slot="action"] {
99
99
  grid-area: action;
100
100
  justify-self: end;
101
101
  }
102
- :scope > [slot="hint"],
103
- :scope > [slot="error"] {
102
+ :scope [slot="hint"],
103
+ :scope [slot="error"] {
104
104
  grid-area: message;
105
105
  line-height: 1.3;
106
106
  }
107
- :scope > [slot="hint"] {
107
+ :scope [slot="hint"] {
108
108
  color: var(--field-hint-color, var(--field-hint-color-default));
109
109
  font-size: var(--field-hint-size, var(--field-hint-size-default));
110
110
  }
111
- :scope > [slot="error"] {
111
+ :scope [slot="error"] {
112
112
  color: var(--field-error-color, var(--field-error-color-default));
113
113
  font-size: var(--field-error-size, var(--field-error-size-default));
114
114
  font-weight: var(--a-weight-medium);
@@ -125,31 +125,31 @@
125
125
  "label control"
126
126
  ". message";
127
127
  }
128
- :scope[inline]:has(> [slot="trailing"]):not(:has(> [slot="action"])) {
128
+ :scope[inline]:has([slot="trailing"]):not(:has([slot="action"])) {
129
129
  grid-template-columns: minmax(var(--field-label-inline-min, var(--field-label-inline-min-default)), auto) auto minmax(0, 1fr);
130
130
  grid-template-areas:
131
131
  "label trailing control"
132
132
  ". . message";
133
133
  }
134
- :scope[inline]:not(:has(> [slot="trailing"])):has(> [slot="action"]) {
134
+ :scope[inline]:not(:has([slot="trailing"])):has([slot="action"]) {
135
135
  grid-template-columns: minmax(var(--field-label-inline-min, var(--field-label-inline-min-default)), auto) minmax(0, 1fr) auto;
136
136
  grid-template-areas:
137
137
  "label control action"
138
138
  ". message message";
139
139
  }
140
- :scope[inline]:has(> [slot="trailing"]):has(> [slot="action"]) {
140
+ :scope[inline]:has([slot="trailing"]):has([slot="action"]) {
141
141
  grid-template-columns: minmax(var(--field-label-inline-min, var(--field-label-inline-min-default)), auto) auto minmax(0, 1fr) auto;
142
142
  grid-template-areas:
143
143
  "label trailing control action"
144
144
  ". . message message";
145
145
  }
146
- :scope[inline]:not([label]):not(:has(> [slot="trailing"])):not(:has(> [slot="action"])) {
146
+ :scope[inline]:not([label]):not(:has([slot="trailing"])):not(:has([slot="action"])) {
147
147
  grid-template-columns: minmax(0, 1fr);
148
148
  grid-template-areas:
149
149
  "control"
150
150
  "message";
151
151
  }
152
- :scope[inline]:not([label]):not(:has(> [slot="trailing"])):has(> [slot="action"]) {
152
+ :scope[inline]:not([label]):not(:has([slot="trailing"])):has([slot="action"]) {
153
153
  grid-template-columns: minmax(0, 1fr) auto;
154
154
  grid-template-areas:
155
155
  "control action"
@@ -172,7 +172,7 @@
172
172
  /* align="end": label text is right-aligned within the label cell. */
173
173
  /* Useful in multi-field forms where labels share a visual column */
174
174
  /* and trailing-flush alignment aids scanability (right-to-input). */
175
- :scope[align="end"] > [slot="label"] {
175
+ :scope[align="end"] [slot="label"] {
176
176
  justify-self: end;
177
177
  text-align: end;
178
178
  }
@@ -39,7 +39,7 @@
39
39
  }
40
40
 
41
41
  /* Title slot */
42
- :scope > [slot="title"] {
42
+ :scope [slot="title"] {
43
43
  font-weight: 600;
44
44
  margin: 0;
45
45
  }
@@ -95,6 +95,7 @@ export { UIVisuallyHidden } from './visually-hidden/visually-hidden.js';
95
95
  export { UISkipNav } from './skip-nav/skip-nav.js';
96
96
  export { UIMark } from './mark/mark.js';
97
97
  export { UIInlineEdit } from './inline-edit/inline-edit.js';
98
+ export { UITour, UITourStep } from './tour/tour.js';
98
99
  export { UIToolbar, UIToolbarGroup } from './toolbar/toolbar.js';
99
100
  export { UINav } from './nav/nav.js';
100
101
  export { UINavGroup } from './nav-group/nav-group.js';
@@ -45,7 +45,7 @@
45
45
  `order` flips visual order back to [icon, text] without requiring
46
46
  us to splice nodes ahead of consumer-provided body content. Same
47
47
  pattern used by alert.css. */
48
- :scope > [slot="leading"] {
48
+ :scope [slot="leading"] {
49
49
  flex-shrink: 0;
50
50
  align-self: center;
51
51
  color: var(--inline-message-icon-fg, var(--inline-message-icon-fg-default));
@@ -57,6 +57,9 @@
57
57
  "description": {
58
58
  "description": "Override slot for richer description markup than the plain [description] attribute string (inline links, code spans, multiple lines). Renders beneath the primary text at body-subtle typography."
59
59
  },
60
+ "action": {
61
+ "description": "Trailing action affordance on the row (typically a `<button-ui>`). Promotes the row's grid from 2-column (icon | content) to 3-column (icon | content | action), right-aligned + vertically centered across both content rows. Used by `<onboarding-checklist-ui>` item rows and any consumer that needs an end-aligned action button on a list-item."
62
+ },
60
63
  "icon": {
61
64
  "description": "Override the [icon] glyph with a custom slotted element (e.g. a colored <icon-ui>, an image, or an avatar-ui). Mutually exclusive with the [icon] attribute — slot child wins if both are present."
62
65
  }
@@ -40,6 +40,13 @@ slots:
40
40
  Override slot for richer description markup than the plain [description]
41
41
  attribute string (inline links, code spans, multiple lines). Renders
42
42
  beneath the primary text at body-subtle typography.
43
+ action:
44
+ description: >-
45
+ Trailing action affordance on the row (typically a `<button-ui>`).
46
+ Promotes the row's grid from 2-column (icon | content) to 3-column
47
+ (icon | content | action), right-aligned + vertically centered across
48
+ both content rows. Used by `<onboarding-checklist-ui>` item rows and
49
+ any consumer that needs an end-aligned action button on a list-item.
43
50
 
44
51
  keywords:
45
52
  - list-item
@@ -71,13 +71,13 @@
71
71
 
72
72
  /* Sticky slots — sit at the top/bottom of the scroll container so they
73
73
  stay visible while the window scrolls. */
74
- :scope > [slot="before"] {
74
+ :scope [slot="before"] {
75
75
  position: sticky;
76
76
  top: 0;
77
77
  z-index: 1;
78
78
  background: var(--list-window-bg, var(--list-window-bg-default));
79
79
  }
80
- :scope > [slot="after"] {
80
+ :scope [slot="after"] {
81
81
  position: sticky;
82
82
  bottom: 0;
83
83
  z-index: 1;
@@ -103,11 +103,11 @@
103
103
  :scope[empty] > [data-window] {
104
104
  display: none;
105
105
  }
106
- :scope[empty] > [slot="empty"] {
106
+ :scope[empty] [slot="empty"] {
107
107
  display: block;
108
108
  }
109
109
 
110
- :scope:not([empty]) > [slot="empty"] {
110
+ :scope:not([empty]) [slot="empty"] {
111
111
  display: none;
112
112
  }
113
113
 
@@ -40,10 +40,10 @@
40
40
  :scope[size="lg"] { --modal-width-default: min(48rem, 90vw); }
41
41
 
42
42
  /* ═══════ Closed ═══════ */
43
- :scope > [slot="dialog"]:not([open]) { display: none; }
43
+ :scope [slot="dialog"]:not([open]) { display: none; }
44
44
 
45
45
  /* ═══════ Full-viewport dialog shell ═══════ */
46
- :scope > [slot="dialog"][open] {
46
+ :scope [slot="dialog"][open] {
47
47
  box-sizing: border-box;
48
48
  position: fixed;
49
49
  inset: 0;
@@ -62,16 +62,16 @@
62
62
  }
63
63
 
64
64
  /* ═══════ Backdrop ═══════ */
65
- :scope > [slot="dialog"]::backdrop {
65
+ :scope [slot="dialog"]::backdrop {
66
66
  background: var(--modal-backdrop, var(--modal-backdrop-default));
67
67
  opacity: 0;
68
68
  transition: opacity var(--modal-duration, var(--modal-duration-default)) var(--modal-easing, var(--modal-easing-default));
69
69
  }
70
- :scope > [slot="dialog"][data-open]::backdrop { opacity: 1; }
71
- :scope > [slot="dialog"][data-closing]::backdrop { opacity: 0; }
70
+ :scope [slot="dialog"][data-open]::backdrop { opacity: 1; }
71
+ :scope [slot="dialog"][data-closing]::backdrop { opacity: 0; }
72
72
 
73
73
  /* ═══════ Content panel ═══════ */
74
- :scope > [slot="dialog"] > [slot="panel"] {
74
+ :scope [slot="dialog"] [slot="panel"] {
75
75
  box-sizing: border-box;
76
76
  display: flex;
77
77
  flex-direction: column;
@@ -89,7 +89,7 @@
89
89
  }
90
90
 
91
91
  /* ═══════ Open animation ═══════ */
92
- :scope > [slot="dialog"][data-open] > [slot="panel"] {
92
+ :scope [slot="dialog"][data-open] [slot="panel"] {
93
93
  transition: transform var(--modal-duration, var(--modal-duration-default)) var(--modal-easing, var(--modal-easing-default)),
94
94
  opacity var(--modal-duration, var(--modal-duration-default)) var(--modal-easing, var(--modal-easing-default));
95
95
  transform: scale(1);
@@ -97,7 +97,7 @@
97
97
  }
98
98
 
99
99
  /* ═══════ Close animation ═══════ */
100
- :scope > [slot="dialog"][data-closing] > [slot="panel"] {
100
+ :scope [slot="dialog"][data-closing] [slot="panel"] {
101
101
  transition: transform var(--modal-duration, var(--modal-duration-default)) var(--modal-easing, var(--modal-easing-default)),
102
102
  opacity var(--modal-duration, var(--modal-duration-default)) var(--modal-easing, var(--modal-easing-default));
103
103
  transform: scale(0.95);
@@ -21,10 +21,10 @@ option-card-ui[checked]::before {
21
21
  var(--option-card-radio-fill, var(--option-card-radio-fill-default)) 30% 100%
22
22
  );
23
23
  }
24
- option-card-ui[checked] > [slot="heading"] {
24
+ option-card-ui[checked] [slot="heading"] {
25
25
  color: var(--option-card-heading-color-checked, var(--option-card-heading-color-checked-default));
26
26
  }
27
- option-card-ui[checked] > [slot="icon"] {
27
+ option-card-ui[checked] [slot="icon"] {
28
28
  color: var(--option-card-icon-color-checked, var(--option-card-icon-color-checked-default));
29
29
  }
30
30
 
@@ -107,13 +107,13 @@ option-card-ui[checked] > [slot="icon"] {
107
107
 
108
108
  /* When an icon slot is present, insert a third column for it
109
109
  between indicator and heading. */
110
- :scope:has(> [slot="icon"]) {
110
+ :scope:has([slot="icon"]) {
111
111
  grid-template-columns: auto auto minmax(0, 1fr);
112
112
  grid-template-areas:
113
113
  "indicator icon heading"
114
114
  "indicator icon description";
115
115
  }
116
- :scope > [slot="icon"] {
116
+ :scope [slot="icon"] {
117
117
  grid-area: icon;
118
118
  align-self: start;
119
119
  color: var(--option-card-icon-color, var(--option-card-icon-color-default));
@@ -139,14 +139,14 @@ option-card-ui[checked] > [slot="icon"] {
139
139
  }
140
140
 
141
141
  /* ── Slots — heading + description ── */
142
- :scope > [slot="heading"] {
142
+ :scope [slot="heading"] {
143
143
  grid-area: heading;
144
144
  color: var(--option-card-heading-color, var(--option-card-heading-color-default));
145
145
  font-weight: var(--option-card-heading-weight, var(--option-card-heading-weight-default));
146
146
  font-size: var(--option-card-heading-size, var(--option-card-heading-size-default));
147
147
  transition: color var(--option-card-duration, var(--option-card-duration-default)) var(--option-card-easing, var(--option-card-easing-default));
148
148
  }
149
- :scope > [slot="description"] {
149
+ :scope [slot="description"] {
150
150
  grid-area: description;
151
151
  color: var(--option-card-desc-color, var(--option-card-desc-color-default));
152
152
  font-size: var(--option-card-desc-size, var(--option-card-desc-size-default));
@@ -162,7 +162,7 @@ option-card-ui[checked] > [slot="icon"] {
162
162
  margin-block-start: var(--a-space-3);
163
163
  display: none;
164
164
  }
165
- :scope:has(> [slot="icon"]) > :not([slot]) {
165
+ :scope:has([slot="icon"]) > :not([slot]) {
166
166
  grid-column: 3 / -1;
167
167
  }
168
168
  /* hover + [checked] state rules moved outside @scope — see Safari 17.x bug note at top.
@@ -184,7 +184,7 @@ option-card-ui[checked] > [slot="icon"] {
184
184
  padding: var(--a-space-4);
185
185
  align-items: start;
186
186
  }
187
- :scope[layout="tile"] > [slot="icon"] {
187
+ :scope[layout="tile"] [slot="icon"] {
188
188
  grid-area: icon;
189
189
  justify-self: start;
190
190
  align-self: start;
@@ -196,7 +196,7 @@ option-card-ui[checked] > [slot="icon"] {
196
196
  justify-self: end;
197
197
  margin-block-start: 0;
198
198
  }
199
- :scope[layout="tile"] > [slot="heading"] {
199
+ :scope[layout="tile"] [slot="heading"] {
200
200
  margin-block-start: var(--a-space-2);
201
201
  }
202
202
  :scope[layout="tile"] > :not([slot]) {
@@ -160,9 +160,9 @@
160
160
  }
161
161
 
162
162
  /* Caret color is held against button-ui's stronger cascade by chaining
163
- :scope > [slot="trigger"] > [slot="caret"] — matches at the same
163
+ :scope [slot="trigger"] [slot="caret"] — matches at the same
164
164
  specificity as button-ui's own slot rules without !important. */
165
- :scope > [slot="trigger"] > [slot="caret"] {
165
+ :scope [slot="trigger"] [slot="caret"] {
166
166
  color: var(--select-caret-fg, var(--select-caret-fg-default));
167
167
  flex-shrink: 0;
168
168
  }
@@ -179,7 +179,7 @@
179
179
  background: var(--select-ghost-bg-hover, var(--select-ghost-bg-hover-default));
180
180
  color: var(--select-fg, var(--select-fg-default));
181
181
  }
182
- :scope[variant="ghost"] > [slot="trigger"]:hover > [slot="caret"] {
182
+ :scope[variant="ghost"] [slot="trigger"]:hover [slot="caret"] {
183
183
  color: var(--select-fg-subtle, var(--select-fg-subtle-default));
184
184
  }
185
185
 
@@ -188,7 +188,7 @@
188
188
  active. Layout switches from inline-text trigger to wrap-flex chip row.
189
189
  Tag-ui chips inside [data-chips] inherit the host's tag-ui token set;
190
190
  the +more pill is a CSS-only button styled to match. */
191
- :scope[data-multi-chips] > [slot="trigger"] {
191
+ :scope[data-multi-chips] [slot="trigger"] {
192
192
  flex-wrap: wrap;
193
193
  align-items: center;
194
194
  gap: var(--a-space-1);
@@ -381,7 +381,7 @@ select-ui[divider] [role="group"] + [role="group"] {
381
381
 
382
382
  /* ── Hint (§184, v0.5.5, FEEDBACK-08 §7) ──
383
383
  Caption beneath the trigger; wired to aria-describedby on the host. */
384
- select-ui > [slot="hint"] {
384
+ select-ui [slot="hint"] {
385
385
  display: block;
386
386
  margin-top: var(--select-hint-mt, var(--a-space-1));
387
387
  font-size: var(--select-hint-size, var(--a-ui-xs));
@@ -232,9 +232,9 @@ agent-reasoning-ui timeline-ui:not([orientation="horizontal"]),
232
232
 
233
233
  /* ═══════ Icon mode — icon-ui in [slot="icon"] replaces the dot ═══════ */
234
234
 
235
- :scope:has(> [slot="icon"])::before { display: none; }
235
+ :scope:has([slot="icon"])::before { display: none; }
236
236
 
237
- :scope > [slot="icon"] {
237
+ :scope [slot="icon"] {
238
238
  grid-column: marker;
239
239
  grid-row: 1;
240
240
  justify-self: center;
@@ -253,19 +253,19 @@ agent-reasoning-ui timeline-ui:not([orientation="horizontal"]),
253
253
  box-sizing: border-box;
254
254
  }
255
255
 
256
- :scope[variant="success"] > [slot="icon"] { background: var(--timeline-item-icon-bg-success); color: var(--timeline-item-icon-fg-success); }
257
- :scope[variant="accent"] > [slot="icon"] { background: var(--timeline-item-icon-bg-accent); color: var(--timeline-item-icon-fg-accent); }
258
- :scope[variant="warning"] > [slot="icon"] { background: var(--timeline-item-icon-bg-warning); color: var(--timeline-item-icon-fg-warning); }
259
- :scope[variant="danger"] > [slot="icon"] { background: var(--timeline-item-icon-bg-danger); color: var(--timeline-item-icon-fg-danger); }
256
+ :scope[variant="success"] [slot="icon"] { background: var(--timeline-item-icon-bg-success); color: var(--timeline-item-icon-fg-success); }
257
+ :scope[variant="accent"] [slot="icon"] { background: var(--timeline-item-icon-bg-accent); color: var(--timeline-item-icon-fg-accent); }
258
+ :scope[variant="warning"] [slot="icon"] { background: var(--timeline-item-icon-bg-warning); color: var(--timeline-item-icon-fg-warning); }
259
+ :scope[variant="danger"] [slot="icon"] { background: var(--timeline-item-icon-bg-danger); color: var(--timeline-item-icon-fg-danger); }
260
260
 
261
261
  /* Push connector line past the icon circle */
262
- :scope:has(> [slot="icon"])::after {
262
+ :scope:has([slot="icon"])::after {
263
263
  top: calc((1.4em + var(--timeline-item-icon-size)) / 2 + 2px);
264
264
  }
265
265
 
266
266
  /* ═══════ Content slots ═══════ */
267
267
 
268
- :scope > [slot="label"] {
268
+ :scope [slot="label"] {
269
269
  grid-column: content;
270
270
  grid-row: 1;
271
271
  font-weight: var(--timeline-item-label-weight);
@@ -276,11 +276,11 @@ agent-reasoning-ui timeline-ui:not([orientation="horizontal"]),
276
276
  min-width: 0;
277
277
  }
278
278
 
279
- :scope[status="completed"] > [slot="label"] {
279
+ :scope[status="completed"] [slot="label"] {
280
280
  color: var(--timeline-item-label-fg-muted);
281
281
  }
282
282
 
283
- :scope > [slot="description"] {
283
+ :scope [slot="description"] {
284
284
  grid-column: content / -1;
285
285
  grid-row: 2;
286
286
  color: var(--timeline-item-desc-fg);
@@ -289,7 +289,7 @@ agent-reasoning-ui timeline-ui:not([orientation="horizontal"]),
289
289
  margin-top: var(--a-space-0-5);
290
290
  }
291
291
 
292
- :scope > [slot="time"] {
292
+ :scope [slot="time"] {
293
293
  grid-column: aside;
294
294
  grid-row: 1;
295
295
  color: var(--timeline-item-time-fg);
@@ -307,7 +307,7 @@ agent-reasoning-ui timeline-ui:not([orientation="horizontal"]),
307
307
 
308
308
  /* ═══════ Outcomes — nested sub-rows ═══════ */
309
309
 
310
- :scope > [slot="outcomes"] {
310
+ :scope [slot="outcomes"] {
311
311
  grid-column: content / -1;
312
312
  grid-row: 3;
313
313
  margin: var(--a-space-1) 0 0 0;
@@ -322,16 +322,16 @@ agent-reasoning-ui timeline-ui:not([orientation="horizontal"]),
322
322
  animation: tl-fade var(--timeline-item-duration) var(--timeline-item-easing);
323
323
  }
324
324
 
325
- :scope > [slot="outcomes"][hidden] { display: none; }
325
+ :scope [slot="outcomes"][hidden] { display: none; }
326
326
 
327
- :scope > [slot="outcomes"] > li {
327
+ :scope [slot="outcomes"] > li {
328
328
  position: relative;
329
329
  padding-left: var(--timeline-item-outcome-indent);
330
330
  overflow-wrap: break-word;
331
331
  min-width: 0;
332
332
  }
333
333
 
334
- :scope > [slot="outcomes"] > li::before {
334
+ :scope [slot="outcomes"] > li::before {
335
335
  content: '';
336
336
  position: absolute;
337
337
  left: calc((var(--timeline-item-outcome-indent) - var(--timeline-item-subdot-size)) / 2);
@@ -373,7 +373,7 @@ agent-reasoning-ui timeline-ui:not([orientation="horizontal"]),
373
373
  }
374
374
 
375
375
  /* Reserve room so the time isn't overlapped by the chevron */
376
- :scope:has(> [data-timeline-toggle]) > [slot="time"] {
376
+ :scope:has(> [data-timeline-toggle]) [slot="time"] {
377
377
  margin-inline-end: var(--timeline-item-toggle-time-margin);
378
378
  }
379
379
 
@@ -416,9 +416,9 @@ timeline-ui[orientation="horizontal"] > timeline-item-ui::after {
416
416
  height: var(--timeline-line-size, var(--timeline-line-size-default));
417
417
  }
418
418
 
419
- timeline-ui[orientation="horizontal"] > timeline-item-ui > [slot="label"],
420
- timeline-ui[orientation="horizontal"] > timeline-item-ui > [slot="description"],
421
- timeline-ui[orientation="horizontal"] > timeline-item-ui > [slot="time"] {
419
+ timeline-ui[orientation="horizontal"] > timeline-item-ui [slot="label"],
420
+ timeline-ui[orientation="horizontal"] > timeline-item-ui [slot="description"],
421
+ timeline-ui[orientation="horizontal"] > timeline-item-ui [slot="time"] {
422
422
  grid-column: auto;
423
423
  grid-row: auto;
424
424
  margin-top: var(--a-space-1);