@signal9/era-ui 3.9.0 → 3.11.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 (57) hide show
  1. package/dist/apps/index.d.ts +19 -0
  2. package/dist/apps/index.js +19 -0
  3. package/dist/apps/notes/editor/bubble-menu.svelte.d.ts +11 -0
  4. package/dist/apps/notes/editor/bubble-menu.svelte.js +106 -0
  5. package/dist/apps/notes/editor/bubble-toolbar.svelte +42 -0
  6. package/dist/apps/notes/editor/bubble-toolbar.svelte.d.ts +22 -0
  7. package/dist/apps/notes/editor/extensions.d.ts +18 -0
  8. package/dist/apps/notes/editor/extensions.js +88 -0
  9. package/dist/apps/notes/editor/floating.d.ts +21 -0
  10. package/dist/apps/notes/editor/floating.js +44 -0
  11. package/dist/apps/notes/editor/link.d.ts +9 -0
  12. package/dist/apps/notes/editor/link.js +22 -0
  13. package/dist/apps/notes/editor/list-cleanup-rule.d.ts +14 -0
  14. package/dist/apps/notes/editor/list-cleanup-rule.js +47 -0
  15. package/dist/apps/notes/editor/slash-command.svelte.d.ts +22 -0
  16. package/dist/apps/notes/editor/slash-command.svelte.js +215 -0
  17. package/dist/apps/notes/editor/slash-menu.svelte +63 -0
  18. package/dist/apps/notes/editor/slash-menu.svelte.d.ts +23 -0
  19. package/dist/apps/notes/index.d.ts +11 -0
  20. package/dist/apps/notes/index.js +13 -0
  21. package/dist/apps/notes/markdown.d.ts +12 -0
  22. package/dist/apps/notes/markdown.js +165 -0
  23. package/dist/apps/notes/note-editor.svelte +456 -0
  24. package/dist/apps/notes/note-editor.svelte.d.ts +35 -0
  25. package/dist/apps/notes/notes-store.svelte.d.ts +64 -0
  26. package/dist/apps/notes/notes-store.svelte.js +234 -0
  27. package/dist/apps/notes/notes.svelte +377 -0
  28. package/dist/apps/notes/notes.svelte.d.ts +22 -0
  29. package/dist/apps/notes/tree.d.ts +70 -0
  30. package/dist/apps/notes/tree.js +185 -0
  31. package/dist/apps/notes/types.d.ts +49 -0
  32. package/dist/apps/notes/types.js +11 -0
  33. package/dist/dev/audit/audits/index.d.ts +2 -1
  34. package/dist/dev/audit/audits/index.js +3 -1
  35. package/dist/dev/audit/audits/resting-gap.d.ts +2 -0
  36. package/dist/dev/audit/audits/resting-gap.js +78 -0
  37. package/dist/docs/notes.md +82 -0
  38. package/dist/era-ui.css +1 -1
  39. package/dist/generated-docs/llms-full.txt +92 -1
  40. package/dist/generated-docs/llms.txt +1 -1
  41. package/dist/generated-docs/manifest.json +16 -1
  42. package/dist/generated-docs/notes.md +86 -0
  43. package/dist/generated-docs/utilities.json +1 -1
  44. package/dist/generated-docs/utilities.md +1 -1
  45. package/dist/styles/index.css +2 -1
  46. package/dist/styles/themes.css +70 -52
  47. package/dist/ui/badge/badge.svelte.d.ts +17 -17
  48. package/dist/ui/bar/bar.svelte.d.ts +11 -11
  49. package/dist/ui/button/variants.d.ts +44 -44
  50. package/dist/ui/card/card.svelte.d.ts +20 -20
  51. package/dist/ui/chip/chip.svelte.d.ts +14 -14
  52. package/dist/ui/pane/pane-root.svelte.d.ts +1 -1
  53. package/dist/ui/pane/pane.svelte.d.ts +1 -1
  54. package/dist/ui/sheet/sheet-content.svelte.d.ts +14 -14
  55. package/dist/ui/skeleton/skeleton.svelte.d.ts +11 -11
  56. package/dist/utils/index.js +11 -0
  57. package/package.json +31 -5
@@ -199,7 +199,7 @@ Declared in `index.css`.
199
199
  * before you touch it. Only the UNDERLINE reacts: a faint hint at rest —
200
200
  * muted knocked back to 30% so it barely whispers — that resolves to the full
201
201
  * text colour on hover. */
202
- color: var(--color-bright);
202
+ color: var(--color-link);
203
203
  text-decoration-line: underline;
204
204
  text-decoration-color: color-mix(in oklch, var(--color-muted) 30%, transparent);
205
205
  text-underline-offset: 0.2em;
@@ -590,6 +590,97 @@ Release history — every version, grouped by change type.
590
590
 
591
591
  <!-- end: changelog -->
592
592
 
