@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
@@ -67,15 +67,26 @@ Classes, not components — they need no import beyond the stylesheet. Reach for
67
67
  - `era-collapse` — the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden).
68
68
  - `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-*).
69
69
  - `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).
70
+ - `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.
71
+ - `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.
70
72
  - `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.
71
- - `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).
72
- - `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.
73
- - `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).
74
- - `px-field` — text-field side padding — where typed text starts in a control-tier input; the named form of px-(--era-field-px).
75
- - `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.
76
- - `p-content` — A content panel always follows a section header ROW, and that row already
77
- - `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.
73
+ - `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).
74
+ - `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.
78
75
  - `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".
76
+ - `text-body` — Density-derived body size: `text-body` replaces text-[length:var(--era-text)]
77
+ - `leading-body` — Prose leading — `leading-body` is the pair to `text-body`, and every piece
78
+ - `rounded-icon · rounded-pill · rounded-chip · rounded-control · rounded-bar · rounded-menu-item` — Radius ladder — Tailwind's own rounded-* names now walk era's concentric
79
+ - `shadow` — Surface chrome — bare `shadow` is the resting control edge, shadow-lg the
80
+ - `shadow-sm · shadow-lg · shadow-well · shadow-pressed · shadow-highlight` — v4 marks bare `shadow` a deprecated spelling of shadow-sm, and lints
81
+ - `bg-well · text-well · border-well · bg-elevated · text-elevated · border-elevated · bg-highlight · text-highlight · … (12 in all)` — Surface fills — bg-well is the surface's own resting fill (pairs with
82
+ - `p-gutter · px-gutter · py-gutter · gap-gutter · p-panel · px-panel · py-panel · gap-panel · … (24 in all)` — THE SPACING SCALE — one entry per token, from which Tailwind derives the
83
+ - `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)` — 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.
84
+ - `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)` — 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.
85
+ - `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).
86
+ - `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.
87
+ - `ease-base` — Motion — bare transition utilities default to the motion axis, so
88
+ - `bg-divider · text-divider · border-divider · bg-divider-faded · text-divider-faded · border-divider-faded · bg-background · text-background · … (66 in all)` — Surface divider colors: border-divider, bg-divider-faded, …
89
+ - `bg-fill · text-fill · border-fill · bg-link · text-link · border-link · bg-primary · text-primary · … (33 in all)` — The standing pill fill — --era-fill, the latched counterpart of the
79
90
  - `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.
80
91
 
81
92
  Full reference (what each emits, when to use it): `/utilities.md`. Machine-readable list: `/utilities.json`.
@@ -149,7 +160,7 @@ motion):
149
160
 
150
161
  | Stock-looking class | What it resolves to |
151
162
  |---|---|
152
- | `rounded-icon/xxs/sm/md/lg` | the concentric radius ladder (collapses on `data-corners="square"`) |
163
+ | `rounded-icon/pill/chip/control/bar` | the concentric radius ladder (collapses on `data-corners="square"`) |
153
164
  | `rounded-menu-item` | menu-row radius, concentric inside a `rounded-control` panel |
154
165
  | `shadow` / `shadow-lg` | resting control edge / floating panel chrome, per surface |
155
166
  | `shadow-well` / `shadow-pressed` / `shadow-highlight` | recessed, pressed/latched, hover-material chrome |
@@ -157,10 +168,21 @@ motion):
157
168
  | `transition-*` (bare) | duration + easing default to the motion axis |
158
169
  | `ease-base` / `duration-base` | the motion axis, named explicitly |
159
170
  | `text-body` | density-derived body/control text size |
