@signal9/era-ui 10.1.0 → 12.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 (250) 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/inline-citation/inline-citation.svelte +5 -5
  23. package/dist/ai/loader.svelte +1 -4
  24. package/dist/ai/message/message-branch-selector.svelte +3 -3
  25. package/dist/ai/message/message-branch.svelte +1 -1
  26. package/dist/ai/message/message-content.svelte +1 -1
  27. package/dist/ai/message/message-toolbar.svelte +1 -1
  28. package/dist/ai/message/message-usage.svelte +5 -7
  29. package/dist/ai/message/message.svelte +1 -1
  30. package/dist/ai/model-selector/model-selector.svelte +2 -2
  31. package/dist/ai/open-in-chat/open-in-chat.svelte +2 -2
  32. package/dist/ai/plan/plan-content.svelte +1 -1
  33. package/dist/ai/plan/plan-header.svelte +2 -2
  34. package/dist/ai/plan/plan.svelte +1 -4
  35. package/dist/ai/prompt-input/prompt-input-add-attachments.svelte +1 -1
  36. package/dist/ai/prompt-input/prompt-input-attachments.svelte +5 -5
  37. package/dist/ai/prompt-input/prompt-input-submit.svelte +2 -2
  38. package/dist/ai/prompt-input/prompt-input-textarea.svelte +2 -2
  39. package/dist/ai/prompt-input/prompt-input-toolbar.svelte +1 -1
  40. package/dist/ai/prompt-input/prompt-input.svelte +1 -1
  41. package/dist/ai/queue/queue-item.svelte +1 -1
  42. package/dist/ai/queue/queue.svelte +1 -1
  43. package/dist/ai/reasoning/reasoning-trigger.svelte +1 -1
  44. package/dist/ai/response/response.svelte +1 -1
  45. package/dist/ai/run-status/run-status.svelte +5 -10
  46. package/dist/ai/runtime-feed/runtime-feed-item.svelte +1 -4
  47. package/dist/ai/runtime-feed/runtime-feed-root.svelte +1 -1
  48. package/dist/ai/sources/source.svelte +2 -2
  49. package/dist/ai/sources/sources-trigger.svelte +1 -1
  50. package/dist/ai/structured-value/structured-value.svelte +4 -4
  51. package/dist/ai/suggestion/suggestion.svelte +1 -1
  52. package/dist/ai/suggestion/suggestions.svelte +1 -1
  53. package/dist/ai/swarm/swarm-agent.svelte +3 -3
  54. package/dist/ai/swarm/swarm-artifact.svelte +2 -2
  55. package/dist/ai/swarm/swarm-barrier.svelte +3 -3
  56. package/dist/ai/swarm/swarm-barriers.svelte +1 -4
  57. package/dist/ai/swarm/swarm-counts.svelte +2 -2
  58. package/dist/ai/swarm/swarm-footer.svelte +2 -2
  59. package/dist/ai/swarm/swarm-grid.svelte +2 -2
  60. package/dist/ai/swarm/swarm-header.svelte +2 -2
  61. package/dist/ai/swarm/swarm-node.svelte +7 -9
  62. package/dist/ai/swarm/swarm-role.svelte +2 -2
  63. package/dist/ai/swarm/swarm-root.svelte +1 -4
  64. package/dist/ai/swarm/swarm-sandbox.svelte +4 -7
  65. package/dist/ai/swarm/swarm-tree.svelte +2 -2
  66. package/dist/ai/task/task-content.svelte +1 -4
  67. package/dist/ai/task/task-trigger.svelte +1 -1
  68. package/dist/ai/tool/tool-chip.svelte +3 -3
  69. package/dist/ai/tool/tool-chips.svelte +3 -3
  70. package/dist/ai/tool/tool-exec.svelte +4 -4
  71. package/dist/ai/tool/tool-header.svelte +1 -1
  72. package/dist/ai/web-preview/web-preview.svelte +4 -9
  73. package/dist/ai/workflow/canvas.svelte +1 -1
  74. package/dist/ai/workflow/node.svelte +3 -3
  75. package/dist/apps/llm-shell/llm-shell.svelte +4 -4
  76. package/dist/apps/notes/notes.svelte +8 -8
  77. package/dist/dev/audit/audits/even-container-padding.js +2 -2
  78. package/dist/dev/audit/audits/single-glyph-square.js +2 -2
  79. package/dist/dev/audit-overlay.svelte +7 -7
  80. package/dist/docs/css-utilities.d.ts +31 -0
  81. package/dist/docs/css-utilities.js +141 -7
  82. package/dist/docs/quickstart.md +5 -5
  83. package/dist/era-ui.css +1 -1
  84. package/dist/generated-docs/llms-full.txt +359 -94
  85. package/dist/generated-docs/llms.txt +18 -7
  86. package/dist/generated-docs/manifest.json +355 -49
  87. package/dist/generated-docs/utilities.json +336 -41
  88. package/dist/generated-docs/utilities.md +341 -87
  89. package/dist/os/notification-center.svelte +11 -17
  90. package/dist/os/pane-manager.svelte.d.ts +1 -1
  91. package/dist/os/pane.svelte +4 -6
  92. package/dist/os/taskbar.svelte +13 -18
  93. package/dist/os/toast.svelte +6 -11
  94. package/dist/os/toaster.svelte +1 -1
  95. package/dist/styles/density.css +0 -2
  96. package/dist/styles/index.css +117 -79
  97. package/dist/styles/themes.css +49 -42
  98. package/dist/ui/accordion/accordion-content.svelte +1 -1
  99. package/dist/ui/accordion/accordion-trigger.svelte +2 -2
  100. package/dist/ui/alert-dialog/alert-dialog-content.svelte +2 -2
  101. package/dist/ui/alert-dialog/alert-dialog-overlay.svelte +1 -1
  102. package/dist/ui/aspect-ratio/aspect-ratio.svelte +1 -5
  103. package/dist/ui/avatar/avatar-fallback.svelte +1 -1
  104. package/dist/ui/avatar/avatar-root.svelte +1 -1
  105. package/dist/ui/badge/badge.svelte +1 -1
  106. package/dist/ui/badge/badge.svelte.d.ts +1 -1
  107. package/dist/ui/bar/bar.svelte +7 -7
  108. package/dist/ui/bar/bar.svelte.d.ts +15 -15
  109. package/dist/ui/button/button.svelte +1 -1
  110. package/dist/ui/button/variants.d.ts +4 -4
  111. package/dist/ui/button/variants.js +18 -18
  112. package/dist/ui/button-group/button-group.svelte +2 -2
  113. package/dist/ui/calendar/calendar-day.svelte +1 -1
  114. package/dist/ui/calendar/calendar-grid-row.svelte +1 -1
  115. package/dist/ui/calendar/calendar-grid.svelte +1 -1
  116. package/dist/ui/calendar/calendar-head-cell.svelte +1 -1
  117. package/dist/ui/calendar/calendar-header.svelte +1 -1
  118. package/dist/ui/calendar/calendar-next-button.svelte +1 -1
  119. package/dist/ui/calendar/calendar-prev-button.svelte +1 -1
  120. package/dist/ui/calendar/calendar-root.svelte +1 -1
  121. package/dist/ui/card/card.svelte +10 -10
  122. package/dist/ui/card/card.svelte.d.ts +16 -16
  123. package/dist/ui/checkbox/checkbox-group.svelte +1 -1
  124. package/dist/ui/checkbox/checkbox.svelte +1 -1
  125. package/dist/ui/chip/chip.svelte +7 -9
  126. package/dist/ui/chip/chip.svelte.d.ts +7 -7
  127. package/dist/ui/code-block/code-block.svelte +3 -9
  128. package/dist/ui/collapsible/collapsible-trigger.svelte +1 -1
  129. package/dist/ui/combobox/combobox-content.svelte +1 -1
  130. package/dist/ui/combobox/combobox-empty.svelte +1 -6
  131. package/dist/ui/combobox/combobox-group-heading.svelte +1 -4
  132. package/dist/ui/combobox/combobox-input.svelte +1 -1
  133. package/dist/ui/combobox/combobox-item.svelte +1 -1
  134. package/dist/ui/combobox/combobox-trigger.svelte +2 -2
  135. package/dist/ui/command/command-group-heading.svelte +1 -4
  136. package/dist/ui/command/command-group-items.svelte +1 -5
  137. package/dist/ui/command/command-item.svelte +1 -1
  138. package/dist/ui/command/command-link-item.svelte +1 -1
  139. package/dist/ui/command/command-root.svelte +2 -2
  140. package/dist/ui/command/command-viewport.svelte +1 -1
  141. package/dist/ui/command-bar/command-bar.svelte +9 -13
  142. package/dist/ui/context-menu/context-menu-checkbox-item.svelte +1 -1
  143. package/dist/ui/context-menu/context-menu-content.svelte +2 -2
  144. package/dist/ui/context-menu/context-menu-group-heading.svelte +1 -4
  145. package/dist/ui/context-menu/context-menu-item.svelte +1 -1
  146. package/dist/ui/context-menu/context-menu-radio-item.svelte +1 -1
  147. package/dist/ui/context-menu/context-menu-sub-content.svelte +1 -1
  148. package/dist/ui/context-menu/context-menu-sub-trigger.svelte +2 -2
  149. package/dist/ui/copy-button/copy-button.svelte +2 -2
  150. package/dist/ui/cycle/cycle.svelte +2 -2
  151. package/dist/ui/date-field/date-field-segment.svelte +1 -1
  152. package/dist/ui/date-picker/date-picker-calendar.svelte +1 -1
  153. package/dist/ui/date-picker/date-picker-content.svelte +1 -4
  154. package/dist/ui/date-picker/date-picker-day.svelte +1 -1
  155. package/dist/ui/date-picker/date-picker-grid-row.svelte +1 -1
  156. package/dist/ui/date-picker/date-picker-grid.svelte +1 -1
  157. package/dist/ui/date-picker/date-picker-head-cell.svelte +1 -1
  158. package/dist/ui/date-picker/date-picker-header.svelte +1 -1
  159. package/dist/ui/date-picker/date-picker-next-button.svelte +1 -1
  160. package/dist/ui/date-picker/date-picker-prev-button.svelte +1 -1
  161. package/dist/ui/date-picker/date-picker-segment.svelte +1 -1
  162. package/dist/ui/date-picker/date-picker-trigger.svelte +2 -2
  163. package/dist/ui/date-range-field/date-range-field-segment.svelte +1 -1
  164. package/dist/ui/date-range-picker/date-range-picker-calendar.svelte +1 -1
  165. package/dist/ui/date-range-picker/date-range-picker-content.svelte +1 -4
  166. package/dist/ui/date-range-picker/date-range-picker-day.svelte +1 -1
  167. package/dist/ui/date-range-picker/date-range-picker-grid-row.svelte +1 -1
  168. package/dist/ui/date-range-picker/date-range-picker-grid.svelte +1 -5
  169. package/dist/ui/date-range-picker/date-range-picker-head-cell.svelte +1 -1
  170. package/dist/ui/date-range-picker/date-range-picker-header.svelte +1 -1
  171. package/dist/ui/date-range-picker/date-range-picker-next-button.svelte +1 -1
  172. package/dist/ui/date-range-picker/date-range-picker-prev-button.svelte +1 -1
  173. package/dist/ui/date-range-picker/date-range-picker-segment.svelte +1 -1
  174. package/dist/ui/date-range-picker/date-range-picker-trigger.svelte +2 -2
  175. package/dist/ui/dialog/dialog-content.svelte +3 -5
  176. package/dist/ui/dialog/dialog-header.svelte +1 -6
  177. package/dist/ui/dialog/dialog-overlay.svelte +1 -5
  178. package/dist/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -1
  179. package/dist/ui/dropdown-menu/dropdown-menu-content.svelte +2 -2
  180. package/dist/ui/dropdown-menu/dropdown-menu-group-heading.svelte +1 -4
  181. package/dist/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
  182. package/dist/ui/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  183. package/dist/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  184. package/dist/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -2
  185. package/dist/ui/dropdown-menu/dropdown-menu-trigger.svelte +2 -2
  186. package/dist/ui/file-upload/file-upload.svelte +2 -2
  187. package/dist/ui/input/input.svelte +2 -2
  188. package/dist/ui/input/textarea.svelte +1 -1
  189. package/dist/ui/input/variants.d.ts +18 -18
  190. package/dist/ui/input/variants.js +6 -6
  191. package/dist/ui/kv/kv.svelte +2 -3
  192. package/dist/ui/link-preview/link-preview-content.svelte +1 -1
  193. package/dist/ui/menubar/menubar-checkbox-item.svelte +1 -1
  194. package/dist/ui/menubar/menubar-content.svelte +2 -2
  195. package/dist/ui/menubar/menubar-group-heading.svelte +1 -4
  196. package/dist/ui/menubar/menubar-item.svelte +1 -1
  197. package/dist/ui/menubar/menubar-radio-item.svelte +1 -1
  198. package/dist/ui/menubar/menubar-root.svelte +1 -4
  199. package/dist/ui/menubar/menubar-sub-content.svelte +1 -1
  200. package/dist/ui/menubar/menubar-sub-trigger.svelte +2 -2
  201. package/dist/ui/menubar/menubar-trigger.svelte +1 -1
  202. package/dist/ui/meter/meter.svelte +2 -2
  203. package/dist/ui/pagination/pagination-next-button.svelte +1 -1
  204. package/dist/ui/pagination/pagination-prev-button.svelte +1 -1
  205. package/dist/ui/pagination/pagination-root.svelte +1 -1
  206. package/dist/ui/pane/pane-content.svelte +1 -1
  207. package/dist/ui/pane/pane-root.svelte +1 -1
  208. package/dist/ui/pane/pane-tab-list.svelte +1 -1
  209. package/dist/ui/pane/pane-tab-panel.svelte +1 -1
  210. package/dist/ui/pane/pane-tab.svelte +1 -1
  211. package/dist/ui/pane/pane.svelte +1 -1
  212. package/dist/ui/pin-input/pin-input-cell.svelte +1 -1
  213. package/dist/ui/popover/popover-content.svelte +1 -1
  214. package/dist/ui/popover/popover-trigger.svelte +1 -4
  215. package/dist/ui/progress/progress.svelte +2 -2
  216. package/dist/ui/radio-group/radio-group-item.svelte +2 -2
  217. package/dist/ui/radio-group/radio-group-root.svelte +1 -1
  218. package/dist/ui/rating-group/rating-group-item.svelte +1 -1
  219. package/dist/ui/rating-group/rating-group-root.svelte +1 -1
  220. package/dist/ui/scroll-area/scroll-area-scrollbar.svelte +1 -1
  221. package/dist/ui/scroll-area/scroll-area-thumb.svelte +1 -1
  222. package/dist/ui/scroll-area/scroll-area.svelte +1 -1
  223. package/dist/ui/select/select-content.svelte +7 -6
  224. package/dist/ui/select/select-group-heading.svelte +1 -4
  225. package/dist/ui/select/select-item.svelte +1 -1
  226. package/dist/ui/select/select-trigger.svelte +2 -2
  227. package/dist/ui/select/select-value.svelte +1 -1
  228. package/dist/ui/separator/separator.svelte +1 -1
  229. package/dist/ui/sheet/sheet-content.svelte +3 -3
  230. package/dist/ui/sheet/sheet-content.svelte.d.ts +4 -4
  231. package/dist/ui/skeleton/skeleton.svelte +4 -4
  232. package/dist/ui/skeleton/skeleton.svelte.d.ts +10 -10
  233. package/dist/ui/slider/slider-range.svelte +1 -1
  234. package/dist/ui/slider/slider-thumb.svelte +1 -1
  235. package/dist/ui/slider/slider-tick.svelte +1 -1
  236. package/dist/ui/step/step-content.svelte +1 -1
  237. package/dist/ui/step/step-section.svelte +1 -1
  238. package/dist/ui/step/step-summary.svelte +7 -7
  239. package/dist/ui/switch/switch.svelte +2 -2
  240. package/dist/ui/table/table-cell.svelte +1 -1
  241. package/dist/ui/table/table-head-cell.svelte +1 -1
  242. package/dist/ui/table/table-row.svelte +1 -1
  243. package/dist/ui/time-field/time-field-segment.svelte +1 -1
  244. package/dist/ui/time-range-field/time-range-field-segment.svelte +1 -1
  245. package/dist/ui/toggle-group/toggle-group-item.svelte +1 -1
  246. package/dist/ui/toggle-group/toggle-group-root.svelte +1 -1
  247. package/dist/ui/tooltip/tooltip-content.svelte +1 -1
  248. package/dist/ui/video-player/video-player.svelte +44 -47
  249. package/dist/utils/index.js +1 -1
  250. package/package.json +4 -3
