@signal9/era-ui 7.0.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/dist/ai/artifact/artifact-close.svelte +1 -1
  2. package/dist/ai/artifact/artifact-content.svelte +1 -1
  3. package/dist/ai/artifact/artifact-header.svelte +1 -1
  4. package/dist/ai/artifact/artifact.svelte +1 -1
  5. package/dist/ai/chain-of-thought/chain-of-thought-step.svelte +1 -1
  6. package/dist/ai/chain-of-thought/chain-of-thought.svelte +1 -1
  7. package/dist/ai/checkpoint.svelte +1 -1
  8. package/dist/ai/confirmation/confirmation-args.svelte +2 -2
  9. package/dist/ai/confirmation/confirmation.svelte +4 -4
  10. package/dist/ai/context/context.svelte +1 -1
  11. package/dist/ai/conversation/conversation-content.svelte +1 -1
  12. package/dist/ai/conversation/conversation-empty-state.svelte +1 -1
  13. package/dist/ai/conversation/conversation-scroll-button.svelte +2 -2
  14. package/dist/ai/conversations/conversations-group.svelte +1 -1
  15. package/dist/ai/conversations/conversations-item.svelte +7 -7
  16. package/dist/ai/error-panel/error-panel.svelte +4 -4
  17. package/dist/ai/image.svelte +1 -1
  18. package/dist/ai/inline-citation/inline-citation.svelte +2 -2
  19. package/dist/ai/loader.svelte +1 -1
  20. package/dist/ai/message/message-branch-selector.svelte +3 -3
  21. package/dist/ai/message/message-content.svelte +1 -1
  22. package/dist/ai/message/message-usage.svelte +4 -4
  23. package/dist/ai/model-selector/model-selector.svelte +1 -1
  24. package/dist/ai/open-in-chat/open-in-chat.svelte +2 -2
  25. package/dist/ai/plan/plan-content.svelte +1 -1
  26. package/dist/ai/plan/plan-header.svelte +2 -2
  27. package/dist/ai/plan/plan.svelte +1 -1
  28. package/dist/ai/prompt-input/prompt-input-add-attachments.svelte +1 -1
  29. package/dist/ai/prompt-input/prompt-input-attachments.svelte +5 -5
  30. package/dist/ai/prompt-input/prompt-input-submit.svelte +3 -3
  31. package/dist/ai/prompt-input/prompt-input-textarea.svelte +3 -3
  32. package/dist/ai/prompt-input/prompt-input.svelte +1 -1
  33. package/dist/ai/queue/queue-item.svelte +1 -1
  34. package/dist/ai/queue/queue.svelte +1 -1
  35. package/dist/ai/reasoning/reasoning-trigger.svelte +1 -1
  36. package/dist/ai/response/response.svelte +2 -2
  37. package/dist/ai/run-status/run-status.svelte +5 -5
  38. package/dist/ai/runtime-feed/runtime-feed-item.svelte +1 -1
  39. package/dist/ai/sources/source.svelte +1 -1
  40. package/dist/ai/sources/sources-trigger.svelte +1 -1
  41. package/dist/ai/structured-value/structured-value.svelte +1 -1
  42. package/dist/ai/suggestion/suggestion.svelte +2 -2
  43. package/dist/ai/swarm/swarm-agent.svelte +1 -1
  44. package/dist/ai/swarm/swarm-artifact.svelte +1 -1
  45. package/dist/ai/swarm/swarm-barrier.svelte +1 -1
  46. package/dist/ai/swarm/swarm-barriers.svelte +1 -1
  47. package/dist/ai/swarm/swarm-counts.svelte +1 -1
  48. package/dist/ai/swarm/swarm-footer.svelte +1 -1
  49. package/dist/ai/swarm/swarm-grid.svelte +2 -2
  50. package/dist/ai/swarm/swarm-header.svelte +1 -1
  51. package/dist/ai/swarm/swarm-node.svelte +7 -7
  52. package/dist/ai/swarm/swarm-role.svelte +1 -1
  53. package/dist/ai/swarm/swarm-root.svelte +1 -1
  54. package/dist/ai/swarm/swarm-sandbox.svelte +3 -3
  55. package/dist/ai/swarm/swarm-tree.svelte +1 -1
  56. package/dist/ai/task/task-content.svelte +1 -1
  57. package/dist/ai/task/task-trigger.svelte +1 -1
  58. package/dist/ai/tool/tool-chip.svelte +2 -2
  59. package/dist/ai/tool/tool-exec.svelte +3 -3
  60. package/dist/ai/tool/tool-header.svelte +1 -1
  61. package/dist/ai/web-preview/web-preview.svelte +3 -3
  62. package/dist/ai/workflow/canvas.svelte +1 -1
  63. package/dist/ai/workflow/node.svelte +3 -3
  64. package/dist/apps/llm-shell/llm-shell.svelte +7 -7
  65. package/dist/apps/notes/editor/slash-menu.svelte +7 -5
  66. package/dist/apps/notes/note-editor.svelte +7 -364
  67. package/dist/apps/notes/note-editor.svelte.d.ts +1 -0
  68. package/dist/apps/notes/notes.svelte +9 -9
  69. package/dist/dev/audit/audits/_helpers.js +1 -1
  70. package/dist/dev/audit/audits/resting-gap.js +1 -1
  71. package/dist/dev/audit/audits/single-glyph-square.js +2 -2
  72. package/dist/dev/audit-overlay.svelte +7 -7
  73. package/dist/dev/measure.d.ts +1 -1
  74. package/dist/dev/measure.js +1 -1
  75. package/dist/docs/badge.md +1 -1
  76. package/dist/docs/css-utilities.d.ts +1 -1
  77. package/dist/docs/css-utilities.js +8 -8
  78. package/dist/docs/llms-txt.js +1 -1
  79. package/dist/era-ui.css +1 -1
  80. package/dist/generated-docs/badge.md +1 -1
  81. package/dist/generated-docs/bar.md +2 -2
  82. package/dist/generated-docs/chip.md +1 -1
  83. package/dist/generated-docs/input.md +1 -1
  84. package/dist/generated-docs/llms-full.txt +100 -120
  85. package/dist/generated-docs/llms.txt +12 -13
  86. package/dist/generated-docs/manifest.json +52 -65
  87. package/dist/generated-docs/utilities.json +45 -57
  88. package/dist/generated-docs/utilities.md +87 -106
  89. package/dist/os/notification-center.svelte +6 -6
  90. package/dist/os/pane.svelte +7 -5
  91. package/dist/os/taskbar.svelte +10 -10
  92. package/dist/os/toast.svelte +3 -3
  93. package/dist/os/toaster.svelte +1 -1
  94. package/dist/styles/density.css +93 -67
  95. package/dist/styles/index.css +89 -101
  96. package/dist/styles/prose.css +384 -0
  97. package/dist/styles/surfaces/base.css +3 -3
  98. package/dist/styles/surfaces/bevel.css +2 -2
  99. package/dist/ui/accordion/accordion-trigger.svelte +2 -2
  100. package/dist/ui/alert-dialog/alert-dialog-content.svelte +1 -1
  101. package/dist/ui/aspect-ratio/aspect-ratio.svelte +1 -1
  102. package/dist/ui/avatar/avatar-root.svelte +1 -1
  103. package/dist/ui/badge/badge.svelte +1 -1
  104. package/dist/ui/badge/badge.svelte.d.ts +1 -1
  105. package/dist/ui/bar/bar.svelte +23 -15
  106. package/dist/ui/bar/bar.svelte.d.ts +26 -26
  107. package/dist/ui/button/button.svelte +1 -1
  108. package/dist/ui/button/variants.js +18 -18
  109. package/dist/ui/button-group/button-group.svelte +2 -2
  110. package/dist/ui/calendar/calendar-day.svelte +1 -1
  111. package/dist/ui/calendar/calendar-head-cell.svelte +1 -1
  112. package/dist/ui/calendar/calendar-header.svelte +1 -1
  113. package/dist/ui/calendar/calendar-next-button.svelte +1 -1
  114. package/dist/ui/calendar/calendar-prev-button.svelte +1 -1
  115. package/dist/ui/card/card.svelte +5 -5
  116. package/dist/ui/card/card.svelte.d.ts +4 -4
  117. package/dist/ui/checkbox/checkbox.svelte +3 -3
  118. package/dist/ui/chip/chip.svelte +14 -10
  119. package/dist/ui/chip/chip.svelte.d.ts +7 -7
  120. package/dist/ui/code-block/code-block.svelte +6 -6
  121. package/dist/ui/collapsible/collapsible-trigger.svelte +1 -1
  122. package/dist/ui/combobox/combobox-content.svelte +1 -1
  123. package/dist/ui/combobox/combobox-empty.svelte +4 -1
  124. package/dist/ui/combobox/combobox-group-heading.svelte +4 -1
  125. package/dist/ui/combobox/combobox-item.svelte +1 -1
  126. package/dist/ui/combobox/combobox-trigger.svelte +2 -2
  127. package/dist/ui/command/command-group-heading.svelte +4 -1
  128. package/dist/ui/command/command-item.svelte +1 -1
  129. package/dist/ui/command/command-link-item.svelte +1 -1
  130. package/dist/ui/command/command-root.svelte +1 -1
  131. package/dist/ui/command-bar/command-bar.svelte +16 -12
  132. package/dist/ui/context-menu/context-menu-checkbox-item.svelte +1 -1
  133. package/dist/ui/context-menu/context-menu-content.svelte +1 -1
  134. package/dist/ui/context-menu/context-menu-group-heading.svelte +4 -1
  135. package/dist/ui/context-menu/context-menu-item.svelte +1 -1
  136. package/dist/ui/context-menu/context-menu-radio-item.svelte +1 -1
  137. package/dist/ui/context-menu/context-menu-sub-content.svelte +1 -1
  138. package/dist/ui/context-menu/context-menu-sub-trigger.svelte +2 -2
  139. package/dist/ui/copy-button/copy-button.svelte +2 -2
  140. package/dist/ui/cycle/cycle.svelte +1 -1
  141. package/dist/ui/date-field/date-field-segment.svelte +1 -1
  142. package/dist/ui/date-picker/date-picker-content.svelte +1 -1
  143. package/dist/ui/date-picker/date-picker-day.svelte +1 -1
  144. package/dist/ui/date-picker/date-picker-head-cell.svelte +1 -1
  145. package/dist/ui/date-picker/date-picker-header.svelte +1 -1
  146. package/dist/ui/date-picker/date-picker-next-button.svelte +1 -1
  147. package/dist/ui/date-picker/date-picker-prev-button.svelte +1 -1
  148. package/dist/ui/date-picker/date-picker-segment.svelte +1 -1
  149. package/dist/ui/date-picker/date-picker-trigger.svelte +2 -2
  150. package/dist/ui/date-range-field/date-range-field-segment.svelte +1 -1
  151. package/dist/ui/date-range-picker/date-range-picker-content.svelte +1 -1
  152. package/dist/ui/date-range-picker/date-range-picker-day.svelte +1 -1
  153. package/dist/ui/date-range-picker/date-range-picker-head-cell.svelte +1 -1
  154. package/dist/ui/date-range-picker/date-range-picker-header.svelte +1 -1
  155. package/dist/ui/date-range-picker/date-range-picker-next-button.svelte +1 -1
  156. package/dist/ui/date-range-picker/date-range-picker-prev-button.svelte +1 -1
  157. package/dist/ui/date-range-picker/date-range-picker-segment.svelte +1 -1
  158. package/dist/ui/date-range-picker/date-range-picker-trigger.svelte +2 -2
  159. package/dist/ui/dialog/dialog-content.svelte +4 -2
  160. package/dist/ui/dialog/dialog-header.svelte +2 -2
  161. package/dist/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -1
  162. package/dist/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
  163. package/dist/ui/dropdown-menu/dropdown-menu-group-heading.svelte +4 -1
  164. package/dist/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
  165. package/dist/ui/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  166. package/dist/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  167. package/dist/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -2
  168. package/dist/ui/dropdown-menu/dropdown-menu-trigger.svelte +2 -2
  169. package/dist/ui/file-upload/file-upload.svelte +2 -2
  170. package/dist/ui/input/input.svelte +3 -3
  171. package/dist/ui/input/input.svelte.d.ts +1 -1
  172. package/dist/ui/input/textarea.svelte +1 -1
  173. package/dist/ui/input/variants.d.ts +24 -24
  174. package/dist/ui/input/variants.js +9 -9
  175. package/dist/ui/kv/kv.svelte +2 -2
  176. package/dist/ui/link-preview/link-preview-content.svelte +1 -1
  177. package/dist/ui/menubar/menubar-checkbox-item.svelte +1 -1
  178. package/dist/ui/menubar/menubar-content.svelte +1 -1
  179. package/dist/ui/menubar/menubar-group-heading.svelte +4 -1
  180. package/dist/ui/menubar/menubar-item.svelte +1 -1
  181. package/dist/ui/menubar/menubar-radio-item.svelte +1 -1
  182. package/dist/ui/menubar/menubar-root.svelte +1 -1
  183. package/dist/ui/menubar/menubar-sub-content.svelte +1 -1
  184. package/dist/ui/menubar/menubar-sub-trigger.svelte +2 -2
  185. package/dist/ui/menubar/menubar-trigger.svelte +1 -1
  186. package/dist/ui/meter/meter.svelte +1 -1
  187. package/dist/ui/pagination/pagination-next-button.svelte +1 -1
  188. package/dist/ui/pagination/pagination-prev-button.svelte +1 -1
  189. package/dist/ui/pane/pane-close.svelte +2 -2
  190. package/dist/ui/pane/pane-content.svelte +1 -1
  191. package/dist/ui/pane/pane-handle.svelte +3 -3
  192. package/dist/ui/pane/pane-root.svelte +12 -12
  193. package/dist/ui/pane/pane-tab-list.svelte +1 -1
  194. package/dist/ui/pane/pane-tab-panel.svelte +1 -1
  195. package/dist/ui/pane/pane-tab.svelte +1 -1
  196. package/dist/ui/pane/pane.svelte +1 -1
  197. package/dist/ui/pin-input/pin-input-cell.svelte +1 -1
  198. package/dist/ui/popover/popover-content.svelte +1 -1
  199. package/dist/ui/progress/progress.svelte +1 -1
  200. package/dist/ui/radio-group/radio-group-item.svelte +2 -2
  201. package/dist/ui/rating-group/rating-group-item.svelte +1 -1
  202. package/dist/ui/scroll-area/scroll-area-thumb.svelte +1 -1
  203. package/dist/ui/scroll-area/scroll-area.svelte +1 -1
  204. package/dist/ui/select/select-content.svelte +1 -1
  205. package/dist/ui/select/select-group-heading.svelte +4 -1
  206. package/dist/ui/select/select-item.svelte +1 -1
  207. package/dist/ui/select/select-trigger.svelte +2 -2
  208. package/dist/ui/select/select-value.svelte +1 -1
  209. package/dist/ui/sheet/sheet-content.svelte +3 -3
  210. package/dist/ui/sheet/sheet-content.svelte.d.ts +6 -6
  211. package/dist/ui/skeleton/skeleton.svelte +3 -3
  212. package/dist/ui/skeleton/skeleton.svelte.d.ts +9 -9
  213. package/dist/ui/slider/slider-range.svelte +1 -1
  214. package/dist/ui/slider/slider-thumb.svelte +1 -1
  215. package/dist/ui/step/step-content.svelte +1 -1
  216. package/dist/ui/step/step-summary.svelte +6 -6
  217. package/dist/ui/switch/switch.svelte +3 -3
  218. package/dist/ui/table/table-cell.svelte +1 -1
  219. package/dist/ui/table/table-head-cell.svelte +1 -1
  220. package/dist/ui/time-field/time-field-segment.svelte +1 -1
  221. package/dist/ui/time-range-field/time-range-field-segment.svelte +1 -1
  222. package/dist/ui/toggle-group/toggle-group-item.svelte +1 -1
  223. package/dist/ui/tooltip/tooltip-content.svelte +1 -1
  224. package/dist/ui/video-player/video-player.svelte +44 -44
  225. package/dist/utils/index.js +4 -4
  226. package/package.json +2 -1