160
-
161
- Deliberate gaps: `w-*`/`min-w-*` tier names would shadow Tailwind's container
162
- scale (`min-w-md` stays 28rem), and the concentric-inset tokens are advanced
163
- enough to stay var-form — `min-w-(--era-h-control)` etc. remain the escape hatch.
171
+ | `p-gutter` / `gap-gutter` / `mt-gutter` / … | the spacing scale — EVERY spacing prefix works |
172
+
173
+ The spacing names (`gutter`, `card`, `panel`, `content`, `menu`, `field`, the
174
+ `inset-*` and concentric `*-inset-*` insets, `glyph-*`) are registered as a
175
+ Tailwind spacing scale, so every prefix derives automatically: `p-`, `px-`,
176
+ `pt-`, `mt-`, `gap-`, `gap-x-`, `inset-`, `translate-`, and the rest. The TIER
177
+ names (`icon`, `pill`, `chip`, `control`, `bar`) are heights, not spacing, so
178
+ they are registered per prefix instead — `h-`, `w-`, `min-h-`, `min-w-` and
179
+ `size-` — and the two vocabularies deliberately share no word. Putting a tier
180
+ in the spacing scale would silently make `px-control` mean 24px of padding.
181
+
182
+ The var form (`h-(--era-h-control)`) still works and is the escape hatch for a
183
+ token with no registered name — `--era-sp`, the press-sink offsets, anything
184
+ a component reaches for once. `scripts/check-canonical.ts` fails the build if
185
+ source uses it where a name exists.
164
186
 
165
187
  | Utility | Use it for |
166
188
  |---|---|
@@ -177,15 +199,26 @@ enough to stay var-form — `min-w-(--era-h-control)` etc. remain the escape hat
177
199
  | `era-collapse` | the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden). |
178
200
  | `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-*). |
179
201
  | `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). |
202
+ | `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. |
203
+ | `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. |
180
204
  | `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. |
181
- | `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). |
182
- | `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. |
183
- | `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). |
184
- | `px-field` | text-field side padding — where typed text starts in a control-tier input; the named form of px-(--era-field-px). |
185
- | `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. |
186
- | `p-content` | — |
187
- | `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. |
205
+ | `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). |
206
+ | `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. |
188
207
  | `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". |
208
+ | `text-body` | — |
209
+ | `leading-body` | — |
210
+ | `rounded-icon` `rounded-pill` `rounded-chip` `rounded-control` `rounded-bar` `rounded-menu-item` | — |
211
+ | `shadow` | — |
212
+ | `shadow-sm` `shadow-lg` `shadow-well` `shadow-pressed` `shadow-highlight` | — |
213
+ | `bg-well` `text-well` `border-well` `bg-elevated` `text-elevated` `border-elevated` `bg-highlight` `text-highlight` `border-highlight` `bg-overlay` `text-overlay` `border-overlay` | — |
214
+ | `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` | — |
215
+ | `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. |
216
+ | `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. |
217
+ | `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). |
218
+ | `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. |
219
+ | `ease-base` | — |
220
+ | `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` | — |
221
+ | `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` | — |
189
222
  | `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. |
190
223
 
191
224
  ## era-interactive
@@ -594,6 +627,54 @@ Declared in `index.css`.
594
627
  }
595
628
  ```
596
629
 
630
+ ## w-icon · w-pill · w-chip · w-control · w-bar
631
+
632
+ **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.
633
+
634
+ Declared in `index.css`.
635
+
636
+ ```css
637
+ @utility w-icon {
638
+ width: var(--era-h-icon);
639
+ }
640
+ @utility w-pill {
641
+ width: var(--era-h-pill);
642
+ }
643
+ @utility w-chip {
644
+ width: var(--era-h-chip);
645
+ }
646
+ @utility w-control {
647
+ width: var(--era-h-control);
648
+ }
649
+ @utility w-bar {
650
+ width: var(--era-h-bar);
651
+ }
652
+ ```
653
+
654
+ ## min-w-icon · min-w-pill · min-w-chip · min-w-control · min-w-bar
655
+
656
+ **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.
657
+
658
+ Declared in `index.css`.
659
+
660
+ ```css
661
+ @utility min-w-icon {
662
+ min-width: var(--era-h-icon);
663
+ }
664
+ @utility min-w-pill {
665
+ min-width: var(--era-h-pill);
666
+ }
667
+ @utility min-w-chip {
668
+ min-width: var(--era-h-chip);
669
+ }
670
+ @utility min-w-control {
671
+ min-width: var(--era-h-control);
672
+ }
673
+ @utility min-w-bar {
674
+ min-width: var(--era-h-bar);
675
+ }
676
+ ```
677
+
597
678
  ## size-icon · size-pill · size-chip · size-control · size-bar
598
679
 
599
680
  **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.
@@ -623,155 +704,339 @@ Declared in `index.css`.
623
704
  }
624
705
  ```