@@ -23,7 +23,7 @@ motion):
23
23
 
24
24
  | Stock-looking class | What it resolves to |
25
25
  |---|---|
26
- | `rounded-icon/xxs/sm/md/lg` | the concentric radius ladder (collapses on `data-corners="square"`) |
26
+ | `rounded-icon/pill/chip/control/bar` | the concentric radius ladder (collapses on `data-corners="square"`) |
27
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 |
@@ -31,10 +31,21 @@ motion):
31
31
  | `transition-*` (bare) | duration + easing default to the motion axis |
32
32
  | `ease-base` / `duration-base` | the motion axis, named explicitly |
33
33
  | `text-body` | density-derived body/control text size |
34
-
35
- Deliberate gaps: `w-*`/`min-w-*` tier names would shadow Tailwind's container
36
- scale (`min-w-md` stays 28rem), and the concentric-inset tokens are advanced
37
- enough to stay var-form — `min-w-(--era-h-control)` etc. remain the escape hatch.
34
+ | `p-gutter` / `gap-gutter` / `mt-gutter` / … | the spacing scale — EVERY spacing prefix works |
35
+
36
+ The spacing names (`gutter`, `card`, `panel`, `content`, `menu`, `field`, the
37
+ `inset-*` and concentric `*-inset-*` insets, `glyph-*`) are registered as a
38
+ Tailwind spacing scale, so every prefix derives automatically: `p-`, `px-`,
39
+ `pt-`, `mt-`, `gap-`, `gap-x-`, `inset-`, `translate-`, and the rest. The TIER
40
+ names (`icon`, `pill`, `chip`, `control`, `bar`) are heights, not spacing, so
41
+ they are registered per prefix instead — `h-`, `w-`, `min-h-`, `min-w-` and
42
+ `size-` — and the two vocabularies deliberately share no word. Putting a tier
43
+ in the spacing scale would silently make `px-control` mean 24px of padding.
44
+
45
+ The var form (`h-(--era-h-control)`) still works and is the escape hatch for a
46
+ token with no registered name — `--era-sp`, the press-sink offsets, anything
47
+ a component reaches for once. `scripts/check-canonical.ts` fails the build if
48
+ source uses it where a name exists.
38
49
 