@@ -0,0 +1,384 @@
1
+ /*
2
+ * NOTE PROSE — the document styling for a TipTap editor on era's tokens.
3
+ *
4
+ * Every rule hangs off `.era-notes-prose`, so it applies to any editor you put
5
+ * that class on: `NoteEditor` sets it itself, and a hand-rolled TipTap instance
6
+ * gets the same typography by adding the class and importing this file.
7
+ *
8
+ * It used to live in note-editor.svelte's <style> block, which made it
9
+ * unreachable: Svelte scopes a component's styles, so the built rule was
10
+ * `.era-notes-prose.svelte-r0lddw` and the class did nothing on anyone else's
11
+ * element. 364 lines of document typography — headings, code blocks with
12
+ * highlight.js tokens, task lists, tables, details, the first-line optical
13
+ * inset — were effectively private to one component. Now they are
14
+ * `@signal9/era-ui/styles/prose`.
15
+ *
16
+ * NoteEditor imports this itself, so mounting it still needs no CSS ceremony.
17
+ * Import it directly only when you are building your own editor.
18
+ *
19
+ * Everything is expressed in era tokens, so a document tracks the density,
20
+ * theme, surface, corners and font axes exactly like the chrome around it.
21
+ */
22
+
23
+ /*
24
+ * TipTap renders headless: the editable element it creates carries `.tiptap`,
25
+ * so every rule here is scoped to that inside this component's wrapper.
26
+ *
27
+ * Vertical rhythm is ONE value — --era-gap, the library's inter-element gap —
28
+ * on every block's bottom margin. A document then breathes at exactly the
29
+ * pace the surrounding chrome does, and loosens with density along with it.
30
+ *
31
+ * Font family is deliberately absent: the [data-font] axis sets it globally
32
+ * (with !important, by design), so anything declared here would either lose
33
+ * or break the axis promise.
34
+ */
35
+ .era-notes-prose .tiptap {
36
+ outline: none;
37
+ min-height: 100%;
38
+ font-size: var(--era-text);
39
+ line-height: 1.6;
40
+ color: var(--color-fg);
41
+
42
+ /*
43
+ * The first line's half-leading is not padding, but it reads as padding.
44
+ *
45
+ * line-height 1.6 puts ~8px of empty box above the first glyph's cap, on
46
+ * top of the container's 8px inset — so the document opened 16px from the
47
+ * top and 8px from the left, an asymmetry that grows with the first
48
+ * block's font size (a note starting with a heading was the worst case).
49
+ *
50
+ * Trimming the block-start to the cap edge makes the ink itself sit on the
51
+ * container's inset, so the first thing you read has the same space above
52
+ * it as beside it, whatever block it happens to be. This is the block half
53
+ * of what era-text-trim does for single-line controls; only the START is
54
+ * trimmed, because the editor scrolls and trimming the end would put the
55
+ * last line's descenders past the scrollable area.
56
+ *
57
+ * Firefox has no text-box yet and keeps the untrimmed leading — the same
58
+ * graceful degradation era-text-trim already ships with.
59
+ */
60
+ text-box-trim: trim-start;
61
+ text-box-edge: cap alphabetic;
62
+ }
63
+
64
+ /* The optical half of the trim. cap trimming is EXACT — the cap sits on the
65
+ * container inset to the pixel — but the LEFT side isn't: glyphs start with
66
+ * their side bearing (~0.07em of ink-free space inside the line box), so a
67
+ * geometrically-equal corner read top-tight. The first block gets that same
68
+ * allowance back as margin, in em so a heading's compensation scales with
69
+ * the heading — the corner then MEASURES slightly uneven and finally LOOKS
70
+ * even, which is the order optics always wins in.
71
+ *
72
+ * 0.22em, not the ~0.07em side-bearing alone: a first line is usually a
73
+ * heavy cap or a heading, and dense ink right at a boundary needs more
74
+ * room than a light vertical stem to feel equally far from it — the same
75
+ * reason display type sets its top margin above geometric equality. Tuned
76
+ * by eye against the left inset. */
77
+ .era-notes-prose .tiptap > :first-child {
78
+ margin-top: 0.22em;
79
+ }
80
+
81
+ /* FALLBACK for engines without text-box (Firefox): the trim above silently
82
+ * disappears there, and the first line opened ~0.47em too low (measured:
83
+ * cap 16.4px from the top against 8px from the left, dense/mono) — the
84
+ * exact asymmetry the trim exists to remove. Approximate the same cut with
85
+ * a negative first-block margin: -0.45em is the first line's half-leading
86
+ * (0.3em at line-height 1.6) plus the ascent-above-cap of the ui stacks
87
+ * (~0.15-0.17em). In em on purpose — it scales with the FIRST BLOCK's own
88
+ * size, so a note opening on an h1 and one opening on a paragraph both
89
+ * land their cap on the container inset, which one padding value could
90
+ * never do for both (the reference terminal app's pt-1 is this same idea,
91
+ * tuned only for paragraphs). The margin collapses up through .tiptap and
92
+ * stops at the scroll container's padding, which is where it should act.
93
+ * Within ~1px of the trimmed geometry; engines with text-box never match
94
+ * this block and keep the exact version. */
95
+ @supports not ((text-box-trim: trim-start) and (text-box-edge: cap alphabetic)) {
96
+ .era-notes-prose .tiptap > :first-child {
97
+ /* -0.45em of untrimmed leading, plus the same +0.22em optical
98
+ * allowance the trimmed path adds above. */
99
+ margin-top: -0.23em;
100
+ }
101
+ }
102
+
103
+ /* Placeholder, via @tiptap/extension-placeholder */
104
+ .era-notes-prose .tiptap p.is-editor-empty:first-child::before {
105
+ content: attr(data-placeholder);
106
+ float: left;
107
+ height: 0;
108
+ color: var(--color-muted);
109
+ pointer-events: none;
110
+ }
111
+
112
+ /* Typography */
113
+ .era-notes-prose .tiptap p {
114
+ margin: 0 0 var(--era-gap);
115
+ }
116
+ .era-notes-prose .tiptap p:last-child {
117
+ margin-bottom: 0;
118
+ }
119
+ .era-notes-prose .tiptap h1 {
120
+ font-size: 1.5em;
121
+ }
122
+ .era-notes-prose .tiptap h2 {
123
+ font-size: 1.25em;
124
+ }
125
+ .era-notes-prose .tiptap h3 {
126
+ font-size: 1.1em;
127
+ }
128
+ .era-notes-prose .tiptap h1,
129
+ .era-notes-prose .tiptap h2,
130
+ .era-notes-prose .tiptap h3 {
131
+ margin: 0 0 var(--era-gap);
132
+ font-weight: 600;
133
+ line-height: 1.6;
134
+ color: var(--color-bright);
135
+ }
136
+ .era-notes-prose .tiptap strong {
137
+ font-weight: 600;
138
+ color: var(--color-bright);
139
+ }
140
+ .era-notes-prose .tiptap em {
141
+ font-style: italic;
142
+ }
143
+ .era-notes-prose .tiptap s {
144
+ text-decoration: line-through;
145
+ text-decoration-thickness: 0.5px;
146
+ }
147
+
148
+ /* Code — inline chips take the xxs radius, blocks the lg one a Card uses. */
149
+ .era-notes-prose .tiptap code {
150
+ padding: 1px var(--era-inset-pill);
151
+ border-radius: var(--era-rd-pill);
152
+ background: var(--era-surface-bg-elevated);
153
+ }
154
+ .era-notes-prose .tiptap pre {
155
+ overflow-x: auto;
156
+ margin: 0 0 var(--era-gap);
157
+ padding: var(--era-inset-control);
158
+ border-radius: var(--era-rd-bar);
159
+ background: var(--color-surface);
160
+ box-shadow: var(--era-shadow);
161
+ }
162
+ .era-notes-prose .tiptap pre code {
163
+ padding: 0;
164
+ border-radius: 0;
165
+ background: transparent;
166
+ }
167
+
168
+ /* Syntax highlighting — the neutral scale, so it themes with everything else. */
169
+ .era-notes-prose .tiptap pre .hljs-keyword,
170
+ .era-notes-prose .tiptap pre .hljs-built_in {
171
+ color: var(--color-9);
172
+ }
173
+ .era-notes-prose .tiptap pre .hljs-string,
174
+ .era-notes-prose .tiptap pre .hljs-regexp {
175
+ color: var(--color-10);
176
+ }
177
+ .era-notes-prose .tiptap pre .hljs-number,
178
+ .era-notes-prose .tiptap pre .hljs-literal,
179
+ .era-notes-prose .tiptap pre .hljs-type,
180
+ .era-notes-prose .tiptap pre .hljs-class {
181
+ color: var(--color-11);
182
+ }
183
+ .era-notes-prose .tiptap pre .hljs-comment {
184
+ color: var(--color-8);
185
+ }
186
+ .era-notes-prose .tiptap pre .hljs-function,
187
+ .era-notes-prose .tiptap pre .hljs-title {
188
+ font-weight: 600;
189
+ color: var(--color-9);
190
+ }
191
+ .era-notes-prose .tiptap pre .hljs-variable,
192
+ .era-notes-prose .tiptap pre .hljs-attr {
193
+ color: var(--color-12);
194
+ }
195
+ .era-notes-prose .tiptap pre .hljs-params {
196
+ color: var(--color-11);
197
+ }
198
+ .era-notes-prose .tiptap pre .hljs-meta,
199
+ .era-notes-prose .tiptap pre .hljs-tag {
200
+ color: var(--color-10);
201
+ }
202
+
203
+ /* Blockquote */
204
+ .era-notes-prose .tiptap blockquote {
205
+ margin: 0 0 var(--era-gap);
206
+ padding-left: var(--era-inset-control);
207
+ border-left: 2px solid var(--era-divider-color);
208
+ color: var(--color-muted);
209
+ }
210
+
211
+ /* Lists */
212
+ .era-notes-prose .tiptap li,
213
+ .era-notes-prose .tiptap li p,
214
+ .era-notes-prose .tiptap ul,
215
+ .era-notes-prose .tiptap ol {
216
+ margin: 0;
217
+ }
218
+ .era-notes-prose .tiptap ul {
219
+ padding-left: 1.4em;
220
+ list-style-type: disc;
221
+ }
222
+ .era-notes-prose .tiptap ol {
223
+ padding-left: 1.9em;
224
+ list-style-type: decimal;
225
+ }
226
+
227
+ /* Task list — a checkbox styled like era's Checkbox, at the icon tier. */
228
+ .era-notes-prose .tiptap .task-list {
229
+ padding-left: 0;
230
+ list-style: none;
231
+ }
232
+ .era-notes-prose .tiptap .task-item {
233
+ display: flex;
234
+ gap: var(--era-gap);
235
+ }
236
+ .era-notes-prose .tiptap .task-item label {
237
+ /* Match the line box so the box centres against the first line of text. */
238
+ display: flex;
239
+ align-items: center;
240
+ height: calc(var(--era-text) * 1.6);
241
+ }
242
+ .era-notes-prose .tiptap .task-item input[type='checkbox'] {
243
+ flex-shrink: 0;
244
+ width: calc(var(--era-h-icon) - 4px);
245
+ height: calc(var(--era-h-icon) - 4px);
246
+ border-radius: var(--era-rd-icon);
247
+ background: var(--era-surface-bg-elevated);
248
+ box-shadow: var(--era-shadow-well);
249
+ appearance: none;
250
+ cursor: pointer;
251
+ transition:
252
+ background var(--era-duration) var(--era-ease),
253
+ box-shadow var(--era-duration) var(--era-ease);
254
+ }
255
+ .era-notes-prose .tiptap .task-item input[type='checkbox']:hover {
256
+ background: var(--era-highlight);
257
+ }
258
+ .era-notes-prose .tiptap .task-item input[type='checkbox']:checked {
259
+ background: var(--color-primary);
260
+ box-shadow: var(--era-shadow-pressed);
261
+ }
262
+ .era-notes-prose .tiptap .task-item[data-checked='true'] > div > p {
263
+ color: var(--color-muted);
264
+ text-decoration: line-through;
265
+ }
266
+
267
+ /* Horizontal rule */
268
+ .era-notes-prose .tiptap hr {
269
+ margin: var(--era-gap) 0;
270
+ border: none;
271
+ border-top: 1px solid var(--era-divider-color);
272
+ }
273
+
274
+ /* Links — the era-link recipe, inlined because ProseMirror owns this DOM. */
275
+ .era-notes-prose .tiptap a {
276
+ color: var(--color-link);
277
+ text-decoration-line: underline;
278
+ text-decoration-color: color-mix(in oklch, currentColor 30%, transparent);
279
+ text-underline-offset: 0.2em;
280
+ cursor: pointer;
281
+ transition: text-decoration-color var(--era-duration) var(--era-ease);
282
+ }
283
+ .era-notes-prose .tiptap a:hover {
284
+ text-decoration-color: currentColor;
285
+ }
286
+
287
+ /* Highlight — the warning token PAIR, not a wash of it.
288
+ *
289
+ * This was a 25% warning tint with `color: inherit`, which is two problems at
290
+ * once: at 25% the mark barely separates from the page, and pushing the alpha
291
+ * up to fix that puts light body text on yellow, which is worse. The pair
292
+ * exists for exactly this — warning-fg is dark in EVERY mode by design
293
+ * (see themes.css: yellow cannot carry light text), so a solid fill reads as
294
+ * a real highlighter and the text on it stays legible in both modes. */
295
+ .era-notes-prose .tiptap mark {
296
+ padding: 1px 0;
297
+ background: var(--color-warning);
298
+ color: var(--color-warning-fg);
299
+ }
300
+
301
+ /* Table */
302
+ .era-notes-prose .tiptap .note-table {
303
+ width: 100%;
304
+ margin: 0 0 var(--era-gap);
305
+ border-collapse: collapse;
306
+ table-layout: fixed;
307
+ }
308
+ .era-notes-prose .tiptap .note-table td,
309
+ .era-notes-prose .tiptap .note-table th {
310
+ padding: var(--era-inset-chip) var(--era-inset-control);
311
+ border: 1px solid var(--era-divider-color);
312
+ text-align: left;
313
+ vertical-align: top;
314
+ }
315
+ .era-notes-prose .tiptap .note-table th {
316
+ background: var(--color-surface);
317
+ font-weight: 600;
318
+ color: var(--color-bright);
319
+ }
320
+ .era-notes-prose .tiptap .note-table td > p,
321
+ .era-notes-prose .tiptap .note-table th > p {
322
+ margin: 0;
323
+ }
324
+
325
+ /* Details (collapsible) */
326
+ .era-notes-prose .tiptap details {
327
+ margin: 0 0 var(--era-gap);
328
+ padding: var(--era-inset-chip) var(--era-inset-control);
329
+ border-radius: var(--era-rd-control);
330
+ background: var(--era-surface-bg-elevated);
331
+ box-shadow: var(--era-shadow);
332
+ }
333
+ .era-notes-prose .tiptap details summary {
334
+ font-weight: 600;
335
+ color: var(--color-bright);
336
+ cursor: pointer;
337
+ }
338
+ .era-notes-prose .tiptap details > div {
339
+ margin-top: var(--era-gap);
340
+ }
341
+
342
+ /* Image */
343
+ .era-notes-prose .tiptap img {
344
+ max-width: 100%;
345
+ height: auto;
346
+ border-radius: var(--era-rd-control);
347
+ }
348
+
349
+ /*
350
+ * ProseMirror ships hardcoded selection colours (#8cf outlines, a black gap
351
+ * cursor, rgba(200,200,255,.4) cell selection, #adf resize handles). Each is
352
+ * overridden here or the editor shows chrome from a different design system.
353
+ */
354
+ .era-notes-prose .tiptap .ProseMirror-selectednode {
355
+ outline: 2px solid var(--color-primary);
356
+ }
357
+ .era-notes-prose .tiptap li.ProseMirror-selectednode {
358
+ outline: none;
359
+ }
360
+ .era-notes-prose .tiptap li.ProseMirror-selectednode::after {
361
+ border-color: var(--color-primary);
362
+ }
363
+ .era-notes-prose .ProseMirror-gapcursor::after {
364
+ border-top-color: var(--color-primary);
365
+ }
366
+ .era-notes-prose .tiptap .selectedCell::after {
367
+ background: var(--era-highlight);
368
+ }
369
+ .era-notes-prose .tiptap .column-resize-handle {
370
+ background-color: var(--color-primary);
371
+ }
372
+ /* NO ::selection rule here, deliberately.
373
+ *
374
+ * era owns text selection as a surface token contract — --era-selection-bg /
375
+ * -fg / -shadow (surfaces/base.css), which is how flat gets inverse video,
376
+ * glass a glowing wash, and bevel an opaque accent bar. This file used to
377
+ * override it with `background: var(--color-4)` and no `color`, which threw
378
+ * all of that away AND left body text on a mid-scale grey: the band barely
379
+ * separated from the page and the glyphs sat on top of it at whatever
380
+ * contrast happened to fall out. Dropping the override restores both the
381
+ * contrast (bright fill, --color-1 glyphs) and the per-surface treatment.
382
+ *
383
+ * The ProseMirror overrides above are still needed — those replace hardcoded
384
+ * library chrome that no era token would otherwise reach. */
@@ -161,7 +161,7 @@
161
161
 
