@signal9/era-ui 12.1.2 → 14.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 (138) hide show
  1. package/dist/dev/audit-overlay.svelte +1 -1
  2. package/dist/docs/component-docs-core.js +2 -2
  3. package/dist/docs/consumer-import.d.ts +37 -0
  4. package/dist/docs/consumer-import.js +42 -0
  5. package/dist/docs/css-utilities.js +17 -1
  6. package/dist/docs/notes.md +12 -11
  7. package/dist/era-ui.css +1 -1
  8. package/dist/generated-docs/accordion.md +1 -1
  9. package/dist/generated-docs/alert-dialog.md +1 -1
  10. package/dist/generated-docs/avatar.md +1 -1
  11. package/dist/generated-docs/badge.md +3 -0
  12. package/dist/generated-docs/button.md +4 -0
  13. package/dist/generated-docs/calendar.md +1 -1
  14. package/dist/generated-docs/checkbox.md +1 -1
  15. package/dist/generated-docs/chip.md +3 -0
  16. package/dist/generated-docs/collapsible.md +1 -1
  17. package/dist/generated-docs/combobox.md +1 -1
  18. package/dist/generated-docs/command.md +1 -1
  19. package/dist/generated-docs/context-menu.md +1 -1
  20. package/dist/generated-docs/date-field.md +1 -1
  21. package/dist/generated-docs/date-picker.md +1 -1
  22. package/dist/generated-docs/date-range-field.md +1 -1
  23. package/dist/generated-docs/date-range-picker.md +1 -1
  24. package/dist/generated-docs/dialog.md +1 -1
  25. package/dist/generated-docs/dropdown-menu.md +1 -1
  26. package/dist/generated-docs/link-preview.md +1 -1
  27. package/dist/generated-docs/llms-full.txt +101 -68
  28. package/dist/generated-docs/llms.txt +1 -1
  29. package/dist/generated-docs/manifest.json +24 -24
  30. package/dist/generated-docs/menu.md +1 -1
  31. package/dist/generated-docs/menubar.md +1 -1
  32. package/dist/generated-docs/navigation-menu.md +1 -1
  33. package/dist/generated-docs/notes.md +12 -11
  34. package/dist/generated-docs/pagination.md +1 -1
  35. package/dist/generated-docs/pin-input.md +1 -1
  36. package/dist/generated-docs/popover.md +1 -1
  37. package/dist/generated-docs/radio-group.md +1 -1
  38. package/dist/generated-docs/range-calendar.md +1 -1
  39. package/dist/generated-docs/rating-group.md +1 -1
  40. package/dist/generated-docs/scroll-area.md +1 -1
  41. package/dist/generated-docs/select.md +1 -1
  42. package/dist/generated-docs/sheet.md +1 -1
  43. package/dist/generated-docs/slider.md +1 -1
  44. package/dist/generated-docs/step.md +1 -1
  45. package/dist/generated-docs/table.md +1 -1
  46. package/dist/generated-docs/tabs.md +1 -1
  47. package/dist/generated-docs/time-field.md +1 -1
  48. package/dist/generated-docs/time-range-field.md +1 -1
  49. package/dist/generated-docs/toggle-group.md +1 -1
  50. package/dist/generated-docs/toolbar.md +1 -1
  51. package/dist/generated-docs/tooltip.md +1 -1
  52. package/dist/generated-docs/utilities.json +10 -10
  53. package/dist/generated-docs/utilities.md +41 -19
  54. package/dist/os/index.d.ts +0 -1
  55. package/dist/os/index.js +0 -1
  56. package/dist/os/notification-center.svelte +1 -2
  57. package/dist/os/taskbar.svelte +2 -3
  58. package/dist/os/toaster.svelte +2 -3
  59. package/dist/styles/index.css +77 -12
  60. package/dist/styles/layers.css +48 -0
  61. package/dist/styles/surfaces/base.css +4 -2
  62. package/dist/styles/surfaces/glass.css +0 -13
  63. package/dist/theme/index.d.ts +87 -0
  64. package/dist/theme/index.js +86 -0
  65. package/dist/ui/alert-dialog/alert-dialog-content.svelte +2 -2
  66. package/dist/ui/alert-dialog/alert-dialog-overlay.svelte +1 -1
  67. package/dist/ui/badge/badge.svelte +14 -1
  68. package/dist/ui/badge/badge.svelte.d.ts +4 -0
  69. package/dist/ui/button/button.svelte +37 -7
  70. package/dist/ui/button/button.svelte.d.ts +6 -0
  71. package/dist/ui/chip/chip.svelte +14 -1
  72. package/dist/ui/chip/chip.svelte.d.ts +4 -0
  73. package/dist/ui/combobox/combobox-content.svelte +1 -1
  74. package/dist/ui/command-bar/command-bar.svelte +1 -1
  75. package/dist/ui/context-menu/context-menu-content.svelte +1 -1
  76. package/dist/ui/context-menu/context-menu-sub-content.svelte +1 -1
  77. package/dist/ui/date-picker/date-picker-content.svelte +1 -1
  78. package/dist/ui/date-range-picker/date-range-picker-content.svelte +1 -1
  79. package/dist/ui/dialog/dialog-content.svelte +1 -1
  80. package/dist/ui/dialog/dialog-overlay.svelte +5 -1
  81. package/dist/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
  82. package/dist/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  83. package/dist/ui/link-preview/link-preview-content.svelte +1 -1
  84. package/dist/ui/menubar/menubar-content.svelte +1 -1
  85. package/dist/ui/menubar/menubar-sub-content.svelte +1 -1
  86. package/dist/ui/pin-input/index.d.ts +1 -0
  87. package/dist/ui/pin-input/index.js +10 -0
  88. package/dist/ui/popover/popover-content.svelte +1 -1
  89. package/dist/ui/select/select-content.svelte +1 -1
  90. package/dist/ui/sheet/sheet-content.svelte +1 -1
  91. package/dist/ui/sheet/sheet-content.svelte.d.ts +1 -1
  92. package/dist/ui/tooltip/tooltip-content.svelte +1 -1
  93. package/package.json +9 -12
  94. package/dist/apps/index.d.ts +0 -20
  95. package/dist/apps/index.js +0 -20
  96. package/dist/apps/llm-shell/index.d.ts +0 -2
  97. package/dist/apps/llm-shell/index.js +0 -1
  98. package/dist/apps/llm-shell/llm-shell.svelte +0 -334
  99. package/dist/apps/llm-shell/llm-shell.svelte.d.ts +0 -57
  100. package/dist/apps/llm-shell/llm-swarm.svelte +0 -79
  101. package/dist/apps/llm-shell/llm-swarm.svelte.d.ts +0 -25
  102. package/dist/apps/llm-shell/types.d.ts +0 -103
  103. package/dist/apps/llm-shell/types.js +0 -1
  104. package/dist/apps/notes/editor/bubble-menu.svelte.d.ts +0 -11
  105. package/dist/apps/notes/editor/bubble-menu.svelte.js +0 -165
  106. package/dist/apps/notes/editor/bubble-toolbar.svelte +0 -55
  107. package/dist/apps/notes/editor/bubble-toolbar.svelte.d.ts +0 -22
  108. package/dist/apps/notes/editor/extensions.d.ts +0 -18
  109. package/dist/apps/notes/editor/extensions.js +0 -88
  110. package/dist/apps/notes/editor/floating.d.ts +0 -25
  111. package/dist/apps/notes/editor/floating.js +0 -54
  112. package/dist/apps/notes/editor/link.d.ts +0 -9
  113. package/dist/apps/notes/editor/link.js +0 -22
  114. package/dist/apps/notes/editor/list-cleanup-rule.d.ts +0 -14
  115. package/dist/apps/notes/editor/list-cleanup-rule.js +0 -47
  116. package/dist/apps/notes/editor/slash-command.svelte.d.ts +0 -22
  117. package/dist/apps/notes/editor/slash-command.svelte.js +0 -215
  118. package/dist/apps/notes/editor/slash-menu.svelte +0 -82
  119. package/dist/apps/notes/editor/slash-menu.svelte.d.ts +0 -23
  120. package/dist/apps/notes/index.d.ts +0 -11
  121. package/dist/apps/notes/index.js +0 -13
  122. package/dist/apps/notes/markdown.d.ts +0 -12
  123. package/dist/apps/notes/markdown.js +0 -165
  124. package/dist/apps/notes/note-editor.svelte +0 -176
  125. package/dist/apps/notes/note-editor.svelte.d.ts +0 -36
  126. package/dist/apps/notes/notes-store.svelte.d.ts +0 -64
  127. package/dist/apps/notes/notes-store.svelte.js +0 -234
  128. package/dist/apps/notes/notes.svelte +0 -501
  129. package/dist/apps/notes/notes.svelte.d.ts +0 -53
  130. package/dist/apps/notes/tree.d.ts +0 -70
  131. package/dist/apps/notes/tree.js +0 -185
  132. package/dist/apps/notes/types.d.ts +0 -49
  133. package/dist/apps/notes/types.js +0 -11
  134. package/dist/docs/package-name.d.ts +0 -18
  135. package/dist/docs/package-name.js +0 -18
  136. package/dist/docs/quickstart.md +0 -43
  137. package/dist/os/layers.d.ts +0 -23
  138. package/dist/os/layers.js +0 -23
