@adia-ai/web-components 0.8.31 → 0.8.33
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 +66 -0
- package/MIGRATION.md +136 -0
- package/components/accordion/accordion-item.a2ui.json +8 -0
- package/components/accordion/accordion-item.yaml +6 -0
- package/components/accordion/accordion.css +3 -1
- package/components/accordion/accordion.d.ts +2 -2
- package/components/action-list/action-list.class.js +6 -2
- package/components/action-list/action-list.d.ts +1 -1
- package/components/agent-artifact/agent-artifact.d.ts +1 -1
- package/components/agent-feedback-bar/agent-feedback-bar.d.ts +2 -2
- package/components/agent-questions/agent-questions.d.ts +1 -1
- package/components/agent-reasoning/agent-reasoning.d.ts +3 -3
- package/components/agent-suggestions/agent-suggestions.d.ts +1 -1
- package/components/agent-trace/agent-trace.d.ts +1 -1
- package/components/alert/alert.a2ui.json +3 -5
- package/components/alert/alert.class.js +3 -3
- package/components/alert/alert.css +5 -12
- package/components/alert/alert.d.ts +4 -4
- package/components/alert/alert.yaml +6 -5
- package/components/anchor-bar/anchor-bar.d.ts +2 -2
- package/components/avatar/avatar.class.js +0 -1
- package/components/avatar/avatar.css +16 -2
- package/components/badge/badge.a2ui.json +6 -9
- package/components/badge/badge.class.js +4 -4
- package/components/badge/badge.css +134 -74
- package/components/badge/badge.d.ts +34 -12
- package/components/badge/badge.examples.md +1 -1
- package/components/badge/badge.yaml +37 -16
- package/components/breadcrumb/breadcrumb.css +15 -3
- package/components/button/button.a2ui.json +1 -1
- package/components/button/button.css +4 -2
- package/components/button/button.d.ts +3 -3
- package/components/button/button.yaml +1 -1
- package/components/calendar-grid/calendar-grid.d.ts +2 -2
- package/components/card/card.css +21 -0
- package/components/card/card.yaml +10 -1
- package/components/chart/chart.class.js +8 -4
- package/components/chart/chart.d.ts +4 -4
- package/components/chart-legend/chart-legend.d.ts +1 -1
- package/components/chat-thread/chat-input.css +1 -1
- package/components/chat-thread/chat-thread.d.ts +2 -2
- package/components/check/check.css +3 -3
- package/components/command/command.d.ts +2 -2
- package/components/context-menu/context-menu.d.ts +3 -3
- package/components/datetime-picker/datetime-picker.d.ts +5 -5
- package/components/demo-toggle/demo-toggle.d.ts +1 -1
- package/components/drawer/drawer.d.ts +2 -2
- package/components/heatmap/heatmap.d.ts +5 -5
- package/components/index.js +1 -0
- package/components/inline-edit/inline-edit.d.ts +4 -4
- package/components/input/input.a2ui.json +4 -1
- package/components/input/input.css +18 -0
- package/components/input/input.yaml +11 -1
- package/components/integration-card/integration-card.class.js +11 -2
- package/components/integration-card/integration-card.d.ts +4 -4
- package/components/link/link.d.ts +1 -1
- package/components/list/list.class.js +22 -7
- package/components/list/list.d.ts +1 -1
- package/components/list-window/list-window.d.ts +5 -5
- package/components/mark/mark.a2ui.json +6 -7
- package/components/mark/mark.class.js +1 -1
- package/components/mark/mark.css +7 -4
- package/components/mark/mark.d.ts +2 -2
- package/components/mark/mark.examples.md +0 -4
- package/components/mark/mark.yaml +16 -6
- package/components/menu/menu.css +2 -2
- package/components/menu/menu.d.ts +1 -1
- package/components/modal/modal.d.ts +1 -1
- package/components/nav/nav.css +8 -0
- package/components/nav/nav.d.ts +1 -1
- package/components/nav-group/nav-group.css +58 -9
- package/components/nav-group/nav-group.d.ts +1 -1
- package/components/nav-item/nav-item.css +7 -4
- package/components/nav-item/nav-item.d.ts +1 -1
- package/components/noodles/noodles.d.ts +3 -3
- package/components/option-card/option-card.css +1 -1
- package/components/option-card/option-card.examples.md +1 -1
- package/components/pagination/pagination.d.ts +1 -1
- package/components/pane/pane.d.ts +1 -1
- package/components/password-strength/password-strength.d.ts +1 -1
- package/components/popover/popover.a2ui.json +5 -0
- package/components/popover/popover.class.js +9 -4
- package/components/popover/popover.css +5 -2
- package/components/popover/popover.yaml +8 -0
- package/components/preview/preview.examples.md +1 -1
- package/components/radio/radio.a2ui.json +4 -3
- package/components/radio/radio.css +2 -2
- package/components/radio/radio.yaml +7 -14
- package/components/radio-group/radio-group.a2ui.json +118 -0
- package/components/radio-group/radio-group.class.js +75 -0
- package/components/radio-group/radio-group.css +31 -0
- package/components/radio-group/radio-group.d.ts +20 -0
- package/components/radio-group/radio-group.examples.md +37 -0
- package/components/radio-group/radio-group.js +17 -0
- package/components/radio-group/radio-group.yaml +114 -0
- package/components/stat/stat.css +12 -8
- package/components/stat/stat.js +66 -1
- package/components/stat/stat.yaml +3 -0
- package/components/stepper/stepper-item.a2ui.json +5 -0
- package/components/stepper/stepper-item.yaml +11 -0
- package/components/stepper/stepper.a2ui.json +38 -3
- package/components/stepper/stepper.class.js +199 -2
- package/components/stepper/stepper.css +30 -0
- package/components/stepper/stepper.d.ts +28 -1
- package/components/stepper/stepper.yaml +76 -2
- package/components/stream/stream.d.ts +3 -3
- package/components/swatch/swatch.d.ts +1 -1
- package/components/swiper/swiper.d.ts +3 -3
- package/components/table/cell-types.js +12 -1
- package/components/table/table.a2ui.json +2 -2
- package/components/table/table.d.ts +7 -7
- package/components/table/table.yaml +9 -1
- package/components/table-toolbar/table-toolbar.class.js +1 -1
- package/components/table-toolbar/table-toolbar.d.ts +4 -4
- package/components/tabs/tabs.d.ts +1 -1
- package/components/tag/tag.a2ui.json +5 -5
- package/components/tag/tag.class.js +1 -1
- package/components/tag/tag.css +149 -71
- package/components/tag/tag.d.ts +21 -11
- package/components/tag/tag.examples.md +4 -4
- package/components/tag/tag.yaml +35 -13
- package/components/tags-input/tags-input.d.ts +4 -4
- package/components/timeline/timeline.d.ts +1 -1
- package/components/toast/toast.a2ui.json +2 -4
- package/components/toast/toast.css +0 -12
- package/components/toast/toast.yaml +3 -4
- package/components/toc/toc.d.ts +1 -1
- package/components/toggle-group/toggle-group.d.ts +1 -1
- package/components/toggle-scheme/toggle-scheme.d.ts +1 -1
- package/components/tour/tour.d.ts +4 -4
- package/components/tree/tree.d.ts +1 -1
- package/core/icons-phosphor.js +129 -71
- package/core/provider.js +84 -23
- package/dist/host.min.css +1 -1
- package/dist/host.sheet.js +1 -1
- package/dist/theme-provider.min.js +1 -1
- package/dist/web-components.min.css +1 -1
- package/dist/web-components.min.js +90 -88
- package/dist/web-components.sheet.js +1 -1
- package/package.json +1 -1
- package/patterns/admin-keys-and-export/admin-keys-and-export.examples.html +1 -1
- package/patterns/agent-memory/agent-memory.examples.html +5 -5
- package/patterns/agent-prompt-library/agent-prompt-library.examples.html +2 -2
- package/patterns/audit-log/audit-log.examples.js +12 -5
- package/patterns/bulk-action-toolbar/bulk-action-toolbar.examples.js +4 -1
- package/patterns/changelog-feed/changelog-feed.examples.html +1 -1
- package/patterns/comments-and-collaboration/comments-and-collaboration.examples.html +1 -1
- package/patterns/conversion-funnel/conversion-funnel.examples.html +1 -1
- package/patterns/diff-review/diff-review.examples.html +9 -9
- package/patterns/filter-bar/filter-bar.examples.html +12 -8
- package/patterns/filter-bar/filter-bar.examples.js +4 -1
- package/patterns/marketing-engagement/marketing-engagement.examples.html +1 -1
- package/patterns/notifications-bell-and-digest/notifications-bell-and-digest.examples.html +1 -1
- package/patterns/permissions-matrix/permissions-matrix.examples.html +1 -1
- package/patterns/permissions-sharing/permissions-sharing.examples.html +1 -1
- package/patterns/profile-public-and-verification/profile-public-and-verification.examples.html +2 -2
- package/patterns/record-detail-drawer/record-detail-drawer.examples.html +1 -1
- package/patterns/retention-cohort/retention-cohort.examples.html +1 -1
- package/patterns/retention-cohort/retention-cohort.examples.js +4 -1
- package/patterns/system-banners/system-banners.examples.html +3 -3
- package/styles/api/sizing-fallback.css +32 -0
- package/styles/api/sizing.css +7 -3
- package/styles/components.css +1 -0
- package/styles/tokens.css +1 -0
|
@@ -27,12 +27,12 @@ export class UIStream extends UIElement {
|
|
|
27
27
|
/** Read-only reflected state, true while stream is active */
|
|
28
28
|
streaming: boolean;
|
|
29
29
|
|
|
30
|
+
addEventListener(type: 'stream-end', listener: (ev: StreamEndEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
31
|
+
addEventListener(type: 'stream-error', listener: (ev: StreamErrorEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
32
|
+
addEventListener(type: 'stream-start', listener: (ev: StreamStartEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
30
33
|
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
31
34
|
type: K,
|
|
32
35
|
listener: (this: UIStream, ev: HTMLElementEventMap[K]) => unknown,
|
|
33
36
|
options?: boolean | AddEventListenerOptions,
|
|
34
37
|
): void;
|
|
35
|
-
addEventListener(type: 'stream-end', listener: (ev: StreamEndEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
36
|
-
addEventListener(type: 'stream-error', listener: (ev: StreamErrorEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
37
|
-
addEventListener(type: 'stream-start', listener: (ev: StreamStartEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
38
38
|
}
|
|
@@ -73,10 +73,10 @@ pattern; blocked 3 cycles on this design call). */
|
|
|
73
73
|
/** Size preset — sm / md / lg. Drives the swatch's intrinsic dimensions; lg is reserved for the token-scale demo (40 px tall). */
|
|
74
74
|
size: 'sm' | 'md' | 'lg';
|
|
75
75
|
|
|
76
|
+
addEventListener(type: 'select', listener: (ev: SwatchSelectEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
76
77
|
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
77
78
|
type: K,
|
|
78
79
|
listener: (this: UISwatch, ev: HTMLElementEventMap[K]) => unknown,
|
|
79
80
|
options?: boolean | AddEventListenerOptions,
|
|
80
81
|
): void;
|
|
81
|
-
addEventListener(type: 'select', listener: (ev: SwatchSelectEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
82
82
|
}
|
|
@@ -52,12 +52,12 @@ export class UISwiper extends UIElement {
|
|
|
52
52
|
/** Scroll-snap alignment — start, center, end, or none. */
|
|
53
53
|
snap: 'start' | 'center' | 'end' | 'none';
|
|
54
54
|
|
|
55
|
+
addEventListener(type: 'autoplay-pause', listener: (ev: SwiperAutoplayPauseEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
56
|
+
addEventListener(type: 'autoplay-resume', listener: (ev: SwiperAutoplayResumeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
57
|
+
addEventListener(type: 'change', listener: (ev: SwiperChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
55
58
|
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
56
59
|
type: K,
|
|
57
60
|
listener: (this: UISwiper, ev: HTMLElementEventMap[K]) => unknown,
|
|
58
61
|
options?: boolean | AddEventListenerOptions,
|
|
59
62
|
): void;
|
|
60
|
-
addEventListener(type: 'autoplay-pause', listener: (ev: SwiperAutoplayPauseEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
61
|
-
addEventListener(type: 'autoplay-resume', listener: (ev: SwiperAutoplayResumeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
62
|
-
addEventListener(type: 'change', listener: (ev: SwiperChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
63
63
|
}
|
|
@@ -173,7 +173,18 @@ registerCellType('badge', {
|
|
|
173
173
|
}
|
|
174
174
|
el.setAttribute('text', String(value ?? ''));
|
|
175
175
|
const variants = meta?.variants || {};
|
|
176
|
-
|
|
176
|
+
const variant = variants[value];
|
|
177
|
+
// Unmapped value → family-less badge, tone="muted" (quiet chrome) —
|
|
178
|
+
// `variant="neutral"` retired (variant/color/tone convention cut,
|
|
179
|
+
// gh#873/874). Element is reused across renders, so both attributes
|
|
180
|
+
// are explicitly set/cleared rather than only ever added.
|
|
181
|
+
if (variant) {
|
|
182
|
+
el.setAttribute('variant', variant);
|
|
183
|
+
el.removeAttribute('tone');
|
|
184
|
+
} else {
|
|
185
|
+
el.removeAttribute('variant');
|
|
186
|
+
el.setAttribute('tone', 'muted');
|
|
187
|
+
}
|
|
177
188
|
},
|
|
178
189
|
format(value) {
|
|
179
190
|
return String(value ?? '');
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"default": false
|
|
41
41
|
},
|
|
42
42
|
"frameless": {
|
|
43
|
-
"description": "Drop the table's outer 1px perimeter and nothing else (gh#511) — row dividers are untouched (the perimeter is split onto its own --table-perimeter token, defaulting to --table-border). For card-composed tables: the card owns the frame, so the table's square perimeter otherwise renders a doubled edge (flush bleed) or a stray inner box (with content above). Standalone tables keep their chrome by default. Theming path without the attribute: set --table-perimeter to transparent per instance.",
|
|
43
|
+
"description": "Drop the table's outer 1px perimeter and nothing else (gh#511) — row dividers are untouched (the perimeter is split onto its own --table-perimeter token, defaulting to --table-border). For card-composed tables: the card owns the frame, so the table's square perimeter otherwise renders a doubled edge (flush bleed) or a stray inner box (with content above). Standalone tables keep their chrome by default. Theming path without the attribute: set --table-perimeter to transparent per instance. Note: `<card-ui><section bleed>` already drops a direct-child table-ui's chrome automatically (card.css, gh#796) — `frameless`/`raw` on the instance still applies and is honored, but is no longer required just to avoid the doubled-edge look in that composition.",
|
|
44
44
|
"type": "boolean",
|
|
45
45
|
"default": false
|
|
46
46
|
},
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"default": 0
|
|
56
56
|
},
|
|
57
57
|
"raw": {
|
|
58
|
-
"description": "Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom \"No data\" overlay. v0.6.33+ matches the documented contract.",
|
|
58
|
+
"description": "Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Note: a `<table-ui>` placed directly inside `<card-ui><section bleed>` drops the table's visual chrome automatically (card.css, gh#796) even without `raw` — `raw` is still required to also short-circuit the data lifecycle. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom \"No data\" overlay. v0.6.33+ matches the documented contract.",
|
|
59
59
|
"type": "boolean",
|
|
60
60
|
"default": false
|
|
61
61
|
},
|
|
@@ -94,13 +94,13 @@ export class UITable extends UIElement {
|
|
|
94
94
|
density: 'compact' | 'standard' | 'comfortable';
|
|
95
95
|
/** Enable row expansion */
|
|
96
96
|
expandable: boolean;
|
|
97
|
-
/** Drop the table's outer 1px perimeter and nothing else (gh#511) — row dividers are untouched (the perimeter is split onto its own --table-perimeter token, defaulting to --table-border). For card-composed tables: the card owns the frame, so the table's square perimeter otherwise renders a doubled edge (flush bleed) or a stray inner box (with content above). Standalone tables keep their chrome by default. Theming path without the attribute: set --table-perimeter to transparent per instance. */
|
|
97
|
+
/** Drop the table's outer 1px perimeter and nothing else (gh#511) — row dividers are untouched (the perimeter is split onto its own --table-perimeter token, defaulting to --table-border). For card-composed tables: the card owns the frame, so the table's square perimeter otherwise renders a doubled edge (flush bleed) or a stray inner box (with content above). Standalone tables keep their chrome by default. Theming path without the attribute: set --table-perimeter to transparent per instance. Note: `<card-ui><section bleed>` already drops a direct-child table-ui's chrome automatically (card.css, gh#796) — `frameless`/`raw` on the instance still applies and is honored, but is no longer required just to avoid the doubled-edge look in that composition. */
|
|
98
98
|
frameless: boolean;
|
|
99
99
|
/** Renders N ghost skeleton rows in place of the body data (count derived from `paginate` if set, else 5). Header + columns stay intact so the table layout is preserved while data fetches. Sets aria-busy="true" on the host. Data updates are deferred until loading is set back to false. */
|
|
100
100
|
loading: boolean;
|
|
101
101
|
/** Rows per page. 0 = show all rows without pagination. When > 0, renders a pagination bar below the table. */
|
|
102
102
|
paginate: number;
|
|
103
|
-
/** Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom "No data" overlay. v0.6.33+ matches the documented contract. */
|
|
103
|
+
/** Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Note: a `<table-ui>` placed directly inside `<card-ui><section bleed>` drops the table's visual chrome automatically (card.css, gh#796) even without `raw` — `raw` is still required to also short-circuit the data lifecycle. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom "No data" overlay. v0.6.33+ matches the documented contract. */
|
|
104
104
|
raw: boolean;
|
|
105
105
|
/** Global search/filter string. Filters visible rows across all columns using case-insensitive substring matching. Resets to page 1 on change. */
|
|
106
106
|
search: string;
|
|
@@ -115,11 +115,6 @@ export class UITable extends UIElement {
|
|
|
115
115
|
/** Allow body-cell content to wrap onto multiple lines. Default is single-line with ellipsis truncation (matches the row convention shared by <select-ui> + <nav-item-ui>); long unbreakable strings clip gracefully rather than rewrapping the row. With [wrap], row height auto-grows to fit wrapped content. For surgical opt-in on a single column, set [data-wrap] on the cell / col-def instead. */
|
|
116
116
|
wrap: boolean;
|
|
117
117
|
|
|
118
|
-
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
119
|
-
type: K,
|
|
120
|
-
listener: (this: UITable, ev: HTMLElementEventMap[K]) => unknown,
|
|
121
|
-
options?: boolean | AddEventListenerOptions,
|
|
122
|
-
): void;
|
|
123
118
|
addEventListener(type: 'cell-click', listener: (ev: TableCellClickEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
124
119
|
addEventListener(type: 'filter-change', listener: (ev: TableFilterChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
125
120
|
addEventListener(type: 'page', listener: (ev: TablePageEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
@@ -129,4 +124,9 @@ export class UITable extends UIElement {
|
|
|
129
124
|
addEventListener(type: 'row-expand', listener: (ev: TableRowExpandEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
130
125
|
addEventListener(type: 'select', listener: (ev: TableSelectEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
131
126
|
addEventListener(type: 'sort', listener: (ev: TableSortEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
127
|
+
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
128
|
+
type: K,
|
|
129
|
+
listener: (this: UITable, ev: HTMLElementEventMap[K]) => unknown,
|
|
130
|
+
options?: boolean | AddEventListenerOptions,
|
|
131
|
+
): void;
|
|
132
132
|
}
|
|
@@ -74,6 +74,10 @@ props:
|
|
|
74
74
|
surfaces that supply their own chrome (e.g. `<card-ui><section
|
|
75
75
|
bleed>`), or when wrapping a consumer-authored native `<table>`
|
|
76
76
|
for design-token styling without the framework's data semantics.
|
|
77
|
+
Note: a `<table-ui>` placed directly inside `<card-ui><section bleed>`
|
|
78
|
+
drops the table's visual chrome automatically (card.css, gh#796) even
|
|
79
|
+
without `raw` — `raw` is still required to also short-circuit the
|
|
80
|
+
data lifecycle.
|
|
77
81
|
Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle
|
|
78
82
|
still ran — wrapping a `.data`-unset native table produced a
|
|
79
83
|
phantom "No data" overlay. v0.6.33+ matches the documented contract.
|
|
@@ -107,7 +111,11 @@ props:
|
|
|
107
111
|
square perimeter otherwise renders a doubled edge (flush bleed) or
|
|
108
112
|
a stray inner box (with content above). Standalone tables keep
|
|
109
113
|
their chrome by default. Theming path without the attribute:
|
|
110
|
-
set --table-perimeter to transparent per instance.
|
|
114
|
+
set --table-perimeter to transparent per instance. Note:
|
|
115
|
+
`<card-ui><section bleed>` already drops a direct-child table-ui's
|
|
116
|
+
chrome automatically (card.css, gh#796) — `frameless`/`raw` on the
|
|
117
|
+
instance still applies and is honored, but is no longer required
|
|
118
|
+
just to avoid the doubled-edge look in that composition.
|
|
111
119
|
type: boolean
|
|
112
120
|
default: false
|
|
113
121
|
reflect: true
|
|
@@ -272,7 +272,7 @@ export class UITableToolbar extends UIElement {
|
|
|
272
272
|
const badge = document.createElement('badge-ui');
|
|
273
273
|
badge.setAttribute('data-count-badge', '');
|
|
274
274
|
badge.setAttribute('size', 'sm');
|
|
275
|
-
badge.setAttribute('
|
|
275
|
+
badge.setAttribute('tone', 'muted');
|
|
276
276
|
badge.hidden = true;
|
|
277
277
|
title.appendChild(badge);
|
|
278
278
|
|
|
@@ -37,13 +37,13 @@ export class UITableToolbar extends UIElement {
|
|
|
37
37
|
/** Toolbar visual variant. `default` renders bare on parent surface; `card` adds the same chrome as a card-ui header. */
|
|
38
38
|
variant: 'default' | 'card';
|
|
39
39
|
|
|
40
|
+
addEventListener(type: 'columns-change', listener: (ev: TableToolbarColumnsChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
41
|
+
addEventListener(type: 'filter-change', listener: (ev: TableToolbarFilterChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
42
|
+
addEventListener(type: 'search', listener: (ev: TableToolbarSearchEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
43
|
+
addEventListener(type: 'sort-change', listener: (ev: TableToolbarSortChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
40
44
|
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
41
45
|
type: K,
|
|
42
46
|
listener: (this: UITableToolbar, ev: HTMLElementEventMap[K]) => unknown,
|
|
43
47
|
options?: boolean | AddEventListenerOptions,
|
|
44
48
|
): void;
|
|
45
|
-
addEventListener(type: 'columns-change', listener: (ev: TableToolbarColumnsChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
46
|
-
addEventListener(type: 'filter-change', listener: (ev: TableToolbarFilterChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
47
|
-
addEventListener(type: 'search', listener: (ev: TableToolbarSearchEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
48
|
-
addEventListener(type: 'sort-change', listener: (ev: TableToolbarSortChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
49
49
|
}
|
|
@@ -27,12 +27,12 @@ export class UITabs extends UIElement {
|
|
|
27
27
|
/** Visual variant — `default` (underline strip) or `bordered`. */
|
|
28
28
|
variant: 'default' | 'bordered';
|
|
29
29
|
|
|
30
|
+
addEventListener(type: 'change', listener: (ev: TabsChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
30
31
|
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
31
32
|
type: K,
|
|
32
33
|
listener: (this: UITabs, ev: HTMLElementEventMap[K]) => unknown,
|
|
33
34
|
options?: boolean | AddEventListenerOptions,
|
|
34
35
|
): void;
|
|
35
|
-
addEventListener(type: 'change', listener: (ev: TabsChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
export class UITab extends UIElement {
|
|
@@ -46,25 +46,25 @@
|
|
|
46
46
|
"$ref": "common_types.json#/$defs/DynamicString"
|
|
47
47
|
},
|
|
48
48
|
"tone": {
|
|
49
|
-
"description": "Fill style — orthogonal to [variant]. Three values:\n - `
|
|
49
|
+
"description": "Fill style — orthogonal to [variant]. Three values:\n - `muted` (default for the family variants — info/success/warning/\n danger/primary — gh#864: tag and badge were swapped relative to\n their reported default formulas; this restores tag's own)\n — tinted bg with scheme-paired text. Matches <badge-ui>'s\n `[tone=\"muted\"]` look. Use on metadata / citation chips in dense\n lists or tables where a saturated fill would compete for\n attention (gh#778's oversized-pill concern). Does NOT apply to\n the family-less `default` variant, which stays solid\n unconditionally (gh#794, unaffected by gh#864) — a bare\n `<tag-ui text=\"…\">` still renders that solid look with no\n attributes at all.\n - `solid` — saturated bg + on-strong (near-white) text. The chip\n IS the state. Opt in explicitly for a family variant (gh#864),\n or it's already the unconditional look for the family-less\n `default` variant (gh#794).\n - `outline` — transparent bg + family-colored border + family-colored\n text. The lightest visual weight; good in dense data tables or\n faceted filter rows where multiple chips would otherwise compete.\n`tone` is a declarative presentational attribute (not a reactive\nprop — see tag.class.js) so its schema `default` here is documentation\nof the rendered-by-default look, not a reflected attribute value.\n",
|
|
50
50
|
"type": "string",
|
|
51
51
|
"enum": [
|
|
52
52
|
"solid",
|
|
53
53
|
"muted",
|
|
54
54
|
"outline"
|
|
55
55
|
],
|
|
56
|
-
"default": "
|
|
56
|
+
"default": "muted"
|
|
57
57
|
},
|
|
58
58
|
"variant": {
|
|
59
|
-
"description": "Semantic variant — `default |
|
|
59
|
+
"description": "Semantic variant — `default | info | success | warning | danger | primary`. `primary` is brand emphasis for non-semantic labels — a filter chip or taxonomy tag that shouldn't imply a success/warning/danger state. Mirrors <badge-ui>'s `primary` variant token-for-token (`accent` retired, gh#874 — the capability survives renamed, sibling parity with badge preserved).",
|
|
60
60
|
"type": "string",
|
|
61
61
|
"enum": [
|
|
62
62
|
"default",
|
|
63
|
-
"accent",
|
|
64
63
|
"info",
|
|
65
64
|
"success",
|
|
66
65
|
"warning",
|
|
67
|
-
"danger"
|
|
66
|
+
"danger",
|
|
67
|
+
"primary"
|
|
68
68
|
],
|
|
69
69
|
"default": "default"
|
|
70
70
|
}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* Inline tag / chip. Pill-shaped, text rendered via CSS attr().
|
|
18
18
|
* Optional dismiss button dispatches a 'remove' CustomEvent.
|
|
19
19
|
*
|
|
20
|
-
* Variants: default, info, success, warning, danger
|
|
20
|
+
* Variants: default, info, success, warning, danger, primary
|
|
21
21
|
* Sizes: sm, md (default)
|
|
22
22
|
*
|
|
23
23
|
* Events:
|
package/components/tag/tag.css
CHANGED
|
@@ -6,15 +6,47 @@ tag-ui[removable]:not([disabled]):hover {
|
|
|
6
6
|
|
|
7
7
|
@scope (tag-ui) {
|
|
8
8
|
:where(:scope) {
|
|
9
|
-
/* ── Tokens ──
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
/* ── Tokens ──
|
|
10
|
+
gh#794: the real bare-tag default lives HERE, not in the
|
|
11
|
+
`:scope[variant="default"]` rule below — `variant` is a reflect:true
|
|
12
|
+
prop (tag.class.js), and `installProps()`'s reflect() only fires on
|
|
13
|
+
a property SET, never for a value that equals its declared class
|
|
14
|
+
default at construction time. A bare `<tag-ui text="…">` therefore
|
|
15
|
+
never gets a physical `variant="default"` attribute; these
|
|
16
|
+
`:where(:scope)` zero-specificity tokens are what it actually
|
|
17
|
+
renders. Solid neutral (was `--a-bg-muted` quiet chrome pre-#794)
|
|
18
|
+
— same pair the family variants and the redundant
|
|
19
|
+
`:scope[variant="default"]` rule below carry, for the rare case
|
|
20
|
+
`variant="default"` IS reflected explicitly (SSR/a2ui-producer
|
|
21
|
+
markup). Opt out via `[tone="muted"]`. Uses the real
|
|
22
|
+
`--md-sys-color-neutral`/`-on-neutral` pair (operator ruling,
|
|
23
|
+
2026-08-10) — the true parallel to `-primary`/`-on-primary` etc.,
|
|
24
|
+
not the `-on-surface`/`-background` ink/page tokens this rule
|
|
25
|
+
borrowed pre-#794's cross-check. */
|
|
26
|
+
--tag-bg: var(--md-sys-color-neutral);
|
|
27
|
+
--tag-fg: var(--md-sys-color-neutral-on-neutral);
|
|
12
28
|
--tag-border: transparent;
|
|
13
29
|
--tag-radius: var(--a-radius-full);
|
|
14
30
|
--tag-px: var(--a-space-1-5);
|
|
15
|
-
--tag-py: 0
|
|
31
|
+
--tag-py: var(--a-space-0-5);
|
|
16
32
|
--tag-gap: var(--a-space-1);
|
|
17
33
|
--tag-font: var(--a-ui-sm);
|
|
34
|
+
|
|
35
|
+
/* ── Size tiers (gh#779) — md (above) is the pixel-identical default;
|
|
36
|
+
[size="sm"|"lg"] below re-point the active tokens. Component-owned
|
|
37
|
+
ladder, NOT a direct alias of the universal --a-ui-px/--a-ui-size
|
|
38
|
+
tokens (styles/api/sizing.css) — tag-ui's own md baseline predates
|
|
39
|
+
and differs from that system's md (6px/12px here vs 8px/13px
|
|
40
|
+
there), so aliasing directly would shift every default tag's
|
|
41
|
+
geometry (gh#778 is exactly this failure mode — an inflated
|
|
42
|
+
default). Instead sm/lg step off tag's OWN md baseline by the
|
|
43
|
+
same rung spacing the space/type scales already use. */
|
|
44
|
+
--tag-px-sm: var(--a-space-1);
|
|
45
|
+
--tag-px-lg: var(--a-space-2);
|
|
46
|
+
--tag-py-sm: var(--a-space-px);
|
|
47
|
+
--tag-py-lg: var(--a-space-1);
|
|
48
|
+
--tag-font-sm: var(--a-ui-xs);
|
|
49
|
+
--tag-font-lg: var(--a-ui-md);
|
|
18
50
|
--tag-font-family: var(--a-font-family-ui);
|
|
19
51
|
--tag-dismiss-size: 1rem;
|
|
20
52
|
--tag-bg-hover: var(--a-bg-hover);
|
|
@@ -94,93 +126,122 @@ tag-ui[removable]:not([disabled]):hover {
|
|
|
94
126
|
}
|
|
95
127
|
|
|
96
128
|
/* ── Variants ──
|
|
97
|
-
Default tone is `
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
129
|
+
Default tone is `muted` for the family variants (gh#864): the
|
|
130
|
+
tinted-container pair — `--md-sys-color-{family}-container` (tinted
|
|
131
|
+
surface) + `-on-surface` (scheme-flipping text). Tag and badge had
|
|
132
|
+
been implementing each OTHER's reported default formula (gh#794
|
|
133
|
+
flipped tag's bare default to solid a day before gh#845 ratified
|
|
134
|
+
badge's register, with no cross-check between the two changes) — this
|
|
135
|
+
restores tag's own. Opt into the saturated stamp per-tag via
|
|
136
|
+
[tone="solid"] below. This does NOT touch the family-less `default`
|
|
137
|
+
variant below, which stays solid unconditionally (gh#794, unrelated
|
|
138
|
+
to the gh#864 swap). */
|
|
139
|
+
/* `primary` is brand emphasis for non-semantic labels — mirrors
|
|
140
|
+
<badge-ui>'s `primary` variant token-for-token (--md-sys-color-primary-
|
|
141
|
+
container / -on-surface for the tinted fill; `accent` retired, gh#874).
|
|
142
|
+
Not a status color — no success/warning/danger implication. */
|
|
143
|
+
:scope[variant="primary"] {
|
|
144
|
+
--tag-bg: var(--md-sys-color-primary-container);
|
|
145
|
+
--tag-fg: var(--md-sys-color-primary-on-surface);
|
|
109
146
|
}
|
|
110
147
|
|
|
111
148
|
:scope[variant="info"] {
|
|
112
|
-
--tag-bg: var(--
|
|
113
|
-
--tag-fg: var(--md-sys-color-info-on-
|
|
149
|
+
--tag-bg: var(--md-sys-color-info-container);
|
|
150
|
+
--tag-fg: var(--md-sys-color-info-on-surface);
|
|
114
151
|
}
|
|
115
152
|
|
|
116
153
|
:scope[variant="success"] {
|
|
154
|
+
--tag-bg: var(--md-sys-color-success-container);
|
|
155
|
+
--tag-fg: var(--md-sys-color-success-on-surface);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
:scope[variant="warning"] {
|
|
159
|
+
--tag-bg: var(--md-sys-color-warning-container);
|
|
160
|
+
--tag-fg: var(--md-sys-color-warning-on-surface);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
:scope[variant="danger"] {
|
|
164
|
+
--tag-bg: var(--md-sys-color-danger-container);
|
|
165
|
+
--tag-fg: var(--md-sys-color-danger-on-surface);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* `default` (no family) is solid by default (gh#794) — the same
|
|
169
|
+
high-contrast neutral inverse it has always carried. A bare
|
|
170
|
+
`<tag-ui text="…">` is a stamped pill, not quiet chrome. Unaffected by
|
|
171
|
+
the gh#864 family-variant swap above. Opt OUT to the pre-#794 quiet-
|
|
172
|
+
chrome look via `[tone="muted"]` (below) on metadata/citation chips
|
|
173
|
+
in dense lists or tables where the saturated look competes for
|
|
174
|
+
attention (gh#778's oversized-pill complaint). */
|
|
175
|
+
:scope[variant="default"] {
|
|
176
|
+
--tag-bg: var(--md-sys-color-neutral);
|
|
177
|
+
--tag-fg: var(--md-sys-color-neutral-on-neutral);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* ── Tone modifier — orthogonal to [variant] ──
|
|
181
|
+
`[tone="solid"]` opts each family variant INTO the saturated-fill pair
|
|
182
|
+
(gh#864 — this used to be the family variants' unconditional default;
|
|
183
|
+
see the Variants comment above): `--a-{family}-bg` (saturated surface)
|
|
184
|
+
+ Material's on-color (`-on-{family}`, near-white by the fixed-light-
|
|
185
|
+
on-color law). Same shape <tag-ui>'s family-less `default` variant
|
|
186
|
+
still carries unconditionally. Use for a single hero tag that should
|
|
187
|
+
stamp its state.
|
|
188
|
+
|
|
189
|
+
Warning uses --a-warning-bg (semantics.css L3 redirect to the bright-
|
|
190
|
+
amber -20-tint) rather than the raw family token — see also
|
|
191
|
+
<badge-ui>'s identical workaround. */
|
|
192
|
+
:scope[tone="solid"][variant="info"] {
|
|
193
|
+
--tag-bg: var(--a-info-bg);
|
|
194
|
+
--tag-fg: var(--md-sys-color-info-on-info);
|
|
195
|
+
}
|
|
196
|
+
:scope[tone="solid"][variant="success"] {
|
|
117
197
|
--tag-bg: var(--a-success-bg);
|
|
118
198
|
--tag-fg: var(--md-sys-color-success-on-success);
|
|
119
199
|
}
|
|
120
|
-
|
|
121
200
|
/* Same shape as the sibling families since the Material static-token
|
|
122
201
|
migration: amber fill + the palette's own fixed-light on-color
|
|
123
202
|
(`on-warning`, white in both schemes per Material's on-color law).
|
|
124
203
|
The pre-migration dark-brown-text override is gone — its
|
|
125
204
|
lower-than-siblings contrast is a known, operator-accepted
|
|
126
205
|
consequence (TKT-0018, wontfix pending palette adjustment). */
|
|
127
|
-
:scope[variant="warning"] {
|
|
206
|
+
:scope[tone="solid"][variant="warning"] {
|
|
128
207
|
--tag-bg: var(--a-warning-bg);
|
|
129
208
|
--tag-fg: var(--md-sys-color-warning-on-warning);
|
|
130
209
|
}
|
|
131
|
-
|
|
132
|
-
:scope[variant="danger"] {
|
|
210
|
+
:scope[tone="solid"][variant="danger"] {
|
|
133
211
|
--tag-bg: var(--a-danger-bg);
|
|
134
212
|
--tag-fg: var(--md-sys-color-danger-on-danger);
|
|
135
213
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
:
|
|
214
|
+
:scope[tone="solid"][variant="primary"] {
|
|
215
|
+
--tag-bg: var(--a-primary-bg);
|
|
216
|
+
--tag-fg: var(--md-sys-color-primary-on-primary);
|
|
217
|
+
}
|
|
218
|
+
/* gh#794: the pre-#794 quiet-chrome look for the variant-less default —
|
|
219
|
+
same values the `:where(:scope)` base tokens carried before the
|
|
220
|
+
solid-default flip. This is the explicit opt-out for bare tags that
|
|
221
|
+
need the old quiet register (dense-list metadata/citation chips,
|
|
222
|
+
gh#778's oversized-pill concern) instead of the new stamped-pill
|
|
223
|
+
default. `:not([variant=…])` (not `[variant="default"]`) because
|
|
224
|
+
`variant` is a reflect:true prop whose class default ("default")
|
|
225
|
+
never gets a physical attribute reflected on a bare tag (the
|
|
226
|
+
`installProps()` reflect() path only fires on a property SET) —
|
|
227
|
+
the same reason the `[tone="solid"]` fallback below uses this same
|
|
228
|
+
`:not()` shape instead of `[variant="default"]`. */
|
|
229
|
+
:scope[tone="muted"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="primary"]) {
|
|
141
230
|
--tag-bg: var(--a-bg-muted);
|
|
142
231
|
--tag-fg: var(--md-sys-color-neutral-on-surface);
|
|
143
232
|
}
|
|
144
233
|
|
|
145
|
-
/*
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
--tag-bg: var(--md-sys-color-success-container);
|
|
157
|
-
--tag-fg: var(--md-sys-color-success-on-surface);
|
|
158
|
-
}
|
|
159
|
-
:scope[tone="muted"][variant="warning"] {
|
|
160
|
-
--tag-bg: var(--md-sys-color-warning-container);
|
|
161
|
-
--tag-fg: var(--md-sys-color-warning-on-surface);
|
|
162
|
-
}
|
|
163
|
-
:scope[tone="muted"][variant="danger"] {
|
|
164
|
-
--tag-bg: var(--md-sys-color-danger-container);
|
|
165
|
-
--tag-fg: var(--md-sys-color-danger-on-surface);
|
|
166
|
-
}
|
|
167
|
-
/* Mirrors <badge-ui>'s default (muted) accent pair —
|
|
168
|
-
--md-sys-color-primary-container / -on-surface. */
|
|
169
|
-
:scope[tone="muted"][variant="accent"] {
|
|
170
|
-
--tag-bg: var(--md-sys-color-primary-container);
|
|
171
|
-
--tag-fg: var(--md-sys-color-primary-on-surface);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/* `[tone="solid"]` on the neutral default (or no variant) inverts the
|
|
175
|
-
chrome — solid fg-color bg with bg-color text. High-contrast neutral
|
|
176
|
-
stamp. Explicit opt-in; the variant-less default stays quiet chrome.
|
|
177
|
-
[variant="accent"] is excluded — it already has an explicit solid
|
|
178
|
-
pair above (the plain [variant="accent"] rule) that this higher-
|
|
179
|
-
specificity fallback would otherwise clobber when tone="solid" is
|
|
180
|
-
set explicitly alongside it. */
|
|
181
|
-
:scope[tone="solid"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="accent"]) {
|
|
182
|
-
--tag-bg: var(--md-sys-color-neutral-on-surface);
|
|
183
|
-
--tag-fg: var(--md-sys-color-neutral-background);
|
|
234
|
+
/* `[tone="solid"]` explicit opt-in — redundant with the bare default
|
|
235
|
+
since gh#794 (the variant-less default is solid unconditionally
|
|
236
|
+
above) but kept so `tone="solid"` stays a valid, harmless, explicit
|
|
237
|
+
statement of intent for consumers who set it directly.
|
|
238
|
+
[variant="primary"] is excluded — its solid pair is the explicit
|
|
239
|
+
`[tone="solid"][variant="primary"]` rule above (gh#864: the bare
|
|
240
|
+
`[variant="primary"]` rule is container-tinted now, not solid) — this
|
|
241
|
+
`:not()` keeps the neutral-only fallback from ever matching primary. */
|
|
242
|
+
:scope[tone="solid"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="primary"]) {
|
|
243
|
+
--tag-bg: var(--md-sys-color-neutral);
|
|
244
|
+
--tag-fg: var(--md-sys-color-neutral-on-neutral);
|
|
184
245
|
}
|
|
185
246
|
|
|
186
247
|
/* ── `[tone="outline"]` — transparent bg + family-colored border + text ──
|
|
@@ -207,20 +268,37 @@ tag-ui[removable]:not([disabled]):hover {
|
|
|
207
268
|
--tag-fg: var(--md-sys-color-danger-on-surface);
|
|
208
269
|
--tag-border: var(--md-sys-color-danger-outline);
|
|
209
270
|
}
|
|
210
|
-
/* Mirrors <badge-ui>'s outline
|
|
271
|
+
/* Mirrors <badge-ui>'s outline primary pair —
|
|
211
272
|
--md-sys-color-primary-on-surface / -primary-outline. */
|
|
212
|
-
:scope[tone="outline"][variant="
|
|
273
|
+
:scope[tone="outline"][variant="primary"] {
|
|
213
274
|
--tag-fg: var(--md-sys-color-primary-on-surface);
|
|
214
275
|
--tag-border: var(--md-sys-color-primary-outline);
|
|
215
276
|
}
|
|
216
277
|
/* Outline on neutral (no family) — fg-muted text + subtle border.
|
|
217
|
-
[variant="
|
|
218
|
-
:scope[tone="outline"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="
|
|
278
|
+
[variant="primary"] excluded — see the [tone="solid"] fallback note above. */
|
|
279
|
+
:scope[tone="outline"]:not([variant="info"]):not([variant="success"]):not([variant="warning"]):not([variant="danger"]):not([variant="primary"]) {
|
|
219
280
|
--tag-fg: var(--a-fg-muted);
|
|
220
281
|
--tag-border: var(--md-sys-color-neutral-outline);
|
|
221
282
|
}
|
|
222
283
|
|
|
223
|
-
/* Size
|
|
284
|
+
/* ── Size tiers (gh#779) — re-point the active tokens to the matching
|
|
285
|
+
tier; the token defaults at :where(:scope) above ARE the md tier, so
|
|
286
|
+
[size="md"] is declared only for explicitness (mirrors kbd.css). */
|
|
287
|
+
:scope[size="sm"] {
|
|
288
|
+
--tag-px: var(--tag-px-sm);
|
|
289
|
+
--tag-py: var(--tag-py-sm);
|
|
290
|
+
--tag-font: var(--tag-font-sm);
|
|
291
|
+
}
|
|
292
|
+
:scope[size="md"] {
|
|
293
|
+
--tag-px: var(--a-space-1-5);
|
|
294
|
+
--tag-py: var(--a-space-0-5);
|
|
295
|
+
--tag-font: var(--a-ui-sm);
|
|
296
|
+
}
|
|
297
|
+
:scope[size="lg"] {
|
|
298
|
+
--tag-px: var(--tag-px-lg);
|
|
299
|
+
--tag-py: var(--tag-py-lg);
|
|
300
|
+
--tag-font: var(--tag-font-lg);
|
|
301
|
+
}
|
|
224
302
|
|
|
225
303
|
/* hover rule moved outside @scope — see Safari 17.x bug note at top. */
|
|
226
304
|
|
package/components/tag/tag.d.ts
CHANGED
|
@@ -41,26 +41,36 @@ export class UITag extends UIElement {
|
|
|
41
41
|
/** Tag label. Renderer routes this to the `text` attribute, rendered via CSS attr(text) on ::after. */
|
|
42
42
|
textContent: string;
|
|
43
43
|
/** Fill style — orthogonal to [variant]. Three values:
|
|
44
|
-
- `
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
- `muted` (default for the family variants — info/success/warning/
|
|
45
|
+
danger/primary — gh#864: tag and badge were swapped relative to
|
|
46
|
+
their reported default formulas; this restores tag's own)
|
|
47
|
+
— tinted bg with scheme-paired text. Matches <badge-ui>'s
|
|
48
|
+
`[tone="muted"]` look. Use on metadata / citation chips in dense
|
|
49
|
+
lists or tables where a saturated fill would compete for
|
|
50
|
+
attention (gh#778's oversized-pill concern). Does NOT apply to
|
|
51
|
+
the family-less `default` variant, which stays solid
|
|
52
|
+
unconditionally (gh#794, unaffected by gh#864) — a bare
|
|
53
|
+
`<tag-ui text="…">` still renders that solid look with no
|
|
54
|
+
attributes at all.
|
|
55
|
+
- `solid` — saturated bg + on-strong (near-white) text. The chip
|
|
56
|
+
IS the state. Opt in explicitly for a family variant (gh#864),
|
|
57
|
+
or it's already the unconditional look for the family-less
|
|
58
|
+
`default` variant (gh#794).
|
|
49
59
|
- `outline` — transparent bg + family-colored border + family-colored
|
|
50
60
|
text. The lightest visual weight; good in dense data tables or
|
|
51
61
|
faceted filter rows where multiple chips would otherwise compete.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
62
|
+
`tone` is a declarative presentational attribute (not a reactive
|
|
63
|
+
prop — see tag.class.js) so its schema `default` here is documentation
|
|
64
|
+
of the rendered-by-default look, not a reflected attribute value.
|
|
55
65
|
*/
|
|
56
66
|
tone: 'solid' | 'muted' | 'outline';
|
|
57
|
-
/** Semantic variant — `default |
|
|
58
|
-
variant: 'default' | '
|
|
67
|
+
/** Semantic variant — `default | info | success | warning | danger | primary`. `primary` is brand emphasis for non-semantic labels — a filter chip or taxonomy tag that shouldn't imply a success/warning/danger state. Mirrors <badge-ui>'s `primary` variant token-for-token (`accent` retired, gh#874 — the capability survives renamed, sibling parity with badge preserved). */
|
|
68
|
+
variant: 'default' | 'info' | 'success' | 'warning' | 'danger' | 'primary';
|
|
59
69
|
|
|
70
|
+
addEventListener(type: 'remove', listener: (ev: TagRemoveEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
60
71
|
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
61
72
|
type: K,
|
|
62
73
|
listener: (this: UITag, ev: HTMLElementEventMap[K]) => unknown,
|
|
63
74
|
options?: boolean | AddEventListenerOptions,
|
|
64
75
|
): void;
|
|
65
|
-
addEventListener(type: 'remove', listener: (ev: TagRemoveEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
66
76
|
}
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
<tag-ui text="Default"></tag-ui>
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## size
|
|
10
10
|
|
|
11
11
|
```html
|
|
12
|
-
<tag-ui text="
|
|
12
|
+
<tag-ui text="Small" size="sm"></tag-ui>
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## removable
|
|
16
16
|
|
|
17
17
|
```html
|
|
18
|
-
<tag-ui text="
|
|
18
|
+
<tag-ui text="Removable" removable></tag-ui>
|
|
19
19
|
```
|