162
162
  /* Concentric radius for a row inside a panel: the panel's radius minus its
163
163
  * inset. Declared on the universal selector (like the density ladder) so it
164
- * re-derives against each element's own --era-rd-md — density subtree
164
+ * re-derives against each element's own --era-rd-control — density subtree
165
165
  * overrides stay correct.
166
166
  *
167
167
  * NO SURFACE GATE. This used to be multiplied by --era-item-rd-scale, which
@@ -172,13 +172,13 @@
172
172
  * owns radii, globally, with no exceptions for a consumer to discover.
173
173
  *
174
174
  * The gate was also redundant. The formula already answers both axes on its
175
- * own: at data-corners="square" --era-rd-md collapses to 0, so this collapses
175
+ * own: at data-corners="square" --era-rd-control collapses to 0, so this collapses
176
176
  * with it; on flat --era-panel-inset is 0, so a flush full-width row simply
177
177
  * takes the panel's own radius — which is the concentric answer for a row
178
178
  * whose panel has no frame to nest inside. Flat menus keep their flush,
179
179
  * full-width rows; only the highlight's corners now follow the axis. */
180
180
  * {
181
- --era-item-rd: max(0px, calc(var(--era-rd-md) - var(--era-panel-inset)));
181
+ --era-item-rd: max(0px, calc(var(--era-rd-control) - var(--era-panel-inset)));
182
182
  }
