@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
@@ -9,7 +9,7 @@ never the `h-(--era-h-control)` var-class spelling. Everything below rides along
9
9
  with the stylesheet and needs no import:
10
10
 
11
11
  ```ts
12
- import "@sig-nine/era-ui/css";
12
+ import "@signal9/era-ui/css";
13
13
  ```
14
14
 
15
15
  ```svelte
@@ -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
  |---|---|
@@ -44,20 +55,33 @@ enough to stay var-form — `min-w-(--era-h-control)` etc. remain the escape hat
44
55
  | `era-text-trim` | vertically center single-line control text (a label beside an icon, a button's own text) without a translateY nudge. Fixed-height, non-editable elements ONLY: never on an <input>/<textarea>, and never on the same element as `truncate` or any overflow clip — put it on the fixed-height ROW and let the truncating child centre inside it. See era-text-trim-caps for ALL-CAPS. |
45
56
  | `truncate` | single-line horizontal truncation with an ellipsis — put it on the truncating CHILD inside a trimmed or leading-none row, never on the same element as era-text-trim; it will not clip ascenders or descenders. |
46
57
  | `era-text-trim-caps` | the era-text-trim variant for ALL-CAPS single-line strings (kbd hints, acronym badges) — never for mixed-case text (a label like "System" reads high; use era-text-trim), and never on the same element as `truncate`. |
47
- | `era-token-ink` `era-ink-center` | the ink centring for a token pill — a badge, a KV value, any short caps-or-digits label in a fixed-height box; it needs no icon sibling (with one the box must stay flex, and the general trim applies). |
58
+ | `era-ink-center` | on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim. |
59
+ | `era-token-ink` | the ink centring for a token pill — a badge, a KV value, any short caps-or-digits label in a fixed-height box, CENTRED horizontally and with no icon sibling. For a left-aligned sentence-case label use era-label-ink; when an icon really must sit beside the text, see the note there. |
60
+ | `era-label-ink` | the ink centring for a fixed-height control holding ONE line of sentence-case text and no icon — a menu item, a nav trigger, a button label. Never alongside `truncate` (the trimmed box becomes the clip). |
48
61
  | `era-shimmer` | the in-progress text treatment — put it on a "working…" / "thinking…" label while a task streams, instead of a spinner beside the text. |
49
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). |
50
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-*). |
51
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. |
52
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. |
53
- | `gap-gutter` `p-gutter` `px-gutter` `py-gutter` | the inter-element gap (sp/2) — flex/grid gap between sibling controls, and the matching gutter padding a scrollable list or rail owes its rows on all four sides (p-gutter on the rail = gap-gutter between its rows). |
54
- | `p-inset-pill` `p-inset-chip` `p-inset-control` `px-inset-pill` `px-inset-chip` `px-inset-control` `py-inset-pill` `py-inset-chip` `py-inset-control` | text-symmetric content padding — (tier − text)/2, the inset that vertically centers body text in its tier; px-inset-control is a text button's side padding, p-inset-control a code block's. |
55
- | `px-pill` `px-chip` | pill side padding — the wider-than-vertical horizontal breathing room badge/chip text wants (glyph-advance derived, ~2× the vertical inset). |
56
- | `px-field` | text-field side padding — where typed text starts in a control-tier input; the named form of px-(--era-field-px). |
57
- | `p-panel` `p-card` | optical padding for unbounded containers — p-panel for compact shells and menu-adjacent chrome, p-card for cards/dialogs/popovers, p-content for full content panels. Grows super-linearly with density so whitespace holds its perceived share as controls loosen. |
58
- | `p-content` | — |
59
- | `p-menu` | menu-panel padding — the surface-owned inset (0 on flat, 2px on glass/bevel) that keeps row highlights inside a floating panel's frame; pairs with rounded-menu-item on the rows. |
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. |
60
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` | — |
61
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. |
62
86
 
63
87
  ## era-interactive
@@ -235,9 +259,47 @@ Declared in `index.css`.
235
259
  }