@@ -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": 10647,
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",
@@ -468,7 +468,7 @@
468
468
  "slug": "step",
469
469
  "title": "Step",
470
470
  "summary": "Expandable inline step — tool calls, thinking, agent actions.",
471
- "tokenEstimate": 315,
471
+ "tokenEstimate": 316,
472
472
  "sections": [
473
473
  "Import",
474
474
  "Step.Root",
@@ -543,7 +543,7 @@
543
543
  "slug": "date-range-field",
544
544
  "title": "Date Range Field",
545
545
  "summary": "Segmented start/end date input.",
546
- "tokenEstimate": 297,
546
+ "tokenEstimate": 298,
547
547
  "sections": [
548
548
  "Import",
549
549
  "DateRangeField.Root",
@@ -693,7 +693,7 @@
693
693
  "slug": "menu",
694
694
  "title": "Menu",
695
695
  "summary": "Headless menu primitives re-exported from bits-ui.",
696
- "tokenEstimate": 49,
696
+ "tokenEstimate": 50,
697
697
  "sections": [
698
698
  "Import"
699
699
  ],
@@ -755,7 +755,7 @@
755
755
  "slug": "pagination",
756
756
  "title": "Pagination",
757
757
  "summary": "Enables users to navigate through a series of pages.",
758
- "tokenEstimate": 373,
758
+ "tokenEstimate": 374,
759
759
  "sections": [
760
760
  "Import",
761
761
  "Pagination.Root",
@@ -871,7 +871,7 @@
871
871
  "slug": "table",
872
872
  "title": "Table",
873
873
  "summary": "A tabular data display with rows, headers, and cells.",
874
- "tokenEstimate": 732,
874
+ "tokenEstimate": 733,
875
875
  "sections": [
876
876
  "Import",
877
877
  "Table.Root",
@@ -917,7 +917,7 @@
917
917
  "slug": "time-range-field",
918
918
  "title": "Time Range Field",
919
919
  "summary": "Segmented start/end time input.",
920
- "tokenEstimate": 297,
920
+ "tokenEstimate": 298,
921
921
  "sections": [
922
922
  "Import",
923
923
  "TimeRangeField.Root",
@@ -943,7 +943,7 @@
943
943
  "slug": "toolbar",
944
944
  "title": "Toolbar",
945
945
  "summary": "Headless toolbar primitives re-exported from bits-ui.",
946
- "tokenEstimate": 52,
946
+ "tokenEstimate": 53,
947
947
  "sections": [
948
948
  "Import"
949
949
  ],
@@ -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
  }
@@ -5,7 +5,7 @@ Headless menu primitives re-exported from bits-ui.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Menu } from "@signal9/era-ui/menu";
8
+ import * as Menu from "@signal9/era-ui/menu";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ A horizontal bar of dropdown menus.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Menubar } from "@signal9/era-ui/menubar";
8
+ import * as Menubar from "@signal9/era-ui/menubar";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Headless navigation-menu primitives re-exported from bits-ui.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { NavigationMenu } from "@signal9/era-ui/navigation-menu";
8
+ import * as NavigationMenu from "@signal9/era-ui/navigation-menu";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -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: {
@@ -5,7 +5,7 @@ Enables users to navigate through a series of pages.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Pagination } from "@signal9/era-ui/pagination";
8
+ import * as Pagination from "@signal9/era-ui/pagination";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Enables users to input a sequence of one-character inputs.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { PinInput } from "@signal9/era-ui/pin-input";
8
+ import * as PinInput from "@signal9/era-ui/pin-input";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ A floating panel anchored to a trigger.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Popover } from "@signal9/era-ui/popover";
8
+ import * as Popover from "@signal9/era-ui/popover";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Groups radio items for single selection.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { RadioGroup } from "@signal9/era-ui/radio-group";
8
+ import * as RadioGroup from "@signal9/era-ui/radio-group";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Headless range-calendar primitives re-exported from bits-ui.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { RangeCalendar } from "@signal9/era-ui/range-calendar";
8
+ import * as RangeCalendar from "@signal9/era-ui/range-calendar";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ A star-style single-choice rating input.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { RatingGroup } from "@signal9/era-ui/rating-group";
8
+ import * as RatingGroup from "@signal9/era-ui/rating-group";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ A cross-platform scroll container.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { ScrollArea } from "@signal9/era-ui/scroll-area";
8
+ import * as ScrollArea from "@signal9/era-ui/scroll-area";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ A dropdown select menu.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Select } from "@signal9/era-ui/select";
8
+ import * as Select from "@signal9/era-ui/select";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ A dialog anchored to a screen edge — a mobile drawer.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Sheet } from "@signal9/era-ui/sheet";
8
+ import * as Sheet from "@signal9/era-ui/sheet";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Enables value selection from a continuous range.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Slider } from "@signal9/era-ui/slider";
8
+ import * as Slider from "@signal9/era-ui/slider";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Expandable inline step — tool calls, thinking, agent actions.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Step } from "@signal9/era-ui/step";
8
+ import * as Step from "@signal9/era-ui/step";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ A tabular data display with rows, headers, and cells.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Table } from "@signal9/era-ui/table";
8
+ import * as Table from "@signal9/era-ui/table";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Organizes content into tabbed sections.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Tabs } from "@signal9/era-ui/tabs";
8
+ import * as Tabs from "@signal9/era-ui/tabs";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Segmented time input with keyboard navigation.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { TimeField } from "@signal9/era-ui/time-field";
8
+ import * as TimeField from "@signal9/era-ui/time-field";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Segmented start/end time input.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { TimeRangeField } from "@signal9/era-ui/time-range-field";
8
+ import * as TimeRangeField from "@signal9/era-ui/time-range-field";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ A set of toggle buttons with single or multiple selection.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { ToggleGroup } from "@signal9/era-ui/toggle-group";
8
+ import * as ToggleGroup from "@signal9/era-ui/toggle-group";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Headless toolbar primitives re-exported from bits-ui.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Toolbar } from "@signal9/era-ui/toolbar";
8
+ import * as Toolbar from "@signal9/era-ui/toolbar";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -5,7 +5,7 @@ Supplementary info on hover or focus.
5
5
  ## Import