593
+ <!-- begin: notes -->
594
+
595
+ # Notes
596
+
597
+ A complete notes app — rich-text editor, slash commands, local persistence.
598
+
599
+ ## Usage
600
+
601
+ Apps ship on their own subpath and are **not** re-exported from `@sig-nine/era-ui`.
602
+ Notes carries TipTap, and a consumer who never imports an app should never pay
603
+ for it.
604
+
605
+ ```svelte
606
+ <script>
607
+ import { Notes } from '@sig-nine/era-ui/apps';
608
+ </script>
609
+
610
+ <Notes />
611
+ ```
612
+
613
+ That is the whole integration: a sidebar with filter, pin, and delete; a TipTap
614
+ document with a `/` command menu and a selection toolbar; and persistence to
615
+ `localStorage` under `era-ui:notes`.
616
+
617
+ ## Peer dependencies
618
+
619
+ Install alongside the library (they are not bundled):
620
+
621
+ ```
622
+ @tiptap/core @tiptap/pm @tiptap/starter-kit @tiptap/suggestion
623
+ @tiptap/extension-code-block-lowlight @tiptap/extension-details
624
+ @tiptap/extension-highlight @tiptap/extension-image
625
+ @tiptap/extension-placeholder @tiptap/extension-table
626
+ @tiptap/extension-task-item @tiptap/extension-task-list
627
+ @tiptap/extension-typography @tiptap/extension-unique-id
628
+ lowlight tiptap-markdown
629
+ ```
630
+
631
+ ## Props
632
+
633
+ | Prop | Type | Default | Notes |
634
+ | ------------ | ---------------- | ------------------ | ----------------------------------------------------------------- |
635
+ | `store` | `NotesStore` | created internally | Bring your own; when set, the host owns its lifecycle. |
636
+ | `adapter` | `NotesAdapter` | `localStorage` | Persistence for the internally-created store. |
637
+ | `storageKey` | `string` | `era-ui:notes` | Key for the default adapter. |
638
+ | `noteId` | `string \| null` | `null` | `$bindable` — the open note, for deep-linking or session restore. |
639
+ | `seed` | `NoteInit[]` | — | Created only when storage comes back empty (first-run sample). |
640
+
641
+ ## Persistence
642
+
643
+ Persistence is one small interface, so server-backed hosting is a drop-in swap —
644
+ `load`/`save` may be sync or async:
645
+
646
+ ```ts
647
+ import { Notes, NotesStore } from '@sig-nine/era-ui/apps';
648
+
649
+ const store = new NotesStore({
650
+ adapter: {
651
+ load: () => fetch('/api/notes').then((r) => r.json()),
652
+ save: (notes) => fetch('/api/notes', { method: 'PUT', body: JSON.stringify(notes) })
653
+ }
654
+ });
655
+ ```
656
+
657
+ `NotesStore` is the reactive source of truth (`notes`, `ordered`, `loading`,
658
+ `status`, `lastError`) with `create` / `update` / `remove` / `togglePin` /
659
+ `setIcon` / `search` / `toMarkdown` / `flush`. Writes are debounced and
660
+ coalesced, so a burst of keystrokes costs one `save`.
661
+
662
+ ## The heading index
663
+
664
+ Every document is also a tree. `buildGlobalTree()` walks heading structure,
665
+ `treeToText()` renders it as a table of contents a model can read, and
666
+ `extractSection(title, doc, headingId)` returns just the requested slice as
667
+ structure-preserving markdown — reasoning-based retrieval rather than
668
+ embeddings. Heading ids are stable (`@tiptap/extension-unique-id`), so a section
669
+ address survives edits above it.
670
+
671
+ ## Notes
672
+
673
+ - Keyboard: `/` opens the command menu, `Mod-K` links a selection, `Mod-S`
674
+ flushes pending writes immediately.
675
+ - The slash menu and selection toolbar are real Svelte components mounted into
676
+ the document root, so they follow every axis — density tiers, surface chrome,
677
+ corners, motion, font — instead of carrying their own hardcoded styling.
678
+ - `@tiptap/extension-mathematics` is deliberately absent: it needs KaTeX's
679
+ stylesheet and fonts to render. Spread `noteExtensions` and add it yourself if
680
+ you want math.
681
+
682
+ <!-- end: notes -->
683
+
593
684
  <!-- begin: aspect-ratio -->
594
685
 
595
686
  # Aspect Ratio
@@ -31,7 +31,7 @@ Full concatenated reference: `{{ORIGIN}}/llms-full.txt`.
31
31
 
32
32
  ## Components
33
33
 
34
- getting-started, spacing, surfaces, measurements, text, utilities, draggable, llm-shell, os, changelog, aspect-ratio, badge, avatar, bar, button, button-group, pane, card, chip, code-block, copy-button, cycle, kv, separator, sheet, skeleton, switch, toggle, accordion, alert-dialog, calendar, checkbox, collapsible, combobox, command, command-bar, step, context-menu, date-field, date-picker, date-range-field, date-range-picker, dialog, dropdown-menu, file-upload, scroll-area, input, link-preview, label, logo, menu, menubar, meter, navigation-menu, mode, pagination, pin-input, popover, progress, range-calendar, radio-group, rating-group, select, slider, table, tabs, time-field, time-range-field, toggle-group, toolbar, video-player, tooltip
34
+ getting-started, spacing, surfaces, measurements, text, utilities, draggable, llm-shell, os, changelog, notes, aspect-ratio, badge, avatar, bar, button, button-group, pane, card, chip, code-block, copy-button, cycle, kv, separator, sheet, skeleton, switch, toggle, accordion, alert-dialog, calendar, checkbox, collapsible, combobox, command, command-bar, step, context-menu, date-field, date-picker, date-range-field, date-range-picker, dialog, dropdown-menu, file-upload, scroll-area, input, link-preview, label, logo, menu, menubar, meter, navigation-menu, mode, pagination, pin-input, popover, progress, range-calendar, radio-group, rating-group, select, slider, table, tabs, time-field, time-range-field, toggle-group, toolbar, video-player, tooltip
35
35
 
