@signal9/era-ui 9.0.0 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/ai/artifact/artifact-close.svelte +2 -2
  2. package/dist/ai/checkpoint.svelte +1 -1
  3. package/dist/ai/context/context.svelte +1 -1
  4. package/dist/ai/conversation/conversation-scroll-button.svelte +1 -1
  5. package/dist/ai/conversations/conversations-item.svelte +3 -3
  6. package/dist/ai/message/message-branch-selector.svelte +2 -2
  7. package/dist/ai/prompt-input/prompt-input-add-attachments.svelte +1 -1
  8. package/dist/ai/prompt-input/prompt-input-submit.svelte +1 -1
  9. package/dist/ai/run-status/run-status.svelte +1 -1
  10. package/dist/ai/suggestion/suggestion.svelte +1 -1
  11. package/dist/ai/swarm/swarm-actions.svelte +2 -2
  12. package/dist/ai/web-preview/web-preview.svelte +2 -2
  13. package/dist/apps/notes/editor/bubble-toolbar.svelte +3 -3
  14. package/dist/apps/notes/notes.svelte +11 -11
  15. package/dist/generated-docs/bar.md +2 -2
  16. package/dist/generated-docs/button.md +1 -1
  17. package/dist/generated-docs/chip.md +1 -1
  18. package/dist/generated-docs/input.md +1 -1
  19. package/dist/generated-docs/llms-full.txt +5 -5
  20. package/dist/generated-docs/manifest.json +4 -4
  21. package/dist/os/notification-center.svelte +1 -1
  22. package/dist/os/pane.svelte +2 -2
  23. package/dist/os/taskbar.svelte +4 -4
  24. package/dist/os/toast.svelte +2 -2
  25. package/dist/ui/bar/bar.svelte +12 -12
  26. package/dist/ui/bar/bar.svelte.d.ts +14 -14
  27. package/dist/ui/button/button.svelte +3 -3
  28. package/dist/ui/button/button.svelte.d.ts +1 -1
  29. package/dist/ui/button/index.d.ts +1 -1
  30. package/dist/ui/button/variants.d.ts +9 -12
  31. package/dist/ui/button/variants.js +12 -14
  32. package/dist/ui/chip/chip.svelte +14 -14
  33. package/dist/ui/chip/chip.svelte.d.ts +7 -7
  34. package/dist/ui/copy-button/copy-button.svelte +1 -1
  35. package/dist/ui/dialog/dialog-header.svelte +7 -2
  36. package/dist/ui/input/input.svelte +3 -3
  37. package/dist/ui/input/input.svelte.d.ts +1 -1
  38. package/dist/ui/input/variants.d.ts +6 -6
  39. package/dist/ui/input/variants.js +3 -3
  40. package/dist/ui/pane/pane-close.svelte +2 -2
  41. package/dist/ui/pane/pane-handle.svelte +3 -3
  42. package/dist/ui/select/select-value.svelte +1 -1
  43. package/package.json +1 -1
@@ -4,10 +4,10 @@
4
4
  let { onclick }: { onclick?: (e: MouseEvent) => void } = $props();
5
5
  </script>
6
6
 
7
- <!-- size="xxs", the close-affordance tier (Pane.Close, the chip dismiss): an
7
+ <!-- size="pill", the close-affordance tier (Pane.Close, the chip dismiss): an
8
8
  18px hit target whose tier draws the 12px dismiss ink by itself. The <X>
9
9
  used to carry size-(--era-h-icon) — a class the Button variant's [&_svg]
10
10
  selector outranks, so it claimed 14px while 10 shipped. -->
11
- <Button icon size="xxs" aria-label="Close" {onclick}>
11
+ <Button icon size="pill" aria-label="Close" {onclick}>
12
12
  <X />
13
13
  </Button>
@@ -20,7 +20,7 @@
20
20
 
21
21
  <div class={cn('flex w-full items-center gap-(--era-gap) text-muted', className)}>
22
22
  <Bookmark class="size-(--era-h-icon) shrink-0" aria-hidden="true" />