39
50
  | Utility | Use it for |
40
51
  |---|---|
@@ -51,15 +62,26 @@ enough to stay var-form — `min-w-(--era-h-control)` etc. remain the escape hat
51
62
  | `era-collapse` | the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden). |
52
63
  | `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-*). |
53
64
  | `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). |
65
+ | `w-icon` `w-pill` `w-chip` `w-control` `w-bar` | a tier-sized WIDTH — the horizontal twin of the h-* ladder, for a rail or a column measured in tiers rather than in content. |
66
+ | `min-w-icon` `min-w-pill` `min-w-chip` `min-w-control` `min-w-bar` | a minimum tier WIDTH — the floor that makes a single-glyph control render as a square rather than a skinny pill (min-w-control on an icon button, min-w-pill on a badge). These could not exist before the ladder was renamed: the old rungs were sm/md/lg, and Tailwind's container scale already owns min-w-md and min-w-lg, so the names collided and every call site had to write min-w-(--era-h-control) by hand. icon/pill/chip/control/bar collide with nothing. |
54
67
  | `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. |
55
- | `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). |
56
- | `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. |
57
- | `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). |
58
- | `px-field` | text-field side padding — where typed text starts in a control-tier input; the named form of px-(--era-field-px). |
59
- | `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. |
60
- | `p-content` | — |
61
- | `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. |
68
+ | `px-pill` `px-chip` `pl-pill` `pr-pill` `pl-chip` `pr-chip` | pill side padding — the wider-than-vertical horizontal breathing room badge/chip text wants (glyph-advance derived, ~2× the vertical inset). |
69
+ | `p-section` | padding for a content panel that sits UNDER a section header row — the even-padding exception, and the reason it is not called p-section: it deliberately under-pays the block start. For an evenly padded content panel use p-section, which is the plain token. |
62
70
  | `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". |
71
+ | `text-body` | — |
72
+ | `leading-body` | — |
73
+ | `rounded-icon` `rounded-pill` `rounded-chip` `rounded-control` `rounded-bar` `rounded-menu-item` | — |
74
+ | `shadow` | — |
75
+ | `shadow-sm` `shadow-lg` `shadow-well` `shadow-pressed` `shadow-highlight` | — |
76
+ | `bg-well` `text-well` `border-well` `bg-elevated` `text-elevated` `border-elevated` `bg-highlight` `text-highlight` `border-highlight` `bg-overlay` `text-overlay` `border-overlay` | — |
77
+ | `p-gutter` `px-gutter` `py-gutter` `gap-gutter` `p-panel` `px-panel` `py-panel` `gap-panel` `p-card` `px-card` `py-card` `gap-card` `p-content` `px-content` `py-content` `gap-content` `p-menu` `px-menu` `py-menu` `gap-menu` `p-field` `px-field` `py-field` `gap-field` | — |
78
+ | `p-inset-pill` `px-inset-pill` `py-inset-pill` `gap-inset-pill` `p-inset-chip` `px-inset-chip` `py-inset-chip` `gap-inset-chip` `p-inset-control` `px-inset-control` `py-inset-control` `gap-inset-control` | text-symmetric content padding — (tier − text)/2, the inset that vertically centres body text in its tier; px-inset-control is a text button's side padding, p-inset-control a code block's. |
79
+ | `p-icon-inset-pill` `px-icon-inset-pill` `py-icon-inset-pill` `gap-icon-inset-pill` `p-icon-inset-chip` `px-icon-inset-chip` `py-icon-inset-chip` `gap-icon-inset-chip` `p-icon-inset-control` `px-icon-inset-control` `py-icon-inset-control` `gap-icon-inset-control` `p-icon-inset-bar` `px-icon-inset-bar` `py-icon-inset-bar` `gap-icon-inset-bar` `p-pill-inset-chip` `px-pill-inset-chip` `py-pill-inset-chip` `gap-pill-inset-chip` `p-pill-inset-control` `px-pill-inset-control` `py-pill-inset-control` `gap-pill-inset-control` `p-chip-inset-control` `px-chip-inset-control` `py-chip-inset-control` `gap-chip-inset-control` `p-chip-inset-bar` `px-chip-inset-bar` `py-chip-inset-bar` `gap-chip-inset-bar` | the concentric inset for a nested pair — (h-container − h-child)/2, the gap that makes a child control sit evenly inside its container, and the radius step that keeps their corners concentric. Named for the pair it joins: gap-icon-inset-control seats an icon in a control. |
80
+ | `p-glyph-icon` `px-glyph-icon` `py-glyph-icon` `gap-glyph-icon` `p-glyph-pill` `px-glyph-pill` `py-glyph-pill` `gap-glyph-pill` | the glyph size for a tier — the INK inside the box, not the box (size-glyph-pill is the dismiss × in a pill, size-pill is the pill). |
81
+ | `bg-field` `text-field` `border-field` `bg-field-highlight` `text-field-highlight` `border-field-highlight` | the recessed field fill — bg-field is a text input's resting well, bg-field-highlight its focused/hovered face. |
82
+ | `ease-base` | — |
83
+ | `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
+ | `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` | — |
63
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. |
64
86
 