625
706
 
626
- ## gap-gutter · p-gutter · px-gutter · py-gutter
707
+ ## px-pill · px-chip · pl-pill · pr-pill · pl-chip · pr-chip
627
708
 
628
- **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).
709
+ **Use it for:** pill side padding — the wider-than-vertical horizontal breathing room badge/chip text wants (glyph-advance derived, ~2× the vertical inset).
629
710
 
630
711
  Declared in `index.css`.
631
712
 
632
713
  ```css
633
- @utility gap-gutter {
634
- gap: var(--era-gap);
714
+ @utility px-pill {
715
+ padding-inline: var(--era-pill-px);
716
+ }
717
+ @utility px-chip {
718
+ padding-inline: var(--era-chip-px);
719
+ }
720
+ @utility pl-pill {
721
+ padding-left: var(--era-pill-px);
635
722
  }
636
- @utility p-gutter {
637
- padding: var(--era-gap);
723
+ @utility pr-pill {
724
+ padding-right: var(--era-pill-px);
638
725
  }
639
- @utility px-gutter {
640
- padding-inline: var(--era-gap);
726
+ @utility pl-chip {
727
+ padding-left: var(--era-chip-px);
641
728
  }
642
- @utility py-gutter {
643
- padding-block: var(--era-gap);
729
+ @utility pr-chip {
730
+ padding-right: var(--era-chip-px);
644
731
  }
645
732
  ```
646
733
 
647
- ## 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
734
+ ## p-section
648
735
 
649
- **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.
736
+ **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.
737
+
738
+ A content panel always follows a section header ROW, and that row already
739
+ contributes its own slack: the heading's text sits in an h-bar bar, so there
740
+ is (h-bar − text)/2 of empty bar under its glyphs before the panel even
741
+ starts. Padding the panel evenly on top of that spends the space twice — the
742
+ header ends up floating between the section above and the paragraph it
743
+ introduces rather than binding to it.
744
+
745
+ So the block-start pays only the REMAINDER. The target is the indent: the
746
+ space under a heading should measure the same as the space beside the text,
747
+ which is --era-pad-content. The header row already supplies (h-bar − text)/2 of
748
+ it, so the panel adds what's left, and heading-to-paragraph reads equal to
749
+ the paragraph's own inset. Subtracting one --era-gap (the previous rule) left
750
+ the header's slack unaccounted for and the heading still detached.
751
+
752
+ Both terms are density-derived, so the equality holds at every mode; the
753
+ max() is the floor for a hypothetical mode where the row's slack would
754
+ exceed the inset outright.
650
755
 
651
756
  Declared in `index.css`.
652
757
 