183
183
 
184
184
  /*
@@ -110,8 +110,8 @@
110
110
  /*
111
111
  * SMALL-BUTTON SINK — the depression, scaled to the keycap.
112
112
  *
113
- * The 1px content sink is tuned for a default (h-md) button, where it is ~4% of
114
- * the box. On the h-xs tier — size="xs" and size="icon", the 14px squares a
113
+ * The 1px content sink is tuned for a default (h-control) button, where it is ~4% of
114
+ * the box. On the h-icon tier — size="xs" and size="icon", the 14px squares a
115
115
  * pane's close X is built from — that same 1px is ~7% of the box and the glyph,
116
116
  * which fills the button, visibly drops too far on press. Half the sink
117
117
  * (proportional: 14/24 ≈ 0.58, rounded to 0.5) puts the small keycap's travel
@@ -14,11 +14,11 @@
14
14
  <Accordion.Trigger
15
15
  bind:ref
16
16
  class={cn(
17
- 'flex h-(--era-h-md) w-full items-center justify-between gap-(--era-xs-inset-sm) rounded-(--era-rd-md) px-(--era-inset-md) text-body text-fg hover:bg-(--era-highlight) hover:shadow-(--era-highlight-shadow) focus:outline-none disabled:opacity-50',
17
+ 'flex h-(--era-h-control) w-full items-center justify-between gap-(--era-icon-inset-chip) rounded-(--era-rd-control) px-(--era-inset-control) text-body text-fg hover:bg-(--era-highlight) hover:shadow-(--era-highlight-shadow) focus:outline-none disabled:opacity-50',
18
18
  className
19
19
  )}
20
20
  {...restProps}
21
21
  >
22
22
  {@render children?.()}
23
- <ChevronDown class="size-(--era-h-xs) text-muted" />
23
+ <ChevronDown class="size-(--era-h-icon) text-muted" />
24
24
  </Accordion.Trigger>
@@ -15,7 +15,7 @@
15
15
  <AlertDialog.Content
16
16
  bind:ref
17
17
  class={cn(
18
- 'fixed top-1/2 left-1/2 z-50 flex w-full max-w-md -translate-x-1/2 -translate-y-1/2 flex-col gap-(--era-gap) rounded-(--era-rd-lg) border border-divider bg-(--era-surface-bg) p-(--era-pad-md) shadow-(--era-shadow-lg) glass-blur',
18
+ 'fixed top-1/2 left-1/2 z-50 flex w-full max-w-md -translate-x-1/2 -translate-y-1/2 flex-col gap-(--era-gap) rounded-(--era-rd-bar) border border-divider bg-(--era-surface-bg) p-(--era-pad-card) shadow-(--era-shadow-lg) glass-blur',
19
19
  className
20
20
  )}
21
21
  {...restProps}
@@ -12,7 +12,7 @@
12
12
 
13
13
  <AspectRatio.Root
14
14
  bind:ref
15
- class={cn('overflow-hidden rounded-(--era-rd-md)', className)}
15
+ class={cn('overflow-hidden rounded-(--era-rd-control)', className)}
16
16
  {...restProps}
17
17
  >
18
18
  {@render children?.()}
@@ -13,7 +13,7 @@
13
13
  <Avatar.Root
14
14
  bind:ref
15
15
  class={cn(
16
- 'inline-flex size-(--era-h-md) shrink-0 items-center justify-center overflow-hidden rounded-full bg-(--era-surface-bg-elevated) text-fg shadow-(--era-shadow)',
16
+ 'inline-flex size-(--era-h-control) shrink-0 items-center justify-center overflow-hidden rounded-full bg-(--era-surface-bg-elevated) text-fg shadow-(--era-shadow)',
17
17
  className
18
18
  )}
19
19
  {...restProps}
@@ -19,7 +19,7 @@
19
19
  // that cost. A badge holding an icon must stay flex to lay the icon out
20
20
  // beside the text, and keeps the general trim — its line-height:1 plus
21
21
  // flex centring, which is the best available when the text is anonymous.
22
- base: 'inline-flex h-(--era-h-xxs) min-w-(--era-h-xxs) shrink-0 items-center justify-center gap-(--era-gap) rounded-(--era-rd-xxs) px-(--era-pill-xxs) font-mono text-body leading-none whitespace-nowrap has-[svg]:gap-(--era-inset-xxs) era-text-trim not-has-[svg]:era-token-ink',
22
+ base: 'inline-flex h-(--era-h-pill) min-w-(--era-h-pill) shrink-0 items-center justify-center gap-(--era-gap) rounded-(--era-rd-pill) px-(--era-pill-px) font-mono text-body leading-none whitespace-nowrap has-[svg]:gap-(--era-inset-pill) era-text-trim not-has-[svg]:era-token-ink',
23
23
  variants: {
24
24
  tone: {
25
25
  default: 'bg-fill text-fg',
@@ -6,7 +6,7 @@ export declare const badgeVariants: import("tailwind-variants").TVReturnType<{
6
6
  success: "bg-success text-success-fg";
7
7
  warning: "bg-warning text-warning-fg";
8
8
  };
9
- }, undefined, "inline-flex h-(--era-h-xxs) min-w-(--era-h-xxs) shrink-0 items-center justify-center gap-(--era-gap) rounded-(--era-rd-xxs) px-(--era-pill-xxs) font-mono text-body leading-none whitespace-nowrap has-[svg]:gap-(--era-inset-xxs) era-text-trim not-has-[svg]:era-token-ink", {
9
+ }, undefined, "inline-flex h-(--era-h-pill) min-w-(--era-h-pill) shrink-0 items-center justify-center gap-(--era-gap) rounded-(--era-rd-pill) px-(--era-pill-px) font-mono text-body leading-none whitespace-nowrap has-[svg]:gap-(--era-inset-pill) era-text-trim not-has-[svg]:era-token-ink", {
10
10
  tone: {
11
11
  default: "bg-fill text-fg";
12
12
  accent: "bg-primary text-primary-fg";
@@ -13,9 +13,9 @@
13
13
  base: 'flex items-center era-text-trim',
14
14
  variants: {
15
15
  size: {
16
- sm: 'h-(--era-h-sm) rounded-(--era-rd-sm)',
17
- md: 'h-(--era-h-md) rounded-(--era-rd-md)',
18
- lg: 'h-(--era-h-lg) rounded-(--era-rd-lg)'
16
+ sm: 'h-(--era-h-chip) rounded-(--era-rd-chip)',
17
+ md: 'h-(--era-h-control) rounded-(--era-rd-control)',
18
+ lg: 'h-(--era-h-bar) rounded-(--era-rd-bar)'
19
19
  },
20
20
  /**
21
21
  * The tier of the CONTROLS inside, because that is what the bar's own
@@ -25,14 +25,14 @@
25
25
  * had each restated the two-tier value by hand, and the geometry spec had
26
26
  * been rewritten twice chasing which token they were restating.
27
27
  *
28
- * - `tier` (default) — one tier smaller, the pairing above. smxs, mdsm
29
- * and lgmd all equal sp/2, which is why one token covers every size.
30
- * - `xxs` — the compact pairing: xxs pills and fields (a filter beside an
28
+ * - `tier` (default) — one tier smaller, the pairing above. chipicon, controlchip
29
+ * and barcontrol all equal sp/2, which is why one token covers every size.
30
+ * - `pill` — the compact pairing: pills and fields (a filter beside an
31
31
  * xxs icon button, a title bar). Two tiers down, so the inset differs
32
32
  * per size and comes from the compounds below.
33
33
  */
