@almadar/ui 2.15.7 → 2.15.10

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 (127) hide show
  1. package/dist/components/atoms/ContentSection.d.ts +16 -0
  2. package/dist/components/atoms/SectionHeader.d.ts +14 -0
  3. package/dist/components/atoms/StatCard.d.ts +13 -0
  4. package/dist/components/atoms/index.d.ts +3 -0
  5. package/dist/components/atoms/svg/SvgBranch.d.ts +12 -0
  6. package/dist/components/atoms/svg/SvgConnection.d.ts +13 -0
  7. package/dist/components/atoms/svg/SvgFlow.d.ts +10 -0
  8. package/dist/components/atoms/svg/SvgGrid.d.ts +14 -0
  9. package/dist/components/atoms/svg/SvgLobe.d.ts +13 -0
  10. package/dist/components/atoms/svg/SvgMesh.d.ts +12 -0
  11. package/dist/components/atoms/svg/SvgMorph.d.ts +11 -0
  12. package/dist/components/atoms/svg/SvgNode.d.ts +12 -0
  13. package/dist/components/atoms/svg/SvgPulse.d.ts +12 -0
  14. package/dist/components/atoms/svg/SvgRing.d.ts +13 -0
  15. package/dist/components/atoms/svg/SvgShield.d.ts +11 -0
  16. package/dist/components/atoms/svg/SvgStack.d.ts +13 -0
  17. package/dist/components/atoms/svg/index.d.ts +12 -0
  18. package/dist/{chunk-K43H3ZDY.js → components/index.cjs} +24780 -16651
  19. package/dist/components/index.js +37757 -889
  20. package/dist/components/molecules/AnimatedCounter.d.ts +18 -0
  21. package/dist/components/molecules/ArticleSection.d.ts +18 -0
  22. package/dist/components/molecules/CTABanner.d.ts +31 -0
  23. package/dist/components/molecules/CaseStudyCard.d.ts +24 -0
  24. package/dist/components/molecules/CodeExample.d.ts +23 -0
  25. package/dist/components/molecules/CommunityLinks.d.ts +25 -0
  26. package/dist/components/molecules/DocBreadcrumb.d.ts +20 -0
  27. package/dist/components/molecules/DocCodeBlock.d.ts +13 -0
  28. package/dist/components/molecules/DocPagination.d.ts +14 -0
  29. package/dist/components/molecules/DocSearch.d.ts +15 -0
  30. package/dist/components/molecules/DocSidebar.d.ts +24 -0
  31. package/dist/components/molecules/DocTOC.d.ts +24 -0
  32. package/dist/components/molecules/FeatureCard.d.ts +26 -0
  33. package/dist/components/molecules/FeatureGrid.d.ts +19 -0
  34. package/dist/components/molecules/GradientDivider.d.ts +14 -0
  35. package/dist/components/molecules/HeroSection.d.ts +36 -0
  36. package/dist/components/molecules/InstallBox.d.ts +16 -0
  37. package/dist/components/molecules/MarketingFooter.d.ts +27 -0
  38. package/dist/components/molecules/PricingCard.d.ts +21 -0
  39. package/dist/components/molecules/PricingGrid.d.ts +13 -0
  40. package/dist/components/molecules/PullQuote.d.ts +14 -0
  41. package/dist/components/molecules/ServiceCatalog.d.ts +19 -0
  42. package/dist/components/molecules/ShowcaseCard.d.ts +20 -0
  43. package/dist/components/molecules/SocialProof.d.ts +25 -0
  44. package/dist/components/molecules/SplitSection.d.ts +21 -0
  45. package/dist/components/molecules/StatsGrid.d.ts +17 -0
  46. package/dist/components/molecules/StepFlow.d.ts +20 -0
  47. package/dist/components/molecules/TagCloud.d.ts +18 -0
  48. package/dist/components/molecules/TeamCard.d.ts +18 -0
  49. package/dist/components/molecules/index.d.ts +19 -0
  50. package/dist/components/molecules/svg/AIGenerates.d.ts +7 -0
  51. package/dist/components/molecules/svg/ClosedCircuit.d.ts +7 -0
  52. package/dist/components/molecules/svg/CommunityOwnership.d.ts +7 -0
  53. package/dist/components/molecules/svg/CompileAnywhere.d.ts +7 -0
  54. package/dist/components/molecules/svg/ComposableModels.d.ts +7 -0
  55. package/dist/components/molecules/svg/DescribeProveDeploy.d.ts +7 -0
  56. package/dist/components/molecules/svg/DomainGrid.d.ts +7 -0
  57. package/dist/components/molecules/svg/EventBus.d.ts +7 -0
  58. package/dist/components/molecules/svg/OrbitalUnit.d.ts +7 -0
  59. package/dist/components/molecules/svg/PlanVerifyRemember.d.ts +7 -0
  60. package/dist/components/molecules/svg/ProveCorrect.d.ts +7 -0
  61. package/dist/components/molecules/svg/ServiceLayers.d.ts +7 -0
  62. package/dist/components/molecules/svg/SharedReality.d.ts +7 -0
  63. package/dist/components/molecules/svg/StandardLibrary.d.ts +7 -0
  64. package/dist/components/molecules/svg/StateMachine.d.ts +7 -0
  65. package/dist/components/molecules/svg/WorldModel.d.ts +7 -0
  66. package/dist/components/molecules/svg/index.d.ts +16 -0
  67. package/dist/components/organisms/CaseStudyOrganism.d.ts +19 -0
  68. package/dist/components/organisms/FeatureGridOrganism.d.ts +20 -0
  69. package/dist/components/organisms/HeroOrganism.d.ts +18 -0
  70. package/dist/components/organisms/PricingOrganism.d.ts +19 -0
  71. package/dist/components/organisms/ShowcaseOrganism.d.ts +20 -0
  72. package/dist/components/organisms/StatsOrganism.d.ts +17 -0
  73. package/dist/components/organisms/StepFlowOrganism.d.ts +20 -0
  74. package/dist/components/organisms/TeamOrganism.d.ts +18 -0
  75. package/dist/components/organisms/UISlotRenderer.d.ts +1 -0
  76. package/dist/components/organisms/game/three/index.cjs +2525 -0
  77. package/dist/components/organisms/game/three/index.js +1795 -50
  78. package/dist/components/organisms/index.d.ts +9 -0
  79. package/dist/components/organisms/marketing-types.d.ts +87 -0
  80. package/dist/components/templates/AboutPageTemplate.d.ts +26 -0
  81. package/dist/components/templates/DashboardLayout.d.ts +2 -1
  82. package/dist/components/templates/FeatureDetailPageTemplate.d.ts +27 -0
  83. package/dist/components/templates/LandingPageTemplate.d.ts +31 -0
  84. package/dist/components/templates/PricingPageTemplate.d.ts +26 -0
  85. package/dist/components/templates/index.d.ts +4 -0
  86. package/dist/context/index.cjs +550 -0
  87. package/dist/context/index.js +420 -6
  88. package/dist/docs/index.cjs +4015 -0
  89. package/dist/docs/index.d.cts +412 -0
  90. package/dist/docs/index.d.ts +29 -0
  91. package/dist/docs/index.js +3977 -0
  92. package/dist/hooks/index.cjs +2606 -0
  93. package/dist/hooks/index.js +2535 -8
  94. package/dist/illustrations/index.cjs +3004 -0
  95. package/dist/illustrations/index.d.cts +261 -0
  96. package/dist/illustrations/index.d.ts +35 -0
  97. package/dist/illustrations/index.js +2971 -0
  98. package/dist/{chunk-XL7WB2O5.js → lib/index.cjs} +454 -274
  99. package/dist/lib/index.js +1407 -3
  100. package/dist/locales/index.cjs +340 -0
  101. package/dist/locales/index.js +105 -2
  102. package/dist/marketing/index.cjs +4683 -0
  103. package/dist/marketing/index.d.cts +831 -0
  104. package/dist/marketing/index.d.ts +62 -0
  105. package/dist/marketing/index.js +4626 -0
  106. package/dist/providers/index.cjs +4811 -0
  107. package/dist/providers/index.js +4765 -11
  108. package/dist/{chunk-K2D5D3WK.js → renderer/index.cjs} +101 -42
  109. package/dist/renderer/index.js +1036 -2
  110. package/dist/runtime/index.cjs +4400 -0
  111. package/dist/runtime/index.js +3615 -19
  112. package/dist/{chunk-N7MVUW4R.js → stores/index.cjs} +24 -1
  113. package/dist/stores/index.js +194 -2
  114. package/dist/tsup.config.d.ts +2 -1
  115. package/package.json +27 -12
  116. package/tailwind-preset.cjs +27 -2
  117. package/themes/index.css +22 -20
  118. package/dist/chunk-3HJHHULT.js +0 -93
  119. package/dist/chunk-3JGAROCW.js +0 -149
  120. package/dist/chunk-4N3BAPDB.js +0 -1667
  121. package/dist/chunk-CDIOHSKG.js +0 -661
  122. package/dist/chunk-DKQN5FVU.js +0 -279
  123. package/dist/chunk-GF6RQBO7.js +0 -375
  124. package/dist/chunk-PKBMQBKP.js +0 -5
  125. package/dist/chunk-QIABKRCN.js +0 -107
  126. package/dist/chunk-SD3KVCY6.js +0 -1465
  127. package/dist/chunk-YXZM3WCF.js +0 -222
