@adia-ai/web-components 0.6.37 → 0.6.39

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 (73) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/components/accordion/accordion-item.a2ui.json +3 -0
  3. package/components/accordion/accordion-item.yaml +5 -0
  4. package/components/action-list/action-item.a2ui.json +5 -1
  5. package/components/action-list/action-item.yaml +7 -0
  6. package/components/card/card.a2ui.json +17 -1
  7. package/components/card/card.yaml +24 -1
  8. package/components/date-range-picker/date-range-picker.css +4 -4
  9. package/components/datetime-picker/datetime-picker.css +3 -3
  10. package/components/demo-toggle/demo-toggle.css +11 -11
  11. package/components/empty-state/empty-state.a2ui.json +9 -0
  12. package/components/empty-state/empty-state.yaml +15 -0
  13. package/components/feed/feed-item.a2ui.json +5 -0
  14. package/components/feed/feed-item.yaml +10 -0
  15. package/components/feed/feed.css +2 -2
  16. package/components/field/field.a2ui.json +6 -0
  17. package/components/field/field.css +18 -18
  18. package/components/field/field.yaml +10 -0
  19. package/components/heatmap/heatmap.css +1 -1
  20. package/components/index.js +3 -0
  21. package/components/inline-edit/inline-edit.a2ui.json +159 -0
  22. package/components/inline-edit/inline-edit.class.js +184 -0
  23. package/components/inline-edit/inline-edit.css +62 -0
  24. package/components/inline-edit/inline-edit.d.ts +52 -0
  25. package/components/inline-edit/inline-edit.js +12 -0
  26. package/components/inline-edit/inline-edit.yaml +125 -0
  27. package/components/inline-message/inline-message.css +1 -1
  28. package/components/list/list-item.a2ui.json +11 -1
  29. package/components/list/list-item.yaml +19 -0
  30. package/components/list/list.css +36 -6
  31. package/components/list-window/list-window.css +4 -4
  32. package/components/mark/mark.a2ui.json +109 -0
  33. package/components/mark/mark.class.js +22 -0
  34. package/components/mark/mark.css +39 -0
  35. package/components/mark/mark.d.ts +27 -0
  36. package/components/mark/mark.js +12 -0
  37. package/components/mark/mark.yaml +87 -0
  38. package/components/modal/modal.a2ui.json +9 -0
  39. package/components/modal/modal.css +8 -8
  40. package/components/modal/modal.yaml +14 -0
  41. package/components/nav-group/nav-group.a2ui.json +3 -0
  42. package/components/nav-group/nav-group.yaml +5 -0
  43. package/components/nav-item/nav-item.a2ui.json +3 -0
  44. package/components/nav-item/nav-item.yaml +5 -0
  45. package/components/option-card/option-card.css +9 -9
  46. package/components/segmented/segmented.class.js +10 -2
  47. package/components/select/select.a2ui.json +3 -0
  48. package/components/select/select.css +5 -5
  49. package/components/select/select.yaml +5 -0
  50. package/components/slider/slider.a2ui.json +6 -0
  51. package/components/slider/slider.yaml +10 -0
  52. package/components/stat/stat.css +18 -14
  53. package/components/stepper/stepper-item.a2ui.json +3 -0
  54. package/components/stepper/stepper-item.yaml +5 -0
  55. package/components/timeline/timeline-item.a2ui.json +8 -1
  56. package/components/timeline/timeline-item.yaml +12 -0
  57. package/components/timeline/timeline.css +19 -19
  58. package/components/tour/tour-step.a2ui.json +92 -0
  59. package/components/tour/tour-step.yaml +84 -0
  60. package/components/tour/tour.a2ui.json +172 -0
  61. package/components/tour/tour.class.js +309 -0
  62. package/components/tour/tour.css +135 -0
  63. package/components/tour/tour.d.ts +78 -0
  64. package/components/tour/tour.js +13 -0
  65. package/components/tour/tour.yaml +161 -0
  66. package/components/tree/tree-item.a2ui.json +5 -1
  67. package/components/tree/tree-item.yaml +7 -0
  68. package/components/tree/tree.a2ui.json +3 -0
  69. package/components/tree/tree.yaml +5 -0
  70. package/dist/web-components.min.css +1 -1
  71. package/dist/web-components.min.js +88 -74
  72. package/package.json +1 -1
  73. package/styles/components.css +3 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # Changelog — @adia-ai/web-components
