@signal9/era-ui 12.1.2 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/dev/audit-overlay.svelte +1 -1
  2. package/dist/docs/css-utilities.js +6 -1
  3. package/dist/docs/notes.md +12 -11
  4. package/dist/era-ui.css +1 -1
  5. package/dist/generated-docs/badge.md +3 -0
  6. package/dist/generated-docs/button.md +4 -0
  7. package/dist/generated-docs/chip.md +3 -0
  8. package/dist/generated-docs/llms-full.txt +53 -31
  9. package/dist/generated-docs/llms.txt +1 -1
  10. package/dist/generated-docs/manifest.json +17 -17
  11. package/dist/generated-docs/notes.md +12 -11
  12. package/dist/generated-docs/utilities.json +10 -10
  13. package/dist/generated-docs/utilities.md +30 -19
  14. package/dist/os/index.d.ts +0 -1
  15. package/dist/os/index.js +0 -1
  16. package/dist/os/notification-center.svelte +1 -2
  17. package/dist/os/taskbar.svelte +2 -3
  18. package/dist/os/toaster.svelte +2 -3
  19. package/dist/styles/index.css +77 -12
  20. package/dist/styles/layers.css +48 -0
  21. package/dist/styles/surfaces/base.css +4 -2
  22. package/dist/styles/surfaces/glass.css +0 -13
  23. package/dist/theme/index.d.ts +87 -0
  24. package/dist/theme/index.js +86 -0
  25. package/dist/ui/alert-dialog/alert-dialog-content.svelte +2 -2
  26. package/dist/ui/alert-dialog/alert-dialog-overlay.svelte +1 -1
  27. package/dist/ui/badge/badge.svelte +14 -1
  28. package/dist/ui/badge/badge.svelte.d.ts +4 -0
  29. package/dist/ui/button/button.svelte +37 -7
  30. package/dist/ui/button/button.svelte.d.ts +6 -0
  31. package/dist/ui/chip/chip.svelte +14 -1
  32. package/dist/ui/chip/chip.svelte.d.ts +4 -0
  33. package/dist/ui/combobox/combobox-content.svelte +1 -1
  34. package/dist/ui/command-bar/command-bar.svelte +1 -1
  35. package/dist/ui/context-menu/context-menu-content.svelte +1 -1
  36. package/dist/ui/context-menu/context-menu-sub-content.svelte +1 -1
  37. package/dist/ui/date-picker/date-picker-content.svelte +1 -1
  38. package/dist/ui/date-range-picker/date-range-picker-content.svelte +1 -1
  39. package/dist/ui/dialog/dialog-content.svelte +1 -1
  40. package/dist/ui/dialog/dialog-overlay.svelte +5 -1
  41. package/dist/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
  42. package/dist/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  43. package/dist/ui/link-preview/link-preview-content.svelte +1 -1
  44. package/dist/ui/menubar/menubar-content.svelte +1 -1
  45. package/dist/ui/menubar/menubar-sub-content.svelte +1 -1
  46. package/dist/ui/popover/popover-content.svelte +1 -1
  47. package/dist/ui/select/select-content.svelte +1 -1
  48. package/dist/ui/sheet/sheet-content.svelte +1 -1
  49. package/dist/ui/sheet/sheet-content.svelte.d.ts +1 -1
  50. package/dist/ui/tooltip/tooltip-content.svelte +1 -1
  51. package/package.json +9 -12
  52. package/dist/apps/index.d.ts +0 -20
  53. package/dist/apps/index.js +0 -20
  54. package/dist/apps/llm-shell/index.d.ts +0 -2
  55. package/dist/apps/llm-shell/index.js +0 -1
  56. package/dist/apps/llm-shell/llm-shell.svelte +0 -334
  57. package/dist/apps/llm-shell/llm-shell.svelte.d.ts +0 -57
  58. package/dist/apps/llm-shell/llm-swarm.svelte +0 -79
  59. package/dist/apps/llm-shell/llm-swarm.svelte.d.ts +0 -25
  60. package/dist/apps/llm-shell/types.d.ts +0 -103
  61. package/dist/apps/llm-shell/types.js +0 -1
  62. package/dist/apps/notes/editor/bubble-menu.svelte.d.ts +0 -11
  63. package/dist/apps/notes/editor/bubble-menu.svelte.js +0 -165
  64. package/dist/apps/notes/editor/bubble-toolbar.svelte +0 -55
  65. package/dist/apps/notes/editor/bubble-toolbar.svelte.d.ts +0 -22
  66. package/dist/apps/notes/editor/extensions.d.ts +0 -18
  67. package/dist/apps/notes/editor/extensions.js +0 -88
  68. package/dist/apps/notes/editor/floating.d.ts +0 -25
  69. package/dist/apps/notes/editor/floating.js +0 -54
  70. package/dist/apps/notes/editor/link.d.ts +0 -9
  71. package/dist/apps/notes/editor/link.js +0 -22
  72. package/dist/apps/notes/editor/list-cleanup-rule.d.ts +0 -14
  73. package/dist/apps/notes/editor/list-cleanup-rule.js +0 -47
  74. package/dist/apps/notes/editor/slash-command.svelte.d.ts +0 -22
  75. package/dist/apps/notes/editor/slash-command.svelte.js +0 -215
  76. package/dist/apps/notes/editor/slash-menu.svelte +0 -82
  77. package/dist/apps/notes/editor/slash-menu.svelte.d.ts +0 -23
  78. package/dist/apps/notes/index.d.ts +0 -11
  79. package/dist/apps/notes/index.js +0 -13
  80. package/dist/apps/notes/markdown.d.ts +0 -12
  81. package/dist/apps/notes/markdown.js +0 -165
  82. package/dist/apps/notes/note-editor.svelte +0 -176
  83. package/dist/apps/notes/note-editor.svelte.d.ts +0 -36
  84. package/dist/apps/notes/notes-store.svelte.d.ts +0 -64
  85. package/dist/apps/notes/notes-store.svelte.js +0 -234
  86. package/dist/apps/notes/notes.svelte +0 -501
  87. package/dist/apps/notes/notes.svelte.d.ts +0 -53
  88. package/dist/apps/notes/tree.d.ts +0 -70
  89. package/dist/apps/notes/tree.js +0 -185
  90. package/dist/apps/notes/types.d.ts +0 -49
  91. package/dist/apps/notes/types.js +0 -11
  92. package/dist/os/layers.d.ts +0 -23
  93. package/dist/os/layers.js +0 -23
