@signal9/era-ui 8.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 (224) 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/notes.svelte +9 -9
  67. package/dist/dev/audit/audits/_helpers.js +1 -1
  68. package/dist/dev/audit/audits/resting-gap.js +1 -1
  69. package/dist/dev/audit/audits/single-glyph-square.js +2 -2
  70. package/dist/dev/audit-overlay.svelte +7 -7
  71. package/dist/dev/measure.d.ts +1 -1
  72. package/dist/dev/measure.js +1 -1
  73. package/dist/docs/badge.md +1 -1
  74. package/dist/docs/css-utilities.d.ts +1 -1
  75. package/dist/docs/css-utilities.js +8 -8
  76. package/dist/docs/llms-txt.js +1 -1
  77. package/dist/era-ui.css +1 -1
  78. package/dist/generated-docs/badge.md +1 -1
  79. package/dist/generated-docs/bar.md +2 -2
  80. package/dist/generated-docs/chip.md +1 -1
  81. package/dist/generated-docs/input.md +1 -1
  82. package/dist/generated-docs/llms-full.txt +99 -119
  83. package/dist/generated-docs/llms.txt +11 -12
  84. package/dist/generated-docs/manifest.json +52 -65
  85. package/dist/generated-docs/utilities.json +45 -57
  86. package/dist/generated-docs/utilities.md +87 -106
  87. package/dist/os/notification-center.svelte +6 -6
  88. package/dist/os/pane.svelte +7 -5
  89. package/dist/os/taskbar.svelte +10 -10
  90. package/dist/os/toast.svelte +3 -3
  91. package/dist/os/toaster.svelte +1 -1
  92. package/dist/styles/density.css +93 -67
  93. package/dist/styles/index.css +89 -101
  94. package/dist/styles/prose.css +12 -12
  95. package/dist/styles/surfaces/base.css +3 -3
  96. package/dist/styles/surfaces/bevel.css +2 -2
  97. package/dist/ui/accordion/accordion-trigger.svelte +2 -2
  98. package/dist/ui/alert-dialog/alert-dialog-content.svelte +1 -1
  99. package/dist/ui/aspect-ratio/aspect-ratio.svelte +1 -1
  100. package/dist/ui/avatar/avatar-root.svelte +1 -1
  101. package/dist/ui/badge/badge.svelte +1 -1
  102. package/dist/ui/badge/badge.svelte.d.ts +1 -1
  103. package/dist/ui/bar/bar.svelte +23 -15
  104. package/dist/ui/bar/bar.svelte.d.ts +26 -26
  105. package/dist/ui/button/button.svelte +1 -1
  106. package/dist/ui/button/variants.js +18 -18
  107. package/dist/ui/button-group/button-group.svelte +2 -2
  108. package/dist/ui/calendar/calendar-day.svelte +1 -1
  109. package/dist/ui/calendar/calendar-head-cell.svelte +1 -1
  110. package/dist/ui/calendar/calendar-header.svelte +1 -1
  111. package/dist/ui/calendar/calendar-next-button.svelte +1 -1
  112. package/dist/ui/calendar/calendar-prev-button.svelte +1 -1
  113. package/dist/ui/card/card.svelte +5 -5
  114. package/dist/ui/card/card.svelte.d.ts +4 -4
  115. package/dist/ui/checkbox/checkbox.svelte +3 -3
  116. package/dist/ui/chip/chip.svelte +14 -10
  117. package/dist/ui/chip/chip.svelte.d.ts +7 -7
  118. package/dist/ui/code-block/code-block.svelte +6 -6
  119. package/dist/ui/collapsible/collapsible-trigger.svelte +1 -1
  120. package/dist/ui/combobox/combobox-content.svelte +1 -1
  121. package/dist/ui/combobox/combobox-empty.svelte +4 -1
  122. package/dist/ui/combobox/combobox-group-heading.svelte +4 -1
  123. package/dist/ui/combobox/combobox-item.svelte +1 -1
  124. package/dist/ui/combobox/combobox-trigger.svelte +2 -2
  125. package/dist/ui/command/command-group-heading.svelte +4 -1
  126. package/dist/ui/command/command-item.svelte +1 -1
  127. package/dist/ui/command/command-link-item.svelte +1 -1
  128. package/dist/ui/command/command-root.svelte +1 -1
  129. package/dist/ui/command-bar/command-bar.svelte +16 -12
  130. package/dist/ui/context-menu/context-menu-checkbox-item.svelte +1 -1
  131. package/dist/ui/context-menu/context-menu-content.svelte +1 -1
  132. package/dist/ui/context-menu/context-menu-group-heading.svelte +4 -1
  133. package/dist/ui/context-menu/context-menu-item.svelte +1 -1
  134. package/dist/ui/context-menu/context-menu-radio-item.svelte +1 -1
  135. package/dist/ui/context-menu/context-menu-sub-content.svelte +1 -1
  136. package/dist/ui/context-menu/context-menu-sub-trigger.svelte +2 -2
  137. package/dist/ui/copy-button/copy-button.svelte +2 -2
  138. package/dist/ui/cycle/cycle.svelte +1 -1
  139. package/dist/ui/date-field/date-field-segment.svelte +1 -1
  140. package/dist/ui/date-picker/date-picker-content.svelte +1 -1
  141. package/dist/ui/date-picker/date-picker-day.svelte +1 -1
  142. package/dist/ui/date-picker/date-picker-head-cell.svelte +1 -1
  143. package/dist/ui/date-picker/date-picker-header.svelte +1 -1
  144. package/dist/ui/date-picker/date-picker-next-button.svelte +1 -1
  145. package/dist/ui/date-picker/date-picker-prev-button.svelte +1 -1
  146. package/dist/ui/date-picker/date-picker-segment.svelte +1 -1
  147. package/dist/ui/date-picker/date-picker-trigger.svelte +2 -2
  148. package/dist/ui/date-range-field/date-range-field-segment.svelte +1 -1
  149. package/dist/ui/date-range-picker/date-range-picker-content.svelte +1 -1
  150. package/dist/ui/date-range-picker/date-range-picker-day.svelte +1 -1
  151. package/dist/ui/date-range-picker/date-range-picker-head-cell.svelte +1 -1
  152. package/dist/ui/date-range-picker/date-range-picker-header.svelte +1 -1
  153. package/dist/ui/date-range-picker/date-range-picker-next-button.svelte +1 -1
  154. package/dist/ui/date-range-picker/date-range-picker-prev-button.svelte +1 -1
  155. package/dist/ui/date-range-picker/date-range-picker-segment.svelte +1 -1
  156. package/dist/ui/date-range-picker/date-range-picker-trigger.svelte +2 -2
  157. package/dist/ui/dialog/dialog-content.svelte +4 -2
  158. package/dist/ui/dialog/dialog-header.svelte +2 -2
  159. package/dist/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -1
  160. package/dist/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
  161. package/dist/ui/dropdown-menu/dropdown-menu-group-heading.svelte +4 -1
  162. package/dist/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
  163. package/dist/ui/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  164. package/dist/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  165. package/dist/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +2 -2
  166. package/dist/ui/dropdown-menu/dropdown-menu-trigger.svelte +2 -2
  167. package/dist/ui/file-upload/file-upload.svelte +2 -2
  168. package/dist/ui/input/input.svelte +3 -3
  169. package/dist/ui/input/input.svelte.d.ts +1 -1
  170. package/dist/ui/input/textarea.svelte +1 -1
  171. package/dist/ui/input/variants.d.ts +24 -24
  172. package/dist/ui/input/variants.js +9 -9
  173. package/dist/ui/kv/kv.svelte +2 -2
  174. package/dist/ui/link-preview/link-preview-content.svelte +1 -1
  175. package/dist/ui/menubar/menubar-checkbox-item.svelte +1 -1
  176. package/dist/ui/menubar/menubar-content.svelte +1 -1
  177. package/dist/ui/menubar/menubar-group-heading.svelte +4 -1
  178. package/dist/ui/menubar/menubar-item.svelte +1 -1
  179. package/dist/ui/menubar/menubar-radio-item.svelte +1 -1
  180. package/dist/ui/menubar/menubar-root.svelte +1 -1
  181. package/dist/ui/menubar/menubar-sub-content.svelte +1 -1
  182. package/dist/ui/menubar/menubar-sub-trigger.svelte +2 -2
  183. package/dist/ui/menubar/menubar-trigger.svelte +1 -1
  184. package/dist/ui/meter/meter.svelte +1 -1
  185. package/dist/ui/pagination/pagination-next-button.svelte +1 -1
  186. package/dist/ui/pagination/pagination-prev-button.svelte +1 -1
  187. package/dist/ui/pane/pane-close.svelte +2 -2
  188. package/dist/ui/pane/pane-content.svelte +1 -1
  189. package/dist/ui/pane/pane-handle.svelte +3 -3
  190. package/dist/ui/pane/pane-root.svelte +12 -12
  191. package/dist/ui/pane/pane-tab-list.svelte +1 -1
  192. package/dist/ui/pane/pane-tab-panel.svelte +1 -1
  193. package/dist/ui/pane/pane-tab.svelte +1 -1
  194. package/dist/ui/pane/pane.svelte +1 -1
  195. package/dist/ui/pin-input/pin-input-cell.svelte +1 -1
  196. package/dist/ui/popover/popover-content.svelte +1 -1
  197. package/dist/ui/progress/progress.svelte +1 -1
  198. package/dist/ui/radio-group/radio-group-item.svelte +2 -2
  199. package/dist/ui/rating-group/rating-group-item.svelte +1 -1
  200. package/dist/ui/scroll-area/scroll-area-thumb.svelte +1 -1
  201. package/dist/ui/scroll-area/scroll-area.svelte +1 -1
  202. package/dist/ui/select/select-content.svelte +1 -1
  203. package/dist/ui/select/select-group-heading.svelte +4 -1
  204. package/dist/ui/select/select-item.svelte +1 -1
  205. package/dist/ui/select/select-trigger.svelte +2 -2
  206. package/dist/ui/select/select-value.svelte +1 -1
  207. package/dist/ui/sheet/sheet-content.svelte +3 -3
  208. package/dist/ui/sheet/sheet-content.svelte.d.ts +6 -6
  209. package/dist/ui/skeleton/skeleton.svelte +3 -3
  210. package/dist/ui/skeleton/skeleton.svelte.d.ts +9 -9
  211. package/dist/ui/slider/slider-range.svelte +1 -1
  212. package/dist/ui/slider/slider-thumb.svelte +1 -1
  213. package/dist/ui/step/step-content.svelte +1 -1
  214. package/dist/ui/step/step-summary.svelte +6 -6
  215. package/dist/ui/switch/switch.svelte +3 -3
  216. package/dist/ui/table/table-cell.svelte +1 -1
  217. package/dist/ui/table/table-head-cell.svelte +1 -1
  218. package/dist/ui/time-field/time-field-segment.svelte +1 -1
  219. package/dist/ui/time-range-field/time-range-field-segment.svelte +1 -1
  220. package/dist/ui/toggle-group/toggle-group-item.svelte +1 -1
  221. package/dist/ui/tooltip/tooltip-content.svelte +1 -1
  222. package/dist/ui/video-player/video-player.svelte +44 -44
  223. package/dist/utils/index.js +4 -4
  224. package/package.json +1 -1
