@threadlabs/looma 0.26.2 → 0.26.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.26.2",
3
+ "version": "0.26.4",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -61,6 +61,10 @@
61
61
  border-color: var(--ui-avatar-border, var(--ui-border-strong));
62
62
  }
63
63
 
64
+ :scope[data-ui-avatar-state~="shape=circle"] {
65
+ box-shadow: var(--ui-shadow-sm);
66
+ }
67
+
64
68
  :scope[data-ui-avatar-state~="shape=square"] {
65
69
  border-radius: var(--ui-avatar-radius, var(--ui-radius-md));
66
70
  }
@@ -124,25 +124,26 @@
124
124
  text-box-trim: none;
125
125
  }
126
126
 
127
- /* Text-only badges retain their trimmed inline baseline. Icon content needs a flex row;
128
- trimming its label separately keeps the glyph centered without changing adjacent lines. */
127
+ /* Center the capital/baseline text box, while clipping only inline overflow for ellipsis.
128
+ Vertical ink remains visible so trimming never cuts off ascenders or descenders. */
129
129
  @supports (text-box-trim: trim-both) {
130
130
  :scope {
131
131
  display: inline-block;
132
132
  min-block-size: var(--ui-badge-min-block-size, 1.5rem);
133
133
  text-align: center;
134
134
  align-content: center;
135
- text-box-trim: trim-both;
136
- text-box-edge: text;
135
+ text-box-trim: none;
137
136
  }
138
137
  :scope:has(.icon:not(:empty)),
139
138
  :scope:has(.label svg) {
140
139
  display: inline-flex;
141
140
  text-box-trim: none;
142
141
  }
143
- :scope:has(.icon:not(:empty)) .label {
142
+ .label:not(:has(svg)) {
144
143
  text-box-trim: trim-both;
145
- text-box-edge: text;
144
+ text-box-edge: cap alphabetic;
145
+ overflow-x: clip;
146
+ overflow-y: visible;
146
147
  }
147
148
  }
148
149
 
@@ -223,6 +224,29 @@
223
224
  --_badge-color-text: color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default));
224
225
  }
225
226
 
227
+ /* A translucent inverse surface picks up its filled control's tone. Deepen the tone ink
228
+ toward the theme text to retain contrast against that composed surface. */
229
+ :scope[data-ui-badge-state~="variant=inverse"] {
230
+ --_badge-color-surface: color-mix(in srgb, color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) 88%, transparent);
231
+ --_badge-color-border: var(--_badge-color-surface);
232
+ --_badge-color-text: color-mix(in srgb, var(--_badge-color-ink) 85%, var(--ui-text-primary));
233
+ --_badge-outline-surface: var(--ui-badge-surface, var(--_badge-color-surface, color-mix(in srgb, var(--_badge-text) 88%, transparent)));
234
+ border-color: var(--ui-badge-border, var(--_badge-color-border, color-mix(in srgb, var(--_badge-text) 88%, transparent)));
235
+ color: var(--ui-badge-text, var(--_badge-color-text, color-mix(in srgb, var(--_badge-surface) 85%, var(--ui-text-primary))));
236
+ /* Paint each translucent layer once, including the border, without a bright double-painted ring. */
237
+ background-clip: padding-box;
238
+ }
239
+
240
+ :scope[data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="shape=circle"] {
241
+ box-shadow: var(--ui-shadow-sm);
242
+ }
243
+
244
+ /* Neutral reverses a subtle surface/ink pair rather than a strong tone. Keep its original
245
+ surface ink: moving it toward dark-theme primary text would reduce overlay contrast. */
246
+ :scope[data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="tone=neutral"] {
247
+ color: var(--ui-badge-text, var(--_badge-color-text, var(--_badge-surface)));
248
+ }
249
+
226
250
  :scope[data-ui-badge-state~="variant=outline"] {
227
251
  --_badge-surface: var(--ui-surface-default);
228
252
  --_badge-border: var(--ui-border-strong);
@@ -276,6 +300,10 @@
276
300
  --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-3) * 2));
277
301
  }
278
302
 