65
87
  ## era-interactive
@@ -468,6 +490,54 @@ Declared in `index.css`.
468
490
  }
469
491
  ```
470
492
 
493
+ ## w-icon · w-pill · w-chip · w-control · w-bar
494
+
495
+ **Use it for:** a tier-sized WIDTH — the horizontal twin of the h-* ladder, for a rail or a column measured in tiers rather than in content.
496
+
497
+ Declared in `index.css`.
498
+
499
+ ```css
500
+ @utility w-icon {
501
+ width: var(--era-h-icon);
502
+ }
503
+ @utility w-pill {
504
+ width: var(--era-h-pill);
505
+ }
506
+ @utility w-chip {
507
+ width: var(--era-h-chip);
508
+ }
509
+ @utility w-control {
510
+ width: var(--era-h-control);
511
+ }
512
+ @utility w-bar {
513
+ width: var(--era-h-bar);
514
+ }
515
+ ```
516
+
517
+ ## min-w-icon · min-w-pill · min-w-chip · min-w-control · min-w-bar
518
+
519
+ **Use it for:** a minimum tier WIDTH — the floor that makes a single-glyph control render as a square rather than a skinny pill (min-w-control on an icon button, min-w-pill on a badge). These could not exist before the ladder was renamed: the old rungs were sm/md/lg, and Tailwind's container scale already owns min-w-md and min-w-lg, so the names collided and every call site had to write min-w-(--era-h-control) by hand. icon/pill/chip/control/bar collide with nothing.
520
+
521
+ Declared in `index.css`.
522
+
523
+ ```css
524
+ @utility min-w-icon {
525
+ min-width: var(--era-h-icon);
526
+ }
527
+ @utility min-w-pill {
528
+ min-width: var(--era-h-pill);
529
+ }
530
+ @utility min-w-chip {
531
+ min-width: var(--era-h-chip);
532
+ }
533
+ @utility min-w-control {
534
+ min-width: var(--era-h-control);
535
+ }
536
+ @utility min-w-bar {
537
+ min-width: var(--era-h-bar);
538
+ }
539
+ ```
540
+
471
541
  ## size-icon · size-pill · size-chip · size-control · size-bar
472
542
 
473
543
  **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.
@@ -497,155 +567,339 @@ Declared in `index.css`.
497
567
  }
498
568
  ```