@@ -6,7 +6,7 @@
6
6
 
7
7
  <!-- size="xxs", the close-affordance tier (Pane.Close, the chip dismiss): an
8
8
  18px hit target whose tier draws the 12px dismiss ink by itself. The <X>
9
- used to carry size-(--era-h-xs) — a class the Button variant's [&_svg]
9
+ used to carry size-(--era-h-icon) — a class the Button variant's [&_svg]
10
10
  selector outranks, so it claimed 14px while 10 shipped. -->
11
11
  <Button icon size="xxs" aria-label="Close" {onclick}>
12
12
  <X />
@@ -4,6 +4,6 @@
4
4
  let { children, class: className }: { children?: Snippet; class?: string } = $props();
5
5
  </script>
6
6
 
7
- <div class={cn('min-h-0 flex-1 overflow-auto p-(--era-pad-md)', className)}>
7
+ <div class={cn('min-h-0 flex-1 overflow-auto p-(--era-pad-card)', className)}>
8
8
  {@render children?.()}
9
9
  </div>
@@ -11,7 +11,7 @@
11
11
 
12
12
  <div
13
13
  class={cn(
14
- 'flex h-(--era-h-lg) shrink-0 items-center justify-between gap-(--era-gap) border-b border-divider-faded px-(--era-pad-sm)',
14
+ 'flex h-(--era-h-bar) shrink-0 items-center justify-between gap-(--era-gap) border-b border-divider-faded px-(--era-pad-panel)',
15
15
  className
16
16
  )}