@@ -0,0 +1,550 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ var DEFAULT_SLOTS = {
7
+ main: null,
8
+ sidebar: null,
9
+ modal: null,
10
+ drawer: null,
11
+ overlay: null,
12
+ center: null,
13
+ toast: null,
14
+ "hud-top": null,
15
+ "hud-bottom": null,
16
+ "hud-left": null,
17
+ "hud-right": null,
18
+ floating: null
19
+ };
20
+ var idCounter = 0;
21
+ function generateId() {
22
+ return `slot-content-${++idCounter}-${Date.now()}`;
23
+ }
24
+ function useUISlotManager() {
25
+ const [slots, setSlots] = react.useState(DEFAULT_SLOTS);
26
+ const subscribersRef = react.useRef(/* @__PURE__ */ new Set());
27
+ const timersRef = react.useRef(/* @__PURE__ */ new Map());
28
+ react.useEffect(() => {
29
+ return () => {
30
+ timersRef.current.forEach((timer) => clearTimeout(timer));
31
+ timersRef.current.clear();
32
+ };
33
+ }, []);
34
+ const notifySubscribers = react.useCallback((slot, content) => {
35
+ subscribersRef.current.forEach((callback) => {
36
+ try {
37
+ callback(slot, content);
38
+ } catch (error) {
39
+ console.error("[UISlots] Subscriber error:", error);
40
+ }
41
+ });
42
+ }, []);
43
+ const render = react.useCallback((config) => {
44
+ const id = generateId();
45
+ const content = {
46
+ id,
47
+ pattern: config.pattern,
48
+ props: config.props ?? {},
49
+ priority: config.priority ?? 0,
50
+ animation: config.animation ?? "fade",
51
+ onDismiss: config.onDismiss,
52
+ sourceTrait: config.sourceTrait
53
+ };
54
+ if (config.autoDismissMs && config.autoDismissMs > 0) {
55
+ content.autoDismissAt = Date.now() + config.autoDismissMs;
56
+ const timer = setTimeout(() => {
57
+ setSlots((prev) => {
58
+ if (prev[config.target]?.id === id) {
59
+ content.onDismiss?.();
60
+ notifySubscribers(config.target, null);
61
+ return { ...prev, [config.target]: null };
62
+ }
63
+ return prev;
64
+ });
65
+ timersRef.current.delete(id);
66
+ }, config.autoDismissMs);
67
+ timersRef.current.set(id, timer);
68
+ }
69
+ setSlots((prev) => {
70
+ const existing = prev[config.target];
71
+ if (existing && existing.priority > content.priority) {
72
+ console.warn(
73
+ `[UISlots] Slot "${config.target}" already has higher priority content (${existing.priority} > ${content.priority})`
74
+ );
75
+ return prev;
76
+ }
77
+ notifySubscribers(config.target, content);
78
+ return { ...prev, [config.target]: content };
79
+ });
80
+ return id;
81
+ }, [notifySubscribers]);
82
+ const clear = react.useCallback((slot) => {
83
+ setSlots((prev) => {
84
+ const content = prev[slot];
85
+ if (content) {
86
+ const timer = timersRef.current.get(content.id);
87
+ if (timer) {
88
+ clearTimeout(timer);
89
+ timersRef.current.delete(content.id);
90
+ }
91
+ content.onDismiss?.();
92
+ notifySubscribers(slot, null);
93
+ }
94
+ return { ...prev, [slot]: null };
95
+ });
96
+ }, [notifySubscribers]);
97
+ const clearById = react.useCallback((id) => {
98
+ setSlots((prev) => {
99
+ const entry = Object.entries(prev).find(([, content]) => content?.id === id);
100
+ if (entry) {
101
+ const [slot, content] = entry;
102
+ const timer = timersRef.current.get(id);
103
+ if (timer) {
104
+ clearTimeout(timer);
105
+ timersRef.current.delete(id);
106
+ }
107
+ content.onDismiss?.();
108
+ notifySubscribers(slot, null);
109
+ return { ...prev, [slot]: null };
110
+ }
111
+ return prev;
112
+ });
113
+ }, [notifySubscribers]);
114
+ const clearAll = react.useCallback(() => {
115
+ timersRef.current.forEach((timer) => clearTimeout(timer));
116
+ timersRef.current.clear();
117
+ setSlots((prev) => {
118
+ Object.entries(prev).forEach(([slot, content]) => {
119
+ if (content) {
120
+ content.onDismiss?.();
121
+ notifySubscribers(slot, null);
122
+ }
123
+ });
124
+ return DEFAULT_SLOTS;
125
+ });
126
+ }, [notifySubscribers]);
127
+ const subscribe = react.useCallback((callback) => {
128
+ subscribersRef.current.add(callback);
129
+ return () => {
130
+ subscribersRef.current.delete(callback);
131
+ };
132
+ }, []);
133
+ const hasContent = react.useCallback((slot) => {
134
+ return slots[slot] !== null;
135
+ }, [slots]);
136
+ const getContent = react.useCallback((slot) => {
137
+ return slots[slot];
138
+ }, [slots]);
139
+ return {
140
+ slots,
141
+ render,
142
+ clear,
143
+ clearById,
144
+ clearAll,
145
+ subscribe,
146
+ hasContent,
147
+ getContent
148
+ };
149
+ }
150
+ var UISlotContext = react.createContext(null);
151
+ function UISlotProvider({ children }) {
152
+ const slotManager = useUISlotManager();
153
+ const contextValue = react.useMemo(() => slotManager, [slotManager]);
154
+ return /* @__PURE__ */ jsxRuntime.jsx(UISlotContext.Provider, { value: contextValue, children });
155
+ }
156
+ function useUISlots() {
157
+ const context = react.useContext(UISlotContext);
158
+ if (!context) {
159
+ throw new Error(
160
+ "useUISlots must be used within a UISlotProvider. Make sure your component tree is wrapped with <UISlotProvider>."
161
+ );
162
+ }
163
+ return context;
164
+ }
165
+ function useSlotContent(slot) {
166
+ const { getContent } = useUISlots();
167
+ return getContent(slot);
168
+ }
169
+ function useSlotHasContent(slot) {
170
+ const { hasContent } = useUISlots();
171
+ return hasContent(slot);
172
+ }
173
+ var BUILT_IN_THEMES = [
174
+ {
175
+ name: "wireframe",
176
+ displayName: "Wireframe",
177
+ hasLightMode: true,
178
+ hasDarkMode: true
179
+ },
180
+ {
181
+ name: "minimalist",
182
+ displayName: "Minimalist",
183
+ hasLightMode: true,
184
+ hasDarkMode: true
185
+ },
186
+ {
187
+ name: "almadar",
188
+ displayName: "Almadar",
189
+ hasLightMode: true,
190
+ hasDarkMode: true
191
+ },
192
+ {
193
+ name: "trait-wars",
194
+ displayName: "Trait Wars",
195
+ hasLightMode: false,
196
+ hasDarkMode: true
197
+ },
198
+ // Extended themes
199
+ {
200
+ name: "ocean",
201
+ displayName: "Ocean",
202
+ hasLightMode: true,
203
+ hasDarkMode: true
204
+ },
205
+ {
206
+ name: "forest",
207
+ displayName: "Forest",
208
+ hasLightMode: true,
209
+ hasDarkMode: true
210
+ },
211
+ {
212
+ name: "sunset",
213
+ displayName: "Sunset",
214
+ hasLightMode: true,
215
+ hasDarkMode: true
216
+ },
217
+ {
218
+ name: "lavender",
219
+ displayName: "Lavender",
220
+ hasLightMode: true,
221
+ hasDarkMode: true
222
+ },
223
+ {
224
+ name: "rose",
225
+ displayName: "Rose",
226
+ hasLightMode: true,
227
+ hasDarkMode: true
228
+ },
229
+ {
230
+ name: "slate",
231
+ displayName: "Slate",
232
+ hasLightMode: true,
233
+ hasDarkMode: true
234
+ },
235
+ {
236
+ name: "ember",
237
+ displayName: "Ember",
238
+ hasLightMode: true,
239
+ hasDarkMode: true
240
+ },
241
+ {
242
+ name: "midnight",
243
+ displayName: "Midnight",
244
+ hasLightMode: true,
245
+ hasDarkMode: true
246
+ },
247
+ {
248
+ name: "sand",
249
+ displayName: "Sand",
250
+ hasLightMode: true,
251
+ hasDarkMode: true
252
+ },
253
+ {
254
+ name: "neon",
255
+ displayName: "Neon",
256
+ hasLightMode: true,
257
+ hasDarkMode: true
258
+ },
259
+ {
260
+ name: "arctic",
261
+ displayName: "Arctic",
262
+ hasLightMode: true,
263
+ hasDarkMode: true
264
+ },
265
+ {
266
+ name: "copper",
267
+ displayName: "Copper",
268
+ hasLightMode: true,
269
+ hasDarkMode: true
270
+ }
271
+ ];
272
+ var ThemeContext = react.createContext(void 0);
273
+ var THEME_STORAGE_KEY = "theme";
274
+ var MODE_STORAGE_KEY = "theme-mode";
275
+ function getSystemMode() {
276
+ if (typeof window === "undefined") return "light";
277
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
278
+ }
279
+ function resolveMode(mode) {
280
+ if (mode === "system") {
281
+ return getSystemMode();
282
+ }
283
+ return mode;
284
+ }
285
+ var ThemeProvider = ({
286
+ children,
287
+ themes = [],
288
+ defaultTheme = "wireframe",
289
+ defaultMode = "system",
290
+ targetRef
291
+ }) => {
292
+ const availableThemes = react.useMemo(() => {
293
+ const themeMap = /* @__PURE__ */ new Map();
294
+ BUILT_IN_THEMES.forEach((t) => themeMap.set(t.name, t));
295
+ themes.forEach((t) => themeMap.set(t.name, t));
296
+ return Array.from(themeMap.values());
297
+ }, [themes]);
298
+ const isScoped = !!targetRef;
299
+ const [theme, setThemeState] = react.useState(() => {
300
+ if (isScoped || typeof window === "undefined") return defaultTheme;
301
+ const stored = localStorage.getItem(THEME_STORAGE_KEY);
302
+ const validThemes = [
303
+ ...BUILT_IN_THEMES.map((t) => t.name),
304
+ ...themes.map((t) => t.name)
305
+ ];
306
+ if (stored && validThemes.includes(stored)) {
307
+ return stored;
308
+ }
309
+ return defaultTheme;
310
+ });
311
+ const [mode, setModeState] = react.useState(() => {
312
+ if (isScoped || typeof window === "undefined") return defaultMode;
313
+ const stored = localStorage.getItem(MODE_STORAGE_KEY);
314
+ if (stored === "light" || stored === "dark" || stored === "system") {
315
+ return stored;
316
+ }
317
+ return defaultMode;
318
+ });
319
+ const [resolvedMode, setResolvedMode] = react.useState(
320
+ () => resolveMode(mode)
321
+ );
322
+ const appliedTheme = react.useMemo(
323
+ () => `${theme}-${resolvedMode}`,
324
+ [theme, resolvedMode]
325
+ );
326
+ react.useEffect(() => {
327
+ const updateResolved = () => {
328
+ setResolvedMode(resolveMode(mode));
329
+ };
330
+ updateResolved();
331
+ if (mode === "system") {
332
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
333
+ const handleChange = () => updateResolved();
334
+ mediaQuery.addEventListener("change", handleChange);
335
+ return () => mediaQuery.removeEventListener("change", handleChange);
336
+ }
337
+ return void 0;
338
+ }, [mode]);
339
+ react.useEffect(() => {
340
+ if (isScoped) {
341
+ if (targetRef?.current) {
342
+ targetRef.current.setAttribute("data-theme", appliedTheme);
343
+ targetRef.current.classList.remove("light", "dark");
344
+ targetRef.current.classList.add(resolvedMode);
345
+ }
346
+ return;
347
+ }
348
+ const root = document.documentElement;
349
+ root.setAttribute("data-theme", appliedTheme);
350
+ root.classList.remove("light", "dark");
351
+ root.classList.add(resolvedMode);
352
+ }, [appliedTheme, resolvedMode, targetRef, isScoped]);
353
+ const setTheme = react.useCallback(
354
+ (newTheme) => {
355
+ const validTheme = availableThemes.find((t) => t.name === newTheme);
356
+ if (validTheme) {
357
+ setThemeState(newTheme);
358
+ if (!isScoped && typeof window !== "undefined") {
359
+ localStorage.setItem(THEME_STORAGE_KEY, newTheme);
360
+ }
361
+ } else {
362
+ console.warn(
363
+ `Theme "${newTheme}" not found. Available: ${availableThemes.map((t) => t.name).join(", ")}`
364
+ );
365
+ }
366
+ },
367
+ [availableThemes]
368
+ );
369
+ const setMode = react.useCallback((newMode) => {
370
+ setModeState(newMode);
371
+ if (!isScoped && typeof window !== "undefined") {
372
+ localStorage.setItem(MODE_STORAGE_KEY, newMode);
373
+ }
374
+ }, []);
375
+ const toggleMode = react.useCallback(() => {
376
+ const newMode = resolvedMode === "dark" ? "light" : "dark";
377
+ setMode(newMode);
378
+ }, [resolvedMode, setMode]);
379
+ const contextValue = react.useMemo(
380
+ () => ({
381
+ theme,
382
+ mode,
383
+ resolvedMode,
384
+ setTheme,
385
+ setMode,
386
+ toggleMode,
387
+ availableThemes,
388
+ appliedTheme
389
+ }),
390
+ [
391
+ theme,
392
+ mode,
393
+ resolvedMode,
394
+ setTheme,
395
+ setMode,
396
+ toggleMode,
397
+ availableThemes,
398
+ appliedTheme
399
+ ]
400
+ );
401
+ return /* @__PURE__ */ jsxRuntime.jsx(ThemeContext.Provider, { value: contextValue, children });
402
+ };
403
+ function useTheme() {
404
+ const context = react.useContext(ThemeContext);
405
+ if (context === void 0) {
406
+ return {
407
+ theme: "wireframe",
408
+ mode: "light",
409
+ resolvedMode: "light",
410
+ setTheme: () => {
411
+ },
412
+ setMode: () => {
413
+ },
414
+ toggleMode: () => {
415
+ },
416
+ availableThemes: BUILT_IN_THEMES,
417
+ appliedTheme: "wireframe-light"
418
+ };
419
+ }
420
+ return context;
421
+ }
422
+ var ThemeContext_default = ThemeContext;
423
+
424
+ // context/DesignThemeContext.tsx
425
+ var DesignThemeProvider = ThemeProvider;
426
+ function useDesignTheme() {
427
+ const { theme, setTheme, availableThemes } = useTheme();
428
+ return {
429
+ designTheme: theme,
430
+ setDesignTheme: setTheme,
431
+ availableThemes: availableThemes.map((t) => t.name)
432
+ };
433
+ }
434
+ var ANONYMOUS_USER = {
435
+ id: "anonymous",
436
+ role: "anonymous",
437
+ permissions: []
438
+ };
439
+ var UserContext = react.createContext(null);
440
+ function UserProvider({
441
+ user = null,
442
+ children
443
+ }) {
444
+ const hasRole = react.useCallback(
445
+ (role) => {
446
+ if (!user) return role === "anonymous";
447
+ return user.role === role;
448
+ },
449
+ [user]
450
+ );
451
+ const hasPermission = react.useCallback(
452
+ (permission) => {
453
+ if (!user) return false;
454
+ return user.permissions?.includes(permission) ?? false;
455
+ },
456
+ [user]
457
+ );
458
+ const hasAnyRole = react.useCallback(
459
+ (roles) => {
460
+ if (!user) return roles.includes("anonymous");
461
+ return user.role ? roles.includes(user.role) : false;
462
+ },
463
+ [user]
464
+ );
465
+ const hasAllPermissions = react.useCallback(
466
+ (permissions) => {
467
+ if (!user || !user.permissions) return false;
468
+ return permissions.every((p) => user.permissions?.includes(p));
469
+ },
470
+ [user]
471
+ );
472
+ const getUserField = react.useCallback(
473
+ (path) => {
474
+ const userData = user ?? ANONYMOUS_USER;
475
+ const parts = path.split(".");
476
+ let value = userData;
477
+ for (const segment of parts) {
478
+ if (value === null || value === void 0) {
479
+ return void 0;
480
+ }
481
+ if (typeof value === "object") {
482
+ value = value[segment];
483
+ } else {
484
+ return void 0;
485
+ }
486
+ }
487
+ return value;
488
+ },
489
+ [user]
490
+ );
491
+ const contextValue = react.useMemo(
492
+ () => ({
493
+ user,
494
+ isLoggedIn: user !== null,
495
+ hasRole,
496
+ hasPermission,
497
+ hasAnyRole,
498
+ hasAllPermissions,
499
+ getUserField
500
+ }),
501
+ [user, hasRole, hasPermission, hasAnyRole, hasAllPermissions, getUserField]
502
+ );
503
+ return /* @__PURE__ */ jsxRuntime.jsx(UserContext.Provider, { value: contextValue, children });
504
+ }
505
+ function useUser() {
506
+ const context = react.useContext(UserContext);
507
+ if (!context) {
508
+ return {
509
+ user: null,
510
+ isLoggedIn: false,
511
+ hasRole: (role) => role === "anonymous",
512
+ hasPermission: () => false,
513
+ hasAnyRole: (roles) => roles.includes("anonymous"),
514
+ hasAllPermissions: () => false,
515
+ getUserField: () => void 0
516
+ };
517
+ }
518
+ return context;
519
+ }
520
+ function useHasRole(role) {
521
+ const { hasRole } = useUser();
522
+ return hasRole(role);
523
+ }
524
+ function useHasPermission(permission) {
525
+ const { hasPermission } = useUser();
526
+ return hasPermission(permission);
527
+ }
528
+ function useUserForEvaluation() {
529
+ const { user, isLoggedIn } = useUser();
530
+ return isLoggedIn && user ? user : void 0;
531
+ }
532
+
533
+ exports.ANONYMOUS_USER = ANONYMOUS_USER;
534
+ exports.BUILT_IN_THEMES = BUILT_IN_THEMES;
535
+ exports.DesignThemeProvider = DesignThemeProvider;
536
+ exports.ThemeContext = ThemeContext_default;
537
+ exports.ThemeProvider = ThemeProvider;
538
+ exports.UISlotContext = UISlotContext;
539
+ exports.UISlotProvider = UISlotProvider;
540
+ exports.UserContext = UserContext;
541
+ exports.UserProvider = UserProvider;
542
+ exports.useDesignTheme = useDesignTheme;
543
+ exports.useHasPermission = useHasPermission;
544
+ exports.useHasRole = useHasRole;
545
+ exports.useSlotContent = useSlotContent;
546
+ exports.useSlotHasContent = useSlotHasContent;
547
+ exports.useTheme = useTheme;
548
+ exports.useUISlots = useUISlots;
549
+ exports.useUser = useUser;
550
+ exports.useUserForEvaluation = useUserForEvaluation;