@donotdev/ui 0.0.2 → 0.0.3

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 (104) hide show
  1. package/dist/components/auth/AuthMenu.d.ts.map +1 -1
  2. package/dist/components/auth/AuthMenu.js +15 -28
  3. package/dist/components/common/FeatureCard.js +1 -1
  4. package/dist/components/cookie-consent/CookieConsent.d.ts.map +1 -1
  5. package/dist/components/cookie-consent/CookieConsent.js +2 -41
  6. package/dist/components/cookie-consent/index.d.ts +0 -1
  7. package/dist/components/cookie-consent/index.d.ts.map +1 -1
  8. package/dist/components/cookie-consent/index.js +1 -1
  9. package/dist/components/layout/components/DropdownNavigation.d.ts.map +1 -1
  10. package/dist/components/layout/components/header/ThemeToggle.d.ts +1 -1
  11. package/dist/components/layout/components/header/ThemeToggle.d.ts.map +1 -1
  12. package/dist/components/layout/components/header/ThemeToggle.js +5 -4
  13. package/dist/dndev.css +137 -120
  14. package/dist/index.js +4 -4
  15. package/dist/internal/devtools/DebugTools.d.ts.map +1 -1
  16. package/dist/internal/devtools/DebugTools.js +8 -4
  17. package/dist/internal/devtools/components/ConfigTab.d.ts.map +1 -1
  18. package/dist/internal/devtools/components/ConfigTab.js +31 -133
  19. package/dist/internal/devtools/components/DebugDialog.d.ts.map +1 -1
  20. package/dist/internal/devtools/components/DebugDialog.js +11 -520
  21. package/dist/internal/devtools/components/DesignTab.d.ts +2 -0
  22. package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -0
  23. package/dist/internal/devtools/components/DesignTab.js +220 -0
  24. package/dist/internal/devtools/components/StoresTab.d.ts.map +1 -1
  25. package/dist/internal/devtools/components/StoresTab.js +54 -102
  26. package/dist/internal/devtools/components/index.d.ts +1 -6
  27. package/dist/internal/devtools/components/index.d.ts.map +1 -1
  28. package/dist/internal/devtools/components/index.js +1 -6
  29. package/dist/internal/devtools/utils/index.d.ts +0 -1
  30. package/dist/internal/devtools/utils/index.d.ts.map +1 -1
  31. package/dist/internal/devtools/utils/index.js +0 -1
  32. package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
  33. package/dist/internal/initializers/BaseStoresInitializer.js +25 -58
  34. package/dist/internal/layout/DnDevLayout.js +3 -3
  35. package/dist/internal/layout/components/footer/FooterBranding.d.ts.map +1 -1
  36. package/dist/internal/layout/components/footer/FooterBranding.js +3 -1
  37. package/dist/routing/AuthGuard.d.ts +14 -10
  38. package/dist/routing/AuthGuard.d.ts.map +1 -1
  39. package/dist/routing/AuthGuard.js +25 -22
  40. package/dist/routing/Link.d.ts +2 -2
  41. package/dist/routing/Link.js +2 -2
  42. package/dist/routing/hooks/hooks.next.js +1 -1
  43. package/dist/routing/hooks/hooks.vite.js +1 -1
  44. package/dist/routing/hooks/useRedirectGuard.next.d.ts +2 -36
  45. package/dist/routing/hooks/useRedirectGuard.next.d.ts.map +1 -1
  46. package/dist/routing/hooks/useRedirectGuard.next.js +14 -55
  47. package/dist/routing/hooks/useRedirectGuard.vite.d.ts +2 -36
  48. package/dist/routing/hooks/useRedirectGuard.vite.d.ts.map +1 -1
  49. package/dist/routing/hooks/useRedirectGuard.vite.js +14 -55
  50. package/dist/routing/index.d.ts +0 -1
  51. package/dist/routing/index.d.ts.map +1 -1
  52. package/dist/routing/index.js +1 -1
  53. package/dist/styles/index.css +137 -120
  54. package/dist/utils/assetResolver.d.ts +5 -5
  55. package/dist/utils/assetResolver.js +4 -4
  56. package/dist/utils/useAuthSafe.d.ts +25 -12
  57. package/dist/utils/useAuthSafe.d.ts.map +1 -1
  58. package/dist/utils/useAuthSafe.js +3 -1
  59. package/dist/utils/useAuthVisibility.d.ts +3 -3
  60. package/dist/utils/useAuthVisibility.d.ts.map +1 -1
  61. package/dist/utils/useAuthVisibility.js +25 -21
  62. package/dist/utils/useBillingVisibility.d.ts +2 -2
  63. package/dist/utils/useBillingVisibility.d.ts.map +1 -1
  64. package/dist/utils/useBillingVisibility.js +12 -13
  65. package/dist/utils/useCrudSafe.d.ts +1 -1
  66. package/dist/utils/useCrudSafe.d.ts.map +1 -1
  67. package/dist/utils/useCrudSafe.js +26 -13
  68. package/dist/utils/useOAuthSafe.d.ts +25 -12
  69. package/dist/utils/useOAuthSafe.d.ts.map +1 -1
  70. package/dist/utils/useStripeBillingSafe.d.ts +30 -18
  71. package/dist/utils/useStripeBillingSafe.d.ts.map +1 -1
  72. package/dist/utils/useStripeBillingSafe.js +5 -6
  73. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  74. package/dist/vite-routing/AppRoutes.js +5 -5
  75. package/dist/vite-routing/RootLayout.d.ts.map +1 -1
  76. package/dist/vite-routing/RootLayout.js +34 -7
  77. package/package.json +9 -9
  78. package/dist/internal/devtools/components/AuthTab.d.ts +0 -2
  79. package/dist/internal/devtools/components/AuthTab.d.ts.map +0 -1
  80. package/dist/internal/devtools/components/AuthTab.js +0 -98
  81. package/dist/internal/devtools/components/ColorRatioTab.d.ts +0 -2
  82. package/dist/internal/devtools/components/ColorRatioTab.d.ts.map +0 -1
  83. package/dist/internal/devtools/components/ColorRatioTab.js +0 -322
  84. package/dist/internal/devtools/components/DebugToggle.d.ts +0 -2
  85. package/dist/internal/devtools/components/DebugToggle.d.ts.map +0 -1
  86. package/dist/internal/devtools/components/DebugToggle.js +0 -57
  87. package/dist/internal/devtools/components/EnvironmentTab.d.ts +0 -2
  88. package/dist/internal/devtools/components/EnvironmentTab.d.ts.map +0 -1
  89. package/dist/internal/devtools/components/EnvironmentTab.js +0 -26
  90. package/dist/internal/devtools/components/I18nTab.d.ts +0 -2
  91. package/dist/internal/devtools/components/I18nTab.d.ts.map +0 -1
  92. package/dist/internal/devtools/components/I18nTab.js +0 -76
  93. package/dist/internal/devtools/components/OAuthGuideButton.d.ts +0 -10
  94. package/dist/internal/devtools/components/OAuthGuideButton.d.ts.map +0 -1
  95. package/dist/internal/devtools/components/OAuthGuideButton.js +0 -71
  96. package/dist/internal/devtools/components/StripeDebugTab.d.ts +0 -2
  97. package/dist/internal/devtools/components/StripeDebugTab.d.ts.map +0 -1
  98. package/dist/internal/devtools/components/StripeDebugTab.js +0 -175
  99. package/dist/internal/devtools/components/ThemesTab.d.ts +0 -2
  100. package/dist/internal/devtools/components/ThemesTab.d.ts.map +0 -1
  101. package/dist/internal/devtools/components/ThemesTab.js +0 -77
  102. package/dist/internal/devtools/utils/spacingAnalyzer.d.ts +0 -15
  103. package/dist/internal/devtools/utils/spacingAnalyzer.d.ts.map +0 -1
  104. package/dist/internal/devtools/utils/spacingAnalyzer.js +0 -88