@@ -18,6 +18,9 @@ Inherits all props from `HTMLAttributes<HTMLDivElement>`.
18
18
  | `size?` | `'chip' \| 'pill'` | `'chip'` | `sm` (default) is the standalone free chip; `pill` is the smaller pill
19
19
  that nests inside an md container (a select trigger, a button). |
20
20
  | `ondismiss?` | `() => void` | — | — |
21
+ | `lead?` | `Snippet` | — | Icon rendered BEFORE the label, outside it. Use this rather than putting
22
+ an icon in `children`: the label then gets its own box, which is the only
23
+ place era's ink centring can reach. |
21
24
  | `children?` | `Snippet` | — | — |
22
25
 
23
26
  ## Usage
@@ -63,6 +63,7 @@ Classes, not components — they need no import beyond the stylesheet. Reach for
63
63
  - `era-ink-center` — on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim.
64
64
  - `era-token-ink` — the ink centring for a token pill — a badge, a KV value, any short caps-or-digits label in a fixed-height box, CENTRED horizontally and with no icon sibling. For a left-aligned sentence-case label use era-label-ink; when an icon really must sit beside the text, see the note there.
65
65
  - `era-label-ink` — the ink centring for a fixed-height control holding ONE line of sentence-case text and no icon — a menu item, a nav trigger, a button label. Never alongside `truncate` (the trimmed box becomes the clip).
66
+ - `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.
66
67
  - `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.
67
68
  - `era-collapse` — the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden).
68
69
  - `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-*).
@@ -87,7 +88,6 @@ Classes, not components — they need no import beyond the stylesheet. Reach for
87
88
  - `ease-base` — Motion — bare transition utilities default to the motion axis, so
88
89
  - `bg-divider · text-divider · border-divider · bg-divider-faded · text-divider-faded · border-divider-faded · bg-background · text-background · … (66 in all)` — Surface divider colors: border-divider, bg-divider-faded, …
89
90
  - `bg-fill · text-fill · border-fill · bg-link · text-link · border-link · bg-primary · text-primary · … (33 in all)` — The standing pill fill — --era-fill, the latched counterpart of the
90
- - `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.
91
91
 
92
92
  Full reference (what each emits, when to use it): `/utilities.md`. Machine-readable list: `/utilities.json`.
93
93
 
@@ -195,6 +195,7 @@ source uses it where a name exists.
195
195
  | `era-ink-center` | on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim. |
196
196
  | `era-token-ink` | the ink centring for a token pill — a badge, a KV value, any short caps-or-digits label in a fixed-height box, CENTRED horizontally and with no icon sibling. For a left-aligned sentence-case label use era-label-ink; when an icon really must sit beside the text, see the note there. |
197
197
  | `era-label-ink` | the ink centring for a fixed-height control holding ONE line of sentence-case text and no icon — a menu item, a nav trigger, a button label. Never alongside `truncate` (the trimmed box becomes the clip). |
198
+ | `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. |
198
199
  | `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. |
199
200
  | `era-collapse` | the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden). |
200
201
  | `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-*). |
@@ -219,7 +220,6 @@ source uses it where a name exists.
219
220
  | `ease-base` | — |
220
221
  | `bg-divider` `text-divider` `border-divider` `bg-divider-faded` `text-divider-faded` `border-divider-faded` `bg-background` `text-background` `border-background` `bg-foreground` `text-foreground` `border-foreground` `bg-1` `text-1` `border-1` `bg-2` `text-2` `border-2` `bg-3` `text-3` `border-3` `bg-4` `text-4` `border-4` `bg-5` `text-5` `border-5` `bg-6` `text-6` `border-6` `bg-7` `text-7` `border-7` `bg-8` `text-8` `border-8` `bg-9` `text-9` `border-9` `bg-10` `text-10` `border-10` `bg-11` `text-11` `border-11` `bg-12` `text-12` `border-12` `bg-border` `text-border` `border-border` `bg-surface` `text-surface` `border-surface` `bg-hover` `text-hover` `border-hover` `bg-fg` `text-fg` `border-fg` `bg-bright` `text-bright` `border-bright` `bg-muted` `text-muted` `border-muted` | — |
221
222
  | `bg-fill` `text-fill` `border-fill` `bg-link` `text-link` `border-link` `bg-primary` `text-primary` `border-primary` `bg-primary-fg` `text-primary-fg` `border-primary-fg` `bg-primary-hover` `text-primary-hover` `border-primary-hover` `bg-destructive` `text-destructive` `border-destructive` `bg-destructive-fg` `text-destructive-fg` `border-destructive-fg` `bg-success` `text-success` `border-success` `bg-success-fg` `text-success-fg` `border-success-fg` `bg-warning` `text-warning` `border-warning` `bg-warning-fg` `text-warning-fg` `border-warning-fg` | — |
222
- | `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. |
223
223
 
