@signal9/era-ui 7.0.0 → 9.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 +1 -1
- package/dist/ai/artifact/artifact-content.svelte +1 -1
- package/dist/ai/artifact/artifact-header.svelte +1 -1
- package/dist/ai/artifact/artifact.svelte +1 -1
- package/dist/ai/chain-of-thought/chain-of-thought-step.svelte +1 -1
- package/dist/ai/chain-of-thought/chain-of-thought.svelte +1 -1
- package/dist/ai/checkpoint.svelte +1 -1
- package/dist/ai/confirmation/confirmation-args.svelte +2 -2
- package/dist/ai/confirmation/confirmation.svelte +4 -4
- package/dist/ai/context/context.svelte +1 -1
- package/dist/ai/conversation/conversation-content.svelte +1 -1
- package/dist/ai/conversation/conversation-empty-state.svelte +1 -1
- package/dist/ai/conversation/conversation-scroll-button.svelte +2 -2
- package/dist/ai/conversations/conversations-group.svelte +1 -1
- package/dist/ai/conversations/conversations-item.svelte +7 -7
- package/dist/ai/error-panel/error-panel.svelte +4 -4
- package/dist/ai/image.svelte +1 -1
- package/dist/ai/inline-citation/inline-citation.svelte +2 -2
- package/dist/ai/loader.svelte +1 -1
- package/dist/ai/message/message-branch-selector.svelte +3 -3
- package/dist/ai/message/message-content.svelte +1 -1
- package/dist/ai/message/message-usage.svelte +4 -4
- package/dist/ai/model-selector/model-selector.svelte +1 -1
- package/dist/ai/open-in-chat/open-in-chat.svelte +2 -2
- package/dist/ai/plan/plan-content.svelte +1 -1
- package/dist/ai/plan/plan-header.svelte +2 -2
- package/dist/ai/plan/plan.svelte +1 -1
- package/dist/ai/prompt-input/prompt-input-add-attachments.svelte +1 -1
- package/dist/ai/prompt-input/prompt-input-attachments.svelte +5 -5
- package/dist/ai/prompt-input/prompt-input-submit.svelte +3 -3
- package/dist/ai/prompt-input/prompt-input-textarea.svelte +3 -3
- package/dist/ai/prompt-input/prompt-input.svelte +1 -1
- package/dist/ai/queue/queue-item.svelte +1 -1
- package/dist/ai/queue/queue.svelte +1 -1
- package/dist/ai/reasoning/reasoning-trigger.svelte +1 -1
- package/dist/ai/response/response.svelte +2 -2
- package/dist/ai/run-status/run-status.svelte +5 -5
- package/dist/ai/runtime-feed/runtime-feed-item.svelte +1 -1
- package/dist/ai/sources/source.svelte +1 -1
- package/dist/ai/sources/sources-trigger.svelte +1 -1
- package/dist/ai/structured-value/structured-value.svelte +1 -1
- package/dist/ai/suggestion/suggestion.svelte +2 -2
- package/dist/ai/swarm/swarm-agent.svelte +1 -1
- package/dist/ai/swarm/swarm-artifact.svelte +1 -1
- package/dist/ai/swarm/swarm-barrier.svelte +1 -1
- package/dist/ai/swarm/swarm-barriers.svelte +1 -1
- package/dist/ai/swarm/swarm-counts.svelte +1 -1
- package/dist/ai/swarm/swarm-footer.svelte +1 -1
- package/dist/ai/swarm/swarm-grid.svelte +2 -2
- package/dist/ai/swarm/swarm-header.svelte +1 -1
- package/dist/ai/swarm/swarm-node.svelte +7 -7
- package/dist/ai/swarm/swarm-role.svelte +1 -1
- package/dist/ai/swarm/swarm-root.svelte +1 -1
- package/dist/ai/swarm/swarm-sandbox.svelte +3 -3
- package/dist/ai/swarm/swarm-tree.svelte +1 -1
- package/dist/ai/task/task-content.svelte +1 -1
- package/dist/ai/task/task-trigger.svelte +1 -1
- package/dist/ai/tool/tool-chip.svelte +2 -2
- package/dist/ai/tool/tool-exec.svelte +3 -3
- package/dist/ai/tool/tool-header.svelte +1 -1
- package/dist/ai/web-preview/web-preview.svelte +3 -3
- package/dist/ai/workflow/canvas.svelte +1 -1
- package/dist/ai/workflow/node.svelte +3 -3
- package/dist/apps/llm-shell/llm-shell.svelte +7 -7
- package/dist/apps/notes/editor/slash-menu.svelte +7 -5
- package/dist/apps/notes/note-editor.svelte +7 -364
- package/dist/apps/notes/note-editor.svelte.d.ts +1 -0
- package/dist/apps/notes/notes.svelte +9 -9
- package/dist/dev/audit/audits/_helpers.js +1 -1
- package/dist/dev/audit/audits/resting-gap.js +1 -1
- package/dist/dev/audit/audits/single-glyph-square.js +2 -2
- package/dist/dev/audit-overlay.svelte +7 -7
- package/dist/dev/measure.d.ts +1 -1
- package/dist/dev/measure.js +1 -1
- package/dist/docs/badge.md +1 -1
- package/dist/docs/css-utilities.d.ts +1 -1
- package/dist/docs/css-utilities.js +8 -8
- package/dist/docs/llms-txt.js +1 -1
- package/dist/era-ui.css +1 -1
- package/dist/generated-docs/badge.md +1 -1
- package/dist/generated-docs/bar.md +2 -2
- package/dist/generated-docs/chip.md +1 -1
- package/dist/generated-docs/input.md +1 -1
- package/dist/generated-docs/llms-full.txt +100 -120
- package/dist/generated-docs/llms.txt +12 -13
- package/dist/generated-docs/manifest.json +52 -65
- package/dist/generated-docs/utilities.json +45 -57
- package/dist/generated-docs/utilities.md +87 -106
- package/dist/os/notification-center.svelte +6 -6
- package/dist/os/pane.svelte +7 -5
- package/dist/os/taskbar.svelte +10 -10
- package/dist/os/toast.svelte +3 -3
- package/dist/os/toaster.svelte +1 -1
- package/dist/styles/density.css +93 -67
- package/dist/styles/index.css +89 -101
- package/dist/styles/prose.css +384 -0
- package/dist/styles/surfaces/base.css +3 -3
- package/dist/styles/surfaces/bevel.css +2 -2
- package/dist/ui/accordion/accordion-trigger.svelte +2 -2
- package/dist/ui/alert-dialog/alert-dialog-content.svelte +1 -1
- package/dist/ui/aspect-ratio/aspect-ratio.svelte +1 -1
- package/dist/ui/avatar/avatar-root.svelte +1 -1
- package/dist/ui/badge/badge.svelte +1 -1
- package/dist/ui/badge/badge.svelte.d.ts +1 -1
- package/dist/ui/bar/bar.svelte +23 -15
- package/dist/ui/bar/bar.svelte.d.ts +26 -26
- package/dist/ui/button/button.svelte +1 -1
- package/dist/ui/button/variants.js +18 -18
- package/dist/ui/button-group/button-group.svelte +2 -2
- package/dist/ui/calendar/calendar-day.svelte +1 -1
- package/dist/ui/calendar/calendar-head-cell.svelte +1 -1
- package/dist/ui/calendar/calendar-header.svelte +1 -1
- package/dist/ui/calendar/calendar-next-button.svelte +1 -1
- package/dist/ui/calendar/calendar-prev-button.svelte +1 -1
- package/dist/ui/card/card.svelte +5 -5
- package/dist/ui/card/card.svelte.d.ts +4 -4
- package/dist/ui/checkbox/checkbox.svelte +3 -3
- package/dist/ui/chip/chip.svelte +14 -10
- package/dist/ui/chip/chip.svelte.d.ts +7 -7
- package/dist/ui/code-block/code-block.svelte +6 -6
- package/dist/ui/collapsible/collapsible-trigger.svelte +1 -1
- package/dist/ui/combobox/combobox-content.svelte +1 -1
- package/dist/ui/combobox/combobox-empty.svelte +4 -1
- package/dist/ui/combobox/combobox-group-heading.svelte +4 -1
- package/dist/ui/combobox/combobox-item.svelte +1 -1
- package/dist/ui/combobox/combobox-trigger.svelte +2 -2
- package/dist/ui/command/command-group-heading.svelte +4 -1
- package/dist/ui/command/command-item.svelte +1 -1
- package/dist/ui/command/command-link-item.svelte +1 -1
- package/dist/ui/command/command-root.svelte +1 -1
- package/dist/ui/command-bar/command-bar.svelte +16 -12
- package/dist/ui/context-menu/context-menu-checkbox-item.svelte +1 -1
- package/dist/ui/context-menu/context-menu-content.svelte +1 -1
- package/dist/ui/context-menu/context-menu-group-heading.svelte +4 -1
- package/dist/ui/context-menu/context-menu-item.svelte +1 -1
- package/dist/ui/context-menu/context-menu-radio-item.svelte +1 -1
- package/dist/ui/context-menu/context-menu-sub-content.svelte +1 -1
- package/dist/ui/context-menu/context-menu-sub-trigger.svelte +2 -2
- package/dist/ui/copy-button/copy-button.svelte +2 -2
- package/dist/ui/cycle/cycle.svelte +1 -1
- package/dist/ui/date-field/date-field-segment.svelte +1 -1
- package/dist/ui/date-picker/date-picker-content.svelte +1 -1
- package/dist/ui/date-picker/date-picker-day.svelte +1 -1
- package/dist/ui/date-picker/date-picker-head-cell.svelte +1 -1
- package/dist/ui/date-picker/date-picker-header.svelte +1 -1
- package/dist/ui/date-picker/date-picker-next-button.svelte +1 -1
- package/dist/ui/date-picker/date-picker-prev-button.svelte +1 -1
- package/dist/ui/date-picker/date-picker-segment.svelte +1 -1
- package/dist/ui/date-picker/date-picker-trigger.svelte +2 -2
- package/dist/ui/date-range-field/date-range-field-segment.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-content.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-day.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-head-cell.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-header.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-next-button.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-prev-button.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-segment.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-trigger.svelte +2 -2
- package/dist/ui/dialog/dialog-content.svelte +4 -2
- package/dist/ui/dialog/dialog-header.svelte +2 -2
- package/dist/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -1
- package/dist/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
- package/dist/ui/dropdown-menu/dropdown-menu-group-heading.svelte +4 -1
- package/dist/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
- package/dist/ui/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
- package/dist/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
- package/dist/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -2
- package/dist/ui/dropdown-menu/dropdown-menu-trigger.svelte +2 -2
- package/dist/ui/file-upload/file-upload.svelte +2 -2
- package/dist/ui/input/input.svelte +3 -3
- package/dist/ui/input/input.svelte.d.ts +1 -1
- package/dist/ui/input/textarea.svelte +1 -1
- package/dist/ui/input/variants.d.ts +24 -24
- package/dist/ui/input/variants.js +9 -9
- package/dist/ui/kv/kv.svelte +2 -2
- package/dist/ui/link-preview/link-preview-content.svelte +1 -1
- package/dist/ui/menubar/menubar-checkbox-item.svelte +1 -1
- package/dist/ui/menubar/menubar-content.svelte +1 -1
- package/dist/ui/menubar/menubar-group-heading.svelte +4 -1
- package/dist/ui/menubar/menubar-item.svelte +1 -1
- package/dist/ui/menubar/menubar-radio-item.svelte +1 -1
- package/dist/ui/menubar/menubar-root.svelte +1 -1
- package/dist/ui/menubar/menubar-sub-content.svelte +1 -1
- package/dist/ui/menubar/menubar-sub-trigger.svelte +2 -2
- package/dist/ui/menubar/menubar-trigger.svelte +1 -1
- package/dist/ui/meter/meter.svelte +1 -1
- package/dist/ui/pagination/pagination-next-button.svelte +1 -1
- package/dist/ui/pagination/pagination-prev-button.svelte +1 -1
- package/dist/ui/pane/pane-close.svelte +2 -2
- package/dist/ui/pane/pane-content.svelte +1 -1
- package/dist/ui/pane/pane-handle.svelte +3 -3
- package/dist/ui/pane/pane-root.svelte +12 -12
- package/dist/ui/pane/pane-tab-list.svelte +1 -1
- package/dist/ui/pane/pane-tab-panel.svelte +1 -1
- package/dist/ui/pane/pane-tab.svelte +1 -1
- package/dist/ui/pane/pane.svelte +1 -1
- package/dist/ui/pin-input/pin-input-cell.svelte +1 -1
- package/dist/ui/popover/popover-content.svelte +1 -1
- package/dist/ui/progress/progress.svelte +1 -1
- package/dist/ui/radio-group/radio-group-item.svelte +2 -2
- package/dist/ui/rating-group/rating-group-item.svelte +1 -1
- package/dist/ui/scroll-area/scroll-area-thumb.svelte +1 -1
- package/dist/ui/scroll-area/scroll-area.svelte +1 -1
- package/dist/ui/select/select-content.svelte +1 -1
- package/dist/ui/select/select-group-heading.svelte +4 -1
- package/dist/ui/select/select-item.svelte +1 -1
- package/dist/ui/select/select-trigger.svelte +2 -2
- package/dist/ui/select/select-value.svelte +1 -1
- package/dist/ui/sheet/sheet-content.svelte +3 -3
- package/dist/ui/sheet/sheet-content.svelte.d.ts +6 -6
- package/dist/ui/skeleton/skeleton.svelte +3 -3
- package/dist/ui/skeleton/skeleton.svelte.d.ts +9 -9
- package/dist/ui/slider/slider-range.svelte +1 -1
- package/dist/ui/slider/slider-thumb.svelte +1 -1
- package/dist/ui/step/step-content.svelte +1 -1
- package/dist/ui/step/step-summary.svelte +6 -6
- package/dist/ui/switch/switch.svelte +3 -3
- package/dist/ui/table/table-cell.svelte +1 -1
- package/dist/ui/table/table-head-cell.svelte +1 -1
- package/dist/ui/time-field/time-field-segment.svelte +1 -1
- package/dist/ui/time-range-field/time-range-field-segment.svelte +1 -1
- package/dist/ui/toggle-group/toggle-group-item.svelte +1 -1
- package/dist/ui/tooltip/tooltip-content.svelte +1 -1
- package/dist/ui/video-player/video-player.svelte +44 -44
- package/dist/utils/index.js +4 -4
- package/package.json +2 -1
|
@@ -4,8 +4,8 @@ The CSS classes era ships alongside the components — links, ink-centred text,
|
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
|
-
era's styling API is pure class names — write `h-
|
|
8
|
-
never the `h-(--era-h-
|
|
7
|
+
era's styling API is pure class names — write `h-control rounded-control px-gutter shadow`,
|
|
8
|
+
never the `h-(--era-h-control)` var-class spelling. Everything below rides along
|
|
9
9
|
with the stylesheet and needs no import:
|
|
10
10
|
|
|
11
11
|
```ts
|
|
@@ -13,7 +13,7 @@ import "@sig-nine/era-ui/css";
|
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
```svelte
|
|
16
|
-
<button class="h-
|
|
16
|
+
<button class="h-control rounded-control px-inset-control shadow text-body">era styled</button>
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
Alongside the `@utility` classes referenced below, era registers named theme
|
|
@@ -23,8 +23,8 @@ motion):
|
|
|
23
23
|
|
|
24
24
|
| Stock-looking class | What it resolves to |
|
|
25
25
|
|---|---|
|
|
26
|
-
| `rounded-
|
|
27
|
-
| `rounded-item` | menu-row radius, concentric inside a `rounded-
|
|
26
|
+
| `rounded-icon/xxs/sm/md/lg` | the concentric radius ladder (collapses on `data-corners="square"`) |
|
|
27
|
+
| `rounded-menu-item` | menu-row radius, concentric inside a `rounded-control` panel |
|
|
28
28
|
| `shadow` / `shadow-lg` | resting control edge / floating panel chrome, per surface |
|
|
29
29
|
| `shadow-well` / `shadow-pressed` / `shadow-highlight` | recessed, pressed/latched, hover-material chrome |
|
|
30
30
|
| `bg-well` / `bg-elevated` / `bg-highlight` / `bg-overlay` | surface fills: resting, raised, transient feedback, modal scrim |
|
|
@@ -34,7 +34,7 @@ motion):
|
|
|
34
34
|
|
|
35
35
|
Deliberate gaps: `w-*`/`min-w-*` tier names would shadow Tailwind's container
|
|
36
36
|
scale (`min-w-md` stays 28rem), and the concentric-inset tokens are advanced
|
|
37
|
-
enough to stay var-form — `min-w-(--era-h-
|
|
37
|
+
enough to stay var-form — `min-w-(--era-h-control)` etc. remain the escape hatch.
|
|
38
38
|
|
|
39
39
|
| Utility | Use it for |
|
|
40
40
|
|---|---|
|
|
@@ -47,17 +47,16 @@ enough to stay var-form — `min-w-(--era-h-md)` etc. remain the escape hatch.
|
|
|
47
47
|
| `era-token-ink` `era-ink-center` | the ink centring for a token pill — a badge, a KV value, any short caps-or-digits label in a fixed-height box; it needs no icon sibling (with one the box must stay flex, and the general trim applies). |
|
|
48
48
|
| `era-shimmer` | the in-progress text treatment — put it on a "working…" / "thinking…" label while a task streams, instead of a spinner beside the text. |
|
|
49
49
|
| `era-collapse` | the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden). |
|
|
50
|
-
| `h-
|
|
51
|
-
| `min-h-
|
|
52
|
-
| `size-
|
|
53
|
-
| `px-sm` `px-md` `px-lg` | tier-to-tier nesting padding (sp/2) — the horizontal padding of a bar or row that holds tiered controls; the named form of px-(--era-px-*). |
|
|
50
|
+
| `h-icon` `h-pill` `h-chip` `h-control` `h-bar` | the tier-height ladder — h-icon (icon) · h-pill (nested pill) · h-chip (standalone pill) · h-control (control) · h-bar (bar); the named form of h-(--era-h-*). |
|
|
51
|
+
| `min-h-icon` `min-h-pill` `min-h-chip` `min-h-control` `min-h-bar` | minimum tier height for containers that may grow — a bar that is at least lg-tier but can wrap (min-h-bar). |
|
|
52
|
+
| `size-icon` `size-pill` `size-chip` `size-control` `size-bar` | a tier-sized square — size-icon is THE icon size (a Lucide glyph beside body text), size-control a square control face. |
|
|
54
53
|
| `gap-gutter` `p-gutter` `px-gutter` `py-gutter` | the inter-element gap (sp/2) — flex/grid gap between sibling controls, and the matching gutter padding a scrollable list or rail owes its rows on all four sides (p-gutter on the rail = gap-gutter between its rows). |
|
|
55
|
-
| `p-inset-
|
|
56
|
-
| `px-pill
|
|
57
|
-
| `px-field` | text-field side padding — where typed text starts in
|
|
54
|
+
| `p-inset-pill` `p-inset-chip` `p-inset-control` `px-inset-pill` `px-inset-chip` `px-inset-control` `py-inset-pill` `py-inset-chip` `py-inset-control` | text-symmetric content padding — (tier − text)/2, the inset that vertically centers body text in its tier; px-inset-control is a text button's side padding, p-inset-control a code block's. |
|
|
55
|
+
| `px-pill` `px-chip` | pill side padding — the wider-than-vertical horizontal breathing room badge/chip text wants (glyph-advance derived, ~2× the vertical inset). |
|
|
56
|
+
| `px-field` | text-field side padding — where typed text starts in a control-tier input; the named form of px-(--era-field-px). |
|
|
58
57
|
| `p-panel` `p-card` | optical padding for unbounded containers — p-panel for compact shells and menu-adjacent chrome, p-card for cards/dialogs/popovers, p-content for full content panels. Grows super-linearly with density so whitespace holds its perceived share as controls loosen. |
|
|
59
58
|
| `p-content` | — |
|
|
60
|
-
| `p-menu` | menu-panel padding — the surface-owned inset (0 on flat, 2px on glass/bevel) that keeps row highlights inside a floating panel's frame; pairs with rounded-item on the rows. |
|
|
59
|
+
| `p-menu` | menu-panel padding — the surface-owned inset (0 on flat, 2px on glass/bevel) that keeps row highlights inside a floating panel's frame; pairs with rounded-menu-item on the rows. |
|
|
61
60
|
| `duration-base` | the motion axis as an explicit transition-duration — for the rare case a utility (not the transition-* default) needs to name it; 0s at data-motion="instant", longer at "extra". |
|
|
62
61
|
| `glass-blur` | the backdrop blur for a floating panel (popover, dialog, taskbar) — it applies only inside a data-surface="glass" subtree and is inert elsewhere, so it is safe to leave on a panel that renders under every surface. |
|
|
63
62
|
|
|
@@ -345,98 +344,80 @@ Declared in `index.css`.
|
|
|
345
344
|
}
|
|
346
345
|
```
|
|
347
346
|
|
|
348
|
-
## h-
|
|
347
|
+
## h-icon · h-pill · h-chip · h-control · h-bar
|
|
349
348
|
|
|
350
|
-
**Use it for:** the tier-height ladder — h-
|
|
349
|
+
**Use it for:** the tier-height ladder — h-icon (icon) · h-pill (nested pill) · h-chip (standalone pill) · h-control (control) · h-bar (bar); the named form of h-(--era-h-*).
|
|
351
350
|
|
|
352
351
|
Declared in `index.css`.
|
|
353
352
|
|
|
354
353
|
```css
|
|
355
|
-
@utility h-
|
|
356
|
-
height: var(--era-h-
|
|
354
|
+
@utility h-icon {
|
|
355
|
+
height: var(--era-h-icon);
|
|
357
356
|
}
|
|
358
|
-
@utility h-
|
|
359
|
-
height: var(--era-h-
|
|
357
|
+
@utility h-pill {
|
|
358
|
+
height: var(--era-h-pill);
|
|
360
359
|
}
|
|
361
|
-
@utility h-
|
|
362
|
-
height: var(--era-h-
|
|
360
|
+
@utility h-chip {
|
|
361
|
+
height: var(--era-h-chip);
|
|
363
362
|
}
|
|
364
|
-
@utility h-
|
|
365
|
-
height: var(--era-h-
|
|
363
|
+
@utility h-control {
|
|
364
|
+
height: var(--era-h-control);
|
|
366
365
|
}
|
|
367
|
-
@utility h-
|
|
368
|
-
height: var(--era-h-
|
|
366
|
+
@utility h-bar {
|
|
367
|
+
height: var(--era-h-bar);
|
|
369
368
|
}
|
|
370
369
|
```
|
|
371
370
|
|
|
372
|
-
## min-h-
|
|
371
|
+
## min-h-icon · min-h-pill · min-h-chip · min-h-control · min-h-bar
|
|
373
372
|
|
|
374
|
-
**Use it for:** minimum tier height for containers that may grow — a bar that is at least lg-tier but can wrap (min-h-
|
|
373
|
+
**Use it for:** minimum tier height for containers that may grow — a bar that is at least lg-tier but can wrap (min-h-bar).
|
|
375
374
|
|
|
376
375
|
Declared in `index.css`.
|
|
377
376
|
|
|
378
377
|
```css
|
|
379
|
-
@utility min-h-
|
|
380
|
-
min-height: var(--era-h-
|
|
378
|
+
@utility min-h-icon {
|
|
379
|
+
min-height: var(--era-h-icon);
|
|
381
380
|
}
|
|
382
|
-
@utility min-h-
|
|
383
|
-
min-height: var(--era-h-
|
|
381
|
+
@utility min-h-pill {
|
|
382
|
+
min-height: var(--era-h-pill);
|
|
384
383
|
}
|
|
385
|
-
@utility min-h-
|
|
386
|
-
min-height: var(--era-h-
|
|
384
|
+
@utility min-h-chip {
|
|
385
|
+
min-height: var(--era-h-chip);
|
|
387
386
|
}
|
|
388
|
-
@utility min-h-
|
|
389
|
-
min-height: var(--era-h-
|
|
387
|
+
@utility min-h-control {
|
|
388
|
+
min-height: var(--era-h-control);
|
|
390
389
|
}
|
|
391
|
-
@utility min-h-
|
|
392
|
-
min-height: var(--era-h-
|
|
390
|
+
@utility min-h-bar {
|
|
391
|
+
min-height: var(--era-h-bar);
|
|
393
392
|
}
|
|
394
393
|
```
|
|
395
394
|
|
|
396
|
-
## size-
|
|
395
|
+
## size-icon · size-pill · size-chip · size-control · size-bar
|
|
397
396
|
|
|
398
|
-
**Use it for:** a tier-sized square — size-
|
|
397
|
+
**Use it for:** a tier-sized square — size-icon is THE icon size (a Lucide glyph beside body text), size-control a square control face.
|
|
399
398
|
|
|
400
399
|
Declared in `index.css`.
|
|
401
400
|
|
|
402
401
|
```css
|
|
403
|
-
@utility size-
|
|
404
|
-
width: var(--era-h-
|
|
405
|
-
height: var(--era-h-
|
|
402
|
+
@utility size-icon {
|
|
403
|
+
width: var(--era-h-icon);
|
|
404
|
+
height: var(--era-h-icon);
|
|
406
405
|
}
|
|
407
|
-
@utility size-
|
|
408
|
-
width: var(--era-h-
|
|
409
|
-
height: var(--era-h-
|
|
406
|
+
@utility size-pill {
|
|
407
|
+
width: var(--era-h-pill);
|
|
408
|
+
height: var(--era-h-pill);
|
|
410
409
|
}
|
|
411
|
-
@utility size-
|
|
412
|
-
width: var(--era-h-
|
|
413
|
-
height: var(--era-h-
|
|
410
|
+
@utility size-chip {
|
|
411
|
+
width: var(--era-h-chip);
|
|
412
|
+
height: var(--era-h-chip);
|
|
414
413
|
}
|
|
415
|
-
@utility size-
|
|
416
|
-
width: var(--era-h-
|
|
417
|
-
height: var(--era-h-
|
|
414
|
+
@utility size-control {
|
|
415
|
+
width: var(--era-h-control);
|
|
416
|
+
height: var(--era-h-control);
|
|
418
417
|
}
|
|
419
|
-
@utility size-
|
|
420
|
-
width: var(--era-h-
|
|
421
|
-
height: var(--era-h-
|
|
422
|
-
}
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
## px-sm · px-md · px-lg
|
|
426
|
-
|
|
427
|
-
**Use it for:** tier-to-tier nesting padding (sp/2) — the horizontal padding of a bar or row that holds tiered controls; the named form of px-(--era-px-*).
|
|
428
|
-
|
|
429
|
-
Declared in `index.css`.
|
|
430
|
-
|
|
431
|
-
```css
|
|
432
|
-
@utility px-sm {
|
|
433
|
-
padding-inline: var(--era-px-sm);
|
|
434
|
-
}
|
|
435
|
-
@utility px-md {
|
|
436
|
-
padding-inline: var(--era-px-md);
|
|
437
|
-
}
|
|
438
|
-
@utility px-lg {
|
|
439
|
-
padding-inline: var(--era-px-lg);
|
|
418
|
+
@utility size-bar {
|
|
419
|
+
width: var(--era-h-bar);
|
|
420
|
+
height: var(--era-h-bar);
|
|
440
421
|
}
|
|
441
422
|
```
|
|
442
423
|
|
|
@@ -461,60 +442,60 @@ Declared in `index.css`.
|
|
|
461
442
|
}
|
|
462
443
|
```
|
|
463
444
|
|
|
464
|
-
## p-inset-
|
|
445
|
+
## p-inset-pill · p-inset-chip · p-inset-control · px-inset-pill · px-inset-chip · px-inset-control · py-inset-pill · py-inset-chip · py-inset-control
|
|
465
446
|
|
|
466
|
-
**Use it for:** text-symmetric content padding — (tier − text)/2, the inset that vertically centers body text in its tier; px-inset-
|
|
447
|
+
**Use it for:** text-symmetric content padding — (tier − text)/2, the inset that vertically centers body text in its tier; px-inset-control is a text button's side padding, p-inset-control a code block's.
|
|
467
448
|
|
|
468
449
|
Declared in `index.css`.
|
|
469
450
|
|
|
470
451
|
```css
|
|
471
|
-
@utility p-inset-
|
|
472
|
-
padding: var(--era-inset-
|
|
452
|
+
@utility p-inset-pill {
|
|
453
|
+
padding: var(--era-inset-pill);
|
|
473
454
|
}
|
|
474
|
-
@utility p-inset-
|
|
475
|
-
padding: var(--era-inset-
|
|
455
|
+
@utility p-inset-chip {
|
|
456
|
+
padding: var(--era-inset-chip);
|
|
476
457
|
}
|
|
477
|
-
@utility p-inset-
|
|
478
|
-
padding: var(--era-inset-
|
|
458
|
+
@utility p-inset-control {
|
|
459
|
+
padding: var(--era-inset-control);
|
|
479
460
|
}
|
|
480
|
-
@utility px-inset-
|
|
481
|
-
padding-inline: var(--era-inset-
|
|
461
|
+
@utility px-inset-pill {
|
|
462
|
+
padding-inline: var(--era-inset-pill);
|
|
482
463
|
}
|
|
483
|
-
@utility px-inset-
|
|
484
|
-
padding-inline: var(--era-inset-
|
|
464
|
+
@utility px-inset-chip {
|
|
465
|
+
padding-inline: var(--era-inset-chip);
|
|
485
466
|
}
|
|
486
|
-
@utility px-inset-
|
|
487
|
-
padding-inline: var(--era-inset-
|
|
467
|
+
@utility px-inset-control {
|
|
468
|
+
padding-inline: var(--era-inset-control);
|
|
488
469
|
}
|
|
489
|
-
@utility py-inset-
|
|
490
|
-
padding-block: var(--era-inset-
|
|
470
|
+
@utility py-inset-pill {
|
|
471
|
+
padding-block: var(--era-inset-pill);
|
|
491
472
|
}
|
|
492
|
-
@utility py-inset-
|
|
493
|
-
padding-block: var(--era-inset-
|
|
473
|
+
@utility py-inset-chip {
|
|
474
|
+
padding-block: var(--era-inset-chip);
|
|
494
475
|
}
|
|
495
|
-
@utility py-inset-
|
|
496
|
-
padding-block: var(--era-inset-
|
|
476
|
+
@utility py-inset-control {
|
|
477
|
+
padding-block: var(--era-inset-control);
|
|
497
478
|
}
|
|
498
479
|
```
|
|
499
480
|
|
|
500
|
-
## px-pill
|
|
481
|
+
## px-pill · px-chip
|
|
501
482
|
|
|
502
483
|
**Use it for:** pill side padding — the wider-than-vertical horizontal breathing room badge/chip text wants (glyph-advance derived, ~2× the vertical inset).
|
|
503
484
|
|
|
504
485
|
Declared in `index.css`.
|
|
505
486
|
|
|
506
487
|
```css
|
|
507
|
-
@utility px-pill
|
|
508
|
-
padding-inline: var(--era-pill-
|
|
488
|
+
@utility px-pill {
|
|
489
|
+
padding-inline: var(--era-pill-px);
|
|
509
490
|
}
|
|
510
|
-
@utility px-
|
|
511
|
-
padding-inline: var(--era-
|
|
491
|
+
@utility px-chip {
|
|
492
|
+
padding-inline: var(--era-chip-px);
|
|
512
493
|
}
|
|
513
494
|
```
|
|
514
495
|
|
|
515
496
|
## px-field
|
|
516
497
|
|
|
517
|
-
**Use it for:** text-field side padding — where typed text starts in
|
|
498
|
+
**Use it for:** text-field side padding — where typed text starts in a control-tier input; the named form of px-(--era-field-px).
|
|
518
499
|
|
|
519
500
|
Declared in `index.css`.
|
|
520
501
|
|
|
@@ -532,25 +513,25 @@ Declared in `index.css`.
|
|
|
532
513
|
|
|
533
514
|
```css
|
|
534
515
|
@utility p-panel {
|
|
535
|
-
padding: var(--era-pad-
|
|
516
|
+
padding: var(--era-pad-panel);
|
|
536
517
|
}
|
|
537
518
|
@utility p-card {
|
|
538
|
-
padding: var(--era-pad-
|
|
519
|
+
padding: var(--era-pad-card);
|
|
539
520
|
}
|
|
540
521
|
```
|
|
541
522
|
|
|
542
523
|
## p-content
|
|
543
524
|
|
|
544
525
|
A content panel always follows a section header ROW, and that row already
|
|
545
|
-
contributes its own slack: the heading's text sits in an h-
|
|
546
|
-
is (h-
|
|
526
|
+
contributes its own slack: the heading's text sits in an h-bar bar, so there
|
|
527
|
+
is (h-bar − text)/2 of empty bar under its glyphs before the panel even
|
|
547
528
|
starts. Padding the panel evenly on top of that spends the space twice — the
|
|
548
529
|
header ends up floating between the section above and the paragraph it
|
|
549
530
|
introduces rather than binding to it.
|
|
550
531
|
|
|
551
532
|
So the block-start pays only the REMAINDER. The target is the indent: the
|
|
552
533
|
space under a heading should measure the same as the space beside the text,
|
|
553
|
-
which is --era-content-p. The header row already supplies (h-
|
|
534
|
+
which is --era-content-p. The header row already supplies (h-bar − text)/2 of
|
|
554
535
|
it, so the panel adds what's left, and heading-to-paragraph reads equal to
|
|
555
536
|
the paragraph's own inset. Subtracting one --era-gap (the previous rule) left
|
|
556
537
|
the header's slack unaccounted for and the heading still detached.
|
|
@@ -564,13 +545,13 @@ Declared in `index.css`.
|
|
|
564
545
|
```css
|
|
565
546
|
@utility p-content {
|
|
566
547
|
padding: var(--era-content-p);
|
|
567
|
-
padding-top: max(0px, calc(var(--era-content-p) - (var(--era-h-
|
|
548
|
+
padding-top: max(0px, calc(var(--era-content-p) - (var(--era-h-bar) - var(--era-text)) / 2));
|
|
568
549
|
}
|
|
569
550
|
```
|
|
570
551
|
|
|
571
552
|
## p-menu
|
|
572
553
|
|
|
573
|
-
**Use it for:** menu-panel padding — the surface-owned inset (0 on flat, 2px on glass/bevel) that keeps row highlights inside a floating panel's frame; pairs with rounded-item on the rows.
|
|
554
|
+
**Use it for:** menu-panel padding — the surface-owned inset (0 on flat, 2px on glass/bevel) that keeps row highlights inside a floating panel's frame; pairs with rounded-menu-item on the rows.
|
|
574
555
|
|
|
575
556
|
Declared in `index.css`.
|
|
576
557
|
|
|
@@ -51,23 +51,23 @@
|
|
|
51
51
|
class="absolute right-0 flex w-80 flex-col border-l border-divider-faded bg-(--era-surface-bg) shadow-(--era-shadow-lg) glass-blur"
|
|
52
52
|
>
|
|
53
53
|
<header
|
|
54
|
-
class="flex shrink-0 items-center gap-(--era-gap) border-b border-divider-faded px-(--era-pad-
|
|
54
|
+
class="flex shrink-0 items-center gap-(--era-gap) border-b border-divider-faded px-(--era-pad-card) py-(--era-inset-chip)"
|
|
55
55
|
>
|
|
56
56
|
<span class="text-body text-bright">Notifications</span>
|
|
57
57
|
<label
|
|
58
58
|
class="ml-auto flex cursor-pointer items-center gap-(--era-gap) text-body text-muted"
|
|
59
59
|
>
|
|
60
|
-
<BellOff class="size-(--era-h-
|
|
60
|
+
<BellOff class="size-(--era-h-icon)" />
|
|
61
61
|
<Switch bind:checked={notif.dnd} aria-label="Do not disturb" />
|
|
62
62
|
</label>
|
|
63
63
|
</header>
|
|
64
64
|
|
|
65
65
|
<div
|
|
66
|
-
class="scrollbar-none flex min-h-0 flex-1 flex-col gap-(--era-inset-
|
|
66
|
+
class="scrollbar-none flex min-h-0 flex-1 flex-col gap-(--era-inset-chip) overflow-y-auto overscroll-contain p-(--era-pad-card)"
|
|
67
67
|
>
|
|
68
68
|
{#each notif.items as n (n.id)}
|
|
69
69
|
<div
|
|
70
|
-
class="relative flex gap-(--era-inset-
|
|
70
|
+
class="relative flex gap-(--era-inset-chip) overflow-hidden rounded-(--era-rd-control) bg-(--era-surface-bg-elevated) p-(--era-inset-control)"
|
|
71
71
|
>
|
|
72
72
|
<span
|
|
73
73
|
class={cn(
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
)}
|
|
77
77
|
></span>
|
|
78
78
|
{#if n.icon}{@const Icon = n.icon}<Icon
|
|
79
|
-
class="mt-0.5 size-(--era-h-
|
|
79
|
+
class="mt-0.5 size-(--era-h-icon) shrink-0 text-muted"
|
|
80
80
|
/>{/if}
|
|
81
81
|
<div class="min-w-0 flex-1">
|
|
82
82
|
<div class="flex items-baseline gap-(--era-gap)">
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
</div>
|
|
95
95
|
|
|
96
96
|
{#if notif.items.length}
|
|
97
|
-
<footer class="shrink-0 border-t border-divider-faded p-(--era-inset-
|
|
97
|
+
<footer class="shrink-0 border-t border-divider-faded p-(--era-inset-chip)">
|
|
98
98
|
<Button variant="link" size="sm" class="w-full" onclick={() => notif.clear()}>
|
|
99
99
|
Clear all
|
|
100
100
|
</Button>
|
package/dist/os/pane.svelte
CHANGED
|
@@ -88,13 +88,13 @@
|
|
|
88
88
|
>
|
|
89
89
|
<!-- Asymmetric on purpose, the same way a Conversations row is: the TRAILING
|
|
90
90
|
side holds xxs buttons, so it keeps the handle's own concentric wall
|
|
91
|
-
(--era-
|
|
91
|
+
(--era-pill-inset-control, 3/5/7/11) and their corners nest in the pane's; the
|
|
92
92
|
LEADING side holds a bare glyph and a label, which have no corner to nest,
|
|
93
93
|
so they sit at the text inset instead. At the wall the glyph's ink was 3px
|
|
94
94
|
from the edge against 5px above and below it — read as crowded because it
|
|
95
|
-
was. --era-inset-
|
|
95
|
+
was. --era-inset-control is (h-control − text)/2, so the label now starts the same
|
|
96
96
|
distance in from the edge as it sits from the top. -->
|
|
97
|
-
<Pane.Handle class="gap-(--era-gap) pl-(--era-inset-
|
|
97
|
+
<Pane.Handle class="gap-(--era-gap) pl-(--era-inset-control)" center={pane.center}>
|
|
98
98
|
{#if pane.lead}
|
|
99
99
|
<!-- The app replaced the whole icon+title cluster. Its content lives in
|
|
100
100
|
the drag zone like the default one; anything interactive in it
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
{:else}
|
|
104
104
|
{#if pane.icon}
|
|
105
105
|
{@const Icon = pane.icon}
|
|
106
|
-
<Icon class="size-(--era-h-
|
|
106
|
+
<Icon class="size-(--era-h-icon) shrink-0 text-muted" />
|
|
107
107
|
{/if}
|
|
108
108
|
<span class={cn('truncate text-body', focused ? 'text-bright' : 'text-muted')}
|
|
109
109
|
>{pane.title}</span
|
|
@@ -140,7 +140,9 @@
|
|
|
140
140
|
icon
|
|
141
141
|
size="xxs"
|
|
142
142
|
tone={armed === 'minimize' ? 'warning' : armed === 'maximize' ? 'success' : 'destructive'}
|
|
143
|
-
class={armed === 'maximize'
|
|
143
|
+
class={armed === 'maximize'
|
|
144
|
+
? '[&_svg]:size-(--era-glyph-pill)'
|
|
145
|
+
: '[&_svg]:size-(--era-h-icon)'}
|
|
144
146
|
aria-label="Close (right-click minimizes, middle-click maximizes)"
|
|
145
147
|
onclick={() => pm.close(pane.id)}
|
|
146
148
|
oncontextmenu={(e: MouseEvent) => e.preventDefault()}
|
package/dist/os/taskbar.svelte
CHANGED
|
@@ -194,7 +194,7 @@
|
|
|
194
194
|
</script>
|
|
195
195
|
|
|
196
196
|
<!-- Flush: three edges touch the shell; the exposed OUTER corners are the two
|
|
197
|
-
facing the desktop, rounded at the bar's own tier (h-
|
|
197
|
+
facing the desktop, rounded at the bar's own tier (h-bar → rd-lg), with a
|
|
198
198
|
divider on the open edge. Floating: a free-standing Bar tile — gutter all
|
|
199
199
|
around, fully rounded, no border. The corners axis gates the radius for
|
|
200
200
|
free: data-corners="square" zeroes --era-roundness-scale and with it rd-lg. -->
|
|
@@ -202,17 +202,17 @@
|
|
|
202
202
|
bind:this={ref}
|
|
203
203
|
bind:clientHeight={barHeight}
|
|
204
204
|
class={cn(
|
|
205
|
-
'absolute flex h-(--era-h-
|
|
205
|
+
'absolute flex h-(--era-h-bar) items-center gap-(--era-gap) bg-(--era-surface-bg-elevated) px-(--era-inset-chip) shadow-(--era-shadow-lg) glass-blur',
|
|
206
206
|
floating
|
|
207
207
|
? cn(
|
|
208
|
-
'inset-x-(--era-gap) rounded-(--era-rd-
|
|
208
|
+
'inset-x-(--era-gap) rounded-(--era-rd-bar)',
|
|
209
209
|
position === 'top' ? 'top-(--era-gap)' : 'bottom-(--era-gap)'
|
|
210
210
|
)
|
|
211
211
|
: cn(
|
|
212
212
|
'inset-x-0 border-divider-faded',
|
|
213
213
|
position === 'top'
|
|
214
|
-
? 'top-0 rounded-b-(--era-rd-
|
|
215
|
-
: 'bottom-0 rounded-t-(--era-rd-
|
|
214
|
+
? 'top-0 rounded-b-(--era-rd-bar) border-b'
|
|
215
|
+
: 'bottom-0 rounded-t-(--era-rd-bar) border-t'
|
|
216
216
|
),
|
|
217
217
|
LAYER.taskbar,
|
|
218
218
|
className
|
|
@@ -235,7 +235,7 @@
|
|
|
235
235
|
<div class="flex shrink-0 items-center gap-(--era-gap)">
|
|
236
236
|
{#each pinned as p (p.appId)}
|
|
237
237
|
<Button icon size="default" aria-label={p.title} onclick={() => pm.open(p.appId)}>
|
|
238
|
-
{#if p.icon}{@const Icon = p.icon}<Icon class="size-(--era-h-
|
|
238
|
+
{#if p.icon}{@const Icon = p.icon}<Icon class="size-(--era-h-icon)" />{/if}
|
|
239
239
|
</Button>
|
|
240
240
|
{/each}
|
|
241
241
|
</div>
|
|
@@ -273,7 +273,7 @@
|
|
|
273
273
|
win.state === 'minimized' && showWindows !== 'minimized' && 'opacity-60'
|
|
274
274
|
)}
|
|
275
275
|
>
|
|
276
|
-
{#if win.icon}{@const Icon = win.icon}<Icon class="size-(--era-h-
|
|
276
|
+
{#if win.icon}{@const Icon = win.icon}<Icon class="size-(--era-h-icon) shrink-0" />{/if}
|
|
277
277
|
<span class="truncate">{win.title}</span>
|
|
278
278
|
</Button>
|
|
279
279
|
{/each}
|
|
@@ -309,7 +309,7 @@
|
|
|
309
309
|
{#if notif.unread > 0}
|
|
310
310
|
<div class="relative">
|
|
311
311
|
<Button icon size="default" aria-label="Notifications" onclick={onNotifications}>
|
|
312
|
-
<Bell class="size-(--era-h-
|
|
312
|
+
<Bell class="size-(--era-h-icon)" />
|
|
313
313
|
</Button>
|
|
314
314
|
<span
|
|
315
315
|
class="absolute -top-0.5 -right-0.5 flex min-w-4 items-center justify-center rounded-full bg-primary px-1 text-[0.65rem] leading-4 text-primary-fg"
|
|
@@ -329,7 +329,7 @@
|
|
|
329
329
|
already puts the prompt in reach.
|
|
330
330
|
|
|
331
331
|
data-mode="touch" scopes the DENSITY axis to just this control, so it and
|
|
332
|
-
its icon re-tier to the touch scale (h-
|
|
332
|
+
its icon re-tier to the touch scale (h-control 48px, icon 22px) however dense the
|
|
333
333
|
shell around it is — a proper thumb target for the one action a phone user
|
|
334
334
|
can't otherwise reach, without hardcoding a size. -->
|
|
335
335
|
{#if mobileLauncher && position === 'top'}
|
|
@@ -353,7 +353,7 @@
|
|
|
353
353
|
class="shadow-(--era-shadow-lg)"
|
|
354
354
|
onclick={() => commandBar?.focusInput()}
|
|
355
355
|
>
|
|
356
|
-
<Terminal class="size-(--era-h-
|
|
356
|
+
<Terminal class="size-(--era-h-icon)" />
|
|
357
357
|
</Button>
|
|
358
358
|
</div>
|
|
359
359
|
{/if}
|
package/dist/os/toast.svelte
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
</script>
|
|
17
17
|
|
|
18
18
|
<div
|
|
19
|
-
class="pointer-events-auto relative flex w-80 gap-(--era-inset-
|
|
19
|
+
class="pointer-events-auto relative flex w-80 gap-(--era-inset-chip) overflow-hidden rounded-(--era-rd-bar) bg-(--era-surface-bg-elevated) p-(--era-pad-card) shadow-(--era-shadow-lg) glass-blur"
|
|
20
20
|
>
|
|
21
21
|
<span
|
|
22
22
|
class={cn(
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
></span>
|
|
27
27
|
{#if n.icon}
|
|
28
28
|
{@const Icon = n.icon}
|
|
29
|
-
<Icon class="mt-0.5 size-(--era-h-
|
|
29
|
+
<Icon class="mt-0.5 size-(--era-h-chip) shrink-0 text-muted" />
|
|
30
30
|
{/if}
|
|
31
31
|
<div class="min-w-0 flex-1">
|
|
32
32
|
<div class="flex items-start gap-(--era-gap)">
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
</div>
|
|
47
47
|
{#if n.body}<p class="mt-0.5 text-body leading-body break-words text-muted">{n.body}</p>{/if}
|
|
48
48
|
{#if n.actions.length}
|
|
49
|
-
<div class="mt-(--era-inset-
|
|
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
52
|
size="xs"
|
package/dist/os/toaster.svelte
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
desktop; each toast re-enables its own. -->
|
|
17
17
|
<div
|
|
18
18
|
class={cn(
|
|
19
|
-
'pointer-events-none absolute right-(--era-pad-
|
|
19
|
+
'pointer-events-none absolute right-(--era-pad-card) bottom-(--era-h-bar) flex flex-col-reverse gap-(--era-inset-chip)',
|
|
20
20
|
LAYER.toast,
|
|
21
21
|
className
|
|
22
22
|
)}
|