@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.
- package/dist/ai/artifact/artifact-close.svelte +2 -2
- package/dist/ai/checkpoint.svelte +1 -1
- package/dist/ai/context/context.svelte +1 -1
- package/dist/ai/conversation/conversation-scroll-button.svelte +1 -1
- package/dist/ai/conversations/conversations-item.svelte +3 -3
- package/dist/ai/message/message-branch-selector.svelte +2 -2
- package/dist/ai/prompt-input/prompt-input-add-attachments.svelte +1 -1
- package/dist/ai/prompt-input/prompt-input-submit.svelte +1 -1
- package/dist/ai/run-status/run-status.svelte +1 -1
- package/dist/ai/suggestion/suggestion.svelte +1 -1
- package/dist/ai/swarm/swarm-actions.svelte +2 -2
- package/dist/ai/web-preview/web-preview.svelte +2 -2
- package/dist/apps/notes/editor/bubble-toolbar.svelte +3 -3
- package/dist/apps/notes/notes.svelte +11 -11
- package/dist/generated-docs/bar.md +2 -2
- package/dist/generated-docs/button.md +1 -1
- package/dist/generated-docs/chip.md +1 -1
- package/dist/generated-docs/input.md +1 -1
- package/dist/generated-docs/llms-full.txt +5 -5
- package/dist/generated-docs/manifest.json +4 -4
- package/dist/os/notification-center.svelte +1 -1
- package/dist/os/pane.svelte +2 -2
- package/dist/os/taskbar.svelte +4 -4
- package/dist/os/toast.svelte +2 -2
- package/dist/ui/bar/bar.svelte +12 -12
- package/dist/ui/bar/bar.svelte.d.ts +14 -14
- package/dist/ui/button/button.svelte +3 -3
- package/dist/ui/button/button.svelte.d.ts +1 -1
- package/dist/ui/button/index.d.ts +1 -1
- package/dist/ui/button/variants.d.ts +9 -12
- package/dist/ui/button/variants.js +12 -14
- package/dist/ui/chip/chip.svelte +14 -14
- package/dist/ui/chip/chip.svelte.d.ts +7 -7
- package/dist/ui/copy-button/copy-button.svelte +1 -1
- package/dist/ui/dialog/dialog-header.svelte +7 -2
- package/dist/ui/input/input.svelte +3 -3
- package/dist/ui/input/input.svelte.d.ts +1 -1
- package/dist/ui/input/variants.d.ts +6 -6
- package/dist/ui/input/variants.js +3 -3
- package/dist/ui/pane/pane-close.svelte +2 -2
- package/dist/ui/pane/pane-handle.svelte +3 -3
- package/dist/ui/select/select-value.svelte +1 -1
- 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="
|
|
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="
|
|
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="
|
|
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="
|
|
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" />
|
|
@@ -203,7 +203,7 @@
|
|
|
203
203
|
>
|
|
204
204
|
<Button
|
|
205
205
|
icon
|
|
206
|
-
size="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
10
|
+
<Button icon size="control" aria-label={label} onclick={() => attachments.openFileDialog()}>
|
|
11
11
|
<Plus class="size-(--era-h-icon)" />
|
|
12
12
|
</Button>
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
<div class="flex-1"></div>
|
|
116
116
|
|
|
117
117
|
{#if style.active && oncancel}
|
|
118
|
-
<Button size="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
25
|
-
<Button icon size="
|
|
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="
|
|
35
|
-
content="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
280
|
+
<Bar size="control" content="pill" divider class="rounded-none">
|
|
281
281
|
<Input
|
|
282
282
|
icon={Search}
|
|
283
|
-
size="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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?` | `'
|
|
19
|
-
| `content?` | `'tier' \| '
|
|
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?` | `'
|
|
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?` | `'
|
|
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?` | `'
|
|
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?` | `'
|
|
970
|
-
| `content?` | `'tier' \| '
|
|
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?` | `'
|
|
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?` | `'
|
|
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?` | `'
|
|
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":
|
|
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":
|
|
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":
|
|
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":
|
|
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="
|
|
98
|
+
<Button variant="link" size="chip" class="w-full" onclick={() => notif.clear()}>
|
|
99
99
|
Clear all
|
|
100
100
|
</Button>
|
|
101
101
|
</footer>
|
package/dist/os/pane.svelte
CHANGED
|
@@ -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="
|
|
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="
|
|
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)'
|
package/dist/os/taskbar.svelte
CHANGED
|
@@ -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="
|
|
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="
|
|
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="
|
|
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="
|
|
350
|
+
size="control"
|
|
351
351
|
tone="accent"
|
|
352
352
|
aria-label="Open command bar"
|
|
353
353
|
class="shadow-(--era-shadow-lg)"
|
package/dist/os/toast.svelte
CHANGED
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
variant's [&_svg] selector and never applied). -->
|
|
37
37
|
<Button
|
|
38
38
|
icon
|
|
39
|
-
size="
|
|
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="
|
|
52
|
+
size="icon"
|
|
53
53
|
tone={n.tone === 'default' ? 'default' : n.tone}
|
|
54
54
|
onclick={() => {
|
|
55
55
|
action.onClick();
|
package/dist/ui/bar/bar.svelte
CHANGED
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
base: 'flex items-center era-text-trim',
|
|
14
14
|
variants: {
|
|
15
15
|
size: {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
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: '
|
|
65
|
-
content: '
|
|
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: '
|
|
74
|
-
content: '
|
|
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: '
|
|
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 = '
|
|
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?: '
|
|
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' | '
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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?: '
|
|
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' | '
|
|
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 = '
|
|
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?: '
|
|
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="
|
|
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?: '
|
|
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?: '
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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: {
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
61
|
+
size: 'chip',
|
|
62
62
|
class: 'px-(--era-inset-chip) has-[svg]:gap-(--era-inset-chip)'
|
|
63
63
|
},
|
|
64
|
-
{ variant: 'filled', icon: false, size: '
|
|
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: '
|
|
82
|
-
{ icon: true, size: '
|
|
83
|
-
{ icon: true, size: '
|
|
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: '
|
|
124
|
+
size: 'control',
|
|
127
125
|
icon: false,
|
|
128
126
|
active: false
|
|
129
127
|
}
|
package/dist/ui/chip/chip.svelte
CHANGED
|
@@ -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
|
-
|
|
20
|
-
|
|
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: '
|
|
27
|
-
{ size: '
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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-
|
|
40
|
+
// the cap shares rd-pill exactly rather than approximating it.
|
|
41
41
|
{
|
|
42
|
-
size: '
|
|
42
|
+
size: 'chip',
|
|
43
43
|
dismissible: true,
|
|
44
44
|
class: 'gap-(--era-pill-inset-chip) pr-(--era-pill-inset-chip)'
|
|
45
45
|
},
|
|
46
|
-
{ size: '
|
|
46
|
+
{ size: 'pill', dismissible: true, class: 'gap-(--era-icon-inset-pill) pr-0' }
|
|
47
47
|
],
|
|
48
|
-
defaultVariants: { size: '
|
|
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 = '
|
|
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?: '
|
|
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="
|
|
96
|
+
size="pill"
|
|
97
97
|
tone="destructive"
|
|
98
|
-
class={size === '
|
|
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
|
-
|
|
4
|
-
|
|
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
|
-
|
|
13
|
-
|
|
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
|
-
|
|
22
|
-
|
|
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?: '
|
|
35
|
+
size?: 'chip' | 'pill';
|
|
36
36
|
ondismiss?: () => void;
|
|
37
37
|
children?: Snippet;
|
|
38
38
|
};
|
|
@@ -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
|
|
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="
|
|
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 = '
|
|
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?: '
|
|
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 === '
|
|
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?: '
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
132
|
-
|
|
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
|
-
|
|
200
|
-
|
|
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
|
-
|
|
67
|
-
|
|
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: '
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
44
|
-
content="
|
|
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`
|