224
224
  ## era-interactive
225
225
 
@@ -517,6 +517,35 @@ Declared in `index.css`.
517
517
  }
518
518
  ```
519
519
 
520
+ ## glass-blur
521
+
522
+ **Use it for:** 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.
523
+
524
+ Tailwind v4 cannot resolve var() inside backdrop-blur-[], so the filter
525
+ is a registered utility, gated to glass subtrees.
526
+
527
+ It lives HERE rather than in surfaces/glass.css, where a surface's own
528
+ chrome would naturally sit, because glass.css is imported into a cascade
529
+ layer and `@utility` cannot be nested inside one. Surface-scoped RULES stay
530
+ in their surface file; surface-scoped UTILITIES have to come out.
531
+
532
+ Declared in `index.css`.
533
+
534
+ ```css
535
+ @utility` cannot be nested inside one. Surface-scoped RULES stay
536
+ * in their surface file; surface-scoped UTILITIES have to come out.
537
+ *
538
+ * @use the backdrop blur for a floating panel (popover, dialog, taskbar) — it
539
+ * applies only inside a data-surface="glass" subtree and is inert elsewhere,
540
+ * so it is safe to leave on a panel that renders under every surface. */
541
+ @utility glass-blur {
542
+ [data-surface='glass'] & {
543
+ backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));
544
+ -webkit-backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));
545
+ }
546
+ }
547
+ ```
548
+
520
549
  ## era-shimmer
521
550
 
522
551
  **Use it for:** the in-progress text treatment — put it on a "working…" / "thinking…" label while a task streams, instead of a spinner beside the text.
@@ -1040,24 +1069,6 @@ Declared in `index.css`.
1040
1069
  }
1041
1070
  ```
1042
1071
 
1043
- ## glass-blur
1044
-
1045
- **Use it for:** 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.
1046
-
1047
- Tailwind v4 cannot resolve var() inside backdrop-blur-[], so the filter
1048
- is a registered utility, gated to glass subtrees.
1049
-
1050
- Declared in `surfaces/glass.css`.
1051
-
1052
- ```css
1053
- @utility glass-blur {
1054
- [data-surface='glass'] & {
1055
- backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));
1056
- -webkit-backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));
1057
- }
1058
- }
1059
- ```
1060
-
1061
1072
  <!-- end: utilities -->
1062
1073
 
1063
1074
  <!-- begin: draggable -->
@@ -1100,19 +1111,20 @@ A complete notes app — rich-text editor, slash commands, local persistence.
1100
1111
 
1101
1112
  ## Usage
1102
1113
 
1103
- Apps ship on their own subpath and are **not** re-exported from `@signal9/era-ui`.
1104
- Notes carries TipTap, and a consumer who never imports an app should never pay
1105
- for it.
1114
+ **Notes is not published.** It lives in `src/apps/` in the era-ui repository,
1115
+ outside the packaged `src/lib`, so there is no import path that reaches it — the
1116
+ `@signal9/era-ui/apps` subpath was removed in v13.
1106
1117
 
1107
- ```svelte
1108
- <script>
1109
- import { Notes } from '@signal9/era-ui/apps';
1110
- </script>
1118
+ A design system that also ships a note-taking application is two products in one
1119
+ package: Notes alone brings fifteen TipTap packages, and its release cadence and
1120
+ support expectations are nothing like a primitive's. It stays in the repo as a
1121
+ reference implementation and a demo — read it, copy it, or lift it into the
1122
+ product that renders it.
1111
1123
 
1112
- <Notes />
1113
- ```
1124
+ What era DOES publish is the part that generalises: `@signal9/era-ui/styles/prose`
1125
+ is the document typography Notes uses, available to anyone building an editor.
1114
1126
 
1115
- That is the whole integration: a sidebar with filter, pin, and delete; a TipTap
1127
+ Read as a reference, the integration is: a sidebar with filter, pin, and delete; a TipTap
1116
1128
  document with a `/` command menu and a selection toolbar; and persistence to
1117
1129
  `localStorage` under `era-ui:notes`.
1118
1130
 
@@ -1146,7 +1158,7 @@ Persistence is one small interface, so server-backed hosting is a drop-in swap
1146
1158
  `load`/`save` may be sync or async:
1147
1159
 
1148
1160
  ```ts
1149
- import { Notes, NotesStore } from '@signal9/era-ui/apps';
1161
+ import { Notes, NotesStore } from '$apps/index.js'; // in-repo; not published
1150
1162
 