36
36
  ## CSS utilities
37
37
 
@@ -100,6 +100,21 @@
100
100
  "sections": [],
101
101
  "file": "changelog.md"
102
102
  },
103
+ {
104
+ "slug": "notes",
105
+ "title": "Notes",
106
+ "summary": "A complete notes app — rich-text editor, slash commands, local persistence.",
107
+ "tokenEstimate": 885,
108
+ "sections": [
109
+ "Usage",
110
+ "Peer dependencies",
111
+ "Props",
112
+ "Persistence",
113
+ "The heading index",
114
+ "Notes"
115
+ ],
116
+ "file": "notes.md"
117
+ },
103
118
  {
104
119
  "slug": "aspect-ratio",
105
120
  "title": "Aspect Ratio",
@@ -960,7 +975,7 @@
960
975
  "file": "index.css",
961
976
  "useCase": "understated, motion-aware inline text link — the canonical style for a link in body copy or prose; prefer it over a hand-rolled underline or `Button variant=\"link\"` (which is a control, not running text).",
962
977
  "description": "Inline text link. An understated, permanent underline that darkens from\nmuted to the text colour on hover — no layout shift, no appearing/vanishing\nunderline. The colour fade rides the MOTION axis (--era-duration/-ease), so\nit snaps at data-motion=\"instant\", eases at \"normal\", and sweeps longer at\n\"extra\" — matching every other era transition. Font-agnostic: it styles\ndecoration + colour only, so it reads correctly in mono, sans, or serif, and\nthe 0.2em offset scales with the type size. Keyboard focus mirrors hover so\nthe affordance is reachable without a pointer.",
963
- "css": "@utility era-link {\n\t/* The text is bright at rest and never changes — the link reads as a link\n\t * before you touch it. Only the UNDERLINE reacts: a faint hint at rest —\n\t * muted knocked back to 30% so it barely whispers — that resolves to the full\n\t * text colour on hover. */\n\tcolor: var(--color-bright);\n\ttext-decoration-line: underline;\n\ttext-decoration-color: color-mix(in oklch, var(--color-muted) 30%, transparent);\n\ttext-underline-offset: 0.2em;\n\ttransition: text-decoration-color var(--era-duration) var(--era-ease);\n\t&:hover,\n\t&:focus-visible {\n\t\ttext-decoration-color: var(--color-fg);\n\t}\n}"
978
+ "css": "@utility era-link {\n\t/* The text is bright at rest and never changes — the link reads as a link\n\t * before you touch it. Only the UNDERLINE reacts: a faint hint at rest —\n\t * muted knocked back to 30% so it barely whispers — that resolves to the full\n\t * text colour on hover. */\n\tcolor: var(--color-link);\n\ttext-decoration-line: underline;\n\ttext-decoration-color: color-mix(in oklch, var(--color-muted) 30%, transparent);\n\ttext-underline-offset: 0.2em;\n\ttransition: text-decoration-color var(--era-duration) var(--era-ease);\n\t&:hover,\n\t&:focus-visible {\n\t\ttext-decoration-color: var(--color-fg);\n\t}\n}"
964
979
  },