2
2
 
3
+ ## [0.6.39] — 2026-05-26
4
+
5
+ ### Added — `<tour-ui>` spotlight-driven product tour primitive (Wave 5e last P1, #259)
6
+
7
+ - **`<tour-ui>`** — spotlight-driven product tour primitive. Closes the last Wave 5e P1. Component count 177 → 179 (+2 with tour + tour-step sub-primitive).
8
+
9
+ ### Fixed — substrate defensive slot-selector sweep + admin-entity-item icon size
10
+
11
+ - **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.
12
+ - **`<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.
13
+ - **`<list-item-ui>`**: now declares `slot="action"` — closes P2 from the v0.6.38 `dogfood:status` gate.
14
+
15
+ ## [0.6.38] — 2026-05-26
16
+
17
+ ### Added — Wave 5e cohort: 3 new primitives + slot-vocab-vs-css backlog closed
18
+
19
+ - **`<mark-ui>`** — inline highlighted text primitive (#357)
20
+ - **`<inline-edit-ui>`** — click-to-edit text in place (#212)
21
+ - **Notification deep-link demo + Mark All Read verify** for `<feed-ui>` (#344/#343)
22
+
23
+ ### Fixed — substrate polish across the v0.6.38 window
24
+
25
+ - **`<list-item-ui>`**: slot selectors changed from direct-child to descendant — description row now lands on row 2 as intended
26
+ - **`<segmented-ui>`**: stale indicator stripping — duplicate pills on re-render eliminated
27
+ - **`<stat-ui>`**: chart slot bottom-aligns to value baseline; aspect 4:3
28
+ - **`<toolbar-ui>`** mixed-controls demo: `<segment-ui>` (not `<button-ui>`) inside `<segmented-ui>`
29
+
30
+ ### Maintenance — slot-vocab-vs-css audit reached 0 critical findings
31
+
32
+ - `audit-slot-vocab-vs-css` substrate backlog closed → gate now enforced. Multi-yaml + @scope-aware pairing landed in the audit script.
33
+ - 5 Wave 5a/b/c/d gap-analysis flips landed (substrate-verified as covered; no new code).
34
+
3
35
  ## [0.6.37] — 2026-05-25
4
36
 
5
37
  ### Changed — `--a-warning-bg` redirected from `-strong` to `-20-tint` (bright caution-tape amber, scheme-independent)
@@ -63,6 +63,9 @@
63
63
  "action": {
64
64
  "description": "§206 (v0.5.7): action buttons inside a custom header (e.g. Copy /\nDownload / settings). Children placed at `[slot=\"action\"]` (or\n`[slot=\"actions\"]`, or marked `[data-no-toggle]`) are excluded from\nthe toggle-on-click cascade — clicking them fires their own handler\nwithout also toggling the section."
65
65
  },
66
+ "body": {
67
+ "description": "The section's collapsible content. Renders below the header; hidden when `[open]` is unset. Author-fills with prose, lists, embedded forms, or any rich markup the panel needs."
68
+ },
66
69
  "header": {
67
70
  "description": "Custom header content. By default `[text]` renders as a plain header\nlabel, but a `[slot=\"header\"]` override lets consumers author rich\nheaders (icon + title + action buttons + caret)."
68
71
  }
@@ -39,6 +39,11 @@ slots:
39
39
  `[slot="actions"]`, or marked `[data-no-toggle]`) are excluded from
40
40
  the toggle-on-click cascade — clicking them fires their own handler
41
41
  without also toggling the section.
42
+ body:
43
+ description: >-
44
+ The section's collapsible content. Renders below the header; hidden
45
+ when `[open]` is unset. Author-fills with prose, lists, embedded
46
+ forms, or any rich markup the panel needs.
42
47
  events:
43
48
  toggle:
44
49
  description: Fired when the section opens or closes.
@@ -62,7 +62,11 @@
62
62
  "MenuItem",
63
63
  "Button"
64
64
  ],
65
- "slots": {},
65
+ "slots": {
66
+ "icon": {
67
+ "description": "Override the [icon] glyph with a custom slotted element (custom icon-ui, image, avatar). Mutually exclusive with the [icon] attribute — slot child wins."
68
+ }
69
+ },
66
70
  "states": [],
67
71
  "status": "stable",