6
6
 
7
7
  ```ts
8
- import { Tooltip } from "@signal9/era-ui/tooltip";
8
+ import * as Tooltip from "@signal9/era-ui/tooltip";
9
9
  ```
10
10
 
11
11
  Composed from sub-components — compose explicitly at the call site:
@@ -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
  }
@@ -33,6 +33,17 @@ motion):
33
33
  | `text-body` | density-derived body/control text size |
34
34
  | `p-gutter` / `gap-gutter` / `mt-gutter` / … | the spacing scale — EVERY spacing prefix works |
35
35
 
36
+ THE SPACING NAMES IN SIZE ORDER, smallest first, because the names do not
37
+ imply it and guessing gets it backwards:
38
+
39
+ gutter < panel < field < card < content
40
+
41
+ Measured at `data-mode="balanced"`: gutter 5px, field ~9px, card ~11px,
42
+ content ~22px. `gutter` is the TIGHT one — the gap between sibling controls
43
+ and a rail's own padding. `field` is a text input's side padding, not the
44
+ label-to-input gap. Reading them the other way round produces a layout whose
45
+ hierarchy is inverted and therefore reads flat.
46
+
36
47
  The spacing names (`gutter`, `card`, `panel`, `content`, `menu`, `field`, the
37
48
  `inset-*` and concentric `*-inset-*` insets, `glyph-*`) are registered as a