1151
1163
  const store = new NotesStore({
1152
1164
  adapter: {
@@ -1225,6 +1237,9 @@ Inherits all props from `HTMLAttributes<HTMLSpanElement>`.
1225
1237
  |------|------|---------|-------|
1226
1238
  | `ref?` | `HTMLSpanElement \| null` | `null` | bindable |
1227
1239
  | `tone?` | `'default' \| 'accent' \| 'destructive' \| 'success' \| 'warning'` | `'default'` | — |
1240
+ | `lead?` | `Snippet` | — | Icon rendered BEFORE the label, outside it. Use this rather than putting
1241
+ an icon in `children`: the label then gets its own box, which is the only
1242
+ place era's ink centring can reach. |
1228
1243
  | `children?` | `Snippet` | — | — |
1229
1244
 
1230
1245
  ## Usage
@@ -1347,6 +1362,10 @@ Inherits all props from `Button.RootProps`.
1347
1362
  spinner. The existing label stays rendered so focus, click targets,
1348
1363
  and screen-reader accessible names don't change shape mid-flight. |
1349
1364
  | `loadingLabel?` | `string` | — | Screen-reader-only label announced while `loading` is true. |
1365
+ | `lead?` | `Snippet` | — | Icon rendered BEFORE the label, outside it. Use this rather than putting
1366
+ an icon in `children`: the label then gets its own box, which is the only
1367
+ place era's ink centring can reach (see era-label-ink). |
1368
+ | `trail?` | `Snippet` | — | Icon rendered AFTER the label, outside it. Same reason as `lead`. |
1350
1369
  | `children?` | `Snippet` | — | — |
1351
1370
  | `ref?` | `(forwarded)` | `null` | bindable |
1352
1371
 
@@ -1490,6 +1509,9 @@ Inherits all props from `HTMLAttributes<HTMLDivElement>`.
1490
1509
  | `size?` | `'chip' \| 'pill'` | `'chip'` | `sm` (default) is the standalone free chip; `pill` is the smaller pill
1491
1510
  that nests inside an md container (a select trigger, a button). |
1492
1511
  | `ondismiss?` | `() => void` | — | — |
1512
+ | `lead?` | `Snippet` | — | Icon rendered BEFORE the label, outside it. Use this rather than putting
1513
+ an icon in `children`: the label then gets its own box, which is the only
1514
+ place era's ink centring can reach. |
1493
1515
  | `children?` | `Snippet` | — | — |
1494
1516
 
1495
1517
  ## Usage
@@ -101,6 +101,7 @@ Classes, not components — they need no import beyond the stylesheet. Reach for
101
101
  - `era-ink-center` — on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim.
102
102
  - `era-token-ink` — the ink centring for a token pill — a badge, a KV value, any short caps-or-digits label in a fixed-height box, CENTRED horizontally and with no icon sibling. For a left-aligned sentence-case label use era-label-ink; when an icon really must sit beside the text, see the note there.
103
103
  - `era-label-ink` — the ink centring for a fixed-height control holding ONE line of sentence-case text and no icon — a menu item, a nav trigger, a button label. Never alongside `truncate` (the trimmed box becomes the clip).
104
+ - `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.
104
105
  - `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.
105
106
  - `era-collapse` — the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden).
106
107
  - `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-*).
@@ -125,6 +126,5 @@ Classes, not components — they need no import beyond the stylesheet. Reach for
125
126
  - `ease-base` — Motion — bare transition utilities default to the motion axis, so
126
127
  - `bg-divider · text-divider · border-divider · bg-divider-faded · text-divider-faded · border-divider-faded · bg-background · text-background · … (66 in all)` — Surface divider colors: border-divider, bg-divider-faded, …
127
128
  - `bg-fill · text-fill · border-fill · bg-link · text-link · border-link · bg-primary · text-primary · … (33 in all)` — The standing pill fill — --era-fill, the latched counterpart of the
128
- - `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.
129
129
 
130
130
  Full reference (what each emits, when to use it): `{{ORIGIN}}/utilities.md`. Machine-readable list: `{{ORIGIN}}/utilities.json`.
@@ -44,7 +44,7 @@
44
44
  "slug": "utilities",
45
45
  "title": "Utilities",
46
46
  "summary": "The CSS classes era ships alongside the components — links, ink-centred text, shimmer, hidden scrollbars.",
47
- "tokenEstimate": 10357,
47
+ "tokenEstimate": 10518,
48
48
  "sections": [
49
49
  "Overview",
50
50
  "era-interactive",
@@ -56,6 +56,7 @@
56
56
  "era-ink-center",
57
57
  "era-token-ink",
58
58
  "era-label-ink",
59
+ "glass-blur",
59
60
  "era-shimmer",
60
61
  "era-collapse",
61
62
  "h-icon · h-pill · h-chip · h-control · h-bar",
@@ -79,8 +80,7 @@
79
80
  "bg-field · text-field · border-field · bg-field-highlight · text-field-highlight · border-field-highlight",
80
81
  "ease-base",
81
82
  "bg-divider · text-divider · border-divider · bg-divider-faded · text-divider-faded · border-divider-faded · bg-background · text-background · … (66 in all)",
82
- "bg-fill · text-fill · border-fill · bg-link · text-link · border-link · bg-primary · text-primary · … (33 in all)",
83
- "glass-blur"
83
+ "bg-fill · text-fill · border-fill · bg-link · text-link · border-link · bg-primary · text-primary · … (33 in all)"
84
84
  ],
85
85
  "file": "utilities.md"
86
86
  },
@@ -120,7 +120,7 @@
120
120
  "slug": "notes",
121
121
  "title": "Notes",
122
122
  "summary": "A complete notes app — rich-text editor, slash commands, local persistence.",
123
- "tokenEstimate": 884,
123
+ "tokenEstimate": 1005,
124
124
  "sections": [
125
125
  "Usage",
126
126
  "Peer dependencies",
@@ -146,7 +146,7 @@
146
146
  "slug": "badge",
147
147
  "title": "Badge",
148
148
  "summary": "A small label for status or categorization.",
149
- "tokenEstimate": 226,
149
+ "tokenEstimate": 279,
150
150
  "sections": [
151
151
  "Import",
152
152
  "Props",
@@ -183,7 +183,7 @@
183
183
  "slug": "button",
184
184
  "title": "Button",
185
185
  "summary": "A flexible button or link element.",
186
- "tokenEstimate": 455,
186
+ "tokenEstimate": 538,
187
187
  "sections": [
188
188
  "Import",
189
189
  "Props",
@@ -229,7 +229,7 @@
229
229
  "slug": "chip",
230
230
  "title": "Chip",
231
231
  "summary": "An interactive, optionally dismissible token.",
232
- "tokenEstimate": 276,
232
+ "tokenEstimate": 329,
233
233
  "sections": [
234
234
  "Import",
235
235
  "Props",
@@ -1064,6 +1064,16 @@
1064
1064
  "description": "LABEL INK — era-token-ink's mixed-case sibling, and the general answer to\n\"this fixed-height control holds one line of text\".\n\nSame mechanism, same reason: `text-box-trim` needs a BLOCK box, so the row\nbecomes one and `align-content` (block-container alignment) does the\ncentring. What differs is the band and the alignment, because the content\nclass differs — a label is sentence case, so the x-height band is the visual\nmass to centre (cap-band reads low on \"System\"), and it is laid out against\nthe row's padding rather than centred in it.\n\nWHY IT EXISTS AT ALL: era's controls are flex, and a flex container's bare\ntext is an ANONYMOUS flex item — a box no selector reaches and no\nnon-inherited property touches. So `era-text-trim` on a flex row is inert,\ncontributing only its `line-height: 1`, and the ink falls back to line-box\ncentring by font metrics. era-token-ink already fixed that for centred\ntokens; this fixes it for everything else.\n\nTHE ICON CASE IS NOT SOLVED, and cannot be from CSS: an icon beside the text\nneeds the box to stay flex, which re-creates the anonymous item. A component\nwhose children are an opaque slot therefore guards it —\n`not-has-[svg]:era-label-ink` — and ink-centres the text-only case while\nleaving the icon case on line-box centring. Splitting icon and label into\nseparate slots is what would close it; typography/inert-trim reports every\nsite still on the fallback.",
1065
1065
  "css": "@utility era-label-ink {\n\tdisplay: block;\n\talign-content: center;\n\tline-height: 1;\n\ttext-box: trim-both ex alphabetic;\n}"
1066
1066
  },
1067
+ {
1068
+ "name": "glass-blur",
1069
+ "names": [
1070
+ "glass-blur"
1071
+ ],
1072
+ "file": "index.css",
1073
+ "useCase": "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.",
1074
+ "description": "Tailwind v4 cannot resolve var() inside backdrop-blur-[], so the filter\nis a registered utility, gated to glass subtrees.\n\nIt lives HERE rather than in surfaces/glass.css, where a surface's own\nchrome would naturally sit, because glass.css is imported into a cascade\nlayer and `@utility` cannot be nested inside one. Surface-scoped RULES stay\nin their surface file; surface-scoped UTILITIES have to come out.",
1075
+ "css": "@utility` cannot be nested inside one. Surface-scoped RULES stay\n * in their surface file; surface-scoped UTILITIES have to come out.\n *\n * @use the backdrop blur for a floating panel (popover, dialog, taskbar) — it\n * applies only inside a data-surface=\"glass\" subtree and is inert elsewhere,\n * so it is safe to leave on a panel that renders under every surface. */\n@utility glass-blur {\n\t[data-surface='glass'] & {\n\t\tbackdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));\n\t\t-webkit-backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));\n\t}\n}"
1076
+ },
1067
1077
  {
1068
1078
  "name": "era-shimmer",
1069
1079
  "names": [
@@ -1512,16 +1522,6 @@
1512
1522
  "file": "index.css",
1513
1523
  "description": "The standing pill fill — --era-fill, the latched counterpart of the\ntransient highlight. Surface-owned: a composing wash on flat/bevel, the\nopaque swatch on glass.",
1514
1524
  "css": "@theme inline {\n\t--color-fill: var(--era-fill);\n\t--color-link: var(--color-link);\n\t--color-primary: var(--color-primary);\n\t--color-primary-fg: var(--color-primary-fg);\n\t--color-primary-hover: var(--color-primary-hover);\n\t--color-destructive: var(--color-destructive);\n\t--color-destructive-fg: var(--color-destructive-fg);\n\t--color-success: var(--color-success);\n\t--color-success-fg: var(--color-success-fg);\n\t--color-warning: var(--color-warning);\n\t--color-warning-fg: var(--color-warning-fg);\n}"
1515
- },
1516
- {
1517
- "name": "glass-blur",
1518
- "names": [
1519
- "glass-blur"
1520
- ],
1521
- "file": "surfaces/glass.css",
1522
- "useCase": "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.",
1523
- "description": "Tailwind v4 cannot resolve var() inside backdrop-blur-[], so the filter\nis a registered utility, gated to glass subtrees.",
1524
- "css": "@utility glass-blur {\n\t[data-surface='glass'] & {\n\t\tbackdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));\n\t\t-webkit-backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));\n\t}\n}"
1525
1525
  }
1526
1526
  ]
1527
1527
  }
@@ -4,19 +4,20 @@ A complete notes app — rich-text editor, slash commands, local persistence.
4
4
 
5
5
  ## Usage
6
6
 
7
- Apps ship on their own subpath and are **not** re-exported from `@signal9/era-ui`.
8
- Notes carries TipTap, and a consumer who never imports an app should never pay
9
- for it.
7
+ **Notes is not published.** It lives in `src/apps/` in the era-ui repository,
8
+ outside the packaged `src/lib`, so there is no import path that reaches it — the
9
+ `@signal9/era-ui/apps` subpath was removed in v13.
10
10
 
11
- ```svelte
12
- <script>
13
- import { Notes } from '@signal9/era-ui/apps';
14
- </script>
11
+ A design system that also ships a note-taking application is two products in one
12
+ package: Notes alone brings fifteen TipTap packages, and its release cadence and
13
+ support expectations are nothing like a primitive's. It stays in the repo as a
14
+ reference implementation and a demo — read it, copy it, or lift it into the
15
+ product that renders it.
15
16
 
16
- <Notes />
17
- ```
17
+ What era DOES publish is the part that generalises: `@signal9/era-ui/styles/prose`
18
+ is the document typography Notes uses, available to anyone building an editor.
18
19
 
19
- That is the whole integration: a sidebar with filter, pin, and delete; a TipTap
20
+ Read as a reference, the integration is: a sidebar with filter, pin, and delete; a TipTap
20
21
  document with a `/` command menu and a selection toolbar; and persistence to
21
22
  `localStorage` under `era-ui:notes`.
22
23
 
@@ -50,7 +51,7 @@ Persistence is one small interface, so server-backed hosting is a drop-in swap
50
51
  `load`/`save` may be sync or async:
51
52
 
52
53
  ```ts
53
- import { Notes, NotesStore } from '@signal9/era-ui/apps';
54
+ import { Notes, NotesStore } from '$apps/index.js'; // in-repo; not published
54
55
 
55
56
  const store = new NotesStore({
56
57
  adapter: {
@@ -90,6 +90,16 @@
90
90
  "description": "LABEL INK — era-token-ink's mixed-case sibling, and the general answer to\n\"this fixed-height control holds one line of text\".\n\nSame mechanism, same reason: `text-box-trim` needs a BLOCK box, so the row\nbecomes one and `align-content` (block-container alignment) does the\ncentring. What differs is the band and the alignment, because the content\nclass differs — a label is sentence case, so the x-height band is the visual\nmass to centre (cap-band reads low on \"System\"), and it is laid out against\nthe row's padding rather than centred in it.\n\nWHY IT EXISTS AT ALL: era's controls are flex, and a flex container's bare\ntext is an ANONYMOUS flex item — a box no selector reaches and no\nnon-inherited property touches. So `era-text-trim` on a flex row is inert,\ncontributing only its `line-height: 1`, and the ink falls back to line-box\ncentring by font metrics. era-token-ink already fixed that for centred\ntokens; this fixes it for everything else.\n\nTHE ICON CASE IS NOT SOLVED, and cannot be from CSS: an icon beside the text\nneeds the box to stay flex, which re-creates the anonymous item. A component\nwhose children are an opaque slot therefore guards it —\n`not-has-[svg]:era-label-ink` — and ink-centres the text-only case while\nleaving the icon case on line-box centring. Splitting icon and label into\nseparate slots is what would close it; typography/inert-trim reports every\nsite still on the fallback.",
91
91
  "css": "@utility era-label-ink {\n\tdisplay: block;\n\talign-content: center;\n\tline-height: 1;\n\ttext-box: trim-both ex alphabetic;\n}"
92
92
  },
93
+ {
94
+ "name": "glass-blur",
95
+ "names": [
96
+ "glass-blur"
97
+ ],
98
+ "file": "index.css",
99
+ "useCase": "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.",
100
+ "description": "Tailwind v4 cannot resolve var() inside backdrop-blur-[], so the filter\nis a registered utility, gated to glass subtrees.\n\nIt lives HERE rather than in surfaces/glass.css, where a surface's own\nchrome would naturally sit, because glass.css is imported into a cascade\nlayer and `@utility` cannot be nested inside one. Surface-scoped RULES stay\nin their surface file; surface-scoped UTILITIES have to come out.",
101
+ "css": "@utility` cannot be nested inside one. Surface-scoped RULES stay\n * in their surface file; surface-scoped UTILITIES have to come out.\n *\n * @use the backdrop blur for a floating panel (popover, dialog, taskbar) — it\n * applies only inside a data-surface=\"glass\" subtree and is inert elsewhere,\n * so it is safe to leave on a panel that renders under every surface. */\n@utility glass-blur {\n\t[data-surface='glass'] & {\n\t\tbackdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));\n\t\t-webkit-backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));\n\t}\n}"
102
+ },
93
103
  {
94
104
  "name": "era-shimmer",
95
105
  "names": [
@@ -538,16 +548,6 @@
538
548
  "file": "index.css",
539
549
  "description": "The standing pill fill — --era-fill, the latched counterpart of the\ntransient highlight. Surface-owned: a composing wash on flat/bevel, the\nopaque swatch on glass.",
540
550
  "css": "@theme inline {\n\t--color-fill: var(--era-fill);\n\t--color-link: var(--color-link);\n\t--color-primary: var(--color-primary);\n\t--color-primary-fg: var(--color-primary-fg);\n\t--color-primary-hover: var(--color-primary-hover);\n\t--color-destructive: var(--color-destructive);\n\t--color-destructive-fg: var(--color-destructive-fg);\n\t--color-success: var(--color-success);\n\t--color-success-fg: var(--color-success-fg);\n\t--color-warning: var(--color-warning);\n\t--color-warning-fg: var(--color-warning-fg);\n}"
541
- },
542
- {
543
- "name": "glass-blur",
544
- "names": [
545
- "glass-blur"
546
- ],
547
- "file": "surfaces/glass.css",
548
- "useCase": "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.",
549
- "description": "Tailwind v4 cannot resolve var() inside backdrop-blur-[], so the filter\nis a registered utility, gated to glass subtrees.",
550
- "css": "@utility glass-blur {\n\t[data-surface='glass'] & {\n\t\tbackdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));\n\t\t-webkit-backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));\n\t}\n}"
551
551
  }
552
552
  ]
553
553
  }
@@ -58,6 +58,7 @@ source uses it where a name exists.
58
58
  | `era-ink-center` | on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim. |
59
59
  | `era-token-ink` | the ink centring for a token pill — a badge, a KV value, any short caps-or-digits label in a fixed-height box, CENTRED horizontally and with no icon sibling. For a left-aligned sentence-case label use era-label-ink; when an icon really must sit beside the text, see the note there. |
60
60
  | `era-label-ink` | the ink centring for a fixed-height control holding ONE line of sentence-case text and no icon — a menu item, a nav trigger, a button label. Never alongside `truncate` (the trimmed box becomes the clip). |
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. |
61
62
  | `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. |
62
63
  | `era-collapse` | the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden). |
63
64
  | `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-*). |