@@ -3,18 +3,31 @@
3
3
  * @description Provides auth functionality when @donotdev/auth is installed,
4
4
  * gracefully degrades to no-op when not installed.
5
5
  *
6
- * **How it works:**
7
- * 1. Import @donotdev/auth (Vite aliases to empty module if not installed)
8
- * 2. Check if useAuth export exists
9
- * 3. If exists use real hook | If not → use stub
10
- *
11
- * **Why this pattern:**
12
- * - Vite aliases missing packages to empty modules at build time
13
- * - Decision is made ONCE at import time, never changes
14
- * - No conditional hook calls = no Rules of Hooks violations
15
- * - Real hook handles all runtime state (Firebase, consent) internally
16
- *
17
- * @version 0.0.1
6
+ * ## CRITICAL: DO NOT USE DYNAMIC IMPORTS
7
+ *
8
+ * This file MUST use sync `import * as authModule from '@donotdev/auth'`
9
+ * at module level. DO NOT refactor to use async `import('@donotdev/auth').then(...)`.
10
+ *
11
+ * ### Why sync import is required:
12
+ *
13
+ * 1. **Bundler aliasing**: Vite/webpack alias missing packages to empty modules
14
+ * at BUILD TIME. The import completes immediately (no async).
15
+ *
16
+ * 2. **Rules of Hooks**: If we use async dynamic import:
17
+ * - First render: `realUseAuth = null` → uses stub (0 hooks)
18
+ * - Async completes: `realUseAuth = useAuth` → now has hooks
19
+ * - Next render: React sees different hook count → CRASH
20
+ *
21
+ * 3. **Monorepo gotcha**: Dynamic imports resolve workspace packages even when
22
+ * the consuming app doesn't have them as dependencies. This causes the
23
+ * real hook to activate unexpectedly → Rules of Hooks violation.
24
+ *
25
+ * 4. **Decision is immutable**: With sync import, `authModule?.useAuth` is
26
+ * evaluated ONCE at module load. It's either the real hook or undefined.
27
+ * This never changes during the app lifecycle.
28
+ *
29
+ * @see docs/development/GRACEFUL_DEGRADATION.md
30
+ * @version 0.0.4
18
31
  * @since 0.0.1
19
32
  * @author AMBROISE PARK Consulting
