@signal9/era-ui 30.8.0 → 32.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/CHANGELOG.md +28 -0
- package/dist/ai/artifact/artifact.svelte +1 -1
- package/dist/ai/conversations/conversations-item.svelte +1 -1
- package/dist/ai/plan/plan-header.svelte +1 -1
- package/dist/ai/prompt-input/prompt-input-attachments.svelte +2 -6
- package/dist/ai/swarm/swarm-node.svelte +1 -1
- package/dist/ai/todo/todo-header.svelte +1 -1
- package/dist/ai/todo/todo-item.svelte +1 -1
- package/dist/ai/tool/tool-chip.svelte +1 -1
- package/dist/ai/web-preview/web-preview.svelte +2 -2
- package/dist/ai/workflow/node.svelte +1 -1
- package/dist/dev/audit/audits/wall-is-isotropic.js +1 -1
- package/dist/docs/css-utilities.js +9 -5
- package/dist/era-ui.css +1 -1
- package/dist/generated-docs/badge.md +1 -1
- package/dist/generated-docs/bar.md +22 -4
- package/dist/generated-docs/button.md +38 -4
- package/dist/generated-docs/card.md +35 -5
- package/dist/generated-docs/chip.md +16 -0
- package/dist/generated-docs/llms-full.txt +370 -70
- package/dist/generated-docs/llms.txt +8 -4
- package/dist/generated-docs/manifest.json +85 -28
- package/dist/generated-docs/meter.md +79 -1
- package/dist/generated-docs/nav.md +8 -1
- package/dist/generated-docs/separator.md +18 -0
- package/dist/generated-docs/utilities.json +68 -15
- package/dist/generated-docs/utilities.md +145 -50
- package/dist/os/notification-center.svelte +1 -1
- package/dist/os/taskbar.svelte +1 -1
- package/dist/os/toast.svelte +1 -1
- package/dist/styles/density.css +15 -25
- package/dist/styles/index.css +74 -48
- package/dist/styles/motion.css +1 -1
- package/dist/styles/prose.css +1 -1
- package/dist/styles/surfaces/bevel.css +16 -19
- package/dist/styles/surfaces/contract.css +50 -0
- package/dist/styles/surfaces/flat.css +27 -0
- package/dist/styles/surfaces/glass.css +11 -8
- package/dist/ui/accordion/accordion-trigger.svelte +1 -1
- package/dist/ui/alert-dialog/alert-dialog-content.svelte +1 -1
- package/dist/ui/badge/badge.svelte +8 -2
- package/dist/ui/badge/badge.svelte.d.ts +1 -1
- package/dist/ui/bar/bar.svelte +95 -26
- package/dist/ui/bar/bar.svelte.d.ts +71 -31
- package/dist/ui/button/button.svelte +6 -0
- package/dist/ui/button/button.svelte.d.ts +2 -0
- package/dist/ui/button/variants.d.ts +3 -3
- package/dist/ui/button/variants.js +6 -11
- package/dist/ui/calendar/calendar-day.svelte +1 -1
- package/dist/ui/card/card.svelte +23 -10
- package/dist/ui/card/card.svelte.d.ts +19 -7
- package/dist/ui/chip/chip.svelte +5 -2
- package/dist/ui/chip/chip.svelte.d.ts +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-trigger.svelte +1 -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 +5 -7
- package/dist/ui/command-bar/command-bar.svelte +3 -3
- package/dist/ui/context-menu/context-menu-content.svelte +1 -4
- package/dist/ui/context-menu/context-menu-sub-content.svelte +1 -4
- 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-segment.svelte +1 -1
- package/dist/ui/date-picker/date-picker-trigger.svelte +1 -1
- 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-segment.svelte +1 -1
- package/dist/ui/date-range-picker/date-range-picker-trigger.svelte +1 -1
- package/dist/ui/dialog/dialog-content.svelte +20 -2
- package/dist/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
- package/dist/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -4
- package/dist/ui/dropdown-menu/dropdown-menu-trigger.svelte +1 -1
- package/dist/ui/file-upload/file-upload.svelte +1 -1
- package/dist/ui/input/variants.d.ts +6 -6
- package/dist/ui/input/variants.js +2 -2
- package/dist/ui/kv/kv.svelte +1 -1
- package/dist/ui/link-preview/link-preview-content.svelte +1 -1
- package/dist/ui/menubar/menubar-content.svelte +1 -1
- package/dist/ui/menubar/menubar-root.svelte +1 -1
- package/dist/ui/menubar/menubar-sub-content.svelte +1 -4
- package/dist/ui/menubar/menubar-trigger.svelte +1 -1
- package/dist/ui/meter/meter.svelte +1 -2
- package/dist/ui/nav/nav-bar.svelte +9 -4
- package/dist/ui/nav/nav-bar.svelte.d.ts +2 -1
- package/dist/ui/nav/nav-item.svelte +1 -0
- package/dist/ui/pane/pane-root.svelte +3 -12
- package/dist/ui/pane/pane-tab.svelte +1 -1
- package/dist/ui/popover/popover-content.svelte +1 -1
- package/dist/ui/provider/surfaces.d.ts +1 -1
- package/dist/ui/provider/surfaces.js +1 -1
- package/dist/ui/select/select-content.svelte +1 -1
- package/dist/ui/select/select-trigger.svelte +1 -1
- package/dist/ui/sheet/sheet-content.svelte +1 -1
- package/dist/ui/sheet/sheet-content.svelte.d.ts +1 -1
- package/dist/ui/slider/slider-thumb.svelte +1 -1
- package/dist/ui/step/step-summary.svelte +1 -1
- package/dist/ui/switch/switch.svelte +3 -3
- 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/timeline/timeline-step.svelte +1 -1
- package/dist/ui/toggle-group/toggle-group-item.svelte +2 -2
- package/dist/ui/toggle-group/toggle-group-item.svelte.d.ts +6 -6
- package/dist/ui/toggle-group/toggle-group-root.svelte +1 -2
- package/dist/ui/toggle-group/toggle-group-root.svelte.d.ts +3 -3
- package/dist/ui/tooltip/tooltip-content.svelte +1 -1
- package/dist/ui/tree/tree-item.svelte +1 -1
- package/dist/ui/video-player/video-player.svelte +2 -2
- package/dist/utils/tw-merge-config.d.ts +6 -1
- package/dist/utils/tw-merge-config.js +6 -2
- package/package.json +5 -3
- package/skill/SKILL.md +26 -21
- package/dist/styles/surfaces/base.css +0 -257
|
@@ -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
|
-
control: "
|
|
64
|
-
pill: "
|
|
63
|
+
control: "tier-control px-field";
|
|
64
|
+
pill: "tier-pill px-pill";
|
|
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
|
-
control: "
|
|
132
|
-
pill: "
|
|
131
|
+
control: "tier-control px-field";
|
|
132
|
+
pill: "tier-pill px-pill";
|
|
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
|
-
control: "
|
|
200
|
-
pill: "
|
|
199
|
+
control: "tier-control px-field";
|
|
200
|
+
pill: "tier-pill px-pill";
|
|
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
|
-
control: '
|
|
67
|
-
pill: '
|
|
66
|
+
control: 'tier-control px-field',
|
|
67
|
+
pill: 'tier-pill px-pill'
|
|
68
68
|
},
|
|
69
69
|
/**
|
|
70
70
|
* Height OVERRIDES, for the fields that are not their tier's height. No
|
package/dist/ui/kv/kv.svelte
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
// shrink-0 + nowrap like Badge/Chip: the overflow-hidden here is for the
|
|
25
25
|
// key cell's squared corners, not a licence to crush — squeezed, this pill
|
|
26
26
|
// clipped its value instead of bleeding it, which is quieter but no truer.
|
|
27
|
-
'inline-flex
|
|
27
|
+
'inline-flex tier-pill shrink-0 items-center overflow-hidden bg-fill font-mono text-body leading-none whitespace-nowrap shadow-sm',
|
|
28
28
|
className
|
|
29
29
|
)}
|
|
30
30
|
{...restProps}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
bind:ref
|
|
20
20
|
{...relay?.attrs}
|
|
21
21
|
class={cn(
|
|
22
|
-
'z-overlay max-w-xs rounded-control
|
|
22
|
+
'z-overlay max-w-xs rounded-control material-popover p-inset-control text-body',
|
|
23
23
|
className
|
|
24
24
|
)}
|
|
25
25
|
{sideOffset}
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
// floating menu, like the context menu it should match: full radius, a
|
|
34
34
|
// gutter of air, shadow doing the separating.
|
|
35
35
|
class={cn(
|
|
36
|
-
'z-overlay w-max min-w-(--bits-menubar-menu-anchor-width) overflow-hidden rounded-control
|
|
36
|
+
'z-overlay w-max min-w-(--bits-menubar-menu-anchor-width) overflow-hidden rounded-control material-popover p-menu',
|
|
37
37
|
className
|
|
38
38
|
)}
|
|
39
39
|
{sideOffset}
|
|
@@ -18,10 +18,7 @@
|
|
|
18
18
|
<Menubar.SubContent
|
|
19
19
|
bind:ref
|
|
20
20
|
{...relay?.attrs}
|
|
21
|
-
class={cn(
|
|
22
|
-
'z-overlay w-max overflow-hidden rounded-control bg-elevated p-menu shadow-lg glass-blur',
|
|
23
|
-
className
|
|
24
|
-
)}
|
|
21
|
+
class={cn('z-overlay w-max overflow-hidden rounded-control material-popover p-menu', className)}
|
|
25
22
|
{sideOffset}
|
|
26
23
|
{...restProps}
|
|
27
24
|
>
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<Menubar.Trigger
|
|
14
14
|
bind:ref
|
|
15
15
|
class={cn(
|
|
16
|
-
'flex
|
|
16
|
+
'flex tier-control items-center gap-gutter px-inset-control text-body text-fg hover:bg-highlight focus:outline-none disabled:opacity-50 has-[svg]:gap-inset-control data-[state=open]:rounded-b-none data-[state=open]:bg-hover',
|
|
17
17
|
className
|
|
18
18
|
)}
|
|
19
19
|
{...restProps}
|
|
@@ -239,8 +239,7 @@
|
|
|
239
239
|
THE ORDER IS CURRENTLY UNOBSERVABLE, and that is worth knowing rather
|
|
240
240
|
than discovering. Swapping these two changes no pixel: the buffer is
|
|
241
241
|
the fill's OWN paint at 30%, and the same colour composited over
|
|
242
|
-
itself is that colour.
|
|
243
|
-
meter-buffer.spec.ts, which stayed green. So the order is kept for
|
|
242
|
+
itself is that colour. A control swap was pixel-identical. So the order is kept for
|
|
244
243
|
correctness — it is what makes the contract true for any future paint
|
|
245
244
|
that is not derived from the fill — and not because a test can see it.
|
|
246
245
|
Do not read the passing spec as covering it.
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
// Bar's geometry, imported rather than restated. A re-export here would be a
|
|
6
6
|
// second name for one thing; anyone who wants the variants imports them from
|
|
7
7
|
// Bar, which is where they are defined.
|
|
8
|
-
import { barVariants } from '../bar/bar.svelte';
|
|
8
|
+
import { barVariants, resolveBarContent, type BarContent, type BarSize } from '../bar/bar.svelte';
|
|
9
9
|
|
|
10
10
|
let {
|
|
11
11
|
ref = $bindable(null),
|
|
12
12
|
size = 'bar',
|
|
13
|
-
content
|
|
13
|
+
content,
|
|
14
14
|
divider = false,
|
|
15
15
|
label = 'Main',
|
|
16
16
|
children,
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
/** Height tier, exactly as Bar's — the geometry is Bar's, not a second copy. */
|
|
22
22
|
size?: 'chip' | 'control' | 'bar';
|
|
23
23
|
/** Tier of the items inside, so the wall stays concentric to them. */
|
|
24
|
-
content?:
|
|
24
|
+
content?: BarContent;
|
|
25
25
|
/**
|
|
26
26
|
* Draw Bar's flush cap-a-panel rule beneath the bar. Off by default,
|
|
27
27
|
* because a nav that sits in a page already has whatever separation the
|
|
@@ -40,6 +40,8 @@
|
|
|
40
40
|
label?: string;
|
|
41
41
|
children?: Snippet;
|
|
42
42
|
} = $props();
|
|
43
|
+
|
|
44
|
+
const resolvedContent = $derived(resolveBarContent(size as BarSize, content));
|
|
43
45
|
</script>
|
|
44
46
|
|
|
45
47
|
<!--
|
|
@@ -53,7 +55,10 @@
|
|
|
53
55
|
<nav
|
|
54
56
|
bind:this={ref}
|
|
55
57
|
aria-label={label}
|
|
56
|
-
|
|
58
|
+
data-era-geometry={divider ? 'docked' : 'nested'}
|
|
59
|
+
data-era-tier={size}
|
|
60
|
+
data-era-contains={resolvedContent}
|
|
61
|
+
class={cn(barVariants({ size, content: resolvedContent, divider }), className)}
|
|
57
62
|
{...restProps}
|
|
58
63
|
>
|
|
59
64
|
{@render children?.()}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { HTMLAttributes } from 'svelte/elements';
|
|
3
|
+
import { type BarContent } from '../bar/bar.svelte';
|
|
3
4
|
type $$ComponentProps = HTMLAttributes<HTMLElement> & {
|
|
4
5
|
ref?: HTMLElement | null;
|
|
5
6
|
/** Height tier, exactly as Bar's — the geometry is Bar's, not a second copy. */
|
|
6
7
|
size?: 'chip' | 'control' | 'bar';
|
|
7
8
|
/** Tier of the items inside, so the wall stays concentric to them. */
|
|
8
|
-
content?:
|
|
9
|
+
content?: BarContent;
|
|
9
10
|
/**
|
|
10
11
|
* Draw Bar's flush cap-a-panel rule beneath the bar. Off by default,
|
|
11
12
|
* because a nav that sits in a page already has whatever separation the
|
|
@@ -530,18 +530,9 @@
|
|
|
530
530
|
// content until the grip sets a size, and size containment would collapse
|
|
531
531
|
// that to zero) and NOT `paint` (the resize handles deliberately bleed
|
|
532
532
|
// outward, and paint containment clips them).
|
|
533
|
-
//
|
|
534
|
-
//
|
|
535
|
-
|
|
536
|
-
// deciding the geometry of every list in the app.
|
|
537
|
-
//
|
|
538
|
-
// The radius is rd-control and stays there. It was briefly raised to rd-bar
|
|
539
|
-
// to make `rounded-row` produce rd-control for the nav rows — which worked,
|
|
540
|
-
// and broke the corner it is measured against: the close button sits 4px
|
|
541
|
-
// from this corner, so at rd-bar it needed a 8.056 radius and had a pill's
|
|
542
|
-
// 5.056. Chasing the container was the wrong end. A row should carry the
|
|
543
|
-
// radius of its OWN tier, which is what the command items do now.
|
|
544
|
-
'group/pane absolute isolate flex flex-col rounded-control border border-divider bg-elevated shadow-lg glass-blur [contain:layout_style] [--era-container-rd:var(--era-rd-control)]',
|
|
533
|
+
// The pane is unbounded chrome. Bounded descendants carry their own tier;
|
|
534
|
+
// no inherited radius is allowed to rewrite a row from the outside in.
|
|
535
|
+
'group/pane absolute isolate flex flex-col rounded-control border border-divider material-popover [contain:layout_style]',
|
|
545
536
|
// Auto-size to content until an explicit size is set (by the grip or a preset).
|
|
546
537
|
size ? '' : 'w-max',
|
|
547
538
|
// While Ctrl is held the whole pane is grabbable: a grab cursor hints it, and
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
// trim pulls the box up to the alphabetic baseline, so the clip then slices
|
|
24
24
|
// every descender (the "logs" g, the "history" y). [text-box:normal] cancels
|
|
25
25
|
// it; leading-none + the strip's items-center still centre the label.
|
|
26
|
-
'flex
|
|
26
|
+
'flex tier-pill cursor-pointer items-center gap-gutter px-pill text-body leading-none text-muted outline-none select-none [text-box:normal] hover:text-fg focus-visible:bg-highlight data-[state=active]:bg-hover data-[state=active]:text-bright',
|
|
27
27
|
className
|
|
28
28
|
)}
|
|
29
29
|
{...restProps}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
// floating menu, like the context menu it should match: full radius, a
|
|
23
23
|
// gutter of air, shadow doing the separating.
|
|
24
24
|
class={cn(
|
|
25
|
-
'z-overlay w-max min-w-(--bits-popover-anchor-width) overflow-hidden rounded-control
|
|
25
|
+
'z-overlay w-max min-w-(--bits-popover-anchor-width) overflow-hidden rounded-control material-popover p-card',
|
|
26
26
|
className
|
|
27
27
|
)}
|
|
28
28
|
{sideOffset}
|
|
@@ -22,7 +22,7 @@ export declare const surfaceRegistry: {
|
|
|
22
22
|
readonly flat: {
|
|
23
23
|
readonly label: "Flat";
|
|
24
24
|
readonly description: "Solid fills, no chrome — the quiet default.";
|
|
25
|
-
readonly css: "
|
|
25
|
+
readonly css: "flat.css";
|
|
26
26
|
};
|
|
27
27
|
readonly glass: {
|
|
28
28
|
readonly label: "Glass";
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
// 2px frame that stops a full-width highlight from breaking their chrome.
|
|
30
30
|
// A fixed gutter was tried here and rejected: it padded flat menus too.
|
|
31
31
|
class={cn(
|
|
32
|
-
'z-overlay w-max min-w-(--bits-select-anchor-width) overflow-hidden rounded-control
|
|
32
|
+
'z-overlay w-max min-w-(--bits-select-anchor-width) overflow-hidden rounded-control material-popover p-menu data-[side=bottom]:rounded-t-none data-[side=top]:rounded-b-none',
|
|
33
33
|
className
|
|
34
34
|
)}
|
|
35
35
|
{sideOffset}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<Select.Trigger
|
|
15
15
|
bind:ref
|
|
16
16
|
class={cn(
|
|
17
|
-
'flex
|
|
17
|
+
'flex tier-control w-full items-center justify-between gap-icon-inset-chip bg-elevated px-inset-control text-body leading-none text-fg shadow-sm hover:bg-highlight focus:bg-highlight focus:outline-none disabled:opacity-50 data-[state=open]:rounded-b-none data-[state=open]:shadow-pressed',
|
|
18
18
|
className
|
|
19
19
|
)}
|
|
20
20
|
{...restProps}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// the viewport boundary, so only the open edge is visible and it was the
|
|
12
12
|
// thick one.
|
|
13
13
|
export const sheetVariants = tv({
|
|
14
|
-
base: 'fixed z-overlay flex flex-col
|
|
14
|
+
base: 'fixed z-overlay material-panel flex flex-col',
|
|
15
15
|
variants: {
|
|
16
16
|
// The two axes meet at the corners: the SIDE picks which corners are
|
|
17
17
|
// detached from the screen edge, the HEADER picks their radius. Stated
|
|
@@ -17,7 +17,7 @@ export declare const sheetVariants: import("tailwind-variants").TVReturnType<{
|
|
|
17
17
|
true: "[--sheet-rd:var(--era-rd-control)]";
|
|
18
18
|
false: "[--sheet-rd:var(--era-rd-bar)] gap-gutter overflow-y-auto p-card";
|
|
19
19
|
};
|
|
20
|
-
}, undefined, "fixed z-overlay flex flex-col
|
|
20
|
+
}, undefined, "fixed z-overlay material-panel flex flex-col", {
|
|
21
21
|
side: {
|
|
22
22
|
top: "inset-x-0 top-0 max-h-[85dvh] rounded-b-(--sheet-rd)";
|
|
23
23
|
bottom: "inset-x-0 bottom-0 max-h-[85dvh] rounded-t-(--sheet-rd)";
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<Slider.Thumb
|
|
9
9
|
bind:ref
|
|
10
10
|
class={cn(
|
|
11
|
-
"relative block
|
|
11
|
+
"relative block tier-icon w-icon cursor-pointer bg-fg shadow-sm transition-transform duration-base will-change-transform after:absolute after:inset-[-13px] after:content-[''] hover:scale-105 focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:scale-[0.96]",
|
|
12
12
|
className
|
|
13
13
|
)}
|
|
14
14
|
{...restProps}
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
<Collapsible.Trigger
|
|
27
27
|
bind:ref
|
|
28
28
|
class={cn(
|
|
29
|
-
'flex
|
|
29
|
+
'flex tier-control w-full min-w-0 era-interactive cursor-pointer items-center gap-gutter px-inset-control text-body leading-none text-muted transition-colors duration-base ease-base hover:text-fg',
|
|
30
30
|
className
|
|
31
31
|
)}
|
|
32
32
|
{...restProps}
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
// component that had worked around it with the border below rather than
|
|
33
33
|
// moving tier. This moves tier; the border stays, since a track needs a
|
|
34
34
|
// closed shape at chip size on every surface, not just the flat one.
|
|
35
|
-
'inline-flex
|
|
35
|
+
'inline-flex tier-chip w-[calc(var(--era-h-chip)+var(--era-h-icon))] shrink-0 era-interactive cursor-pointer items-center justify-center border border-divider bg-field shadow-well hover:bg-highlight data-[state=checked]:bg-fg',
|
|
36
36
|
className
|
|
37
37
|
)}
|
|
38
38
|
{...restProps}
|
|
@@ -41,8 +41,8 @@
|
|
|
41
41
|
may retune the feel by overriding --era-ease in its [data-surface]
|
|
42
42
|
block; a surface wanting a different STRATEGY (e.g. glass crossfade
|
|
43
43
|
vs bevel track-slide) scopes a rule to its own surface — see the
|
|
44
|
-
|
|
44
|
+
material contract in surfaces/contract.css. -->
|
|
45
45
|
<Switch.Thumb
|
|
46
|
-
class="pointer-events-none block
|
|
46
|
+
class="pointer-events-none block tier-icon w-icon -translate-x-[calc(var(--era-h-icon)/2)] bg-fg transition-transform duration-base ease-base data-[state=checked]:translate-x-[calc(var(--era-h-icon)/2)] data-[state=checked]:bg-2"
|
|
47
47
|
/>
|
|
48
48
|
</Switch.Root>
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<TimeField.Segment
|
|
19
19
|
bind:ref
|
|
20
20
|
class={cn(
|
|
21
|
-
'era-token-ink
|
|
21
|
+
'era-token-ink tier-chip px-[calc(var(--era-sp)/2)] focus:bg-highlight focus:text-bright focus:outline-none aria-[valuetext=Empty]:text-muted data-[segment=literal]:text-muted',
|
|
22
22
|
className
|
|
23
23
|
)}
|
|
24
24
|
{...restProps}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
<TimeRangeField.Segment
|
|
23
23
|
bind:ref
|
|
24
24
|
class={cn(
|
|
25
|
-
'era-token-ink
|
|
25
|
+
'era-token-ink tier-chip px-[calc(var(--era-sp)/2)] focus:bg-highlight focus:text-bright focus:outline-none aria-[valuetext=Empty]:text-muted data-[segment=literal]:text-muted',
|
|
26
26
|
className
|
|
27
27
|
)}
|
|
28
28
|
{...restProps}
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
|
|
74
74
|
<div
|
|
75
75
|
class={cn(
|
|
76
|
-
'flex
|
|
76
|
+
'flex tier-control items-center justify-end gap-inset-control px-inset-control shadow-sm outline outline-divider',
|
|
77
77
|
tone.bar,
|
|
78
78
|
className
|
|
79
79
|
)}
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
variants: {
|
|
15
15
|
variant: {
|
|
16
16
|
plain:
|
|
17
|
-
'
|
|
18
|
-
segmented: '
|
|
17
|
+
'pressable min-w-control tier-control px-inset-control shadow-sm hover:shadow-highlight',
|
|
18
|
+
segmented: 'min-w-chip tier-chip px-inset-chip'
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
defaultVariants: { variant: 'plain' }
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
export declare const toggleGroupItemVariants: import("tailwind-variants").TVReturnType<{
|
|
2
2
|
variant: {
|
|
3
|
-
plain: "
|
|
4
|
-
segmented: "
|
|
3
|
+
plain: "pressable min-w-control tier-control px-inset-control shadow-sm hover:shadow-highlight";
|
|
4
|
+
segmented: "min-w-chip tier-chip px-inset-chip";
|
|
5
5
|
};
|
|
6
6
|
}, undefined, "inline-flex items-center justify-center text-body text-fg era-interactive not-has-[svg]:era-label-ink not-has-[svg]:text-center hover:bg-highlight focus:outline-none disabled:opacity-50 data-[state=on]:bg-fill data-[state=on]:text-bright data-[state=on]:shadow-pressed data-[state=on]:hover:shadow-pressed", {
|
|
7
7
|
variant: {
|
|
8
|
-
plain: "
|
|
9
|
-
segmented: "
|
|
8
|
+
plain: "pressable min-w-control tier-control px-inset-control shadow-sm hover:shadow-highlight";
|
|
9
|
+
segmented: "min-w-chip tier-chip px-inset-chip";
|
|
10
10
|
};
|
|
11
11
|
}, undefined, import("tailwind-variants").TVReturnTypeLike<{
|
|
12
12
|
variant: {
|
|
13
|
-
plain: "
|
|
14
|
-
segmented: "
|
|
13
|
+
plain: "pressable min-w-control tier-control px-inset-control shadow-sm hover:shadow-highlight";
|
|
14
|
+
segmented: "min-w-chip tier-chip px-inset-chip";
|
|
15
15
|
};
|
|
16
16
|
}, undefined>>;
|
|
17
17
|
import { ToggleGroup } from 'bits-ui';
|
|
@@ -10,8 +10,7 @@
|
|
|
10
10
|
variants: {
|
|
11
11
|
variant: {
|
|
12
12
|
plain: 'gap-gutter',
|
|
13
|
-
segmented:
|
|
14
|
-
'h-control gap-chip-inset-control rounded-control bg-field p-chip-inset-control shadow-well'
|
|
13
|
+
segmented: 'gap-chip-inset-control tier-control bg-field p-chip-inset-control shadow-well'
|
|
15
14
|
}
|
|
16
15
|
},
|
|
17
16
|
defaultVariants: { variant: 'plain' }
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
export declare const toggleGroupVariants: import("tailwind-variants").TVReturnType<{
|
|
2
2
|
variant: {
|
|
3
3
|
plain: "gap-gutter";
|
|
4
|
-
segmented: "
|
|
4
|
+
segmented: "gap-chip-inset-control tier-control bg-field p-chip-inset-control shadow-well";
|
|
5
5
|
};
|
|
6
6
|
}, undefined, "inline-flex items-center", {
|
|
7
7
|
variant: {
|
|
8
8
|
plain: "gap-gutter";
|
|
9
|
-
segmented: "
|
|
9
|
+
segmented: "gap-chip-inset-control tier-control bg-field p-chip-inset-control shadow-well";
|
|
10
10
|
};
|
|
11
11
|
}, undefined, import("tailwind-variants").TVReturnTypeLike<{
|
|
12
12
|
variant: {
|
|
13
13
|
plain: "gap-gutter";
|
|
14
|
-
segmented: "
|
|
14
|
+
segmented: "gap-chip-inset-control tier-control bg-field p-chip-inset-control shadow-well";
|
|
15
15
|
};
|
|
16
16
|
}, undefined>>;
|
|
17
17
|
import { ToggleGroup } from 'bits-ui';
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
bind:ref
|
|
20
20
|
{...relay?.attrs}
|
|
21
21
|
class={cn(
|
|
22
|
-
'z-overlay inline-flex
|
|
22
|
+
'z-overlay inline-flex tier-pill items-center gap-gutter material-popover px-inset-pill text-body leading-none whitespace-nowrap text-fg has-[svg]:gap-inset-pill',
|
|
23
23
|
className
|
|
24
24
|
)}
|
|
25
25
|
{sideOffset}
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
data-depth={item.depth}
|
|
55
55
|
style="padding-left: calc(var(--spacing-gutter) + {item.depth} * var(--era-h-control) / 2)"
|
|
56
56
|
class={cn(
|
|
57
|
-
'flex
|
|
57
|
+
'flex tier-control era-interactive cursor-default items-center gap-gutter pr-icon-inset-control text-body',
|
|
58
58
|
'hover:bg-highlight focus:outline-none focus-visible:bg-highlight',
|
|
59
59
|
selected ? 'bg-fill text-bright' : 'text-fg',
|
|
60
60
|
item.node.disabled && 'pointer-events-none opacity-50',
|
|
@@ -828,7 +828,7 @@
|
|
|
828
828
|
// against the mute button below. Visibility is in the scoped style block.
|
|
829
829
|
const volumeSleeveClass = $derived(
|
|
830
830
|
resolvedVolumeOrientation === 'vertical'
|
|
831
|
-
? 'absolute bottom-full left-1/2 z-20 h-[calc(var(--era-h-bar)*3)] w-control -translate-x-1/2 rounded-t-control bg-hover shadow-sm
|
|
831
|
+
? 'surface-backdrop absolute bottom-full left-1/2 z-20 h-[calc(var(--era-h-bar)*3)] w-control -translate-x-1/2 rounded-t-control bg-hover shadow-sm'
|
|
832
832
|
: 'relative h-chip w-[calc(var(--era-h-control)*3)]'
|
|
833
833
|
);
|
|
834
834
|
// Slider IS the visible track. Range and Thumb (both bg-fg) live inside
|
|
@@ -1058,7 +1058,7 @@
|
|
|
1058
1058
|
-->
|
|
1059
1059
|
<span
|
|
1060
1060
|
aria-hidden="true"
|
|
1061
|
-
class="pointer-events-none absolute bottom-[calc(100%+(var(--era-h-bar)-var(--era-h-chip))/2+var(--era-gap))] left-(--era-video-hover-pct) inline-flex
|
|
1061
|
+
class="pointer-events-none absolute bottom-[calc(100%+(var(--era-h-bar)-var(--era-h-chip))/2+var(--era-gap))] left-(--era-video-hover-pct) inline-flex tier-pill -translate-x-1/2 items-center gap-gutter material-popover px-inset-pill font-mono text-body leading-none whitespace-nowrap text-fg"
|
|
1062
1062
|
>
|
|
1063
1063
|
<span class="tabular-nums">{hoverTimeLabel}</span>
|
|
1064
1064
|
{#if hoverChapter}
|
|
@@ -5,7 +5,12 @@ export declare const SPACING: string[];
|
|
|
5
5
|
export declare const twMergeConfig: {
|
|
6
6
|
extend: {
|
|
7
7
|
classGroups: {
|
|
8
|
-
'
|
|
8
|
+
'era-tier': {
|
|
9
|
+
tier: string[];
|
|
10
|
+
}[];
|
|
11
|
+
'material-role': {
|
|
12
|
+
material: string[];
|
|
13
|
+
}[];
|
|
9
14
|
'font-size': {
|
|
10
15
|
text: string[];
|
|
11
16
|
}[];
|
|
@@ -42,6 +42,7 @@ export const SPACING = [
|
|
|
42
42
|
'pill-inset-bar',
|
|
43
43
|
'chip-inset-control',
|
|
44
44
|
'chip-inset-bar',
|
|
45
|
+
'control-inset-bar',
|
|
45
46
|
'glyph-icon',
|
|
46
47
|
'glyph-pill'
|
|
47
48
|
];
|
|
@@ -122,8 +123,11 @@ export const twMergeConfig = {
|
|
|
122
123
|
classGroups: {
|
|
123
124
|
...spacingGroups,
|
|
124
125
|
...radiusGroups,
|
|
125
|
-
//
|
|
126
|
-
|
|
126
|
+
// A tier utility owns height and radius as one indivisible geometry choice.
|
|
127
|
+
// The last tier-* supplied by a consumer must replace the component default.
|
|
128
|
+
'era-tier': [{ tier: TIERS }],
|
|
129
|
+
// A component has one complete floating material role at a time.
|
|
130
|
+
'material-role': [{ material: ['popover', 'panel'] }],
|
|
127
131
|
// Registered font sizes — without this they read as colours.
|
|
128
132
|
'font-size': [{ text: ['body', 'micro', 'lede', 'heading', 'title', 'display'] }],
|
|
129
133
|
leading: [{ leading: ['body'] }],
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@signal9/era-ui",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "32.0.0",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"dev": "vite dev --host",
|
|
6
6
|
"build": "vite build && npm run prepack",
|
|
7
7
|
"test:visual": "playwright test",
|
|
8
|
+
"test:visual:deep": "ERA_TEST_DEPTH=deep playwright test",
|
|
8
9
|
"deploy": "npm run build && npx --yes wrangler@latest deploy",
|
|
9
10
|
"preview": "wrangler dev .svelte-kit/cloudflare/_worker.js --port 4173",
|
|
10
11
|
"prepare": "git config core.hooksPath .githooks 2>/dev/null || true; svelte-kit sync || echo ''",
|
|
@@ -25,8 +26,8 @@
|
|
|
25
26
|
"check:classes": "node --experimental-strip-types scripts/check-classes.ts",
|
|
26
27
|
"check:twmerge": "node --experimental-strip-types scripts/check-twmerge.ts",
|
|
27
28
|
"build:llm-docs": "node --experimental-strip-types scripts/build-llm-docs.ts",
|
|
28
|
-
"prebuild": "npm run check:surfaces && npm run check:tokens && npm run check:routes && npm run check:canonical && npm run check:layers && npm run check:themes && npm run check:classes && npm run check:twmerge && npm run check:doc-tokens && npm run check:audit-controls && npm run check:specimen-coverage && npm run check:eslint-rules && npm run check:install && npm run check:reachable && npm run check:double-edge && npm run build:llm-docs",
|
|
29
|
-
"validate": "npm run check && npm run lint && npm run format:check && npm run check:surfaces && npm run check:tokens && npm run check:routes && npm run check:canonical && npm run check:layers && npm run check:themes && npm run check:classes && npm run check:twmerge && npm run check:doc-tokens && npm run check:audit-controls && npm run check:specimen-coverage && npm run check:eslint-rules && npm run check:install && npm run check:reachable && npm run check:double-edge",
|
|
29
|
+
"prebuild": "npm run check:surfaces && npm run check:tokens && npm run check:routes && npm run check:canonical && npm run check:layers && npm run check:themes && npm run check:classes && npm run check:twmerge && npm run check:doc-tokens && npm run check:audit-controls && npm run check:specimen-coverage && npm run check:eslint-rules && npm run check:install && npm run check:reachable && npm run check:double-edge && npm run check:geometry && npm run build:llm-docs",
|
|
30
|
+
"validate": "npm run check && npm run lint && npm run format:check && npm run check:surfaces && npm run check:tokens && npm run check:routes && npm run check:canonical && npm run check:layers && npm run check:themes && npm run check:classes && npm run check:twmerge && npm run check:doc-tokens && npm run check:audit-controls && npm run check:specimen-coverage && npm run check:eslint-rules && npm run check:install && npm run check:reachable && npm run check:double-edge && npm run check:geometry",
|
|
30
31
|
"test": "npm run test:visual",
|
|
31
32
|
"check:doc-tokens": "node --experimental-strip-types scripts/check-doc-tokens.ts",
|
|
32
33
|
"check:audit-controls": "node --experimental-strip-types scripts/check-audit-controls.ts",
|
|
@@ -35,6 +36,7 @@
|
|
|
35
36
|
"check:install": "node --experimental-strip-types scripts/check-install.ts",
|
|
36
37
|
"check:reachable": "node --experimental-strip-types scripts/check-reachable.ts",
|
|
37
38
|
"check:double-edge": "node --experimental-strip-types scripts/check-double-edge.ts",
|
|
39
|
+
"check:geometry": "node --experimental-strip-types scripts/check-geometry.ts",
|
|
38
40
|
"verify:published": "node scripts/verify-published.mjs"
|
|
39
41
|
},
|
|
40
42
|
"files": [
|