use-wc 1.0.0-pre.75 → 1.0.0-pre.77
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/custom-elements.json +70 -70
- package/dist/design-system.css +112 -1
- package/dist/tokens.css +27 -3
- package/package.json +1 -1
- package/vscode.html-custom-data.json +12 -12
package/custom-elements.json
CHANGED
|
@@ -89,6 +89,76 @@
|
|
|
89
89
|
}
|
|
90
90
|
]
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
"kind": "javascript-module",
|
|
94
|
+
"path": "src/elements/use-avatar/use-avatar.ts",
|
|
95
|
+
"declarations": [
|
|
96
|
+
{
|
|
97
|
+
"kind": "class",
|
|
98
|
+
"description": "`use-avatar` renders a small, fixed-size, clipped container for a person or entity's\nlikeness. Slot in an `<img>` (or `<picture>`) for a photo, an inline `<svg>` for a\ngenerated or stylized mark, or arbitrary markup (a `<div>` of initials, a calendar badge);\nwhatever is slotted is centered and clipped to the avatar's shape. With nothing slotted,\n`use-avatar` falls back to initials derived from the `name` attribute.\n\n```html\n<use-avatar><img src=\"ada.jpg\" alt=\"\" /></use-avatar>\n<use-avatar name=\"Riley Quinn\"></use-avatar>\n<use-avatar><svg viewBox=\"0 0 32 32\">…</svg></use-avatar>\n```\n\nSize it with plain CSS — `inline-size` for the size and `aspect-ratio` for the proportions —\nfrom a stylesheet, a style attribute, or the design system's theme layer. The element takes no\ncustom properties of its own: it is a query container, so the initials scale from whatever box\nit ends up with. A non-square `aspect-ratio` suits a wide thumbnail or poster.\n\nThe element clips its content but gives it no shape of its own — that is the theme's, through\nthe affordance classes it defines: `.circle` (the themed default), `.square`, `.squircle` in\n`theme/avatar.css`. A circle only reads right at a `1` ratio, so a wide avatar wants one of the\nothers.\n\nThe element takes no ARIA role of its own. A slotted `<img>` carries its own `alt`, and the\ninitials fallback is plain text in the accessibility tree — an avatar is decorative beside a\nname far more often than it is the name itself, so labelling it here would mean announcing\nthat name twice.",
|
|
99
|
+
"name": "UseAvatar",
|
|
100
|
+
"cssParts": [
|
|
101
|
+
{
|
|
102
|
+
"description": "The span that renders the `name` fallback.",
|
|
103
|
+
"name": "initials"
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
"slots": [
|
|
107
|
+
{
|
|
108
|
+
"description": "The avatar's content: an `<img>`/`<picture>`, an `<svg>`, or arbitrary markup. Left empty, the `name` attribute's initials are shown instead, as the slot's own fallback. A photo fills the frame and crops; anything else keeps its own size, capped at the frame. Give an `<svg>` a `width`/`height` — without one it defaults to filling the box, and a rounded shape will clip its corners.",
|
|
109
|
+
"name": ""
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"members": [
|
|
113
|
+
{
|
|
114
|
+
"kind": "field",
|
|
115
|
+
"name": "name",
|
|
116
|
+
"type": {
|
|
117
|
+
"text": "string"
|
|
118
|
+
},
|
|
119
|
+
"default": "\"\"",
|
|
120
|
+
"attribute": "name",
|
|
121
|
+
"reflects": true
|
|
122
|
+
}
|
|
123
|
+
],
|
|
124
|
+
"attributes": [
|
|
125
|
+
{
|
|
126
|
+
"description": "The full name, used for the initials fallback (first + last whitespace-separated token, uppercased) when the slot is empty.",
|
|
127
|
+
"name": "name",
|
|
128
|
+
"type": {
|
|
129
|
+
"text": "string"
|
|
130
|
+
},
|
|
131
|
+
"default": "\"\"",
|
|
132
|
+
"fieldName": "name"
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
"superclass": {
|
|
136
|
+
"name": "LitElement",
|
|
137
|
+
"package": "lit"
|
|
138
|
+
},
|
|
139
|
+
"tagName": "use-avatar",
|
|
140
|
+
"customElement": true
|
|
141
|
+
}
|
|
142
|
+
],
|
|
143
|
+
"exports": [
|
|
144
|
+
{
|
|
145
|
+
"kind": "js",
|
|
146
|
+
"name": "UseAvatar",
|
|
147
|
+
"declaration": {
|
|
148
|
+
"name": "UseAvatar",
|
|
149
|
+
"module": "src/elements/use-avatar/use-avatar.ts"
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"kind": "custom-element-definition",
|
|
154
|
+
"name": "use-avatar",
|
|
155
|
+
"declaration": {
|
|
156
|
+
"name": "UseAvatar",
|
|
157
|
+
"module": "src/elements/use-avatar/use-avatar.ts"
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
},
|
|
92
162
|
{
|
|
93
163
|
"kind": "javascript-module",
|
|
94
164
|
"path": "src/elements/use-badge/use-badge.ts",
|
|
@@ -232,76 +302,6 @@
|
|
|
232
302
|
}
|
|
233
303
|
]
|
|
234
304
|
},
|
|
235
|
-
{
|
|
236
|
-
"kind": "javascript-module",
|
|
237
|
-
"path": "src/elements/use-avatar/use-avatar.ts",
|
|
238
|
-
"declarations": [
|
|
239
|
-
{
|
|
240
|
-
"kind": "class",
|
|
241
|
-
"description": "`use-avatar` renders a small, fixed-size, clipped container for a person or entity's\nlikeness. Slot in an `<img>` (or `<picture>`) for a photo, an inline `<svg>` for a\ngenerated or stylized mark, or arbitrary markup (a `<div>` of initials, a calendar badge);\nwhatever is slotted is centered and clipped to the avatar's shape. With nothing slotted,\n`use-avatar` falls back to initials derived from the `name` attribute.\n\n```html\n<use-avatar><img src=\"ada.jpg\" alt=\"\" /></use-avatar>\n<use-avatar name=\"Riley Quinn\"></use-avatar>\n<use-avatar><svg viewBox=\"0 0 32 32\">…</svg></use-avatar>\n```\n\nSize it with plain CSS — `inline-size` for the size and `aspect-ratio` for the proportions —\nfrom a stylesheet, a style attribute, or the design system's theme layer. The element takes no\ncustom properties of its own: it is a query container, so the initials scale from whatever box\nit ends up with. A non-square `aspect-ratio` suits a wide thumbnail or poster.\n\nThe element clips its content but gives it no shape of its own — that is the theme's, through\nthe affordance classes it defines: `.circle` (the themed default), `.square`, `.squircle` in\n`theme/avatar.css`. A circle only reads right at a `1` ratio, so a wide avatar wants one of the\nothers.\n\nThe element takes no ARIA role of its own. A slotted `<img>` carries its own `alt`, and the\ninitials fallback is plain text in the accessibility tree — an avatar is decorative beside a\nname far more often than it is the name itself, so labelling it here would mean announcing\nthat name twice.",
|
|
242
|
-
"name": "UseAvatar",
|
|
243
|
-
"cssParts": [
|
|
244
|
-
{
|
|
245
|
-
"description": "The span that renders the `name` fallback.",
|
|
246
|
-
"name": "initials"
|
|
247
|
-
}
|
|
248
|
-
],
|
|
249
|
-
"slots": [
|
|
250
|
-
{
|
|
251
|
-
"description": "The avatar's content: an `<img>`/`<picture>`, an `<svg>`, or arbitrary markup. Left empty, the `name` attribute's initials are shown instead, as the slot's own fallback. A photo fills the frame and crops; anything else keeps its own size, capped at the frame. Give an `<svg>` a `width`/`height` — without one it defaults to filling the box, and a rounded shape will clip its corners.",
|
|
252
|
-
"name": ""
|
|
253
|
-
}
|
|
254
|
-
],
|
|
255
|
-
"members": [
|
|
256
|
-
{
|
|
257
|
-
"kind": "field",
|
|
258
|
-
"name": "name",
|
|
259
|
-
"type": {
|
|
260
|
-
"text": "string"
|
|
261
|
-
},
|
|
262
|
-
"default": "\"\"",
|
|
263
|
-
"attribute": "name",
|
|
264
|
-
"reflects": true
|
|
265
|
-
}
|
|
266
|
-
],
|
|
267
|
-
"attributes": [
|
|
268
|
-
{
|
|
269
|
-
"description": "The full name, used for the initials fallback (first + last whitespace-separated token, uppercased) when the slot is empty.",
|
|
270
|
-
"name": "name",
|
|
271
|
-
"type": {
|
|
272
|
-
"text": "string"
|
|
273
|
-
},
|
|
274
|
-
"default": "\"\"",
|
|
275
|
-
"fieldName": "name"
|
|
276
|
-
}
|
|
277
|
-
],
|
|
278
|
-
"superclass": {
|
|
279
|
-
"name": "LitElement",
|
|
280
|
-
"package": "lit"
|
|
281
|
-
},
|
|
282
|
-
"tagName": "use-avatar",
|
|
283
|
-
"customElement": true
|
|
284
|
-
}
|
|
285
|
-
],
|
|
286
|
-
"exports": [
|
|
287
|
-
{
|
|
288
|
-
"kind": "js",
|
|
289
|
-
"name": "UseAvatar",
|
|
290
|
-
"declaration": {
|
|
291
|
-
"name": "UseAvatar",
|
|
292
|
-
"module": "src/elements/use-avatar/use-avatar.ts"
|
|
293
|
-
}
|
|
294
|
-
},
|
|
295
|
-
{
|
|
296
|
-
"kind": "custom-element-definition",
|
|
297
|
-
"name": "use-avatar",
|
|
298
|
-
"declaration": {
|
|
299
|
-
"name": "UseAvatar",
|
|
300
|
-
"module": "src/elements/use-avatar/use-avatar.ts"
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
]
|
|
304
|
-
},
|
|
305
305
|
{
|
|
306
306
|
"kind": "javascript-module",
|
|
307
307
|
"path": "src/elements/use-calendar-base/use-calendar-base.ts",
|
package/dist/design-system.css
CHANGED
|
@@ -68,7 +68,13 @@
|
|
|
68
68
|
--usewc-color-input-border: var(--usewc-color-input-border-hover);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
/* Matches the hover rule's own specificity (a real pseudo-class, not `:where()`-zeroed) so
|
|
72
|
+
that when both apply at once — hovering a focused control — source order decides and this,
|
|
73
|
+
declared after, wins; wrapping this in `:where()` as before let hover's specificity beat
|
|
74
|
+
it regardless of order. */
|
|
75
|
+
&:focus,
|
|
76
|
+
&:focus-within,
|
|
77
|
+
&:has(input:focus) {
|
|
72
78
|
--usewc-color-input-border: var(--usewc-color-input-border-focus);
|
|
73
79
|
--usewc-effect-outline-width: var(--usewc-effect-outline-size);
|
|
74
80
|
}
|
|
@@ -1528,6 +1534,11 @@
|
|
|
1528
1534
|
border-inline-start so it can sit shorter than the cell rather than spanning it. */
|
|
1529
1535
|
use-gridhead use-gridcell[role="columnheader"] {
|
|
1530
1536
|
position: relative;
|
|
1537
|
+
/* A header with no label has no line box, so its own height (and the divider's `%`
|
|
1538
|
+
height off it) would otherwise collapse to just the cell's own block padding —
|
|
1539
|
+
reserve the same total height a labeled cell gets (padding plus a full line) so an
|
|
1540
|
+
unlabeled column still gets a full-height divider next to its neighbors. */
|
|
1541
|
+
min-block-size: calc(var(--usewc-layout-grid-cell-line-height) + var(--usewc-layout-grid-cell-padding-block) * 2);
|
|
1531
1542
|
|
|
1532
1543
|
use-theme-escape & {
|
|
1533
1544
|
all: revert-layer;
|
|
@@ -1576,6 +1587,106 @@
|
|
|
1576
1587
|
}
|
|
1577
1588
|
}
|
|
1578
1589
|
|
|
1590
|
+
/* Marks the row's primary identifying column (a name, say, beside secondary detail columns)
|
|
1591
|
+
so it reads heavier than the rest of the row without going all the way to a heading. */
|
|
1592
|
+
use-gridcell.primary {
|
|
1593
|
+
font-weight: var(--usewc-font-grid-cell-primary-weight);
|
|
1594
|
+
|
|
1595
|
+
use-theme-escape & {
|
|
1596
|
+
all: revert-layer;
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
/* A column header can host a sortable label alongside a further control (a trailing
|
|
1601
|
+
filter/menu button, say) instead of just plain text — `.control` opts a native button or
|
|
1602
|
+
link into reading as that label, in place of detecting one by DOM shape (a lone child),
|
|
1603
|
+
which doesn't hold once a second control joins it. The cell becomes their flex row; its own
|
|
1604
|
+
padding moves onto `.control` below so its hover band fills exactly its own clickable area,
|
|
1605
|
+
and what's left on the cell becomes the gap held clear of the divider beside it. */
|
|
1606
|
+
use-gridhead use-gridcell[role="columnheader"]:has(> .control) {
|
|
1607
|
+
display: flex;
|
|
1608
|
+
align-items: center;
|
|
1609
|
+
gap: var(--usewc-layout-grid-header-control-gap);
|
|
1610
|
+
padding: 0;
|
|
1611
|
+
padding-inline: var(--usewc-layout-grid-header-control-gap);
|
|
1612
|
+
|
|
1613
|
+
use-theme-escape & {
|
|
1614
|
+
all: revert-layer;
|
|
1615
|
+
}
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1618
|
+
/* `all: unset` strips the control's native chrome (button chrome, link color/underline); only
|
|
1619
|
+
what's needed to lay it out and read as header text is re-declared. It grows to fill the
|
|
1620
|
+
row, the same as a plain text label would — a further control alongside it (a filter/menu
|
|
1621
|
+
icon, say) is a plain themed button instead, not `.control`, so it keeps its own natural
|
|
1622
|
+
size and chrome rather than stretching or reading as header text itself. */
|
|
1623
|
+
use-gridhead use-gridcell[role="columnheader"] > .control {
|
|
1624
|
+
all: unset;
|
|
1625
|
+
box-sizing: border-box;
|
|
1626
|
+
display: inline-flex;
|
|
1627
|
+
align-items: center;
|
|
1628
|
+
flex: 1 1 auto;
|
|
1629
|
+
block-size: var(--usewc-layout-grid-header-control-height);
|
|
1630
|
+
padding-inline: var(--usewc-layout-grid-cell-padding-inline);
|
|
1631
|
+
border-radius: var(--usewc-effect-grid-header-control-border-radius);
|
|
1632
|
+
color: inherit;
|
|
1633
|
+
font: inherit;
|
|
1634
|
+
cursor: pointer;
|
|
1635
|
+
--usewc-effect-outline-width: 0;
|
|
1636
|
+
outline: var(--usewc-effect-outline-width) var(--usewc-effect-outline-style) var(--usewc-color-outline);
|
|
1637
|
+
/* Flush rather than the default offset — the control already sits inset from the divider
|
|
1638
|
+
by its own gap, and an outset ring would eat into that gap and paint under the divider,
|
|
1639
|
+
the same reason the plain cell outline below stays flush against its own edge. */
|
|
1640
|
+
outline-offset: var(--usewc-effect-outline-offset-flush);
|
|
1641
|
+
transition: var(--usewc-transition-control), var(--usewc-effect-outline-transition);
|
|
1642
|
+
|
|
1643
|
+
&:is(:hover, :focus-visible) {
|
|
1644
|
+
background-color: var(--usewc-color-grid-header-control-background-hover);
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
&:focus-visible {
|
|
1648
|
+
--usewc-effect-outline-width: var(--usewc-effect-outline-size);
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1651
|
+
use-theme-escape & {
|
|
1652
|
+
all: revert-layer;
|
|
1653
|
+
}
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1656
|
+
/* A sort direction glyph after a `.control` label — only the WAI-ARIA grid pattern's own
|
|
1657
|
+
`aria-sort="ascending"/"descending"` on the header cell paints one, so a plain sortable
|
|
1658
|
+
column (no sort applied yet, or `aria-sort="none"`) stays glyph-free rather than reserving
|
|
1659
|
+
dead space for it. */
|
|
1660
|
+
use-gridhead
|
|
1661
|
+
use-gridcell[role="columnheader"]:is([aria-sort="ascending"], [aria-sort="descending"])
|
|
1662
|
+
> .control::after {
|
|
1663
|
+
content: "";
|
|
1664
|
+
display: inline-block;
|
|
1665
|
+
flex: none;
|
|
1666
|
+
inline-size: var(--usewc-layout-grid-sort-indicator-size);
|
|
1667
|
+
block-size: var(--usewc-layout-grid-sort-indicator-size);
|
|
1668
|
+
margin-inline-start: var(--usewc-layout-grid-sort-indicator-gap);
|
|
1669
|
+
background-color: var(--usewc-effect-grid-sort-indicator-color);
|
|
1670
|
+
mask-size: contain;
|
|
1671
|
+
mask-repeat: no-repeat;
|
|
1672
|
+
mask-position: center;
|
|
1673
|
+
}
|
|
1674
|
+
|
|
1675
|
+
use-theme-escape
|
|
1676
|
+
use-gridhead
|
|
1677
|
+
use-gridcell[role="columnheader"]:is([aria-sort="ascending"], [aria-sort="descending"])
|
|
1678
|
+
> .control::after {
|
|
1679
|
+
all: revert-layer;
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1682
|
+
use-gridhead use-gridcell[role="columnheader"][aria-sort="ascending"] > .control::after {
|
|
1683
|
+
mask-image: var(--usewc-effect-grid-sort-indicator-ascending-mask-image);
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
use-gridhead use-gridcell[role="columnheader"][aria-sort="descending"] > .control::after {
|
|
1687
|
+
mask-image: var(--usewc-effect-grid-sort-indicator-descending-mask-image);
|
|
1688
|
+
}
|
|
1689
|
+
|
|
1579
1690
|
/* A cell whose only content is a selection control sizes to that control instead of taking
|
|
1580
1691
|
an equal flex share like a data column (use-gridrow's shadow makes every cell `flex: 1 1 0`
|
|
1581
1692
|
by default), and tightens its inline padding so the checkbox doesn't sit in a wide gutter.
|
package/dist/tokens.css
CHANGED
|
@@ -209,7 +209,7 @@
|
|
|
209
209
|
since relative-color syntax reading a `var()` only resolves reliably when the referenced
|
|
210
210
|
custom property lives on the same rule; `link.css` does the actual derivation locally,
|
|
211
211
|
alongside the (also local) `--usewc-local-link-text` it reads from. */
|
|
212
|
-
--usewc-effect-link-decoration-opacity: 0.
|
|
212
|
+
--usewc-effect-link-decoration-opacity: 0.3;
|
|
213
213
|
--usewc-effect-link-chrome-text-decoration: none;
|
|
214
214
|
/* - Sidebar nav item */
|
|
215
215
|
/* A sidebar item reads as chrome, not a hyperlink, so its text stays the document's own ink
|
|
@@ -624,6 +624,29 @@
|
|
|
624
624
|
--usewc-layout-grid-selector-cell-padding-inline: var(--usewc-space-4);
|
|
625
625
|
--usewc-font-grid-header-weight: var(--usewc-font-weight-medium);
|
|
626
626
|
--usewc-effect-grid-border-radius: var(--usewc-effect-border-radius-8);
|
|
627
|
+
/* A sortable/actionable header — a bare button or link filling the whole header cell — reads as
|
|
628
|
+
plain header text at rest and only reveals itself as interactive on hover, the same wash
|
|
629
|
+
`popover-menu-item` and the selector controls already share. */
|
|
630
|
+
--usewc-color-grid-header-control-background-hover: var(--usewc-color-selector-background-hover);
|
|
631
|
+
--usewc-effect-grid-header-control-border-radius: var(--usewc-effect-border-radius-4);
|
|
632
|
+
/* Shorter than a data cell's own block padding would produce — the hover band reads as a tight
|
|
633
|
+
label chip, not a second, taller row stacked under the divider. */
|
|
634
|
+
--usewc-layout-grid-header-control-height: var(--usewc-space-32);
|
|
635
|
+
/* Keeps the hover band's rounded corners clear of the column divider beside it, so the two
|
|
636
|
+
never visually merge. */
|
|
637
|
+
--usewc-layout-grid-header-control-gap: var(--usewc-space-4);
|
|
638
|
+
/* A sortable column's own direction glyph — reuses the same caret shapes `dropdown-trigger` and
|
|
639
|
+
`tree-item` already mask in, rather than rotating a single icon, so up/down stay crisp at any
|
|
640
|
+
angle. Only paints when the header cell carries a real `aria-sort="ascending"/"descending"`,
|
|
641
|
+
the same WAI-ARIA grid pattern a consumer's own sort handler would already be setting. */
|
|
642
|
+
--usewc-effect-grid-sort-indicator-ascending-mask-image: var(--usewc-icon-caret-block-start);
|
|
643
|
+
--usewc-effect-grid-sort-indicator-descending-mask-image: var(--usewc-icon-caret-block-end);
|
|
644
|
+
--usewc-effect-grid-sort-indicator-color: currentColor;
|
|
645
|
+
--usewc-layout-grid-sort-indicator-size: 1em;
|
|
646
|
+
--usewc-layout-grid-sort-indicator-gap: var(--usewc-space-4);
|
|
647
|
+
/* A cell marking the row's primary identifying column (a name, say, next to secondary detail
|
|
648
|
+
columns) — heavier than the surrounding body text without reading as a heading. */
|
|
649
|
+
--usewc-font-grid-cell-primary-weight: var(--usewc-font-weight-medium);
|
|
627
650
|
/* -- Compact variant (`.compact`): a shorter line-height and tighter block padding / row gap,
|
|
628
651
|
the same way button's small size steps down from its base. */
|
|
629
652
|
--usewc-layout-grid-compact-cell-line-height: var(--usewc-line-height-20);
|
|
@@ -835,7 +858,7 @@
|
|
|
835
858
|
--usewc-color-outline: var(--usewc-color-blue-400);
|
|
836
859
|
--usewc-color-prose-code-background: var(--usewc-color-gray-900);
|
|
837
860
|
--usewc-color-input-background-static: oklch(from var(--usewc-color-gray-100) l c h / 0.025);
|
|
838
|
-
--usewc-color-input-border-static: var(--usewc-color-gray-
|
|
861
|
+
--usewc-color-input-border-static: var(--usewc-color-gray-800);
|
|
839
862
|
--usewc-color-input-text-static: var(--usewc-color-gray-200);
|
|
840
863
|
--usewc-color-input-text-placeholder: var(--usewc-color-gray-500);
|
|
841
864
|
--usewc-color-form-label-text: var(--usewc-color-gray-100);
|
|
@@ -893,8 +916,9 @@
|
|
|
893
916
|
--usewc-color-link-text-static: var(--usewc-color-blue-400);
|
|
894
917
|
--usewc-color-link-text-hover: var(--usewc-color-blue-500);
|
|
895
918
|
--usewc-color-link-text-active: var(--usewc-color-blue-600);
|
|
919
|
+
--usewc-effect-link-decoration-opacity: 0.5;
|
|
896
920
|
--usewc-color-code-text: var(--usewc-color-red-200);
|
|
897
|
-
--usewc-color-input-border-hover: var(--usewc-color-gray-
|
|
921
|
+
--usewc-color-input-border-hover: var(--usewc-color-gray-700);
|
|
898
922
|
--usewc-color-input-border-focus: var(--usewc-color-blue-400);
|
|
899
923
|
--usewc-color-input-border-invalid: var(--usewc-color-red-300);
|
|
900
924
|
--usewc-color-input-segment-background-focus: var(--usewc-color-blue-100);
|
package/package.json
CHANGED
|
@@ -19,6 +19,18 @@
|
|
|
19
19
|
],
|
|
20
20
|
"references": []
|
|
21
21
|
},
|
|
22
|
+
{
|
|
23
|
+
"name": "use-avatar",
|
|
24
|
+
"description": "`use-avatar` renders a small, fixed-size, clipped container for a person or entity's\nlikeness. Slot in an `<img>` (or `<picture>`) for a photo, an inline `<svg>` for a\ngenerated or stylized mark, or arbitrary markup (a `<div>` of initials, a calendar badge);\nwhatever is slotted is centered and clipped to the avatar's shape. With nothing slotted,\n`use-avatar` falls back to initials derived from the `name` attribute.\n\n```html\n<use-avatar><img src=\"ada.jpg\" alt=\"\" /></use-avatar>\n<use-avatar name=\"Riley Quinn\"></use-avatar>\n<use-avatar><svg viewBox=\"0 0 32 32\">…</svg></use-avatar>\n```\n\nSize it with plain CSS — `inline-size` for the size and `aspect-ratio` for the proportions —\nfrom a stylesheet, a style attribute, or the design system's theme layer. The element takes no\ncustom properties of its own: it is a query container, so the initials scale from whatever box\nit ends up with. A non-square `aspect-ratio` suits a wide thumbnail or poster.\n\nThe element clips its content but gives it no shape of its own — that is the theme's, through\nthe affordance classes it defines: `.circle` (the themed default), `.square`, `.squircle` in\n`theme/avatar.css`. A circle only reads right at a `1` ratio, so a wide avatar wants one of the\nothers.\n\nThe element takes no ARIA role of its own. A slotted `<img>` carries its own `alt`, and the\ninitials fallback is plain text in the accessibility tree — an avatar is decorative beside a\nname far more often than it is the name itself, so labelling it here would mean announcing\nthat name twice.\n---\n\n\n### **Slots:**\n - _default_ - The avatar's content: an `<img>`/`<picture>`, an `<svg>`, or arbitrary markup. Left empty, the `name` attribute's initials are shown instead, as the slot's own fallback. A photo fills the frame and crops; anything else keeps its own size, capped at the frame. Give an `<svg>` a `width`/`height` — without one it defaults to filling the box, and a rounded shape will clip its corners.\n\n### **CSS Parts:**\n - **initials** - The span that renders the `name` fallback.",
|
|
25
|
+
"attributes": [
|
|
26
|
+
{
|
|
27
|
+
"name": "name",
|
|
28
|
+
"description": "The full name, used for the initials fallback (first + last whitespace-separated token, uppercased) when the slot is empty.",
|
|
29
|
+
"values": []
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"references": []
|
|
33
|
+
},
|
|
22
34
|
{
|
|
23
35
|
"name": "use-badge",
|
|
24
36
|
"description": "`use-badge` renders a small indicator anchored to another element's corner, using\n[CSS anchor positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning)\ninstead of the classic `position: absolute` + negative-offset trick. This lets the badge live\nanywhere in the DOM rather than being a child of the element it decorates. A badge's shape,\ncolor, and positioning ship built in — reading from the design system's tokens when\n`tokens.css` is loaded, and falling back to sensible defaults otherwise — so no theme is\nrequired to get a working, visible badge.\n\nPoint a badge at its target with the `anchortarget` attribute, set to the target's `id`\n(named to avoid colliding with the `anchor` content attribute HTML is gaining natively):\n\n```html\n<button type=\"button\" id=\"inbox\">Inbox</button>\n<use-badge anchortarget=\"inbox\">99+</use-badge>\n```\n\nThe badge and its anchor must live in the same DOM tree — a badge cannot reach an anchor\ninside another component's shadow root, and an anchor's `anchor-name` set inside a shadow\ntree's stylesheet is not visible here. No positioned ancestor or shared containing block is\nrequired: anchor positioning resolves the badge's location straight from the anchor's own\ngeometry, so the badge can sit anywhere else in the DOM tree.\n\nWithout a resolved anchor — `anchortarget` unset, pointing at a missing id, or `anchorElement`\nnever assigned — the badge has no `:state(anchored)` and renders as a plain inline chip in\nnormal document flow, still using the same color/shape styling.\n\nSome components render their host as `display: contents`, which has no box of its own for CSS\nanchor positioning to resolve against. If the anchor computes a non-empty `--usewc-anchor-name`\ncustom property, the badge uses that dashed-ident as its `position-anchor` directly instead of\ngenerating and writing its own onto the anchor — letting a component publish the name of a\nreal, box-generating part of itself (already established for its own purposes) for badges to\ntarget instead of its host, even though that part lives inside the component's own shadow root.\nThis mechanism is shared with `use-menu`/`use-anchored` via `AnchorController`; components\nwithout a `display: contents` host don't need to publish anything.\n\n**Known Firefox limitation:** anchoring across a shadow root boundary this way — the case\n`--usewc-anchor-name` exists for — is mispositioned in Firefox as of this writing. Verified\ndirectly: `anchor()`'s logical `start`/`end` keywords resolve backwards on both axes\nspecifically for a cross-shadow-root anchor reference, in Firefox only — the same anchor()\ncalls resolve correctly for a same-tree anchor in Firefox, and cross-shadow anchoring resolves\ncorrectly in Chromium and Safari. A badge anchored to a plain element (button, input, anything\nthat isn't itself relying on this escape hatch) is unaffected in every engine, including\nFirefox.\n\n## Side effects\n\nThe badge is a sibling of its anchor rather than a child, so **as a side effect, a badge\nmutates its anchor element**: it appends its own id to the anchor's `aria-describedby`\n(preserving any ids already there, the same way `anchor-name` is appended rather than\nreplaced) to keep its content connected to the anchor for assistive technology. This means a\nbadge's content, or its `aria-label` when set, is announced as part of interacting with the\nanchor, e.g. \"Inbox button, 3\". A `dot` badge has no content of its own, so set `aria-label`\ndirectly on `<use-badge>` for a meaningful description (e.g. `aria-label=\"3 unread messages\"`);\nwithout one, the description contributes nothing and the anchor announces as before.\n\nAvoid adding `aria-hidden` to `<use-badge>` if you rely on this: while the description\ncomputation is specified to still read a hidden node when it's the direct target of\n`aria-describedby`, support for that specific case is inconsistent across browsers and screen\nreaders.\n\nSet `options=\"noaria\"` to opt a badge out of this and leave the anchor's `aria-describedby`\nuntouched, e.g. when the anchor already documents the badge's meaning some other way.\n---\n\n\n### **Slots:**\n - _default_ - Badge content, e.g. a count or short label. Ignored when `dot` is set.",
|
|
@@ -51,18 +63,6 @@
|
|
|
51
63
|
],
|
|
52
64
|
"references": []
|
|
53
65
|
},
|
|
54
|
-
{
|
|
55
|
-
"name": "use-avatar",
|
|
56
|
-
"description": "`use-avatar` renders a small, fixed-size, clipped container for a person or entity's\nlikeness. Slot in an `<img>` (or `<picture>`) for a photo, an inline `<svg>` for a\ngenerated or stylized mark, or arbitrary markup (a `<div>` of initials, a calendar badge);\nwhatever is slotted is centered and clipped to the avatar's shape. With nothing slotted,\n`use-avatar` falls back to initials derived from the `name` attribute.\n\n```html\n<use-avatar><img src=\"ada.jpg\" alt=\"\" /></use-avatar>\n<use-avatar name=\"Riley Quinn\"></use-avatar>\n<use-avatar><svg viewBox=\"0 0 32 32\">…</svg></use-avatar>\n```\n\nSize it with plain CSS — `inline-size` for the size and `aspect-ratio` for the proportions —\nfrom a stylesheet, a style attribute, or the design system's theme layer. The element takes no\ncustom properties of its own: it is a query container, so the initials scale from whatever box\nit ends up with. A non-square `aspect-ratio` suits a wide thumbnail or poster.\n\nThe element clips its content but gives it no shape of its own — that is the theme's, through\nthe affordance classes it defines: `.circle` (the themed default), `.square`, `.squircle` in\n`theme/avatar.css`. A circle only reads right at a `1` ratio, so a wide avatar wants one of the\nothers.\n\nThe element takes no ARIA role of its own. A slotted `<img>` carries its own `alt`, and the\ninitials fallback is plain text in the accessibility tree — an avatar is decorative beside a\nname far more often than it is the name itself, so labelling it here would mean announcing\nthat name twice.\n---\n\n\n### **Slots:**\n - _default_ - The avatar's content: an `<img>`/`<picture>`, an `<svg>`, or arbitrary markup. Left empty, the `name` attribute's initials are shown instead, as the slot's own fallback. A photo fills the frame and crops; anything else keeps its own size, capped at the frame. Give an `<svg>` a `width`/`height` — without one it defaults to filling the box, and a rounded shape will clip its corners.\n\n### **CSS Parts:**\n - **initials** - The span that renders the `name` fallback.",
|
|
57
|
-
"attributes": [
|
|
58
|
-
{
|
|
59
|
-
"name": "name",
|
|
60
|
-
"description": "The full name, used for the initials fallback (first + last whitespace-separated token, uppercased) when the slot is empty.",
|
|
61
|
-
"values": []
|
|
62
|
-
}
|
|
63
|
-
],
|
|
64
|
-
"references": []
|
|
65
|
-
},
|
|
66
66
|
{
|
|
67
67
|
"name": "use-calendarday",
|
|
68
68
|
"description": "A helper component for customizing specific days within `use-calendar`.\nContent placed inside this element will replace the default day number display.\n---\n\n\n### **Slots:**\n - **default** - slot for custom day content (replaces the day number)",
|