653
758
  ```css
654
- @utility p-inset-pill {
655
- padding: var(--era-inset-pill);
656
- }
657
- @utility p-inset-chip {
658
- padding: var(--era-inset-chip);
659
- }
660
- @utility p-inset-control {
661
- padding: var(--era-inset-control);
759
+ @utility p-section {
760
+ padding: var(--era-pad-content);
761
+ padding-top: max(0px, calc(var(--era-pad-content) - (var(--era-h-bar) - var(--era-text)) / 2));
662
762
  }
663
- @utility px-inset-pill {
664
- padding-inline: var(--era-inset-pill);
763
+ ```
764
+
765
+ ## duration-base
766
+
767
+ **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".
768
+
769
+ Declared in `index.css`.
770
+
771
+ ```css
772
+ @utility duration-base {
773
+ transition-duration: var(--era-duration);
665
774
  }
666
- @utility px-inset-chip {
667
- padding-inline: var(--era-inset-chip);
775
+ ```
776
+
777
+ ## text-body
778
+
779
+ Density-derived body size: `text-body` replaces text-[length:var(--era-text)]
780
+
781
+ Declared in `index.css`.
782
+
783
+ ```css
784
+ @theme inline {
785
+ --text-body: var(--era-text);
668
786
  }
669
- @utility px-inset-control {
670
- padding-inline: var(--era-inset-control);
787
+ ```
788
+
789
+ ## leading-body
790
+
791
+ Prose leading — `leading-body` is the pair to `text-body`, and every piece
792
+ of text in the library that can wrap to a second line carries it. Enforced
793
+ at runtime by typography/prose-leading.
794
+
795
+ Declared in `index.css`.
796
+
797
+ ```css
798
+ @theme inline {
799
+ --leading-body: var(--era-leading);
671
800
  }
672
- @utility py-inset-pill {
673
- padding-block: var(--era-inset-pill);
801
+ ```
802
+
803
+ ## rounded-icon · rounded-pill · rounded-chip · rounded-control · rounded-bar · rounded-menu-item
804
+
805
+ Radius ladder — Tailwind's own rounded-* names now walk era's concentric
806
+ ladder (rd-T = rd-xs + (h-T − h-icon)/2), ride the corners toggle, and
807
+ collapse to 0 on square. rounded-menu-item is the menu-row radius
808
+ (rd-md − panel-inset) that keeps rows concentric inside a rounded-control
809
+ panel on every surface.
810
+
811
+ Declared in `index.css`.
812
+
813
+ ```css
814
+ @theme inline {
815
+ --radius-icon: var(--era-rd-icon);
816
+ --radius-pill: var(--era-rd-pill);
817
+ --radius-chip: var(--era-rd-chip);
818
+ --radius-control: var(--era-rd-control);
819
+ --radius-bar: var(--era-rd-bar);
820
+ --radius-menu-item: var(--era-item-rd);
674
821
  }
675
- @utility py-inset-chip {
676
- padding-block: var(--era-inset-chip);
822
+ ```
823
+
824
+ ## shadow
825
+
826
+ Surface chrome — bare `shadow` is the resting control edge, shadow-lg the
827
+ floating panel, shadow-well the recessed container, shadow-pressed the
828
+ active/latched face, shadow-highlight the material half of hover feedback.
829
+ Flat renders them as none, bevel as chisels, glass as frosted rims — the
830
+ class stays the same.
831
+
832
+ Declared in `index.css`.
833
+
834
+ ```css
835
+ @theme inline {
836
+ --shadow: var(--era-shadow);
677
837
  }
678
- @utility py-inset-control {
679
- padding-block: var(--era-inset-control);
838
+ ```
839
+
840
+ ## shadow-sm · shadow-lg · shadow-well · shadow-pressed · shadow-highlight
841
+
842
+ v4 marks bare `shadow` a deprecated spelling of shadow-sm, and lints
843
+ auto-fix one to the other — alias both to the control edge so either
844
+ spelling renders era chrome.
845
+
846
+ Declared in `index.css`.
847
+
848
+ ```css
849
+ @theme inline {
850
+ --shadow-sm: var(--era-shadow);
851
+ --shadow-lg: var(--era-shadow-lg);
852
+ --shadow-well: var(--era-shadow-well);
853
+ --shadow-pressed: var(--era-shadow-pressed);
854
+ --shadow-highlight: var(--era-highlight-shadow);
680
855
  }
681
856
  ```
682
857
 
683
- ## px-pill · px-chip
858
+ ## bg-well · text-well · border-well · bg-elevated · text-elevated · border-elevated · bg-highlight · text-highlight · … (12 in all)
684
859
 
685
- **Use it for:** pill side padding — the wider-than-vertical horizontal breathing room badge/chip text wants (glyph-advance derived, ~2× the vertical inset).
860
+ Surface fills — bg-well is the surface's own resting fill (pairs with
861
+ shadow-well for recessed chrome), bg-elevated the raised tier (pairs with
862
+ shadow-lg + glass-blur for floating chrome), bg-highlight the transient
863
+ hover/focus/keyboard wash (pairs with shadow-highlight; latched states
864
+ stay on opaque bg-hover), bg-overlay the modal scrim.
686
865
 
687
866
  Declared in `index.css`.
688
867
 
