@zen-ui-capri/system 0.0.0-stage → 1.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 (105) hide show
  1. package/.agents/skills/capri-zen-ui/SKILL.md +59 -0
  2. package/AGENTS.md +57 -0
  3. package/CLAUDE.md +7 -0
  4. package/LICENSE +21 -0
  5. package/README.md +93 -2
  6. package/bin/capri.mjs +1187 -0
  7. package/dist/lib/audio/ZenAudioController.d.ts +10 -0
  8. package/dist/lib/audio/ZenAudioController.d.ts.map +1 -0
  9. package/dist/lib/audio/useZenAudioSynth.d.ts +26 -0
  10. package/dist/lib/audio/useZenAudioSynth.d.ts.map +1 -0
  11. package/dist/lib/capri/capri-engine.d.ts +127 -0
  12. package/dist/lib/capri/capri-engine.d.ts.map +1 -0
  13. package/dist/lib/components/ZenAIConstruct.d.ts +24 -0
  14. package/dist/lib/components/ZenAIConstruct.d.ts.map +1 -0
  15. package/dist/lib/components/ZenAmbientBackground.d.ts +8 -0
  16. package/dist/lib/components/ZenAmbientBackground.d.ts.map +1 -0
  17. package/dist/lib/components/ZenBadge.d.ts +21 -0
  18. package/dist/lib/components/ZenBadge.d.ts.map +1 -0
  19. package/dist/lib/components/ZenButton.d.ts +24 -0
  20. package/dist/lib/components/ZenButton.d.ts.map +1 -0
  21. package/dist/lib/components/ZenCard.d.ts +36 -0
  22. package/dist/lib/components/ZenCard.d.ts.map +1 -0
  23. package/dist/lib/components/ZenDataDisplay.d.ts +50 -0
  24. package/dist/lib/components/ZenDataDisplay.d.ts.map +1 -0
  25. package/dist/lib/components/ZenDataTable.d.ts +20 -0
  26. package/dist/lib/components/ZenDataTable.d.ts.map +1 -0
  27. package/dist/lib/components/ZenDossierPanel.d.ts +33 -0
  28. package/dist/lib/components/ZenDossierPanel.d.ts.map +1 -0
  29. package/dist/lib/components/ZenDropdown.d.ts +19 -0
  30. package/dist/lib/components/ZenDropdown.d.ts.map +1 -0
  31. package/dist/lib/components/ZenFeedback.d.ts +24 -0
  32. package/dist/lib/components/ZenFeedback.d.ts.map +1 -0
  33. package/dist/lib/components/ZenForms.d.ts +84 -0
  34. package/dist/lib/components/ZenForms.d.ts.map +1 -0
  35. package/dist/lib/components/ZenHeading.d.ts +15 -0
  36. package/dist/lib/components/ZenHeading.d.ts.map +1 -0
  37. package/dist/lib/components/ZenIcon.d.ts +24 -0
  38. package/dist/lib/components/ZenIcon.d.ts.map +1 -0
  39. package/dist/lib/components/ZenInput.d.ts +12 -0
  40. package/dist/lib/components/ZenInput.d.ts.map +1 -0
  41. package/dist/lib/components/ZenModal.d.ts +12 -0
  42. package/dist/lib/components/ZenModal.d.ts.map +1 -0
  43. package/dist/lib/components/ZenNavbar.d.ts +11 -0
  44. package/dist/lib/components/ZenNavbar.d.ts.map +1 -0
  45. package/dist/lib/components/ZenNavigation.d.ts +52 -0
  46. package/dist/lib/components/ZenNavigation.d.ts.map +1 -0
  47. package/dist/lib/components/ZenOverlays.d.ts +48 -0
  48. package/dist/lib/components/ZenOverlays.d.ts.map +1 -0
  49. package/dist/lib/components/ZenSegmentedControl.d.ts +18 -0
  50. package/dist/lib/components/ZenSegmentedControl.d.ts.map +1 -0
  51. package/dist/lib/components/ZenSwitch.d.ts +11 -0
  52. package/dist/lib/components/ZenSwitch.d.ts.map +1 -0
  53. package/dist/lib/components/ZenTabs.d.ts +17 -0
  54. package/dist/lib/components/ZenTabs.d.ts.map +1 -0
  55. package/dist/lib/components/ZenTimelineCard.d.ts +14 -0
  56. package/dist/lib/components/ZenTimelineCard.d.ts.map +1 -0
  57. package/dist/lib/components/ZenToast.d.ts +18 -0
  58. package/dist/lib/components/ZenToast.d.ts.map +1 -0
  59. package/dist/lib/cosmos/ZenCosmosCanvas.d.ts +10 -0
  60. package/dist/lib/cosmos/ZenCosmosCanvas.d.ts.map +1 -0
  61. package/dist/lib/cosmos/ZenTelemetryHud.d.ts +45 -0
  62. package/dist/lib/cosmos/ZenTelemetryHud.d.ts.map +1 -0
  63. package/dist/lib/index.d.ts +33 -0
  64. package/dist/lib/index.d.ts.map +1 -0
  65. package/dist/lib/index.js +3922 -0
  66. package/dist/lib/theme/ZenThemeProvider.d.ts +47 -0
  67. package/dist/lib/theme/ZenThemeProvider.d.ts.map +1 -0
  68. package/dist/lib/tokens.css +888 -0
  69. package/dist/lib/universal/zen-universal.d.ts +77 -0
  70. package/dist/lib/universal/zen-universal.d.ts.map +1 -0
  71. package/dist/lib/universal/zen-universal.js +18 -0
  72. package/dist/lib/zen-universal-C0PD8AI9.js +1352 -0
  73. package/package.json +78 -4
  74. package/src/lib/audio/ZenAudioController.tsx +114 -0
  75. package/src/lib/audio/useZenAudioSynth.ts +289 -0
  76. package/src/lib/capri/capri-engine.ts +939 -0
  77. package/src/lib/components/ZenAIConstruct.tsx +594 -0
  78. package/src/lib/components/ZenAmbientBackground.tsx +210 -0
  79. package/src/lib/components/ZenBadge.tsx +111 -0
  80. package/src/lib/components/ZenButton.tsx +127 -0
  81. package/src/lib/components/ZenCard.tsx +180 -0
  82. package/src/lib/components/ZenDataDisplay.tsx +349 -0
  83. package/src/lib/components/ZenDataTable.tsx +143 -0
  84. package/src/lib/components/ZenDossierPanel.tsx +120 -0
  85. package/src/lib/components/ZenDropdown.tsx +208 -0
  86. package/src/lib/components/ZenFeedback.tsx +137 -0
  87. package/src/lib/components/ZenForms.tsx +664 -0
  88. package/src/lib/components/ZenHeading.tsx +63 -0
  89. package/src/lib/components/ZenIcon.tsx +220 -0
  90. package/src/lib/components/ZenInput.tsx +120 -0
  91. package/src/lib/components/ZenModal.tsx +103 -0
  92. package/src/lib/components/ZenNavbar.tsx +106 -0
  93. package/src/lib/components/ZenNavigation.tsx +300 -0
  94. package/src/lib/components/ZenOverlays.tsx +386 -0
  95. package/src/lib/components/ZenSegmentedControl.tsx +113 -0
  96. package/src/lib/components/ZenSwitch.tsx +63 -0
  97. package/src/lib/components/ZenTabs.tsx +103 -0
  98. package/src/lib/components/ZenTimelineCard.tsx +64 -0
  99. package/src/lib/components/ZenToast.tsx +96 -0
  100. package/src/lib/cosmos/ZenCosmosCanvas.tsx +931 -0
  101. package/src/lib/cosmos/ZenTelemetryHud.tsx +385 -0
  102. package/src/lib/index.ts +293 -0
  103. package/src/lib/styles/zen-tokens.css +888 -0
  104. package/src/lib/theme/ZenThemeProvider.tsx +328 -0
  105. package/src/lib/universal/zen-universal.ts +743 -0