38
49
  Tailwind spacing scale, so every prefix derives automatically: `p-`, `px-`,
@@ -58,6 +69,7 @@ source uses it where a name exists.
58
69
  | `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
70
  | `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
71
  | `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). |
72
+ | `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
73
  | `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
74
  | `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
75
  | `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 +94,6 @@ source uses it where a name exists.
82
94
  | `ease-base` | — |
83
95
  | `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
96
  | `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
97
 
87
98
  ## era-interactive
88
99
 
@@ -380,6 +391,35 @@ Declared in `index.css`.
380
391
  }
381
392
  ```
382
393
 
394
+ ## glass-blur
395
+
396
+ **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.
397
+
398
+ Tailwind v4 cannot resolve var() inside backdrop-blur-[], so the filter
399
+ is a registered utility, gated to glass subtrees.
400
+
401
+ It lives HERE rather than in surfaces/glass.css, where a surface's own
402
+ chrome would naturally sit, because glass.css is imported into a cascade
403
+ layer and `@utility` cannot be nested inside one. Surface-scoped RULES stay
404
+ in their surface file; surface-scoped UTILITIES have to come out.
405
+
406
+ Declared in `index.css`.
407
+
408
+ ```css
409
+ @utility` cannot be nested inside one. Surface-scoped RULES stay
410
+ * in their surface file; surface-scoped UTILITIES have to come out.
411
+ *
412
+ * @use the backdrop blur for a floating panel (popover, dialog, taskbar) — it
413
+ * applies only inside a data-surface="glass" subtree and is inert elsewhere,
414
+ * so it is safe to leave on a panel that renders under every surface. */
415
+ @utility glass-blur {
416
+ [data-surface='glass'] & {
417
+ backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));
418
+ -webkit-backdrop-filter: blur(var(--era-blur)) saturate(var(--era-saturate));
419
+ }
420
+ }
421
+ ```
422
+
383
423
  ## era-shimmer
384
424
 
385
425
  **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 +942,3 @@ Declared in `index.css`.
902
942
  --color-warning-fg: var(--color-warning-fg);
903
943
  }
904
944
  ```
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}