@omnitron-dev/prism 0.1.1
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.
- package/LICENSE +21 -0
- package/README.md +44 -0
- package/bin/prism.js +13 -0
- package/dist/accessibility/index.d.ts +157 -0
- package/dist/accessibility/index.js +186 -0
- package/dist/accessibility/index.js.map +1 -0
- package/dist/blocks/index.d.ts +1239 -0
- package/dist/blocks/index.js +1712 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/chunk-77KIJLPP.js +37 -0
- package/dist/chunk-77KIJLPP.js.map +1 -0
- package/dist/chunk-BTIT7WYH.js +339 -0
- package/dist/chunk-BTIT7WYH.js.map +1 -0
- package/dist/chunk-BV32OJ2A.js +1409 -0
- package/dist/chunk-BV32OJ2A.js.map +1 -0
- package/dist/chunk-DDY7TLUI.js +139 -0
- package/dist/chunk-DDY7TLUI.js.map +1 -0
- package/dist/chunk-DXXZ3ITR.js +4227 -0
- package/dist/chunk-DXXZ3ITR.js.map +1 -0
- package/dist/chunk-E3XANPTO.js +2319 -0
- package/dist/chunk-E3XANPTO.js.map +1 -0
- package/dist/chunk-FU52GL2E.js +3 -0
- package/dist/chunk-FU52GL2E.js.map +1 -0
- package/dist/chunk-GYDT5EKX.js +16505 -0
- package/dist/chunk-GYDT5EKX.js.map +1 -0
- package/dist/chunk-HO2GKTWJ.js +28 -0
- package/dist/chunk-HO2GKTWJ.js.map +1 -0
- package/dist/chunk-JDTC2SBY.js +140 -0
- package/dist/chunk-JDTC2SBY.js.map +1 -0
- package/dist/chunk-JNU4QHJK.js +6 -0
- package/dist/chunk-JNU4QHJK.js.map +1 -0
- package/dist/chunk-LAEY5USO.js +2621 -0
- package/dist/chunk-LAEY5USO.js.map +1 -0
- package/dist/chunk-UR6X3W5I.js +530 -0
- package/dist/chunk-UR6X3W5I.js.map +1 -0
- package/dist/chunk-WC2WM2JD.js +883 -0
- package/dist/chunk-WC2WM2JD.js.map +1 -0
- package/dist/chunk-XWL6J6IO.js +40 -0
- package/dist/chunk-XWL6J6IO.js.map +1 -0
- package/dist/cli/index.js +2695 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config-BA6IeTq9.d.ts +100 -0
- package/dist/core/index.d.ts +454 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/forms/index.d.ts +562 -0
- package/dist/forms/index.js +545 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/http/index.d.ts +233 -0
- package/dist/http/index.js +282 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index-odhPSv9I.d.ts +2491 -0
- package/dist/index.css +131 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +9109 -0
- package/dist/index.js +13280 -0
- package/dist/index.js.map +1 -0
- package/dist/layouts/index.d.ts +854 -0
- package/dist/layouts/index.js +6 -0
- package/dist/layouts/index.js.map +1 -0
- package/dist/netron/index.d.ts +4 -0
- package/dist/netron/index.js +4 -0
- package/dist/netron/index.js.map +1 -0
- package/dist/registry/index.d.ts +352 -0
- package/dist/registry/index.js +4 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry-BrDNftd5.d.ts +574 -0
- package/dist/settings-plpR26Xk.d.ts +455 -0
- package/dist/state/index.d.ts +981 -0
- package/dist/state/index.js +5 -0
- package/dist/state/index.js.map +1 -0
- package/dist/theme/index.d.ts +1049 -0
- package/dist/theme/index.js +5 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme-CrXLfP1c.d.ts +389 -0
- package/dist/types/index.d.ts +146 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/use-timeout-D7U3EAtH.d.ts +808 -0
- package/package.json +194 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { createPersistedStore, createSelectors, createUIStore } from './chunk-DDY7TLUI.js';
|
|
2
|
+
import { createJSONStorage } from 'zustand/middleware';
|
|
3
|
+
|
|
4
|
+
// src/state/stores/theme.ts
|
|
5
|
+
var defaultState = {
|
|
6
|
+
mode: "light",
|
|
7
|
+
direction: "ltr",
|
|
8
|
+
preset: "default",
|
|
9
|
+
compactLayout: false,
|
|
10
|
+
contrast: "default",
|
|
11
|
+
primaryColor: null
|
|
12
|
+
};
|
|
13
|
+
var useThemeStore = createPersistedStore(
|
|
14
|
+
(set) => ({
|
|
15
|
+
...defaultState,
|
|
16
|
+
setMode: (mode) => set({ mode }),
|
|
17
|
+
toggleMode: () => set((state) => {
|
|
18
|
+
state.mode = state.mode === "light" ? "dark" : "light";
|
|
19
|
+
}),
|
|
20
|
+
setDirection: (direction) => set({ direction }),
|
|
21
|
+
setPreset: (preset) => set({ preset }),
|
|
22
|
+
setCompactLayout: (compactLayout) => set({ compactLayout }),
|
|
23
|
+
setContrast: (contrast) => set({ contrast }),
|
|
24
|
+
setPrimaryColor: (primaryColor) => set({ primaryColor }),
|
|
25
|
+
reset: () => set(defaultState)
|
|
26
|
+
}),
|
|
27
|
+
"theme"
|
|
28
|
+
);
|
|
29
|
+
var themeStore = createSelectors(useThemeStore);
|
|
30
|
+
|
|
31
|
+
// src/state/stores/auth.ts
|
|
32
|
+
var useTokenStore = createUIStore(
|
|
33
|
+
(set) => ({
|
|
34
|
+
token: null,
|
|
35
|
+
setToken: (token) => set({ token })
|
|
36
|
+
}),
|
|
37
|
+
"token"
|
|
38
|
+
);
|
|
39
|
+
var useAuthStore = createPersistedStore(
|
|
40
|
+
(set) => ({
|
|
41
|
+
status: "loading",
|
|
42
|
+
sessionId: null,
|
|
43
|
+
// Actions
|
|
44
|
+
setStatus: (status) => set({ status }),
|
|
45
|
+
setAuthenticated: (sessionId) => {
|
|
46
|
+
set({
|
|
47
|
+
status: "authenticated",
|
|
48
|
+
sessionId: sessionId ?? null
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
setUnauthenticated: () => {
|
|
52
|
+
useTokenStore.getState().setToken(null);
|
|
53
|
+
set({
|
|
54
|
+
status: "unauthenticated",
|
|
55
|
+
sessionId: null
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
clearSession: () => {
|
|
59
|
+
useTokenStore.getState().setToken(null);
|
|
60
|
+
if (typeof window !== "undefined") {
|
|
61
|
+
window.sessionStorage.removeItem("sessionId");
|
|
62
|
+
}
|
|
63
|
+
set({
|
|
64
|
+
status: "unauthenticated",
|
|
65
|
+
sessionId: null
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}),
|
|
69
|
+
"auth",
|
|
70
|
+
{
|
|
71
|
+
// Only persist non-sensitive data
|
|
72
|
+
partialize: (state) => ({
|
|
73
|
+
status: state.status,
|
|
74
|
+
sessionId: state.sessionId
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
var authStore = createSelectors(useAuthStore);
|
|
79
|
+
|
|
80
|
+
// src/state/stores/ui.ts
|
|
81
|
+
var useUIStore = createUIStore(
|
|
82
|
+
(set) => ({
|
|
83
|
+
sidebarOpen: true,
|
|
84
|
+
sidebarCollapsed: false,
|
|
85
|
+
activeDialog: null,
|
|
86
|
+
globalLoading: false,
|
|
87
|
+
searchOpen: false,
|
|
88
|
+
toggleSidebar: () => set((state) => {
|
|
89
|
+
state.sidebarOpen = !state.sidebarOpen;
|
|
90
|
+
}),
|
|
91
|
+
setSidebarOpen: (sidebarOpen) => set({ sidebarOpen }),
|
|
92
|
+
setSidebarCollapsed: (sidebarCollapsed) => set({ sidebarCollapsed }),
|
|
93
|
+
openDialog: (dialogId) => set({ activeDialog: dialogId }),
|
|
94
|
+
closeDialog: () => set({ activeDialog: null }),
|
|
95
|
+
setGlobalLoading: (globalLoading) => set({ globalLoading }),
|
|
96
|
+
toggleSearch: () => set((state) => {
|
|
97
|
+
state.searchOpen = !state.searchOpen;
|
|
98
|
+
}),
|
|
99
|
+
setSearchOpen: (searchOpen) => set({ searchOpen })
|
|
100
|
+
}),
|
|
101
|
+
"ui"
|
|
102
|
+
);
|
|
103
|
+
var uiStore = createSelectors(useUIStore);
|
|
104
|
+
function runMigrations(state, fromVersion, toVersion, migrations) {
|
|
105
|
+
if (fromVersion >= toVersion) {
|
|
106
|
+
return state;
|
|
107
|
+
}
|
|
108
|
+
const sortedMigrations = [...migrations].sort((a, b) => a.version - b.version);
|
|
109
|
+
let currentState = state;
|
|
110
|
+
let currentVersion = fromVersion;
|
|
111
|
+
for (const migration of sortedMigrations) {
|
|
112
|
+
if (migration.version > fromVersion && migration.version <= toVersion) {
|
|
113
|
+
try {
|
|
114
|
+
currentState = migration.migrate(currentState);
|
|
115
|
+
currentVersion = migration.version;
|
|
116
|
+
} catch (error) {
|
|
117
|
+
console.error(`[SettingsVersion] Migration to v${migration.version} failed:`, error);
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (currentVersion !== toVersion) {
|
|
123
|
+
console.warn(`[SettingsVersion] Migration incomplete: reached v${currentVersion}, expected v${toVersion}`);
|
|
124
|
+
}
|
|
125
|
+
return currentState;
|
|
126
|
+
}
|
|
127
|
+
function createVersionedStorage(config) {
|
|
128
|
+
const { version, name, migrations, validate, onMigrationError, onCorruptData, defaultState: defaultState2 } = config;
|
|
129
|
+
const storage = {
|
|
130
|
+
getItem(key) {
|
|
131
|
+
try {
|
|
132
|
+
const raw = localStorage.getItem(key);
|
|
133
|
+
return raw;
|
|
134
|
+
} catch (error) {
|
|
135
|
+
console.error("[SettingsVersion] Storage read error:", error);
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
setItem(key, value) {
|
|
140
|
+
try {
|
|
141
|
+
localStorage.setItem(key, value);
|
|
142
|
+
} catch (error) {
|
|
143
|
+
console.error("[SettingsVersion] Storage write error:", error);
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
removeItem(key) {
|
|
147
|
+
try {
|
|
148
|
+
localStorage.removeItem(key);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.error("[SettingsVersion] Storage remove error:", error);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
function migrate(persistedState, persistedVersion) {
|
|
155
|
+
if (persistedVersion === version) {
|
|
156
|
+
if (validate && !validate(persistedState)) {
|
|
157
|
+
console.warn("[SettingsVersion] Stored state failed validation, using defaults");
|
|
158
|
+
onCorruptData?.(new Error("Validation failed"), persistedState);
|
|
159
|
+
return defaultState2;
|
|
160
|
+
}
|
|
161
|
+
return persistedState;
|
|
162
|
+
}
|
|
163
|
+
const migrated = runMigrations(persistedState, persistedVersion, version, migrations);
|
|
164
|
+
if (migrated === null) {
|
|
165
|
+
onMigrationError?.(new Error("Migration failed"), persistedVersion, version);
|
|
166
|
+
console.warn("[SettingsVersion] Migration failed, using defaults");
|
|
167
|
+
return defaultState2;
|
|
168
|
+
}
|
|
169
|
+
if (validate && !validate(migrated)) {
|
|
170
|
+
onCorruptData?.(new Error("Post-migration validation failed"), migrated);
|
|
171
|
+
console.warn("[SettingsVersion] Migrated state failed validation, using defaults");
|
|
172
|
+
return defaultState2;
|
|
173
|
+
}
|
|
174
|
+
console.log(`[SettingsVersion] Migrated from v${persistedVersion} to v${version}`);
|
|
175
|
+
return migrated;
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
storage,
|
|
179
|
+
version,
|
|
180
|
+
migrate,
|
|
181
|
+
defaultState: defaultState2
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function createVersionedPersistOptions(config) {
|
|
185
|
+
const versioned = createVersionedStorage(config);
|
|
186
|
+
return {
|
|
187
|
+
name: `prism-settings-${config.name}`,
|
|
188
|
+
// Use createJSONStorage to properly wrap the StateStorage for Zustand persist
|
|
189
|
+
storage: createJSONStorage(() => versioned.storage),
|
|
190
|
+
version: versioned.version,
|
|
191
|
+
migrate: versioned.migrate
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function checkSettingsVersion(name, currentVersion) {
|
|
195
|
+
const storageKey = `prism-settings-${name}`;
|
|
196
|
+
try {
|
|
197
|
+
const raw = localStorage.getItem(storageKey);
|
|
198
|
+
if (!raw) {
|
|
199
|
+
return {
|
|
200
|
+
needsMigration: false,
|
|
201
|
+
storedVersion: null,
|
|
202
|
+
currentVersion
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const parsed = JSON.parse(raw);
|
|
206
|
+
const storedVersion = parsed?.version ?? 0;
|
|
207
|
+
return {
|
|
208
|
+
needsMigration: storedVersion !== currentVersion,
|
|
209
|
+
storedVersion,
|
|
210
|
+
currentVersion
|
|
211
|
+
};
|
|
212
|
+
} catch {
|
|
213
|
+
return {
|
|
214
|
+
needsMigration: true,
|
|
215
|
+
storedVersion: null,
|
|
216
|
+
currentVersion
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function clearSettings(name) {
|
|
221
|
+
const storageKey = `prism-settings-${name}`;
|
|
222
|
+
try {
|
|
223
|
+
localStorage.removeItem(storageKey);
|
|
224
|
+
} catch {
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function exportSettings(name, currentVersion) {
|
|
228
|
+
const storageKey = `prism-settings-${name}`;
|
|
229
|
+
try {
|
|
230
|
+
const raw = localStorage.getItem(storageKey);
|
|
231
|
+
if (!raw) return null;
|
|
232
|
+
const parsed = JSON.parse(raw);
|
|
233
|
+
return {
|
|
234
|
+
state: parsed.state,
|
|
235
|
+
version: parsed.version ?? currentVersion
|
|
236
|
+
};
|
|
237
|
+
} catch {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function importSettings(name, data) {
|
|
242
|
+
const storageKey = `prism-settings-${name}`;
|
|
243
|
+
try {
|
|
244
|
+
localStorage.setItem(storageKey, JSON.stringify(data));
|
|
245
|
+
} catch (error) {
|
|
246
|
+
console.error("[SettingsVersion] Import failed:", error);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function createSettingsValidator(config) {
|
|
250
|
+
return (state) => {
|
|
251
|
+
if (typeof state !== "object" || state === null) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
const record = state;
|
|
255
|
+
if (config.requiredKeys) {
|
|
256
|
+
for (const key of config.requiredKeys) {
|
|
257
|
+
if (!(key in record)) {
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (config.typeChecks) {
|
|
263
|
+
for (const [key, check] of Object.entries(config.typeChecks)) {
|
|
264
|
+
if (key in record && check && !check(record[key])) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return true;
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function createMigration(version, migrate) {
|
|
273
|
+
return { version, migrate };
|
|
274
|
+
}
|
|
275
|
+
function createRenameMigration(version, oldKey, newKey, defaultValue) {
|
|
276
|
+
return {
|
|
277
|
+
version,
|
|
278
|
+
migrate: (state) => {
|
|
279
|
+
const prev = state;
|
|
280
|
+
const result = { ...prev };
|
|
281
|
+
const value = oldKey in prev ? prev[oldKey] : defaultValue;
|
|
282
|
+
delete result[oldKey];
|
|
283
|
+
result[newKey] = value;
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function createAddFieldMigration(version, key, defaultValue) {
|
|
289
|
+
return {
|
|
290
|
+
version,
|
|
291
|
+
migrate: (state) => ({
|
|
292
|
+
...state,
|
|
293
|
+
[key]: defaultValue
|
|
294
|
+
})
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
function createRemoveFieldMigration(version, key) {
|
|
298
|
+
return {
|
|
299
|
+
version,
|
|
300
|
+
migrate: (state) => {
|
|
301
|
+
const result = { ...state };
|
|
302
|
+
delete result[key];
|
|
303
|
+
return result;
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
function createTransformMigration(version, key, transform, defaultValue) {
|
|
308
|
+
return {
|
|
309
|
+
version,
|
|
310
|
+
migrate: (state) => {
|
|
311
|
+
const prev = state;
|
|
312
|
+
const oldValue = key in prev ? prev[key] : void 0;
|
|
313
|
+
const newValue = oldValue !== void 0 ? transform(oldValue) : defaultValue;
|
|
314
|
+
return {
|
|
315
|
+
...prev,
|
|
316
|
+
[key]: newValue
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
function validateMigrations(migrations) {
|
|
322
|
+
const versions = migrations.map((m) => m.version).sort((a, b) => a - b);
|
|
323
|
+
const uniqueVersions = new Set(versions);
|
|
324
|
+
if (uniqueVersions.size !== versions.length) {
|
|
325
|
+
throw new Error("[SettingsVersion] Duplicate migration versions detected");
|
|
326
|
+
}
|
|
327
|
+
for (const version of versions) {
|
|
328
|
+
if (!Number.isInteger(version) || version < 1) {
|
|
329
|
+
throw new Error(`[SettingsVersion] Invalid migration version: ${version}. Must be a positive integer.`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
function getMigrationInfo(migrations) {
|
|
334
|
+
return migrations.map((m) => ({ version: m.version })).sort((a, b) => a.version - b.version);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export { authStore, checkSettingsVersion, clearSettings, createAddFieldMigration, createMigration, createRemoveFieldMigration, createRenameMigration, createSettingsValidator, createTransformMigration, createVersionedPersistOptions, createVersionedStorage, exportSettings, getMigrationInfo, importSettings, runMigrations, themeStore, uiStore, useAuthStore, useThemeStore, useUIStore, validateMigrations };
|
|
338
|
+
//# sourceMappingURL=chunk-BTIT7WYH.js.map
|
|
339
|
+
//# sourceMappingURL=chunk-BTIT7WYH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/state/stores/theme.ts","../src/state/stores/auth.ts","../src/state/stores/ui.ts","../src/state/settings-version.ts"],"names":["defaultState"],"mappings":"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","file":"chunk-BTIT7WYH.js","sourcesContent":["/**\n * Theme Store\n *\n * @deprecated Use useSettingsStore from './settings' instead.\n * This store is maintained for backwards compatibility only.\n * The useSettingsStore provides the same functionality plus additional\n * settings like navLayout, density, fontSize, and more.\n *\n * Migration example:\n * ```tsx\n * // Before (deprecated)\n * const { mode, setMode } = useThemeStore();\n *\n * // After (recommended)\n * const { mode, setMode } = useSettingsStore();\n * ```\n *\n * @module @omnitron-dev/prism/state/stores\n */\n\nimport { createPersistedStore, createSelectors } from '../create-store.js';\nimport type { ThemeMode, ThemeDirection } from '../../types/theme.js';\n\n/**\n * Theme store state and actions.\n */\nexport interface ThemeState {\n /** Current theme mode */\n mode: ThemeMode;\n /** Text direction */\n direction: ThemeDirection;\n /** Current preset name */\n preset: string;\n /** Compact layout mode */\n compactLayout: boolean;\n /** High contrast mode */\n contrast: 'default' | 'high';\n /** Primary color override */\n primaryColor: string | null;\n\n // Actions\n setMode: (mode: ThemeMode) => void;\n toggleMode: () => void;\n setDirection: (direction: ThemeDirection) => void;\n setPreset: (preset: string) => void;\n setCompactLayout: (compact: boolean) => void;\n setContrast: (contrast: 'default' | 'high') => void;\n setPrimaryColor: (color: string | null) => void;\n reset: () => void;\n}\n\nconst defaultState = {\n mode: 'light' as ThemeMode,\n direction: 'ltr' as ThemeDirection,\n preset: 'default',\n compactLayout: false,\n contrast: 'default' as const,\n primaryColor: null,\n};\n\n/**\n * Theme store with persistence.\n *\n * @example\n * ```tsx\n * function ThemeToggle() {\n * const { mode, toggleMode } = useThemeStore();\n * return <button onClick={toggleMode}>{mode}</button>;\n * }\n * ```\n */\nexport const useThemeStore = createPersistedStore<ThemeState>(\n (set) => ({\n ...defaultState,\n\n setMode: (mode) => set({ mode }),\n toggleMode: () =>\n set((state) => {\n state.mode = state.mode === 'light' ? 'dark' : 'light';\n }),\n setDirection: (direction) => set({ direction }),\n setPreset: (preset) => set({ preset }),\n setCompactLayout: (compactLayout) => set({ compactLayout }),\n setContrast: (contrast) => set({ contrast }),\n setPrimaryColor: (primaryColor) => set({ primaryColor }),\n reset: () => set(defaultState),\n }),\n 'theme'\n);\n\n/**\n * Theme store with auto-generated selectors.\n *\n * @example\n * ```tsx\n * const mode = themeStore.use.mode();\n * ```\n */\nexport const themeStore = createSelectors(useThemeStore);\n","/**\n * Auth Store\n *\n * Manages authentication state (UI-side).\n * Server-side token validation should use Netron auth.\n *\n * SECURITY NOTE: Tokens are stored in session storage (not localStorage)\n * and are NOT persisted across browser sessions. Only the auth status\n * is persisted to allow checking login state on page load.\n *\n * @module @omnitron-dev/prism/state/stores\n */\n\nimport { createPersistedStore, createUIStore, createSelectors } from '../create-store.js';\n\n/**\n * Authentication status.\n */\nexport type AuthStatus = 'loading' | 'authenticated' | 'unauthenticated';\n\n/**\n * Auth store state (persisted - only status).\n */\nexport interface AuthStoreState {\n /** Current auth status */\n status: AuthStatus;\n /** Session ID (non-sensitive) */\n sessionId: string | null;\n\n // Actions\n setStatus: (status: AuthStatus) => void;\n setAuthenticated: (sessionId?: string) => void;\n setUnauthenticated: () => void;\n clearSession: () => void;\n}\n\n/**\n * Token store state (non-persisted - memory only).\n * Tokens should NEVER be persisted to localStorage.\n */\ninterface TokenStoreState {\n /** Access token (memory-only, cleared on page refresh) */\n token: string | null;\n setToken: (token: string | null) => void;\n}\n\n/**\n * Token store - memory-only, NOT persisted.\n * For XSS security, tokens should not be in localStorage.\n */\nexport const useTokenStore = createUIStore<TokenStoreState>(\n (set) => ({\n token: null,\n setToken: (token) => set({ token }),\n }),\n 'token'\n);\n\n/**\n * Auth store with partial persistence.\n * Only status and sessionId are persisted, NOT the token.\n *\n * @example\n * ```tsx\n * function AuthGuard({ children }) {\n * const status = useAuthStore((s) => s.status);\n * const isAuthenticated = selectIsAuthenticated(useAuthStore.getState());\n *\n * if (status === 'loading') return <Spinner />;\n * if (!isAuthenticated) return <Navigate to=\"/login\" />;\n *\n * return children;\n * }\n * ```\n */\nexport const useAuthStore = createPersistedStore<AuthStoreState>(\n (set) => ({\n status: 'loading',\n sessionId: null,\n\n // Actions\n setStatus: (status) => set({ status }),\n\n setAuthenticated: (sessionId) => {\n set({\n status: 'authenticated',\n sessionId: sessionId ?? null,\n });\n },\n\n setUnauthenticated: () => {\n // Clear token from memory store\n useTokenStore.getState().setToken(null);\n set({\n status: 'unauthenticated',\n sessionId: null,\n });\n },\n\n clearSession: () => {\n // Clear token from memory\n useTokenStore.getState().setToken(null);\n // Clear any stored session data\n if (typeof window !== 'undefined') {\n window.sessionStorage.removeItem('sessionId');\n }\n set({\n status: 'unauthenticated',\n sessionId: null,\n });\n },\n }),\n 'auth',\n {\n // Only persist non-sensitive data\n partialize: (state) =>\n ({\n status: state.status,\n sessionId: state.sessionId,\n }) as AuthStoreState,\n }\n);\n\n// =============================================================================\n// SELECTORS (computed state helpers)\n// =============================================================================\n\n/**\n * Select whether auth is loading.\n */\nexport function selectIsLoading(state: AuthStoreState): boolean {\n return state.status === 'loading';\n}\n\n/**\n * Select whether user is authenticated.\n */\nexport function selectIsAuthenticated(state: AuthStoreState): boolean {\n return state.status === 'authenticated';\n}\n\n/**\n * Select whether user is unauthenticated.\n */\nexport function selectIsUnauthenticated(state: AuthStoreState): boolean {\n return state.status === 'unauthenticated';\n}\n\n/**\n * Auth store with auto-generated selectors.\n */\nexport const authStore = createSelectors(useAuthStore);\n\n// =============================================================================\n// HELPER HOOKS\n// =============================================================================\n\n/**\n * Hook to set both token and auth status atomically.\n *\n * @example\n * ```tsx\n * const { login, logout } = useAuth();\n *\n * // On successful login\n * login(accessToken, sessionId);\n *\n * // On logout\n * logout();\n * ```\n */\nexport function useAuth() {\n const setToken = useTokenStore((s) => s.setToken);\n const { setAuthenticated, setUnauthenticated, clearSession } = useAuthStore();\n\n return {\n login: (token: string, sessionId?: string) => {\n setToken(token);\n setAuthenticated(sessionId);\n },\n logout: () => {\n setUnauthenticated();\n },\n clearSession,\n getToken: () => useTokenStore.getState().token,\n };\n}\n","/**\n * UI Store\n *\n * Manages transient UI state (not persisted).\n *\n * @module @omnitron-dev/prism/state/stores\n */\n\nimport { createUIStore, createSelectors } from '../create-store.js';\n\n/**\n * UI store state and actions.\n */\nexport interface UIState {\n /** Sidebar open state */\n sidebarOpen: boolean;\n /** Sidebar collapsed state (mini mode) */\n sidebarCollapsed: boolean;\n /** Active dialog ID */\n activeDialog: string | null;\n /** Global loading overlay */\n globalLoading: boolean;\n /** Search modal open */\n searchOpen: boolean;\n\n // Actions\n toggleSidebar: () => void;\n setSidebarOpen: (open: boolean) => void;\n setSidebarCollapsed: (collapsed: boolean) => void;\n openDialog: (dialogId: string) => void;\n closeDialog: () => void;\n setGlobalLoading: (loading: boolean) => void;\n toggleSearch: () => void;\n setSearchOpen: (open: boolean) => void;\n}\n\n/**\n * UI store for transient state.\n *\n * @example\n * ```tsx\n * function Sidebar() {\n * const { sidebarOpen, sidebarCollapsed, toggleSidebar } = useUIStore();\n *\n * return (\n * <Drawer\n * open={sidebarOpen}\n * variant={sidebarCollapsed ? 'mini' : 'permanent'}\n * >\n * <SidebarContent />\n * </Drawer>\n * );\n * }\n * ```\n */\nexport const useUIStore = createUIStore<UIState>(\n (set) => ({\n sidebarOpen: true,\n sidebarCollapsed: false,\n activeDialog: null,\n globalLoading: false,\n searchOpen: false,\n\n toggleSidebar: () =>\n set((state) => {\n state.sidebarOpen = !state.sidebarOpen;\n }),\n\n setSidebarOpen: (sidebarOpen) => set({ sidebarOpen }),\n\n setSidebarCollapsed: (sidebarCollapsed) => set({ sidebarCollapsed }),\n\n openDialog: (dialogId) => set({ activeDialog: dialogId }),\n\n closeDialog: () => set({ activeDialog: null }),\n\n setGlobalLoading: (globalLoading) => set({ globalLoading }),\n\n toggleSearch: () =>\n set((state) => {\n state.searchOpen = !state.searchOpen;\n }),\n\n setSearchOpen: (searchOpen) => set({ searchOpen }),\n }),\n 'ui'\n);\n\n/**\n * UI store with auto-generated selectors.\n */\nexport const uiStore = createSelectors(useUIStore);\n","/**\n * Settings Version Management\n *\n * Utilities for managing versioned settings with safe migrations.\n * Enables breaking changes to settings structure while preserving user data.\n *\n * @module @omnitron-dev/prism/state\n */\n\nimport { createJSONStorage, type PersistOptions, type StateStorage } from 'zustand/middleware';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Migration function signature.\n * Transforms settings from one version to the next.\n */\nexport type MigrationFn<TPrev = unknown, TNext = unknown> = (prevState: TPrev) => TNext;\n\n/**\n * Version-specific migration configuration.\n */\nexport interface VersionMigration<TPrev = unknown, TNext = unknown> {\n /** Target version number */\n version: number;\n /** Migration function */\n migrate: MigrationFn<TPrev, TNext>;\n}\n\n/**\n * Versioned settings configuration.\n */\nexport interface VersionedSettingsConfig<TState> {\n /** Current version number (increment when structure changes) */\n version: number;\n /** Storage key prefix */\n name: string;\n /** Ordered list of migrations (version -> next version) */\n migrations: VersionMigration[];\n /** Validation function (optional) */\n validate?: (state: unknown) => state is TState;\n /** Called when migration fails */\n onMigrationError?: (error: unknown, fromVersion: number, toVersion: number) => void;\n /** Called when stored data is corrupt/invalid */\n onCorruptData?: (error: unknown, rawData: unknown) => void;\n /** Default state (used when migration fails or data is corrupt) */\n defaultState: TState;\n}\n\n/**\n * Persisted settings with version metadata.\n */\nexport interface VersionedPersistedState<TState> {\n state: TState;\n version: number;\n}\n\n// =============================================================================\n// MIGRATION ENGINE\n// =============================================================================\n\n/**\n * Run migrations from one version to another.\n *\n * @param state - Current state\n * @param fromVersion - Starting version\n * @param toVersion - Target version\n * @param migrations - Available migrations\n * @returns Migrated state or null if migration failed\n */\nexport function runMigrations<TState>(\n state: unknown,\n fromVersion: number,\n toVersion: number,\n migrations: VersionMigration[]\n): TState | null {\n if (fromVersion >= toVersion) {\n return state as TState;\n }\n\n // Sort migrations by version\n const sortedMigrations = [...migrations].sort((a, b) => a.version - b.version);\n\n let currentState = state;\n let currentVersion = fromVersion;\n\n // Apply each migration in sequence\n for (const migration of sortedMigrations) {\n if (migration.version > fromVersion && migration.version <= toVersion) {\n try {\n currentState = migration.migrate(currentState);\n currentVersion = migration.version;\n } catch (error) {\n console.error(`[SettingsVersion] Migration to v${migration.version} failed:`, error);\n return null;\n }\n }\n }\n\n if (currentVersion !== toVersion) {\n console.warn(`[SettingsVersion] Migration incomplete: reached v${currentVersion}, expected v${toVersion}`);\n }\n\n return currentState as TState;\n}\n\n// =============================================================================\n// VERSIONED STORAGE\n// =============================================================================\n\n/**\n * Create a versioned storage adapter for Zustand persist.\n *\n * This adapter handles:\n * - Version tracking in stored data\n * - Automatic migrations when version changes\n * - Safe fallback to defaults on corrupt data\n *\n * @example\n * ```tsx\n * interface AppSettings {\n * theme: 'light' | 'dark';\n * language: string;\n * notifications: { email: boolean; push: boolean };\n * }\n *\n * const versionedStorage = createVersionedStorage<AppSettings>({\n * version: 3,\n * name: 'app-settings',\n * defaultState: {\n * theme: 'light',\n * language: 'en',\n * notifications: { email: true, push: true },\n * },\n * migrations: [\n * {\n * version: 2,\n * migrate: (prev: { theme: string }) => ({\n * ...prev,\n * language: 'en', // Added in v2\n * }),\n * },\n * {\n * version: 3,\n * migrate: (prev: { theme: string; language: string }) => ({\n * ...prev,\n * notifications: { email: true, push: true }, // Added in v3\n * }),\n * },\n * ],\n * });\n *\n * // Use with createPrismStore\n * const useSettings = createPrismStore<AppSettings>(\n * (set) => ({\n * ...versionedStorage.defaultState,\n * setTheme: (theme) => set({ theme }),\n * }),\n * {\n * name: 'settings',\n * persist: {\n * storage: versionedStorage.storage,\n * version: versionedStorage.version,\n * migrate: versionedStorage.migrate,\n * },\n * }\n * );\n * ```\n */\nexport function createVersionedStorage<TState>(config: VersionedSettingsConfig<TState>): {\n storage: StateStorage;\n version: number;\n migrate: (persistedState: unknown, version: number) => TState;\n defaultState: TState;\n} {\n const { version, name, migrations, validate, onMigrationError, onCorruptData, defaultState } = config;\n\n const storageKey = `prism-settings-${name}`;\n\n /**\n * Custom storage adapter that handles versioned data.\n */\n const storage: StateStorage = {\n getItem(key) {\n try {\n const raw = localStorage.getItem(key);\n return raw;\n } catch (error) {\n console.error('[SettingsVersion] Storage read error:', error);\n return null;\n }\n },\n\n setItem(key, value) {\n try {\n localStorage.setItem(key, value);\n } catch (error) {\n console.error('[SettingsVersion] Storage write error:', error);\n }\n },\n\n removeItem(key) {\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error('[SettingsVersion] Storage remove error:', error);\n }\n },\n };\n\n /**\n * Migration function for Zustand persist.\n */\n function migrate(persistedState: unknown, persistedVersion: number): TState {\n // No migration needed if versions match\n if (persistedVersion === version) {\n // Optionally validate\n if (validate && !validate(persistedState)) {\n console.warn('[SettingsVersion] Stored state failed validation, using defaults');\n onCorruptData?.(new Error('Validation failed'), persistedState);\n return defaultState;\n }\n return persistedState as TState;\n }\n\n // Run migrations\n const migrated = runMigrations<TState>(persistedState, persistedVersion, version, migrations);\n\n if (migrated === null) {\n // Migration failed\n onMigrationError?.(new Error('Migration failed'), persistedVersion, version);\n console.warn('[SettingsVersion] Migration failed, using defaults');\n return defaultState;\n }\n\n // Validate migrated state\n if (validate && !validate(migrated)) {\n onCorruptData?.(new Error('Post-migration validation failed'), migrated);\n console.warn('[SettingsVersion] Migrated state failed validation, using defaults');\n return defaultState;\n }\n\n console.log(`[SettingsVersion] Migrated from v${persistedVersion} to v${version}`);\n return migrated;\n }\n\n return {\n storage,\n version,\n migrate,\n defaultState,\n };\n}\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Create persist options for versioned settings.\n * Convenience function that returns properly typed PersistOptions.\n *\n * @example\n * ```tsx\n * const persistOptions = createVersionedPersistOptions<MySettings>({\n * version: 2,\n * name: 'my-settings',\n * defaultState: { /* ... *\\/ },\n * migrations: [{ version: 2, migrate: (prev) => ({ ...prev, newField: 'default' }) }],\n * });\n *\n * const useStore = createPrismStore(initializer, {\n * name: 'my-settings',\n * persist: persistOptions,\n * });\n * ```\n */\nexport function createVersionedPersistOptions<TState>(\n config: VersionedSettingsConfig<TState>\n): Partial<PersistOptions<TState>> {\n const versioned = createVersionedStorage(config);\n\n return {\n name: `prism-settings-${config.name}`,\n // Use createJSONStorage to properly wrap the StateStorage for Zustand persist\n storage: createJSONStorage(() => versioned.storage),\n version: versioned.version,\n migrate: versioned.migrate as (persistedState: unknown, version: number) => TState | Promise<TState>,\n };\n}\n\n/**\n * Check if settings need migration.\n *\n * @param name - Settings name\n * @param currentVersion - Current app settings version\n * @returns Object with migration status\n */\nexport function checkSettingsVersion(\n name: string,\n currentVersion: number\n): {\n needsMigration: boolean;\n storedVersion: number | null;\n currentVersion: number;\n} {\n const storageKey = `prism-settings-${name}`;\n\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) {\n return {\n needsMigration: false,\n storedVersion: null,\n currentVersion,\n };\n }\n\n const parsed = JSON.parse(raw);\n const storedVersion = parsed?.version ?? 0;\n\n return {\n needsMigration: storedVersion !== currentVersion,\n storedVersion,\n currentVersion,\n };\n } catch {\n return {\n needsMigration: true,\n storedVersion: null,\n currentVersion,\n };\n }\n}\n\n/**\n * Clear stored settings (useful for testing or reset).\n */\nexport function clearSettings(name: string): void {\n const storageKey = `prism-settings-${name}`;\n try {\n localStorage.removeItem(storageKey);\n } catch {\n // Ignore storage errors\n }\n}\n\n/**\n * Export settings to JSON.\n */\nexport function exportSettings<TState>(name: string, currentVersion: number): VersionedPersistedState<TState> | null {\n const storageKey = `prism-settings-${name}`;\n\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n\n const parsed = JSON.parse(raw);\n return {\n state: parsed.state,\n version: parsed.version ?? currentVersion,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Import settings from JSON.\n * Will trigger migration if version differs.\n */\nexport function importSettings<TState>(name: string, data: VersionedPersistedState<TState>): void {\n const storageKey = `prism-settings-${name}`;\n\n try {\n localStorage.setItem(storageKey, JSON.stringify(data));\n } catch (error) {\n console.error('[SettingsVersion] Import failed:', error);\n }\n}\n\n// =============================================================================\n// TYPE GUARDS\n// =============================================================================\n\n/**\n * Create a type guard for settings validation.\n *\n * @example\n * ```tsx\n * const isValidSettings = createSettingsValidator<MySettings>({\n * requiredKeys: ['theme', 'language'],\n * typeChecks: {\n * theme: (v) => v === 'light' || v === 'dark',\n * language: (v) => typeof v === 'string',\n * },\n * });\n * ```\n */\nexport function createSettingsValidator<TState extends Record<string, unknown>>(config: {\n requiredKeys?: (keyof TState)[];\n typeChecks?: Partial<{ [K in keyof TState]: (value: unknown) => boolean }>;\n}): (state: unknown) => state is TState {\n return (state: unknown): state is TState => {\n if (typeof state !== 'object' || state === null) {\n return false;\n }\n\n const record = state as Record<string, unknown>;\n\n // Check required keys\n if (config.requiredKeys) {\n for (const key of config.requiredKeys) {\n if (!(key in record)) {\n return false;\n }\n }\n }\n\n // Run type checks\n if (config.typeChecks) {\n for (const [key, check] of Object.entries(config.typeChecks)) {\n if (key in record && check && !check(record[key])) {\n return false;\n }\n }\n }\n\n return true;\n };\n}\n\n// =============================================================================\n// MIGRATION HELPERS\n// =============================================================================\n\n/**\n * Creates a simple migration from one version to the next.\n *\n * @example\n * ```typescript\n * const v2Migration = createMigration(2, (state) => ({\n * ...state,\n * navLayout: 'vertical',\n * }));\n * ```\n */\nexport function createMigration<TPrev = unknown, TNext = unknown>(\n version: number,\n migrate: MigrationFn<TPrev, TNext>\n): VersionMigration<TPrev, TNext> {\n return { version, migrate };\n}\n\n/**\n * Creates a migration that renames a field.\n *\n * @example\n * ```typescript\n * const renameMigration = createRenameMigration(3, 'theme', 'mode', 'light');\n * ```\n */\nexport function createRenameMigration<TNext>(\n version: number,\n oldKey: string,\n newKey: string,\n defaultValue: unknown\n): VersionMigration {\n return {\n version,\n migrate: (state) => {\n const prev = state as Record<string, unknown>;\n const result = { ...prev } as Record<string, unknown>;\n\n // Get value from old key or use default\n const value = oldKey in prev ? prev[oldKey] : defaultValue;\n\n // Remove old key and add new key\n delete result[oldKey];\n result[newKey] = value;\n\n return result as TNext;\n },\n };\n}\n\n/**\n * Creates a migration that adds a new field with a default value.\n *\n * @example\n * ```typescript\n * const addFieldMigration = createAddFieldMigration(4, 'stretch', false);\n * ```\n */\nexport function createAddFieldMigration<TNext>(version: number, key: string, defaultValue: unknown): VersionMigration {\n return {\n version,\n migrate: (state) =>\n ({\n ...(state as object),\n [key]: defaultValue,\n }) as TNext,\n };\n}\n\n/**\n * Creates a migration that removes a field.\n *\n * @example\n * ```typescript\n * const removeFieldMigration = createRemoveFieldMigration(5, 'legacyOption');\n * ```\n */\nexport function createRemoveFieldMigration<TNext>(version: number, key: string): VersionMigration {\n return {\n version,\n migrate: (state) => {\n const result = { ...(state as object) } as Record<string, unknown>;\n delete result[key];\n return result as TNext;\n },\n };\n}\n\n/**\n * Creates a migration that transforms a field's value.\n *\n * @example\n * ```typescript\n * const transformMigration = createTransformMigration(\n * 6,\n * 'fontSize',\n * (value) => typeof value === 'string' ? parseInt(value, 10) : value,\n * 16\n * );\n * ```\n */\nexport function createTransformMigration<TNext>(\n version: number,\n key: string,\n transform: (value: unknown) => unknown,\n defaultValue: unknown\n): VersionMigration {\n return {\n version,\n migrate: (state) => {\n const prev = state as Record<string, unknown>;\n const oldValue = key in prev ? prev[key] : undefined;\n const newValue = oldValue !== undefined ? transform(oldValue) : defaultValue;\n\n return {\n ...prev,\n [key]: newValue,\n } as TNext;\n },\n };\n}\n\n/**\n * Validates that migrations are in correct sequential order.\n *\n * @throws If migrations have duplicate versions\n */\nexport function validateMigrations(migrations: VersionMigration[]): void {\n const versions = migrations.map((m) => m.version).sort((a, b) => a - b);\n\n // Check for duplicates\n const uniqueVersions = new Set(versions);\n if (uniqueVersions.size !== versions.length) {\n throw new Error('[SettingsVersion] Duplicate migration versions detected');\n }\n\n // Check that versions are positive integers\n for (const version of versions) {\n if (!Number.isInteger(version) || version < 1) {\n throw new Error(`[SettingsVersion] Invalid migration version: ${version}. Must be a positive integer.`);\n }\n }\n}\n\n/**\n * Gets migration info for debugging.\n */\nexport function getMigrationInfo(migrations: VersionMigration[]): Array<{ version: number }> {\n return migrations.map((m) => ({ version: m.version })).sort((a, b) => a.version - b.version);\n}\n"]}
|