@signal9/era-ui 10.0.0 → 11.0.0

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