499
569
 
500
- ## gap-gutter · p-gutter · px-gutter · py-gutter
570
+ ## px-pill · px-chip · pl-pill · pr-pill · pl-chip · pr-chip
501
571
 
502
- **Use it for:** 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).
572
+ **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
573
 
504
574
  Declared in `index.css`.
505
575
 
506
576
  ```css
507
- @utility gap-gutter {
508
- gap: var(--era-gap);
577
+ @utility px-pill {
578
+ padding-inline: var(--era-pill-px);
579
+ }
580
+ @utility px-chip {
581
+ padding-inline: var(--era-chip-px);
582
+ }
583
+ @utility pl-pill {
584
+ padding-left: var(--era-pill-px);
509
585
  }
510
- @utility p-gutter {
511
- padding: var(--era-gap);
586
+ @utility pr-pill {
587
+ padding-right: var(--era-pill-px);
512
588
  }
513
- @utility px-gutter {
514
- padding-inline: var(--era-gap);
589
+ @utility pl-chip {
590
+ padding-left: var(--era-chip-px);
515
591
  }
516
- @utility py-gutter {
517
- padding-block: var(--era-gap);
592
+ @utility pr-chip {
593
+ padding-right: var(--era-chip-px);
518
594
  }
519
595
  ```
520
596
 
521
- ## 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
597
+ ## p-section
522
598
 