965
980
  {
966
981
  "name": "scrollbar-none",
@@ -0,0 +1,86 @@
1
+ # Notes
2
+
3
+ A complete notes app — rich-text editor, slash commands, local persistence.
4
+
5
+ ## Usage
6
+
7
+ Apps ship on their own subpath and are **not** re-exported from `@sig-nine/era-ui`.
8
+ Notes carries TipTap, and a consumer who never imports an app should never pay
9
+ for it.
10
+
11
+ ```svelte
12
+ <script>
13
+ import { Notes } from '@sig-nine/era-ui/apps';
14
+ </script>
15
+
16
+ <Notes />
17
+ ```
18
+
19
+ That is the whole integration: a sidebar with filter, pin, and delete; a TipTap
20
+ document with a `/` command menu and a selection toolbar; and persistence to
21
+ `localStorage` under `era-ui:notes`.
22
+
23
+ ## Peer dependencies
24
+
25
+ Install alongside the library (they are not bundled):
26
+
27
+ ```
28
+ @tiptap/core @tiptap/pm @tiptap/starter-kit @tiptap/suggestion
29
+ @tiptap/extension-code-block-lowlight @tiptap/extension-details
30
+ @tiptap/extension-highlight @tiptap/extension-image
31
+ @tiptap/extension-placeholder @tiptap/extension-table
32
+ @tiptap/extension-task-item @tiptap/extension-task-list
33
+ @tiptap/extension-typography @tiptap/extension-unique-id
34
+ lowlight tiptap-markdown
35
+ ```
36
+
37
+ ## Props
38
+
39
+ | Prop | Type | Default | Notes |
40
+ | ------------ | ---------------- | ------------------ | ----------------------------------------------------------------- |
41
+ | `store` | `NotesStore` | created internally | Bring your own; when set, the host owns its lifecycle. |
42
+ | `adapter` | `NotesAdapter` | `localStorage` | Persistence for the internally-created store. |
43
+ | `storageKey` | `string` | `era-ui:notes` | Key for the default adapter. |
44
+ | `noteId` | `string \| null` | `null` | `$bindable` — the open note, for deep-linking or session restore. |
45
+ | `seed` | `NoteInit[]` | — | Created only when storage comes back empty (first-run sample). |
46
+
47
+ ## Persistence
48
+
49
+ Persistence is one small interface, so server-backed hosting is a drop-in swap —
50
+ `load`/`save` may be sync or async:
51
+
52
+ ```ts
53
+ import { Notes, NotesStore } from '@sig-nine/era-ui/apps';
54
+
55
+ const store = new NotesStore({
56
+ adapter: {
57
+ load: () => fetch('/api/notes').then((r) => r.json()),
58
+ save: (notes) => fetch('/api/notes', { method: 'PUT', body: JSON.stringify(notes) })
59
+ }
60
+ });
61
+ ```
62
+
63
+ `NotesStore` is the reactive source of truth (`notes`, `ordered`, `loading`,
64
+ `status`, `lastError`) with `create` / `update` / `remove` / `togglePin` /
65
+ `setIcon` / `search` / `toMarkdown` / `flush`. Writes are debounced and
66
+ coalesced, so a burst of keystrokes costs one `save`.
67
+
68
+ ## The heading index
69
+
70
+ Every document is also a tree. `buildGlobalTree()` walks heading structure,
71
+ `treeToText()` renders it as a table of contents a model can read, and
72
+ `extractSection(title, doc, headingId)` returns just the requested slice as
73
+ structure-preserving markdown — reasoning-based retrieval rather than
74
+ embeddings. Heading ids are stable (`@tiptap/extension-unique-id`), so a section
75
+ address survives edits above it.
76
+
77
+ ## Notes
78
+
79
+ - Keyboard: `/` opens the command menu, `Mod-K` links a selection, `Mod-S`
80
+ flushes pending writes immediately.
81
+ - The slash menu and selection toolbar are real Svelte components mounted into
82
+ the document root, so they follow every axis — density tiers, surface chrome,
83
+ corners, motion, font — instead of carrying their own hardcoded styling.
84
+ - `@tiptap/extension-mathematics` is deliberately absent: it needs KaTeX's
85
+ stylesheet and fonts to render. Spread `noteExtensions` and add it yourself if
86
+ you want math.
@@ -18,7 +18,7 @@
18
18
  "file": "index.css",
19
19
  "useCase": "understated, motion-aware inline text link — the canonical style for a link in body copy or prose; prefer it over a hand-rolled underline or `Button variant=\"link\"` (which is a control, not running text).",
20
20
  "description": "Inline text link. An understated, permanent underline that darkens from\nmuted to the text colour on hover — no layout shift, no appearing/vanishing\nunderline. The colour fade rides the MOTION axis (--era-duration/-ease), so\nit snaps at data-motion=\"instant\", eases at \"normal\", and sweeps longer at\n\"extra\" — matching every other era transition. Font-agnostic: it styles\ndecoration + colour only, so it reads correctly in mono, sans, or serif, and\nthe 0.2em offset scales with the type size. Keyboard focus mirrors hover so\nthe affordance is reachable without a pointer.",
21
- "css": "@utility era-link {\n\t/* The text is bright at rest and never changes — the link reads as a link\n\t * before you touch it. Only the UNDERLINE reacts: a faint hint at rest —\n\t * muted knocked back to 30% so it barely whispers — that resolves to the full\n\t * text colour on hover. */\n\tcolor: var(--color-bright);\n\ttext-decoration-line: underline;\n\ttext-decoration-color: color-mix(in oklch, var(--color-muted) 30%, transparent);\n\ttext-underline-offset: 0.2em;\n\ttransition: text-decoration-color var(--era-duration) var(--era-ease);\n\t&:hover,\n\t&:focus-visible {\n\t\ttext-decoration-color: var(--color-fg);\n\t}\n}"
21
+ "css": "@utility era-link {\n\t/* The text is bright at rest and never changes — the link reads as a link\n\t * before you touch it. Only the UNDERLINE reacts: a faint hint at rest —\n\t * muted knocked back to 30% so it barely whispers — that resolves to the full\n\t * text colour on hover. */\n\tcolor: var(--color-link);\n\ttext-decoration-line: underline;\n\ttext-decoration-color: color-mix(in oklch, var(--color-muted) 30%, transparent);\n\ttext-underline-offset: 0.2em;\n\ttransition: text-decoration-color var(--era-duration) var(--era-ease);\n\t&:hover,\n\t&:focus-visible {\n\t\ttext-decoration-color: var(--color-fg);\n\t}\n}"
22
22
  },