@@ -82,7 +83,6 @@ source uses it where a name exists.
82
83
  | `ease-base` | — |
83
84
  | `bg-divider` `text-divider` `border-divider` `bg-divider-faded` `text-divider-faded` `border-divider-faded` `bg-background` `text-background` `border-background` `bg-foreground` `text-foreground` `border-foreground` `bg-1` `text-1` `border-1` `bg-2` `text-2` `border-2` `bg-3` `text-3` `border-3` `bg-4` `text-4` `border-4` `bg-5` `text-5` `border-5` `bg-6` `text-6` `border-6` `bg-7` `text-7` `border-7` `bg-8` `text-8` `border-8` `bg-9` `text-9` `border-9` `bg-10` `text-10` `border-10` `bg-11` `text-11` `border-11` `bg-12` `text-12` `border-12` `bg-border` `text-border` `border-border` `bg-surface` `text-surface` `border-surface` `bg-hover` `text-hover` `border-hover` `bg-fg` `text-fg` `border-fg` `bg-bright` `text-bright` `border-bright` `bg-muted` `text-muted` `border-muted` | — |
84
85
  | `bg-fill` `text-fill` `border-fill` `bg-link` `text-link` `border-link` `bg-primary` `text-primary` `border-primary` `bg-primary-fg` `text-primary-fg` `border-primary-fg` `bg-primary-hover` `text-primary-hover` `border-primary-hover` `bg-destructive` `text-destructive` `border-destructive` `bg-destructive-fg` `text-destructive-fg` `border-destructive-fg` `bg-success` `text-success` `border-success` `bg-success-fg` `text-success-fg` `border-success-fg` `bg-warning` `text-warning` `border-warning` `bg-warning-fg` `text-warning-fg` `border-warning-fg` | — |