523
- **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.
599
+ **Use it for:** padding for a content panel that sits UNDER a section header row — the even-padding exception, and the reason it is not called p-section: it deliberately under-pays the block start. For an evenly padded content panel use p-section, which is the plain token.
600
+
601
+ A content panel always follows a section header ROW, and that row already
602
+ contributes its own slack: the heading's text sits in an h-bar bar, so there
603
+ is (h-bar − text)/2 of empty bar under its glyphs before the panel even
604
+ starts. Padding the panel evenly on top of that spends the space twice — the
605
+ header ends up floating between the section above and the paragraph it
606
+ introduces rather than binding to it.
607
+
608
+ So the block-start pays only the REMAINDER. The target is the indent: the
609
+ space under a heading should measure the same as the space beside the text,
610
+ which is --era-pad-content. The header row already supplies (h-bar − text)/2 of
611
+ it, so the panel adds what's left, and heading-to-paragraph reads equal to
612
+ the paragraph's own inset. Subtracting one --era-gap (the previous rule) left
613
+ the header's slack unaccounted for and the heading still detached.
614
+
615
+ Both terms are density-derived, so the equality holds at every mode; the
616
+ max() is the floor for a hypothetical mode where the row's slack would
617
+ exceed the inset outright.
524
618
 
525
619
  Declared in `index.css`.
526
620
 
527
621
  ```css
528
- @utility p-inset-pill {
529
- padding: var(--era-inset-pill);
530
- }
531
- @utility p-inset-chip {
532
- padding: var(--era-inset-chip);
533
- }
534
- @utility p-inset-control {
535
- padding: var(--era-inset-control);
622
+ @utility p-section {
623
+ padding: var(--era-pad-content);
624
+ padding-top: max(0px, calc(var(--era-pad-content) - (var(--era-h-bar) - var(--era-text)) / 2));
536
625
  }
537
- @utility px-inset-pill {
538
- padding-inline: var(--era-inset-pill);
626
+ ```
627
+
628
+ ## duration-base
629
+
630
+ **Use it for:** 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".
631
+
632
+ Declared in `index.css`.
633
+
634
+ ```css
635
+ @utility duration-base {
636
+ transition-duration: var(--era-duration);
539
637
  }
540
- @utility px-inset-chip {
541
- padding-inline: var(--era-inset-chip);
638
+ ```
639
+
640
+ ## text-body
641
+
642
+ Density-derived body size: `text-body` replaces text-[length:var(--era-text)]
643
+
644
+ Declared in `index.css`.
645
+
646
+ ```css
647
+ @theme inline {
648
+ --text-body: var(--era-text);
542
649
  }
543
- @utility px-inset-control {
544
- padding-inline: var(--era-inset-control);
650
+ ```
651
+
652
+ ## leading-body
653
+
654
+ Prose leading — `leading-body` is the pair to `text-body`, and every piece
655
+ of text in the library that can wrap to a second line carries it. Enforced
656
+ at runtime by typography/prose-leading.
657
+
658
+ Declared in `index.css`.
659
+
660
+ ```css
661
+ @theme inline {
662
+ --leading-body: var(--era-leading);
545
663
  }
546
- @utility py-inset-pill {
547
- padding-block: var(--era-inset-pill);
664
+ ```
665
+
666
+ ## rounded-icon · rounded-pill · rounded-chip · rounded-control · rounded-bar · rounded-menu-item
667
+
668
+ Radius ladder — Tailwind's own rounded-* names now walk era's concentric
669
+ ladder (rd-T = rd-xs + (h-T − h-icon)/2), ride the corners toggle, and
670
+ collapse to 0 on square. rounded-menu-item is the menu-row radius
671
+ (rd-md − panel-inset) that keeps rows concentric inside a rounded-control
672
+ panel on every surface.
673
+
674
+ Declared in `index.css`.
675
+
676
+ ```css
677
+ @theme inline {
678
+ --radius-icon: var(--era-rd-icon);
679
+ --radius-pill: var(--era-rd-pill);
680
+ --radius-chip: var(--era-rd-chip);
681
+ --radius-control: var(--era-rd-control);
682
+ --radius-bar: var(--era-rd-bar);
683
+ --radius-menu-item: var(--era-item-rd);
548
684
  }
549
- @utility py-inset-chip {
550
- padding-block: var(--era-inset-chip);
685
+ ```
686
+
687
+ ## shadow
688
+
689
+ Surface chrome — bare `shadow` is the resting control edge, shadow-lg the
690
+ floating panel, shadow-well the recessed container, shadow-pressed the
691
+ active/latched face, shadow-highlight the material half of hover feedback.
692
+ Flat renders them as none, bevel as chisels, glass as frosted rims — the
693
+ class stays the same.
694
+
695
+ Declared in `index.css`.
696
+
697
+ ```css
698
+ @theme inline {
699
+ --shadow: var(--era-shadow);
551
700
  }
552
- @utility py-inset-control {
553
- padding-block: var(--era-inset-control);
701
+ ```
702
+
703
+ ## shadow-sm · shadow-lg · shadow-well · shadow-pressed · shadow-highlight
704
+
705
+ v4 marks bare `shadow` a deprecated spelling of shadow-sm, and lints
706
+ auto-fix one to the other — alias both to the control edge so either
707
+ spelling renders era chrome.
708
+
709
+ Declared in `index.css`.
710
+
711
+ ```css
712
+ @theme inline {
713
+ --shadow-sm: var(--era-shadow);
714
+ --shadow-lg: var(--era-shadow-lg);
715
+ --shadow-well: var(--era-shadow-well);
716
+ --shadow-pressed: var(--era-shadow-pressed);
717
+ --shadow-highlight: var(--era-highlight-shadow);
554
718
  }
555
719
  ```
556
720
 
557
- ## px-pill · px-chip
721
+ ## bg-well · text-well · border-well · bg-elevated · text-elevated · border-elevated · bg-highlight · text-highlight · … (12 in all)
558
722
 
