@signal9/era-ui 7.0.0 → 9.0.0

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