@signal9/era-ui 10.0.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/dist/ai/actions/actions.svelte +1 -1
  2. package/dist/ai/artifact/artifact-actions.svelte +1 -1
  3. package/dist/ai/artifact/artifact-close.svelte +1 -1
  4. package/dist/ai/artifact/artifact-content.svelte +1 -1
  5. package/dist/ai/artifact/artifact-header.svelte +1 -1
  6. package/dist/ai/artifact/artifact.svelte +1 -4
  7. package/dist/ai/chain-of-thought/chain-of-thought-step.svelte +3 -3
  8. package/dist/ai/chain-of-thought/chain-of-thought.svelte +1 -1
  9. package/dist/ai/checkpoint.svelte +2 -2
  10. package/dist/ai/confirmation/confirmation-actions.svelte +1 -1
  11. package/dist/ai/confirmation/confirmation-args.svelte +4 -4
  12. package/dist/ai/confirmation/confirmation.svelte +5 -8
  13. package/dist/ai/context/context.svelte +3 -3
  14. package/dist/ai/conversation/conversation-content.svelte +1 -4
  15. package/dist/ai/conversation/conversation-empty-state.svelte +1 -1
  16. package/dist/ai/conversation/conversation-scroll-button.svelte +3 -3
  17. package/dist/ai/conversations/conversations-group.svelte +2 -2
  18. package/dist/ai/conversations/conversations-item.svelte +8 -8
  19. package/dist/ai/conversations/conversations-root.svelte +2 -2
  20. package/dist/ai/error-panel/error-panel.svelte +7 -7
  21. package/dist/ai/image.svelte +1 -1
  22. package/dist/ai/index.js +1 -1
  23. package/dist/ai/inline-citation/inline-citation.svelte +5 -5
  24. package/dist/ai/loader.svelte +1 -4
  25. package/dist/ai/message/message-branch-selector.svelte +3 -3
  26. package/dist/ai/message/message-branch.svelte +1 -1
  27. package/dist/ai/message/message-content.svelte +1 -1
  28. package/dist/ai/message/message-toolbar.svelte +1 -1
  29. package/dist/ai/message/message-usage.svelte +5 -7
  30. package/dist/ai/message/message.svelte +1 -1
  31. package/dist/ai/model-selector/model-selector.svelte +2 -2
  32. package/dist/ai/open-in-chat/open-in-chat.svelte +2 -2
  33. package/dist/ai/plan/plan-content.svelte +1 -1
  34. package/dist/ai/plan/plan-header.svelte +2 -2
  35. package/dist/ai/plan/plan.svelte +1 -4
  36. package/dist/ai/prompt-input/prompt-input-add-attachments.svelte +1 -1
  37. package/dist/ai/prompt-input/prompt-input-attachments.svelte +5 -5
  38. package/dist/ai/prompt-input/prompt-input-submit.svelte +2 -2
  39. package/dist/ai/prompt-input/prompt-input-textarea.svelte +2 -2
  40. package/dist/ai/prompt-input/prompt-input-toolbar.svelte +1 -1
  41. package/dist/ai/prompt-input/prompt-input.svelte +1 -1
  42. package/dist/ai/queue/queue-item.svelte +1 -1
  43. package/dist/ai/queue/queue.svelte +1 -1
  44. package/dist/ai/reasoning/reasoning-trigger.svelte +1 -1
  45. package/dist/ai/response/response.svelte +1 -1
  46. package/dist/ai/run-status/run-status.svelte +7 -11
  47. package/dist/ai/runtime-feed/runtime-feed-item.svelte +1 -4
  48. package/dist/ai/runtime-feed/runtime-feed-root.svelte +1 -1
  49. package/dist/ai/sources/source.svelte +2 -2
  50. package/dist/ai/sources/sources-trigger.svelte +1 -1
  51. package/dist/ai/structured-value/structured-value.svelte +4 -4
  52. package/dist/ai/suggestion/suggestion.svelte +1 -1
  53. package/dist/ai/suggestion/suggestions.svelte +1 -1
  54. package/dist/ai/swarm/swarm-agent.svelte +3 -3
  55. package/dist/ai/swarm/swarm-artifact.svelte +2 -2
  56. package/dist/ai/swarm/swarm-barrier.svelte +3 -3
  57. package/dist/ai/swarm/swarm-barriers.svelte +1 -4
  58. package/dist/ai/swarm/swarm-counts.svelte +2 -2
  59. package/dist/ai/swarm/swarm-footer.svelte +4 -3
  60. package/dist/ai/swarm/swarm-grid.svelte +2 -2
  61. package/dist/ai/swarm/swarm-header.svelte +2 -2
  62. package/dist/ai/swarm/swarm-node.svelte +7 -9
  63. package/dist/ai/swarm/swarm-role.svelte +6 -3
  64. package/dist/ai/swarm/swarm-root.svelte +1 -4
  65. package/dist/ai/swarm/swarm-sandbox.svelte +4 -7
  66. package/dist/ai/swarm/swarm-tree.svelte +2 -2
  67. package/dist/ai/task/task-content.svelte +1 -4
  68. package/dist/ai/task/task-trigger.svelte +1 -1
  69. package/dist/ai/tool/tool-chip.svelte +3 -3
  70. package/dist/ai/tool/tool-chips.svelte +3 -3
  71. package/dist/ai/tool/tool-exec.svelte +4 -4
  72. package/dist/ai/tool/tool-header.svelte +1 -1
  73. package/dist/ai/web-preview/web-preview.svelte +4 -9
  74. package/dist/ai/workflow/canvas.svelte +1 -1
  75. package/dist/ai/workflow/node.svelte +3 -3
  76. package/dist/apps/index.d.ts +3 -3
  77. package/dist/apps/index.js +3 -3
  78. package/dist/apps/llm-shell/llm-shell.svelte +4 -4
  79. package/dist/apps/notes/editor/slash-menu.svelte +2 -4
  80. package/dist/apps/notes/notes.svelte +8 -8
  81. package/dist/dev/audit/audits/anonymous-text.d.ts +2 -0
  82. package/dist/dev/audit/audits/anonymous-text.js +73 -0
  83. package/dist/dev/audit/audits/even-container-padding.js +2 -2
  84. package/dist/dev/audit/audits/index.d.ts +2 -1
  85. package/dist/dev/audit/audits/index.js +3 -1
  86. package/dist/dev/audit/audits/single-glyph-square.js +2 -2
  87. package/dist/dev/audit/types.d.ts +1 -1
  88. package/dist/dev/audit-overlay.svelte +7 -7
  89. package/dist/docs/css-utilities.d.ts +31 -0
  90. package/dist/docs/css-utilities.js +142 -8
  91. package/dist/docs/llms-txt.js +2 -2
  92. package/dist/docs/notes.md +3 -3
  93. package/dist/docs/quickstart.md +5 -5
  94. package/dist/era-ui.css +1 -1
  95. package/dist/generated-docs/llms-full.txt +455 -110
  96. package/dist/generated-docs/llms.txt +29 -14
  97. package/dist/generated-docs/manifest.json +382 -55
  98. package/dist/generated-docs/notes.md +3 -3
  99. package/dist/generated-docs/utilities.json +359 -45
  100. package/dist/generated-docs/utilities.md +423 -93
  101. package/dist/os/notification-center.svelte +11 -17
  102. package/dist/os/pane-manager.svelte.d.ts +1 -1
  103. package/dist/os/pane.svelte +4 -6
  104. package/dist/os/taskbar.svelte +13 -18
  105. package/dist/os/toast.svelte +6 -11
  106. package/dist/os/toaster.svelte +1 -1
  107. package/dist/styles/density.css +0 -2
  108. package/dist/styles/index.css +160 -84
  109. package/dist/ui/accordion/accordion-content.svelte +1 -1
  110. package/dist/ui/accordion/accordion-trigger.svelte +2 -2
  111. package/dist/ui/alert-dialog/alert-dialog-content.svelte +2 -2
  112. package/dist/ui/alert-dialog/alert-dialog-overlay.svelte +1 -1
  113. package/dist/ui/aspect-ratio/aspect-ratio.svelte +1 -5
  114. package/dist/ui/avatar/avatar-fallback.svelte +1 -1
  115. package/dist/ui/avatar/avatar-root.svelte +1 -1
  116. package/dist/ui/badge/badge.svelte +1 -1
  117. package/dist/ui/badge/badge.svelte.d.ts +1 -1
  118. package/dist/ui/bar/bar.svelte +8 -8
  119. package/dist/ui/bar/bar.svelte.d.ts +16 -16
  120. package/dist/ui/button/button.svelte +13 -2
  121. package/dist/ui/button/variants.d.ts +4 -4
  122. package/dist/ui/button/variants.js +18 -18
  123. package/dist/ui/button-group/button-group.svelte +2 -2
  124. package/dist/ui/calendar/calendar-day.svelte +1 -1
  125. package/dist/ui/calendar/calendar-grid-row.svelte +1 -1
  126. package/dist/ui/calendar/calendar-grid.svelte +1 -1
  127. package/dist/ui/calendar/calendar-head-cell.svelte +1 -1
  128. package/dist/ui/calendar/calendar-header.svelte +1 -1
  129. package/dist/ui/calendar/calendar-next-button.svelte +1 -1
  130. package/dist/ui/calendar/calendar-prev-button.svelte +1 -1
  131. package/dist/ui/calendar/calendar-root.svelte +1 -1
  132. package/dist/ui/card/card.svelte +10 -10
  133. package/dist/ui/card/card.svelte.d.ts +16 -16
  134. package/dist/ui/checkbox/checkbox-group.svelte +1 -1
  135. package/dist/ui/checkbox/checkbox.svelte +1 -1
  136. package/dist/ui/chip/chip.svelte +15 -7
  137. package/dist/ui/chip/chip.svelte.d.ts +7 -7
  138. package/dist/ui/code-block/code-block.svelte +3 -9
  139. package/dist/ui/collapsible/collapsible-trigger.svelte +1 -1
  140. package/dist/ui/combobox/combobox-content.svelte +1 -1
  141. package/dist/ui/combobox/combobox-empty.svelte +1 -6
  142. package/dist/ui/combobox/combobox-group-heading.svelte +1 -4
  143. package/dist/ui/combobox/combobox-input.svelte +1 -1
  144. package/dist/ui/combobox/combobox-item.svelte +1 -1
  145. package/dist/ui/combobox/combobox-trigger.svelte +2 -2
  146. package/dist/ui/command/command-group-heading.svelte +1 -4
  147. package/dist/ui/command/command-group-items.svelte +1 -5
  148. package/dist/ui/command/command-item.svelte +1 -1
  149. package/dist/ui/command/command-link-item.svelte +1 -1
  150. package/dist/ui/command/command-root.svelte +2 -2
  151. package/dist/ui/command/command-viewport.svelte +1 -1
  152. package/dist/ui/command-bar/command-bar.svelte +9 -13
  153. package/dist/ui/context-menu/context-menu-checkbox-item.svelte +1 -1
  154. package/dist/ui/context-menu/context-menu-content.svelte +2 -2
  155. package/dist/ui/context-menu/context-menu-group-heading.svelte +1 -4
  156. package/dist/ui/context-menu/context-menu-item.svelte +1 -1
  157. package/dist/ui/context-menu/context-menu-radio-item.svelte +1 -1
  158. package/dist/ui/context-menu/context-menu-sub-content.svelte +1 -1
  159. package/dist/ui/context-menu/context-menu-sub-trigger.svelte +2 -2
  160. package/dist/ui/copy-button/copy-button.svelte +2 -2
  161. package/dist/ui/cycle/cycle.svelte +2 -2
  162. package/dist/ui/date-field/date-field-segment.svelte +1 -1
  163. package/dist/ui/date-picker/date-picker-calendar.svelte +1 -1
  164. package/dist/ui/date-picker/date-picker-content.svelte +1 -4
  165. package/dist/ui/date-picker/date-picker-day.svelte +1 -1
  166. package/dist/ui/date-picker/date-picker-grid-row.svelte +1 -1
  167. package/dist/ui/date-picker/date-picker-grid.svelte +1 -1
  168. package/dist/ui/date-picker/date-picker-head-cell.svelte +1 -1
  169. package/dist/ui/date-picker/date-picker-header.svelte +1 -1
  170. package/dist/ui/date-picker/date-picker-next-button.svelte +1 -1
  171. package/dist/ui/date-picker/date-picker-prev-button.svelte +1 -1
  172. package/dist/ui/date-picker/date-picker-segment.svelte +1 -1
  173. package/dist/ui/date-picker/date-picker-trigger.svelte +2 -2
  174. package/dist/ui/date-range-field/date-range-field-segment.svelte +1 -1
  175. package/dist/ui/date-range-picker/date-range-picker-calendar.svelte +1 -1
  176. package/dist/ui/date-range-picker/date-range-picker-content.svelte +1 -4
  177. package/dist/ui/date-range-picker/date-range-picker-day.svelte +1 -1
  178. package/dist/ui/date-range-picker/date-range-picker-grid-row.svelte +1 -1
  179. package/dist/ui/date-range-picker/date-range-picker-grid.svelte +1 -5
  180. package/dist/ui/date-range-picker/date-range-picker-head-cell.svelte +1 -1
  181. package/dist/ui/date-range-picker/date-range-picker-header.svelte +1 -1
  182. package/dist/ui/date-range-picker/date-range-picker-next-button.svelte +1 -1
  183. package/dist/ui/date-range-picker/date-range-picker-prev-button.svelte +1 -1
  184. package/dist/ui/date-range-picker/date-range-picker-segment.svelte +1 -1
  185. package/dist/ui/date-range-picker/date-range-picker-trigger.svelte +2 -2
  186. package/dist/ui/dialog/dialog-content.svelte +3 -5
  187. package/dist/ui/dialog/dialog-header.svelte +1 -6
  188. package/dist/ui/dialog/dialog-overlay.svelte +1 -5
  189. package/dist/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -1
  190. package/dist/ui/dropdown-menu/dropdown-menu-content.svelte +2 -2
  191. package/dist/ui/dropdown-menu/dropdown-menu-group-heading.svelte +1 -4
  192. package/dist/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
  193. package/dist/ui/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  194. package/dist/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  195. package/dist/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -2
  196. package/dist/ui/dropdown-menu/dropdown-menu-trigger.svelte +2 -2
  197. package/dist/ui/file-upload/file-upload.svelte +2 -2
  198. package/dist/ui/index.js +1 -1
  199. package/dist/ui/input/input.svelte +2 -2
  200. package/dist/ui/input/textarea.svelte +1 -1
  201. package/dist/ui/input/variants.d.ts +18 -18
  202. package/dist/ui/input/variants.js +6 -6
  203. package/dist/ui/kv/kv.svelte +2 -3
  204. package/dist/ui/link-preview/link-preview-content.svelte +1 -1
  205. package/dist/ui/menubar/menubar-checkbox-item.svelte +1 -1
  206. package/dist/ui/menubar/menubar-content.svelte +2 -2
  207. package/dist/ui/menubar/menubar-group-heading.svelte +1 -4
  208. package/dist/ui/menubar/menubar-item.svelte +1 -1
  209. package/dist/ui/menubar/menubar-radio-item.svelte +1 -1
  210. package/dist/ui/menubar/menubar-root.svelte +1 -4
  211. package/dist/ui/menubar/menubar-sub-content.svelte +1 -1
  212. package/dist/ui/menubar/menubar-sub-trigger.svelte +2 -2
  213. package/dist/ui/menubar/menubar-trigger.svelte +1 -1
  214. package/dist/ui/meter/meter.svelte +2 -2
  215. package/dist/ui/pagination/pagination-next-button.svelte +1 -1
  216. package/dist/ui/pagination/pagination-prev-button.svelte +1 -1
  217. package/dist/ui/pagination/pagination-root.svelte +1 -1
  218. package/dist/ui/pane/pane-content.svelte +1 -1
  219. package/dist/ui/pane/pane-root.svelte +1 -1
  220. package/dist/ui/pane/pane-tab-list.svelte +1 -1
  221. package/dist/ui/pane/pane-tab-panel.svelte +1 -1
  222. package/dist/ui/pane/pane-tab.svelte +1 -1
  223. package/dist/ui/pane/pane.svelte +1 -1
  224. package/dist/ui/pin-input/pin-input-cell.svelte +1 -1
  225. package/dist/ui/popover/popover-content.svelte +1 -1
  226. package/dist/ui/popover/popover-trigger.svelte +1 -4
  227. package/dist/ui/progress/progress.svelte +2 -2
  228. package/dist/ui/radio-group/radio-group-item.svelte +2 -2
  229. package/dist/ui/radio-group/radio-group-root.svelte +1 -1
  230. package/dist/ui/rating-group/rating-group-item.svelte +1 -1
  231. package/dist/ui/rating-group/rating-group-root.svelte +1 -1
  232. package/dist/ui/scroll-area/scroll-area-scrollbar.svelte +1 -1
  233. package/dist/ui/scroll-area/scroll-area-thumb.svelte +1 -1
  234. package/dist/ui/scroll-area/scroll-area.svelte +1 -1
  235. package/dist/ui/select/select-content.svelte +7 -6
  236. package/dist/ui/select/select-group-heading.svelte +1 -4
  237. package/dist/ui/select/select-item.svelte +1 -1
  238. package/dist/ui/select/select-trigger.svelte +2 -2
  239. package/dist/ui/select/select-value.svelte +1 -1
  240. package/dist/ui/separator/separator.svelte +1 -1
  241. package/dist/ui/sheet/sheet-content.svelte +3 -3
  242. package/dist/ui/sheet/sheet-content.svelte.d.ts +4 -4
  243. package/dist/ui/skeleton/skeleton.svelte +4 -4
  244. package/dist/ui/skeleton/skeleton.svelte.d.ts +10 -10
  245. package/dist/ui/slider/slider-range.svelte +1 -1
  246. package/dist/ui/slider/slider-thumb.svelte +1 -1
  247. package/dist/ui/slider/slider-tick.svelte +1 -1
  248. package/dist/ui/step/step-content.svelte +1 -1
  249. package/dist/ui/step/step-section.svelte +1 -1
  250. package/dist/ui/step/step-summary.svelte +7 -7
  251. package/dist/ui/switch/switch.svelte +2 -2
  252. package/dist/ui/table/table-cell.svelte +1 -1
  253. package/dist/ui/table/table-head-cell.svelte +1 -1
  254. package/dist/ui/table/table-row.svelte +1 -1
  255. package/dist/ui/time-field/time-field-segment.svelte +1 -1
  256. package/dist/ui/time-range-field/time-range-field-segment.svelte +1 -1
  257. package/dist/ui/toggle-group/toggle-group-item.svelte +1 -1
  258. package/dist/ui/toggle-group/toggle-group-root.svelte +1 -1
  259. package/dist/ui/tooltip/tooltip-content.svelte +1 -1
  260. package/dist/ui/video-player/video-player.svelte +44 -47
  261. package/dist/utils/index.js +1 -1
  262. package/package.json +4 -3
