@geenius/storybook 0.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.
@@ -0,0 +1,45 @@
1
+ import { StorySurface, StorySurfaceSection, StorySurfaceEntry } from './types.js';
2
+ import 'vite';
3
+
4
+ /**
5
+ * Define a story surface with type-safety.
6
+ * The `as const satisfies` pattern is applied by the consumer; this helper
7
+ * validates and returns the surface unchanged.
8
+ */
9
+ declare function defineSurface<const T extends StorySurface>(surface: T): T;
10
+ /** Extract a flat array of all story IDs from a surface. */
11
+ declare function getSurfaceIds(surface: StorySurface): string[];
12
+ /** Extract a flat array of all story entries from a surface. */
13
+ declare function getSurfaceEntries(surface: StorySurface): StorySurfaceEntry[];
14
+ /** Get the total component count across all sections. */
15
+ declare function getSurfaceComponentCount(surface: StorySurface): number;
16
+ /** Look up a story entry by ID. Returns `undefined` if not found. */
17
+ declare function findSurfaceEntry(surface: StorySurface, id: string): StorySurfaceEntry | undefined;
18
+ /** Look up which section a story belongs to. */
19
+ declare function findSurfaceSection(surface: StorySurface, storyId: string): StorySurfaceSection | undefined;
20
+ /**
21
+ * Filter a surface by a search query (case-insensitive match against
22
+ * story label, id, or description). Returns a new surface with only
23
+ * matching entries, omitting empty sections.
24
+ */
25
+ declare function filterSurface(surface: StorySurface, query: string): StorySurfaceSection[];
26
+ /**
27
+ * Create a JSON-serialisable snapshot of the surface for testing
28
+ * or documentation generation.
29
+ */
30
+ declare function getSurfaceSnapshot(surface: StorySurface): {
31
+ title: string;
32
+ stories: {
33
+ id: string;
34
+ label: string;
35
+ description?: string;
36
+ tags?: readonly string[];
37
+ }[];
38
+ }[];
39
+ /**
40
+ * Validate that all story IDs in a surface are unique.
41
+ * Returns an array of duplicate IDs (empty if valid).
42
+ */
43
+ declare function validateSurface(surface: StorySurface): string[];
44
+
45
+ export { StorySurface, StorySurfaceEntry, StorySurfaceSection, defineSurface, filterSurface, findSurfaceEntry, findSurfaceSection, getSurfaceComponentCount, getSurfaceEntries, getSurfaceIds, getSurfaceSnapshot, validateSurface };
@@ -0,0 +1,3 @@
1
+ export { defineSurface, filterSurface, findSurfaceEntry, findSurfaceSection, getSurfaceComponentCount, getSurfaceEntries, getSurfaceIds, getSurfaceSnapshot, validateSurface } from './chunk-FB7KPF72.js';
2
+ //# sourceMappingURL=surface.js.map
3
+ //# sourceMappingURL=surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"surface.js"}
package/dist/theme.css ADDED
@@ -0,0 +1,246 @@
1
+ /* ============================================================================
2
+ @geenius/storybook — Component Theme (Dark / Light)
3
+ ============================================================================
4
+ Design tokens for the components being showcased. This file provides the
5
+ semantic color variables that component libraries (ui-react, ui-solidjs, etc.)
6
+ reference via `var(--primary)`, `var(--border)`, and so on.
7
+
8
+ Import this in your storybook app's CSS alongside `@geenius/storybook/styles`
9
+ so that both the shell and the components share the same token space.
10
+ ============================================================================ */
11
+
12
+ :root {
13
+ color-scheme: dark;
14
+
15
+ /* Backgrounds */
16
+ --background: oklch(0.08 0.01 260);
17
+ --foreground: oklch(0.96 0.01 250);
18
+
19
+ --card: oklch(0.12 0.01 260);
20
+ --card-foreground: oklch(0.96 0.01 250);
21
+
22
+ --popover: oklch(0.12 0.01 260);
23
+ --popover-foreground: oklch(0.96 0.01 250);
24
+
25
+ /* Primary */
26
+ --primary: oklch(0.72 0.2 265);
27
+ --primary-foreground: oklch(0.12 0.01 260);
28
+
29
+ /* Secondary */
30
+ --secondary: oklch(0.2 0.01 260);
31
+ --secondary-foreground: oklch(0.96 0.01 250);
32
+
33
+ /* Muted */
34
+ --muted: oklch(0.18 0.01 260);
35
+ --muted-foreground: oklch(0.64 0.02 250);
36
+
37
+ /* Accent */
38
+ --accent: oklch(0.2 0.01 260);
39
+ --accent-foreground: oklch(0.96 0.01 250);
40
+
41
+ /* Destructive / Danger */
42
+ --destructive: oklch(0.62 0.22 25);
43
+ --destructive-foreground: oklch(0.98 0.01 260);
44
+ --danger: oklch(0.62 0.22 25);
45
+ --danger-foreground: oklch(0.98 0.01 260);
46
+
47
+ /* Semantic */
48
+ --success: oklch(0.72 0.18 155);
49
+ --success-foreground: oklch(0.12 0.01 260);
50
+
51
+ --warning: oklch(0.78 0.18 75);
52
+ --warning-foreground: oklch(0.12 0.01 260);
53
+
54
+ --error: oklch(0.62 0.22 25);
55
+ --error-foreground: oklch(0.98 0.01 260);
56
+
57
+ --info: oklch(0.72 0.2 265);
58
+ --info-foreground: oklch(0.12 0.01 260);
59
+
60
+ /* Structural */
61
+ --border: oklch(0.24 0.01 260);
62
+ --border-hover: oklch(0.3 0.01 260);
63
+ --input: oklch(0.24 0.01 260);
64
+ --ring: oklch(0.7 0.2 265);
65
+
66
+ /* Surfaces */
67
+ --surface: oklch(0.15 0.01 260);
68
+ --surface-alt: oklch(0.18 0.01 260);
69
+ --bg-muted: oklch(0.16 0.01 260);
70
+
71
+ /* Aliases */
72
+ --text-main: var(--foreground);
73
+ --text-muted: var(--muted-foreground);
74
+
75
+ /* Radius scale */
76
+ --radius: 0.5rem;
77
+ }
78
+
79
+ /* ---------------------------------------------------------------------------
80
+ Light Mode
81
+ --------------------------------------------------------------------------- */
82
+
83
+ :root.light,
84
+ [data-theme='light'] {
85
+ color-scheme: light;
86
+
87
+ --background: oklch(0.98 0.005 260);
88
+ --foreground: oklch(0.15 0.01 250);
89
+
90
+ --card: oklch(1 0 0);
91
+ --card-foreground: oklch(0.15 0.01 250);
92
+
93
+ --popover: oklch(1 0 0);
94
+ --popover-foreground: oklch(0.15 0.01 250);
95
+
96
+ --primary: oklch(0.55 0.22 265);
97
+ --primary-foreground: oklch(0.98 0.005 260);
98
+
99
+ --secondary: oklch(0.93 0.005 260);
100
+ --secondary-foreground: oklch(0.15 0.01 250);
101
+
102
+ --muted: oklch(0.93 0.005 260);
103
+ --muted-foreground: oklch(0.45 0.01 250);
104
+
105
+ --accent: oklch(0.93 0.005 260);
106
+ --accent-foreground: oklch(0.15 0.01 250);
107
+
108
+ --destructive: oklch(0.55 0.22 25);
109
+ --destructive-foreground: oklch(0.98 0.005 260);
110
+ --danger: oklch(0.55 0.22 25);
111
+ --danger-foreground: oklch(0.98 0.005 260);
112
+
113
+ --success: oklch(0.55 0.18 155);
114
+ --success-foreground: oklch(0.98 0.005 260);
115
+
116
+ --warning: oklch(0.65 0.18 75);
117
+ --warning-foreground: oklch(0.15 0.01 250);
118
+
119
+ --error: oklch(0.55 0.22 25);
120
+ --error-foreground: oklch(0.98 0.005 260);
121
+
122
+ --info: oklch(0.55 0.2 265);
123
+ --info-foreground: oklch(0.98 0.005 260);
124
+
125
+ --border: oklch(0.88 0.005 260);
126
+ --border-hover: oklch(0.8 0.005 260);
127
+ --input: oklch(0.88 0.005 260);
128
+ --ring: oklch(0.55 0.22 265);
129
+
130
+ --surface: oklch(0.96 0.005 260);
131
+ --surface-alt: oklch(0.93 0.005 260);
132
+ --bg-muted: oklch(0.95 0.005 260);
133
+
134
+ --text-main: var(--foreground);
135
+ --text-muted: var(--muted-foreground);
136
+ }
137
+
138
+ /* ---------------------------------------------------------------------------
139
+ Tailwind v4 Theme Integration
140
+ --------------------------------------------------------------------------- */
141
+
142
+ @theme {
143
+ --color-background: var(--background);
144
+ --color-foreground: var(--foreground);
145
+
146
+ --color-card: var(--card);
147
+ --color-card-foreground: var(--card-foreground);
148
+
149
+ --color-popover: var(--popover);
150
+ --color-popover-foreground: var(--popover-foreground);
151
+
152
+ --color-primary: var(--primary);
153
+ --color-primary-foreground: var(--primary-foreground);
154
+
155
+ --color-secondary: var(--secondary);
156
+ --color-secondary-foreground: var(--secondary-foreground);
157
+
158
+ --color-muted: var(--muted);
159
+ --color-muted-foreground: var(--muted-foreground);
160
+
161
+ --color-accent: var(--accent);
162
+ --color-accent-foreground: var(--accent-foreground);
163
+
164
+ --color-destructive: var(--destructive);
165
+ --color-destructive-foreground: var(--destructive-foreground);
166
+
167
+ --color-danger: var(--danger);
168
+ --color-danger-foreground: var(--danger-foreground);
169
+
170
+ --color-success: var(--success);
171
+ --color-success-foreground: var(--success-foreground);
172
+
173
+ --color-warning: var(--warning);
174
+ --color-warning-foreground: var(--warning-foreground);
175
+
176
+ --color-error: var(--error);
177
+ --color-error-foreground: var(--error-foreground);
178
+
179
+ --color-info: var(--info);
180
+ --color-info-foreground: var(--info-foreground);
181
+
182
+ --color-border: var(--border);
183
+ --color-border-hover: var(--border-hover);
184
+ --color-input: var(--input);
185
+ --color-ring: var(--ring);
186
+
187
+ --color-surface: var(--surface);
188
+ --color-surface-alt: var(--surface-alt);
189
+ --color-bg-muted: var(--bg-muted);
190
+
191
+ --color-text-main: var(--text-main);
192
+ --color-text-muted: var(--text-muted);
193
+
194
+ --radius-sm: calc(var(--radius) - 0.25rem);
195
+ --radius-md: var(--radius);
196
+ --radius-lg: calc(var(--radius) + 0.25rem);
197
+ --radius-xl: calc(var(--radius) + 0.5rem);
198
+ }
199
+
200
+ /* ---------------------------------------------------------------------------
201
+ Tone Utilities — semantic color shorthands
202
+ --------------------------------------------------------------------------- */
203
+
204
+ .tone-success {
205
+ --tone-bg: var(--success);
206
+ --tone-fg: var(--success-foreground);
207
+ }
208
+
209
+ .tone-warning {
210
+ --tone-bg: var(--warning);
211
+ --tone-fg: var(--warning-foreground);
212
+ }
213
+
214
+ .tone-danger {
215
+ --tone-bg: var(--danger);
216
+ --tone-fg: var(--danger-foreground);
217
+ }
218
+
219
+ .tone-info {
220
+ --tone-bg: var(--info);
221
+ --tone-fg: var(--info-foreground);
222
+ }
223
+
224
+ .tone-surface {
225
+ background-color: color-mix(in oklch, var(--tone-bg) 15%, transparent);
226
+ color: var(--tone-bg);
227
+ border-color: color-mix(in oklch, var(--tone-bg) 30%, transparent);
228
+ }
229
+
230
+ /* ---------------------------------------------------------------------------
231
+ Base HTML Styles
232
+ --------------------------------------------------------------------------- */
233
+
234
+ html,
235
+ body {
236
+ min-height: 100%;
237
+ background: var(--background);
238
+ color: var(--foreground);
239
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
240
+ }
241
+
242
+ body {
243
+ text-rendering: optimizeLegibility;
244
+ -webkit-font-smoothing: antialiased;
245
+ -moz-osx-font-smoothing: grayscale;
246
+ }
@@ -0,0 +1,75 @@
1
+ import * as vite from 'vite';
2
+
3
+ /** A single story entry in the surface catalog. */
4
+ type StorySurfaceEntry = {
5
+ /** Unique kebab-case identifier used in routing and registry lookups. */
6
+ id: string;
7
+ /** Human-readable label shown in the sidebar. */
8
+ label: string;
9
+ /** Optional short description shown beneath the label. */
10
+ description?: string;
11
+ /** Optional short tags surfaced in navigation and search. */
12
+ tags?: readonly string[];
13
+ };
14
+ /** A named section grouping related stories. */
15
+ type StorySurfaceSection = {
16
+ /** Section heading (e.g. "Primitives", "Form Controls"). */
17
+ title: string;
18
+ /** Ordered list of stories belonging to this section. */
19
+ stories: readonly StorySurfaceEntry[];
20
+ };
21
+ /** The full story surface — an ordered array of sections. */
22
+ type StorySurface = readonly StorySurfaceSection[];
23
+ /** Union of all story IDs derived from a given surface. */
24
+ type StorySurfaceId<T extends StorySurface> = T[number]['stories'][number]['id'];
25
+ /** View state: either a story ID or the dashboard landing. */
26
+ type ActiveView<TId extends string = string> = TId | 'dashboard';
27
+ /** Supported styling approach identifiers. */
28
+ type StyleVariant = 'tailwind' | 'css';
29
+ /** Supported UI framework identifiers. */
30
+ type Framework = 'react' | 'solidjs' | 'vue' | 'svelte';
31
+ /** Theme mode. */
32
+ type ThemeMode = 'dark' | 'light' | 'system';
33
+ /** Configuration for `createStorybookViteConfig`. */
34
+ interface StorybookViteOptions {
35
+ /** Which UI framework this storybook app targets. */
36
+ framework: Framework;
37
+ /** Dev server port. */
38
+ port: number;
39
+ /** Vite plugins specific to the framework (e.g. `@vitejs/plugin-react`). */
40
+ plugins?: vite.PluginOption[];
41
+ /** Extra resolve aliases beyond the default `@` → `./src`. */
42
+ aliases?: Record<string, string>;
43
+ /** Override the default Tailwind CSS Vite plugin. Pass `false` to disable. */
44
+ tailwind?: vite.PluginOption | false;
45
+ /** Extra Vite config merged on top of the shared preset. */
46
+ config?: vite.UserConfig;
47
+ }
48
+ /** Metadata about the storybook instance, used in dashboard and shell chrome. */
49
+ interface StorybookMeta {
50
+ /** Package name being showcased (e.g. "@geenius/ui"). */
51
+ packageName: string;
52
+ /** Human-friendly title (e.g. "Geenius UI"). */
53
+ title: string;
54
+ /** Subtitle shown under the sidebar title (e.g. "React Component Storybook"). */
55
+ subtitle: string;
56
+ /** Current version string. */
57
+ version: string;
58
+ /** Style variants available in this storybook. */
59
+ styleVariants: readonly StyleVariant[];
60
+ /** Frameworks available across the family. */
61
+ frameworks: readonly Framework[];
62
+ }
63
+ /** Dashboard statistics derived from a story surface. */
64
+ interface DashboardStats {
65
+ /** Total number of component stories. */
66
+ componentCount: number;
67
+ /** Number of sections / categories. */
68
+ sectionCount: number;
69
+ /** Number of style variants. */
70
+ styleVariantCount: number;
71
+ /** Number of framework implementations. */
72
+ frameworkCount: number;
73
+ }
74
+
75
+ export type { ActiveView, DashboardStats, Framework, StorySurface, StorySurfaceEntry, StorySurfaceId, StorySurfaceSection, StorybookMeta, StorybookViteOptions, StyleVariant, ThemeMode };
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=types.js.map
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"types.js"}
@@ -0,0 +1,42 @@
1
+ import { StorySurface, StorybookMeta, DashboardStats, ActiveView, ThemeMode } from './types.js';
2
+ import 'vite';
3
+
4
+ /** Parse the current `window.location.hash` into an `ActiveView`. */
5
+ declare function getHashRoute<TId extends string>(validIds: readonly TId[]): ActiveView<TId>;
6
+ /** Push a new hash route without full page reload. */
7
+ declare function setHashRoute(view: string): void;
8
+ /** Read the stored theme preference, falling back to the given default. */
9
+ declare function getStoredTheme(fallback?: ThemeMode): ThemeMode;
10
+ /** Persist the theme preference. */
11
+ declare function setStoredTheme(mode: ThemeMode): void;
12
+ /**
13
+ * Resolve a theme mode to an effective `'dark' | 'light'` value,
14
+ * accounting for `'system'` by querying `prefers-color-scheme`.
15
+ */
16
+ declare function resolveTheme(mode: ThemeMode): 'dark' | 'light';
17
+ /**
18
+ * Apply the given effective theme to the document root.
19
+ * Sets the `data-theme` attribute and toggles the `light` class.
20
+ */
21
+ declare function applyTheme(effective: 'dark' | 'light'): void;
22
+ /** Compute dashboard statistics from a surface and meta. */
23
+ declare function computeDashboardStats(surface: StorySurface, meta: StorybookMeta): DashboardStats;
24
+ /** Key bindings for common storybook actions. */
25
+ interface KeyboardShortcuts {
26
+ /** Toggle sidebar visibility (mobile). Default: `Escape` */
27
+ toggleSidebar: string;
28
+ /** Toggle theme mode. Default: `t` */
29
+ toggleTheme: string;
30
+ /** Focus search input. Default: `/` or `Cmd+K` */
31
+ focusSearch: string;
32
+ /** Navigate to dashboard. Default: `h` */
33
+ goHome: string;
34
+ }
35
+ declare const DEFAULT_SHORTCUTS: KeyboardShortcuts;
36
+ /**
37
+ * Check whether a KeyboardEvent matches a shortcut string.
38
+ * Supports modifiers: `Cmd+K`, `Ctrl+Shift+P`, etc.
39
+ */
40
+ declare function matchesShortcut(event: KeyboardEvent, shortcut: string): boolean;
41
+
42
+ export { DEFAULT_SHORTCUTS, type KeyboardShortcuts, applyTheme, computeDashboardStats, getHashRoute, getStoredTheme, matchesShortcut, resolveTheme, setHashRoute, setStoredTheme };
package/dist/utils.js ADDED
@@ -0,0 +1,3 @@
1
+ export { DEFAULT_SHORTCUTS, applyTheme, computeDashboardStats, getHashRoute, getStoredTheme, matchesShortcut, resolveTheme, setHashRoute, setStoredTheme } from './chunk-IEHIPVSX.js';
2
+ //# sourceMappingURL=utils.js.map
3
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"utils.js"}
package/dist/vite.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ import * as vite from 'vite';
2
+ import { StorybookViteOptions } from './types.js';
3
+
4
+ /**
5
+ * Create a Vite configuration for a storybook app.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // apps/storybook-react/vite.config.ts
10
+ * import { createStorybookViteConfig } from '@geenius/storybook/vite'
11
+ * import react from '@vitejs/plugin-react'
12
+ *
13
+ * export default createStorybookViteConfig({
14
+ * framework: 'react',
15
+ * port: 3050,
16
+ * plugins: [react()],
17
+ * })
18
+ * ```
19
+ */
20
+ declare function createStorybookViteConfig(options: StorybookViteOptions): Record<string, any> | {
21
+ plugins: vite.PluginOption[];
22
+ resolve: {
23
+ alias: {
24
+ '@': string;
25
+ };
26
+ };
27
+ server: {
28
+ port: number;
29
+ strictPort: false;
30
+ };
31
+ build: {
32
+ target: string;
33
+ sourcemap: true;
34
+ };
35
+ define: {
36
+ __GSB_FRAMEWORK__: string;
37
+ __GSB_PORT__: string;
38
+ };
39
+ };
40
+
41
+ export { StorybookViteOptions, createStorybookViteConfig };
package/dist/vite.js ADDED
@@ -0,0 +1,3 @@
1
+ export { createStorybookViteConfig } from './chunk-PRS2B2OG.js';
2
+ //# sourceMappingURL=vite.js.map
3
+ //# sourceMappingURL=vite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"vite.js"}
package/package.json ADDED
@@ -0,0 +1,103 @@
1
+ {
2
+ "name": "@geenius/storybook",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Shared storybook shell, theme, layout, and Vite preset for all @geenius packages",
6
+ "license": "MIT",
7
+ "author": "Antigravity <dev@antigravity.dev>",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/geenius-dev/geenius-storybook.git"
11
+ },
12
+ "engines": {
13
+ "node": ">=20.0.0"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "LICENSE",
19
+ "CHANGELOG.md"
20
+ ],
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ },
26
+ "./surface": {
27
+ "types": "./dist/surface.d.ts",
28
+ "import": "./dist/surface.js"
29
+ },
30
+ "./react": {
31
+ "types": "./dist/react.d.ts",
32
+ "import": "./dist/react.js"
33
+ },
34
+ "./solidjs": {
35
+ "types": "./dist/solidjs.d.ts",
36
+ "import": "./dist/solidjs.js"
37
+ },
38
+ "./types": {
39
+ "types": "./dist/types.d.ts",
40
+ "import": "./dist/types.js"
41
+ },
42
+ "./utils": {
43
+ "types": "./dist/utils.d.ts",
44
+ "import": "./dist/utils.js"
45
+ },
46
+ "./vite": {
47
+ "types": "./dist/vite.d.ts",
48
+ "import": "./dist/vite.js"
49
+ },
50
+ "./styles": "./dist/styles.css",
51
+ "./theme": "./dist/theme.css",
52
+ "./html": "./dist/index.html"
53
+ },
54
+ "scripts": {
55
+ "changeset": "changeset",
56
+ "build": "tsup && pnpm build:assets",
57
+ "build:assets": "cp src/styles.css dist/styles.css && cp src/theme.css dist/theme.css && cp src/index.html dist/index.html",
58
+ "clean": "rm -rf dist",
59
+ "dev": "tsup --watch",
60
+ "lint": "publint",
61
+ "lint:pub": "publint",
62
+ "type-check": "tsc --noEmit",
63
+ "test:unit": "vitest run --passWithNoTests",
64
+ "test:exports": "vitest run tests/exports.test.ts",
65
+ "test:types": "npm_config_cache=/tmp/.npm-cache attw --pack . --ignore-rules cjs-resolves-to-esm no-resolution",
66
+ "test": "pnpm build && pnpm test:unit && pnpm test:exports && pnpm test:types",
67
+ "format": "prettier --write \"src/**/*.{ts,css,html}\"",
68
+ "prepublishOnly": "pnpm build"
69
+ },
70
+ "dependencies": {},
71
+ "peerDependencies": {
72
+ "react": "^18.0.0 || ^19.0.0",
73
+ "solid-js": "^1.8.0 || ^1.9.0",
74
+ "vite": ">=5.0.0"
75
+ },
76
+ "peerDependenciesMeta": {
77
+ "react": {
78
+ "optional": true
79
+ },
80
+ "solid-js": {
81
+ "optional": true
82
+ },
83
+ "vite": {
84
+ "optional": true
85
+ }
86
+ },
87
+ "devDependencies": {
88
+ "@arethetypeswrong/cli": "^0.17.3",
89
+ "@changesets/cli": "^2.29.4",
90
+ "@types/react": "^19.2.2",
91
+ "prettier": "^3.5.3",
92
+ "react": "^19.2.0",
93
+ "solid-js": "^1.9.9",
94
+ "publint": "^0.3.12",
95
+ "tsup": "^8.5.0",
96
+ "typescript": "^5.8.3",
97
+ "vite": "^6.3.4",
98
+ "vitest": "^3.1.3"
99
+ },
100
+ "publishConfig": {
101
+ "access": "public"
102
+ }
103
+ }