@signal9/era-ui 5.0.0 → 7.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.
@@ -12,27 +12,44 @@
12
12
  * absolute root size (e.g. `html { font-size: 16px }`); see the docs' layout.css.
13
13
  */
14
14
 
15
+ /*
16
+ * THE SHIPPED STACKS — named, and read directly.
17
+ *
18
+ * These rules used to say `var(--font-mono, <era's stack>)`, treating era's
19
+ * list as a fallback. It never once applied. Tailwind v4 ALWAYS defines
20
+ * --font-mono in its own base theme, so the fallback arm was unreachable and
21
+ * every consumer silently rendered TAILWIND's font stack — while era's docs,
22
+ * which pin --font-mono to generic `monospace` for taste, rendered a third
23
+ * thing. Three different fonts: one the library believed it shipped, one
24
+ * consumers actually got, one the maintainer verified against. Font metrics
25
+ * drive ink centring, so every alignment constant tuned in the docs was
26
+ * calibrated against a font nobody else renders — which is why the same
27
+ * "text isn't vertically centred" bug kept coming back from consumers and
28
+ * kept looking fine here.
29
+ *
30
+ * The axis now reads era's OWN namespaced token, which nothing upstream
31
+ * defines. A consumer (or these docs) re-points a stack by setting
32
+ * --era-font-mono / -sans / -serif; nothing can do it by accident.
33
+ */
34
+ :root {
35
+ --era-font-mono: ui-monospace, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
36
+ --era-font-sans: system-ui, sans-serif;
37
+ --era-font-serif: ui-serif, Georgia, 'Times New Roman', serif;
38
+ }
39
+
15
40
  [data-font='mono'],
16
41
  [data-font='mono'] * {
17
- font-family: var(
18
- --font-mono,
19
- ui-monospace,
20
- 'SF Mono',
21
- Menlo,
22
- Consolas,
23
- 'Liberation Mono',
24
- monospace
25
- ) !important;
42
+ font-family: var(--era-font-mono) !important;
26
43
  }
27
44
 
28
45
  [data-font='sans'],
29
46
  [data-font='sans'] * {
30
- font-family: var(--font-sans, system-ui, sans-serif) !important;
47
+ font-family: var(--era-font-sans) !important;
31
48
  }
32
49
 
33
50
  [data-font='serif'],
34
51
  [data-font='serif'] * {
35
- font-family: var(--font-serif, ui-serif, Georgia, 'Times New Roman', serif) !important;
52
+ font-family: var(--era-font-serif) !important;
36
53
  }
37
54
 
38
55
  /*
@@ -0,0 +1,27 @@
1
+ /*
2
+ * VideoPlayer's third-party stylesheets — vidstack's base layout plus the
3
+ * slider/button/menu primitives the component composes.
4
+ *
5
+ * Split out of index.css because it is 46KB that only one component needs:
6
+ * imported there, every consumer paid 37% of the built stylesheet for a player
7
+ * they never mounted. Everything here is scoped internally by vidstack to
8
+ * `:where(media-player)`, so it affects nothing outside a player subtree —
9
+ * which is exactly why it can be omitted safely.
10
+ *
11
+ * Import alongside the core stylesheet when (and only when) you render
12
+ * `VideoPlayer`:
13
+ *
14
+ * import '@signal9/era-ui/styles'; // always
15
+ * import '@signal9/era-ui/styles/video-player'; // only with the player
16
+ *
17
+ * Era's own token theming is applied on the component via CSS variables, not
18
+ * here, so this file is pure vendor CSS and needs no era imports.
19
+ */
20
+ @import 'vidstack/styles/base.css';
21
+ @import 'vidstack/styles/ui/buttons.css';
22
+ @import 'vidstack/styles/ui/sliders.css';
23
+ @import 'vidstack/styles/ui/buffering.css';
24
+ @import 'vidstack/styles/ui/captions.css';
25
+ @import 'vidstack/styles/ui/live.css';
26
+ @import 'vidstack/styles/ui/menus.css';
27
+ @import 'vidstack/styles/ui/tooltips.css';
@@ -11,7 +11,15 @@
11
11
  // out from under the ink and the label bled past the fill. A pill that must