23
23
  {
24
24
  "name": "scrollbar-none",
@@ -99,7 +99,7 @@ Declared in `index.css`.
99
99
  * before you touch it. Only the UNDERLINE reacts: a faint hint at rest —
100
100
  * muted knocked back to 30% so it barely whispers — that resolves to the full
101
101
  * text colour on hover. */
102
- color: var(--color-bright);
102
+ color: var(--color-link);
103
103
  text-decoration-line: underline;
104
104
  text-decoration-color: color-mix(in oklch, var(--color-muted) 30%, transparent);
105
105
  text-underline-offset: 0.2em;
@@ -93,7 +93,7 @@
93
93
  * before you touch it. Only the UNDERLINE reacts: a faint hint at rest —
94
94
  * muted knocked back to 30% so it barely whispers — that resolves to the full
95
95
  * text colour on hover. */
96
- color: var(--color-bright);
96
+ color: var(--color-link);
97
97
  text-decoration-line: underline;
98
98
  text-decoration-color: color-mix(in oklch, var(--color-muted) 30%, transparent);
99
99
  text-underline-offset: 0.2em;
@@ -283,6 +283,7 @@
283
283
  --color-fg: var(--color-fg);
284
284
  --color-bright: var(--color-bright);
285
285
  --color-muted: var(--color-muted);
286
+ --color-link: var(--color-link);
286
287
  --color-primary: var(--color-primary);
287
288
  --color-primary-fg: var(--color-primary-fg);
288
289
  --color-primary-hover: var(--color-primary-hover);
@@ -51,27 +51,29 @@
51
51
  --color-fg: var(--color-11);
52
52
  --color-bright: var(--color-12);
53
53
  --color-muted: var(--color-10);
54
+ /* Inline link ink. Declared once here and inherited by every theme —
55
+ * var(--color-bright) resolves in the element's own context, so a theme only
56
+ * names this if it wants links to differ from emphasis text (signalnine
57
+ * light does: yahoo.co.jp links are navy, not black). */
58
+ --color-link: var(--color-bright);
54
59
 
55
60
  /* Accent tokens — override these to theme the library */
56
61
  --color-primary: var(--color-fg);
57
62
  --color-primary-fg: var(--color-1);
58
63
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
59
- /* Destructive carries DARK text, like warning: the red is bright and
60
- * saturated enough that near-black out-contrasts white on it, and a black
61
- * glyph on red reads harder-edged than a white one. Every theme's
62
- * -fg here is that theme's own warning-fg, so the two bright accents
63
- * behave identically.
64
+ /* Destructive carries LIGHT text a white glyph on the red fill.
64
65
  *
65
- * The two constraints fight, so the value is load-bearing. The old
66
- * oklch(0.675 0.3 30) sat outside sRGB and clipped to a flat #ff0000
67
- * that clipping is what made it read glaring. This is in gamut at
68
- * L 0.59 / hue 27 (#eb001a): darker, and swung off the orange-leaning
69
- * 30deg onto a truer crimson, which is most of what reads as "deeper".
70
- * L 0.59 is the floor below it a light glyph would out-contrast a dark
71
- * one and the black X stops being the right call. Here it holds 4.2:1,
72
- * well past the 3:1 a non-text glyph needs. */
73
- --color-destructive: oklch(0.59 0.241 27);
74
- --color-destructive-fg: oklch(0.162 0 0);
66
+ * The original oklch(0.675 0.3 30) sat outside sRGB and clipped to a flat
67
+ * #ff0000, which is what made it read glaring. This one is in gamut:
68
+ * #f14b43, softer and lighter than the clipped red it replaces.
69
+ *
70
+ * Worth knowing if this is retuned: at this lightness BLACK actually
71
+ * out-contrasts white on it (5.8 vs 3.6). White is the deliberate call,
72
+ * not the higher-contrast one, and 3.6:1 clears the 3:1 a non-text glyph
73
+ * needs but not the 4.5:1 body copy would. Pushing the red LIGHTER widens
74
+ * that gap; pushing it darker closes it. */
75
+ --color-destructive: oklch(0.6468 0.2039 27.2); /* #f14b43 */
76
+ --color-destructive-fg: oklch(0.96 0 0);
75
77
  --color-success: oklch(0.65 0.17 145);
76
78
  --color-success-fg: oklch(0.96 0 0);
77
79
  --color-warning: oklch(0.8 0.16 85);
@@ -109,8 +111,8 @@
109
111
  --color-primary: var(--color-fg);
110
112
  --color-primary-fg: var(--color-1);
111
113
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
112
- --color-destructive: oklch(0.59 0.241 27);
113
- --color-destructive-fg: oklch(0.162 0 0);
114
+ --color-destructive: oklch(0.6468 0.2039 27.2); /* #f14b43 */
115
+ --color-destructive-fg: oklch(0.98 0 0);
114
116
  --color-success: oklch(0.5 0.17 145);
115
117
  --color-success-fg: oklch(0.98 0 0);
116
118
  --color-warning: oklch(0.72 0.15 85);
@@ -145,8 +147,8 @@
145
147
  --color-primary: var(--color-fg);
146
148
  --color-primary-fg: var(--color-1);
147
149
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
148
- --color-destructive: oklch(0.59 0.241 27);
149
- --color-destructive-fg: oklch(0.162 0 0);
150
+ --color-destructive: oklch(0.6468 0.2039 27.2); /* #f14b43 */
151
+ --color-destructive-fg: oklch(0.98 0 0);
150
152
  --color-success: oklch(0.5 0.17 145);
151
153
  --color-success-fg: oklch(0.98 0 0);
152
154
  --color-warning: oklch(0.72 0.15 85);
@@ -190,7 +192,7 @@
190
192
  --color-primary-fg: oklch(0.19 0.014 50);
191
193
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 78%, var(--color-success));
192
194
  --color-destructive: oklch(0.61 0.17 30);