23
- <Button variant="link" size="sm" onclick={onRestore}>
23
+ <Button variant="link" size="chip" onclick={onRestore}>
24
24
  {#if children}{@render children()}{:else}{label}{/if}
25
25
  </Button>
26
26
  <Separator class="flex-1" />
@@ -23,7 +23,7 @@
23
23
  </script>
24
24
 
25
25
  <Popover.Root>
26
- <Popover.Trigger size="sm" class={cn('gap-(--era-gap) tabular-nums', className)}>
26
+ <Popover.Trigger size="chip" class={cn('gap-(--era-gap) tabular-nums', className)}>
27
27
  {Math.round(percent * 100)}%
28
28
  <svg viewBox="0 0 24 24" class="size-(--era-h-icon) -rotate-90" aria-hidden="true">
29
29
  <circle cx="12" cy="12" r="10" fill="none" stroke="var(--color-3)" stroke-width="3" />
@@ -16,7 +16,7 @@
16
16
  >
17
17
  <Button
18
18
  icon
19
- size="default"
19
+ size="control"
20
20
  aria-label="Scroll to bottom"
21
21
  class="rounded-full shadow-(--era-shadow-lg)"
22
22
  onclick={() => stick.repin()}
@@ -203,7 +203,7 @@
203
203
  >
204
204
  <Button
205
205
  icon
206
- size="xxs"
206
+ size="pill"
207
207
  aria-label={starred ? 'Unstar conversation' : 'Star conversation'}
208
208
  aria-pressed={starred}
209
209
  onclick={toggleStar}
@@ -212,14 +212,14 @@
212
212
  </Button>
213
213
 
214
214
  {#if showCancel}
215
- <Button icon size="xxs" aria-label="Cancel generation" onclick={() => onCancel?.()}>
215
+ <Button icon size="pill" aria-label="Cancel generation" onclick={() => onCancel?.()}>
216
216
  <X class="size-(--era-h-icon)" />
217
217
  </Button>
218
218
  {/if}
219
219
 
220
220
  <Button
221
221
  icon
222
- size="xxs"
222
+ size="pill"
223
223
  tone="destructive"
224
224
  active={armed}
225
225
  aria-label={armed ? 'Confirm delete conversation' : 'Delete conversation'}
@@ -12,13 +12,13 @@
12
12
 
13
13
  {#if ctrl.total > 1}
14
14
  <ButtonGroup class={cn(className)}>
15
- <Button icon size="sm" aria-label="Previous version" onclick={() => ctrl.previous()}>
15
+ <Button icon size="chip" aria-label="Previous version" onclick={() => ctrl.previous()}>
16
16
  <ChevronLeft class="size-(--era-h-icon)" />
17
17
  </Button>
18
18
  <span class="flex items-center px-(--era-inset-chip) text-body text-muted tabular-nums">
19
19
  {ctrl.current + 1} of {ctrl.total}
20
20
  </span>
21
- <Button icon size="sm" aria-label="Next version" onclick={() => ctrl.next()}>
21
+ <Button icon size="chip" aria-label="Next version" onclick={() => ctrl.next()}>
22
22
  <ChevronRight class="size-(--era-h-icon)" />
23
23
  </Button>
24
24
  </ButtonGroup>
@@ -7,6 +7,6 @@
7
7
  const attachments = getAttachmentsContext();
8
8
  </script>
9
9
 
10
- <Button icon size="default" aria-label={label} onclick={() => attachments.openFileDialog()}>
10
+ <Button icon size="control" aria-label={label} onclick={() => attachments.openFileDialog()}>
11
11
  <Plus class="size-(--era-h-icon)" />
12
12
  </Button>
@@ -26,7 +26,7 @@
26
26
  resubmitting. -->
27
27
  <Button
28
28
  icon
29
- size="default"
29
+ size="control"
30
30
  tone={generating ? 'default' : 'accent'}
31
31
  type={generating ? 'button' : 'submit'}
32
32
  aria-label={generating ? 'Stop' : 'Send'}
@@ -115,7 +115,7 @@
115
115
  <div class="flex-1"></div>
116
116
 
117
117
  {#if style.active && oncancel}
118
- <Button size="xs" tone="destructive" onclick={() => oncancel?.()}>
118
+ <Button size="icon" tone="destructive" onclick={() => oncancel?.()}>
119
119
  <X class="size-(--era-h-icon)" aria-hidden="true" />
120
120
  Cancel
121
121
  </Button>
@@ -21,7 +21,7 @@
21
21
  vertical inset) so the words breathe. Era pills are rd-sm, not
22
22
  full-round — touch mode alone pills the ladder. -->
23
23
  <Button
24
- size="sm"
24
+ size="chip"
25
25
  class={cn('shrink-0 px-(--era-chip-px)', className)}
26
26
  onclick={() => onSelect?.(suggestion)}
27
27
  >
@@ -60,7 +60,7 @@
60
60
  {#if cancel}
61
61
  <Button
62
62
  icon
63
- size="xxs"
63
+ size="pill"
64
64
  tone="destructive"
65
65
  aria-label="Cancel {agent.task}"
66
66
  onclick={(event: MouseEvent) => {
@@ -74,7 +74,7 @@
74
74
  {#if open}
75
75
  <Button
76
76
  icon
77
- size="xxs"
77
+ size="pill"
78
78
  aria-label="Open {agent.task}"
79
79
  onclick={(event: MouseEvent) => {
80
80
  event.stopPropagation();
@@ -21,8 +21,8 @@
21
21
  className
22
22
  )}
23
23
  >
24
- <Bar size="md" class="shrink-0 gap-(--era-gap) rounded-none">
25
- <Button icon size="sm" aria-label="Reload" onclick={() => (nonce += 1)}>
24
+ <Bar size="control" class="shrink-0 gap-(--era-gap) rounded-none">
25
+ <Button icon size="chip" aria-label="Reload" onclick={() => (nonce += 1)}>
26
26
  <RotateCw class="size-(--era-h-icon)" />
27
27
  </Button>
28
28
  <Input
@@ -31,15 +31,15 @@
31
31
  leaves no discernible edge. border-divider-faded is the token'd hairline, so
32
32
  it still tracks the surface rather than being a drawn-on line. -->
33
33
  <Bar
34
- size="md"
35
- content="xxs"
34
+ size="control"
35
+ content="pill"
36
36
  class="w-max border border-divider-faded bg-elevated shadow-lg glass-blur"
37
37
  >
38
38
  {#each items as item (item.mark)}
39
39
  {@const Icon = item.icon}
40
40
  <Button
41
41
  icon
42
- size="xxs"
42
+ size="pill"
43
43
  active={active[item.mark] ?? false}
44
44
  aria-label={item.label}
45
45
  title={item.label}
@@ -165,7 +165,7 @@
165
165
 
166
166
  {#snippet iconPicker(note: Note)}
167
167
  <Popover.Root bind:open={iconPickerOpen}>
168
- <Popover.Trigger icon size="xxs" aria-label="Change icon" title="Change icon">
168
+ <Popover.Trigger icon size="pill" aria-label="Change icon" title="Change icon">
169
169
  {#if note.icon}
170
170
  <span aria-hidden="true">{note.icon}</span>
171
171
  {:else}
@@ -179,7 +179,7 @@
179
179
  {#each row as glyph (glyph)}
180
180
  <Button
181
181
  icon
182
- size="default"
182
+ size="control"
183
183
  active={note.icon === glyph}
184
184
  aria-label={glyph}
185
185
  onclick={() => {
@@ -194,7 +194,7 @@
194
194
  {/each}
195
195
  {#if note.icon}
196
196
  <Button
197
- size="sm"
197
+ size="chip"
198
198
  class="w-full"
199
199
  onclick={() => {
200
200
  store.setIcon(note.id, null);
@@ -219,7 +219,7 @@
219
219
  {#snippet titleField(note: Note, cls: string)}
220
220
  <Input
221
221
  reveal
222
- size="xxs"
222
+ size="pill"
223
223
  class={cls}
224
224
  aria-label="Note title"
225
225
  placeholder="Untitled"
@@ -265,7 +265,7 @@
265
265
  >
266
266
  <!-- Sidebar: filter + note list -->
267
267
  <div class="flex w-56 shrink-0 flex-col border-r border-divider-faded">
268
- <!-- content="xxs": 24/30/36/48 of chrome around an 18/20/22/26 field and
268
+ <!-- content="pill": 24/30/36/48 of chrome around an 18/20/22/26 field and
269
269
  button, with Bar deriving the two-tier concentric inset. A notes sidebar
270
270
  is chrome around a list; at the lg/md pairing it was a 32px bar over
271
271
  24px rows and the chrome outweighed the content. This is the tier pair
@@ -277,17 +277,17 @@
277
277
  centred in 23px and sat 2.5px from the top against a 3px wall. Outset
278
278
  costs no layout, so the bar keeps its full tier height and every child
279
279
  sits the wall's distance from all four edges. -->
280
- <Bar size="md" content="xxs" divider class="rounded-none">
280
+ <Bar size="control" content="pill" divider class="rounded-none">
281
281
  <Input
282
282
  icon={Search}
283
- size="xxs"
283
+ size="pill"
284
284
  class="min-w-0 flex-1"
285
285
  type="text"
286
286
  placeholder="Filter…"
287
287
  aria-label="Filter notes"
288
288
  bind:value={query}
289
289
  />
290
- <Button icon size="xxs" aria-label="New note" title="New note" onclick={createNote}>
290
+ <Button icon size="pill" aria-label="New note" title="New note" onclick={createNote}>
291
291
  <Plus />
292
292
  </Button>
293
293
  </Bar>
@@ -374,7 +374,7 @@
374
374
  >
375
375
  <Button
376
376
  icon
377
- size="xxs"
377
+ size="pill"
378
378
  aria-label={note.pinned ? 'Unpin note' : 'Pin note'}
379
379
  title={note.pinned ? 'Unpin note' : 'Pin note'}
380
380
  active={note.pinned}
@@ -387,7 +387,7 @@
387
387
  </Button>
388
388
  <Button
389
389
  icon
390
- size="xxs"
390
+ size="pill"
391
391
  tone="destructive"
392
392
  aria-label="Delete note"
393
393
  title="Delete note"
@@ -444,7 +444,7 @@
444
444
  header (see the snippets below) lives in the pane bar's centre and
445
445
  drawing it twice would title the document twice. -->
446
446
  {#if !pane}
447
- <Bar size="md" content="xxs" divider class="rounded-none">
447
+ <Bar size="control" content="pill" divider class="rounded-none">
448
448
  {@render iconPicker(selected)}
449
449
  {@render titleField(selected, 'min-w-0 flex-1')}
450
450
  <!-- Fixed-width so the badge appearing and clearing never nudges the
@@ -15,8 +15,8 @@ Inherits all props from `HTMLAttributes<HTMLDivElement>`.
15
15
  | Prop | Type | Default | Notes |
16
16
  |------|------|---------|-------|
17
17
  | `ref?` | `HTMLDivElement \| null` | `null` | bindable |
18
- | `size?` | `'sm' \| 'md' \| 'lg'` | `'lg'` | Height tier (scales with density). Default `lg` — a full toolbar. |
19
- | `content?` | `'tier' \| 'xxs'` | `'tier'` | Tier of the controls inside — drives the bar's padding and gap so they
18
+ | `size?` | `'chip' \| 'control' \| 'bar'` | `'bar'` | Height tier (scales with density). Default `lg` — a full toolbar. |
19
+ | `content?` | `'tier' \| 'pill'` | `'tier'` | Tier of the controls inside — drives the bar's padding and gap so they
20
20
  stay concentric to them. `tier` (default) is one tier smaller; `pill` is
21
21
  the compact pairing (pills/fields in an sm or md bar). |
22
22
  | `divider?` | `boolean` | `false` | The flush cap-a-panel chrome: outset divider below, bottom rd-md. |
@@ -15,7 +15,7 @@ Inherits all props from `Button.RootProps`.
15
15
  | Prop | Type | Default | Notes |
16
16
  |------|------|---------|-------|
17
17
  | `tone?` | `'default' \| 'accent' \| 'destructive' \| 'success' \| 'warning'` | `'default'` | — |
18
- | `size?` | `'default' \| 'sm' \| 'xxs' \| 'xs' \| 'icon'` | `'default'` | — |
18
+ | `size?` | `'control' \| 'chip' \| 'pill' \| 'icon'` | `'control'` | — |
19
19
  | `variant?` | `'filled' \| 'link'` | `'filled'` | — |
20
20
  | `active?` | `boolean` | `false` | — |
21
21
  | `icon?` | `boolean` | `false` | — |
@@ -15,7 +15,7 @@ Inherits all props from `HTMLAttributes<HTMLDivElement>`.
15
15
  | Prop | Type | Default | Notes |
16
16
  |------|------|---------|-------|
17
17
  | `ref?` | `HTMLDivElement \| null` | `null` | bindable |
18
- | `size?` | `'sm' \| 'xxs'` | `'sm'` | `sm` (default) is the standalone free chip; `pill` is the smaller pill
18
+ | `size?` | `'chip' \| 'pill'` | `'chip'` | `sm` (default) is the standalone free chip; `pill` is the smaller pill
19
19
  that nests inside an md container (a select trigger, a button). |
20
20
  | `ondismiss?` | `() => void` | — | — |
21
21
  | `children?` | `Snippet` | — | — |
@@ -16,7 +16,7 @@ Inherits all props from `Omit<HTMLInputAttributes, 'size'>`.
16
16
  |------|------|---------|-------|
17
17
  | `ref?` | `HTMLInputElement \| null` | `null` | bindable |
18
18
  | `icon?` | `Component<IconProps> \| null` | `null` | Lucide glyph rendered inside the field, left of the text. |
19
- | `size?` | `'md' \| 'xxs'` | `'md'` | Field tier. `pill` is badge height — for compact chrome where the field
19
+ | `size?` | `'control' \| 'pill'` | `'control'` | Field tier. `pill` is badge height — for compact chrome where the field
20
20
  sits level with xxs buttons. See inputVariants. |
21
21
  | `bare?` | `boolean` | `false` | Drop the field chrome — for an input inside a container that is already the field. |
22
22
  | `reveal?` | `boolean` | `false` | Hold the field chrome back until hover — for a title or label that IS the content. |
@@ -966,8 +966,8 @@ Inherits all props from `HTMLAttributes<HTMLDivElement>`.
966
966
  | Prop | Type | Default | Notes |
967
967
  |------|------|---------|-------|
968
968
  | `ref?` | `HTMLDivElement \| null` | `null` | bindable |
969
- | `size?` | `'sm' \| 'md' \| 'lg'` | `'lg'` | Height tier (scales with density). Default `lg` — a full toolbar. |
970
- | `content?` | `'tier' \| 'xxs'` | `'tier'` | Tier of the controls inside — drives the bar's padding and gap so they
969
+ | `size?` | `'chip' \| 'control' \| 'bar'` | `'bar'` | Height tier (scales with density). Default `lg` — a full toolbar. |
970
+ | `content?` | `'tier' \| 'pill'` | `'tier'` | Tier of the controls inside — drives the bar's padding and gap so they
971
971
  stay concentric to them. `tier` (default) is one tier smaller; `pill` is
972
972
  the compact pairing (pills/fields in an sm or md bar). |
973
973
  | `divider?` | `boolean` | `false` | The flush cap-a-panel chrome: outset divider below, bottom rd-md. |
@@ -994,7 +994,7 @@ Inherits all props from `Button.RootProps`.
994
994
  | Prop | Type | Default | Notes |
995
995
  |------|------|---------|-------|
996
996
  | `tone?` | `'default' \| 'accent' \| 'destructive' \| 'success' \| 'warning'` | `'default'` | — |
997
- | `size?` | `'default' \| 'sm' \| 'xxs' \| 'xs' \| 'icon'` | `'default'` | — |
997
+ | `size?` | `'control' \| 'chip' \| 'pill' \| 'icon'` | `'control'` | — |
998
998
  | `variant?` | `'filled' \| 'link'` | `'filled'` | — |
999
999
  | `active?` | `boolean` | `false` | — |
1000
1000
  | `icon?` | `boolean` | `false` | — |
@@ -1142,7 +1142,7 @@ Inherits all props from `HTMLAttributes<HTMLDivElement>`.
1142
1142
  | Prop | Type | Default | Notes |
1143
1143
  |------|------|---------|-------|
1144
1144
  | `ref?` | `HTMLDivElement \| null` | `null` | bindable |
1145
- | `size?` | `'sm' \| 'xxs'` | `'sm'` | `sm` (default) is the standalone free chip; `pill` is the smaller pill
1145
+ | `size?` | `'chip' \| 'pill'` | `'chip'` | `sm` (default) is the standalone free chip; `pill` is the smaller pill
1146
1146
  that nests inside an md container (a select trigger, a button). |
1147
1147
  | `ondismiss?` | `() => void` | — | — |
1148
1148
  | `children?` | `Snippet` | — | — |
@@ -2933,7 +2933,7 @@ Inherits all props from `Omit<HTMLInputAttributes, 'size'>`.
2933
2933
  |------|------|---------|-------|
2934
2934
  | `ref?` | `HTMLInputElement \| null` | `null` | bindable |
2935
2935
  | `icon?` | `Component<IconProps> \| null` | `null` | Lucide glyph rendered inside the field, left of the text. |
2936
- | `size?` | `'md' \| 'xxs'` | `'md'` | Field tier. `pill` is badge height — for compact chrome where the field
2936
+ | `size?` | `'control' \| 'pill'` | `'control'` | Field tier. `pill` is badge height — for compact chrome where the field
2937
2937
  sits level with xxs buttons. See inputVariants. |
2938
2938
  | `bare?` | `boolean` | `false` | Drop the field chrome — for an input inside a container that is already the field. |
2939
2939
  | `reveal?` | `boolean` | `false` | Hold the field chrome back until hover — for a title or label that IS the content. |
@@ -159,7 +159,7 @@
159
159
  "slug": "bar",
160
160
  "title": "Bar",
161
161
  "summary": "A flex container for toolbars and headers, in three heights.",
162
- "tokenEstimate": 206,
162
+ "tokenEstimate": 209,
163
163
  "sections": [
164
164
  "Import",
165
165
  "Props"
@@ -170,7 +170,7 @@
170
170
  "slug": "button",
171
171
  "title": "Button",
172
172
  "summary": "A flexible button or link element.",
173
- "tokenEstimate": 453,
173
+ "tokenEstimate": 451,
174
174
  "sections": [
175
175
  "Import",
176
176
  "Props",
@@ -216,7 +216,7 @@
216
216
  "slug": "chip",
217
217
  "title": "Chip",
218
218
  "summary": "An interactive, optionally dismissible token.",
219
- "tokenEstimate": 270,
219
+ "tokenEstimate": 272,
220
220
  "sections": [
221
221
  "Import",
222
222
  "Props",
@@ -635,7 +635,7 @@
635
635
  "slug": "input",
636
636
  "title": "Input",
637
637
  "summary": "A text input field, with textarea variant.",
638
- "tokenEstimate": 219,
638
+ "tokenEstimate": 222,
639
639
  "sections": [
640
640
  "Import",
641
641
  "Props"
@@ -95,7 +95,7 @@
95
95
 
96
96
  {#if notif.items.length}
97
97
  <footer class="shrink-0 border-t border-divider-faded p-(--era-inset-chip)">
98
- <Button variant="link" size="sm" class="w-full" onclick={() => notif.clear()}>
98
+ <Button variant="link" size="chip" class="w-full" onclick={() => notif.clear()}>
99
99
  Clear all
100
100
  </Button>
101
101
  </footer>
@@ -124,7 +124,7 @@
124
124
  held preview recolours to the action it will commit — yellow for
125
125
  minimize, green for maximize — so the tone and glyph agree on what
126
126
  the release does. -->
127
- <!-- size="xxs" is the handle's content tier (see Pane.Handle), and the glyph
127
+ <!-- size="pill" is the handle's content tier (see Pane.Handle), and the glyph
128
128
  matches Pane.Close exactly — sp+5, off the sub-tier ladder for the
129
129
  reason documented there. The two close affordances have to read as one
130
130
  weight, so whatever that one is, both take it.
@@ -138,7 +138,7 @@
138
138
  plain size-* on the <svg> loses to it. -->
139
139
  <Button
140
140
  icon
141
- size="xxs"
141
+ size="pill"
142
142
  tone={armed === 'minimize' ? 'warning' : armed === 'maximize' ? 'success' : 'destructive'}
143
143
  class={armed === 'maximize'
144
144
  ? '[&_svg]:size-(--era-glyph-pill)'
@@ -234,7 +234,7 @@
234
234
  {#if pinned.length}
235
235
  <div class="flex shrink-0 items-center gap-(--era-gap)">
236
236
  {#each pinned as p (p.appId)}
237
- <Button icon size="default" aria-label={p.title} onclick={() => pm.open(p.appId)}>
237
+ <Button icon size="control" aria-label={p.title} onclick={() => pm.open(p.appId)}>
238
238
  {#if p.icon}{@const Icon = p.icon}<Icon class="size-(--era-h-icon)" />{/if}
239
239
  </Button>
240
240
  {/each}
@@ -288,7 +288,7 @@
288
288
  {#each pm.workspaces as ws, i (ws.id)}
289
289
  <Button
290
290
  icon
291
- size="default"
291
+ size="control"
292
292
  active={pm.activeWorkspaceId === ws.id}
293
293
  title={ws.name}
294
294
  aria-label="Switch to workspace {i + 1} ({ws.name})"
@@ -308,7 +308,7 @@
308
308
  consumers' own affordances). -->
309
309
  {#if notif.unread > 0}
310
310
  <div class="relative">
311
- <Button icon size="default" aria-label="Notifications" onclick={onNotifications}>
311
+ <Button icon size="control" aria-label="Notifications" onclick={onNotifications}>
312
312
  <Bell class="size-(--era-h-icon)" />
313
313
  </Button>
314
314
  <span
@@ -347,7 +347,7 @@
347
347
  add rounded-full — a circle is not era's button language. -->
348
348
  <Button
349
349
  icon
350
- size="default"
350
+ size="control"
351
351
  tone="accent"
352
352
  aria-label="Open command bar"
353
353
  class="shadow-(--era-shadow-lg)"
@@ -36,7 +36,7 @@
36
36
  variant's [&_svg] selector and never applied). -->
37
37
  <Button
38
38
  icon
39
- size="xxs"
39
+ size="pill"
40
40
  aria-label="Dismiss"
41
41
  class="-mt-1 -mr-1 shrink-0"
42
42
  onclick={() => notif.dismiss(n.id)}
@@ -49,7 +49,7 @@
49
49
  <div class="mt-(--era-inset-chip) flex flex-wrap gap-(--era-gap)">
50
50
  {#each n.actions as action (action.label)}
51
51
  <Button
52
- size="xs"
52
+ size="icon"
53
53
  tone={n.tone === 'default' ? 'default' : n.tone}
54
54
  onclick={() => {
55
55
  action.onClick();
@@ -13,9 +13,9 @@
13
13
  base: 'flex items-center era-text-trim',
14
14
  variants: {
15
15
  size: {
16
- sm: 'h-(--era-h-chip) rounded-(--era-rd-chip)',
17
- md: 'h-(--era-h-control) rounded-(--era-rd-control)',
18
- lg: 'h-(--era-h-bar) rounded-(--era-rd-bar)'
16
+ chip: 'h-(--era-h-chip) rounded-(--era-rd-chip)',
17
+ control: 'h-(--era-h-control) rounded-(--era-rd-control)',
18
+ bar: 'h-(--era-h-bar) rounded-(--era-rd-bar)'
19
19
  },
20
20
  /**
21
21
  * The tier of the CONTROLS inside, because that is what the bar's own
@@ -33,7 +33,7 @@
33
33
  */
34
34
  content: {
35
35
  tier: 'gap-(--era-icon-inset-chip) px-(--era-icon-inset-chip)',
36
- xxs: ''
36
+ pill: ''
37
37
  },
38
38
  /**
39
39
  * The flush header bar capping a panel — Pane.Handle, Dialog.Header,
@@ -61,8 +61,8 @@
61
61
  compoundVariants: [
62
62
  // control ⊃ pill = (3sp − sp − 10)/2 — the named token.
63
63
  {
64
- size: 'md',
65
- content: 'xxs',
64
+ size: 'control',
65
+ content: 'pill',
66
66
  class: 'gap-(--era-pill-inset-control) px-(--era-pill-inset-control)'
67
67
  },
68
68
  // chip ⊃ pill — its own token, not the text inset it used to borrow. The two
@@ -70,12 +70,12 @@
70
70
  // 12px broke the tie and left this pairing a pixel wide. (bar ⊃ pill has no
71
71
  // token because nothing pairs a page header with pill-tier controls.)
72
72
  {
73
- size: 'sm',
74
- content: 'xxs',
73
+ size: 'chip',
74
+ content: 'pill',
75
75
  class: 'gap-(--era-pill-inset-chip) px-(--era-pill-inset-chip)'
76
76
  }
77
77
  ],
78
- defaultVariants: { size: 'lg', content: 'tier', divider: false }
78
+ defaultVariants: { size: 'bar', content: 'tier', divider: false }
79
79
  });
80
80
  </script>
81
81
 
@@ -85,7 +85,7 @@
85
85
 
86
86
  let {
87
87
  ref = $bindable(null),
88
- size = 'lg',
88
+ size = 'bar',
89
89
  content = 'tier',
90
90
  divider = false,
91
91
  children,
@@ -94,13 +94,13 @@
94
94
  }: HTMLAttributes<HTMLDivElement> & {
95
95
  ref?: HTMLDivElement | null;
96
96
  /** Height tier (scales with density). Default `lg` — a full toolbar. */
97
- size?: 'sm' | 'md' | 'lg';
97
+ size?: 'chip' | 'control' | 'bar';
98
98
  /**
99
99
  * Tier of the controls inside — drives the bar's padding and gap so they
100
100
  * stay concentric to them. `tier` (default) is one tier smaller; `pill` is
101
101
  * the compact pairing (pills/fields in an sm or md bar).
102
102
  */
103
- content?: 'tier' | 'xxs';
103
+ content?: 'tier' | 'pill';
104
104
  /** The flush cap-a-panel chrome: outset divider below, bottom rd-md. */
105
105
  divider?: boolean;
106
106
  children?: Snippet;
@@ -1,8 +1,8 @@
1
1
  export declare const barVariants: import("tailwind-variants").TVReturnType<{
2
2
  size: {
3
- sm: "h-(--era-h-chip) rounded-(--era-rd-chip)";
4
- md: "h-(--era-h-control) rounded-(--era-rd-control)";
5
- lg: "h-(--era-h-bar) rounded-(--era-rd-bar)";
3
+ chip: "h-(--era-h-chip) rounded-(--era-rd-chip)";
4
+ control: "h-(--era-h-control) rounded-(--era-rd-control)";
5
+ bar: "h-(--era-h-bar) rounded-(--era-rd-bar)";
6
6
  };
7
7
  /**
8
8
  * The tier of the CONTROLS inside, because that is what the bar's own
@@ -20,7 +20,7 @@ export declare const barVariants: import("tailwind-variants").TVReturnType<{
20
20
  */
21
21
  content: {
22
22
  tier: "gap-(--era-icon-inset-chip) px-(--era-icon-inset-chip)";
23
- xxs: "";
23
+ pill: "";
24
24
  };
25
25
  /**
26
26
  * The flush header bar capping a panel — Pane.Handle, Dialog.Header,
@@ -46,9 +46,9 @@ export declare const barVariants: import("tailwind-variants").TVReturnType<{
46
46
  };
47
47
  }, undefined, "flex items-center era-text-trim", {
48
48
  size: {
49
- sm: "h-(--era-h-chip) rounded-(--era-rd-chip)";
50
- md: "h-(--era-h-control) rounded-(--era-rd-control)";
51
- lg: "h-(--era-h-bar) rounded-(--era-rd-bar)";
49
+ chip: "h-(--era-h-chip) rounded-(--era-rd-chip)";
50
+ control: "h-(--era-h-control) rounded-(--era-rd-control)";
51
+ bar: "h-(--era-h-bar) rounded-(--era-rd-bar)";
52
52
  };
53
53
  /**
54
54
  * The tier of the CONTROLS inside, because that is what the bar's own
@@ -66,7 +66,7 @@ export declare const barVariants: import("tailwind-variants").TVReturnType<{
66
66
  */
67
67
  content: {
68
68
  tier: "gap-(--era-icon-inset-chip) px-(--era-icon-inset-chip)";
69
- xxs: "";
69
+ pill: "";
70
70
  };
71
71
  /**
72
72
  * The flush header bar capping a panel — Pane.Handle, Dialog.Header,
@@ -92,9 +92,9 @@ export declare const barVariants: import("tailwind-variants").TVReturnType<{
92
92
  };
93
93
  }, undefined, import("tailwind-variants").TVReturnTypeLike<{
94
94
  size: {
95
- sm: "h-(--era-h-chip) rounded-(--era-rd-chip)";
96
- md: "h-(--era-h-control) rounded-(--era-rd-control)";
97
- lg: "h-(--era-h-bar) rounded-(--era-rd-bar)";
95
+ chip: "h-(--era-h-chip) rounded-(--era-rd-chip)";
96
+ control: "h-(--era-h-control) rounded-(--era-rd-control)";
97
+ bar: "h-(--era-h-bar) rounded-(--era-rd-bar)";
98
98
  };
99
99
  /**
100
100
  * The tier of the CONTROLS inside, because that is what the bar's own
@@ -112,7 +112,7 @@ export declare const barVariants: import("tailwind-variants").TVReturnType<{
112
112
  */
113
113
  content: {
114
114
  tier: "gap-(--era-icon-inset-chip) px-(--era-icon-inset-chip)";
115
- xxs: "";
115
+ pill: "";
116
116
  };
117
117
  /**
118
118
  * The flush header bar capping a panel — Pane.Handle, Dialog.Header,
@@ -142,13 +142,13 @@ import type { Snippet } from 'svelte';
142
142
  type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
143
143
  ref?: HTMLDivElement | null;
144
144
  /** Height tier (scales with density). Default `lg` — a full toolbar. */
145
- size?: 'sm' | 'md' | 'lg';
145
+ size?: 'chip' | 'control' | 'bar';
146
146
  /**
147
147
  * Tier of the controls inside — drives the bar's padding and gap so they
148
148
  * stay concentric to them. `tier` (default) is one tier smaller; `pill` is
149
149
  * the compact pairing (pills/fields in an sm or md bar).
150
150
  */
151
- content?: 'tier' | 'xxs';
151
+ content?: 'tier' | 'pill';
152
152
  /** The flush cap-a-panel chrome: outset divider below, bottom rd-md. */
153
153
  divider?: boolean;
154
154
  children?: Snippet;
@@ -8,7 +8,7 @@
8
8
  let {
9
9
  ref = $bindable(null),
10
10
  tone = 'default',
11
- size = 'default',
11
+ size = 'control',
12
12
  variant = 'filled',
13
13
  active = false,
14
14
  icon = false,
@@ -20,7 +20,7 @@
20
20
  ...restProps
21
21
  }: Button.RootProps & {
22
22
  tone?: 'default' | 'accent' | 'destructive' | 'success' | 'warning';
23
- size?: 'default' | 'sm' | 'xxs' | 'xs' | 'icon';
23
+ size?: 'control' | 'chip' | 'pill' | 'icon';
24
24
  variant?: 'filled' | 'link';
25
25
  active?: boolean;
26
26
  icon?: boolean;
@@ -50,7 +50,7 @@
50
50
  `size` is exposed for the same reason: bevel sinks a pressed icon by a fixed
51
51
  1px, which is ~4% of a default button but ~7% of a 14px icon button, so the
52
52
  smallest tier reads as over-travelling. The surface halves the sink for
53
- size="xs"/"icon" (see bevel.css), and it can only do that if the size is on the
53
+ size="icon"/"icon" (see bevel.css), and it can only do that if the size is on the
54
54
  DOM. Geometry lives in tv() compound classes, which CSS cannot query.
55
55
  -->
56
56
  <Button.Root
@@ -2,7 +2,7 @@ import type { Snippet } from 'svelte';
2
2
  import { Button } from 'bits-ui';
3
3
  type $$ComponentProps = Button.RootProps & {
4
4
  tone?: 'default' | 'accent' | 'destructive' | 'success' | 'warning';
5
- size?: 'default' | 'sm' | 'xxs' | 'xs' | 'icon';
5
+ size?: 'control' | 'chip' | 'pill' | 'icon';
6
6
  variant?: 'filled' | 'link';
7
7
  active?: boolean;
8
8
  icon?: boolean;
@@ -3,7 +3,7 @@ export { Button };
3
3
  export { buttonVariants } from './variants.js';
4
4
  export interface ButtonVariants {
5
5
  tone?: 'default' | 'accent' | 'destructive' | 'success' | 'warning';
6
- size?: 'default' | 'sm' | 'xxs' | 'xs' | 'icon';
6
+ size?: 'control' | 'chip' | 'pill' | 'icon';
7
7
  variant?: 'filled' | 'link';
8
8
  icon?: boolean;
9
9
  active?: boolean;
@@ -11,10 +11,9 @@ export declare const buttonVariants: import("tailwind-variants").TVReturnType<{
11
11
  warning: "";
12
12
  };
13
13
  size: {
14
- default: "";
15
- sm: "";
16
- xxs: "";
17
- xs: "";
14
+ control: "";
15
+ chip: "";
16
+ pill: "";
18
17
  icon: "";
19
18
  };
20
19
  icon: {
@@ -36,10 +35,9 @@ export declare const buttonVariants: import("tailwind-variants").TVReturnType<{
36
35
  warning: "";
37
36
  };
38
37
  size: {
39
- default: "";
40
- sm: "";
41
- xxs: "";
42
- xs: "";
38
+ control: "";
39
+ chip: "";
40
+ pill: "";
43
41
  icon: "";
44
42
  };
45
43
  icon: {
@@ -61,10 +59,9 @@ export declare const buttonVariants: import("tailwind-variants").TVReturnType<{
61
59
  warning: "";
62
60
  };
63
61
  size: {
64
- default: "";
65
- sm: "";
66
- xxs: "";
67
- xs: "";
62
+ control: "";
63
+ chip: "";
64
+ pill: "";
68
65
  icon: "";
69
66
  };
70
67
  icon: {
@@ -16,7 +16,7 @@ export const buttonVariants = tv({
16
16
  link: 'inline-flex underline-offset-2 hover:underline'
17
17
  },
18
18
  tone: { default: '', accent: '', destructive: '', success: '', warning: '' },
19
- size: { default: '', sm: '', xxs: '', xs: '', icon: '' },
19
+ size: { control: '', chip: '', pill: '', icon: '' },
20
20
  icon: { true: '' },
21
21
  active: { true: '' }
22
22
  },
@@ -24,22 +24,22 @@ export const buttonVariants = tv({
24
24
  // filled geometry
25
25
  {
26
26
  variant: 'filled',
27
- size: 'default',
27
+ size: 'control',
28
28
  class: 'h-(--era-h-control) min-w-(--era-h-control) rounded-(--era-rd-control)'
29
29
  },
30
30
  {
31
31
  variant: 'filled',
32
- size: 'sm',
32
+ size: 'chip',
33
33
  class: 'h-(--era-h-chip) min-w-(--era-h-chip) rounded-(--era-rd-chip)'
34
34
  },
35
35
  {
36
36
  variant: 'filled',
37
- size: 'xxs',
37
+ size: 'pill',
38
38
  class: 'h-(--era-h-pill) min-w-(--era-h-pill) rounded-(--era-rd-pill)'
39
39
  },
40
40
  {
41
41
  variant: 'filled',
42
- size: 'xs',
42
+ size: 'icon',
43
43
  class: 'h-(--era-h-icon) min-w-(--era-h-icon) rounded-(--era-rd-icon)'
44
44
  },
45
45
  {
@@ -52,17 +52,16 @@ export const buttonVariants = tv({
52
52
  {
53
53
  variant: 'filled',
54
54
  icon: false,
55
- size: 'default',
55
+ size: 'control',
56
56
  class: 'px-(--era-inset-control) has-[svg]:gap-(--era-inset-control)'
57
57
  },
58
58
  {
59
59
  variant: 'filled',
60
60
  icon: false,
61
- size: 'sm',
61
+ size: 'chip',
62
62
  class: 'px-(--era-inset-chip) has-[svg]:gap-(--era-inset-chip)'
63
63
  },
64
- { variant: 'filled', icon: false, size: 'xxs', class: 'px-(--era-pill-px)' },
65
- { variant: 'filled', icon: false, size: 'xs', class: 'px-(--era-gap)' },
64
+ { variant: 'filled', icon: false, size: 'pill', class: 'px-(--era-pill-px)' },
66
65
  { variant: 'filled', icon: false, size: 'icon', class: 'px-(--era-gap)' },
67
66
  { variant: 'filled', icon: true, class: 'aspect-square px-0' },
68
67
  // Icon glyph sizing. The glyph is the icon tier (h-icon) at default/sm —
@@ -78,10 +77,9 @@ export const buttonVariants = tv({
78
77
  // notes "new note" button rendered a 24px glyph in a 24px box — flush,
79
78
  // no padding at all. Stating them makes the documented intent real and
80
79
  // removes the dependency on every call site remembering.
81
- { icon: true, size: 'default', class: '[&_svg]:size-(--era-h-icon)' },
82
- { icon: true, size: 'sm', class: '[&_svg]:size-(--era-h-icon)' },
83
- { icon: true, size: 'xxs', class: '[&_svg]:size-(--era-glyph-pill)' },
84
- { icon: true, size: 'xs', class: '[&_svg]:size-(--era-glyph-icon)' },
80
+ { icon: true, size: 'control', class: '[&_svg]:size-(--era-h-icon)' },
81
+ { icon: true, size: 'chip', class: '[&_svg]:size-(--era-h-icon)' },
82
+ { icon: true, size: 'pill', class: '[&_svg]:size-(--era-glyph-pill)' },
85
83
  { icon: true, size: 'icon', class: '[&_svg]:size-(--era-glyph-icon)' },
86
84
  // filled tones
87
85
  {
@@ -123,7 +121,7 @@ export const buttonVariants = tv({
123
121
  defaultVariants: {
124
122
  variant: 'filled',
125
123
  tone: 'default',
126
- size: 'default',
124
+ size: 'control',
127
125
  icon: false,
128
126
  active: false
129
127
  }
@@ -16,36 +16,36 @@
16
16
  base: 'inline-flex shrink-0 items-center bg-fill font-mono text-body leading-none whitespace-nowrap text-fg shadow-(--era-shadow) era-text-trim',
17
17
  variants: {
18
18
  size: {
19
- sm: 'h-(--era-h-chip) min-w-(--era-h-chip) rounded-(--era-rd-chip) pl-(--era-chip-px)',
20
- xxs: 'h-(--era-h-pill) min-w-(--era-h-pill) rounded-(--era-rd-pill) pl-(--era-pill-px)'
19
+ chip: 'h-(--era-h-chip) min-w-(--era-h-chip) rounded-(--era-rd-chip) pl-(--era-chip-px)',
20
+ pill: 'h-(--era-h-pill) min-w-(--era-h-pill) rounded-(--era-rd-pill) pl-(--era-pill-px)'
21
21
  },
22
22
  dismissible: { true: '', false: '' }
23
23
  },
24
24
  compoundVariants: [
25
25
  // Text-only: symmetric pill padding, inter-element gap for a lead icon.
26
- { size: 'sm', dismissible: false, class: 'gap-(--era-gap) pr-(--era-chip-px)' },
27
- { size: 'xxs', dismissible: false, class: 'gap-(--era-gap) pr-(--era-pill-px)' },
26
+ { size: 'chip', dismissible: false, class: 'gap-(--era-gap) pr-(--era-chip-px)' },
27
+ { size: 'pill', dismissible: false, class: 'gap-(--era-gap) pr-(--era-pill-px)' },
28
28
  // Dismissible, two geometries because the two tiers afford different ones:
29
29
  //
30
- // sm — the xxs-tier button NESTS, with its concentric gap mirrored as
30
+ // chip — the pill-tier button NESTS, with its concentric gap mirrored as
31
31
  // the right padding (--era-pill-inset-chip). 18px of hit target, and
32
32
  // since the dismiss glyph is 12px in every box, the ink sits where
33
33
  // the old 14px button put it — (h − glyph)/2 telescopes.
34
- // xxs — nesting has run out of road: density.css's own note says xxs
34
+ // pill — nesting has run out of road: density.css's own note says xxs
35
35
  // "is sized around text, not as a container", and the best a
36
36
  // nested button managed here was 1px of pad. So the dismiss is a
37
37
  // flush END-CAP instead — a full-height segment of the pill
38
38
  // (pr-0; the button supplies the right edge). Flush means offset
39
39
  // zero, and at offset zero concentric radius = the chip's own, so
40
- // the cap shares rd-xxs exactly rather than approximating it.
40
+ // the cap shares rd-pill exactly rather than approximating it.
41
41
  {
42
- size: 'sm',
42
+ size: 'chip',
43
43
  dismissible: true,
44
44
  class: 'gap-(--era-pill-inset-chip) pr-(--era-pill-inset-chip)'
45
45
  },
46
- { size: 'xxs', dismissible: true, class: 'gap-(--era-icon-inset-pill) pr-0' }
46
+ { size: 'pill', dismissible: true, class: 'gap-(--era-icon-inset-pill) pr-0' }
47
47
  ],
48
- defaultVariants: { size: 'sm', dismissible: false }
48
+ defaultVariants: { size: 'chip', dismissible: false }
49
49
  });
50
50
  </script>
51
51
 
@@ -58,7 +58,7 @@
58
58
 
59
59
  let {
60
60
  ref = $bindable(null),
61
- size = 'sm',
61
+ size = 'chip',
62
62
  ondismiss,
63
63
  children,
64
64
  class: className,
@@ -67,7 +67,7 @@
67
67
  ref?: HTMLDivElement | null;
68
68
  /** `sm` (default) is the standalone free chip; `pill` is the smaller pill
69
69
  * that nests inside an md container (a select trigger, a button). */
70
- size?: 'sm' | 'xxs';
70
+ size?: 'chip' | 'pill';
71
71
  ondismiss?: () => void;
72
72
  children?: Snippet;
73
73
  } = $props();
@@ -93,9 +93,9 @@
93
93
  what reads as "segment of this pill" rather than "pill on a pill". -->
94
94
  <Button
95
95
  icon
96
- size="xxs"
96
+ size="pill"
97
97
  tone="destructive"
98
- class={size === 'xxs' ? 'rounded-l-none' : undefined}
98
+ class={size === 'pill' ? 'rounded-l-none' : undefined}
99
99
  onclick={ondismiss}
100
100
  onpointerdown={(e: PointerEvent) => e.stopPropagation()}
101
101
  onpointerup={(e: PointerEvent) => e.stopPropagation()}
@@ -1,7 +1,7 @@
1
1
  export declare const chipVariants: import("tailwind-variants").TVReturnType<{
2
2
  size: {
3
- sm: "h-(--era-h-chip) min-w-(--era-h-chip) rounded-(--era-rd-chip) pl-(--era-chip-px)";
4
- xxs: "h-(--era-h-pill) min-w-(--era-h-pill) rounded-(--era-rd-pill) pl-(--era-pill-px)";
3
+ chip: "h-(--era-h-chip) min-w-(--era-h-chip) rounded-(--era-rd-chip) pl-(--era-chip-px)";
4
+ pill: "h-(--era-h-pill) min-w-(--era-h-pill) rounded-(--era-rd-pill) pl-(--era-pill-px)";
5
5
  };
6
6
  dismissible: {
7
7
  true: "";
@@ -9,8 +9,8 @@ export declare const chipVariants: import("tailwind-variants").TVReturnType<{
9
9
  };
10
10
  }, undefined, "inline-flex shrink-0 items-center bg-fill font-mono text-body leading-none whitespace-nowrap text-fg shadow-(--era-shadow) era-text-trim", {
11
11
  size: {
12
- sm: "h-(--era-h-chip) min-w-(--era-h-chip) rounded-(--era-rd-chip) pl-(--era-chip-px)";
13
- xxs: "h-(--era-h-pill) min-w-(--era-h-pill) rounded-(--era-rd-pill) pl-(--era-pill-px)";
12
+ chip: "h-(--era-h-chip) min-w-(--era-h-chip) rounded-(--era-rd-chip) pl-(--era-chip-px)";
13
+ pill: "h-(--era-h-pill) min-w-(--era-h-pill) rounded-(--era-rd-pill) pl-(--era-pill-px)";
14
14
  };
15
15
  dismissible: {
16
16
  true: "";
@@ -18,8 +18,8 @@ export declare const chipVariants: import("tailwind-variants").TVReturnType<{
18
18
  };
19
19
  }, undefined, import("tailwind-variants").TVReturnTypeLike<{
20
20
  size: {
21
- sm: "h-(--era-h-chip) min-w-(--era-h-chip) rounded-(--era-rd-chip) pl-(--era-chip-px)";
22
- xxs: "h-(--era-h-pill) min-w-(--era-h-pill) rounded-(--era-rd-pill) pl-(--era-pill-px)";
21
+ chip: "h-(--era-h-chip) min-w-(--era-h-chip) rounded-(--era-rd-chip) pl-(--era-chip-px)";
22
+ pill: "h-(--era-h-pill) min-w-(--era-h-pill) rounded-(--era-rd-pill) pl-(--era-pill-px)";
23
23
  };
24
24
  dismissible: {
25
25
  true: "";
@@ -32,7 +32,7 @@ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
32
32
  ref?: HTMLDivElement | null;
33
33
  /** `sm` (default) is the standalone free chip; `pill` is the smaller pill
34
34
  * that nests inside an md container (a select trigger, a button). */
35
- size?: 'sm' | 'xxs';
35
+ size?: 'chip' | 'pill';
36
36
  ondismiss?: () => void;
37
37
  children?: Snippet;
38
38
  };
@@ -15,7 +15,7 @@
15
15
  resetDelay = 1500,
16
16
  label = 'Copy',
17
17
  copiedLabel = 'Copied',
18
- size = 'sm',
18
+ size = 'chip',
19
19
  idleIcon: IdleIcon = Copy,
20
20
  successIcon: SuccessIcon = Check,
21
21
  failureIcon: FailureIcon = X,
@@ -31,10 +31,15 @@
31
31
  `header` snippet, so the bar spans the panel edge to edge and the panel's
32
32
  radius follows this corner region (rd-md — the same law that sizes the
33
33
  pane's own corners). -->
34
- <Bar size="md" content="xxs" divider class={cn('pl-(--era-inset-control) select-none', className)}>
34
+ <Bar
35
+ size="control"
36
+ content="pill"
37
+ divider
38
+ class={cn('pl-(--era-inset-control) select-none', className)}
39
+ >
35
40
  {@render children?.()}
36
41
  {#if dismissable}
37
- <Close icon size="xxs" tone="destructive" aria-label="Close" class="ml-auto">
42
+ <Close icon size="pill" tone="destructive" aria-label="Close" class="ml-auto">
38
43
  <X />
39
44
  </Close>
40
45
  {/if}
@@ -9,7 +9,7 @@
9
9
  ref = $bindable(null),
10
10
  value = $bindable(''),
11
11
  icon = null,
12
- size = 'md',
12
+ size = 'control',
13
13
  bare = false,
14
14
  reveal = false,
15
15
  class: className,
@@ -27,7 +27,7 @@
27
27
  * Field tier. `pill` is badge height — for compact chrome where the field
28
28
  * sits level with xxs buttons. See inputVariants.
29
29
  */
30
- size?: 'md' | 'xxs';
30
+ size?: 'control' | 'pill';
31
31
  /** Drop the field chrome — for an input inside a container that is already the field. */
32
32
  bare?: boolean;
33
33
  /** Hold the field chrome back until hover — for a title or label that IS the content. */
@@ -54,7 +54,7 @@
54
54
  // with a default button (h-icon glyph), an xxs field with a pill-tier button
55
55
  // (icon-xxs). One size for both would leave the two glyphs in one bar drawn at
56
56
  // different weights.
57
- const glyphClass = $derived(size === 'xxs' ? 'size-(--era-glyph-pill)' : 'size-(--era-h-icon)');
57
+ const glyphClass = $derived(size === 'pill' ? 'size-(--era-glyph-pill)' : 'size-(--era-h-icon)');
58
58
  </script>
59
59
 
60
60
  {#if icon}
@@ -9,7 +9,7 @@ type $$ComponentProps = Omit<HTMLInputAttributes, 'size'> & {
9
9
  * Field tier. `pill` is badge height — for compact chrome where the field
10
10
  * sits level with xxs buttons. See inputVariants.
11
11
  */
12
- size?: 'md' | 'xxs';
12
+ size?: 'control' | 'pill';
13
13
  /** Drop the field chrome — for an input inside a container that is already the field. */
14
14
  bare?: boolean;
15
15
  /** Hold the field chrome back until hover — for a title or label that IS the content. */
@@ -60,8 +60,8 @@ export declare const inputVariants: import("tailwind-variants").TVReturnType<{
60
60
  * on this tier read as one family.
61
61
  */
62
62
  size: {
63
- md: "h-(--era-h-control) rounded-(--era-rd-control) px-(--era-field-px)";
64
- xxs: "h-(--era-h-pill) rounded-(--era-rd-pill) px-(--era-pill-px)";
63
+ control: "h-(--era-h-control) rounded-(--era-rd-control) px-(--era-field-px)";
64
+ pill: "h-(--era-h-pill) rounded-(--era-rd-pill) px-(--era-pill-px)";
65
65
  };
66
66
  /**
67
67
  * Height OVERRIDES, for the fields that are not their tier's height. No
@@ -128,8 +128,8 @@ export declare const inputVariants: import("tailwind-variants").TVReturnType<{
128
128
  * on this tier read as one family.
129
129
  */
130
130
  size: {
131
- md: "h-(--era-h-control) rounded-(--era-rd-control) px-(--era-field-px)";
132
- xxs: "h-(--era-h-pill) rounded-(--era-rd-pill) px-(--era-pill-px)";
131
+ control: "h-(--era-h-control) rounded-(--era-rd-control) px-(--era-field-px)";
132
+ pill: "h-(--era-h-pill) rounded-(--era-rd-pill) px-(--era-pill-px)";
133
133
  };
134
134
  /**
135
135
  * Height OVERRIDES, for the fields that are not their tier's height. No
@@ -196,8 +196,8 @@ export declare const inputVariants: import("tailwind-variants").TVReturnType<{
196
196
  * on this tier read as one family.
197
197
  */
198
198
  size: {
199
- md: "h-(--era-h-control) rounded-(--era-rd-control) px-(--era-field-px)";
200
- xxs: "h-(--era-h-pill) rounded-(--era-rd-pill) px-(--era-pill-px)";
199
+ control: "h-(--era-h-control) rounded-(--era-rd-control) px-(--era-field-px)";
200
+ pill: "h-(--era-h-pill) rounded-(--era-rd-pill) px-(--era-pill-px)";
201
201
  };
202
202
  /**
203
203
  * Height OVERRIDES, for the fields that are not their tier's height. No
@@ -63,8 +63,8 @@ export const inputVariants = tv({
63
63
  * on this tier read as one family.
64
64
  */
65
65
  size: {
66
- md: 'h-(--era-h-control) rounded-(--era-rd-control) px-(--era-field-px)',
67
- xxs: 'h-(--era-h-pill) rounded-(--era-rd-pill) px-(--era-pill-px)'
66
+ control: 'h-(--era-h-control) rounded-(--era-rd-control) px-(--era-field-px)',
67
+ pill: 'h-(--era-h-pill) rounded-(--era-rd-pill) px-(--era-pill-px)'
68
68
  },
69
69
  /**
70
70
  * Height OVERRIDES, for the fields that are not their tier's height. No
@@ -100,5 +100,5 @@ export const inputVariants = tv({
100
100
  // second, differently-padded field.
101
101
  { bare: true, class: 'h-full rounded-none px-0' }
102
102
  ],
103
- defaultVariants: { bare: false, reveal: false, size: 'md' }
103
+ defaultVariants: { bare: false, reveal: false, size: 'control' }
104
104
  });
@@ -13,7 +13,7 @@
13
13
  } = $props();
14
14
  </script>
15
15
 
16
- <!-- A raw icon Button (size="xxs" = h-pill, rd-xxs), a tight SQUARE. No
16
+ <!-- A raw icon Button (size="pill" = h-pill, rd-xxs), a tight SQUARE. No
17
17
  data-pane-control: it stays in the drag zone, so a press-and-drag moves the
18
18
  pane while a clean click still closes (neodrag starts a drag only on
19
19
  movement and suppresses the trailing click after a real drag). Its natural
@@ -45,7 +45,7 @@
45
45
  <Button
46
46
  bind:ref
47
47
  icon
48
- size="xxs"
48
+ size="pill"
49
49
  tone="destructive"
50
50
  aria-label="Close"
51
51
  class={cn('[&_svg]:size-[calc(var(--era-sp)+0.3125rem)]', className)}
@@ -35,13 +35,13 @@
35
35
  control ⊃ pill, not chip ⊃ icon: a title bar is the densest chrome in the library and
36
36
  was a tier too short for it — 22px at dense against the 24 the reference
37
37
  terminal app uses, with 14px controls where it uses 18. The pairing is what
38
- carries that: content="xxs" puts the walls on --era-pill-inset-control (3/5/7/11),
38
+ carries that: content="pill" puts the walls on --era-pill-inset-control (3/5/7/11),
39
39
  which is the 3px that app hardcodes for exactly this bar. -->
40
40
  <Bar
41
41
  bind:ref
42
42
  data-pane-handle
43
- size="md"
44
- content="xxs"
43
+ size="control"
44
+ content="pill"
45
45
  divider
46
46
  class={cn(
47
47
  // The cap chrome (outset divider, rd-md bottom corners) is Bar's `divider`
@@ -55,7 +55,7 @@
55
55
  >
56
56
  {#each sel.selected as item (item.value)}
57
57
  <Chip
58
- size="xxs"
58
+ size="pill"
59
59
  ondismiss={snippet.disabled
60
60
  ? undefined
61
61
  : () =>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signal9/era-ui",
3
- "version": "9.0.0",
3
+ "version": "10.0.0",
4
4
  "scripts": {
5
5
  "dev": "vite dev --host",
6
6
  "build": "vite build && npm run prepack",