236
260
  ```
237
261
 
238
- ## era-token-ink · era-ink-center
262
+ ## era-ink-center
263
+
264
+ **Use it for:** on a native single-line <input> (or the text layer that must mirror one) inside a fixed-height field — never alongside era-text-trim.
265
+
266
+ The EDITABLE counterpart of era-text-trim — for native <input>s, which the
267
+ trim is forbidden on (it collapses the UA's inner editor box and slices the
268
+ glyphs; see typography/collapsed-text-trim).
269
+
270
+ Without help, a tier-height input centres its text by FONT BOX, and the ui
271
+ stacks' font box is deeply asymmetric: ascent ≈1.07em against descent
272
+ ≈0.29em. Centring that box parks the visible band (caps, x-height) ~0.115em
273
+ LOW — so a field's text sat visibly below the trimmed label beside it.
274
+
275
+ The value is OPTICAL, not the derivation's: pure x-band centring computes
276
+ to ~0.23em of padding, but pixel-measured against real Title-Case text it
277
+ over-lifts — the eye weighs the cap-to-baseline mass, which x-band
278
+ centring parks ~2px high (caps 2.75px off the top against 5.7px of air
279
+ under the baseline, measured at dense). 0.08em splits the difference
280
+ between the x-band ideal and the cap-band ideal, landing caps ~3.7px in an
281
+ 18px field with ~4.7px under the baseline — the reading where neither
282
+ band's partisans win and neither complains.
283
+
284
+ The lift is padding, not a translateY: an icon-less Input paints the field
285
+ chrome itself, and a transform would drag the field along with the ink.
286
+ padding-bottom shrinks the content box from below, and a single-line input
287
+ re-centres its line box in what remains — the ink rises by exactly half the
288
+ padding, the chrome doesn't move, and the caret and selection follow the
289
+ text. In em on purpose: the correction is a fraction of the type, so it
290
+ holds across every density and text size with one value.
239
291
 
240
- **Use it for:** the ink centring for a token pill — a badge, a KV value, any short caps-or-digits label in a fixed-height box; it needs no icon sibling (with one the box must stay flex, and the general trim applies).
292
+ Declared in `index.css`.
293
+
294
+ ```css
295
+ @utility era-ink-center {
296
+ padding-bottom: 0.08em;
297
+ }
298
+ ```
299
+
300
+ ## era-token-ink
301
+
302
+ **Use it for:** the ink centring for a token pill — a badge, a KV value, any short caps-or-digits label in a fixed-height box, CENTRED horizontally and with no icon sibling. For a left-aligned sentence-case label use era-label-ink; when an icon really must sit beside the text, see the note there.
241
303
 
242
304
  TOKEN INK — the ink centring for a pill whose content is a TOKEN: an id, a
243
305
  count, a status, a tag. Font-independent, unlike everything it replaces.
@@ -276,9 +338,45 @@ Declared in `index.css`.
276
338
  line-height: 1;
277
339
  text-box: trim-both cap alphabetic;
278
340
  }
341
+ ```
279
342
 
280
- @utility era-ink-center {
281
- padding-bottom: 0.08em;
343
+ ## era-label-ink
344
+
345
+ **Use it for:** the ink centring for a fixed-height control holding ONE line of sentence-case text and no icon — a menu item, a nav trigger, a button label. Never alongside `truncate` (the trimmed box becomes the clip).
346
+
347
+ LABEL INK — era-token-ink's mixed-case sibling, and the general answer to
348
+ "this fixed-height control holds one line of text".
349
+
350
+ Same mechanism, same reason: `text-box-trim` needs a BLOCK box, so the row
351
+ becomes one and `align-content` (block-container alignment) does the
352
+ centring. What differs is the band and the alignment, because the content
353
+ class differs — a label is sentence case, so the x-height band is the visual
354
+ mass to centre (cap-band reads low on "System"), and it is laid out against
355
+ the row's padding rather than centred in it.
356
+
357
+ WHY IT EXISTS AT ALL: era's controls are flex, and a flex container's bare
358
+ text is an ANONYMOUS flex item — a box no selector reaches and no
359
+ non-inherited property touches. So `era-text-trim` on a flex row is inert,
360
+ contributing only its `line-height: 1`, and the ink falls back to line-box
361
+ centring by font metrics. era-token-ink already fixed that for centred
362
+ tokens; this fixes it for everything else.
363
+
364
+ THE ICON CASE IS NOT SOLVED, and cannot be from CSS: an icon beside the text
365
+ needs the box to stay flex, which re-creates the anonymous item. A component
366
+ whose children are an opaque slot therefore guards it —
367
+ `not-has-[svg]:era-label-ink` — and ink-centres the text-only case while
368
+ leaving the icon case on line-box centring. Splitting icon and label into
369
+ separate slots is what would close it; typography/inert-trim reports every
370
+ site still on the fallback.
371
+
372
+ Declared in `index.css`.
373
+
374
+ ```css
375
+ @utility era-label-ink {
376
+ display: block;
377
+ align-content: center;
378
+ line-height: 1;
379
+ text-box: trim-both ex alphabetic;
282
380
  }
283
381
  ```
284
382
 
@@ -392,6 +490,54 @@ Declared in `index.css`.
392
490
  }
393
491
  ```
394
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
+
395
541
  ## size-icon · size-pill · size-chip · size-control · size-bar
396
542
 
397
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.
@@ -421,155 +567,339 @@ Declared in `index.css`.
421
567
  }
422
568
  ```
423
569
 
424
- ## gap-gutter · p-gutter · px-gutter · py-gutter
570
+ ## px-pill · px-chip · pl-pill · pr-pill · pl-chip · pr-chip
425
571
 
426
- **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).
427
573
 
428
574
  Declared in `index.css`.
429
575
 
430
576
  ```css
431
- @utility gap-gutter {
432
- 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);
433
585
  }
434
- @utility p-gutter {
435
- padding: var(--era-gap);
586
+ @utility pr-pill {
587
+ padding-right: var(--era-pill-px);
436
588
  }
437
- @utility px-gutter {
438
- padding-inline: var(--era-gap);
589
+ @utility pl-chip {
590
+ padding-left: var(--era-chip-px);
439
591
  }
440
- @utility py-gutter {
441
- padding-block: var(--era-gap);
592
+ @utility pr-chip {
593
+ padding-right: var(--era-chip-px);
442
594
  }
443
595
  ```