689
868
  ```css
690
- @utility px-pill {
691
- padding-inline: var(--era-pill-px);
869
+ @theme inline {
870
+ --color-well: var(--era-surface-bg);
871
+ --color-elevated: var(--era-surface-bg-elevated);
872
+ --color-highlight: var(--era-highlight);
873
+ --color-overlay: var(--era-overlay-bg);
692
874
  }
693
- @utility px-chip {
694
- padding-inline: var(--era-chip-px);
875
+ ```
876
+
877
+ ## p-gutter · px-gutter · py-gutter · gap-gutter · p-panel · px-panel · py-panel · gap-panel · … (24 in all)
878
+
879
+ THE SPACING SCALE — one entry per token, from which Tailwind derives the
880
+ WHOLE directional family: p/px/py/pt/pr/pb/pl/ps/pe, every margin, gap and
881
+ gap-x/y, inset/top/right/bottom/left, translate, and the sizing prefixes.
882
+
883
+ These were hand-written `@utility` blocks, which could only ever cover the
884
+ spellings someone remembered to write: `px-gutter` existed and `mt-gutter`
885
+ did not, `p-inset-control` existed and `pl-inset-control` did not, so the
886
+ library fell back to `mt-(--era-gap)` in exactly the places the named API
887
+ was supposed to cover. One line here replaces twenty blocks and leaves no
888
+ spelling missing.
889
+
890
+ ONLY genuine spacing belongs here. The namespace is shared across
891
+ h/w/p/m/gap, so a name registered here means the same length in ALL of
892
+ them — true of a gap or an inset, false of a TIER HEIGHT. Tiers stay
893
+ hand-written per prefix below, and the two vocabularies deliberately share
894
+ no word: icon/pill/chip/control/bar are heights; gutter, card, panel,
895
+ content, menu, field and the inset-* names are spacing. Registering a tier
896
+ name here would silently make `px-control` mean 24px of side padding.
897
+
898
+ Declared in `index.css`.
899
+
900
+ ```css
901
+ @theme inline {
902
+ --spacing-gutter: var(--era-gap);
903
+ --spacing-panel: var(--era-pad-panel);
904
+ --spacing-card: var(--era-pad-card);
905
+ --spacing-content: var(--era-pad-content);
906
+ --spacing-menu: var(--era-panel-inset);
907
+ --spacing-field: var(--era-field-px);
695
908
  }
696
909
  ```
697
910
 
698
- ## px-field
911
+ ## 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)
699
912
 
700
- **Use it for:** text-field side padding — where typed text starts in a control-tier input; the named form of px-(--era-field-px).
913
+ **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.
701
914
 
702
915
  Declared in `index.css`.
703
916
 
704
917
  ```css
705
- @utility px-field {
706
- padding-inline: var(--era-field-px);
918
+ @theme inline {
919
+ --spacing-inset-pill: var(--era-inset-pill);
920
+ --spacing-inset-chip: var(--era-inset-chip);
921
+ --spacing-inset-control: var(--era-inset-control);
707
922
  }
708
923
  ```
709
924
 
710
- ## p-panel · p-card
925
+ ## 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)
711
926
 
712
- **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.
927
+ **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.
713
928
 
714
929
  Declared in `index.css`.
715
930
 
716
931
  ```css
717
- @utility p-panel {
718
- padding: var(--era-pad-panel);
932
+ @theme inline {
933
+ --spacing-icon-inset-pill: var(--era-icon-inset-pill);
934
+ --spacing-icon-inset-chip: var(--era-icon-inset-chip);
935
+ --spacing-icon-inset-control: var(--era-icon-inset-control);
936
+ --spacing-icon-inset-bar: var(--era-icon-inset-bar);
937
+ --spacing-pill-inset-chip: var(--era-pill-inset-chip);
938
+ --spacing-pill-inset-control: var(--era-pill-inset-control);
939
+ --spacing-chip-inset-control: var(--era-chip-inset-control);
940
+ --spacing-chip-inset-bar: var(--era-chip-inset-bar);
719
941
  }
720
- @utility p-card {
721
- padding: var(--era-pad-card);
942
+ ```
943
+
944
+ ## p-glyph-icon · px-glyph-icon · py-glyph-icon · gap-glyph-icon · p-glyph-pill · px-glyph-pill · py-glyph-pill · gap-glyph-pill
945
+
946
+ **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).
947
+
948
+ Declared in `index.css`.
949
+
950
+ ```css
951
+ @theme inline {
952
+ --spacing-glyph-icon: var(--era-glyph-icon);
953
+ --spacing-glyph-pill: var(--era-glyph-pill);
722
954
  }
723
955
  ```