17
17
  {...restProps}
@@ -11,7 +11,7 @@
11
11
 
12
12
  <div
13
13
  class={cn(
14
- 'flex min-h-0 flex-col overflow-hidden rounded-(--era-rd-lg) bg-(--era-surface-bg) shadow-(--era-shadow-lg)',
14
+ 'flex min-h-0 flex-col overflow-hidden rounded-(--era-rd-bar) bg-(--era-surface-bg) shadow-(--era-shadow-lg)',
15
15
  className
16
16
  )}
17
17
  {...restProps}
@@ -25,7 +25,7 @@
25
25
  <div class="flex flex-col items-center">
26
26
  <Icon
27
27
  class={cn(
28
- 'size-(--era-h-xs) shrink-0',
28
+ 'size-(--era-h-icon) shrink-0',
29
29
  status === 'active'
30
30
  ? 'text-bright'
31
31
  : status === 'pending'
@@ -21,7 +21,7 @@
21
21
 
22
22
  <Step.Root status={streaming ? 'running' : 'done'} bind:open class={cn(className)}>
23
23
  <Step.Summary>
24
- <Brain class="size-(--era-h-xs) shrink-0" aria-hidden="true" />
24
+ <Brain class="size-(--era-h-icon) shrink-0" aria-hidden="true" />
25
25
  {label}
26
26
  </Step.Summary>
27
27
  <Step.Content class="bg-transparent p-0 shadow-none">
@@ -19,7 +19,7 @@
19
19
  </script>
20
20
 
21
21
  <div class={cn('flex w-full items-center gap-(--era-gap) text-muted', className)}>
22
- <Bookmark class="size-(--era-h-xs) shrink-0" aria-hidden="true" />
22
+ <Bookmark class="size-(--era-h-icon) shrink-0" aria-hidden="true" />
23
23
  <Button variant="link" size="sm" onclick={onRestore}>
24
24
  {#if children}{@render children()}{:else}{label}{/if}
25
25
  </Button>
@@ -25,7 +25,7 @@
25
25
  <div
26
26
  class={cn(
27
27
  'flex min-w-0 flex-col gap-(--era-gap)',
28
- ctrl.isDirty(key) && 'border-warning border-s-2 ps-(--era-pad-sm)'
28
+ ctrl.isDirty(key) && 'border-warning border-s-2 ps-(--era-pad-panel)'
29
29
  )}
30
30
  >
31
31
  <span class="text-[0.625rem] leading-none tracking-[0.15em] text-muted uppercase"
@@ -46,7 +46,7 @@
46
46
  }}
47
47
  spellcheck={false}
48
48
  class={cn(
49
- 'min-h-(--era-h-lg) font-mono text-body',
49
+ 'min-h-(--era-h-bar) font-mono text-body',
50
50
  !ctrl.isValid(key) && 'border border-destructive'
51
51
  )}
52
52
  />
@@ -19,17 +19,17 @@
19
19
 
20
20
  <div
21
21
  class={cn(
22
- 'flex min-w-0 flex-col gap-(--era-gap) rounded-(--era-rd-lg) bg-(--era-surface-bg) p-(--era-pad-sm) shadow-(--era-shadow)',
22
+ 'flex min-w-0 flex-col gap-(--era-gap) rounded-(--era-rd-bar) bg-(--era-surface-bg) p-(--era-pad-panel) shadow-(--era-shadow)',
23
23
  className
24
24
  )}
25
25
  >
26
26
  <div class="flex items-center gap-(--era-gap) text-body">
27
27
  {#if approval === 'requested'}
28
- <ShieldQuestion class="size-(--era-h-xs) shrink-0 text-warning" aria-hidden="true" />
28
+ <ShieldQuestion class="size-(--era-h-icon) shrink-0 text-warning" aria-hidden="true" />
29
29
  {:else if approval === 'approved'}
30
- <CircleCheck class="size-(--era-h-xs) shrink-0 text-success" aria-hidden="true" />
30
+ <CircleCheck class="size-(--era-h-icon) shrink-0 text-success" aria-hidden="true" />
31
31
  {:else}
32
- <CircleX class="size-(--era-h-xs) shrink-0 text-destructive" aria-hidden="true" />
32
+ <CircleX class="size-(--era-h-icon) shrink-0 text-destructive" aria-hidden="true" />
33
33
  {/if}
34
34
  <div class="min-w-0 flex-1 text-fg">{@render children?.()}</div>
35
35
  </div>
@@ -25,7 +25,7 @@
25
25
  <Popover.Root>
26
26
  <Popover.Trigger size="sm" class={cn('gap-(--era-gap) tabular-nums', className)}>
27
27
  {Math.round(percent * 100)}%
28
- <svg viewBox="0 0 24 24" class="size-(--era-h-xs) -rotate-90" aria-hidden="true">
28
+ <svg viewBox="0 0 24 24" class="size-(--era-h-icon) -rotate-90" aria-hidden="true">
29
29
  <circle cx="12" cy="12" r="10" fill="none" stroke="var(--color-3)" stroke-width="3" />
30
30
  <circle
31
31
  cx="12"
@@ -25,7 +25,7 @@
25
25
  <div
26
26
  {@attach stick.content}
27
27
  class={cn(
28
- 'mx-auto flex w-full max-w-2xl flex-col gap-(--era-pad-lg) p-(--era-pad-md)',
28
+ 'mx-auto flex w-full max-w-2xl flex-col gap-(--era-pad-content) p-(--era-pad-card)',
29
29
  className
30
30
  )}
31
31
  {...restProps}
@@ -20,7 +20,7 @@
20
20
 
21
21
  <div
22
22
  class={cn(
23
- 'flex flex-1 flex-col items-center justify-center gap-(--era-gap) p-(--era-pad-lg) text-center',
23
+ 'flex flex-1 flex-col items-center justify-center gap-(--era-gap) p-(--era-pad-content) text-center',
24
24
  className
25
25
  )}
26
26
  {...restProps}
@@ -11,7 +11,7 @@
11
11
 
12
12
  {#if !stick.pinned}
13
13
  <div
14
- class={cn('absolute bottom-(--era-pad-sm) left-1/2 z-10 -translate-x-1/2', className)}
14
+ class={cn('absolute bottom-(--era-pad-panel) left-1/2 z-10 -translate-x-1/2', className)}
15
15
  transition:eraFly={{ y: 8 }}
16
16
  >
17
17
  <Button
@@ -21,7 +21,7 @@
21
21
  class="rounded-full shadow-(--era-shadow-lg)"
22
22
  onclick={() => stick.repin()}
23
23
  >
24
- <ArrowDown class="size-(--era-h-xs)" />
24
+ <ArrowDown class="size-(--era-h-icon)" />
25
25
  </Button>
26
26
  </div>
27
27
  {/if}
@@ -19,7 +19,7 @@
19
19
  <div class={cn('flex min-w-0 flex-col gap-(--era-gap)', className)} {...restProps}>
20
20
  {#if label}
21
21
  <span
22
- class="px-(--era-inset-md) text-[0.625rem] era-text-trim-caps leading-none tracking-[0.15em] text-muted uppercase"
22
+ class="px-(--era-inset-control) text-[0.625rem] era-text-trim-caps leading-none tracking-[0.15em] text-muted uppercase"
23
23
  >
24
24
  {label}
25
25
  </span>
@@ -129,7 +129,7 @@
129
129
  <div
130
130
  data-active={active || undefined}
131
131
  class={cn(
132
- // The trailing buttons are xxs-tier icon buttons: h-xxs box + h-xs glyph =
132
+ // The trailing buttons are xxs-tier icon buttons: h-pill box + h-icon glyph =
133
133
  // 2px of air around the glyph (xs/icon would hug it flush — density.css:
134
134
  // "xs IS the icon tier"). pr is their concentric inset: a button's rounded
135
135
  // box nests in the row's rd-md corner only when its right gap equals
@@ -144,7 +144,7 @@
144
144
  // a fast pass down the list into a smear of half-lit rows. This row was the
145
145
  // only one that animated. It also picks up the material half of the
146
146
  // highlight the others carry, so hover reads on bevel and glass too.
147
- 'group/row relative flex h-(--era-h-md) items-center gap-(--era-gap) rounded-(--era-rd-md) pr-(--era-xxs-inset-md) pl-(--era-inset-md) text-body',
147
+ 'group/row relative flex h-(--era-h-control) items-center gap-(--era-gap) rounded-(--era-rd-control) pr-(--era-pill-inset-control) pl-(--era-inset-control) text-body',
148
148
  active
149
149
  ? 'bg-hover text-bright'
150
150
  : 'text-fg hover:bg-(--era-highlight) hover:shadow-(--era-highlight-shadow) has-[[data-rail]:hover]:bg-transparent has-[[data-rail]:hover]:shadow-none',
@@ -157,7 +157,7 @@
157
157
  {#if leading}
158
158
  {@render leading()}
159
159
  {:else}
160
- <MessageSquare class="size-(--era-h-xs) shrink-0 text-muted" aria-hidden="true" />
160
+ <MessageSquare class="size-(--era-h-icon) shrink-0 text-muted" aria-hidden="true" />
161
161
  {/if}
162
162
 
163
163
  {#if status}
@@ -208,12 +208,12 @@
208
208
  aria-pressed={starred}
209
209
  onclick={toggleStar}
210
210
  >
211
- <Star class={cn('size-(--era-h-xs)', starred && 'fill-warning text-warning')} />
211
+ <Star class={cn('size-(--era-h-icon)', starred && 'fill-warning text-warning')} />
212
212
  </Button>
213
213
 
214
214
  {#if showCancel}
215
215
  <Button icon size="xxs" aria-label="Cancel generation" onclick={() => onCancel?.()}>
216
- <X class="size-(--era-h-xs)" />
216
+ <X class="size-(--era-h-icon)" />
217
217
  </Button>
218
218
  {/if}
219
219
 
@@ -226,9 +226,9 @@
226
226
  onclick={onDeleteClick}
227
227
  >
228
228
  {#if armed}
229
- <Check class="size-(--era-h-xs)" />
229
+ <Check class="size-(--era-h-icon)" />
230
230
  {:else}
231
- <Trash2 class="size-(--era-h-xs)" />
231
+ <Trash2 class="size-(--era-h-icon)" />
232
232
  {/if}
233
233
  </Button>
234
234
  </div>
@@ -54,9 +54,9 @@
54
54
 
55
55
  {#snippet head()}
56
56
  {#if info.tone === 'warning'}
57
- <TriangleAlert class="size-(--era-h-xs) shrink-0 text-warning" aria-hidden="true" />
57
+ <TriangleAlert class="size-(--era-h-icon) shrink-0 text-warning" aria-hidden="true" />
58
58
  {:else}
59
- <CircleX class="size-(--era-h-xs) shrink-0 text-destructive" aria-hidden="true" />
59
+ <CircleX class="size-(--era-h-icon) shrink-0 text-destructive" aria-hidden="true" />
60
60
  {/if}
61
61
  <span class="min-w-0 flex-1 truncate text-fg">{summary}</span>
62
62
  {/snippet}
@@ -65,7 +65,7 @@
65
65
  bind:open
66
66
  data-tone={info.tone}
67
67
  class={cn(
68
- 'group/error flex min-w-0 flex-col gap-(--era-gap) rounded-(--era-rd-lg) bg-(--era-surface-bg) p-(--era-pad-sm) shadow-(--era-shadow)',
68
+ 'group/error flex min-w-0 flex-col gap-(--era-gap) rounded-(--era-rd-bar) bg-(--era-surface-bg) p-(--era-pad-panel) shadow-(--era-shadow)',
69
69
  className
70
70
  )}
71
71
  {...restProps}
@@ -77,7 +77,7 @@
77
77
  >
78
78
  {@render head()}
79
79
  <ChevronDown
80
- class="size-(--era-h-xs) shrink-0 transition-transform duration-(--era-duration) ease-(--era-ease) group-data-[state=open]/error:rotate-180"
80
+ class="size-(--era-h-icon) shrink-0 transition-transform duration-(--era-duration) ease-(--era-ease) group-data-[state=open]/error:rotate-180"
81
81
  aria-hidden="true"
82
82
  />
83
83
  </Collapsible.Trigger>
@@ -14,6 +14,6 @@
14
14
  <img
15
15
  src="data:{mediaType};base64,{base64}"
16
16
  {alt}
17
- class={cn('max-w-full rounded-(--era-rd-md) shadow-(--era-shadow)', className)}
17
+ class={cn('max-w-full rounded-(--era-rd-control) shadow-(--era-shadow)', className)}
18
18
  {...restProps}
19
19
  />
@@ -51,7 +51,7 @@
51
51
  aria-label="Previous source"
52
52
  onclick={() => (index = (index - 1 + sources.length) % sources.length)}
53
53
  >
54
- <ChevronLeft class="size-(--era-h-xs)" />
54
+ <ChevronLeft class="size-(--era-h-icon)" />
55
55
  </Button>
56
56
  <Button
57
57
  icon
@@ -59,7 +59,7 @@
59
59
  aria-label="Next source"
60
60
  onclick={() => (index = (index + 1) % sources.length)}
61
61
  >
62
- <ChevronRight class="size-(--era-h-xs)" />
62
+ <ChevronRight class="size-(--era-h-icon)" />
63
63
  </Button>
64
64
  </div>
65
65
  </div>
@@ -6,6 +6,6 @@
6
6
  </script>
7
7
 
8
8
  <LoaderCircle
9
- class={cn('size-(--era-h-xs) animate-spin text-muted', className)}
9
+ class={cn('size-(--era-h-icon) animate-spin text-muted', className)}
10
10
  aria-label="Loading"
11
11
  />
@@ -13,13 +13,13 @@
13
13
  {#if ctrl.total > 1}
14
14
  <ButtonGroup class={cn(className)}>
15
15
  <Button icon size="sm" aria-label="Previous version" onclick={() => ctrl.previous()}>
16
- <ChevronLeft class="size-(--era-h-xs)" />
16
+ <ChevronLeft class="size-(--era-h-icon)" />
17
17
  </Button>
18
- <span class="flex items-center px-(--era-inset-sm) text-body text-muted tabular-nums">
18
+ <span class="flex items-center px-(--era-inset-chip) text-body text-muted tabular-nums">
19
19
  {ctrl.current + 1} of {ctrl.total}
20
20
  </span>
21
21
  <Button icon size="sm" aria-label="Next version" onclick={() => ctrl.next()}>
22
- <ChevronRight class="size-(--era-h-xs)" />
22
+ <ChevronRight class="size-(--era-h-icon)" />
23
23
  </Button>
24
24
  </ButtonGroup>
25
25
  {/if}
@@ -17,7 +17,7 @@
17
17
  <div
18
18
  class={cn(
19
19
  'min-w-0 text-body leading-body text-fg',
20
- 'group-data-[role=user]/message:max-w-[80%] group-data-[role=user]/message:rounded-(--era-rd-md) group-data-[role=user]/message:bg-(--era-surface-bg-elevated) group-data-[role=user]/message:p-(--era-pad-sm) group-data-[role=user]/message:whitespace-pre-wrap group-data-[role=user]/message:shadow-(--era-shadow)',
20
+ 'group-data-[role=user]/message:max-w-[80%] group-data-[role=user]/message:rounded-(--era-rd-control) group-data-[role=user]/message:bg-(--era-surface-bg-elevated) group-data-[role=user]/message:p-(--era-pad-panel) group-data-[role=user]/message:whitespace-pre-wrap group-data-[role=user]/message:shadow-(--era-shadow)',
21
21
  className
22
22
  )}
23
23
  {...restProps}
@@ -84,7 +84,7 @@
84
84
 
85
85
  <div
86
86
  class={cn(
87
- 'flex items-center gap-(--era-inset-sm) font-mono text-body era-text-trim text-muted tabular-nums',
87
+ 'flex items-center gap-(--era-inset-chip) font-mono text-body era-text-trim text-muted tabular-nums',
88
88
  className
89
89
  )}
90
90
  {...restProps}
@@ -103,14 +103,14 @@
103
103
  class="inline-flex items-center text-muted transition-colors duration-(--era-duration) ease-(--era-ease) hover:text-fg"
104
104
  aria-label="Context window breakdown"
105
105
  >
106
- <Info class="size-(--era-h-xs)" aria-hidden="true" />
106
+ <Info class="size-(--era-h-icon)" aria-hidden="true" />
107
107
  </Tooltip.Trigger>
108
108
  <Tooltip.Content
109
- class="h-auto flex-col items-start gap-(--era-inset-xxs) py-(--era-inset-xxs) whitespace-normal"
109
+ class="h-auto flex-col items-start gap-(--era-inset-pill) py-(--era-inset-pill) whitespace-normal"
110
110
  >
111
111
  {#each rows as [label, value] (label)}
112
112
  <span
113
- class="flex w-full items-center justify-between gap-(--era-inset-md) tabular-nums"
113
+ class="flex w-full items-center justify-between gap-(--era-inset-control) tabular-nums"
114
114
  >
115
115
  <span class="text-muted">{label}</span>
116
116
  <span>{formatTokens(value)}</span>
@@ -43,7 +43,7 @@
43
43
  <img
44
44
  src="https://models.dev/logos/{m.provider}.svg"
45
45
  alt=""
46
- class="size-(--era-h-xs) shrink-0 dark:invert"
46
+ class="size-(--era-h-icon) shrink-0 dark:invert"
47
47
  />
48
48
  {/if}
49
49
  <span class="truncate">{m.name}</span>
@@ -38,14 +38,14 @@
38
38
  <DropdownMenu.Root>
39
39
  <DropdownMenu.Trigger class={cn(className)}>
40
40
  Open in chat
41
- <ChevronDown class="size-(--era-h-xs)" />
41
+ <ChevronDown class="size-(--era-h-icon)" />
42
42
  </DropdownMenu.Trigger>
43
43
  <DropdownMenu.Content align="start">
44
44
  {#each include as id (id)}
45
45
  <DropdownMenu.Item
46
46
  onSelect={() => window.open(providers[id].url(query), '_blank', 'noreferrer')}
47
47
  >
48
- <ExternalLink class="size-(--era-h-xs) text-muted" />
48
+ <ExternalLink class="size-(--era-h-icon) text-muted" />
49
49
  {providers[id].title}
50
50
  </DropdownMenu.Item>
51
51
  {/each}
@@ -7,7 +7,7 @@
7
7
  </script>
8
8
 
9
9
  <Collapsible.Content
10
- class={cn('flex flex-col gap-(--era-gap) overflow-hidden p-(--era-inset-md)', className)}
10
+ class={cn('flex flex-col gap-(--era-gap) overflow-hidden p-(--era-inset-control)', className)}
11
11
  >
12
12
  {@render children?.()}
13
13
  </Collapsible.Content>
@@ -13,10 +13,10 @@
13
13
 
14
14
  <Collapsible.Trigger
15
15
  class={cn(
16
- 'flex h-(--era-h-md) w-full era-interactive cursor-pointer items-center gap-(--era-gap) rounded-(--era-rd-md) px-(--era-inset-md) text-body text-bright hover:bg-(--era-highlight)',
16
+ 'flex h-(--era-h-control) w-full era-interactive cursor-pointer items-center gap-(--era-gap) rounded-(--era-rd-control) px-(--era-inset-control) text-body text-bright hover:bg-(--era-highlight)',
17
17
  className
18
18
  )}
19
19
  >
20
20
  {#if children}{@render children()}{:else}<span class="truncate font-medium">{title}</span>{/if}
21
- <ChevronsUpDown class="ml-auto size-(--era-h-xs) shrink-0 text-muted" />
21
+ <ChevronsUpDown class="ml-auto size-(--era-h-icon) shrink-0 text-muted" />
22
22
  </Collapsible.Trigger>
@@ -15,7 +15,7 @@
15
15
  bind:open
16
16
  data-streaming={streaming || undefined}
17
17
  class={cn(
18
- 'group/plan flex flex-col rounded-(--era-rd-lg) bg-(--era-surface-bg) p-(--era-pad-sm) shadow-(--era-shadow)',
18
+ 'group/plan flex flex-col rounded-(--era-rd-bar) bg-(--era-surface-bg) p-(--era-pad-panel) shadow-(--era-shadow)',
19
19
  className
20
20
  )}
21
21
  >
@@ -8,5 +8,5 @@
8
8
  </script>
9
9
 
10
10
  <Button icon size="default" aria-label={label} onclick={() => attachments.openFileDialog()}>
11
- <Plus class="size-(--era-h-xs)" />
11
+ <Plus class="size-(--era-h-icon)" />
12
12
  </Button>
@@ -16,15 +16,15 @@
16
16
  <img
17
17
  src={a.previewUrl}
18
18
  alt={a.filename}
19
- class="size-(--era-h-lg) rounded-(--era-rd-lg) object-cover shadow-(--era-shadow)"
19
+ class="size-(--era-h-bar) rounded-(--era-rd-bar) object-cover shadow-(--era-shadow)"
20
20
  />
21
21
  {:else}
22
22
  <!-- md control geometry, like a Button with an icon: wall inset and
23
- icon gap both --era-inset-md, ink centered by era-text-trim. -->
23
+ icon gap both --era-inset-control, ink centered by era-text-trim. -->
24
24
  <div
25
- class="flex h-(--era-h-md) items-center gap-(--era-inset-md) rounded-(--era-rd-md) bg-(--era-surface-bg) px-(--era-inset-md) text-body era-text-trim text-muted shadow-(--era-shadow)"
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)"
26
26
  >
27
- <Paperclip class="size-(--era-h-xs) shrink-0" />
27
+ <Paperclip class="size-(--era-h-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-icon-xxs)"
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)"
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-xs) animate-spin" />
43
+ <LoaderCircle class="size-(--era-h-icon) animate-spin" />
44
44
  {:else if status === 'streaming'}
45
- <Square class="size-[calc(var(--era-h-xs)*0.75)]" fill="currentColor" />
45
+ <Square class="size-[calc(var(--era-h-icon)*0.75)]" fill="currentColor" />
46
46
  {:else}
47
- <ArrowUp class="size-(--era-h-xs)" />
47
+ <ArrowUp class="size-(--era-h-icon)" />
48
48
  {/if}
49
49
  </Button>
@@ -40,10 +40,10 @@
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-md, px-(--era-inset-md), text-body, text-fg) so the toolbar
43
+ (Input = h-control, px-(--era-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
- py = (h-md − 1lh)/2 — exact at every density and any leading. Input's
46
+ py = (h-control − 1lh)/2 — exact at every density and any leading. Input's
47
47
  era-text-trim doesn't apply: it trims the very line box this padding is
48
48
  derived from and would top-anchor the text against min-h. -->
49
49
  <textarea
@@ -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-md) w-full resize-none bg-transparent px-(--era-inset-md) py-[calc((var(--era-h-md)-1lh)/2)] text-body leading-body text-fg outline-none placeholder:text-muted',
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',
62
62
  className
63
63
  )}
64
64
  {...restProps}></textarea>
@@ -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-lg) 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-(--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)',
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-md) px-(--era-inset-md) py-(--era-gap) text-body hover:bg-(--era-highlight)',
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)',
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-lg) bg-(--era-surface-bg) p-(--era-pad-sm) shadow-(--era-shadow)',
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)',
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-xs) shrink-0" aria-hidden="true" />
14
+ <Brain class="size-(--era-h-icon) shrink-0" aria-hidden="true" />
15
15
  {#if children}
16
16
  {@render children()}
17
17
  {:else if streaming || duration === 0}
@@ -72,13 +72,13 @@
72
72
  }
73
73
  .era-response :global(blockquote) {
74
74
  border-inline-start: 2px solid var(--color-border);
75
- padding-inline-start: var(--era-pad-sm);
75
+ padding-inline-start: var(--era-pad-panel);
76
76
  color: var(--color-muted);
77
77
  }
78
78
  .era-response :global(code) {
79
79
  font-family: var(--font-mono, monospace);
80
80
  background: var(--color-2);
81
- border-radius: var(--era-rd-xxs);
81
+ border-radius: var(--era-rd-pill);
82
82
  padding-inline: 0.25em;
83
83
  }
84
84
  .era-response :global(strong) {
@@ -83,15 +83,15 @@
83
83
  role="status"
84
84
  aria-live="polite"
85
85
  class={cn(
86
- 'flex flex-col rounded-(--era-rd-lg) bg-(--era-surface-bg) shadow-(--era-shadow)',
86
+ 'flex flex-col rounded-(--era-rd-bar) bg-(--era-surface-bg) shadow-(--era-shadow)',
87
87
  className
88
88
  )}
89
89
  {...restProps}
90
90
  >
91
- <div class="flex h-(--era-h-md) items-center gap-(--era-gap) px-(--era-inset-md)">
91
+ <div class="flex h-(--era-h-control) items-center gap-(--era-gap) px-(--era-inset-control)">
92
92
  <!-- leading status dot + label -->
93
93
  <span
94
- class="flex items-center gap-(--era-inset-xxs) font-mono text-body {style.text} era-text-trim"
94
+ class="flex items-center gap-(--era-inset-pill) font-mono text-body {style.text} era-text-trim"
95
95
  >
96
96
  <span class={cn('size-1.5 shrink-0 rounded-full', style.dot, style.pulse && 'animate-pulse')}
97
97
  ></span>
@@ -116,7 +116,7 @@
116
116
 
117
117
  {#if style.active && oncancel}
118
118
  <Button size="xs" tone="destructive" onclick={() => oncancel?.()}>
119
- <X class="size-(--era-h-xs)" aria-hidden="true" />
119
+ <X class="size-(--era-h-icon)" aria-hidden="true" />
120
120
  Cancel
121
121
  </Button>
122
122
  {/if}
@@ -125,7 +125,7 @@
125
125
  {#if latest}
126
126
  <div
127
127
  class={cn(
128
- 'truncate px-(--era-inset-md) pb-(--era-inset-sm) font-mono text-body',
128
+ 'truncate px-(--era-inset-control) pb-(--era-inset-chip) font-mono text-body',
129
129
  LOG_TONE[latest.tone]
130
130
  )}
131
131
  >
@@ -55,7 +55,7 @@
55
55
  {...restProps}
56
56
  >
57
57
  <!-- size-2, the library's dot size (conversations row, run status, swarm) —
58
- NOT a tier height: h-xxs is the pill tier (18-26px), which rendered this
58
+ NOT a tier height: h-pill is the pill tier (18-26px), which rendered this
59
59
  as a bullet taller than the line it marks. -->
60
60
  <span class="size-2 shrink-0 rounded-full bg-current" aria-hidden="true"></span>
61
61
  <span class="min-w-0 flex-1 truncate">
@@ -11,6 +11,6 @@
11
11
  rel="noreferrer"
12
12
  class="flex items-center gap-(--era-gap) text-body text-fg hover:text-bright hover:underline"
13
13
  >
14
- <BookOpen class="size-(--era-h-xs) shrink-0 text-muted" aria-hidden="true" />
14
+ <BookOpen class="size-(--era-h-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-xs) shrink-0" aria-hidden="true" />
10
+ <BookMarked class="size-(--era-h-icon) shrink-0" aria-hidden="true" />
11
11
  {#if children}{@render children()}{:else}Used {count} source{count === 1 ? '' : 's'}{/if}
12
12
  </Step.Summary>
@@ -97,7 +97,7 @@
97
97
  {:else}
98
98
  <div class="flex min-w-0 flex-col gap-(--era-gap)">
99
99
  {@render tag(kind, label)}
100
- <div class="border-l border-divider pl-(--era-inset-md)">
100
+ <div class="border-l border-divider pl-(--era-inset-control)">
101
101
  <Self value={v} depth={depth + 1} />
102
102
  </div>
103
103
  </div>