193
- --color-destructive-fg: oklch(0.19 0.014 50);
195
+ --color-destructive-fg: oklch(0.96 0.016 90);
194
196
  --color-success: oklch(0.7 0.125 184);
195
197
  --color-success-fg: oklch(0.19 0.014 50);
196
198
  --color-warning: oklch(0.78 0.14 82);
@@ -233,7 +235,7 @@
233
235
  --color-primary-fg: oklch(0.96 0.014 78);
234
236
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
235
237
  --color-destructive: oklch(0.575 0.22 28);
236
- --color-destructive-fg: oklch(0.19 0.014 50);
238
+ --color-destructive-fg: oklch(0.98 0.012 78);
237
239
  --color-success: oklch(0.5 0.13 158);
238
240
  --color-success-fg: oklch(0.98 0.012 78);
239
241
  --color-warning: oklch(0.7 0.13 80);
@@ -268,7 +270,7 @@
268
270
  --color-primary-fg: oklch(0.96 0.014 78);
269
271
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
270
272
  --color-destructive: oklch(0.575 0.22 28);
271
- --color-destructive-fg: oklch(0.19 0.014 50);
273
+ --color-destructive-fg: oklch(0.98 0.012 78);
272
274
  --color-success: oklch(0.5 0.13 158);
273
275
  --color-success-fg: oklch(0.98 0.012 78);
274
276
  --color-warning: oklch(0.7 0.13 80);
@@ -306,7 +308,7 @@
306
308
  --color-primary-fg: var(--color-1);
307
309
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 80%, var(--color-success));
308
310
  --color-destructive: oklch(0.615 0.15 33);
309
- --color-destructive-fg: var(--color-1);
311
+ --color-destructive-fg: var(--color-12);
310
312
  --color-success: oklch(0.71 0.09 164);
311
313
  --color-success-fg: var(--color-1);
312
314
  --color-warning: oklch(0.78 0.1 85);
@@ -344,7 +346,7 @@
344
346
  --color-primary-fg: oklch(0.97 0.008 80);
345
347
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
346
348
  --color-destructive: oklch(0.59 0.18 32);
347
- --color-destructive-fg: oklch(0.2 0.012 60);
349
+ --color-destructive-fg: oklch(0.98 0.008 80);
348
350
  --color-success: oklch(0.54 0.11 164);
349
351
  --color-success-fg: oklch(0.98 0.008 80);
350
352
  --color-warning: oklch(0.68 0.1 82);
@@ -379,7 +381,7 @@
379
381
  --color-primary-fg: oklch(0.97 0.008 80);
380
382
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
381
383
  --color-destructive: oklch(0.59 0.18 32);
382
- --color-destructive-fg: oklch(0.2 0.012 60);
384
+ --color-destructive-fg: oklch(0.98 0.008 80);
383
385
  --color-success: oklch(0.54 0.11 164);
384
386
  --color-success-fg: oklch(0.98 0.008 80);
385
387
  --color-warning: oklch(0.68 0.1 82);
@@ -433,7 +435,7 @@
433
435
  --color-primary-fg: oklch(0.97 0.022 98);
434
436
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 80%, var(--color-destructive));
435
437
  --color-destructive: oklch(0.6 0.244 25);
436
- --color-destructive-fg: oklch(0.2 0.006 265);
438
+ --color-destructive-fg: oklch(0.97 0.022 98);
437
439
  --color-success: oklch(0.62 0.13 158);
438
440
  --color-success-fg: oklch(0.2 0.006 265);
439
441
  --color-warning: oklch(0.8 0.15 88);