559
- **Use it for:** pill side padding — the wider-than-vertical horizontal breathing room badge/chip text wants (glyph-advance derived, ~2× the vertical inset).
723
+ Surface fills — bg-well is the surface's own resting fill (pairs with
724
+ shadow-well for recessed chrome), bg-elevated the raised tier (pairs with
725
+ shadow-lg + glass-blur for floating chrome), bg-highlight the transient
726
+ hover/focus/keyboard wash (pairs with shadow-highlight; latched states
727
+ stay on opaque bg-hover), bg-overlay the modal scrim.
560
728
 
561
729
  Declared in `index.css`.
562
730
 
563
731
  ```css
564
- @utility px-pill {
565
- padding-inline: var(--era-pill-px);
732
+ @theme inline {
733
+ --color-well: var(--era-surface-bg);
734
+ --color-elevated: var(--era-surface-bg-elevated);
735
+ --color-highlight: var(--era-highlight);
736
+ --color-overlay: var(--era-overlay-bg);
566
737
  }
567
- @utility px-chip {
568
- padding-inline: var(--era-chip-px);
738
+ ```
739
+
740
+ ## p-gutter · px-gutter · py-gutter · gap-gutter · p-panel · px-panel · py-panel · gap-panel · … (24 in all)
741
+
742
+ THE SPACING SCALE — one entry per token, from which Tailwind derives the
743
+ WHOLE directional family: p/px/py/pt/pr/pb/pl/ps/pe, every margin, gap and
744
+ gap-x/y, inset/top/right/bottom/left, translate, and the sizing prefixes.
745
+
746
+ These were hand-written `@utility` blocks, which could only ever cover the
747
+ spellings someone remembered to write: `px-gutter` existed and `mt-gutter`
748
+ did not, `p-inset-control` existed and `pl-inset-control` did not, so the
749
+ library fell back to `mt-(--era-gap)` in exactly the places the named API
750
+ was supposed to cover. One line here replaces twenty blocks and leaves no
751
+ spelling missing.
752
+
753
+ ONLY genuine spacing belongs here. The namespace is shared across
754
+ h/w/p/m/gap, so a name registered here means the same length in ALL of
755
+ them — true of a gap or an inset, false of a TIER HEIGHT. Tiers stay
756
+ hand-written per prefix below, and the two vocabularies deliberately share
757
+ no word: icon/pill/chip/control/bar are heights; gutter, card, panel,
758
+ content, menu, field and the inset-* names are spacing. Registering a tier
759
+ name here would silently make `px-control` mean 24px of side padding.
760
+
761
+ Declared in `index.css`.
762
+
763
+ ```css
764
+ @theme inline {
765
+ --spacing-gutter: var(--era-gap);
766
+ --spacing-panel: var(--era-pad-panel);
767
+ --spacing-card: var(--era-pad-card);
768
+ --spacing-content: var(--era-pad-content);
769
+ --spacing-menu: var(--era-panel-inset);
770
+ --spacing-field: var(--era-field-px);
569
771
  }
570
772
  ```
571
773
 
572
- ## px-field
774
+ ## p-inset-pill · px-inset-pill · py-inset-pill · gap-inset-pill · p-inset-chip · px-inset-chip · py-inset-chip · gap-inset-chip · … (12 in all)
573
775
 
574
- **Use it for:** text-field side padding — where typed text starts in a control-tier input; the named form of px-(--era-field-px).
776
+ **Use it for:** text-symmetric content padding — (tier − text)/2, the inset that vertically centres body text in its tier; px-inset-control is a text button's side padding, p-inset-control a code block's.
575
777
 
576
778
  Declared in `index.css`.
577
779
 
578
780
  ```css
579
- @utility px-field {
580
- padding-inline: var(--era-field-px);
781
+ @theme inline {
782
+ --spacing-inset-pill: var(--era-inset-pill);
783
+ --spacing-inset-chip: var(--era-inset-chip);
784
+ --spacing-inset-control: var(--era-inset-control);
581
785
  }
582
786
  ```
583
787
 
584
- ## p-panel · p-card
788
+ ## p-icon-inset-pill · px-icon-inset-pill · py-icon-inset-pill · gap-icon-inset-pill · p-icon-inset-chip · px-icon-inset-chip · py-icon-inset-chip · gap-icon-inset-chip · … (32 in all)
585
789
 
586
- **Use it for:** 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.
790
+ **Use it for:** the concentric inset for a nested pair — (h-container − h-child)/2, the gap that makes a child control sit evenly inside its container, and the radius step that keeps their corners concentric. Named for the pair it joins: gap-icon-inset-control seats an icon in a control.
587
791
 
588
792
  Declared in `index.css`.
589
793
 
590
794
  ```css
591
- @utility p-panel {
592
- padding: var(--era-pad-panel);
795
+ @theme inline {
796
+ --spacing-icon-inset-pill: var(--era-icon-inset-pill);
797
+ --spacing-icon-inset-chip: var(--era-icon-inset-chip);
798
+ --spacing-icon-inset-control: var(--era-icon-inset-control);
799
+ --spacing-icon-inset-bar: var(--era-icon-inset-bar);
800
+ --spacing-pill-inset-chip: var(--era-pill-inset-chip);
801
+ --spacing-pill-inset-control: var(--era-pill-inset-control);
802
+ --spacing-chip-inset-control: var(--era-chip-inset-control);
803
+ --spacing-chip-inset-bar: var(--era-chip-inset-bar);
593
804
  }
594
- @utility p-card {
595
- padding: var(--era-pad-card);
805
+ ```
806
+
807
+ ## p-glyph-icon · px-glyph-icon · py-glyph-icon · gap-glyph-icon · p-glyph-pill · px-glyph-pill · py-glyph-pill · gap-glyph-pill
808
+
809
+ **Use it for:** the glyph size for a tier — the INK inside the box, not the box (size-glyph-pill is the dismiss × in a pill, size-pill is the pill).
810
+
811
+ Declared in `index.css`.
812
+
813
+ ```css
814
+ @theme inline {
815
+ --spacing-glyph-icon: var(--era-glyph-icon);
816
+ --spacing-glyph-pill: var(--era-glyph-pill);
596
817
  }
597
818
  ```