303
+ :scope[data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=lg"] {
304
+ --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-4) * 2 + var(--ui-space-2)));
305
+ }
306
+
279
307
  :scope[data-ui-badge-state~="shape=square"] .label {
280
308
  display: inline-flex;
281
309
  align-items: center;
@@ -304,6 +332,10 @@
304
332
  --_badge-circle-size: var(--ui-badge-circle-size, var(--ui-space-4));
305
333
  }
306
334
 
335
+ :scope[data-ui-badge-state~="shape=circle"][data-ui-badge-state~="size=lg"] {
336
+ --_badge-circle-size: var(--ui-badge-circle-size, calc(var(--ui-space-4) * 2));
337
+ }
338
+
307
339
  :scope[data-ui-badge-state~="shape=circle"] .label {
308
340
  display: inline-flex;
309
341
  align-items: center;
@@ -316,6 +348,18 @@
316
348
  display: none;
317
349
  }
318
350
 
351
+ /* Center capital and numeral ink, rather than the font's ascent/descent line box.
352
+ Icon labels retain flex geometry; untrimmed browsers keep that fallback too. */
353
+ @supports (text-box-trim: trim-both) {
354
+ :scope[data-ui-badge-state~="shape=circle"] .label:not(:has(svg)),
355
+ :scope[data-ui-badge-state~="shape=square"] .label:not(:has(svg)) {
356
+ display: block;
357
+ text-box-trim: trim-both;
358
+ text-box-edge: cap alphabetic;
359
+ overflow: visible;
360
+ }
361
+ }
362
+
319
363
  /* A dot uses the badge's tone recipe; only its silhouette and visible label change. */
320
364
  :scope[data-ui-badge-state~="shape=dot"] {
321
365
  position: relative;
@@ -363,6 +407,10 @@
363
407
  pointer-events: none;
364
408
  }
365
409
 
410
+ :scope[data-ui-badge-state~="shape=tag"][data-ui-badge-state~="variant=inverse"] {
411
+ background: var(--ui-badge-border, var(--_badge-color-border, var(--_badge-text)));
412
+ }
413
+
366
414
  :scope[data-ui-badge-state~="shape=tag"]:dir(rtl) {
367
415
  padding-inline-end: var(--ui-badge-padding-inline, var(--ui-space-2));
368
416
  padding-inline-start: calc(var(--ui-badge-padding-inline, var(--ui-space-2)) + var(--_badge-point));
@@ -419,14 +467,20 @@
419
467
  margin-inline-end: var(--ui-space-1);
420
468
  }
421
469
 
422
- /* Text-only badges retain their trimmed inline baseline. Icon content needs a flex row;
423
- trimming its label separately keeps the glyph centered without changing adjacent lines. */
470
+ /* Center the capital/baseline text box, while clipping only inline overflow for ellipsis.
471
+ Vertical ink remains visible so trimming never cuts off ascenders or descenders. */
424
472
  @supports (text-box-trim: trim-both) {
425
473
  }
426
474
 
427
475
  /* A solid colour fills with the ink. Its text is the page surface, mixed at 0% only so that it too is
428
476
  invalid while the hook is unset. */
429
477
 
478
+ /* A translucent inverse surface picks up its filled control's tone. Deepen the tone ink
479
+ toward the theme text to retain contrast against that composed surface. */
480
+
481
+ /* Neutral reverses a subtle surface/ink pair rather than a strong tone. Keep its original
482
+ surface ink: moving it toward dark-theme primary text would reduce overlay contrast. */
483
+
430
484
  /* An icon mark keeps the existing tone recipe and follows the global spacing and radius. */
431
485
 
432
486
  :scope[data-ui-badge-state~="shape=square"] .label :where([data-slotted], [data-slotted] *):is(svg) {
@@ -439,6 +493,11 @@
439
493
  margin-inline-end: 0;
440
494
  }
441
495
 
496
+ /* Center capital and numeral ink, rather than the font's ascent/descent line box.
497
+ Icon labels retain flex geometry; untrimmed browsers keep that fallback too. */
498
+ @supports (text-box-trim: trim-both) {
499
+ }
500
+
442
501
  /* A dot uses the badge's tone recipe; only its silhouette and visible label change. */