@@ -482,31 +484,39 @@
482
484
  :root[data-theme='signalnine']:not(.dark) {
483
485
  color-scheme: light;
484
486
 
485
- --color-1: oklch(1 0 0); /* #ffffff */
486
- --color-2: oklch(0.97 0.014 268.5); /* #f1f5ff */
487
- --color-3: oklch(0.944 0.025 271.1); /* #e6ecfe */
488
- --color-4: oklch(0.887 0.037 265.1); /* #cedaf3 */
489
- --color-5: oklch(0.766 0.0565 265.7); /* #a2b3d8 rgb(162,179,216) */
487
+ --color-1: oklch(1 0 0); /* #ffffff page */
488
+ --color-2: oklch(0.9439 0.0251 271.14); /* #e6ecfe card fill */
489
+ --color-3: oklch(0.887 0.0368 265.13); /* #cedaf3 border */
490
+ --color-4: oklch(0.844 0.0447 265.6); /* #bcccea */
491
+ --color-5: oklch(0.7667 0.0612 261.83); /* #9eb4db the measured dominant rule */
490
492
  --color-6: oklch(0.7 0.074 263);
491
- --color-7: oklch(0.631 0.0915 260.3); /* #698ac1 */
492
- --color-8: oklch(0.585 0.062 261);
493
- --color-9: oklch(0.548 0.031 261);
494
- --color-10: oklch(0.51 0 0); /* #666666 */
493
+ --color-7: oklch(0.631 0.0915 260.33); /* #698ac1 muted text */
494
+ --color-8: oklch(0.57 0.12 262);
495
+ --color-9: oklch(0.51 0 0); /* #666666 */
496
+ --color-10: oklch(0.3855 0.1534 266.07); /* #1d3994 link text */
495
497
  --color-11: oklch(0.16 0.008 266);
496
- --color-12: oklch(0 0 0); /* #000000 */
498
+ --color-12: oklch(0 0 0); /* #000000 body text */
497
499
 
500
+ /* Repointed off the conventional steps on purpose — these name the roles
501
+ * yahoo.co.jp actually paints, so each points at the step holding its
502
+ * measured colour rather than the step other themes happen to use.
503
+ * (border is back on the conventional step 5, which now holds the
504
+ * measured dominant rule #9eb4db.) */
498
505
  --color-border: var(--color-5);
499
506
  --color-surface: var(--color-2);
500
- --color-hover: oklch(0.955 0.02 270);
507
+ --color-hover: oklch(0.97 0.014 268.5); /* #f1f5ff */
501
508
  --color-fg: var(--color-11);
502
509
  --color-bright: var(--color-12);
503
- --color-muted: var(--color-10);
510
+ --color-muted: var(--color-7);
511
+ --color-link: var(--color-10);
512
+ /* Cards read --era-surface-bg, which the surface contract defines as
513
+ * --color-2 — so the card fill follows from the scale, no override. */
504
514
 
505
515
  --color-primary: oklch(0.596 0.22 265.8); /* #4070ff */
506
516
  --color-primary-fg: oklch(1 0 0);
507
517
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
508
518
  --color-destructive: oklch(0.59 0.242 27.7); /* #eb0013 */
509
- --color-destructive-fg: oklch(0.16 0.008 266);
519
+ --color-destructive-fg: oklch(1 0 0);
510
520
  --color-success: oklch(0.58 0.15 152);
511
521
  --color-success-fg: oklch(1 0 0);
512
522
  --color-warning: oklch(0.76 0.145 80);
@@ -517,31 +527,39 @@
517
527
  [data-theme='signalnine'].light {
518
528
  color-scheme: light;
519
529
 
520
- --color-1: oklch(1 0 0); /* #ffffff */
521
- --color-2: oklch(0.97 0.014 268.5); /* #f1f5ff */
522
- --color-3: oklch(0.944 0.025 271.1); /* #e6ecfe */
523
- --color-4: oklch(0.887 0.037 265.1); /* #cedaf3 */
524
- --color-5: oklch(0.766 0.0565 265.7); /* #a2b3d8 rgb(162,179,216) */
530
+ --color-1: oklch(1 0 0); /* #ffffff page */
531
+ --color-2: oklch(0.9439 0.0251 271.14); /* #e6ecfe card fill */
532
+ --color-3: oklch(0.887 0.0368 265.13); /* #cedaf3 border */
533
+ --color-4: oklch(0.844 0.0447 265.6); /* #bcccea */
534
+ --color-5: oklch(0.7667 0.0612 261.83); /* #9eb4db the measured dominant rule */
525
535
  --color-6: oklch(0.7 0.074 263);
526
- --color-7: oklch(0.631 0.0915 260.3); /* #698ac1 */
527
- --color-8: oklch(0.585 0.062 261);
528
- --color-9: oklch(0.548 0.031 261);
529
- --color-10: oklch(0.51 0 0); /* #666666 */
536
+ --color-7: oklch(0.631 0.0915 260.33); /* #698ac1 muted text */
537
+ --color-8: oklch(0.57 0.12 262);
538
+ --color-9: oklch(0.51 0 0); /* #666666 */
539
+ --color-10: oklch(0.3855 0.1534 266.07); /* #1d3994 link text */
530
540
  --color-11: oklch(0.16 0.008 266);
531
- --color-12: oklch(0 0 0); /* #000000 */
541
+ --color-12: oklch(0 0 0); /* #000000 body text */
532
542
 
543
+ /* Repointed off the conventional steps on purpose — these name the roles
544
+ * yahoo.co.jp actually paints, so each points at the step holding its
545
+ * measured colour rather than the step other themes happen to use.
546
+ * (border is back on the conventional step 5, which now holds the
547
+ * measured dominant rule #9eb4db.) */
533
548
  --color-border: var(--color-5);
534
549
  --color-surface: var(--color-2);
535
- --color-hover: oklch(0.955 0.02 270);
550
+ --color-hover: oklch(0.97 0.014 268.5); /* #f1f5ff */
536
551
  --color-fg: var(--color-11);
537
552
  --color-bright: var(--color-12);
538
- --color-muted: var(--color-10);
553
+ --color-muted: var(--color-7);
554
+ --color-link: var(--color-10);
555
+ /* Cards read --era-surface-bg, which the surface contract defines as
556
+ * --color-2 — so the card fill follows from the scale, no override. */
539
557
 
540
558
  --color-primary: oklch(0.596 0.22 265.8); /* #4070ff */
541
559
  --color-primary-fg: oklch(1 0 0);
542
560
  --color-primary-hover: color-mix(in oklch, var(--color-primary) 85%, black);
543
561
  --color-destructive: oklch(0.59 0.242 27.7); /* #eb0013 */
544
- --color-destructive-fg: oklch(0.16 0.008 266);
562
+ --color-destructive-fg: oklch(1 0 0);
545
563
  --color-success: oklch(0.58 0.15 152);
546
564
  --color-success-fg: oklch(1 0 0);
547
565
  --color-warning: oklch(0.76 0.145 80);
@@ -1,28 +1,28 @@
1
1
  export declare const badgeVariants: import("tailwind-variants").TVReturnType<{
2
2
  tone: {
3
- default: string;
4
- accent: string;
5
- destructive: string;
6
- success: string;
7
- warning: string;
3
+ default: "bg-hover text-fg";
4
+ accent: "bg-primary text-primary-fg";
5
+ destructive: "bg-destructive text-destructive-fg";
6
+ success: "bg-success text-success-fg";
7
+ warning: "bg-warning text-warning-fg";
8
8
  };
9
9
  }, undefined, "inline-flex h-(--era-h-xxs) min-w-(--era-h-xxs) items-center justify-center gap-(--era-gap) rounded-(--era-rd-xxs) px-(--era-pill-xxs) font-mono text-body leading-none has-[svg]:gap-(--era-inset-xxs) era-text-trim", {
10
10
  tone: {
11
- default: string;
12
- accent: string;
13
- destructive: string;
14
- success: string;
15
- warning: string;
11
+ default: "bg-hover text-fg";
12
+ accent: "bg-primary text-primary-fg";
13
+ destructive: "bg-destructive text-destructive-fg";
14
+ success: "bg-success text-success-fg";
15
+ warning: "bg-warning text-warning-fg";
16
16
  };
17
- }, undefined, import("tailwind-variants").TVReturnType<{
17
+ }, undefined, import("tailwind-variants").TVReturnTypeLike<{
18
18
  tone: {
19
- default: string;
20
- accent: string;
21
- destructive: string;
22
- success: string;
23
- warning: string;
19
+ default: "bg-hover text-fg";
20
+ accent: "bg-primary text-primary-fg";
21
+ destructive: "bg-destructive text-destructive-fg";
22
+ success: "bg-success text-success-fg";
23
+ warning: "bg-warning text-warning-fg";
24
24
  };
25
- }, undefined, "inline-flex h-(--era-h-xxs) min-w-(--era-h-xxs) items-center justify-center gap-(--era-gap) rounded-(--era-rd-xxs) px-(--era-pill-xxs) font-mono text-body leading-none has-[svg]:gap-(--era-inset-xxs) era-text-trim", unknown, unknown, undefined>>;
25
+ }, undefined>>;
26
26
  import type { Snippet } from 'svelte';
27
27
  import type { HTMLAttributes } from 'svelte/elements';
28
28
  type $$ComponentProps = HTMLAttributes<HTMLSpanElement> & {
@@ -1,22 +1,22 @@
1
1
  export declare const barVariants: import("tailwind-variants").TVReturnType<{
2
2
  size: {
3
- sm: string;
4
- md: string;
5
- lg: string;
3
+ sm: "h-(--era-h-sm) rounded-(--era-rd-sm)";
4
+ md: "h-(--era-h-md) rounded-(--era-rd-md)";
5
+ lg: "h-(--era-h-lg) rounded-(--era-rd-lg)";
6
6
  };
7
7
  }, undefined, "flex items-center gap-(--era-xs-inset-sm) px-(--era-xs-inset-sm) era-text-trim", {
8
8
  size: {
9
- sm: string;
10
- md: string;
11
- lg: string;
9
+ sm: "h-(--era-h-sm) rounded-(--era-rd-sm)";
10
+ md: "h-(--era-h-md) rounded-(--era-rd-md)";
11
+ lg: "h-(--era-h-lg) rounded-(--era-rd-lg)";
12
12
  };
13
- }, undefined, import("tailwind-variants").TVReturnType<{
13
+ }, undefined, import("tailwind-variants").TVReturnTypeLike<{
14
14
  size: {
15
- sm: string;
16
- md: string;
17
- lg: string;
15
+ sm: "h-(--era-h-sm) rounded-(--era-rd-sm)";
16
+ md: "h-(--era-h-md) rounded-(--era-rd-md)";
17
+ lg: "h-(--era-h-lg) rounded-(--era-rd-lg)";
18
18
  };
19
- }, undefined, "flex items-center gap-(--era-xs-inset-sm) px-(--era-xs-inset-sm) era-text-trim", unknown, unknown, undefined>>;
19
+ }, undefined>>;
20
20
  import type { HTMLAttributes } from 'svelte/elements';
21
21
  import type { Snippet } from 'svelte';
22
22
  type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {