@signal9/era-ui 10.0.0 → 10.1.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 (47) hide show
  1. package/dist/ai/index.js +1 -1
  2. package/dist/ai/message/message-usage.svelte +1 -1
  3. package/dist/ai/prompt-input/prompt-input-attachments.svelte +1 -1
  4. package/dist/ai/run-status/run-status.svelte +3 -2
  5. package/dist/ai/swarm/swarm-agent.svelte +2 -2
  6. package/dist/ai/swarm/swarm-artifact.svelte +1 -1
  7. package/dist/ai/swarm/swarm-barrier.svelte +1 -1
  8. package/dist/ai/swarm/swarm-footer.svelte +3 -2
  9. package/dist/ai/swarm/swarm-header.svelte +1 -1
  10. package/dist/ai/swarm/swarm-node.svelte +1 -1
  11. package/dist/ai/swarm/swarm-role.svelte +5 -2
  12. package/dist/ai/tool/tool-chip.svelte +1 -1
  13. package/dist/apps/index.d.ts +3 -3
  14. package/dist/apps/index.js +3 -3
  15. package/dist/apps/notes/editor/slash-menu.svelte +2 -4
  16. package/dist/apps/notes/notes.svelte +1 -1
  17. package/dist/dev/audit/audits/anonymous-text.d.ts +2 -0
  18. package/dist/dev/audit/audits/anonymous-text.js +73 -0
  19. package/dist/dev/audit/audits/index.d.ts +2 -1
  20. package/dist/dev/audit/audits/index.js +3 -1
  21. package/dist/dev/audit/types.d.ts +1 -1
  22. package/dist/docs/css-utilities.js +1 -1
  23. package/dist/docs/llms-txt.js +2 -2
  24. package/dist/docs/notes.md +3 -3
  25. package/dist/era-ui.css +1 -1
  26. package/dist/generated-docs/llms-full.txt +96 -16
  27. package/dist/generated-docs/llms.txt +11 -7
  28. package/dist/generated-docs/manifest.json +28 -7
  29. package/dist/generated-docs/notes.md +3 -3
  30. package/dist/generated-docs/utilities.json +23 -4
  31. package/dist/generated-docs/utilities.md +82 -6
  32. package/dist/styles/index.css +43 -5
  33. package/dist/ui/bar/bar.svelte +1 -1
  34. package/dist/ui/bar/bar.svelte.d.ts +1 -1
  35. package/dist/ui/button/button.svelte +12 -1
  36. package/dist/ui/button/variants.d.ts +1 -1
  37. package/dist/ui/button/variants.js +1 -1
  38. package/dist/ui/chip/chip.svelte +13 -3
  39. package/dist/ui/chip/chip.svelte.d.ts +1 -1
  40. package/dist/ui/command/command-item.svelte +1 -1
  41. package/dist/ui/command/command-link-item.svelte +1 -1
  42. package/dist/ui/command-bar/command-bar.svelte +1 -1
  43. package/dist/ui/index.js +1 -1
  44. package/dist/ui/kv/kv.svelte +1 -1
  45. package/dist/ui/select/select-trigger.svelte +1 -1
  46. package/dist/ui/step/step-summary.svelte +1 -1
  47. package/package.json +1 -1
package/dist/ai/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // era-ui take on Vercel's AI Elements (via the Svelte port). Namespaced parts
3
3
  // for the families, flat exports for the singles. `workflow/` is deliberately
4
4
  // NOT exported here: it depends on @xyflow/svelte and lives on its own
5
- // subpath (`@sig-nine/era-ui/ai/workflow`) so the dependency stays opt-in.
5
+ // subpath (`@signal9/era-ui/ai/workflow`) so the dependency stays opt-in.
6
6
  export * as Conversation from './conversation/index.js';
7
7
  export * as Message from './message/index.js';
8
8
  export * as PromptInput from './prompt-input/index.js';
@@ -84,7 +84,7 @@
84
84
 
85
85
  <div
86
86
  class={cn(
87
- 'flex items-center gap-(--era-inset-chip) font-mono text-body era-text-trim text-muted tabular-nums',
87
+ 'flex items-center gap-(--era-inset-chip) font-mono text-body leading-none text-muted tabular-nums',
88
88
  className
89
89
  )}
90
90
  {...restProps}
@@ -22,7 +22,7 @@
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-(--era-h-control) items-center gap-(--era-inset-control) rounded-(--era-rd-control) bg-(--era-surface-bg) px-(--era-inset-control) text-body leading-none text-muted shadow-(--era-shadow)"
26
26
  >
27
27
  <Paperclip class="size-(--era-h-icon) shrink-0" />
28
28
  <span class="max-w-32 truncate">{a.filename}</span>
@@ -91,11 +91,12 @@
91
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-pill) font-mono text-body {style.text} era-text-trim"
94
+ class="flex items-center gap-(--era-inset-pill) font-mono text-body {style.text} leading-none"
95
95
  >
96
96
  <span class={cn('size-1.5 shrink-0 rounded-full', style.dot, style.pulse && 'animate-pulse')}
97
97
  ></span>
98
- {style.label}
98
+ <!-- Own box, so the trim applies — see Role for the anonymous-item rule. -->
99
+ <span class="era-text-trim">{style.label}</span>
99
100
  </span>
100
101
 
101
102
  {#if tools}
@@ -61,7 +61,7 @@
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-(--era-gap) 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-(--era-gap) text-body leading-none text-muted">
89
89
  {#if agent.sandbox}
90
90
  <Sandbox sandbox={agent.sandbox} label />
91
91
  {/if}
@@ -43,7 +43,7 @@
43
43
  class={cn('flex min-w-0 flex-col gap-(--era-gap) p-(--era-pad-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-(--era-gap) 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>
@@ -40,7 +40,7 @@
40
40
  class={cn('flex min-w-0 flex-col gap-(--era-gap)', className)}
41
41
  {...restProps}
42
42
  >
43
- <div class="flex min-w-0 items-center gap-(--era-gap) text-body era-text-trim">
43
+ <div class="flex min-w-0 items-center gap-(--era-gap) text-body leading-none">
44
44
  <GitMerge class="size-(--era-h-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}
@@ -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-(--era-h-control) shrink-0 items-center gap-(--era-gap) border-t border-divider-faded px-(--era-inset-control) font-mono text-body leading-none',
54
54
  className
55
55
  )}
56
56
  {...restProps}
57
57
  >
58
58
  <span class={cn('flex shrink-0 items-center gap-(--era-gap)', 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. -->
@@ -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-(--era-h-control) shrink-0 items-center gap-(--era-gap) px-(--era-inset-control) text-body leading-none',
47
47
  className
48
48
  )}
49
49
  {...restProps}
@@ -160,7 +160,7 @@
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',
163
+ 'flex h-(--era-h-control) items-center gap-(--era-gap) rounded-(--era-rd-control) pl-(--era-inset-control) text-body leading-none',
164
164
  hasActions ? 'pr-(--era-pill-inset-control)' : 'pr-(--era-inset-control)',
165
165
  (hasChildren || hasDetail) && 'cursor-pointer',
166
166
  active
@@ -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-(--era-gap) 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
62
  <Icon class="size-(--era-h-icon) shrink-0" aria-hidden="true" />
63
- {name}
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>
@@ -47,7 +47,7 @@
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-(--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 leading-none text-muted transition-colors duration-(--era-duration) ease-(--era-ease) hover:bg-(--era-highlight) hover:text-fg',
51
51
  active && 'bg-fill text-fg',
52
52
  className
53
53
  )}
@@ -7,11 +7,11 @@
7
7
  * makes product decisions a primitive never would, which is exactly why these
8
8
  * live behind their own subpath instead of the root barrel.
9
9
  *
10
- * Apps are NOT re-exported from `@sig-nine/era-ui`. Each carries heavy,
10
+ * Apps are NOT re-exported from `@signal9/era-ui`. Each carries heavy,
11
11
  * app-specific dependencies (Notes brings TipTap), and the same reasoning that
12
12
  * isolates `ai/workflow` on its own subpath applies here: a consumer who never
13
- * imports an app never pays for it. Import from `@sig-nine/era-ui/apps` (or a
14
- * single app, e.g. `@sig-nine/era-ui/apps/notes`) and install that app's peers.
13
+ * imports an app never pays for it. Import from `@signal9/era-ui/apps` (or a
14
+ * single app, e.g. `@signal9/era-ui/apps/notes`) and install that app's peers.
15
15
  *
16
16
  * Exports are flat and prefixed by app (`Notes`, `NotesStore`, `NoteEditor`) so
17
17
  * a second app can land without a namespace churn.
@@ -7,11 +7,11 @@
7
7
  * makes product decisions a primitive never would, which is exactly why these
8
8
  * live behind their own subpath instead of the root barrel.
9
9
  *
10
- * Apps are NOT re-exported from `@sig-nine/era-ui`. Each carries heavy,
10
+ * Apps are NOT re-exported from `@signal9/era-ui`. Each carries heavy,
11
11
  * app-specific dependencies (Notes brings TipTap), and the same reasoning that
12
12
  * isolates `ai/workflow` on its own subpath applies here: a consumer who never
13
- * imports an app never pays for it. Import from `@sig-nine/era-ui/apps` (or a
14
- * single app, e.g. `@sig-nine/era-ui/apps/notes`) and install that app's peers.
13
+ * imports an app never pays for it. Import from `@signal9/era-ui/apps` (or a
14
+ * single app, e.g. `@signal9/era-ui/apps/notes`) and install that app's peers.
15
15
  *
16
16
  * Exports are flat and prefixed by app (`Notes`, `NotesStore`, `NoteEditor`) so
17
17
  * a second app can land without a namespace churn.
@@ -53,9 +53,7 @@
53
53
  class="scrollbar-none flex max-h-[calc(var(--era-h-control)*8)] w-max min-w-48 flex-col overflow-y-auto rounded-control bg-elevated p-menu shadow-lg glass-blur"
54
54
  >
55
55
  {#if items.length === 0}
56
- <div
57
- class="flex h-control shrink-0 items-center px-inset-control text-body era-text-trim text-muted"
58
- >
56
+ <div class="era-label-ink h-control shrink-0 px-inset-control text-body text-muted">
59
57
  No commands
60
58
  </div>
61
59
  {:else}
@@ -63,7 +61,7 @@
63
61
  {@const Icon = item.icon}
64
62
  <button
65
63
  type="button"
66
- class="flex h-control w-full shrink-0 cursor-pointer items-center gap-gutter rounded-menu-item px-inset-control text-left text-body era-text-trim text-fg {i ===
64
+ class="flex h-control w-full shrink-0 cursor-pointer items-center gap-gutter rounded-menu-item px-inset-control text-left text-body leading-none text-fg {i ===
67
65
  selected
68
66
  ? 'bg-highlight shadow-highlight'
69
67
  : ''}"
@@ -331,7 +331,7 @@
331
331
  {#snippet child({ props })}
332
332
  <div
333
333
  {...props}
334
- class="group/row flex h-control cursor-pointer items-center gap-(--era-pill-inset-control) rounded-control px-(--era-pill-inset-control) era-text-trim {current
334
+ class="group/row flex h-control cursor-pointer items-center gap-(--era-pill-inset-control) rounded-control px-(--era-pill-inset-control) leading-none {current
335
335
  ? 'bg-hover text-bright shadow-(--era-shadow-pressed)'
336
336
  : 'hover:bg-highlight hover:shadow-highlight'}"
337
337
  role="option"
@@ -0,0 +1,2 @@
1
+ import type { Audit } from '../types.js';
2
+ export declare const anonymousText: Audit;
@@ -0,0 +1,73 @@
1
+ /*
2
+ * A flex row that centres its OWN bare text — the one place ink centring
3
+ * cannot be applied, and so the one place it silently isn't.
4
+ *
5
+ * `text-box-trim` is era's mechanism for centring INK rather than the font box:
6
+ * it collapses the line box to a typographic band so what you see is centred
7
+ * rather than what the metrics measure. It applies to a BLOCK box. It cannot
8
+ * apply to bare text inside a flex container, because that text is wrapped in
9
+ * an ANONYMOUS flex item — a box no selector reaches and no non-inherited
10
+ * property touches. `text-box-trim` is not inherited, so it never arrives.
11
+ *
12
+ * Proven rather than reasoned: the same pill rendered `flex + trim` and `flex,
13
+ * no trim` produces IDENTICAL ink, to the device pixel. Centring then falls
14
+ * back to `align-items` on the LINE BOX — precisely the font-metric-dependent
15
+ * centring the trim exists to eliminate. On the shipped mono stack that put a
16
+ * badge's caps 2px high in an 18px pill.
17
+ *
18
+ * This audit deliberately does NOT look for the `era-text-trim` class. That was
19
+ * the first version, and it was the wrong instrument: deleting an inert class
20
+ * silences it while leaving the text exactly as mis-centred as before. What
21
+ * matters is the SHAPE — a centring flex row with a text node of its own — so
22
+ * that is what it measures. It stays true after the cleanup.
23
+ *
24
+ * Two kinds of hit, and only one of them is the author's to fix:
25
+ *
26
+ * FIXABLE — the row holds nothing but text. It has no reason to be flex; as a
27
+ * block with `era-label-ink` (or `era-token-ink` for a centred token) the trim
28
+ * works and the centring stops depending on the font.
29
+ *
30
+ * STRUCTURAL — the row holds an icon AND text. The box must stay flex to lay
31
+ * the two out, which re-creates the anonymous item, and no CSS reaches it.
32
+ * Components take the `not-has-[svg]:era-label-ink` guard so the text-only
33
+ * case is centred properly and only the icon case falls back. Closing it for
34
+ * good means the label arriving in its own slot instead of inside an opaque
35
+ * `children` snippet — an API change, tracked in KNOWN_ISSUES.
36
+ */
37
+ /** Cheap pre-filter: only a row that CENTRES is relying on ink centring. */
38
+ const CENTRING = new Set(['center', 'safe center', 'anchor-center']);
39
+ export const anonymousText = {
40
+ id: 'typography/anonymous-text',
41
+ name: 'A flex row centres its own bare text',
42
+ description: 'Bare text in a flex container is an anonymous flex item, which text-box-trim cannot reach — the ink is centred by font metrics instead. Make a text-only row a block with era-label-ink; an icon+text row needs the label in its own element.',
43
+ category: 'typography',
44
+ severity: 'warn',
45
+ // Every flex box is a candidate; the checks below are the real gate and are
46
+ // far cheaper than reading styles for the whole tree.
47
+ selector: 'div,span,button,a,label,li,header,footer,summary',
48
+ check(el) {
49
+ const s = getComputedStyle(el);
50
+ if (s.display !== 'flex' && s.display !== 'inline-flex')
51
+ return null;
52
+ if (!CENTRING.has(s.alignItems))
53
+ return null;
54
+ // The anonymous item itself: a text node directly under the flex box.
55
+ const ownText = [...el.childNodes].some((n) => n.nodeType === Node.TEXT_NODE && n.textContent?.trim());
56
+ if (!ownText)
57
+ return null;
58
+ // Multi-line text is not centred by ink in the first place — this law is
59
+ // about single-line control chrome, which is what `nowrap` marks.
60
+ if (s.whiteSpace !== 'nowrap' && s.flexWrap !== 'nowrap')
61
+ return null;
62
+ const hasElementChild = el.children.length > 0;
63
+ const issue = {
64
+ auditId: 'typography/anonymous-text',
65
+ element: el,
66
+ message: hasElementChild
67
+ ? 'flex row holding an icon AND its own bare text — the text is an anonymous flex item, so its ink is centred by font metrics. The label needs its own element (or its own slot) before a trim can reach it.'
68
+ : 'flex row holding nothing but text — it has no reason to be flex. Make it a block with era-label-ink (or era-token-ink for a centred token) and the trim applies.',
69
+ details: { display: s.display, hasElementChild }
70
+ };
71
+ return issue;
72
+ }
73
+ };
@@ -4,6 +4,7 @@ import { concentricInset } from './concentric-inset.js';
4
4
  import { cornersAxis } from './corners-axis.js';
5
5
  import { evenContainerPadding } from './even-container-padding.js';
6
6
  import { flatChrome } from './flat-chrome.js';
7
+ import { anonymousText } from './anonymous-text.js';
7
8
  import { iconFlush } from './icon-flush.js';
8
9
  import { offAxisMotion } from './off-axis-motion.js';
9
10
  import { offTierHeight } from './off-tier-height.js';
@@ -14,4 +15,4 @@ import { restingGap } from './resting-gap.js';
14
15
  import { singleGlyphSquare } from './single-glyph-square.js';
15
16
  import { uniformSiblingGaps } from './uniform-sibling-gaps.js';
16
17
  import { wallMatchesGap } from './wall-matches-gap.js';
17
- export { clippedGlyphs, collapsedTextTrim, concentricInset, cornersAxis, evenContainerPadding, flatChrome, iconFlush, offAxisMotion, offTierHeight, pillHoldsItsInk, proseLeading, radiusConcentricity, restingGap, singleGlyphSquare, uniformSiblingGaps, wallMatchesGap };
18
+ export { clippedGlyphs, collapsedTextTrim, concentricInset, cornersAxis, evenContainerPadding, flatChrome, iconFlush, anonymousText, offAxisMotion, offTierHeight, pillHoldsItsInk, proseLeading, radiusConcentricity, restingGap, singleGlyphSquare, uniformSiblingGaps, wallMatchesGap };
@@ -5,6 +5,7 @@ import { concentricInset } from './concentric-inset.js';
5
5
  import { cornersAxis } from './corners-axis.js';
6
6
  import { evenContainerPadding } from './even-container-padding.js';
7
7
  import { flatChrome } from './flat-chrome.js';
8
+ import { anonymousText } from './anonymous-text.js';
8
9
  import { iconFlush } from './icon-flush.js';
9
10
  import { offAxisMotion } from './off-axis-motion.js';
10
11
  import { offTierHeight } from './off-tier-height.js';
@@ -15,7 +16,7 @@ import { restingGap } from './resting-gap.js';
15
16
  import { singleGlyphSquare } from './single-glyph-square.js';
16
17
  import { uniformSiblingGaps } from './uniform-sibling-gaps.js';
17
18
  import { wallMatchesGap } from './wall-matches-gap.js';
18
- export { clippedGlyphs, collapsedTextTrim, concentricInset, cornersAxis, evenContainerPadding, flatChrome, iconFlush, offAxisMotion, offTierHeight, pillHoldsItsInk, proseLeading, radiusConcentricity, restingGap, singleGlyphSquare, uniformSiblingGaps, wallMatchesGap };
19
+ export { clippedGlyphs, collapsedTextTrim, concentricInset, cornersAxis, evenContainerPadding, flatChrome, iconFlush, anonymousText, offAxisMotion, offTierHeight, pillHoldsItsInk, proseLeading, radiusConcentricity, restingGap, singleGlyphSquare, uniformSiblingGaps, wallMatchesGap };
19
20
  // Auto-register built-ins. Consumers can still unregister or add their own.
20
21
  //
21
22
  // Two of these only tell the truth on a particular axis setting, because the bug
@@ -31,6 +32,7 @@ registry.register(cornersAxis);
31
32
  registry.register(evenContainerPadding);
32
33
  registry.register(flatChrome);
33
34
  registry.register(iconFlush);
35
+ registry.register(anonymousText);
34
36
  registry.register(offAxisMotion);
35
37
  registry.register(offTierHeight);
36
38
  registry.register(pillHoldsItsInk);
@@ -1,5 +1,5 @@
1
1
  export type AuditSeverity = 'info' | 'warn' | 'error';
2
- export type AuditCategory = 'layout' | 'tokens' | 'a11y' | 'semantics';
2
+ export type AuditCategory = 'layout' | 'tokens' | 'typography' | 'a11y' | 'semantics';
3
3
  export interface Issue {
4
4
  readonly auditId: string;
5
5
  readonly element: HTMLElement;
@@ -105,7 +105,7 @@ const INTRO = [
105
105
  'with the stylesheet and needs no import:',
106
106
  '',
107
107
  '```ts',
108
- 'import "@sig-nine/era-ui/css";',
108
+ 'import "@signal9/era-ui/css";',
109
109
  '```',
110
110
  '',
111
111
  '```svelte',
@@ -10,8 +10,8 @@ function orientation(origin) {
10
10
  '## Using the library',
11
11
  '',
12
12
  '```ts',
13
- 'import { Button, Table, Select } from "@sig-nine/era-ui";',
14
- 'import "@sig-nine/era-ui/css";',
13
+ 'import { Button, Table, Select } from "@signal9/era-ui";',
14
+ 'import "@signal9/era-ui/css";',
15
15
  '```',
16
16
  '',
17
17
  'Named exports wrap a single primitive (`Button`, `Badge`, `Chip`, `Input`, …). Namespace exports compose primitives via sub-components (`Table.Root`, `Table.Row`, `Select.Trigger`, `Dialog.Content`, …). Every wrapper forwards unknown props to its underlying element or bits-ui primitive, so standard HTML attributes (`class`, `style`, event handlers, `aria-*`, `data-*`) work without ceremony.',
@@ -1,12 +1,12 @@
1
1
  ## Usage
2
2
 
3
- Apps ship on their own subpath and are **not** re-exported from `@sig-nine/era-ui`.
3
+ Apps ship on their own subpath and are **not** re-exported from `@signal9/era-ui`.
4
4
  Notes carries TipTap, and a consumer who never imports an app should never pay
5
5
  for it.
6
6
 
7
7
  ```svelte
8
8
  <script>
9
- import { Notes } from '@sig-nine/era-ui/apps';
9
+ import { Notes } from '@signal9/era-ui/apps';
10
10
  </script>
11
11
 
12
12
  <Notes />
@@ -46,7 +46,7 @@ Persistence is one small interface, so server-backed hosting is a drop-in swap
46
46
  `load`/`save` may be sync or async:
47
47
 
48
48
  ```ts
49
- import { Notes, NotesStore } from '@sig-nine/era-ui/apps';
49
+ import { Notes, NotesStore } from '@signal9/era-ui/apps';
50
50
 
51
51
  const store = new NotesStore({
52
52
  adapter: {