68
72
  "synonyms": {
@@ -37,6 +37,13 @@ props:
37
37
  type: boolean
38
38
  default: false
39
39
 
40
+ slots:
41
+ icon:
42
+ description: >-
43
+ Override the [icon] glyph with a custom slotted element (custom
44
+ icon-ui, image, avatar). Mutually exclusive with the [icon]
45
+ attribute — slot child wins.
46
+
40
47
  keywords:
41
48
  - action-item
42
49
  - command-row
@@ -113,7 +113,23 @@
113
113
  "alert",
114
114
  "skeleton"
115
115
  ],
116
- "slots": {},
116
+ "slots": {
117
+ "description": {
118
+ "description": "Optional descriptive text beneath the heading. Renders in the header slot at body-subtle typography. Use for short metadata lines (timestamp, author, status sentence)."
119
+ },
120
+ "action": {
121
+ "description": "Trailing action cluster in the header (e.g. icon-buttons, menu trigger, more-options). Aligns to the header's flex-end edge."
122
+ },
123
+ "action-leading": {
124
+ "description": "Leading action cluster in the header (e.g. back button, switcher, breadcrumb-context). Aligns to the header's flex-start edge, before the icon/heading column."
125
+ },
126
+ "heading": {
127
+ "description": "Card title. Renders in the header slot with title typography. Typically a short noun phrase or document/object name."
128
+ },
129
+ "icon": {
130
+ "description": "Optional leading icon for the card header (status / brand / type marker). Renders next to the heading. Use `<icon-ui name=\"…\">` or any inline icon element."
131
+ }
132
+ },
117
133
  "states": [
118
134
  {
119
135
  "description": "Default, ready for interaction.",
@@ -58,7 +58,30 @@ props:
58
58
  - soft
59
59
  - primary
60
60
  events: {}
61
- slots: {}
61
+ slots:
62
+ icon:
63
+ description: >-
64
+ Optional leading icon for the card header (status / brand / type
65
+ marker). Renders next to the heading. Use `<icon-ui name="…">` or
66
+ any inline icon element.
67
+ heading:
68
+ description: >-
69
+ Card title. Renders in the header slot with title typography.
70
+ Typically a short noun phrase or document/object name.
71
+ description:
72
+ description: >-
73
+ Optional descriptive text beneath the heading. Renders in the
74
+ header slot at body-subtle typography. Use for short metadata
75
+ lines (timestamp, author, status sentence).
76
+ action:
77
+ description: >-
78
+ Trailing action cluster in the header (e.g. icon-buttons, menu
79
+ trigger, more-options). Aligns to the header's flex-end edge.
80
+ action-leading:
81
+ description: >-
82
+ Leading action cluster in the header (e.g. back button, switcher,
83
+ breadcrumb-context). Aligns to the header's flex-start edge,
84
+ before the icon/heading column.
62
85
  states:
63
86
  - name: idle
64
87
  description: Default, ready for interaction.
@@ -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
 
@@ -85,8 +85,17 @@
85
85
  "select"
86
86
  ],
87
87
  "slots": {
88
+ "description": {
89
+ "description": "Override slot for the description text. Use for multi-paragraph or richly-marked-up explanatory copy."
90
+ },
88
91
  "action": {
89
92
  "description": "User-provided action element (e.g. button) displayed below the description"
93
+ },
94
+ "heading": {
95
+ "description": "Override slot for the heading text. Use when richer markup than the plain [heading] attribute is needed (line breaks, inline links, bold emphasis)."
96
+ },
97
+ "icon": {
98
+ "description": "Override slot for the [icon] glyph. Use when the attribute-driven Phosphor icon isn't enough (e.g., custom SVG, illustration, or a styled icon-ui with non-default weight). Mutually exclusive with [icon]."
90
99
  }
91
100
  },
92
101
  "states": [
@@ -53,6 +53,21 @@ props:
53
53
  reflect: true
54
54
  events: {}
55
55
  slots:
56
+ icon:
57
+ description: >-
58
+ Override slot for the [icon] glyph. Use when the attribute-driven
59
+ Phosphor icon isn't enough (e.g., custom SVG, illustration, or
60
+ a styled icon-ui with non-default weight). Mutually exclusive
61
+ with [icon].
62
+ heading:
63
+ description: >-
64
+ Override slot for the heading text. Use when richer markup than
65
+ the plain [heading] attribute is needed (line breaks, inline
66
+ links, bold emphasis).
67
+ description:
68
+ description: >-
69
+ Override slot for the description text. Use for multi-paragraph
70
+ or richly-marked-up explanatory copy.
56
71
  action:
57
72
  description: User-provided action element (e.g. button) displayed below the description
58
73
  states:
@@ -13,6 +13,11 @@
13
13
  }