85
- | `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. |
86
86
 
87
87
  ## era-interactive
88
88
 
@@ -380,6 +380,35 @@ Declared in `index.css`.
380
380
  }
381
381
  ```
382
382
 
383
+ ## glass-blur
384
+
385
+ **Use it for:** 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.
386
+
387
+ Tailwind v4 cannot resolve var() inside backdrop-blur-[], so the filter
388
+ is a registered utility, gated to glass subtrees.
389
+
390
+ It lives HERE rather than in surfaces/glass.css, where a surface's own
391
+ chrome would naturally sit, because glass.css is imported into a cascade
392
+ layer and `@utility` cannot be nested inside one. Surface-scoped RULES stay
393
+ in their surface file; surface-scoped UTILITIES have to come out.
394
+
395
+ Declared in `index.css`.
396
+
397
+ ```css
398
+ @utility` cannot be nested inside one. Surface-scoped RULES stay
399
+ * in their surface file; surface-scoped UTILITIES have to come out.
400
+ *
401
+ * @use the backdrop blur for a floating panel (popover, dialog, taskbar) — it
402
+ * applies only inside a data-surface="glass" subtree and is inert elsewhere,
403
+ * so it is safe to leave on a panel that renders under every surface. */
404
+ @utility glass-blur {
405
+ [data-surface='glass'] & {
406
+ backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));
407
+ -webkit-backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));
408
+ }
409
+ }
410
+ ```
411
+
383
412
  ## era-shimmer
384
413
 
385
414
  **Use it for:** the in-progress text treatment — put it on a "working…" / "thinking…" label while a task streams, instead of a spinner beside the text.
@@ -902,21 +931,3 @@ Declared in `index.css`.
902
931
  --color-warning-fg: var(--color-warning-fg);
903
932
  }
904
933
  ```