724
956
 
725
- ## p-content
957
+ ## bg-field · text-field · border-field · bg-field-highlight · text-field-highlight · border-field-highlight
726
958
 
727
- A content panel always follows a section header ROW, and that row already
728
- contributes its own slack: the heading's text sits in an h-bar bar, so there
729
- is (h-bar − text)/2 of empty bar under its glyphs before the panel even
730
- starts. Padding the panel evenly on top of that spends the space twice — the
731
- header ends up floating between the section above and the paragraph it
732
- introduces rather than binding to it.
959
+ **Use it for:** the recessed field fill — bg-field is a text input's resting well, bg-field-highlight its focused/hovered face.
733
960
 
734
- So the block-start pays only the REMAINDER. The target is the indent: the
735
- space under a heading should measure the same as the space beside the text,
736
- which is --era-content-p. The header row already supplies (h-bar − text)/2 of
737
- it, so the panel adds what's left, and heading-to-paragraph reads equal to
738
- the paragraph's own inset. Subtracting one --era-gap (the previous rule) left
739
- the header's slack unaccounted for and the heading still detached.
961
+ Declared in `index.css`.
740
962
 
741
- Both terms are density-derived, so the equality holds at every mode; the
742
- max() is the floor for a hypothetical mode where the row's slack would
743
- exceed the inset outright.
963
+ ```css
964
+ @theme inline {
965
+ --color-field: var(--era-field-bg);
966
+ --color-field-highlight: var(--era-field-highlight);
967
+ }
968
+ ```
969
+
970
+ ## ease-base
971
+
972
+ Motion — bare transition utilities default to the motion axis, so
973
+ `transition-colors` alone is on-design (0s at instant, longer at extra).
974
+ ease-base/duration-base name the axis explicitly for overrides.
744
975
 
745
976
  Declared in `index.css`.
746
977
 
747
978
  ```css
748
- @utility p-content {
749
- padding: var(--era-content-p);
750
- padding-top: max(0px, calc(var(--era-content-p) - (var(--era-h-bar) - var(--era-text)) / 2));
979
+ @theme inline {
980
+ --default-transition-duration: var(--era-duration);
981
+ --default-transition-timing-function: var(--era-ease);
982
+ --ease-base: var(--era-ease);
751
983
  }
752
984
  ```
753
985
 
754
- ## p-menu
986
+ ## bg-divider · text-divider · border-divider · bg-divider-faded · text-divider-faded · border-divider-faded · bg-background · text-background · … (66 in all)
755
987
 
756
- **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.
988
+ Surface divider colors: border-divider, bg-divider-faded, …
757
989
 
758
990
  Declared in `index.css`.
759
991
 
760
992
  ```css
761
- @utility p-menu {
762
- padding: var(--era-panel-inset);
993
+ @theme inline {
994
+ --color-divider: var(--era-divider-color);
995
+ --color-divider-faded: var(--era-divider-faded);
996
+ --color-background: var(--color-1);
997
+ --color-foreground: var(--color-fg);
998
+ --color-1: var(--color-1);
999
+ --color-2: var(--color-2);
1000
+ --color-3: var(--color-3);
1001
+ --color-4: var(--color-4);
1002
+ --color-5: var(--color-5);
1003
+ --color-6: var(--color-6);
1004
+ --color-7: var(--color-7);
1005
+ --color-8: var(--color-8);
1006
+ --color-9: var(--color-9);
1007
+ --color-10: var(--color-10);
1008
+ --color-11: var(--color-11);
1009
+ --color-12: var(--color-12);
1010
+ --color-border: var(--color-border);
1011
+ --color-surface: var(--color-surface);
1012
+ --color-hover: var(--color-hover);
1013
+ --color-fg: var(--color-fg);
1014
+ --color-bright: var(--color-bright);
1015
+ --color-muted: var(--color-muted);
763
1016
  }
764
1017
  ```
