@signal9/era-ui 10.0.0 → 11.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/actions/actions.svelte +1 -1
- package/dist/ai/artifact/artifact-actions.svelte +1 -1
- 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 -4
- package/dist/ai/chain-of-thought/chain-of-thought-step.svelte +3 -3
- package/dist/ai/chain-of-thought/chain-of-thought.svelte +1 -1
- package/dist/ai/checkpoint.svelte +2 -2
- package/dist/ai/confirmation/confirmation-actions.svelte +1 -1
- package/dist/ai/confirmation/confirmation-args.svelte +4 -4
- package/dist/ai/confirmation/confirmation.svelte +5 -8
- package/dist/ai/context/context.svelte +3 -3
- package/dist/ai/conversation/conversation-content.svelte +1 -4
- package/dist/ai/conversation/conversation-empty-state.svelte +1 -1
- package/dist/ai/conversation/conversation-scroll-button.svelte +3 -3
- package/dist/ai/conversations/conversations-group.svelte +2 -2
- package/dist/ai/conversations/conversations-item.svelte +8 -8
- package/dist/ai/conversations/conversations-root.svelte +2 -2
- package/dist/ai/error-panel/error-panel.svelte +7 -7
- package/dist/ai/image.svelte +1 -1
- package/dist/ai/index.js +1 -1
- package/dist/ai/inline-citation/inline-citation.svelte +5 -5
- package/dist/ai/loader.svelte +1 -4
- package/dist/ai/message/message-branch-selector.svelte +3 -3
- package/dist/ai/message/message-branch.svelte +1 -1
- package/dist/ai/message/message-content.svelte +1 -1
- package/dist/ai/message/message-toolbar.svelte +1 -1
- package/dist/ai/message/message-usage.svelte +5 -7
- package/dist/ai/message/message.svelte +1 -1
- package/dist/ai/model-selector/model-selector.svelte +2 -2
- 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 -4
- 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 +2 -2
- package/dist/ai/prompt-input/prompt-input-textarea.svelte +2 -2
- package/dist/ai/prompt-input/prompt-input-toolbar.svelte +1 -1
- 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 +1 -1
- package/dist/ai/run-status/run-status.svelte +7 -11
- package/dist/ai/runtime-feed/runtime-feed-item.svelte +1 -4
- package/dist/ai/runtime-feed/runtime-feed-root.svelte +1 -1
- package/dist/ai/sources/source.svelte +2 -2
- package/dist/ai/sources/sources-trigger.svelte +1 -1
- package/dist/ai/structured-value/structured-value.svelte +4 -4
- package/dist/ai/suggestion/suggestion.svelte +1 -1
- package/dist/ai/suggestion/suggestions.svelte +1 -1
- package/dist/ai/swarm/swarm-agent.svelte +3 -3
- package/dist/ai/swarm/swarm-artifact.svelte +2 -2
- package/dist/ai/swarm/swarm-barrier.svelte +3 -3
- package/dist/ai/swarm/swarm-barriers.svelte +1 -4
- package/dist/ai/swarm/swarm-counts.svelte +2 -2
- package/dist/ai/swarm/swarm-footer.svelte +4 -3
- package/dist/ai/swarm/swarm-grid.svelte +2 -2
- package/dist/ai/swarm/swarm-header.svelte +2 -2
- package/dist/ai/swarm/swarm-node.svelte +7 -9
- package/dist/ai/swarm/swarm-role.svelte +6 -3
- package/dist/ai/swarm/swarm-root.svelte +1 -4
- package/dist/ai/swarm/swarm-sandbox.svelte +4 -7
- package/dist/ai/swarm/swarm-tree.svelte +2 -2
- package/dist/ai/task/task-content.svelte +1 -4
- package/dist/ai/task/task-trigger.svelte +1 -1
- package/dist/ai/tool/tool-chip.svelte +3 -3
- package/dist/ai/tool/tool-chips.svelte +3 -3
- package/dist/ai/tool/tool-exec.svelte +4 -4
- package/dist/ai/tool/tool-header.svelte +1 -1
- package/dist/ai/web-preview/web-preview.svelte +4 -9
- package/dist/ai/workflow/canvas.svelte +1 -1
- package/dist/ai/workflow/node.svelte +3 -3
- package/dist/apps/index.d.ts +3 -3
- package/dist/apps/index.js +3 -3
- package/dist/apps/llm-shell/llm-shell.svelte +4 -4
- package/dist/apps/notes/editor/slash-menu.svelte +2 -4
- package/dist/apps/notes/notes.svelte +8 -8
- package/dist/dev/audit/audits/anonymous-text.d.ts +2 -0
- package/dist/dev/audit/audits/anonymous-text.js +73 -0
- package/dist/dev/audit/audits/even-container-padding.js +2 -2
- package/dist/dev/audit/audits/index.d.ts +2 -1
- package/dist/dev/audit/audits/index.js +3 -1
- package/dist/dev/audit/audits/single-glyph-square.js +2 -2
- package/dist/dev/audit/types.d.ts +1 -1
- package/dist/dev/audit-overlay.svelte +7 -7
- package/dist/docs/css-utilities.d.ts +31 -0
- package/dist/docs/css-utilities.js +142 -8
- package/dist/docs/llms-txt.js +2 -2
- package/dist/docs/notes.md +3 -3
- package/dist/docs/quickstart.md +5 -5
- package/dist/era-ui.css +1 -1
- package/dist/generated-docs/llms-full.txt +455 -110
- package/dist/generated-docs/llms.txt +29 -14
- package/dist/generated-docs/manifest.json +382 -55
- package/dist/generated-docs/notes.md +3 -3
- package/dist/generated-docs/utilities.json +359 -45
- package/dist/generated-docs/utilities.md +423 -93
- package/dist/os/notification-center.svelte +11 -17
- package/dist/os/pane-manager.svelte.d.ts +1 -1
- package/dist/os/pane.svelte +4 -6
- package/dist/os/taskbar.svelte +13 -18
- package/dist/os/toast.svelte +6 -11
- package/dist/os/toaster.svelte +1 -1
- package/dist/styles/density.css +0 -2
- package/dist/styles/index.css +160 -84
- package/dist/ui/accordion/accordion-content.svelte +1 -1
- package/dist/ui/accordion/accordion-trigger.svelte +2 -2
- package/dist/ui/alert-dialog/alert-dialog-content.svelte +2 -2
- package/dist/ui/alert-dialog/alert-dialog-overlay.svelte +1 -1
- package/dist/ui/aspect-ratio/aspect-ratio.svelte +1 -5
- package/dist/ui/avatar/avatar-fallback.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 +8 -8
- package/dist/ui/bar/bar.svelte.d.ts +16 -16
- package/dist/ui/button/button.svelte +13 -2
- package/dist/ui/button/variants.d.ts +4 -4
- 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-grid-row.svelte +1 -1
- package/dist/ui/calendar/calendar-grid.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/calendar/calendar-root.svelte +1 -1
- package/dist/ui/card/card.svelte +10 -10
- package/dist/ui/card/card.svelte.d.ts +16 -16
- package/dist/ui/checkbox/checkbox-group.svelte +1 -1
- package/dist/ui/checkbox/checkbox.svelte +1 -1
- package/dist/ui/chip/chip.svelte +15 -7
- package/dist/ui/chip/chip.svelte.d.ts +7 -7
- package/dist/ui/code-block/code-block.svelte +3 -9
- 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 +1 -6
- package/dist/ui/combobox/combobox-group-heading.svelte +1 -4
- package/dist/ui/combobox/combobox-input.svelte +1 -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 +1 -4
- package/dist/ui/command/command-group-items.svelte +1 -5
- 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 +2 -2
- package/dist/ui/command/command-viewport.svelte +1 -1
- package/dist/ui/command-bar/command-bar.svelte +9 -13
- package/dist/ui/context-menu/context-menu-checkbox-item.svelte +1 -1
- package/dist/ui/context-menu/context-menu-content.svelte +2 -2
- package/dist/ui/context-menu/context-menu-group-heading.svelte +1 -4
- 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 +2 -2
- package/dist/ui/date-field/date-field-segment.svelte +1 -1
- package/dist/ui/date-picker/date-picker-calendar.svelte +1 -1
- package/dist/ui/date-picker/date-picker-content.svelte +1 -4
- package/dist/ui/date-picker/date-picker-day.svelte +1 -1
- package/dist/ui/date-picker/date-picker-grid-row.svelte +1 -1
- package/dist/ui/date-picker/date-picker-grid.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-calendar.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-content.svelte +1 -4
- package/dist/ui/date-range-picker/date-range-picker-day.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-grid-row.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-grid.svelte +1 -5
- 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 +3 -5
- package/dist/ui/dialog/dialog-header.svelte +1 -6
- package/dist/ui/dialog/dialog-overlay.svelte +1 -5
- package/dist/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -1
- package/dist/ui/dropdown-menu/dropdown-menu-content.svelte +2 -2
- package/dist/ui/dropdown-menu/dropdown-menu-group-heading.svelte +1 -4
- 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/index.js +1 -1
- package/dist/ui/input/input.svelte +2 -2
- package/dist/ui/input/textarea.svelte +1 -1
- package/dist/ui/input/variants.d.ts +18 -18
- package/dist/ui/input/variants.js +6 -6
- package/dist/ui/kv/kv.svelte +2 -3
- 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 +2 -2
- package/dist/ui/menubar/menubar-group-heading.svelte +1 -4
- 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 -4
- 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 +2 -2
- package/dist/ui/pagination/pagination-next-button.svelte +1 -1
- package/dist/ui/pagination/pagination-prev-button.svelte +1 -1
- package/dist/ui/pagination/pagination-root.svelte +1 -1
- package/dist/ui/pane/pane-content.svelte +1 -1
- package/dist/ui/pane/pane-root.svelte +1 -1
- 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/popover/popover-trigger.svelte +1 -4
- package/dist/ui/progress/progress.svelte +2 -2
- package/dist/ui/radio-group/radio-group-item.svelte +2 -2
- package/dist/ui/radio-group/radio-group-root.svelte +1 -1
- package/dist/ui/rating-group/rating-group-item.svelte +1 -1
- package/dist/ui/rating-group/rating-group-root.svelte +1 -1
- package/dist/ui/scroll-area/scroll-area-scrollbar.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 +7 -6
- package/dist/ui/select/select-group-heading.svelte +1 -4
- 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/separator/separator.svelte +1 -1
- package/dist/ui/sheet/sheet-content.svelte +3 -3
- package/dist/ui/sheet/sheet-content.svelte.d.ts +4 -4
- package/dist/ui/skeleton/skeleton.svelte +4 -4
- package/dist/ui/skeleton/skeleton.svelte.d.ts +10 -10
- package/dist/ui/slider/slider-range.svelte +1 -1
- package/dist/ui/slider/slider-thumb.svelte +1 -1
- package/dist/ui/slider/slider-tick.svelte +1 -1
- package/dist/ui/step/step-content.svelte +1 -1
- package/dist/ui/step/step-section.svelte +1 -1
- package/dist/ui/step/step-summary.svelte +7 -7
- package/dist/ui/switch/switch.svelte +2 -2
- package/dist/ui/table/table-cell.svelte +1 -1
- package/dist/ui/table/table-head-cell.svelte +1 -1
- package/dist/ui/table/table-row.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/toggle-group/toggle-group-root.svelte +1 -1
- package/dist/ui/tooltip/tooltip-content.svelte +1 -1
- package/dist/ui/video-player/video-player.svelte +44 -47
- package/dist/utils/index.js +1 -1
- package/package.json +4 -3
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
const pm = getPaneManager();
|
|
14
14
|
|
|
15
15
|
const accent: Record<AppNotification['tone'], string> = {
|
|
16
|
-
default: 'bg-
|
|
16
|
+
default: 'bg-highlight',
|
|
17
17
|
accent: 'bg-primary',
|
|
18
18
|
success: 'bg-success',
|
|
19
19
|
destructive: 'bg-destructive'
|
|
@@ -48,38 +48,32 @@
|
|
|
48
48
|
transition:eraFly={{ x: 320, duration: 200 }}
|
|
49
49
|
style:top="{pm.insets.top}px"
|
|
50
50
|
style:bottom="{pm.insets.bottom}px"
|
|
51
|
-
class="absolute right-0 flex w-80 flex-col border-l border-divider-faded bg-
|
|
51
|
+
class="absolute right-0 flex w-80 flex-col border-l border-divider-faded bg-well shadow-lg glass-blur"
|
|
52
52
|
>
|
|
53
53
|
<header
|
|
54
|
-
class="flex shrink-0 items-center gap-
|
|
54
|
+
class="flex shrink-0 items-center gap-gutter border-b border-divider-faded px-card py-inset-chip"
|
|
55
55
|
>
|
|
56
56
|
<span class="text-body text-bright">Notifications</span>
|
|
57
|
-
<label
|
|
58
|
-
class="
|
|
59
|
-
>
|
|
60
|
-
<BellOff class="size-(--era-h-icon)" />
|
|
57
|
+
<label class="ml-auto flex cursor-pointer items-center gap-gutter text-body text-muted">
|
|
58
|
+
<BellOff class="size-icon" />
|
|
61
59
|
<Switch bind:checked={notif.dnd} aria-label="Do not disturb" />
|
|
62
60
|
</label>
|
|
63
61
|
</header>
|
|
64
62
|
|
|
65
63
|
<div
|
|
66
|
-
class="scrollbar-none flex min-h-0 flex-1 flex-col gap-
|
|
64
|
+
class="scrollbar-none flex min-h-0 flex-1 flex-col gap-inset-chip overflow-y-auto overscroll-contain p-card"
|
|
67
65
|
>
|
|
68
66
|
{#each notif.items as n (n.id)}
|
|
69
67
|
<div
|
|
70
|
-
class="relative flex gap-
|
|
68
|
+
class="relative flex gap-inset-chip overflow-hidden rounded-control bg-elevated p-inset-control"
|
|
71
69
|
>
|
|
72
|
-
<span
|
|
73
|
-
class={cn(
|
|
74
|
-
'absolute inset-y-(--era-panel-inset) left-(--era-panel-inset) w-1 rounded-full',
|
|
75
|
-
accent[n.tone]
|
|
76
|
-
)}
|
|
70
|
+
<span class={cn('absolute inset-y-menu left-menu w-1 rounded-full', accent[n.tone])}
|
|
77
71
|
></span>
|
|
78
72
|
{#if n.icon}{@const Icon = n.icon}<Icon
|
|
79
|
-
class="mt-0.5 size-
|
|
73
|
+
class="mt-0.5 size-icon shrink-0 text-muted"
|
|
80
74
|
/>{/if}
|
|
81
75
|
<div class="min-w-0 flex-1">
|
|
82
|
-
<div class="flex items-baseline gap-
|
|
76
|
+
<div class="flex items-baseline gap-gutter">
|
|
83
77
|
<p class="min-w-0 flex-1 truncate text-body text-bright">{n.title}</p>
|
|
84
78
|
<span class="shrink-0 text-body text-muted tabular-nums">{ago(n.createdAt)}</span>
|
|
85
79
|
</div>
|
|
@@ -94,7 +88,7 @@
|
|
|
94
88
|
</div>
|
|
95
89
|
|
|
96
90
|
{#if notif.items.length}
|
|
97
|
-
<footer class="shrink-0 border-t border-divider-faded p-
|
|
91
|
+
<footer class="shrink-0 border-t border-divider-faded p-inset-chip">
|
|
98
92
|
<Button variant="link" size="chip" class="w-full" onclick={() => notif.clear()}>
|
|
99
93
|
Clear all
|
|
100
94
|
</Button>
|
|
@@ -135,7 +135,7 @@ export interface AppDefinition {
|
|
|
135
135
|
* × gesture won't arm it and taskbar tabs only focus — minimize() and
|
|
136
136
|
* toggleMinimize() become focus-only no-ops. */
|
|
137
137
|
minimizable?: boolean;
|
|
138
|
-
/** Extra classes for the pane body (Pane.Content) — e.g. `p-
|
|
138
|
+
/** Extra classes for the pane body (Pane.Content) — e.g. `p-gutter`
|
|
139
139
|
* for a body of controls, or `p-0` for a full-bleed app. */
|
|
140
140
|
bodyClass?: string;
|
|
141
141
|
/**
|
package/dist/os/pane.svelte
CHANGED
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
// outline-(--color-7) rather than `outline-7`, which Tailwind reads as a 7px
|
|
83
83
|
// outline WIDTH — the numeric colour scale collides with the width scale on
|
|
84
84
|
// border-* and outline-*, so those two always take the paren-var form here.
|
|
85
|
-
focused ? 'outline -outline-offset-1 outline-(--color-7)' : 'opacity-95 shadow-
|
|
85
|
+
focused ? 'outline -outline-offset-1 outline-(--color-7)' : 'opacity-95 shadow-sm',
|
|
86
86
|
pane.state === 'minimized' && 'hidden'
|
|
87
87
|
)}
|
|
88
88
|
>
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
from the edge against 5px above and below it — read as crowded because it
|
|
95
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-
|
|
97
|
+
<Pane.Handle class="gap-gutter pl-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-
|
|
106
|
+
<Icon class="size-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,9 +140,7 @@
|
|
|
140
140
|
icon
|
|
141
141
|
size="pill"
|
|
142
142
|
tone={armed === 'minimize' ? 'warning' : armed === 'maximize' ? 'success' : 'destructive'}
|
|
143
|
-
class={armed === 'maximize'
|
|
144
|
-
? '[&_svg]:size-(--era-glyph-pill)'
|
|
145
|
-
: '[&_svg]:size-(--era-h-icon)'}
|
|
143
|
+
class={armed === 'maximize' ? '[&_svg]:size-glyph-pill' : '[&_svg]:size-icon'}
|
|
146
144
|
aria-label="Close (right-click minimizes, middle-click maximizes)"
|
|
147
145
|
onclick={() => pm.close(pane.id)}
|
|
148
146
|
oncontextmenu={(e: MouseEvent) => e.preventDefault()}
|
package/dist/os/taskbar.svelte
CHANGED
|
@@ -202,17 +202,12 @@
|
|
|
202
202
|
bind:this={ref}
|
|
203
203
|
bind:clientHeight={barHeight}
|
|
204
204
|
class={cn(
|
|
205
|
-
'absolute flex h-
|
|
205
|
+
'absolute flex h-bar items-center gap-gutter bg-elevated px-inset-chip shadow-lg glass-blur',
|
|
206
206
|
floating
|
|
207
|
-
? cn(
|
|
208
|
-
'inset-x-(--era-gap) rounded-(--era-rd-bar)',
|
|
209
|
-
position === 'top' ? 'top-(--era-gap)' : 'bottom-(--era-gap)'
|
|
210
|
-
)
|
|
207
|
+
? cn('inset-x-gutter rounded-bar', position === 'top' ? 'top-gutter' : 'bottom-gutter')
|
|
211
208
|
: cn(
|
|
212
209
|
'inset-x-0 border-divider-faded',
|
|
213
|
-
position === 'top'
|
|
214
|
-
? 'top-0 rounded-b-(--era-rd-bar) border-b'
|
|
215
|
-
: 'bottom-0 rounded-t-(--era-rd-bar) border-t'
|
|
210
|
+
position === 'top' ? 'top-0 rounded-b-bar border-b' : 'bottom-0 rounded-t-bar border-t'
|
|
216
211
|
),
|
|
217
212
|
LAYER.taskbar,
|
|
218
213
|
className
|
|
@@ -232,10 +227,10 @@
|
|
|
232
227
|
/>
|
|
233
228
|
|
|
234
229
|
{#if pinned.length}
|
|
235
|
-
<div class="flex shrink-0 items-center gap-
|
|
230
|
+
<div class="flex shrink-0 items-center gap-gutter">
|
|
236
231
|
{#each pinned as p (p.appId)}
|
|
237
232
|
<Button icon size="control" aria-label={p.title} onclick={() => pm.open(p.appId)}>
|
|
238
|
-
{#if p.icon}{@const Icon = p.icon}<Icon class="size-
|
|
233
|
+
{#if p.icon}{@const Icon = p.icon}<Icon class="size-icon" />{/if}
|
|
239
234
|
</Button>
|
|
240
235
|
{/each}
|
|
241
236
|
</div>
|
|
@@ -250,7 +245,7 @@
|
|
|
250
245
|
gap between the bar's other groups. -->
|
|
251
246
|
{#if tabPanes.length > 0}
|
|
252
247
|
<div
|
|
253
|
-
class="scrollbar-none flex max-w-[40%] min-w-0 shrink-0 items-center gap-
|
|
248
|
+
class="scrollbar-none flex max-w-[40%] min-w-0 shrink-0 items-center gap-gutter overflow-x-auto"
|
|
254
249
|
>
|
|
255
250
|
{#each tabPanes as win (win.id)}
|
|
256
251
|
<Button
|
|
@@ -273,7 +268,7 @@
|
|
|
273
268
|
win.state === 'minimized' && showWindows !== 'minimized' && 'opacity-60'
|
|
274
269
|
)}
|
|
275
270
|
>
|
|
276
|
-
{#if win.icon}{@const Icon = win.icon}<Icon class="size-
|
|
271
|
+
{#if win.icon}{@const Icon = win.icon}<Icon class="size-icon shrink-0" />{/if}
|
|
277
272
|
<span class="truncate">{win.title}</span>
|
|
278
273
|
</Button>
|
|
279
274
|
{/each}
|
|
@@ -284,7 +279,7 @@
|
|
|
284
279
|
once there's something to switch between (and only when the bar exposes
|
|
285
280
|
workspaces at all). -->
|
|
286
281
|
{#if showWorkspaces && pm.workspaces.length > 1}
|
|
287
|
-
<div class="flex shrink-0 items-center gap-
|
|
282
|
+
<div class="flex shrink-0 items-center gap-gutter">
|
|
288
283
|
{#each pm.workspaces as ws, i (ws.id)}
|
|
289
284
|
<Button
|
|
290
285
|
icon
|
|
@@ -301,7 +296,7 @@
|
|
|
301
296
|
{/if}
|
|
302
297
|
|
|
303
298
|
<!-- System tray -->
|
|
304
|
-
<div class="flex shrink-0 items-center gap-
|
|
299
|
+
<div class="flex shrink-0 items-center gap-gutter">
|
|
305
300
|
{@render end?.()}
|
|
306
301
|
<!-- The bell only exists while there's something unread — silent means
|
|
307
302
|
no dead chrome (the center stays reachable via onNotifications
|
|
@@ -309,7 +304,7 @@
|
|
|
309
304
|
{#if notif.unread > 0}
|
|
310
305
|
<div class="relative">
|
|
311
306
|
<Button icon size="control" aria-label="Notifications" onclick={onNotifications}>
|
|
312
|
-
<Bell class="size-
|
|
307
|
+
<Bell class="size-icon" />
|
|
313
308
|
</Button>
|
|
314
309
|
<span
|
|
315
310
|
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"
|
|
@@ -336,7 +331,7 @@
|
|
|
336
331
|
<div
|
|
337
332
|
data-mode="touch"
|
|
338
333
|
class={cn(
|
|
339
|
-
'absolute right-
|
|
334
|
+
'absolute right-gutter bottom-[max(var(--era-gap),env(safe-area-inset-bottom))] sm:hidden',
|
|
340
335
|
LAYER.taskbar
|
|
341
336
|
)}
|
|
342
337
|
>
|
|
@@ -350,10 +345,10 @@
|
|
|
350
345
|
size="control"
|
|
351
346
|
tone="accent"
|
|
352
347
|
aria-label="Open command bar"
|
|
353
|
-
class="shadow-
|
|
348
|
+
class="shadow-lg"
|
|
354
349
|
onclick={() => commandBar?.focusInput()}
|
|
355
350
|
>
|
|
356
|
-
<Terminal class="size-
|
|
351
|
+
<Terminal class="size-icon" />
|
|
357
352
|
</Button>
|
|
358
353
|
</div>
|
|
359
354
|
{/if}
|
package/dist/os/toast.svelte
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
const notif = getNotifications();
|
|
9
9
|
|
|
10
10
|
const accent: Record<AppNotification['tone'], string> = {
|
|
11
|
-
default: 'bg-
|
|
11
|
+
default: 'bg-highlight',
|
|
12
12
|
accent: 'bg-primary',
|
|
13
13
|
success: 'bg-success',
|
|
14
14
|
destructive: 'bg-destructive'
|
|
@@ -16,20 +16,15 @@
|
|
|
16
16
|
</script>
|
|
17
17
|
|
|
18
18
|
<div
|
|
19
|
-
class="pointer-events-auto relative flex w-80 gap-
|
|
19
|
+
class="pointer-events-auto relative flex w-80 gap-inset-chip overflow-hidden rounded-bar bg-elevated p-card shadow-lg glass-blur"
|
|
20
20
|
>
|
|
21
|
-
<span
|
|
22
|
-
class={cn(
|
|
23
|
-
'absolute inset-y-(--era-panel-inset) left-(--era-panel-inset) w-1 rounded-full',
|
|
24
|
-
accent[n.tone]
|
|
25
|
-
)}
|
|
26
|
-
></span>
|
|
21
|
+
<span class={cn('absolute inset-y-menu left-menu w-1 rounded-full', accent[n.tone])}></span>
|
|
27
22
|
{#if n.icon}
|
|
28
23
|
{@const Icon = n.icon}
|
|
29
|
-
<Icon class="mt-0.5 size-
|
|
24
|
+
<Icon class="mt-0.5 size-chip shrink-0 text-muted" />
|
|
30
25
|
{/if}
|
|
31
26
|
<div class="min-w-0 flex-1">
|
|
32
|
-
<div class="flex items-start gap-
|
|
27
|
+
<div class="flex items-start gap-gutter">
|
|
33
28
|
<p class="min-w-0 flex-1 truncate text-body text-bright">{n.title}</p>
|
|
34
29
|
<!-- The dismiss family's ×: xxs tier, whose default glyph is the 12px
|
|
35
30
|
dismiss ink (the size class that sat on the <X> lost to the Button
|
|
@@ -46,7 +41,7 @@
|
|
|
46
41
|
</div>
|
|
47
42
|
{#if n.body}<p class="mt-0.5 text-body leading-body break-words text-muted">{n.body}</p>{/if}
|
|
48
43
|
{#if n.actions.length}
|
|
49
|
-
<div class="mt-
|
|
44
|
+
<div class="mt-inset-chip flex flex-wrap gap-gutter">
|
|
50
45
|
{#each n.actions as action (action.label)}
|
|
51
46
|
<Button
|
|
52
47
|
size="icon"
|
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-
|
|
19
|
+
'pointer-events-none absolute right-card bottom-(--era-h-bar) flex flex-col-reverse gap-inset-chip',
|
|
20
20
|
LAYER.toast,
|
|
21
21
|
className
|
|
22
22
|
)}
|
package/dist/styles/density.css
CHANGED
|
@@ -74,7 +74,6 @@
|
|
|
74
74
|
* --era-pad-content 2·so 16 / 22.5 / 30 / 48 — full content panels (docs sections)
|
|
75
75
|
*
|
|
76
76
|
* Whitespace share rises with mode: pad-md / h-control = 0.33 dense → 0.50 touch.
|
|
77
|
-
* --era-content-p is kept as an alias of --era-pad-content.
|
|
78
77
|
*
|
|
79
78
|
* IDENTITY USED AT NESTING SITES
|
|
80
79
|
* ==============================
|
|
@@ -312,7 +311,6 @@
|
|
|
312
311
|
--era-pad-content: calc(var(--era-so) * 2); /* 16/22.5/30/48 */
|
|
313
312
|
|
|
314
313
|
/* Content padding — alias of pad-lg (formerly 4·sp − 16 ≈ the same curve) */
|
|
315
|
-
--era-content-p: var(--era-pad-content);
|
|
316
314
|
}
|
|
317
315
|
|
|
318
316
|
/* -------------------------------------------------- */
|
package/dist/styles/index.css
CHANGED
|
@@ -227,7 +227,9 @@
|
|
|
227
227
|
* the pair so the runtime audit can point at it). It exists so the failure mode
|
|
228
228
|
* is a no-op instead of unreadable text. */
|
|
229
229
|
.era-text-trim.truncate,
|
|
230
|
-
.era-text-trim-caps.truncate
|
|
230
|
+
.era-text-trim-caps.truncate,
|
|
231
|
+
.era-label-ink.truncate,
|
|
232
|
+
.era-token-ink.truncate {
|
|
231
233
|
line-height: normal;
|
|
232
234
|
text-box: normal;
|
|
233
235
|
}
|
|
@@ -271,6 +273,10 @@
|
|
|
271
273
|
*
|
|
272
274
|
* @use on a native single-line <input> (or the text layer that must mirror
|
|
273
275
|
* one) inside a fixed-height field — never alongside era-text-trim. */
|
|
276
|
+
@utility era-ink-center {
|
|
277
|
+
padding-bottom: 0.08em;
|
|
278
|
+
}
|
|
279
|
+
|
|
274
280
|
/* TOKEN INK — the ink centring for a pill whose content is a TOKEN: an id, a
|
|
275
281
|
* count, a status, a tag. Font-independent, unlike everything it replaces.
|
|
276
282
|
*
|
|
@@ -299,8 +305,9 @@
|
|
|
299
305
|
* Prose and sentence-case labels keep era-text-trim; this is for tokens.
|
|
300
306
|
*
|
|
301
307
|
* @use the ink centring for a token pill — a badge, a KV value, any short
|
|
302
|
-
* caps-or-digits label in a fixed-height box
|
|
303
|
-
*
|
|
308
|
+
* caps-or-digits label in a fixed-height box, CENTRED horizontally and with no
|
|
309
|
+
* icon sibling. For a left-aligned sentence-case label use era-label-ink; when
|
|
310
|
+
* an icon really must sit beside the text, see the note there. */
|
|
304
311
|
@utility era-token-ink {
|
|
305
312
|
display: block;
|
|
306
313
|
align-content: center;
|
|
@@ -309,8 +316,39 @@
|
|
|
309
316
|
text-box: trim-both cap alphabetic;
|
|
310
317
|
}
|
|
311
318
|
|
|
312
|
-
|
|
313
|
-
|
|
319
|
+
/* LABEL INK — era-token-ink's mixed-case sibling, and the general answer to
|
|
320
|
+
* "this fixed-height control holds one line of text".
|
|
321
|
+
*
|
|
322
|
+
* Same mechanism, same reason: `text-box-trim` needs a BLOCK box, so the row
|
|
323
|
+
* becomes one and `align-content` (block-container alignment) does the
|
|
324
|
+
* centring. What differs is the band and the alignment, because the content
|
|
325
|
+
* class differs — a label is sentence case, so the x-height band is the visual
|
|
326
|
+
* mass to centre (cap-band reads low on "System"), and it is laid out against
|
|
327
|
+
* the row's padding rather than centred in it.
|
|
328
|
+
*
|
|
329
|
+
* WHY IT EXISTS AT ALL: era's controls are flex, and a flex container's bare
|
|
330
|
+
* text is an ANONYMOUS flex item — a box no selector reaches and no
|
|
331
|
+
* non-inherited property touches. So `era-text-trim` on a flex row is inert,
|
|
332
|
+
* contributing only its `line-height: 1`, and the ink falls back to line-box
|
|
333
|
+
* centring by font metrics. era-token-ink already fixed that for centred
|
|
334
|
+
* tokens; this fixes it for everything else.
|
|
335
|
+
*
|
|
336
|
+
* THE ICON CASE IS NOT SOLVED, and cannot be from CSS: an icon beside the text
|
|
337
|
+
* needs the box to stay flex, which re-creates the anonymous item. A component
|
|
338
|
+
* whose children are an opaque slot therefore guards it —
|
|
339
|
+
* `not-has-[svg]:era-label-ink` — and ink-centres the text-only case while
|
|
340
|
+
* leaving the icon case on line-box centring. Splitting icon and label into
|
|
341
|
+
* separate slots is what would close it; typography/inert-trim reports every
|
|
342
|
+
* site still on the fallback.
|
|
343
|
+
*
|
|
344
|
+
* @use the ink centring for a fixed-height control holding ONE line of
|
|
345
|
+
* sentence-case text and no icon — a menu item, a nav trigger, a button label.
|
|
346
|
+
* Never alongside `truncate` (the trimmed box becomes the clip). */
|
|
347
|
+
@utility era-label-ink {
|
|
348
|
+
display: block;
|
|
349
|
+
align-content: center;
|
|
350
|
+
line-height: 1;
|
|
351
|
+
text-box: trim-both ex alphabetic;
|
|
314
352
|
}
|
|
315
353
|
|
|
316
354
|
/* In-progress text shimmer — a bright sweep through muted text (the standard
|
|
@@ -453,6 +491,56 @@
|
|
|
453
491
|
--color-elevated: var(--era-surface-bg-elevated);
|
|
454
492
|
--color-highlight: var(--era-highlight);
|
|
455
493
|
--color-overlay: var(--era-overlay-bg);
|
|
494
|
+
/* THE SPACING SCALE — one entry per token, from which Tailwind derives the
|
|
495
|
+
* WHOLE directional family: p/px/py/pt/pr/pb/pl/ps/pe, every margin, gap and
|
|
496
|
+
* gap-x/y, inset/top/right/bottom/left, translate, and the sizing prefixes.
|
|
497
|
+
*
|
|
498
|
+
* These were hand-written `@utility` blocks, which could only ever cover the
|
|
499
|
+
* spellings someone remembered to write: `px-gutter` existed and `mt-gutter`
|
|
500
|
+
* did not, `p-inset-control` existed and `pl-inset-control` did not, so the
|
|
501
|
+
* library fell back to `mt-(--era-gap)` in exactly the places the named API
|
|
502
|
+
* was supposed to cover. One line here replaces twenty blocks and leaves no
|
|
503
|
+
* spelling missing.
|
|
504
|
+
*
|
|
505
|
+
* ONLY genuine spacing belongs here. The namespace is shared across
|
|
506
|
+
* h/w/p/m/gap, so a name registered here means the same length in ALL of
|
|
507
|
+
* them — true of a gap or an inset, false of a TIER HEIGHT. Tiers stay
|
|
508
|
+
* hand-written per prefix below, and the two vocabularies deliberately share
|
|
509
|
+
* no word: icon/pill/chip/control/bar are heights; gutter, card, panel,
|
|
510
|
+
* content, menu, field and the inset-* names are spacing. Registering a tier
|
|
511
|
+
* name here would silently make `px-control` mean 24px of side padding. */
|
|
512
|
+
--spacing-gutter: var(--era-gap);
|
|
513
|
+
--spacing-panel: var(--era-pad-panel);
|
|
514
|
+
--spacing-card: var(--era-pad-card);
|
|
515
|
+
--spacing-content: var(--era-pad-content);
|
|
516
|
+
--spacing-menu: var(--era-panel-inset);
|
|
517
|
+
--spacing-field: var(--era-field-px);
|
|
518
|
+
/* @use text-symmetric content padding — (tier − text)/2, the inset that
|
|
519
|
+
* vertically centres body text in its tier; px-inset-control is a text
|
|
520
|
+
* button's side padding, p-inset-control a code block's. */
|
|
521
|
+
--spacing-inset-pill: var(--era-inset-pill);
|
|
522
|
+
--spacing-inset-chip: var(--era-inset-chip);
|
|
523
|
+
--spacing-inset-control: var(--era-inset-control);
|
|
524
|
+
/* @use the concentric inset for a nested pair — (h-container − h-child)/2,
|
|
525
|
+
* the gap that makes a child control sit evenly inside its container, and
|
|
526
|
+
* the radius step that keeps their corners concentric. Named for the pair it
|
|
527
|
+
* joins: gap-icon-inset-control seats an icon in a control. */
|
|
528
|
+
--spacing-icon-inset-pill: var(--era-icon-inset-pill);
|
|
529
|
+
--spacing-icon-inset-chip: var(--era-icon-inset-chip);
|
|
530
|
+
--spacing-icon-inset-control: var(--era-icon-inset-control);
|
|
531
|
+
--spacing-icon-inset-bar: var(--era-icon-inset-bar);
|
|
532
|
+
--spacing-pill-inset-chip: var(--era-pill-inset-chip);
|
|
533
|
+
--spacing-pill-inset-control: var(--era-pill-inset-control);
|
|
534
|
+
--spacing-chip-inset-control: var(--era-chip-inset-control);
|
|
535
|
+
--spacing-chip-inset-bar: var(--era-chip-inset-bar);
|
|
536
|
+
/* @use the glyph size for a tier — the INK inside the box, not the box
|
|
537
|
+
* (size-glyph-pill is the dismiss × in a pill, size-pill is the pill). */
|
|
538
|
+
--spacing-glyph-icon: var(--era-glyph-icon);
|
|
539
|
+
--spacing-glyph-pill: var(--era-glyph-pill);
|
|
540
|
+
/* @use the recessed field fill — bg-field is a text input's resting well,
|
|
541
|
+
* bg-field-highlight its focused/hovered face. */
|
|
542
|
+
--color-field: var(--era-field-bg);
|
|
543
|
+
--color-field-highlight: var(--era-field-highlight);
|
|
456
544
|
/* Motion — bare transition utilities default to the motion axis, so
|
|
457
545
|
* `transition-colors` alone is on-design (0s at instant, longer at extra).
|
|
458
546
|
* ease-base/duration-base name the axis explicitly for overrides. */
|
|
@@ -501,12 +589,13 @@
|
|
|
501
589
|
/* ------------------------------------------------------------------ */
|
|
502
590
|
/* Named tier + spacing utilities */
|
|
503
591
|
/* */
|
|
504
|
-
/*
|
|
505
|
-
/* is
|
|
506
|
-
/*
|
|
507
|
-
/*
|
|
508
|
-
/*
|
|
509
|
-
/*
|
|
592
|
+
/* What is left here is what the SPACING SCALE above cannot express: */
|
|
593
|
+
/* a tier is a HEIGHT, and the spacing namespace is shared across */
|
|
594
|
+
/* h/w/p/m/gap, so registering `control` there would silently make */
|
|
595
|
+
/* px-control mean 24px of side padding. Tier names therefore get one */
|
|
596
|
+
/* hand-written block per prefix that needs them, and the two */
|
|
597
|
+
/* vocabularies share no word. Kept terse; the ladder itself is */
|
|
598
|
+
/* documented in density.css and on the /spacing page. */
|
|
510
599
|
/* ------------------------------------------------------------------ */
|
|
511
600
|
|
|
512
601
|
/* @use the tier-height ladder — h-icon (icon) · h-pill (nested pill) · h-chip
|
|
@@ -546,6 +635,46 @@
|
|
|
546
635
|
min-height: var(--era-h-bar);
|
|
547
636
|
}
|
|
548
637
|
|
|
638
|
+
/* @use a tier-sized WIDTH — the horizontal twin of the h-* ladder, for a rail or
|
|
639
|
+
* a column measured in tiers rather than in content. */
|
|
640
|
+
@utility w-icon {
|
|
641
|
+
width: var(--era-h-icon);
|
|
642
|
+
}
|
|
643
|
+
@utility w-pill {
|
|
644
|
+
width: var(--era-h-pill);
|
|
645
|
+
}
|
|
646
|
+
@utility w-chip {
|
|
647
|
+
width: var(--era-h-chip);
|
|
648
|
+
}
|
|
649
|
+
@utility w-control {
|
|
650
|
+
width: var(--era-h-control);
|
|
651
|
+
}
|
|
652
|
+
@utility w-bar {
|
|
653
|
+
width: var(--era-h-bar);
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
/* @use a minimum tier WIDTH — the floor that makes a single-glyph control render
|
|
657
|
+
* as a square rather than a skinny pill (min-w-control on an icon button,
|
|
658
|
+
* min-w-pill on a badge). These could not exist before the ladder was renamed:
|
|
659
|
+
* the old rungs were sm/md/lg, and Tailwind's container scale already owns
|
|
660
|
+
* min-w-md and min-w-lg, so the names collided and every call site had to write
|
|
661
|
+
* min-w-(--era-h-control) by hand. icon/pill/chip/control/bar collide with nothing. */
|
|
662
|
+
@utility min-w-icon {
|
|
663
|
+
min-width: var(--era-h-icon);
|
|
664
|
+
}
|
|
665
|
+
@utility min-w-pill {
|
|
666
|
+
min-width: var(--era-h-pill);
|
|
667
|
+
}
|
|
668
|
+
@utility min-w-chip {
|
|
669
|
+
min-width: var(--era-h-chip);
|
|
670
|
+
}
|
|
671
|
+
@utility min-w-control {
|
|
672
|
+
min-width: var(--era-h-control);
|
|
673
|
+
}
|
|
674
|
+
@utility min-w-bar {
|
|
675
|
+
min-width: var(--era-h-bar);
|
|
676
|
+
}
|
|
677
|
+
|
|
549
678
|
/* @use a tier-sized square — size-icon is THE icon size (a Lucide glyph beside
|
|
550
679
|
* body text), size-control a square control face. */
|
|
551
680
|
@utility size-icon {
|
|
@@ -569,53 +698,6 @@
|
|
|
569
698
|
height: var(--era-h-bar);
|
|
570
699
|
}
|
|
571
700
|
|
|
572
|
-
/* @use the inter-element gap (sp/2) — flex/grid gap between sibling controls,
|
|
573
|
-
* and the matching gutter padding a scrollable list or rail owes its rows on
|
|
574
|
-
* all four sides (p-gutter on the rail = gap-gutter between its rows). */
|
|
575
|
-
@utility gap-gutter {
|
|
576
|
-
gap: var(--era-gap);
|
|
577
|
-
}
|
|
578
|
-
@utility p-gutter {
|
|
579
|
-
padding: var(--era-gap);
|
|
580
|
-
}
|
|
581
|
-
@utility px-gutter {
|
|
582
|
-
padding-inline: var(--era-gap);
|
|
583
|
-
}
|
|
584
|
-
@utility py-gutter {
|
|
585
|
-
padding-block: var(--era-gap);
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
/* @use text-symmetric content padding — (tier − text)/2, the inset that
|
|
589
|
-
* vertically centers body text in its tier; px-inset-control is a text button's
|
|
590
|
-
* side padding, p-inset-control a code block's. */
|
|
591
|
-
@utility p-inset-pill {
|
|
592
|
-
padding: var(--era-inset-pill);
|
|
593
|
-
}
|
|
594
|
-
@utility p-inset-chip {
|
|
595
|
-
padding: var(--era-inset-chip);
|
|
596
|
-
}
|
|
597
|
-
@utility p-inset-control {
|
|
598
|
-
padding: var(--era-inset-control);
|
|
599
|
-
}
|
|
600
|
-
@utility px-inset-pill {
|
|
601
|
-
padding-inline: var(--era-inset-pill);
|
|
602
|
-
}
|
|
603
|
-
@utility px-inset-chip {
|
|
604
|
-
padding-inline: var(--era-inset-chip);
|
|
605
|
-
}
|
|
606
|
-
@utility px-inset-control {
|
|
607
|
-
padding-inline: var(--era-inset-control);
|
|
608
|
-
}
|
|
609
|
-
@utility py-inset-pill {
|
|
610
|
-
padding-block: var(--era-inset-pill);
|
|
611
|
-
}
|
|
612
|
-
@utility py-inset-chip {
|
|
613
|
-
padding-block: var(--era-inset-chip);
|
|
614
|
-
}
|
|
615
|
-
@utility py-inset-control {
|
|
616
|
-
padding-block: var(--era-inset-control);
|
|
617
|
-
}
|
|
618
|
-
|
|
619
701
|
/* @use pill side padding — the wider-than-vertical horizontal breathing room
|
|
620
702
|
* badge/chip text wants (glyph-advance derived, ~2× the vertical inset). */
|
|
621
703
|
@utility px-pill {
|
|
@@ -624,24 +706,25 @@
|
|
|
624
706
|
@utility px-chip {
|
|
625
707
|
padding-inline: var(--era-chip-px);
|
|
626
708
|
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
* the named form of px-(--era-field-px). */
|
|
630
|
-
@utility px-field {
|
|
631
|
-
padding-inline: var(--era-field-px);
|
|
709
|
+
@utility pl-pill {
|
|
710
|
+
padding-left: var(--era-pill-px);
|
|
632
711
|
}
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
@utility p-panel {
|
|
639
|
-
padding: var(--era-pad-panel);
|
|
712
|
+
@utility pr-pill {
|
|
713
|
+
padding-right: var(--era-pill-px);
|
|
714
|
+
}
|
|
715
|
+
@utility pl-chip {
|
|
716
|
+
padding-left: var(--era-chip-px);
|
|
640
717
|
}
|
|
641
|
-
@utility
|
|
642
|
-
padding: var(--era-
|
|
718
|
+
@utility pr-chip {
|
|
719
|
+
padding-right: var(--era-chip-px);
|
|
643
720
|
}
|
|
644
|
-
|
|
721
|
+
|
|
722
|
+
/* @use padding for a content panel that sits UNDER a section header row — the
|
|
723
|
+
* even-padding exception, and the reason it is not called p-section: it
|
|
724
|
+
* deliberately under-pays the block start. For an evenly padded content panel
|
|
725
|
+
* use p-section, which is the plain token.
|
|
726
|
+
*
|
|
727
|
+
* A content panel always follows a section header ROW, and that row already
|
|
645
728
|
* contributes its own slack: the heading's text sits in an h-bar bar, so there
|
|
646
729
|
* is (h-bar − text)/2 of empty bar under its glyphs before the panel even
|
|
647
730
|
* starts. Padding the panel evenly on top of that spends the space twice — the
|
|
@@ -650,7 +733,7 @@
|
|
|
650
733
|
*
|
|
651
734
|
* So the block-start pays only the REMAINDER. The target is the indent: the
|
|
652
735
|
* space under a heading should measure the same as the space beside the text,
|
|
653
|
-
* which is --era-content
|
|
736
|
+
* which is --era-pad-content. The header row already supplies (h-bar − text)/2 of
|
|
654
737
|
* it, so the panel adds what's left, and heading-to-paragraph reads equal to
|
|
655
738
|
* the paragraph's own inset. Subtracting one --era-gap (the previous rule) left
|
|
656
739
|
* the header's slack unaccounted for and the heading still detached.
|
|
@@ -658,16 +741,9 @@
|
|
|
658
741
|
* Both terms are density-derived, so the equality holds at every mode; the
|
|
659
742
|
* max() is the floor for a hypothetical mode where the row's slack would
|
|
660
743
|
* exceed the inset outright. */
|
|
661
|
-
@utility p-
|
|
662
|
-
padding: var(--era-content
|
|
663
|
-
padding-top: max(0px, calc(var(--era-content
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
/* @use menu-panel padding — the surface-owned inset (0 on flat, 2px on
|
|
667
|
-
* glass/bevel) that keeps row highlights inside a floating panel's frame;
|
|
668
|
-
* pairs with rounded-menu-item on the rows. */
|
|
669
|
-
@utility p-menu {
|
|
670
|
-
padding: var(--era-panel-inset);
|
|
744
|
+
@utility p-section {
|
|
745
|
+
padding: var(--era-pad-content);
|
|
746
|
+
padding-top: max(0px, calc(var(--era-pad-content) - (var(--era-h-bar) - var(--era-text)) / 2));
|
|
671
747
|
}
|
|
672
748
|
|
|
673
749
|
/* @use the motion axis as an explicit transition-duration — for the rare case
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<Accordion.Content
|
|
9
9
|
bind:ref
|
|
10
10
|
class={cn(
|
|
11
|
-
'overflow-hidden border-t border-divider-faded p-
|
|
11
|
+
'overflow-hidden border-t border-divider-faded p-content text-body leading-body text-muted',
|
|
12
12
|
className
|
|
13
13
|
)}
|
|
14
14
|
{...restProps}
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
<Accordion.Trigger
|
|
15
15
|
bind:ref
|
|
16
16
|
class={cn(
|
|
17
|
-
'flex h-
|
|
17
|
+
'flex h-control w-full items-center justify-between gap-icon-inset-chip rounded-control px-inset-control text-body text-fg hover:bg-highlight hover:shadow-highlight focus:outline-none disabled:opacity-50',
|
|
18
18
|
className
|
|
19
19
|
)}
|
|
20
20
|
{...restProps}
|
|
21
21
|
>
|
|
22
22
|
{@render children?.()}
|
|
23
|
-
<ChevronDown class="size-
|
|
23
|
+
<ChevronDown class="size-icon text-muted" />
|
|
24
24
|
</Accordion.Trigger>
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
</script>
|
|
12
12
|
|
|
13
13
|
<AlertDialog.Portal>
|
|
14
|
-
<AlertDialog.Overlay class="fixed inset-0 z-50 bg-
|
|
14
|
+
<AlertDialog.Overlay class="fixed inset-0 z-50 bg-overlay" />
|
|
15
15
|
<AlertDialog.Content
|
|
16
16
|
bind:ref
|
|
17
17
|
class={cn(
|
|
18
|
-
'fixed top-1/2 left-1/2 z-50 flex w-full max-w-md -translate-x-1/2 -translate-y-1/2 flex-col gap-
|
|
18
|
+
'fixed top-1/2 left-1/2 z-50 flex w-full max-w-md -translate-x-1/2 -translate-y-1/2 flex-col gap-gutter rounded-bar border border-divider bg-well p-card shadow-lg glass-blur',
|
|
19
19
|
className
|
|
20
20
|
)}
|
|
21
21
|
{...restProps}
|