@@ -8,7 +8,7 @@
8
8
  </script>
9
9
 
10
10
  {#if attachments.items.length}
11
- <div class="flex flex-wrap gap-(--era-gap) pb-(--era-gap)">
11
+ <div class="flex flex-wrap gap-gutter pb-gutter">
12
12
  {#each attachments.items as a (a.id)}
13
13
  <div class="group/att relative">
14
14
  {#if a.previewUrl}
@@ -16,15 +16,15 @@
16
16
  <img
17
17
  src={a.previewUrl}
18
18
  alt={a.filename}
19
- class="size-(--era-h-bar) rounded-(--era-rd-bar) object-cover shadow-(--era-shadow)"
19
+ class="size-bar rounded-bar object-cover shadow-sm"
20
20
  />
21
21
  {:else}
22
22
  <!-- md control geometry, like a Button with an icon: wall inset and
23
23
  icon gap both --era-inset-control, ink centered by era-text-trim. -->
24
24
  <div
25
- class="flex h-(--era-h-control) items-center gap-(--era-inset-control) rounded-(--era-rd-control) bg-(--era-surface-bg) px-(--era-inset-control) text-body era-text-trim text-muted shadow-(--era-shadow)"
25
+ class="flex h-control items-center gap-inset-control rounded-control bg-well px-inset-control text-body leading-none text-muted shadow-sm"
26
26
  >
27
- <Paperclip class="size-(--era-h-icon) shrink-0" />
27
+ <Paperclip class="size-icon shrink-0" />
28
28
  <span class="max-w-32 truncate">{a.filename}</span>
29
29
  </div>
30
30
  {/if}
@@ -36,7 +36,7 @@
36
36
  icon
37
37
  size="icon"
38
38
  aria-label="Remove {a.filename}"
39
- class="absolute -top-(--era-gap) -right-(--era-gap) opacity-0 shadow-(--era-shadow) group-hover/att:opacity-100 focus-visible:opacity-100 [&_svg]:size-(--era-glyph-pill)"
39
+ class="absolute -top-(--era-gap) -right-(--era-gap) opacity-0 shadow-sm group-hover/att:opacity-100 focus-visible:opacity-100 [&_svg]:size-glyph-pill"
40
40
  onclick={() => attachments.remove(a.id)}
41
41
  >
42
42
  <X />
@@ -40,10 +40,10 @@
40
40
  }}
41
41
  >
42
42
  {#if status === 'submitted'}
43
- <LoaderCircle class="size-(--era-h-icon) animate-spin" />
43
+ <LoaderCircle class="size-icon animate-spin" />
44
44
  {:else if status === 'streaming'}
45
45
  <Square class="size-[calc(var(--era-h-icon)*0.75)]" fill="currentColor" />
46
46
  {:else}
47
- <ArrowUp class="size-(--era-h-icon)" />
47
+ <ArrowUp class="size-icon" />
48
48
  {/if}
49
49
  </Button>
@@ -40,7 +40,7 @@
40
40
  (only the submit path is gated).
41
41
 
42
42
  Geometry: the single-line state must measure exactly like an md control
43
- (Input = h-control, px-(--era-inset-control), text-body, text-fg) so the toolbar
43
+ (Input = h-control, px-inset-control, text-body, text-fg) so the toolbar
44
44
  row of md buttons beside it sits on ONE tier with even gaps. Padding
45
45
  does the vertical centering here (a textarea can't flex-center), so
46
46
  py = (h-control − 1lh)/2 — exact at every density and any leading. Input's
@@ -58,7 +58,7 @@
58
58
  onkeydown={onKeydown}
59
59
  onpaste={onPaste}
60
60
  class={cn(
61
- 'field-sizing-content max-h-48 min-h-(--era-h-control) w-full resize-none bg-transparent px-(--era-inset-control) py-[calc((var(--era-h-control)-1lh)/2)] text-body leading-body text-fg outline-none placeholder:text-muted',
61
+ 'field-sizing-content max-h-48 min-h-control w-full resize-none bg-transparent px-inset-control py-[calc((var(--era-h-control)-1lh)/2)] text-body leading-body text-fg outline-none placeholder:text-muted',
62
62
  className
63
63
  )}
64
64
  {...restProps}></textarea>
@@ -10,6 +10,6 @@
10
10
  }: HTMLAttributes<HTMLDivElement> & { children?: Snippet } = $props();
11
11
  </script>
12
12
 
13
- <div class={cn('flex items-end justify-between gap-(--era-gap)', className)} {...restProps}>
13
+ <div class={cn('flex items-end justify-between gap-gutter', className)} {...restProps}>
14
14
  {@render children?.()}
15
15
  </div>
@@ -90,7 +90,7 @@
90
90
  // base fill while a button inside is hovered, so the highlight lands on the
91
91
  // button, not the bar. (General rule for any highlighting container with
92
92
  // interactive children.)
93
- 'flex w-full era-interactive flex-col rounded-(--era-rd-bar) bg-(--era-field-bg) p-(--era-gap) text-body text-fg shadow-(--era-shadow-well) focus-within:bg-(--era-field-highlight) hover:bg-(--era-field-highlight) has-[button:hover]:bg-(--era-field-bg)',
93
+ 'flex w-full era-interactive flex-col rounded-bar bg-field p-gutter text-body text-fg shadow-well focus-within:bg-field-highlight hover:bg-field-highlight has-[button:hover]:bg-field',
94
94
  className
95
95
  )}