@@ -0,0 +1,328 @@
1
+ import {
2
+ createContext,
3
+ useContext,
4
+ useEffect,
5
+ useMemo,
6
+ useState,
7
+ type ReactNode,
8
+ } from 'react';
9
+
10
+ export type ZenThemeId =
11
+ | 'obsidian-gold'
12
+ | 'blackwall-crimson'
13
+ | 'neon-emerald'
14
+ | 'midnight-cobalt'
15
+ | 'atelier-paper'
16
+ | 'nordic-snow'
17
+ | 'kyoto-matcha'
18
+ | 'cyber-daylight';
19
+
20
+ export type ZenThemeMode = ZenThemeId | 'obsidian' | 'paper';
21
+ export type ZenDensityMode = 'comfortable' | 'compact';
22
+ export type ZenRadiusMode = 'sharp' | 'architectural' | 'soft';
23
+
24
+ export interface ZenThemeMetadata {
25
+ readonly id: ZenThemeId;
26
+ readonly name: string;
27
+ readonly polarity: 'dark' | 'light';
28
+ readonly tagline: string;
29
+ readonly canvasHex: string;
30
+ readonly accentHex: string;
31
+ readonly secondaryHex: string;
32
+ readonly inkHex: string;
33
+ }
34
+
35
+ export const ZEN_THEMES: readonly ZenThemeMetadata[] = [
36
+ {
37
+ id: 'obsidian-gold',
38
+ name: 'Obsidian Gold',
39
+ polarity: 'dark',
40
+ tagline: 'Warm alabaster & solar gold on deep mineral void',
41
+ canvasHex: '#070709',
42
+ accentHex: '#F5B841',
43
+ secondaryHex: '#FB923C',
44
+ inkHex: '#F6F2E9',
45
+ },
46
+ {
47
+ id: 'blackwall-crimson',
48
+ name: 'Capri // Capricorn',
49
+ polarity: 'dark',
50
+ tagline: 'Edgerunners S2 mixed-construct hot pink & acid neon green on void',
51
+ canvasHex: '#050508',
52
+ accentHex: '#FF2E93',
53
+ secondaryHex: '#00FF66',
54
+ inkHex: '#F4F7FA',
55
+ },
56
+ {
57
+ id: 'neon-emerald',
58
+ name: 'Bio-Emerald Terminal',
59
+ polarity: 'dark',
60
+ tagline: 'High-frequency financial & telemetry phosphor emerald',
61
+ canvasHex: '#040807',
62
+ accentHex: '#10B981',
63
+ secondaryHex: '#2DD4BF',
64
+ inkHex: '#ECFDF5',
65
+ },
66
+ {
67
+ id: 'midnight-cobalt',
68
+ name: 'Midnight Cobalt',
69
+ polarity: 'dark',
70
+ tagline: 'Cloud infrastructure & distributed systems deep slate',
71
+ canvasHex: '#060911',
72
+ accentHex: '#38BDF8',
73
+ secondaryHex: '#818CF8',
74
+ inkHex: '#F1F5F9',
75
+ },
76
+ {
77
+ id: 'atelier-paper',
78
+ name: 'Atelier Paper',
79
+ polarity: 'light',
80
+ tagline: 'Swiss archival cotton stock with burnished bronze ink',
81
+ canvasHex: '#F6F2E9',
82
+ accentHex: '#B45309',
83
+ secondaryHex: '#C2410C',
84
+ inkHex: '#121216',
85
+ },
86
+ {
87
+ id: 'nordic-snow',
88
+ name: 'Nordic Snow',
89
+ polarity: 'light',
90
+ tagline: 'Crisp daylight SaaS alabaster with royal cobalt precision',
91
+ canvasHex: '#F8FAFC',
92
+ accentHex: '#2563EB',
93
+ secondaryHex: '#0891B2',
94
+ inkHex: '#0F172A',
95
+ },
96
+ {
97
+ id: 'kyoto-matcha',
98
+ name: 'Kyoto Matcha',
99
+ polarity: 'light',
100
+ tagline: 'Raw botanical stone & forest ink for calm workspaces',
101
+ canvasHex: '#F3F5F0',
102
+ accentHex: '#15803D',
103
+ secondaryHex: '#0F766E',
104
+ inkHex: '#142018',
105
+ },
106
+ {
107
+ id: 'cyber-daylight',
108
+ name: 'Arasaka Daylight',
109
+ polarity: 'light',
110
+ tagline: 'High-contrast titanium white with razor crimson signal',
111
+ canvasHex: '#F2F2F5',
112
+ accentHex: '#E11D48',
113
+ secondaryHex: '#0284C7',
114
+ inkHex: '#09090D',
115
+ },
116
+ ];
117
+
118
+ export interface ZenThemeTokenOverrides {
119
+ readonly accentPrimary?: string;
120
+ readonly bgCanvas?: string;
121
+ readonly surface1?: string;
122
+ readonly inkPrimary?: string;
123
+ }
124
+
125
+ export interface ZenThemeContextValue {
126
+ readonly theme: ZenThemeId;
127
+ readonly themeMeta: ZenThemeMetadata;
128
+ readonly polarity: 'dark' | 'light';
129
+ readonly density: ZenDensityMode;
130
+ readonly radius: ZenRadiusMode;
131
+ readonly reducedMotion: boolean;
132
+ readonly themes: readonly ZenThemeMetadata[];
133
+ readonly setTheme: (next: ZenThemeId) => void;
134
+ readonly togglePolarity: () => void;
135
+ readonly setDensity: (next: ZenDensityMode) => void;
136
+ readonly setRadius: (next: ZenRadiusMode) => void;
137
+ }
138
+
139
+ const ZenThemeContext = createContext<ZenThemeContextValue | null>(null);
140
+
141
+ export interface ZenThemeProviderProps {
142
+ readonly defaultTheme?: ZenThemeId;
143
+ readonly defaultDensity?: ZenDensityMode;
144
+ readonly defaultRadius?: ZenRadiusMode;
145
+ readonly overrides?: ZenThemeTokenOverrides;
146
+ readonly syncDocumentRoot?: boolean;
147
+ readonly children: ReactNode;
148
+ }
149
+
150
+ export function syncZenScrollbarStyles(
151
+ themeMeta: ZenThemeMetadata,
152
+ overrides?: ZenThemeTokenOverrides
153
+ ): void {
154
+ if (typeof document === 'undefined') return;
155
+ const accent = overrides?.accentPrimary ?? themeMeta.accentHex;
156
+ const track = overrides?.bgCanvas ?? themeMeta.canvasHex;
157
+ const borderSubtle =
158
+ themeMeta.polarity === 'dark'
159
+ ? 'rgba(255, 255, 255, 0.12)'
160
+ : 'rgba(15, 23, 42, 0.14)';
161
+
162
+ const styleId = 'zen-theme-scrollbar';
163
+ let styleEl = document.getElementById(styleId) as HTMLStyleElement | null;
164
+ if (!styleEl) {
165
+ styleEl = document.createElement('style');
166
+ styleEl.id = styleId;
167
+ document.head.appendChild(styleEl);
168
+ }
169
+
170
+ styleEl.textContent = `
171
+ @supports (-moz-appearance: none) {
172
+ html, body, * {
173
+ scrollbar-width: thin;
174
+ scrollbar-color: ${accent} ${track};
175
+ }
176
+ }
177
+ ::-webkit-scrollbar,
178
+ html::-webkit-scrollbar,
179
+ body::-webkit-scrollbar,
180
+ *::-webkit-scrollbar {
181
+ width: 10px;
182
+ height: 10px;
183
+ }
184
+ ::-webkit-scrollbar-track,
185
+ html::-webkit-scrollbar-track,
186
+ body::-webkit-scrollbar-track,
187
+ *::-webkit-scrollbar-track {
188
+ background-color: ${track};
189
+ border-left: 1px solid ${borderSubtle};
190
+ }
191
+ ::-webkit-scrollbar-thumb,
192
+ html::-webkit-scrollbar-thumb,
193
+ body::-webkit-scrollbar-thumb,
194
+ *::-webkit-scrollbar-thumb {
195
+ background-color: color-mix(in srgb, ${accent} 68%, ${track});
196
+ border: 2px solid ${track};
197
+ border-radius: 9999px;
198
+ }
199
+ ::-webkit-scrollbar-thumb:hover,
200
+ html::-webkit-scrollbar-thumb:hover,
201
+ body::-webkit-scrollbar-thumb:hover,
202
+ *::-webkit-scrollbar-thumb:hover {
203
+ background-color: ${accent};
204
+ border: 2px solid ${track};
205
+ }
206
+ ::-webkit-scrollbar-thumb:active,
207
+ html::-webkit-scrollbar-thumb:active,
208
+ body::-webkit-scrollbar-thumb:active,
209
+ *::-webkit-scrollbar-thumb:active {
210
+ background-color: ${themeMeta.secondaryHex};
211
+ border: 2px solid ${track};
212
+ }
213
+ ::-webkit-scrollbar-corner,
214
+ html::-webkit-scrollbar-corner,
215
+ body::-webkit-scrollbar-corner,
216
+ *::-webkit-scrollbar-corner {
217
+ background-color: ${track};
218
+ }
219
+ `.trim();
220
+ }
221
+
222
+ export function ZenThemeProvider({
223
+ defaultTheme = 'blackwall-crimson',
224
+ defaultDensity = 'comfortable',
225
+ defaultRadius = 'architectural',
226
+ overrides,
227
+ syncDocumentRoot = true,
228
+ children,
229
+ }: ZenThemeProviderProps) {
230
+ const [theme, setTheme] = useState<ZenThemeId>(defaultTheme);
231
+ const [density, setDensity] = useState<ZenDensityMode>(defaultDensity);
232
+ const [radius, setRadius] = useState<ZenRadiusMode>(defaultRadius);
233
+ const [reducedMotion, setReducedMotion] = useState<boolean>(() => {
234
+ if (typeof window === 'undefined') return false;
235
+ return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
236
+ });
237
+
238
+ const themeMeta =
239
+ ZEN_THEMES.find((t) => t.id === theme) ?? ZEN_THEMES[0];
240
+
241
+ useEffect(() => {
242
+ if (typeof window === 'undefined') return;
243
+ const mq = window.matchMedia('(prefers-reduced-motion: reduce)');
244
+ const onChange = (e: MediaQueryListEvent) => setReducedMotion(e.matches);
245
+ mq.addEventListener('change', onChange);
246
+ return () => mq.removeEventListener('change', onChange);
247
+ }, []);
248
+
249
+ useEffect(() => {
250
+ if (!syncDocumentRoot || typeof document === 'undefined') return;
251
+ const root = document.documentElement;
252
+ root.setAttribute('data-theme', theme);
253
+ root.setAttribute('data-polarity', themeMeta.polarity);
254
+ root.setAttribute('data-density', density);
255
+ root.setAttribute('data-radius', radius);
256
+
257
+ if (overrides?.accentPrimary) {
258
+ root.style.setProperty('--zen-accent-primary', overrides.accentPrimary);
259
+ } else {
260
+ root.style.removeProperty('--zen-accent-primary');
261
+ }
262
+ if (overrides?.bgCanvas) {
263
+ root.style.setProperty('--zen-bg-canvas', overrides.bgCanvas);
264
+ } else {
265
+ root.style.removeProperty('--zen-bg-canvas');
266
+ }
267
+ if (overrides?.surface1) {
268
+ root.style.setProperty('--zen-surface-1', overrides.surface1);
269
+ } else {
270
+ root.style.removeProperty('--zen-surface-1');
271
+ }
272
+ if (overrides?.inkPrimary) {
273
+ root.style.setProperty('--zen-ink-primary', overrides.inkPrimary);
274
+ } else {
275
+ root.style.removeProperty('--zen-ink-primary');
276
+ }
277
+
278
+ syncZenScrollbarStyles(themeMeta, overrides);
279
+ }, [theme, themeMeta, density, radius, overrides, syncDocumentRoot]);
280
+
281
+ const togglePolarity = () => {
282
+ setTheme((prev) => {
283
+ const current = ZEN_THEMES.find((t) => t.id === prev) ?? ZEN_THEMES[0];
284
+ if (current.polarity === 'dark') {
285
+ if (prev === 'blackwall-crimson') return 'cyber-daylight';
286
+ if (prev === 'neon-emerald') return 'kyoto-matcha';
287
+ if (prev === 'midnight-cobalt') return 'nordic-snow';
288
+ return 'atelier-paper';
289
+ } else {
290
+ if (prev === 'cyber-daylight') return 'blackwall-crimson';
291
+ if (prev === 'kyoto-matcha') return 'neon-emerald';
292
+ if (prev === 'nordic-snow') return 'midnight-cobalt';
293
+ return 'obsidian-gold';
294
+ }
295
+ });
296
+ };
297
+
298
+ const value = useMemo<ZenThemeContextValue>(
299
+ () => ({
300
+ theme,
301
+ themeMeta,
302
+ polarity: themeMeta.polarity,
303
+ density,
304
+ radius,
305
+ reducedMotion,
306
+ themes: ZEN_THEMES,
307
+ setTheme,
308
+ togglePolarity,
309
+ setDensity,
310
+ setRadius,
311
+ }),
312
+ [theme, themeMeta, density, radius, reducedMotion]
313
+ );
314
+
315
+ return (
316
+ <ZenThemeContext.Provider value={value}>
317
+ {children}
318
+ </ZenThemeContext.Provider>
319
+ );
320
+ }
321
+
322
+ export function useZenTheme(): ZenThemeContextValue {
323
+ const ctx = useContext(ZenThemeContext);
324
+ if (!ctx) {
325
+ throw new Error('useZenTheme must be used within a ZenThemeProvider');
326
+ }
327
+ return ctx;
328
+ }