598
819
 
599
- ## p-content
820
+ ## bg-field · text-field · border-field · bg-field-highlight · text-field-highlight · border-field-highlight
600
821
 
601
- A content panel always follows a section header ROW, and that row already
602
- contributes its own slack: the heading's text sits in an h-bar bar, so there
603
- is (h-bar − text)/2 of empty bar under its glyphs before the panel even
604
- starts. Padding the panel evenly on top of that spends the space twice — the
605
- header ends up floating between the section above and the paragraph it
606
- introduces rather than binding to it.
822
+ **Use it for:** the recessed field fill — bg-field is a text input's resting well, bg-field-highlight its focused/hovered face.
607
823
 
608
- So the block-start pays only the REMAINDER. The target is the indent: the
609
- space under a heading should measure the same as the space beside the text,
610
- which is --era-content-p. The header row already supplies (h-bar − text)/2 of
611
- it, so the panel adds what's left, and heading-to-paragraph reads equal to
612
- the paragraph's own inset. Subtracting one --era-gap (the previous rule) left
613
- the header's slack unaccounted for and the heading still detached.
824
+ Declared in `index.css`.
614
825
 
615
- Both terms are density-derived, so the equality holds at every mode; the
616
- max() is the floor for a hypothetical mode where the row's slack would
617
- exceed the inset outright.
826
+ ```css
827
+ @theme inline {
828
+ --color-field: var(--era-field-bg);
829
+ --color-field-highlight: var(--era-field-highlight);
830
+ }
831
+ ```
832
+
833
+ ## ease-base
834
+
835
+ Motion — bare transition utilities default to the motion axis, so
836
+ `transition-colors` alone is on-design (0s at instant, longer at extra).
837
+ ease-base/duration-base name the axis explicitly for overrides.
618
838
 
619
839
  Declared in `index.css`.
620
840
 
621
841
  ```css
622
- @utility p-content {
623
- padding: var(--era-content-p);
624
- padding-top: max(0px, calc(var(--era-content-p) - (var(--era-h-bar) - var(--era-text)) / 2));
842
+ @theme inline {
843
+ --default-transition-duration: var(--era-duration);
844
+ --default-transition-timing-function: var(--era-ease);
845
+ --ease-base: var(--era-ease);
625
846
  }
626
847
  ```
627
848
 
628
- ## p-menu
849
+ ## bg-divider · text-divider · border-divider · bg-divider-faded · text-divider-faded · border-divider-faded · bg-background · text-background · … (66 in all)
629
850
 
630
- **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.
851
+ Surface divider colors: border-divider, bg-divider-faded, …
631
852
 
632
853
  Declared in `index.css`.
633
854
 
634
855
  ```css
635
- @utility p-menu {
636
- padding: var(--era-panel-inset);
856
+ @theme inline {
857
+ --color-divider: var(--era-divider-color);
858
+ --color-divider-faded: var(--era-divider-faded);
859
+ --color-background: var(--color-1);
860
+ --color-foreground: var(--color-fg);
861
+ --color-1: var(--color-1);
862
+ --color-2: var(--color-2);
863
+ --color-3: var(--color-3);
864
+ --color-4: var(--color-4);
865
+ --color-5: var(--color-5);
866
+ --color-6: var(--color-6);
867
+ --color-7: var(--color-7);
868
+ --color-8: var(--color-8);
869
+ --color-9: var(--color-9);
870
+ --color-10: var(--color-10);
871
+ --color-11: var(--color-11);
872
+ --color-12: var(--color-12);
873
+ --color-border: var(--color-border);
874
+ --color-surface: var(--color-surface);
875
+ --color-hover: var(--color-hover);
876
+ --color-fg: var(--color-fg);
877
+ --color-bright: var(--color-bright);
878
+ --color-muted: var(--color-muted);
637
879
  }
638
880
  ```
639
881
 
640
- ## duration-base
882
+ ## bg-fill · text-fill · border-fill · bg-link · text-link · border-link · bg-primary · text-primary · … (33 in all)
641
883
 
642
- **Use it for:** 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".
884
+ The standing pill fill — --era-fill, the latched counterpart of the
885
+ transient highlight. Surface-owned: a composing wash on flat/bevel, the
886
+ opaque swatch on glass.
643
887
 
644
888
  Declared in `index.css`.
645
889
 
646
890
  ```css
647
- @utility duration-base {
648
- transition-duration: var(--era-duration);
891
+ @theme inline {
892
+ --color-fill: var(--era-fill);
893
+ --color-link: var(--color-link);
894
+ --color-primary: var(--color-primary);
895
+ --color-primary-fg: var(--color-primary-fg);
896
+ --color-primary-hover: var(--color-primary-hover);
897
+ --color-destructive: var(--color-destructive);
898
+ --color-destructive-fg: var(--color-destructive-fg);
899
+ --color-success: var(--color-success);
900
+ --color-success-fg: var(--color-success-fg);
901
+ --color-warning: var(--color-warning);
902
+ --color-warning-fg: var(--color-warning-fg);
649
903
  }
650
904
  ```
651
905
 
@@ -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
  /**