905
-
906
- ## glass-blur
907
-
908
- **Use it for:** 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.
909
-
910
- Tailwind v4 cannot resolve var() inside backdrop-blur-[], so the filter
911
- is a registered utility, gated to glass subtrees.
912
-
913
- Declared in `surfaces/glass.css`.
914
-
915
- ```css
916
- @utility glass-blur {
917
- [data-surface='glass'] & {
918
- backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));
919
- -webkit-backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));
920
- }
921
- }
922
- ```
@@ -2,7 +2,6 @@ export { PaneManager, getPaneManager, tryGetPaneManager, setPaneManagerContext,
2
2
  export { persistWorkspace, loadWorkspace, saveWorkspace, clearWorkspace, WORKSPACE_STORAGE_KEY } from './workspace-storage.svelte.js';
3
3
  export { type SnapZone, type Workspace } from './pane-manager.svelte.js';
4
4
  export { NotificationService, getNotifications, setNotificationContext, type AppNotification, type NotifyOptions, type NotificationAction, type NotificationTone } from './notifications.svelte.js';
5
- export { LAYER } from './layers.js';
6
5
  export { default as Desktop } from './desktop.svelte';
7
6
  export { default as Pane } from './pane.svelte';
8
7
  export { default as Taskbar } from './taskbar.svelte';
package/dist/os/index.js CHANGED
@@ -6,7 +6,6 @@ export { PaneManager, getPaneManager, tryGetPaneManager, setPaneManagerContext,
6
6
  export { persistWorkspace, loadWorkspace, saveWorkspace, clearWorkspace, WORKSPACE_STORAGE_KEY } from './workspace-storage.svelte.js';
7
7
  export {} from './pane-manager.svelte.js';
8
8
  export { NotificationService, getNotifications, setNotificationContext } from './notifications.svelte.js';
9
- export { LAYER } from './layers.js';
10
9
  export { default as Desktop } from './desktop.svelte';
11
10
  export { default as Pane } from './pane.svelte';
12
11
  export { default as Taskbar } from './taskbar.svelte';
@@ -6,7 +6,6 @@
6
6
  import { cn } from '../utils/index.js';
7
7
  import { getNotifications, type AppNotification } from './notifications.svelte.js';
8
8
  import { getPaneManager } from './pane-manager.svelte.js';
9
- import { LAYER } from './layers.js';
10
9
 
11
10
  let { open = $bindable(false) }: { open?: boolean } = $props();
12
11
  const notif = getNotifications();
@@ -34,7 +33,7 @@
34
33
  </script>
35
34
 
36
35
  {#if open}
37
- <div class={cn('absolute inset-0', LAYER.notificationCenter)}>
36
+ <div class={cn('absolute inset-0 z-drawer')}>
38
37
  <!-- Click-away scrim (transparent) -->
39
38
  <button
40
39
  class="absolute inset-0 cursor-default"
@@ -11,7 +11,6 @@
11
11
  import { cn } from '../utils/index.js';
12
12
  import { getPaneManager } from './pane-manager.svelte.js';
13
13
  import { getNotifications } from './notifications.svelte.js';
14
- import { LAYER } from './layers.js';
15
14
 
16
15
  let {
17
16
  position = 'bottom',
@@ -209,7 +208,7 @@
209
208
  'inset-x-0 border-divider-faded',
210
209
  position === 'top' ? 'top-0 rounded-b-bar border-b' : 'bottom-0 rounded-t-bar border-t'
211
210
  ),
212
- LAYER.taskbar,
211
+ 'z-chrome',
213
212
  className
214
213
  )}
215
214
  {...restProps}
@@ -332,7 +331,7 @@
332
331
  data-mode="touch"
333
332
  class={cn(
334
333
  'absolute right-gutter bottom-[max(var(--era-gap),env(safe-area-inset-bottom))] sm:hidden',
335
- LAYER.taskbar
334
+ 'z-chrome'
336
335
  )}
337
336
  >
338
337
  <!-- A STANDARD era Button, just floated: era corners (rd-xs at this tier) and
@@ -3,21 +3,20 @@
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
4
  import { cn } from '../utils/index.js';
5
5
  import { getNotifications } from './notifications.svelte.js';
6
- import { LAYER } from './layers.js';
7
6
  import Toast from './toast.svelte';
8
7
 
9
8
  let { class: className, ...restProps }: HTMLAttributes<HTMLDivElement> = $props();
10
9
  const notif = getNotifications();
11
10
  </script>
12
11
 
13
- <!-- Toast stack, above the taskbar and above bits-ui overlays (LAYER.toast).
12
+ <!-- Toast stack, above the taskbar and above bits-ui overlays (z-toast).
14
13
  flex-col-reverse: the newest toast (index 0) sits at the bottom, nearest the
15
14
  tray it came from. pointer-events-none on the column so gaps don't block the
16
15
  desktop; each toast re-enables its own. -->
17
16
  <div
18
17
  class={cn(
19
18
  'pointer-events-none absolute right-card bottom-(--era-h-bar) flex flex-col-reverse gap-inset-chip',
20
- LAYER.toast,
19
+ 'z-toast',
21
20
  className
22
21
  )}
23
22
  {...restProps}