20
33
  */
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useAuthSafe.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAkB9C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAKvE;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,SAAoC,CAAC"}
1
+ {"version":3,"file":"useAuthSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useAuthSafe.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAoB9C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAKvE;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,SAAoC,CAAC"}
@@ -1,7 +1,9 @@
1
1
  // packages/ui/src/utils/useAuthSafe.ts
2
2
  import { DEGRADED_AUTH_API } from '@donotdev/core';
3
+ // Sync import - bundler aliases to empty module if not installed
4
+ // Decision made ONCE at module load time, never changes
3
5
  import * as authModule from '@donotdev/auth';
4
- // Check if real hook exists (will be undefined if Vite aliased to empty module)
6
+ // Extract useAuth if available (undefined if package not installed/aliased)
5
7
  const realUseAuth = authModule?.useAuth;
6
8
  /**
7
9
  * Stub that returns degraded auth values.
@@ -20,9 +20,9 @@ export interface AuthVisibilityState {
20
20
  * Hook to determine auth UI visibility and loading states
21
21
  *
22
22
  * **Visibility Rules:**
23
- * - Hide if `!initialized || !isAvailable` (not ready or not installed)
24
- * - Show with loading if `loading` during operations (user action in progress)
25
- * - Show normal UI when `initialized && isAvailable && !loading`
23
+ * - Hide if `status !== 'ready' || !isAvailable` (not ready or not installed)
24
+ * - Show with loading if `status === 'initializing'` during operations
25
+ * - Show normal UI when `status === 'ready' && isAvailable`
26
26
  *
27
27
  * @returns AuthVisibilityState with visibility flags
28
28
  *
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthVisibility.d.ts","sourceRoot":"","sources":["../../src/utils/useAuthVisibility.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iBAAiB,IAAI,mBAAmB,CAkBvD"}
1
+ {"version":3,"file":"useAuthVisibility.d.ts","sourceRoot":"","sources":["../../src/utils/useAuthVisibility.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iBAAiB,IAAI,mBAAmB,CAqBvD"}
@@ -1,25 +1,26 @@
1
1
  // packages/ui/src/utils/useAuthVisibility.ts
2
2
  /**
3
3
  * @fileoverview useAuthVisibility Hook
4
- * @description Determines when to show/hide auth UI based on initialization and loading states
4
+ * @description Determines when to show/hide auth UI based on feature status
5
5
  *
6
6
  * This hook encapsulates the common pattern for auth UI visibility:
7
- * - Hide if not initialized or not available (not ready yet)
8
- * - Show with loading state during operations (user action in progress)
9
- * - Show normal UI when ready
7
+ * - Hide if status !== 'ready' or not available (not ready yet)
8
+ * - Show with loading state during initialization
9
+ * - Show normal UI when status === 'ready'
10
10
  *
11
- * @version 0.0.1
11
+ * @version 0.0.3
12
12
  * @since 0.0.1
13
13
  * @author AMBROISE PARK Consulting
14
14
  */
15
+ import { useMemo } from 'react';
15
16
  import { useAuthSafe } from './useAuthSafe';
16
17
  /**
17
18
  * Hook to determine auth UI visibility and loading states
18
19
  *
19
20
  * **Visibility Rules:**
20
- * - Hide if `!initialized || !isAvailable` (not ready or not installed)
21
- * - Show with loading if `loading` during operations (user action in progress)
22
- * - Show normal UI when `initialized && isAvailable && !loading`
21
+ * - Hide if `status !== 'ready' || !isAvailable` (not ready or not installed)
22
+ * - Show with loading if `status === 'initializing'` during operations
23
+ * - Show normal UI when `status === 'ready' && isAvailable`
23
24
  *
24
25
  * @returns AuthVisibilityState with visibility flags
25
26
  *
@@ -41,19 +42,22 @@ import { useAuthSafe } from './useAuthSafe';
41
42
  * ```
42
43
  */
43
44
  export function useAuthVisibility() {
44
- const initialized = useAuthSafe('initialized');
45
- const authStateChecked = useAuthSafe('authStateChecked');
46
- const loading = useAuthSafe('loading');
45
+ // Read all values first - each triggers subscription
46
+ const status = useAuthSafe('status');
47
47
  const isAvailable = useAuthSafe('isAvailable');
48
48
  const user = useAuthSafe('user');
49
- const shouldHide = !initialized || !isAvailable;
50
- const isLoading = Boolean(loading);
51
- const isReady = initialized && isAvailable && authStateChecked;
52
- const isAuthenticated = Boolean(user);
53
- return {
54
- shouldHide,
55
- isLoading,
56
- isReady,
57
- isAuthenticated,
58
- };
49
+ // Derive all visibility state atomically from current values
50
+ // useMemo ensures consistent state within a single render
51
+ return useMemo(() => {
52
+ const shouldHide = status !== 'ready' || !isAvailable;
53
+ const isLoading = status === 'initializing';
54
+ const isReady = status === 'ready' && isAvailable;
55
+ const isAuthenticated = Boolean(user);
56
+ return {
57
+ shouldHide,
58
+ isLoading,
59
+ isReady,
60
+ isAuthenticated,
61
+ };
62
+ }, [status, isAvailable, user]);
59
63
  }