12
12
  // fit a tight row does it the Tool.Chip way: the BOX holds and an inner
13
13
  // min-w-0 span truncates. Enforced at runtime by layout/pill-holds-its-ink.
14
- base: 'inline-flex h-(--era-h-xxs) min-w-(--era-h-xxs) shrink-0 items-center justify-center gap-(--era-gap) rounded-(--era-rd-xxs) px-(--era-pill-xxs) font-mono text-body leading-none whitespace-nowrap has-[svg]:gap-(--era-inset-xxs) era-text-trim',
14
+ // not-has-[svg]: the ink mechanism switches with the content SHAPE.
15
+ //
16
+ // A badge holding only a token (the overwhelming case — an id, a count, a
17
+ // status) becomes a BLOCK box so text-box-trim can actually run; see
18
+ // era-token-ink for why the trim is inert on a flex container and what
19
+ // that cost. A badge holding an icon must stay flex to lay the icon out
20
+ // beside the text, and keeps the general trim — its line-height:1 plus
21
+ // flex centring, which is the best available when the text is anonymous.
22
+ base: 'inline-flex h-(--era-h-xxs) min-w-(--era-h-xxs) shrink-0 items-center justify-center gap-(--era-gap) rounded-(--era-rd-xxs) px-(--era-pill-xxs) font-mono text-body leading-none whitespace-nowrap has-[svg]:gap-(--era-inset-xxs) era-text-trim not-has-[svg]:era-token-ink',
15
23
  variants: {
16
24
  tone: {
17
25
  default: 'bg-fill text-fg',
@@ -6,7 +6,7 @@ export declare const badgeVariants: import("tailwind-variants").TVReturnType<{
6
6
  success: "bg-success text-success-fg";
7
7
  warning: "bg-warning text-warning-fg";
8
8
  };
9
- }, undefined, "inline-flex h-(--era-h-xxs) min-w-(--era-h-xxs) shrink-0 items-center justify-center gap-(--era-gap) rounded-(--era-rd-xxs) px-(--era-pill-xxs) font-mono text-body leading-none whitespace-nowrap has-[svg]:gap-(--era-inset-xxs) era-text-trim", {
9
+ }, undefined, "inline-flex h-(--era-h-xxs) min-w-(--era-h-xxs) shrink-0 items-center justify-center gap-(--era-gap) rounded-(--era-rd-xxs) px-(--era-pill-xxs) font-mono text-body leading-none whitespace-nowrap has-[svg]:gap-(--era-inset-xxs) era-text-trim not-has-[svg]:era-token-ink", {
10
10
  tone: {
11
11
  default: "bg-fill text-fg";
12
12
  accent: "bg-primary text-primary-fg";
@@ -1,4 +1,4 @@
1
1
  import { Calendar } from 'bits-ui';
2
- declare const CalendarRoot: import("svelte").Component<Calendar.RootProps, {}, "value" | "placeholder" | "ref">;
2
+ declare const CalendarRoot: import("svelte").Component<Calendar.RootProps, {}, "placeholder" | "value" | "ref">;
3
3
  type CalendarRoot = ReturnType<typeof CalendarRoot>;
4
4
  export default CalendarRoot;
@@ -1,3 +1,3 @@
1
- declare const DateFieldRoot: import("svelte").Component<import("bits-ui").DateFieldRootPropsWithoutHTML, {}, "value" | "placeholder">;
1
+ declare const DateFieldRoot: import("svelte").Component<import("bits-ui").DateFieldRootPropsWithoutHTML, {}, "placeholder" | "value">;
2
2
  type DateFieldRoot = ReturnType<typeof DateFieldRoot>;
3
3
  export default DateFieldRoot;
@@ -1,3 +1,3 @@
1
- declare const DatePickerRoot: import("svelte").Component<import("bits-ui").DatePickerRootPropsWithoutHTML, {}, "value" | "placeholder" | "open">;
1
+ declare const DatePickerRoot: import("svelte").Component<import("bits-ui").DatePickerRootPropsWithoutHTML, {}, "placeholder" | "value" | "open">;
2
2
  type DatePickerRoot = ReturnType<typeof DatePickerRoot>;
3
3
  export default DatePickerRoot;
@@ -1,4 +1,4 @@
1
1
  import { DateRangeField } from 'bits-ui';
2
- declare const DateRangeFieldRoot: import("svelte").Component<DateRangeField.RootProps, {}, "value" | "placeholder" | "ref">;
2
+ declare const DateRangeFieldRoot: import("svelte").Component<DateRangeField.RootProps, {}, "placeholder" | "value" | "ref">;
3
3
  type DateRangeFieldRoot = ReturnType<typeof DateRangeFieldRoot>;
4
4
  export default DateRangeFieldRoot;
@@ -1,4 +1,4 @@
1
1
  import { DateRangePicker } from 'bits-ui';
2
- declare const DateRangePickerRoot: import("svelte").Component<DateRangePicker.RootProps, {}, "value" | "placeholder" | "open">;
2
+ declare const DateRangePickerRoot: import("svelte").Component<DateRangePicker.RootProps, {}, "placeholder" | "value" | "open">;
3
3
  type DateRangePickerRoot = ReturnType<typeof DateRangePickerRoot>;
4
4
  export default DateRangePickerRoot;
@@ -24,5 +24,4 @@
24
24
  'resize-y py-(--era-inset-md)',
25
25
  className
26
26
  )}
27
- {...restProps}
28
- ></textarea>
27
+ {...restProps}></textarea>
@@ -30,7 +30,12 @@
30
30
  {...restProps}
31
31
  >
32
32
  <Badge {tone} class="h-full rounded-none border-r border-divider py-0">{key}</Badge>
33
- <span class="min-w-(--era-h-xxs) px-(--era-inset-sm) text-center text-muted tabular-nums"
33
+ <!-- self-stretch + era-token-ink: a KV value is a token (a number, an id, a
34
+ status), and the block mechanism is the only one where text-box-trim
35
+ actually runs — see era-token-ink. Stretching gives that block a full-
36
+ height box for align-content to centre the trimmed line in. -->
37
+ <span
38
+ class="era-token-ink min-w-(--era-h-xxs) self-stretch px-(--era-inset-sm) text-muted tabular-nums"
34
39
  >{value}</span
35
40
  >
36
41
  </span>
@@ -1,4 +1,4 @@
1
1
  import { TimeField } from 'bits-ui';
2
- declare const TimeFieldRoot: import("svelte").Component<TimeField.RootProps, {}, "value" | "placeholder">;
2
+ declare const TimeFieldRoot: import("svelte").Component<TimeField.RootProps, {}, "placeholder" | "value">;
3
3
  type TimeFieldRoot = ReturnType<typeof TimeFieldRoot>;
4
4
  export default TimeFieldRoot;
@@ -1,4 +1,4 @@
1
1
  import { TimeRangeField } from 'bits-ui';
2
- declare const TimeRangeFieldRoot: import("svelte").Component<TimeRangeField.RootProps, {}, "value" | "placeholder" | "ref">;
2
+ declare const TimeRangeFieldRoot: import("svelte").Component<TimeRangeField.RootProps, {}, "placeholder" | "value" | "ref">;
3
3
  type TimeRangeFieldRoot = ReturnType<typeof TimeRangeFieldRoot>;
4
4
  export default TimeRangeFieldRoot;
@@ -548,7 +548,9 @@
548
548
  function handleSeekKeydown(e: KeyboardEvent) {
549
549
  if (seekDisabled) return;
550
550
  const base = readMediaTime() ?? currentTime;
551
- let next: number | null = null;
551
+ // No initialiser: every arm below either assigns or returns, so one here
552
+ // would be dead — and eslint's no-useless-assignment says so.
553
+ let next: number;
552
554
  switch (e.key) {
553
555
  case 'ArrowLeft':
554
556
  case 'ArrowDown':
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signal9/era-ui",
3
- "version": "5.0.0",
3
+ "version": "7.0.0",
4
4
  "scripts": {
5
5
  "dev": "vite dev --host",
6
6
  "build": "vite build && npm run prepack",
@@ -39,65 +39,88 @@
39
39
  "exports": {
40
40
  ".": {
41
41
  "types": "./dist/index.d.ts",
42
- "style": "./dist/styles/index.css",
43
42
  "svelte": "./dist/index.js",
44
43
  "default": "./dist/index.js"
45
44
  },
46
- "./provider": {
47
- "types": "./dist/ui/provider/index.d.ts",
48
- "svelte": "./dist/ui/provider/index.js",
49
- "default": "./dist/ui/provider/index.js"
45
+ "./*": {
46
+ "types": "./dist/ui/*/index.d.ts",
47
+ "svelte": "./dist/ui/*/index.js",
48
+ "default": "./dist/ui/*/index.js"
50
49
  },
51
50
  "./ai": {
52
51
  "types": "./dist/ai/index.d.ts",
53
52
  "svelte": "./dist/ai/index.js",
54
53
  "default": "./dist/ai/index.js"
55
54
  },
56
- "./ai/workflow": {
57
- "types": "./dist/ai/workflow/index.d.ts",
58
- "svelte": "./dist/ai/workflow/index.js",
59
- "default": "./dist/ai/workflow/index.js"
60
- },
61
- "./os": {
62
- "types": "./dist/os/index.d.ts",
63
- "svelte": "./dist/os/index.js",
64
- "default": "./dist/os/index.js"
55
+ "./ai/*": {
56
+ "types": "./dist/ai/*/index.d.ts",
57
+ "svelte": "./dist/ai/*/index.js",
58
+ "default": "./dist/ai/*/index.js"
65
59
  },
66
60
  "./apps": {
67
61
  "types": "./dist/apps/index.d.ts",
68
62
  "svelte": "./dist/apps/index.js",
69
63
  "default": "./dist/apps/index.js"
70
64
  },
71
- "./apps/llm-shell": {
72
- "types": "./dist/apps/llm-shell/index.d.ts",
73
- "svelte": "./dist/apps/llm-shell/index.js",
74
- "default": "./dist/apps/llm-shell/index.js"
65
+ "./apps/*": {
66
+ "types": "./dist/apps/*/index.d.ts",
67
+ "svelte": "./dist/apps/*/index.js",
68
+ "default": "./dist/apps/*/index.js"
69
+ },
70
+ "./os": {
71
+ "types": "./dist/os/index.d.ts",
72
+ "svelte": "./dist/os/index.js",
73
+ "default": "./dist/os/index.js"
75
74
  },
76
- "./apps/notes": {
77
- "types": "./dist/apps/notes/index.d.ts",
78
- "svelte": "./dist/apps/notes/index.js",
79
- "default": "./dist/apps/notes/index.js"
75
+ "./audit": {
76
+ "types": "./dist/dev/index.d.ts",
77
+ "svelte": "./dist/dev/index.js",
78
+ "default": "./dist/dev/index.js"
80
79
  },
81
- "./css": "./dist/era-ui.css",
82
- "./styles/raw": "./dist/styles/index.css",
80
+ "./styles": "./dist/styles/index.css",
81
+ "./styles/video-player": "./dist/styles/video-player.css",
83
82
  "./styles/themes": "./dist/styles/themes.css",
84
- "./utilities.json": "./dist/generated-docs/utilities.json"
83
+ "./css": "./dist/era-ui.css",
84
+ "./utilities.json": "./dist/generated-docs/utilities.json",
85
+ "./package.json": "./package.json"
85
86
  },
86
87
  "peerDependencies": {
88
+ "@neodrag/svelte": "3.0.0-next.10",
89
+ "@tiptap/core": "^3.29.0",
90
+ "@tiptap/extension-code-block-lowlight": "^3.29.2",
91
+ "@tiptap/extension-details": "^3.29.2",
92
+ "@tiptap/extension-highlight": "^3.29.2",
93
+ "@tiptap/extension-image": "^3.29.2",
94
+ "@tiptap/extension-placeholder": "^3.29.2",
95
+ "@tiptap/extension-table": "^3.29.2",
96
+ "@tiptap/extension-task-item": "^3.29.2",
97
+ "@tiptap/extension-task-list": "^3.29.2",
98
+ "@tiptap/extension-typography": "^3.29.2",
99
+ "@tiptap/extension-unique-id": "^3.29.2",
100
+ "@tiptap/pm": "^3.29.0",
101
+ "@tiptap/starter-kit": "^3.29.2",
102
+ "@tiptap/suggestion": "^3.29.2",
103
+ "dompurify": "^3.4.13",
104
+ "lowlight": "^3.3.0",
105
+ "marked": "^18.0.9",
87
106
  "svelte": "^5.0.0",
88
- "tailwindcss": "^4.0.0"
107
+ "tailwindcss": "^4.0.0",
108
+ "tiptap-markdown": "^0.9.0",
109
+ "vidstack": "^0.6.15"
89
110
  },
90
111
  "devDependencies": {
91
112
  "@eslint/compat": "^2.1.0",
92
- "@eslint/js": "^9.39.2",
113
+ "@eslint/js": "^10.0.1",
114
+ "@internationalized/date": "^3.12.3",
115
+ "@neodrag/svelte": "3.0.0-next.10",
93
116
  "@playwright/test": "^1.62.1",
94
- "@semantic-release/changelog": "^6.0.3",
117
+ "@semantic-release/changelog": "^7.0.0",
95
118
  "@semantic-release/exec": "^7.1.0",
96
- "@semantic-release/git": "^10.0.1",
119
+ "@semantic-release/git": "^11.0.1",
97
120
  "@sveltejs/adapter-cloudflare": "^7.2.9",
98
121
  "@sveltejs/kit": "^2.70.2",
99
122
  "@sveltejs/package": "^2.5.8",
100
- "@sveltejs/vite-plugin-svelte": "^6.2.4",
123
+ "@sveltejs/vite-plugin-svelte": "^7.2.0",
101
124
  "@tailwindcss/cli": "^4.3.3",
102
125
  "@tailwindcss/vite": "^4.3.3",
103
126
  "@threlte/core": "^8.5.16",
@@ -116,32 +139,35 @@
116
139
  "@tiptap/pm": "^3.29.0",
117
140
  "@tiptap/starter-kit": "^3.29.2",
118
141
  "@tiptap/suggestion": "^3.29.2",
119
- "@types/node": "^24.13.3",
120
- "@types/three": "^0.184.1",
142
+ "@types/node": "^26.2.0",
143
+ "@types/three": "^0.185.4",
121
144
  "@xyflow/svelte": "^1.6.2",
122
145
  "conventional-changelog-conventionalcommits": "^10.2.1",
123
- "eslint": "^9.39.5",
146
+ "dompurify": "^3.4.13",
147
+ "eslint": "^10.8.1",
124
148
  "eslint-config-prettier": "^10.1.8",
125
149
  "eslint-plugin-better-tailwindcss": "^4.7.0",
126
150
  "eslint-plugin-svelte": "^3.22.0",
127
- "globals": "^17.8.0",
151
+ "globals": "^17.9.0",
128
152
  "lowlight": "^3.3.0",
153
+ "marked": "^18.0.9",
129
154
  "prettier": "^3.9.6",
130
- "prettier-plugin-svelte": "^3.5.2",
131
- "prettier-plugin-tailwindcss": "^0.7.4",
132
- "publint": "^0.3.22",
133
- "semantic-release": "^25.0.8",
134
- "shiki": "^4.4.1",
155
+ "prettier-plugin-svelte": "^4.1.1",
156
+ "prettier-plugin-tailwindcss": "^0.8.1",
157
+ "publint": "^0.3.23",
158
+ "semantic-release": "^25.0.9",
159
+ "shiki": "^4.4.2",
135
160
  "svelte": "^5.56.8",
136
- "svelte-check": "^4.7.4",
161
+ "svelte-check": "^4.7.5",
137
162
  "tailwindcss": "^4.1.18",
138
- "three": "^0.184.0",
163
+ "three": "^0.185.1",
139
164
  "tiptap-markdown": "^0.9.0",
140
- "typescript": "^5.9.3",
141
- "typescript-eslint": "^8.65.0",
142
- "vite": "^7.3.6",
165
+ "typescript": "^6.0.3",
166
+ "typescript-eslint": "^8.66.0",
167
+ "vidstack": "^0.6.15",
168
+ "vite": "^8.2.1",
143
169
  "vite-plugin-devtools-json": "^1.1.0",
144
- "wrangler": "^4.118.0"
170
+ "wrangler": "^4.120.0"
145
171
  },
146
172
  "keywords": [
147
173
  "svelte"
@@ -154,20 +180,77 @@
154
180
  "url": "git+https://github.com/sig-nine/era-ui.git"
155
181
  },
156
182
  "dependencies": {
157
- "@internationalized/date": "^3.12.3",
158
- "@lucide/svelte": "^0.577.0",
159
- "@neodrag/svelte": "3.0.0-next.10",
183
+ "@lucide/svelte": "^1.30.0",
160
184
  "bits-ui": "^2.18.1",
161
185
  "clsx": "^2.1.1",
162
- "dompurify": "^3.4.12",
163
- "marked": "^15.0.12",
164
186
  "tailwind-merge": "^3.6.0",
165
- "tailwind-variants": "^3.3.0",
166
- "vidstack": "^0.6.15"
187
+ "tailwind-variants": "^3.3.1"
167
188
  },
168
189
  "allowScripts": {
169
190
  "@parcel/watcher@2.5.1": true,
170
191
  "esbuild@0.28.1": true,
171
192
  "workerd@1.20260722.1": true
193
+ },
194
+ "peerDependenciesMeta": {
195
+ "@neodrag/svelte": {
196
+ "optional": true
197
+ },
198
+ "@tiptap/core": {
199
+ "optional": true
200
+ },
201
+ "@tiptap/extension-code-block-lowlight": {
202
+ "optional": true
203
+ },
204
+ "@tiptap/extension-details": {
205
+ "optional": true
206
+ },
207
+ "@tiptap/extension-highlight": {
208
+ "optional": true
209
+ },
210
+ "@tiptap/extension-image": {
211
+ "optional": true
212
+ },
213
+ "@tiptap/extension-placeholder": {
214
+ "optional": true
215
+ },
216
+ "@tiptap/extension-table": {
217
+ "optional": true
218
+ },
219
+ "@tiptap/extension-task-item": {
220
+ "optional": true
221
+ },
222
+ "@tiptap/extension-task-list": {
223
+ "optional": true
224
+ },
225
+ "@tiptap/extension-typography": {
226
+ "optional": true
227
+ },
228
+ "@tiptap/extension-unique-id": {
229
+ "optional": true
230
+ },
231
+ "@tiptap/pm": {
232
+ "optional": true
233
+ },
234
+ "@tiptap/starter-kit": {
235
+ "optional": true
236
+ },
237
+ "@tiptap/suggestion": {
238
+ "optional": true
239
+ },
240
+ "dompurify": {
241
+ "optional": true
242
+ },
243
+ "lowlight": {
244
+ "optional": true
245
+ },
246
+ "marked": {
247
+ "optional": true
248
+ },
249
+ "tiptap-markdown": {
250
+ "optional": true
251
+ },
252
+ "vidstack": {
253
+ "optional": true
254
+ }
172
255
  }
173
256
  }