443
502
 
444
503
  /* The clipped point needs an inset surface over an outer border-colour shape: a native border
@@ -66,7 +66,8 @@
66
66
  padding-inline-end: var(--ui-callout-padding-inline, var(--ui-space-3));
67
67
  border: var(--ui-callout-border-width, var(--ui-border-width)) solid
68
68
  color-mix(in srgb, var(--ui-callout-border, var(--_callout-border)) 35%, transparent);
69
- border-inline-start: var(--ui-callout-leading-border-width, var(--ui-accent-line-width)) solid var(--ui-callout-border, var(--_callout-border));
69
+ border-inline-start: var(--ui-callout-leading-border-width, var(--ui-callout-border-width, var(--ui-border-width))) solid
70
+ color-mix(in srgb, var(--ui-callout-border, var(--_callout-border)) 35%, transparent);
70
71
  border-radius: var(--ui-radius-md);
71
72
  background: var(--ui-callout-surface, var(--_callout-surface));
72
73
  color: var(--ui-callout-text, var(--ui-text-primary));
@@ -134,6 +134,16 @@
134
134
  line-height: var(--ui-line-height-tight);
135
135
  }
136
136
 
137
+ /* Keep identity and disclosure marks beside the first line, even with a long description. */
138
+ :scope[data-ui-list-item-state~="align=title"] {
139
+ align-items: flex-start;
140
+ }
141
+
142
+ :scope[data-ui-list-item-state~="align=title"] .leading,
143
+ :scope[data-ui-list-item-state~="align=title"] .trailing {
144
+ min-block-size: calc(var(--ui-font-size-md) * var(--ui-line-height-tight));
145
+ }
146
+
137
147
  .description {
138
148
  color: var(--ui-text-muted);
139
149
  font-size: var(--ui-font-size-sm);
@@ -180,6 +190,8 @@
180
190
 
181
191
  /* Trailing controls take their own clicks, above the title link's stretched hit area. */
182
192
 
193
+ /* Keep identity and disclosure marks beside the first line, even with a long description. */
194
+
183
195
  .title > :where([data-slotted], [data-slotted] *):is(a) {
184
196
  color: inherit;
185
197
  text-decoration: none;
@@ -125,30 +125,42 @@
125
125
  }
126
126
 
127
127
  .toast {
128
+ --_ui-toast-region-accent: var(--ui-border-strong);
129
+ --_ui-toast-region-tone-surface: var(--ui-surface-muted);
128
130
  display: grid;
129
131
  grid-template-columns: 1fr auto;
130
132
  gap: var(--ui-space-2);
131
133
  align-items: start;
132
- border: var(--ui-border-width) solid var(--_ui-toast-region-border, var(--ui-overlay-border, var(--ui-border-strong)));
134
+ border: var(--ui-border-width) solid var(--_ui-toast-region-border, var(--ui-overlay-border, var(--_ui-toast-region-accent)));
133
135
  border-radius: var(--_ui-toast-region-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
134
136
  padding: var(--ui-space-3) var(--ui-space-4);
135
- background: var(--_ui-toast-region-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
137
+ /* The close button's internal space supplies the rest of the trailing inset. */
138
+ padding-inline-end: var(--ui-space-2);
139
+ background: var(--_ui-toast-region-surface, var(--ui-overlay-surface, var(--_ui-toast-region-tone-surface)));
136
140
  color: var(--ui-text-primary);
141
+ font-family: var(--ui-font-family-sans);
142
+ font-size: var(--ui-font-size-sm);
143
+ font-weight: var(--ui-font-normal);
144
+ line-height: var(--ui-line-height-md);
137
145
  box-shadow: var(--_ui-toast-region-shadow, var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg))));
138
146
  animation: ui-toast-enter var(--_ui-toast-region-enter-duration, 0.32s) var(--ui-motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1)) both;
139
147
  }
140
148
 
141
149
  .toast[data-tone="info"] {
142
- border-inline-start: var(--ui-accent-line-width) solid var(--ui-info-solid);
150
+ --_ui-toast-region-accent: var(--ui-info-solid);
151
+ --_ui-toast-region-tone-surface: var(--ui-info-soft);
143
152
  }
144
153
  .toast[data-tone="success"] {
145
- border-inline-start: var(--ui-accent-line-width) solid var(--ui-success-solid);
154
+ --_ui-toast-region-accent: var(--ui-success-solid);
155
+ --_ui-toast-region-tone-surface: var(--ui-success-soft);
146
156
  }
147
157
  .toast[data-tone="warning"] {
148
- border-inline-start: var(--ui-accent-line-width) solid var(--ui-warning-solid);
158
+ --_ui-toast-region-accent: var(--ui-warning-solid);
159
+ --_ui-toast-region-tone-surface: var(--ui-warning-soft);
149
160
  }
150
161
  .toast[data-tone="danger"] {
151
- border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger-solid);
162
+ --_ui-toast-region-accent: var(--ui-danger-solid);
163
+ --_ui-toast-region-tone-surface: var(--ui-danger-soft);
152
164
  }
153
165
 
154
166
  /* Leaving slides on down and fades; the controller removes the toast when this ends. */
@@ -178,7 +190,6 @@
178
190
 
179
191
  .dismiss {
180
192
  align-self: center;
181
- margin-inline-end: calc(var(--ui-space-2) * -1);
182
193
  }
183
194
 
184
195
  /* A component that sets its display still honours the hidden attribute on its root. */
@@ -24,6 +24,7 @@
24
24
 
25
25
  :scope {
26
26
  --_ui-toast-accent: var(--ui-border-strong);
27
+ --_ui-toast-surface: var(--ui-surface-muted);
27
28
 
28
29
  display: flex;
29
30
  align-items: center;
@@ -32,26 +33,35 @@
32
33
  inline-size: 100%;
33
34
  margin: 0;
34
35
  padding: var(--ui-space-3) var(--ui-space-4);
35
- border: var(--ui-border-width) solid var(--ui-toast-border, var(--ui-overlay-border, var(--ui-border-strong)));
36
- border-inline-start: var(--ui-accent-line-width) solid var(--ui-toast-accent, var(--_ui-toast-accent));
36
+ /* The close button's internal space supplies the rest of the trailing inset. */
37
+ padding-inline-end: var(--ui-space-2);
38
+ border: var(--ui-border-width) solid var(--ui-toast-border, var(--ui-overlay-border, var(--ui-toast-accent, var(--_ui-toast-accent))));
37
39
  border-radius: var(--ui-toast-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
38
- background: var(--ui-toast-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
40
+ background: var(--ui-toast-surface, var(--ui-overlay-surface, var(--_ui-toast-surface)));
39
41
  color: var(--ui-text-primary);
42
+ font-family: var(--ui-font-family-sans);
43
+ font-size: var(--ui-font-size-sm);
44
+ font-weight: var(--ui-font-normal);
45
+ line-height: var(--ui-line-height-md);
40
46
  box-shadow: var(--ui-toast-shadow, var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg))));
41
47
  pointer-events: auto;
42
48
  }
43
49
 
44
50
  :scope[data-ui-toast-state~="tone=info"] {
45
51
  --_ui-toast-accent: var(--ui-info-solid);
52
+ --_ui-toast-surface: var(--ui-info-soft);
46
53
  }
47
54
  :scope[data-ui-toast-state~="tone=success"] {
48
55
  --_ui-toast-accent: var(--ui-success-solid);
56
+ --_ui-toast-surface: var(--ui-success-soft);
49
57
  }
50
58
  :scope[data-ui-toast-state~="tone=warning"] {
51
59
  --_ui-toast-accent: var(--ui-warning-solid);
60
+ --_ui-toast-surface: var(--ui-warning-soft);
52
61
  }
53
62
  :scope[data-ui-toast-state~="tone=danger"] {
54
63
  --_ui-toast-accent: var(--ui-danger-solid);
64
+ --_ui-toast-surface: var(--ui-danger-soft);
55
65
  }
56
66
 
57
67
  .message {
@@ -61,10 +71,6 @@
61
71
  .action:not(:has(> *)) {
62
72
  display: none;
63
73
  }
64
- .dismiss {
65
- margin-inline-end: calc(var(--ui-space-2) * -1);
66
- }
67
-
68
74
  :scope[hidden] {
69
75
  display: none;
70
76
  }
@@ -7,9 +7,9 @@ export interface UiBadgeElement extends HTMLSpanElement {
7
7
  }
8
8
  export interface UiBadgeProps {
9
9
  shape?: "pill" | "tag" | "dot" | "square" | "circle" | null;
10
- size?: "xs" | "md" | null;
10
+ size?: "xs" | "md" | "lg" | null;
11
11
  tone?: "neutral" | "accent" | "info" | "success" | "warning" | "danger" | null;
12
- variant?: "solid" | "subtle" | "outline" | null;
12
+ variant?: "solid" | "subtle" | "outline" | "inverse" | null;
13
13
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
14
14
  children?: readonly (string | Node)[];
15
15
  slots?: Readonly<Record<string, readonly (string | Node)[]>>;
@@ -7,7 +7,7 @@ const T1 = ["",[]];
7
7
  const T2 = ["",[]];
8
8
  let P0, P1, P2;
9
9
  const S = { n: [], t: [], f: import.meta.url, g: "ui-badge" };
10
- const D = { props: { "shape": { "required":false,"values":["pill","tag","dot","square","circle"],"default":"pill", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "size": { "required":false,"values":["xs","md"],"default":"md", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "tone": { "required":false,"values":["neutral","accent","info","success","warning","danger"],"default":"neutral", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "variant": { "required":false,"values":["solid","subtle","outline"],"default":"subtle", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] } } };
10
+ const D = { props: { "shape": { "required":false,"values":["pill","tag","dot","square","circle"],"default":"pill", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "size": { "required":false,"values":["xs","md","lg"],"default":"md", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "tone": { "required":false,"values":["neutral","accent","info","success","warning","danger"],"default":"neutral", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "variant": { "required":false,"values":["solid","subtle","outline","inverse"],"default":"subtle", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] } } };
11
11
 
12
12
  export function createUiBadge(options = {}, html) {
13
13
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
@@ -6,6 +6,7 @@ export interface UiListItemElement extends HTMLLIElement {
6
6
  removeEventListener<K extends keyof UiListItemEventMap>(type: K, listener: (this: UiListItemElement, event: UiListItemEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
7
7
  }
8
8
  export interface UiListItemProps {
9
+ align?: "center" | "title" | null;
9
10
  current?: boolean | null;
10
11
  highlighted?: boolean | null;
11
12
  leadingInteractive?: boolean | null;
@@ -9,7 +9,7 @@ const T3 = ["",[]];
9
9
  const T4 = ["",[]];
10
10
  let P0, P1, P2, P3, P4;
11
11
  const S = { n: [], t: [], f: import.meta.url, g: "ui-list-item" };
12
- const D = { props: { "current": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "highlighted": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "leadingInteractive": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "variant": { "required":false,"values":["row","card"],"default":"row", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "wrap": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" } } };
12
+ const D = { props: { "align": { "required":false,"values":["center","title"],"default":"center", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "current": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "highlighted": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "leadingInteractive": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" }, "variant": { "required":false,"values":["row","card"],"default":"row", c: checkFormat("keyword", keywordFormat), t: "keyword", j: 0, m: ["p",formatOf(keywordFormat),false] }, "wrap": { "required":false,"default":false, c: checkBoolean, t: "boolean", j: 0, m: "b" } } };
13
13
 
14
14
  export function createUiListItem(options = {}, html) {
15
15
  const { attributes = {}, children = [], slots = {}, ...componentProps } = options;
@@ -20,7 +20,7 @@ export function createUiListItem(options = {}, html) {
20
20
  }
21
21
  element.setAttribute("data-component", "ui-list-item");
22
22
  element.append((P0 ??= buildTemplate(T0)).cloneNode(true));
23
- const v = [null, null, null, null, null];
23
+ const v = [null, null, null, null, null, null];
24
24
  const B = acceptProps(element, D, S.n, v, componentProps, [], html);
25
25
  const m1 = (d) => {
26
26
  const n = (P1 ??= buildTemplate(T1)).cloneNode(true);
@@ -55,13 +55,13 @@ export function createUiListItem(options = {}, html) {
55
55
  const p4 = (r, c, d) => {
56
56
  };
57
57
  const p0 = (r, c, d) => {
58
- if (c & 1) {
59
- const x0 = v[0];
58
+ if (c & 2) {
59
+ const x0 = v[1];
60
60
  const s0 = toAttribute(x0, "aria-current");
61
61
  if (s0 !== r.v0) writeAttribute(r.n, "aria-current", r.v0 = s0);
62
62
  }
63
- if (c & 31) {
64
- const x1 = hostState(["variant","highlighted","current","leadingInteractive","wrap"], [v[3], v[1], v[0], v[2], v[4]]);
63
+ if (c & 63) {
64
+ const x1 = hostState(["variant","highlighted","current","leadingInteractive","wrap","align"], [v[4], v[2], v[1], v[3], v[5], v[0]]);
65
65
  const s1 = x1;
66
66
  if (s1 !== r.v1) writeAttribute(r.n, "data-ui-list-item-state", (r.v1 = s1) === "" ? null : s1);
67
67
  }
package/vue/UiAvatar.vue CHANGED
@@ -66,7 +66,8 @@ const propValidityContract = {
66
66
  type: { kind: 'terminal', name: 'keyword' },
67
67
  required: false,
68
68
  target: { attribute: 'shape' },
69
- description: 'Circle by default; square uses the theme\'s medium radius.',
69
+ description:
70
+ 'Circle by default, with a shallow shadow; square uses the theme\'s medium radius.',
70
71
  values: ['circle', 'square'],
71
72
  default: 'circle',
72
73
  },
@@ -443,6 +444,10 @@ useComponentHost(() => import('../components/ui-avatar/ui-avatar.js'), {
443
444
  border-color: var(--ui-avatar-border, var(--ui-border-strong));
444
445
  }
445
446
 
447
+ [data-component~="ui-avatar"][data-ui-avatar-state~="shape=circle"] {
448
+ box-shadow: var(--ui-shadow-sm);
449
+ }
450
+
446
451
  [data-component~="ui-avatar"][data-ui-avatar-state~="shape=square"] {
447
452
  border-radius: var(--ui-avatar-radius, var(--ui-radius-md));
448
453
  }
package/vue/UiBadge.d.ts CHANGED
@@ -11,7 +11,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
11
11
  default: string;
12
12
  };
13
13
  size: {
14
- type: PropType<"xs" | "md" | null>;
14
+ type: PropType<"xs" | "md" | "lg" | null>;
15
15
  default: string;
16
16
  };
17
17
  tone: {
@@ -19,7 +19,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
19
19
  default: string;
20
20
  };
21
21
  variant: {
22
- type: PropType<"solid" | "subtle" | "outline" | null>;
22
+ type: PropType<"solid" | "subtle" | "outline" | "inverse" | null>;
23
23
  default: string;
24
24
  };
25
25
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
@@ -28,7 +28,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
28
28
  default: string;
29
29
  };
30
30
  size: {
31
- type: PropType<"xs" | "md" | null>;
31
+ type: PropType<"xs" | "md" | "lg" | null>;
32
32
  default: string;
33
33
  };
34
34
  tone: {
@@ -36,14 +36,14 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
36
36
  default: string;
37
37
  };
38
38
  variant: {
39
- type: PropType<"solid" | "subtle" | "outline" | null>;
39
+ type: PropType<"solid" | "subtle" | "outline" | "inverse" | null>;
40
40
  default: string;
41
41
  };
42
42
  }>> & Readonly<{}>, {
43
43
  shape: "circle" | "dot" | "tag" | "square" | "pill" | null;
44
- size: "xs" | "md" | null;
44
+ size: "xs" | "md" | "lg" | null;
45
45
  tone: "info" | "neutral" | "accent" | "success" | "warning" | "danger" | null;
46
- variant: "solid" | "subtle" | "outline" | null;
46
+ variant: "solid" | "subtle" | "outline" | "inverse" | null;
47
47
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
48
48
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
49
49
  declare const _default: typeof __VLS_export;