96
96
  {...restProps}
@@ -11,7 +11,7 @@
11
11
 
12
12
  <li
13
13
  class={cn(
14
- 'flex min-w-0 items-center gap-(--era-gap) rounded-(--era-rd-control) px-(--era-inset-control) py-(--era-gap) text-body hover:bg-(--era-highlight)',
14
+ 'flex min-w-0 items-center gap-gutter rounded-control px-inset-control py-gutter text-body hover:bg-highlight',
15
15
  completed ? 'text-muted line-through' : 'text-fg',
16
16
  className
17
17
  )}
@@ -6,7 +6,7 @@
6
6
 
7
7
  <ul
8
8
  class={cn(
9
- 'flex max-h-48 flex-col gap-(--era-gap) overflow-y-auto rounded-(--era-rd-bar) bg-(--era-surface-bg) p-(--era-pad-panel) shadow-(--era-shadow)',
9
+ 'flex max-h-48 flex-col gap-gutter overflow-y-auto rounded-bar bg-well p-panel shadow-sm',
10
10
  className
11
11
  )}
12
12
  >
@@ -11,7 +11,7 @@
11
11
  </script>
12
12
 
13
13
  <Step.Summary>
14
- <Brain class="size-(--era-h-icon) shrink-0" aria-hidden="true" />
14
+ <Brain class="size-icon shrink-0" aria-hidden="true" />
15
15
  {#if children}
16
16
  {@render children()}
17
17
  {:else if streaming || duration === 0}
@@ -34,7 +34,7 @@
34
34
  <!-- eslint-disable better-tailwindcss/no-unknown-classes -- era-response* are defined in this component's <style> -->
35
35
  <div
36
36
  class={cn(
37
- 'era-response flex min-w-0 flex-col gap-(--era-gap) text-body leading-body text-fg',
37
+ 'era-response flex min-w-0 flex-col gap-gutter text-body leading-body text-fg',
38
38
  streaming && 'era-response-streaming',
39
39
  className
40
40
  )}
@@ -82,20 +82,16 @@
82
82
  <div
83
83
  role="status"
84
84
  aria-live="polite"
85
- class={cn(
86
- 'flex flex-col rounded-(--era-rd-bar) bg-(--era-surface-bg) shadow-(--era-shadow)',
87
- className
88
- )}
85
+ class={cn('flex flex-col rounded-bar bg-well shadow-sm', className)}
89
86
  {...restProps}
90
87
  >
91
- <div class="flex h-(--era-h-control) items-center gap-(--era-gap) px-(--era-inset-control)">
88
+ <div class="flex h-control items-center gap-gutter px-inset-control">
92
89
  <!-- leading status dot + label -->
93
- <span
94
- class="flex items-center gap-(--era-inset-pill) font-mono text-body {style.text} era-text-trim"
95
- >
90
+ <span class="flex items-center gap-inset-pill font-mono text-body {style.text} leading-none">
96
91
  <span class={cn('size-1.5 shrink-0 rounded-full', style.dot, style.pulse && 'animate-pulse')}
97
92
  ></span>
98
- {style.label}
93
+ <!-- Own box, so the trim applies — see Role for the anonymous-item rule. -->
94
+ <span class="era-text-trim">{style.label}</span>
99
95
  </span>
100
96
 
101
97
  {#if tools}
@@ -116,7 +112,7 @@
116
112
 
117
113
  {#if style.active && oncancel}
118
114
  <Button size="icon" tone="destructive" onclick={() => oncancel?.()}>
119
- <X class="size-(--era-h-icon)" aria-hidden="true" />
115
+ <X class="size-icon" aria-hidden="true" />
120
116
  Cancel
121
117
  </Button>
122
118
  {/if}
@@ -125,7 +121,7 @@
125
121
  {#if latest}
126
122
  <div
127
123
  class={cn(
128
- 'truncate px-(--era-inset-control) pb-(--era-inset-chip) font-mono text-body',
124
+ 'truncate px-inset-control pb-inset-chip font-mono text-body',
129
125
  LOG_TONE[latest.tone]
130
126
  )}
131
127
  >
@@ -50,10 +50,7 @@
50
50
  truncated message, and an optional trailing timestamp/label. Single-line by
51
51
  design (the tail scrolls, it doesn't wrap) so items-center + era-text-trim
52
52
  keep the dot and text on one optical baseline. -->
53
- <div
54
- class={cn('flex items-center gap-(--era-gap) text-body', TONE[tone], className)}
55
- {...restProps}
56
- >
53
+ <div class={cn('flex items-center gap-gutter text-body', TONE[tone], className)} {...restProps}>
57
54
  <!-- size-2, the library's dot size (conversations row, run status, swarm) —
58
55
  NOT a tier height: h-pill is the pill tier (18-26px), which rendered this
59
56
  as a bullet taller than the line it marks. -->
@@ -22,7 +22,7 @@
22
22
  const visible = $derived(items && limit !== undefined ? items.slice(-limit) : (items ?? []));
23
23
  </script>
24
24
 
25
- <div class={cn('flex min-w-0 flex-col gap-(--era-gap)', className)} {...restProps}>
25
+ <div class={cn('flex min-w-0 flex-col gap-gutter', className)} {...restProps}>
26
26
  {#if items}
27
27
  {#each visible as item, i (item.id ?? i)}
28
28
  <Item tone={item.tone} label={item.label} text={item.text} />
@@ -9,8 +9,8 @@
9
9
  {href}
10
10
  target="_blank"
11
11
  rel="noreferrer"
12
- class="flex items-center gap-(--era-gap) text-body text-fg hover:text-bright hover:underline"
12
+ class="flex items-center gap-gutter text-body text-fg hover:text-bright hover:underline"
13
13
  >
14
- <BookOpen class="size-(--era-h-icon) shrink-0 text-muted" aria-hidden="true" />
14
+ <BookOpen class="size-icon shrink-0 text-muted" aria-hidden="true" />
15
15
  <span class="truncate">{title ?? href}</span>
16
16
  </a>
@@ -7,6 +7,6 @@
7
7
  </script>
8
8
 
9
9
  <Step.Summary>
10
- <BookMarked class="size-(--era-h-icon) shrink-0" aria-hidden="true" />
10
+ <BookMarked class="size-icon shrink-0" aria-hidden="true" />
11
11
  {#if children}{@render children()}{:else}Used {count} source{count === 1 ? '' : 's'}{/if}
12
12
  </Step.Summary>
@@ -90,21 +90,21 @@
90
90
 
91
91
  {#snippet row(kind: 'key' | 'index', label: string, v: unknown)}
92
92
  {#if isInline(v)}
93
- <div class="flex min-w-0 items-baseline gap-(--era-gap)">
93
+ <div class="flex min-w-0 items-baseline gap-gutter">
94
94
  {@render tag(kind, label)}
95
95
  {@render leaf(v)}
96
96
  </div>
97
97
  {:else}
98
- <div class="flex min-w-0 flex-col gap-(--era-gap)">
98
+ <div class="flex min-w-0 flex-col gap-gutter">
99
99
  {@render tag(kind, label)}
100
- <div class="border-l border-divider pl-(--era-inset-control)">
100
+ <div class="border-l border-divider pl-inset-control">
101
101
  <Self value={v} depth={depth + 1} />
102
102
  </div>
103
103
  </div>
104
104
  {/if}
105
105
  {/snippet}
106
106
 
107
- <div class={cn('flex min-w-0 flex-col gap-(--era-gap) text-body', className)} {...restProps}>
107
+ <div class={cn('flex min-w-0 flex-col gap-gutter text-body', className)} {...restProps}>
108
108
  {#if depth > MAX_DEPTH}
109
109
  <span class="era-text-trim text-muted">…</span>
110
110
  {:else if isRecord(value)}
@@ -22,7 +22,7 @@
22
22
  full-round — touch mode alone pills the ladder. -->
23
23
  <Button
24
24
  size="chip"
25
- class={cn('shrink-0 px-(--era-chip-px)', className)}
25
+ class={cn('shrink-0 px-chip', className)}
26
26
  onclick={() => onSelect?.(suggestion)}
27
27
  >
28
28
  {#if children}{@render children()}{:else}{suggestion}{/if}
@@ -12,7 +12,7 @@
12
12
 
13
13
  <div
14
14
  class={cn(
15
- 'scrollbar-none flex w-full flex-nowrap items-center gap-(--era-gap) overflow-x-auto',
15
+ 'scrollbar-none flex w-full flex-nowrap items-center gap-gutter overflow-x-auto',
16
16
  className
17
17
  )}
18
18
  {...restProps}
@@ -55,13 +55,13 @@
55
55
  tone="well"
56
56
  data-status={agent.status}
57
57
  class={cn(
58
- 'flex min-w-0 flex-col gap-(--era-gap) p-(--era-pad-panel)',
58
+ 'flex min-w-0 flex-col gap-gutter p-panel',
59
59
  agent.status === 'failed' && 'outline -outline-offset-1 outline-destructive/60',
60
60
  className
61
61
  )}
62
62
  {...restProps}
63
63
  >
64
- <div class="flex min-w-0 items-center gap-(--era-gap) text-body era-text-trim">
64
+ <div class="flex min-w-0 items-center gap-gutter text-body leading-none">
65
65
  <Dot status={agent.status} />
66
66
  <Role role={agent.role ?? 'worker'} label={agent.label} class="min-w-0" />
67
67
  {#if agent.key}
@@ -85,7 +85,7 @@
85
85
  {@render children?.(agent)}
86
86
 
87
87
  {#if agent.sandbox || elapsed != null}
88
- <div class="flex min-w-0 items-center gap-(--era-gap) text-body era-text-trim text-muted">
88
+ <div class="flex min-w-0 items-center gap-gutter text-body leading-none text-muted">
89
89
  {#if agent.sandbox}
90
90
  <Sandbox sandbox={agent.sandbox} label />
91
91
  {/if}
@@ -40,10 +40,10 @@
40
40
  <Card
41
41
  tone="well"
42
42
  data-kind={artifact.kind}
43
- class={cn('flex min-w-0 flex-col gap-(--era-gap) p-(--era-pad-panel)', className)}
43
+ class={cn('flex min-w-0 flex-col gap-gutter p-panel', className)}
44
44
  {...restProps}
45
45
  >
46
- <div class="flex min-w-0 items-center gap-(--era-gap) text-body era-text-trim">
46
+ <div class="flex min-w-0 items-center gap-gutter text-body leading-none">
47
47
  <span class="shrink-0 font-mono text-[0.625rem] tracking-[0.15em] text-muted uppercase">
48
48
  {artifact.kind}
49
49
  </span>
@@ -37,11 +37,11 @@
37
37
  and 3/5 answers it where "open" does not. -->
38
38
  <div
39
39
  data-status={state.status}
40
- class={cn('flex min-w-0 flex-col gap-(--era-gap)', className)}
40
+ class={cn('flex min-w-0 flex-col gap-gutter', className)}
41
41
  {...restProps}
42
42
  >
43
- <div class="flex min-w-0 items-center gap-(--era-gap) text-body era-text-trim">
44
- <GitMerge class="size-(--era-h-icon) shrink-0 text-muted" aria-hidden="true" />
43
+ <div class="flex min-w-0 items-center gap-gutter text-body leading-none">
44
+ <GitMerge class="size-icon shrink-0 text-muted" aria-hidden="true" />
45
45
  <span class="min-w-0 flex-1 truncate text-fg">{barrier.title}</span>
46
46
  {#if barrier.key}
47
47
  <span class="shrink-0 font-mono text-body text-muted">#{barrier.key}</span>
@@ -26,10 +26,7 @@
26
26
  when a swarm declares no gates, which most do not. -->
27
27
  {#if barriers.length > 0}
28
28
  <div
29
- class={cn(
30
- 'flex min-w-0 flex-col gap-(--era-pad-panel) border-t border-divider-faded p-(--era-pad-panel)',
31
- className
32
- )}
29
+ class={cn('flex min-w-0 flex-col gap-panel border-t border-divider-faded p-panel', className)}
33
30
  {...restProps}
34
31
  >
35
32
  {#each barriers as barrier (barrier.id)}
@@ -31,7 +31,7 @@
31
31
  <!-- Live tally. Each badge appears only while its number is non-zero, so the
32
32
  strip shrinks as a run lands instead of trailing a row of zeroes — and the
33
33
  one that matters (failures) is never hidden behind the ones that don't. -->
34
- <div class={cn('flex shrink-0 items-center gap-(--era-gap)', className)} {...restProps}>
34
+ <div class={cn('flex shrink-0 items-center gap-gutter', className)} {...restProps}>
35
35
  {#if quiet}
36
36
  <Badge>{tally.total} agents</Badge>
37
37
  {:else}
@@ -42,7 +42,7 @@
42
42
  {/if}
43
43
  {#if tally.sandboxes > 0}
44
44
  <Badge>
45
- <Box class="size-(--era-h-icon)" aria-hidden="true" />
45
+ <Box class="size-icon" aria-hidden="true" />
46
46
  {tally.sandboxes}
47
47
  </Badge>
48
48
  {/if}
@@ -50,14 +50,15 @@
50
50
 
51
51
  <div
52
52
  class={cn(
53
- 'flex h-(--era-h-control) shrink-0 items-center gap-(--era-gap) border-t border-divider-faded px-(--era-inset-control) font-mono text-body era-text-trim',
53
+ 'flex h-control shrink-0 items-center gap-gutter border-t border-divider-faded px-inset-control font-mono text-body leading-none',
54
54
  className
55
55
  )}
56
56
  {...restProps}
57
57
  >
58
- <span class={cn('flex shrink-0 items-center gap-(--era-gap)', tone.class)}>
58
+ <span class={cn('flex shrink-0 items-center gap-gutter', tone.class)}>
59
59
  <Dot status={tone.status} label={tone.label} class={tone.pulse ? 'animate-pulse' : undefined} />
60
- {tone.label}
60
+ <!-- Own box, so the trim applies — see Role for the anonymous-item rule. -->
61
+ <span class="era-text-trim">{tone.label}</span>
61
62
  </span>
62
63
  <!-- Always rendered, empty when there is nothing to say: the span is also the
63
64
  spacer that pushes the watermark to the trailing edge. -->
@@ -34,13 +34,13 @@
34
34
  grow with the density axis instead of staying dense-sized in touch mode. -->
35
35
  <div
36
36
  class={cn(
37
- 'grid min-w-0 grid-cols-[repeat(auto-fill,minmax(calc(var(--era-h-bar)*6),1fr))] gap-(--era-gap) p-(--era-gap)',
37
+ 'grid min-w-0 grid-cols-[repeat(auto-fill,minmax(calc(var(--era-h-bar)*6),1fr))] gap-gutter p-gutter',
38
38
  className
39
39
  )}
40
40
  {...restProps}
41
41
  >
42
42
  {#if nodes.length === 0}
43
- <div class="px-(--era-inset-control) py-(--era-gap) text-body text-muted">
43
+ <div class="px-inset-control py-gutter text-body text-muted">
44
44
  {#if empty}{@render empty()}{:else}No agents yet.{/if}
45
45
  </div>
46
46
  {:else}
@@ -43,7 +43,7 @@
43
43
  the end of a sentence you can hover for, never the count of what failed. -->
44
44
  <div
45
45
  class={cn(
46
- 'flex h-(--era-h-control) shrink-0 items-center gap-(--era-gap) px-(--era-inset-control) text-body era-text-trim',
46
+ 'flex h-control shrink-0 items-center gap-gutter px-inset-control text-body leading-none',
47
47
  className
48
48
  )}
49
49
  {...restProps}
@@ -55,7 +55,7 @@
55
55
  group to the edge, so there is no empty-title branch to keep in sync. -->
56
56
  <span class="min-w-0 flex-1 truncate text-bright">{title ?? ''}</span>
57
57
  {#if children}
58
- <div class="flex shrink-0 items-center gap-(--era-gap)">
58
+ <div class="flex shrink-0 items-center gap-gutter">
59
59
  {@render children()}
60
60
  </div>
61
61
  {/if}
@@ -160,12 +160,10 @@
160
160
  highlight instantly so a fast pass down the tree doesn't smear. -->
161
161
  <div
162
162
  class={cn(
163
- 'flex h-(--era-h-control) items-center gap-(--era-gap) rounded-(--era-rd-control) pl-(--era-inset-control) text-body era-text-trim',
164
- hasActions ? 'pr-(--era-pill-inset-control)' : 'pr-(--era-inset-control)',
163
+ 'flex h-control items-center gap-gutter rounded-control pl-inset-control text-body leading-none',
164
+ hasActions ? 'pr-pill-inset-control' : 'pr-inset-control',
165
165
  (hasChildren || hasDetail) && 'cursor-pointer',
166
- active
167
- ? 'bg-hover text-bright'
168
- : 'text-fg hover:bg-(--era-highlight) hover:shadow-(--era-highlight-shadow)',
166
+ active ? 'bg-hover text-bright' : 'text-fg hover:bg-highlight hover:shadow-highlight',
169
167
  // Scoped to the DIRECT parent, not the group: every node in the tree is
170
168
  // a group/node, and a named group matches ANY ancestor — focusing a
171
169
  // parent row was outlining every visible child row. `:focus-visible > &`
@@ -183,14 +181,14 @@
183
181
  single source of truth, without the ancestry. -->
184
182
  <ChevronRight
185
183
  class={cn(
186
- 'size-(--era-h-icon) shrink-0 text-muted transition-transform duration-(--era-duration) ease-(--era-ease)',
184
+ 'size-icon shrink-0 text-muted transition-transform duration-base ease-base',
187
185
  open && 'rotate-90'
188
186
  )}
189
187
  aria-hidden="true"
190
188
  />
191
189
  {:else}
192
190
  <!-- Keeps every row's dot on the same column, expandable or not. -->
193
- <span class="size-(--era-h-icon) shrink-0" aria-hidden="true"></span>
191
+ <span class="size-icon shrink-0" aria-hidden="true"></span>
194
192
  {/if}
195
193
 
196
194
  <Dot status={agent.status} />
@@ -225,7 +223,7 @@
225
223
  event.stopPropagation();
226
224
  toggleDetail();
227
225
  }}
228
- class="shrink-0 era-interactive cursor-pointer rounded-(--era-rd-pill) px-(--era-pill-px) font-mono text-body era-text-trim text-muted hover:bg-(--era-highlight) hover:text-fg data-[state=open]:bg-hover data-[state=open]:text-fg"
226
+ class="shrink-0 era-interactive cursor-pointer rounded-pill px-pill font-mono text-body era-text-trim text-muted hover:bg-highlight hover:text-fg data-[state=open]:bg-hover data-[state=open]:text-fg"
229
227
  >
230
228
  {detailLabel}
231
229
  </button>
@@ -263,7 +261,7 @@
263
261
  <Collapsible.Root bind:open={detailOpen}>
264
262
  <Collapsible.Content class="era-collapse">
265
263
  <div
266
- class="min-w-0 pr-(--era-inset-control) pb-(--era-gap) pl-[calc(var(--era-inset-control)+var(--era-h-icon)+var(--era-gap))]"
264
+ class="min-w-0 pr-inset-control pb-gutter pl-[calc(var(--era-inset-control)+var(--era-h-icon)+var(--era-gap))]"
267
265
  >
268
266
  {@render detail?.(agent)}
269
267
  </div>
@@ -53,12 +53,15 @@
53
53
  data-role={role}
54
54
  title={name}
55
55
  class={cn(
56
- 'inline-flex shrink-0 items-center gap-(--era-gap) font-mono text-[0.625rem] era-text-trim-caps tracking-[0.15em] uppercase',
56
+ 'inline-flex shrink-0 items-center gap-gutter font-mono text-[0.625rem] leading-none tracking-[0.15em] uppercase',
57
57
  role === 'orchestrator' ? 'text-fg' : 'text-muted',
58
58
  className
59
59
  )}
60
60
  {...restProps}
61
61
  >
62
- <Icon class="size-(--era-h-icon) shrink-0" aria-hidden="true" />
63
- {name}
62
+ <Icon class="size-icon shrink-0" aria-hidden="true" />
63
+ <!-- The name gets its OWN box so the caps trim has something to trim. Left on
64
+ the flex row it was inert: bare text in a flex container is an anonymous
65
+ item, which no non-inherited property reaches. -->
66
+ <span class="era-text-trim-caps">{name}</span>
64
67
  </span>
@@ -51,10 +51,7 @@
51
51
  swarm reads as a region of it, not a card floating above it. -->
52
52
  <div
53
53
  bind:this={ref}
54
- class={cn(
55
- 'flex min-w-0 flex-col rounded-(--era-rd-bar) bg-(--era-surface-bg) shadow-(--era-shadow)',
56
- className
57
- )}
54
+ class={cn('flex min-w-0 flex-col rounded-bar bg-well shadow-sm', className)}
58
55
  {...restProps}
59
56
  >
60
57
  {@render children?.()}
@@ -49,7 +49,7 @@
49
49
  indicator for both hides exactly the state you opened a console to find. -->
50
50
  <span
51
51
  class={cn(
52
- 'flex min-w-0 shrink-0 items-center gap-(--era-gap) font-mono',
52
+ 'flex min-w-0 shrink-0 items-center gap-gutter font-mono',
53
53
  SANDBOX_TONE[sandbox.status],
54
54
  className
55
55
  )}
@@ -57,17 +57,14 @@
57
57
  >
58
58
  <!-- busy: the box PULSES rather than gaining a second glyph — "a command is
59
59
  streaming through this VM" is motion, and motion is what says it. -->
60
- <Box
61
- class={cn('size-(--era-h-icon) shrink-0', sandbox.busy && 'animate-pulse')}
62
- aria-hidden="true"
63
- />
60
+ <Box class={cn('size-icon shrink-0', sandbox.busy && 'animate-pulse')} aria-hidden="true" />
64
61
  {#if sandbox.checkpoint}
65
62
  <!-- A paused VM kept as a restore point — the camera badge, as the
66
63
  reference console draws it. -->
67
- <Camera class="size-(--era-glyph-pill) shrink-0" aria-hidden="true" />
64
+ <Camera class="size-glyph-pill shrink-0" aria-hidden="true" />
68
65
  {:else if forkOf}
69
66
  <!-- Live-forked from a parent VM; the lineage is in the title. -->
70
- <GitBranch class="size-(--era-glyph-pill) shrink-0" aria-hidden="true" />
67
+ <GitBranch class="size-glyph-pill shrink-0" aria-hidden="true" />
71
68
  {/if}
72
69
  {#if label}<span class="truncate">{sandbox.status}</span>{/if}
73
70
  </span>
@@ -181,11 +181,11 @@
181
181
  aria-label="Swarm agents"
182
182
  {onkeydown}
183
183
  {onfocusin}
184
- class={cn('@container min-w-0 py-(--era-gap)', className)}
184
+ class={cn('@container min-w-0 py-gutter', className)}
185
185
  {...restProps}
186
186
  >
187
187
  {#if rows.length === 0}
188
- <div class="px-(--era-inset-control) py-(--era-gap) text-body text-muted">
188
+ <div class="px-inset-control py-gutter text-body text-muted">
189
189
  {#if empty}{@render empty()}{:else}No agents yet.{/if}
190
190
  </div>
191
191
  {:else}
@@ -8,10 +8,7 @@
8
8
 
9
9
  <!-- The task log rail: items hang off a left border, terminal-trace style. -->
10
10
  <Step.Content
11
- class={cn(
12
- 'border-divider-faded border-s-2 bg-transparent p-0 ps-(--era-pad-panel) shadow-none',
13
- className
14
- )}
11
+ class={cn('border-divider-faded border-s-2 bg-transparent p-0 ps-panel shadow-none', className)}
15
12
  >
16
13
  {@render children?.()}
17
14
  </Step.Content>
@@ -7,6 +7,6 @@
7
7
  </script>
8
8
 
9
9
  <Step.Summary>
10
- <Search class="size-(--era-h-icon) shrink-0" aria-hidden="true" />
10
+ <Search class="size-icon shrink-0" aria-hidden="true" />
11
11
  {#if children}{@render children()}{:else}{title}{/if}
12
12
  </Step.Summary>
@@ -47,20 +47,20 @@
47
47
  data-status={status}
48
48
  {onclick}
49
49
  class={cn(
50
- 'inline-flex h-(--era-h-pill) max-w-full min-w-0 shrink-0 era-interactive cursor-pointer items-center gap-(--era-gap) rounded-(--era-rd-pill) px-(--era-pill-px) text-body era-text-trim text-muted transition-colors duration-(--era-duration) ease-(--era-ease) hover:bg-(--era-highlight) hover:text-fg',
50
+ 'inline-flex h-pill max-w-full min-w-0 shrink-0 era-interactive cursor-pointer items-center gap-gutter rounded-pill px-pill text-body leading-none text-muted transition-colors duration-base ease-base hover:bg-highlight hover:text-fg',
51
51
  active && 'bg-fill text-fg',
52
52
  className
53
53
  )}
54
54
  {...restProps}
55
55
  >
56
56
  <Icon
57
- class={cn('size-(--era-h-icon) shrink-0', status === 'running' && 'animate-pulse')}
57
+ class={cn('size-icon shrink-0', status === 'running' && 'animate-pulse')}
58
58
  aria-hidden="true"
59
59
  />
60
60
  <span class={cn('min-w-0 truncate', status === 'running' && 'era-shimmer')}>
61
61
  {@render children?.()}
62
62
  </span>
63
63
  {#if status === 'error'}
64
- <span class="size-(--era-gap) shrink-0 rounded-full bg-destructive" aria-hidden="true"></span>
64
+ <span class="size-gutter shrink-0 rounded-full bg-destructive" aria-hidden="true"></span>
65
65
  {/if}
66
66
  </button>
@@ -23,19 +23,19 @@
23
23
  cursor is excluded), with one shared expansion area below. -->
24
24
  <div class={cn('flex min-w-0 flex-col', className)}>
25
25
  <div
26
- class="flex flex-wrap items-center gap-(--era-gap) [&>*:not(:first-child):not([data-chips-cursor])]:border-l [&>*:not(:first-child):not([data-chips-cursor])]:border-divider-faded [&>*:not(:first-child):not([data-chips-cursor])]:pl-(--era-gap)"
26
+ class="flex flex-wrap items-center gap-gutter [&>*:not(:first-child):not([data-chips-cursor])]:border-l [&>*:not(:first-child):not([data-chips-cursor])]:border-divider-faded [&>*:not(:first-child):not([data-chips-cursor])]:pl-gutter"
27
27
  >
28
28
  {@render children?.()}
29
29
  {#if streaming}
30
30
  <span
31
31
  data-chips-cursor
32
- class="size-(--era-gap) shrink-0 rounded-full bg-primary"
32
+ class="size-gutter shrink-0 rounded-full bg-primary"
33
33
  aria-hidden="true"
34
34
  ></span>
35
35
  {/if}
36
36
  </div>
37
37
  {#if expanded}
38
- <div class="mt-(--era-gap) min-w-0">
38
+ <div class="mt-gutter min-w-0">
39
39
  {@render expanded()}
40
40
  </div>
41
41
  {/if}