@@ -17,8 +17,8 @@ export interface BillingVisibilityState {
17
17
  *
18
18
  * **Visibility Rules:**
19
19
  * - Hide if `!isAvailable` (not installed/configured)
20
- * - Show with loading if `loading` during operations (user action in progress)
21
- * - Show normal UI when `isAvailable && !loading`
20
+ * - Show with loading if `status === 'initializing'` during operations
21
+ * - Show normal UI when `isAvailable && status === 'ready'`
22
22
  *
23
23
  * @returns BillingVisibilityState with visibility flags
24
24
  *
@@ -1 +1 @@
1
- {"version":3,"file":"useBillingVisibility.d.ts","sourceRoot":"","sources":["../../src/utils/useBillingVisibility.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,IAAI,sBAAsB,CA2B7D"}
1
+ {"version":3,"file":"useBillingVisibility.d.ts","sourceRoot":"","sources":["../../src/utils/useBillingVisibility.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,IAAI,sBAAsB,CA0B7D"}
@@ -1,14 +1,14 @@
1
1
  // packages/ui/src/utils/useBillingVisibility.ts
2
2
  /**
3
3
  * @fileoverview useBillingVisibility Hook
4
- * @description Determines when to show/hide billing UI based on availability and loading states
4
+ * @description Determines when to show/hide billing UI based on feature status
5
5
  *
6
6
  * This hook encapsulates the common pattern for billing UI visibility:
7
7
  * - Hide if not available (not installed/configured)
8
- * - Show with loading state during operations
9
- * - Show normal UI when ready
8
+ * - Show with loading state during initialization
9
+ * - Show normal UI when status === 'ready'
10
10
  *
11
- * @version 0.0.1
11
+ * @version 0.0.3
12
12
  * @since 0.0.1
13
13
  * @author AMBROISE PARK Consulting
14
14
  */
@@ -19,8 +19,8 @@ import { useStripeBillingSafe } from './useStripeBillingSafe';
19
19
  *
20
20
  * **Visibility Rules:**
21
21
  * - Hide if `!isAvailable` (not installed/configured)
22
- * - Show with loading if `loading` during operations (user action in progress)
23
- * - Show normal UI when `isAvailable && !loading`
22
+ * - Show with loading if `status === 'initializing'` during operations
23
+ * - Show normal UI when `isAvailable && status === 'ready'`
24
24
  *
25
25
  * @returns BillingVisibilityState with visibility flags
26
26
  *
@@ -42,16 +42,15 @@ import { useStripeBillingSafe } from './useStripeBillingSafe';
42
42
  export function useBillingVisibility() {
43
43
  // Get auth state for billing (required for isAvailable to work)
44
44
  const user = useAuthSafe('user');
45
- const initialized = useAuthSafe('initialized');
46
- const authStateChecked = useAuthSafe('authStateChecked');
47
- const authState = { user, initialized, authStateChecked };
48
- const loading = useStripeBillingSafe('loading', authState);
45
+ const status = useAuthSafe('status');
46
+ const authState = { user, status };
47
+ const billingStatus = useStripeBillingSafe('status', authState);
49
48
  const isAvailable = useStripeBillingSafe('isAvailable', authState);
50
49
  const shouldHide = !isAvailable;
51
- const isLoading = Boolean(loading);
52
- const isReady = isAvailable;
50
+ const isLoading = billingStatus === 'initializing';
51
+ const isReady = isAvailable && billingStatus === 'ready';
53
52
  console.log('[useBillingVisibility]', {
54
- loading,
53
+ billingStatus,
55
54
  isAvailable,
56
55
  shouldHide,
57
56
  isLoading,
@@ -17,7 +17,7 @@ interface UseCrudOptions<T> {
17
17
  * @example
18
18
  * ```typescript
19
19
  * const crud = useCrudSafe('users', { backend: 'firestore', schema: UserSchema });
20
- * const { data, loading, error, get, set } = crud;
20
+ * const { data, status, error, get, set } = crud;
21
21
  * ```
22
22
  */
23
23
  export declare function useCrudSafe<T = unknown>(collection: string, options?: UseCrudOptions<T>): CrudAPI<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"useCrudSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useCrudSafe.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK3D,KAAK,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAE7C,UAAU,cAAc,CAAC,CAAC;IACxB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CACzB;AAeD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EACrC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,cAAc,CAAC,CAAC,CAAM,GAC9B,OAAO,CAAC,CAAC,CAAC,CAKZ;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,SAAoC,CAAC"}
1
+ {"version":3,"file":"useCrudSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useCrudSafe.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK3D,KAAK,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAE7C,UAAU,cAAc,CAAC,CAAC;IACxB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CACzB;AAeD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EACrC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,cAAc,CAAC,CAAC,CAAM,GAC9B,OAAO,CAAC,CAAC,CAAC,CAKZ;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,SAAoC,CAAC"}
@@ -4,18 +4,31 @@
4
4
  * @description Provides CRUD functionality when @donotdev/crud is installed,
5
5
  * gracefully degrades to no-op when not installed.
6
6
  *
7
- * **How it works:**
8
- * 1. Import @donotdev/crud (Vite aliases to empty module if not installed)
9
- * 2. Check if useCrud export exists
10
- * 3. If exists use real hook | If not → use stub
11
- *
12
- * **Why this pattern:**
13
- * - Vite aliases missing packages to empty modules at build time
14
- * - Decision is made ONCE at import time, never changes
15
- * - No conditional hook calls = no Rules of Hooks violations
16
- * - Real hook handles all runtime state (Firebase, consent) internally
17
- *
18
- * @version 0.0.1
7
+ * ## CRITICAL: DO NOT USE DYNAMIC IMPORTS
8
+ *
9
+ * This file MUST use sync `import * as crudModule from '@donotdev/crud'`
10
+ * at module level. DO NOT refactor to use async `import('@donotdev/crud').then(...)`.
11
+ *
12
+ * ### Why sync import is required:
13
+ *
14
+ * 1. **Bundler aliasing**: Vite/webpack alias missing packages to empty modules
15
+ * at BUILD TIME. The import completes immediately (no async).
16
+ *
17
+ * 2. **Rules of Hooks**: If we use async dynamic import:
18
+ * - First render: `realUseCrud = null` → uses stub (0 hooks)
19
+ * - Async completes: `realUseCrud = useCrud` → now has hooks
20
+ * - Next render: React sees different hook count → CRASH
21
+ *
22
+ * 3. **Monorepo gotcha**: Dynamic imports resolve workspace packages even when
23
+ * the consuming app doesn't have them as dependencies. This causes the
24
+ * real hook to activate unexpectedly → Rules of Hooks violation.
25
+ *
26
+ * 4. **Decision is immutable**: With sync import, `crudModule?.useCrud`
27
+ * is evaluated ONCE at module load. It's either the real hook or undefined.
28
+ * This never changes during the app lifecycle.
29
+ *
30
+ * @see docs/development/GRACEFUL_DEGRADATION.md
31
+ * @version 0.0.4
19
32
  * @since 0.0.1
20
33
  * @author AMBROISE PARK Consulting
21
34
  */
@@ -43,7 +56,7 @@ function useCrudStub() {
43
56
  * @example
44
57
  * ```typescript
45
58
  * const crud = useCrudSafe('users', { backend: 'firestore', schema: UserSchema });
46
- * const { data, loading, error, get, set } = crud;
59
+ * const { data, status, error, get, set } = crud;
47
60
  * ```
48
61
  */
49
62
  export function useCrudSafe(collection, options = {}) {
@@ -3,18 +3,31 @@
3
3
  * @description Provides OAuth functionality when @donotdev/oauth is installed,
4
4
  * gracefully degrades to no-op when not installed.
5
5
  *
6
- * **How it works:**
7
- * 1. Import @donotdev/oauth (Vite aliases to empty module if not installed)
8
- * 2. Check if useOAuth export exists
9
- * 3. If exists use real hook | If not → use stub
10
- *
11
- * **Why this pattern:**
12
- * - Vite aliases missing packages to empty modules at build time
13
- * - Decision is made ONCE at import time, never changes
14
- * - No conditional hook calls = no Rules of Hooks violations
15
- * - Real hook handles all runtime state (credentials, consent) internally
16
- *
17
- * @version 0.0.1
6
+ * ## CRITICAL: DO NOT USE DYNAMIC IMPORTS
7
+ *
8
+ * This file MUST use sync `import * as oauthModule from '@donotdev/oauth'`
9
+ * at module level. DO NOT refactor to use async `import('@donotdev/oauth').then(...)`.
10
+ *
11
+ * ### Why sync import is required:
12
+ *
13
+ * 1. **Bundler aliasing**: Vite/webpack alias missing packages to empty modules
14
+ * at BUILD TIME. The import completes immediately (no async).
15
+ *
16
+ * 2. **Rules of Hooks**: If we use async dynamic import:
17
+ * - First render: `realUseOAuth = null` → uses stub (0 hooks)
18
+ * - Async completes: `realUseOAuth = useOAuth` → now has hooks
19
+ * - Next render: React sees different hook count → CRASH
20
+ *
21
+ * 3. **Monorepo gotcha**: Dynamic imports resolve workspace packages even when
22
+ * the consuming app doesn't have them as dependencies. This causes the
23
+ * real hook to activate unexpectedly → Rules of Hooks violation.
24
+ *
25
+ * 4. **Decision is immutable**: With sync import, `oauthModule?.useOAuth`
26
+ * is evaluated ONCE at module load. It's either the real hook or undefined.
27
+ * This never changes during the app lifecycle.
28
+ *
29
+ * @see docs/development/GRACEFUL_DEGRADATION.md
30
+ * @version 0.0.2
18
31
  * @since 0.0.1
19
32
  * @author AMBROISE PARK Consulting
20
33
  */
@@ -1 +1 @@
1
- {"version":3,"file":"useOAuthSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useOAuthSafe.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAkB/C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAK1E;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,SAAqC,CAAC"}
1
+ {"version":3,"file":"useOAuthSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useOAuthSafe.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAkB/C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAK1E;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,SAAqC,CAAC"}
@@ -3,18 +3,31 @@
3
3
  * @description Provides billing functionality when @donotdev/billing is installed,
4
4
  * gracefully degrades to no-op when not installed.
5
5
  *
6
- * **How it works:**
7
- * 1. Import @donotdev/billing (Vite aliases to empty module if not installed)
8
- * 2. Check if useStripeBilling export exists
9
- * 3. If exists use real hook | If not → use stub
10
- *
11
- * **Why this pattern:**
12
- * - Vite aliases missing packages to empty modules at build time
13
- * - Decision is made ONCE at import time, never changes
14
- * - No conditional hook calls = no Rules of Hooks violations
15
- * - Real hook handles all runtime state (auth, consent) internally
16
- *
17
- * @version 0.0.1
6
+ * ## CRITICAL: DO NOT USE DYNAMIC IMPORTS
7
+ *
8
+ * This file MUST use sync `import * as billingModule from '@donotdev/billing'`
9
+ * at module level. DO NOT refactor to use async `import('@donotdev/billing').then(...)`.
10
+ *
11
+ * ### Why sync import is required:
12
+ *
13
+ * 1. **Bundler aliasing**: Vite/webpack alias missing packages to empty modules
14
+ * at BUILD TIME. The import completes immediately (no async).
15
+ *
16
+ * 2. **Rules of Hooks**: If we use async dynamic import:
17
+ * - First render: `realUseStripeBilling = null` → uses stub (0 hooks)
18
+ * - Async completes: `realUseStripeBilling = useStripeBilling` → now has hooks
19
+ * - Next render: React sees different hook count → CRASH
20
+ *
21
+ * 3. **Monorepo gotcha**: Dynamic imports resolve workspace packages even when
22
+ * the consuming app doesn't have them as dependencies. This causes the
23
+ * real hook to activate unexpectedly → Rules of Hooks violation.
24
+ *
25
+ * 4. **Decision is immutable**: With sync import, `billingModule?.useStripeBilling`
26
+ * is evaluated ONCE at module load. It's either the real hook or undefined.
27
+ * This never changes during the app lifecycle.
28
+ *
29
+ * @see docs/development/GRACEFUL_DEGRADATION.md
30
+ * @version 0.0.4
18
31
  * @since 0.0.1
19
32
  * @author AMBROISE PARK Consulting
20
33
  */
@@ -28,23 +41,22 @@ export type { BillingAuthState } from '@donotdev/billing';
28
41
  * - If not installed → returns degraded API values
29
42
  *
30
43
  * **IMPORTANT:** For `isAvailable` to return `true`, you must pass `authState`.
31
- * Without auth state, billing will return `isAvailable: false` until auth resolves.
44
+ * Without auth state, billing will return `isAvailable: false` until auth status is `ready`.
32
45
  *
33
46
  * @param key - Property name to access from billing API
34
- * @param authState - Auth state from useAuthSafe (user, initialized, authStateChecked)
47
+ * @param authState - Auth state from useAuthSafe (user, status)
35
48
  * @returns The billing API value, or degraded value if billing unavailable
36
49
  *
37
50
  * @example
38
51
  * ```typescript
39
52
  * // Get auth state first
40
53
  * const user = useAuthSafe('user');
41
- * const initialized = useAuthSafe('initialized');
42
- * const authStateChecked = useAuthSafe('authStateChecked');
43
- * const authState = { user, initialized, authStateChecked };
54
+ * const status = useAuthSafe('status'); // 'initializing' | 'ready' | 'degraded' | 'error'
55
+ * const authState = { user, status };
44
56
  *
45
57
  * // Pass to billing
46
58
  * const checkout = useStripeBillingSafe('checkout', authState);
47
- * const loading = useStripeBillingSafe('loading', authState);
59
+ * const billingStatus = useStripeBillingSafe('status', authState);
48
60
  * const isAvailable = useStripeBillingSafe('isAvailable', authState);
49
61
  * ```
50
62
  */
@@ -1 +1 @@
1
- {"version":3,"file":"useStripeBillingSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useStripeBillingSafe.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAIjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAoB1D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,UAAU,EAC7D,GAAG,EAAE,CAAC,EACN,SAAS,CAAC,EAAE,gBAAgB,GAC3B,UAAU,CAAC,CAAC,CAAC,CAKf;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,SAA6C,CAAC"}
1
+ {"version":3,"file":"useStripeBillingSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useStripeBillingSafe.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAIjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAoB1D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,UAAU,EAC7D,GAAG,EAAE,CAAC,EACN,SAAS,CAAC,EAAE,gBAAgB,GAC3B,UAAU,CAAC,CAAC,CAAC,CAKf;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,SAA6C,CAAC"}
@@ -17,23 +17,22 @@ function useStripeBillingStub(key) {
17
17
  * - If not installed → returns degraded API values
18
18
  *
19
19
  * **IMPORTANT:** For `isAvailable` to return `true`, you must pass `authState`.
20
- * Without auth state, billing will return `isAvailable: false` until auth resolves.
20
+ * Without auth state, billing will return `isAvailable: false` until auth status is `ready`.
21
21
  *
22
22
  * @param key - Property name to access from billing API
23
- * @param authState - Auth state from useAuthSafe (user, initialized, authStateChecked)
23
+ * @param authState - Auth state from useAuthSafe (user, status)
24
24
  * @returns The billing API value, or degraded value if billing unavailable
25
25
  *
26
26
  * @example
27
27
  * ```typescript
28
28
  * // Get auth state first
29
29
  * const user = useAuthSafe('user');
30
- * const initialized = useAuthSafe('initialized');
31
- * const authStateChecked = useAuthSafe('authStateChecked');
32
- * const authState = { user, initialized, authStateChecked };
30
+ * const status = useAuthSafe('status'); // 'initializing' | 'ready' | 'degraded' | 'error'
31
+ * const authState = { user, status };
33
32
  *
34
33
  * // Pass to billing
35
34
  * const checkout = useStripeBillingSafe('checkout', authState);
36
- * const loading = useStripeBillingSafe('loading', authState);
35
+ * const billingStatus = useStripeBillingSafe('status', authState);
37
36
  * const isAvailable = useStripeBillingSafe('isAvailable', authState);
38
37
  * ```
39
38
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AppRoutes.d.ts","sourceRoot":"","sources":["../../src/vite-routing/AppRoutes.tsx"],"names":[],"mappings":"AAyDA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAkFlE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,GAAG,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,UAAU,sBAAsB;IAC9B,4CAA4C;IAC5C,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,yCAgE9D"}
1
+ {"version":3,"file":"AppRoutes.d.ts","sourceRoot":"","sources":["../../src/vite-routing/AppRoutes.tsx"],"names":[],"mappings":"AAoDA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAuFlE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,GAAG,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,UAAU,sBAAsB;IAC9B,4CAA4C;IAC5C,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,yCA8D9D"}
@@ -32,7 +32,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
32
32
  * - **Suspense Boundaries**: Proper loading states prevent UI flicker
33
33
  * - **Native Scroll Restoration**: Built-in scroll position memory
34
34
  *
35
- * @version 0.0.2
35
+ * @version 0.0.3
36
36
  * @since 0.0.1
37
37
  * @author AMBROISE PARK Consulting
38
38
  * @license Commercial
@@ -46,7 +46,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
46
46
  * <RouterProvider router={router} />
47
47
  * ```
48
48
  */
49
- import { lazy, Suspense, } from 'react';
49
+ import { lazy, Suspense } from 'react';
50
50
  import { createBrowserRouter } from 'react-router-dom';
51
51
  import {} from '@donotdev/core';
52
52
  import { RootLayout } from './RootLayout';
@@ -87,7 +87,7 @@ const LazyRoute = ({ component, path }) => {
87
87
  lazyComponentCache.set(path, lazy(component));
88
88
  }
89
89
  const Component = lazyComponentCache.get(path);
90
- return _jsx(Component, {});
90
+ return (_jsx(Suspense, { fallback: _jsx(Loader, {}), children: _jsx(Component, {}) }));
91
91
  };
92
92
  /**
93
93
  * Parse auth configuration to PageAuth | false for AuthGuard
@@ -177,9 +177,9 @@ export function createAppRouter(options) {
177
177
  element: _jsx(RootLayout, { layout: layout }),
178
178
  children: [
179
179
  {
180
- /** HomePage route - discovered from HomePage.tsx */
180
+ /** HomePage route - lazy loaded, public (no AuthGuard) */
181
181
  index: true,
182
- element: homePageRoute.parsedAuth === false ? (_jsx(LazyRoute, { component: homePageRoute.component, path: homePageRoute.path })) : (_jsx(AuthGuard, { auth: homePageRoute.parsedAuth, children: _jsx(LazyRoute, { component: homePageRoute.component, path: homePageRoute.path }) })),
182
+ element: (_jsx(LazyRoute, { component: homePageRoute.component, path: homePageRoute.path })),
183
183
  },
184
184
  /** All other routes are discovered and rendered here */
185
185
  ...routesWithParsedAuth
@@ -1 +1 @@
1
- {"version":3,"file":"RootLayout.d.ts","sourceRoot":"","sources":["../../src/vite-routing/RootLayout.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA8JnD;;GAEG;AACH,UAAU,oBAAoB;IAC5B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,oBAAoB,2CAmC1D"}
1
+ {"version":3,"file":"RootLayout.d.ts","sourceRoot":"","sources":["../../src/vite-routing/RootLayout.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAuLnD;;GAEG;AACH,UAAU,oBAAoB;IAC5B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,oBAAoB,2CA6B1D"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // packages/ui/src/vite-routing/RootLayout.tsx
3
3
  /**
4
4
  * @fileoverview RootLayout - Root route layout component
@@ -18,11 +18,8 @@ import { Outlet, useLocation } from 'react-router-dom';
18
18
  import { globalEmitter, isClient } from '@donotdev/core';
19
19
  import Loader from '../components/common/Loader';
20
20
  import { DnDevLayout } from '../internal/layout/DnDevLayout';
21
- // Lazy load providers and components
22
- const QueryProviders = lazy(() => import('@donotdev/core').then((m) => ({ default: m.QueryProviders })));
23
- const UIProviders = lazy(() => import('../internal/providers/UIProviders').then((m) => ({
24
- default: m.UIProviders,
25
- })));
21
+ import { UIProviders } from '../internal/providers/UIProviders';
22
+ // Only lazy load non-critical components (not in render path)
26
23
  const AutoMetaTags = lazy(() => import('../internal/layout/components/AutoMetaTags').then((m) => ({
27
24
  default: m.default,
28
25
  })));
@@ -145,6 +142,36 @@ function FrameworkReadySignal({ children }) {
145
142
  }, []);
146
143
  return _jsx("div", { ref: frameworkRef, children: children });
147
144
  }
145
+ /**
146
+ * RouteReadySignal - Signals when route content is painted
147
+ *
148
+ * Emits 'DNDEV_ROUTE_READY' event when route content (inside Suspense) is painted.
149
+ * Used in coordination with FrameworkReadySignal to time shell loader removal.
150
+ *
151
+ * Shell loader removed only when BOTH framework AND route are ready,
152
+ * preventing "late arrival" of route content after Header/Footer paint.
153
+ *
154
+ * @version 0.0.1
155
+ * @since 0.0.1
156
+ * @author AMBROISE PARK Consulting
157
+ */
158
+ function RouteReadySignal({ children }) {
159
+ const hasSignaled = useRef(false);
160
+ useLayoutEffect(() => {
161
+ if (!isClient() || hasSignaled.current)
162
+ return;
163
+ // Wait for two animation frames to ensure paint completion
164
+ requestAnimationFrame(() => {
165
+ requestAnimationFrame(() => {
166
+ if (hasSignaled.current)
167
+ return;
168
+ hasSignaled.current = true;
169
+ globalEmitter.emit('DNDEV_ROUTE_READY');
170
+ });
171
+ });
172
+ }, []);
173
+ return _jsx(_Fragment, { children: children });
174
+ }
148
175
  /**
149
176
  * RootLayout - Root route layout component
150
177
  *
@@ -179,5 +206,5 @@ function FrameworkReadySignal({ children }) {
179
206
  * @author AMBROISE PARK Consulting
180
207
  */
181
208
  export function RootLayout({ layout }) {
182
- return (_jsx(QueryProviders, { children: _jsxs(UIProviders, { children: [_jsx(AutoMetaTags, {}), _jsxs(FrameworkReadySignal, { children: [_jsx(DnDevLayout, { layout: layout, children: _jsx(Suspense, { fallback: _jsx(Loader, {}), children: _jsx(Outlet, {}) }) }), _jsx(CustomScrollRestoration, {}), _jsx(ConsentBanner, {}), _jsx(PWAUpdateNotification, {}), _jsx(LicenseWatermark, {})] })] }) }));
209
+ return (_jsxs(UIProviders, { children: [_jsx(Suspense, { fallback: null, children: _jsx(AutoMetaTags, {}) }), _jsxs(FrameworkReadySignal, { children: [_jsx(DnDevLayout, { layout: layout, children: _jsx(RouteReadySignal, { children: _jsx(Outlet, {}) }) }), _jsx(CustomScrollRestoration, {}), _jsxs(Suspense, { fallback: null, children: [_jsx(ConsentBanner, {}), _jsx(PWAUpdateNotification, {}), _jsx(LicenseWatermark, {})] })] })] }));
183
210
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/ui",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -53,14 +53,14 @@
53
53
  "react-hook-form": "^7.68.0"
54
54
  },
55
55
  "peerDependencies": {
56
- "@donotdev/adv-comps": "0.0.2",
57
- "@donotdev/auth": "0.0.2",
58
- "@donotdev/billing": "0.0.2",
59
- "@donotdev/components": "0.0.2",
60
- "@donotdev/core": "0.0.2",
61
- "@donotdev/crud": "0.0.2",
62
- "@donotdev/firebase": "0.0.2",
63
- "@donotdev/oauth": "0.0.2",
56
+ "@donotdev/adv-comps": "0.0.3",
57
+ "@donotdev/auth": "0.0.3",
58
+ "@donotdev/billing": "0.0.3",
59
+ "@donotdev/components": "0.0.3",
60
+ "@donotdev/core": "0.0.3",
61
+ "@donotdev/crud": "0.0.3",
62
+ "@donotdev/firebase": "0.0.3",
63
+ "@donotdev/oauth": "0.0.3",
64
64
  "firebase": "^12.5.0",
65
65
  "lucide-react": "^0.562.0",
66
66
  "react": "^19.2.3",
@@ -1,2 +0,0 @@
1
- export declare const AuthTab: () => import("react/jsx-runtime").JSX.Element;
2
- //# sourceMappingURL=AuthTab.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AuthTab.d.ts","sourceRoot":"","sources":["../../../../src/internal/devtools/components/AuthTab.tsx"],"names":[],"mappings":"AAiCA,eAAO,MAAM,OAAO,+CAyNnB,CAAC"}