14
14
  ],
15
15
  "properties": {
16
+ "action": {
17
+ "description": "Label of an inline action button (the \"deep-link\" / \"undo\" pattern).\nPair with `onAction` callback in `UIFeed.post()` — click invokes the\ncallback then auto-dismisses. Empty string renders no action button.\n",
18
+ "type": "string",
19
+ "default": ""
20
+ },
16
21
  "component": {
17
22
  "const": "FeedItem"
18
23
  },
@@ -42,6 +42,14 @@ props:
42
42
  description: Render an x close button (default true for sticky, false for auto-fade)
43
43
  type: boolean
44
44
  default: false
45
+ action:
46
+ description: |
47
+ Label of an inline action button (the "deep-link" / "undo" pattern).
48
+ Pair with `onAction` callback in `UIFeed.post()` — click invokes the
49
+ callback then auto-dismisses. Empty string renders no action button.
50
+ type: string
51
+ default: ""
52
+ reflect: true
45
53
  events:
46
54
  close:
47
55
  description: Fired after the item finishes its exit animation
@@ -74,3 +82,5 @@ a2ui:
74
82
  reason: 'Imperative ownership.'
75
83
  - rule: 'Different from <alert-ui> (inline persistent) and <toast-ui> (standalone ephemeral); feed-item is feed-scoped.'
76
84
  reason: 'Surface boundary.'
85
+ - rule: 'For "notification deep-link" pattern: post with action + onAction. Click navigates and auto-dismisses (router.push() / location.href / api.markRead()).'
86
+ reason: 'Deep-link pattern lives in the onAction callback, not in markup.'
@@ -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] {
@@ -103,6 +103,12 @@
103
103
  "action": {
104
104
  "description": "Button adjacent to the control for inline actions (clear, reset, help popover)."
105
105
  },
106
+ "error": {
107
+ "description": "Override slot for error markup richer than the plain [error] attribute string. Rendered below the control with danger-text styling. Mutually exclusive with [error]."
108
+ },
109
+ "hint": {
110
+ "description": "Override slot for hint markup richer than the plain [hint] attribute string (inline links, code spans, abbreviations). Rendered below the control at body-subtle typography. Mutually exclusive with [hint]."
111
+ },
106
112
  "trailing": {
107
113
  "description": "Secondary text or badge aligned with the label in the stacked layout (right-aligned) or between label and control in the inline layout."
108
114
  }
@@ -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
  }
@@ -89,6 +89,16 @@ slots:
89
89
  description: >-
90
90
  Button adjacent to the control for inline actions (clear,
91
91
  reset, help popover).
92
+ hint:
93
+ description: >-
94
+ Override slot for hint markup richer than the plain [hint] attribute
95
+ string (inline links, code spans, abbreviations). Rendered below
96
+ the control at body-subtle typography. Mutually exclusive with [hint].
97
+ error:
98
+ description: >-
99
+ Override slot for error markup richer than the plain [error] attribute
100
+ string. Rendered below the control with danger-text styling. Mutually
101
+ exclusive with [error].
92
102
  states:
93
103
  - name: idle
94
104
  description: Default, ready for interaction.
@@ -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
  }
@@ -93,6 +93,9 @@ export { UIMenu, UIMenuItem, UIMenuDivider } from './menu/menu.js';
93
93
  export { UIContextMenu } from './context-menu/context-menu.js';
94
94
  export { UIVisuallyHidden } from './visually-hidden/visually-hidden.js';
95
95
  export { UISkipNav } from './skip-nav/skip-nav.js';
96
+ export { UIMark } from './mark/mark.js';
97
+ export { UIInlineEdit } from './inline-edit/inline-edit.js';
98
+ export { UITour, UITourStep } from './tour/tour.js';
96
99
  export { UIToolbar, UIToolbarGroup } from './toolbar/toolbar.js';
97
100
  export { UINav } from './nav/nav.js';
98
101
  export { UINavGroup } from './nav-group/nav-group.js';