444
596
 
445
- ## p-inset-pill · p-inset-chip · p-inset-control · px-inset-pill · px-inset-chip · px-inset-control · py-inset-pill · py-inset-chip · py-inset-control
597
+ ## p-section
446
598
 
447
- **Use it for:** text-symmetric content padding — (tier − text)/2, the inset that vertically centers body text in its tier; px-inset-control is a text button's side padding, p-inset-control a code block's.
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.
448
618
 
449
619
  Declared in `index.css`.
450
620
 
451
621
  ```css
452
- @utility p-inset-pill {
453
- padding: var(--era-inset-pill);
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));
454
625
  }
455
- @utility p-inset-chip {
456
- padding: var(--era-inset-chip);
457
- }
458
- @utility p-inset-control {
459
- padding: var(--era-inset-control);
460
- }
461
- @utility px-inset-pill {
462
- 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);
463
637
  }
464
- @utility px-inset-chip {
465
- 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);
466
649
  }
467
- @utility px-inset-control {
468
- 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);
469
663
  }
470
- @utility py-inset-pill {
471
- 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);
472
684
  }
473
- @utility py-inset-chip {
474
- 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);
475
700
  }
476
- @utility py-inset-control {
477
- 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);
478
718
  }
479
719
  ```
480
720
 
481
- ## px-pill · px-chip
721
+ ## bg-well · text-well · border-well · bg-elevated · text-elevated · border-elevated · bg-highlight · text-highlight · … (12 in all)
482
722
 
483
- **Use it for:** pill side padding — the wider-than-vertical horizontal breathing room badge/chip text wants (glyph-advance derived, ~2× the vertical inset).
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.
484
728
 
485
729
  Declared in `index.css`.
486
730
 
487
731
  ```css
488
- @utility px-pill {
489
- 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);
490
737
  }
491
- @utility px-chip {
492
- 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);
493
771
  }
494
772
  ```
495
773
 
496
- ## 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)
497
775
 
498
- **Use it for:** text-field side padding — where typed text starts in a control-tier input; the named form of px-(--era-field-px).
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.
499
777
 
500
778
  Declared in `index.css`.
501
779
 
502
780
  ```css
503
- @utility px-field {
504
- 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);
505
785
  }
506
786
  ```
507
787
 
508
- ## 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)
509
789
 
510
- **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.
511
791
 
512
792
  Declared in `index.css`.
513
793
 
514
794
  ```css
515
- @utility p-panel {
516
- 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);
517
804
  }
518
- @utility p-card {
519
- 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);
520
817
  }
521
818
  ```
522
819
 
523
- ## p-content
820
+ ## bg-field · text-field · border-field · bg-field-highlight · text-field-highlight · border-field-highlight
524
821
 
525
- A content panel always follows a section header ROW, and that row already
526
- contributes its own slack: the heading's text sits in an h-bar bar, so there
527
- is (h-bar − text)/2 of empty bar under its glyphs before the panel even
528
- starts. Padding the panel evenly on top of that spends the space twice — the
529
- header ends up floating between the section above and the paragraph it
530
- 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.
531
823
 
532
- So the block-start pays only the REMAINDER. The target is the indent: the
533
- space under a heading should measure the same as the space beside the text,
534
- which is --era-content-p. The header row already supplies (h-bar − text)/2 of
535
- it, so the panel adds what's left, and heading-to-paragraph reads equal to
536
- the paragraph's own inset. Subtracting one --era-gap (the previous rule) left
537
- the header's slack unaccounted for and the heading still detached.
824
+ Declared in `index.css`.
538
825
 
539
- Both terms are density-derived, so the equality holds at every mode; the
540
- max() is the floor for a hypothetical mode where the row's slack would
541
- 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.
542
838
 
543
839
  Declared in `index.css`.
544
840
 
545
841
  ```css
546
- @utility p-content {
547
- padding: var(--era-content-p);
548
- 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);
549
846
  }
550
847
  ```
551
848
 
552
- ## 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)
553
850
 
554
- **Use it for:** menu-panel padding — the surface-owned inset (0 on flat, 2px on glass/bevel) that keeps row highlights inside a floating panel's frame; pairs with rounded-menu-item on the rows.
851
+ Surface divider colors: border-divider, bg-divider-faded, …
555
852
 
556
853
  Declared in `index.css`.
557
854
 
558
855
  ```css
559
- @utility p-menu {
560
- 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);
561
879
  }
562
880
  ```
563
881
 
564
- ## duration-base
882
+ ## bg-fill · text-fill · border-fill · bg-link · text-link · border-link · bg-primary · text-primary · … (33 in all)
565
883
 
566
- **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.
567
887
 
568
888
  Declared in `index.css`.
569
889
 
570
890
  ```css
571
- @utility duration-base {
572
- 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);
573
903
  }
574
904
  ```
575
905