765
1018
 
766
- ## duration-base
1019
+ ## bg-fill · text-fill · border-fill · bg-link · text-link · border-link · bg-primary · text-primary · … (33 in all)
767
1020
 
768
- **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".
1021
+ The standing pill fill — --era-fill, the latched counterpart of the
1022
+ transient highlight. Surface-owned: a composing wash on flat/bevel, the
1023
+ opaque swatch on glass.
769
1024
 
770
1025
  Declared in `index.css`.
771
1026
 
772
1027
  ```css
773
- @utility duration-base {
774
- transition-duration: var(--era-duration);
1028
+ @theme inline {
1029
+ --color-fill: var(--era-fill);
1030
+ --color-link: var(--color-link);
1031
+ --color-primary: var(--color-primary);
1032
+ --color-primary-fg: var(--color-primary-fg);
1033
+ --color-primary-hover: var(--color-primary-hover);
1034
+ --color-destructive: var(--color-destructive);
1035
+ --color-destructive-fg: var(--color-destructive-fg);
1036
+ --color-success: var(--color-success);
1037
+ --color-success-fg: var(--color-success-fg);
1038
+ --color-warning: var(--color-warning);
1039
+ --color-warning-fg: var(--color-warning-fg);
775
1040
  }
776
1041
  ```
777
1042
 
@@ -105,15 +105,26 @@ Classes, not components — they need no import beyond the stylesheet. Reach for
105
105
  - `era-collapse` — the height sweep for a bits-ui Collapsible.Content — put it on the Content element itself (it carries its own overflow: hidden).
106
106
  - `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-*).
107
107
  - `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).
108
+ - `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.
109
+ - `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.
108
110
  - `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.
109
- - `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).
110
- - `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.
111
- - `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).
112
- - `px-field` — text-field side padding — where typed text starts in a control-tier input; the named form of px-(--era-field-px).
113
- - `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.
114
- - `p-content` — A content panel always follows a section header ROW, and that row already
115
- - `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.
111
+ - `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).
112
+ - `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.
116
113
  - `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".
114
+ - `text-body` — Density-derived body size: `text-body` replaces text-[length:var(--era-text)]
115
+ - `leading-body` — Prose leading — `leading-body` is the pair to `text-body`, and every piece
116
+ - `rounded-icon · rounded-pill · rounded-chip · rounded-control · rounded-bar · rounded-menu-item` — Radius ladder — Tailwind's own rounded-* names now walk era's concentric
117
+ - `shadow` — Surface chrome — bare `shadow` is the resting control edge, shadow-lg the
118
+ - `shadow-sm · shadow-lg · shadow-well · shadow-pressed · shadow-highlight` — v4 marks bare `shadow` a deprecated spelling of shadow-sm, and lints
119
+ - `bg-well · text-well · border-well · bg-elevated · text-elevated · border-elevated · bg-highlight · text-highlight · … (12 in all)` — Surface fills — bg-well is the surface's own resting fill (pairs with
120
+ - `p-gutter · px-gutter · py-gutter · gap-gutter · p-panel · px-panel · py-panel · gap-panel · … (24 in all)` — THE SPACING SCALE — one entry per token, from which Tailwind derives the
121
+ - `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)` — 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.
122
+ - `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)` — 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.
123
+ - `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).
124
+ - `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.
125
+ - `ease-base` — Motion — bare transition utilities default to the motion axis, so
126
+ - `bg-divider · text-divider · border-divider · bg-divider-faded · text-divider-faded · border-divider-faded · bg-background · text-background · … (66 in all)` — Surface divider colors: border-divider, bg-divider-faded, …
127
+ - `bg-fill · text-fill · border-fill · bg-link · text-link · border-link · bg-primary · text-primary · … (33 in all)` — The standing pill fill — --era-fill, the latched counterpart of the
117
128
  - `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.
118
129
 
119
130
  Full reference (what each emits, when to use it): `{{ORIGIN}}/utilities.md`. Machine-readable list: `{{ORIGIN}}/utilities.json`.