34
34
  content: {
35
- tier: 'gap-(--era-xs-inset-sm) px-(--era-xs-inset-sm)',
35
+ tier: 'gap-(--era-icon-inset-chip) px-(--era-icon-inset-chip)',
36
36
  xxs: ''
37
37
  },
38
38
  /**
@@ -54,18 +54,26 @@
54
54
  * both. Collapses to flat in square mode like every radius.
55
55
  */
56
56
  divider: {
57
- true: 'shrink-0 rounded-t-none rounded-b-(--era-rd-md) [box-shadow:0_1px_0_var(--color-divider-faded)]',
57
+ true: 'shrink-0 rounded-t-none rounded-b-(--era-rd-control) [box-shadow:0_1px_0_var(--color-divider-faded)]',
58
58
  false: ''
59
59
  }
60
60
  },
61
61
  compoundVariants: [
62
- // mdxxs = (3sp − sp − 10)/2 — the named token.
63
- { size: 'md', content: 'xxs', class: 'gap-(--era-xxs-inset-md) px-(--era-xxs-inset-md)' },
64
- // sm ⊃ xxs — its own token, not the text inset it used to borrow. The two
62
+ // controlpill = (3sp − sp − 10)/2 — the named token.
63
+ {
64
+ size: 'md',
65
+ content: 'xxs',
66
+ class: 'gap-(--era-pill-inset-control) px-(--era-pill-inset-control)'
67
+ },
68
+ // chip ⊃ pill — its own token, not the text inset it used to borrow. The two
65
69
  // were the same number only while type was 14px at every density; dense's
66
- // 12px broke the tie and left this pairing a pixel wide. (lgxxs has no
70
+ // 12px broke the tie and left this pairing a pixel wide. (barpill has no
67
71
  // token because nothing pairs a page header with pill-tier controls.)
68
- { size: 'sm', content: 'xxs', class: 'gap-(--era-xxs-inset-sm) px-(--era-xxs-inset-sm)' }
72
+ {
73
+ size: 'sm',
74
+ content: 'xxs',
75
+ class: 'gap-(--era-pill-inset-chip) px-(--era-pill-inset-chip)'
76
+ }
69
77
  ],
70
78
  defaultVariants: { size: 'lg', content: 'tier', divider: false }
71
79
  });
@@ -89,8 +97,8 @@
89
97
  size?: 'sm' | 'md' | 'lg';
90
98
  /**
91
99
  * Tier of the controls inside — drives the bar's padding and gap so they
92
- * stay concentric to them. `tier` (default) is one tier smaller; `xxs` is
93
- * the compact pairing (xxs pills/fields in an sm or md bar).
100
+ * stay concentric to them. `tier` (default) is one tier smaller; `pill` is
101
+ * the compact pairing (pills/fields in an sm or md bar).
94
102
  */
95
103
  content?: 'tier' | 'xxs';
96
104
  /** The flush cap-a-panel chrome: outset divider below, bottom rd-md. */