@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.
- package/CHANGELOG.md +32 -0
- package/components/accordion/accordion-item.a2ui.json +3 -0
- package/components/accordion/accordion-item.yaml +5 -0
- package/components/action-list/action-item.a2ui.json +5 -1
- package/components/action-list/action-item.yaml +7 -0
- package/components/card/card.a2ui.json +17 -1
- package/components/card/card.yaml +24 -1
- package/components/date-range-picker/date-range-picker.css +4 -4
- package/components/datetime-picker/datetime-picker.css +3 -3
- package/components/demo-toggle/demo-toggle.css +11 -11
- package/components/empty-state/empty-state.a2ui.json +9 -0
- package/components/empty-state/empty-state.yaml +15 -0
- package/components/feed/feed-item.a2ui.json +5 -0
- package/components/feed/feed-item.yaml +10 -0
- package/components/feed/feed.css +2 -2
- package/components/field/field.a2ui.json +6 -0
- package/components/field/field.css +18 -18
- package/components/field/field.yaml +10 -0
- package/components/heatmap/heatmap.css +1 -1
- package/components/index.js +3 -0
- package/components/inline-edit/inline-edit.a2ui.json +159 -0
- package/components/inline-edit/inline-edit.class.js +184 -0
- package/components/inline-edit/inline-edit.css +62 -0
- package/components/inline-edit/inline-edit.d.ts +52 -0
- package/components/inline-edit/inline-edit.js +12 -0
- package/components/inline-edit/inline-edit.yaml +125 -0
- package/components/inline-message/inline-message.css +1 -1
- package/components/list/list-item.a2ui.json +11 -1
- package/components/list/list-item.yaml +19 -0
- package/components/list/list.css +36 -6
- package/components/list-window/list-window.css +4 -4
- package/components/mark/mark.a2ui.json +109 -0
- package/components/mark/mark.class.js +22 -0
- package/components/mark/mark.css +39 -0
- package/components/mark/mark.d.ts +27 -0
- package/components/mark/mark.js +12 -0
- package/components/mark/mark.yaml +87 -0
- package/components/modal/modal.a2ui.json +9 -0
- package/components/modal/modal.css +8 -8
- package/components/modal/modal.yaml +14 -0
- package/components/nav-group/nav-group.a2ui.json +3 -0
- package/components/nav-group/nav-group.yaml +5 -0
- package/components/nav-item/nav-item.a2ui.json +3 -0
- package/components/nav-item/nav-item.yaml +5 -0
- package/components/option-card/option-card.css +9 -9
- package/components/segmented/segmented.class.js +10 -2
- package/components/select/select.a2ui.json +3 -0
- package/components/select/select.css +5 -5
- package/components/select/select.yaml +5 -0
- package/components/slider/slider.a2ui.json +6 -0
- package/components/slider/slider.yaml +10 -0
- package/components/stat/stat.css +18 -14
- package/components/stepper/stepper-item.a2ui.json +3 -0
- package/components/stepper/stepper-item.yaml +5 -0
- package/components/timeline/timeline-item.a2ui.json +8 -1
- package/components/timeline/timeline-item.yaml +12 -0
- package/components/timeline/timeline.css +19 -19
- package/components/tour/tour-step.a2ui.json +92 -0
- package/components/tour/tour-step.yaml +84 -0
- package/components/tour/tour.a2ui.json +172 -0
- package/components/tour/tour.class.js +309 -0
- package/components/tour/tour.css +135 -0
- package/components/tour/tour.d.ts +78 -0
- package/components/tour/tour.js +13 -0
- package/components/tour/tour.yaml +161 -0
- package/components/tree/tree-item.a2ui.json +5 -1
- package/components/tree/tree-item.yaml +7 -0
- package/components/tree/tree.a2ui.json +3 -0
- package/components/tree/tree.yaml +5 -0
- package/dist/web-components.min.css +1 -1
- package/dist/web-components.min.js +88 -74
- package/package.json +1 -1
- 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
|
|
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
|
|
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
|
|
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]
|
|
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
|
|
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]
|
|
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"]
|
|
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
|
|
61
|
-
:scope
|
|
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"]
|
|
68
|
-
:scope[data-state="off"]
|
|
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"]
|
|
80
|
-
:scope[data-mode="overlay"]
|
|
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"]
|
|
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"]
|
|
101
|
+
:scope[data-mode="overlay"][data-state="on"] [slot="off"] {
|
|
102
102
|
visibility: hidden;
|
|
103
103
|
}
|
|
104
|
-
:scope[data-mode="overlay"][data-state="off"]
|
|
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"]
|
|
111
|
-
:scope[data-mode="overlay"][data-state="off"]
|
|
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.'
|
package/components/feed/feed.css
CHANGED
|
@@ -144,14 +144,14 @@ feed-item-ui[data-closing] {
|
|
|
144
144
|
transform: translateY(0.5rem);
|
|
145
145
|
pointer-events: auto;
|
|
146
146
|
}
|
|
147
|
-
:scope
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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])
|
|
72
|
+
:scope:not([label]) [slot="label"] { display: none; }
|
|
73
73
|
|
|
74
74
|
/* ── Slot styling ── */
|
|
75
|
-
:scope
|
|
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
|
|
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
|
|
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
|
|
98
|
+
:scope [slot="action"] {
|
|
99
99
|
grid-area: action;
|
|
100
100
|
justify-self: end;
|
|
101
101
|
}
|
|
102
|
-
:scope
|
|
103
|
-
:scope
|
|
102
|
+
:scope [slot="hint"],
|
|
103
|
+
:scope [slot="error"] {
|
|
104
104
|
grid-area: message;
|
|
105
105
|
line-height: 1.3;
|
|
106
106
|
}
|
|
107
|
-
:scope
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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"]
|
|
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.
|
package/components/index.js
CHANGED
|
@@ -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';
|