@donotdev/ui 0.0.13 → 0.0.15

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 (163) hide show
  1. package/dist/components/auth/AuthMenu.d.ts.map +1 -1
  2. package/dist/components/auth/AuthMenu.js +19 -20
  3. package/dist/components/common/FeatureCard.d.ts +3 -1
  4. package/dist/components/common/FeatureCard.d.ts.map +1 -1
  5. package/dist/components/common/FeatureCard.js +2 -2
  6. package/dist/components/common/ProgressBar.js +2 -2
  7. package/dist/components/common/TechBento.d.ts +14 -2
  8. package/dist/components/common/TechBento.d.ts.map +1 -1
  9. package/dist/components/common/TechBento.js +8 -9
  10. package/dist/components/cookie-consent/CookieConsent.d.ts.map +1 -1
  11. package/dist/components/cookie-consent/CookieConsent.js +3 -4
  12. package/dist/components/layout/components/DropdownNavigation.d.ts.map +1 -1
  13. package/dist/components/layout/components/DropdownNavigation.js +3 -12
  14. package/dist/components/layout/components/FloatingLanguageSwitcher.js +1 -1
  15. package/dist/components/layout/components/Notifications.d.ts +1 -3
  16. package/dist/components/layout/components/Notifications.d.ts.map +1 -1
  17. package/dist/components/layout/components/Notifications.js +4 -2
  18. package/dist/components/layout/components/header/AppBranding.d.ts.map +1 -1
  19. package/dist/components/layout/components/header/AppBranding.js +2 -1
  20. package/dist/components/layout/components/header/AppIcon.d.ts.map +1 -1
  21. package/dist/components/layout/components/header/AppIcon.js +5 -2
  22. package/dist/components/layout/components/header/CacheSettings.d.ts.map +1 -1
  23. package/dist/components/layout/components/header/CacheSettings.js +3 -1
  24. package/dist/components/layout/components/header/HeaderNavigation.d.ts +6 -0
  25. package/dist/components/layout/components/header/HeaderNavigation.d.ts.map +1 -1
  26. package/dist/components/layout/components/header/HeaderNavigation.js +12 -2
  27. package/dist/components/layout/components/index.d.ts +3 -0
  28. package/dist/components/layout/components/index.d.ts.map +1 -1
  29. package/dist/components/layout/components/index.js +3 -0
  30. package/dist/components/license/LicenseWatermark.d.ts.map +1 -1
  31. package/dist/components/license/LicenseWatermark.js +3 -1
  32. package/dist/crud/components/CrudCardLink.d.ts +17 -0
  33. package/dist/crud/components/CrudCardLink.d.ts.map +1 -0
  34. package/dist/crud/components/CrudCardLink.js +17 -0
  35. package/dist/crud/components/EntityCardList.d.ts +1 -1
  36. package/dist/crud/components/EntityCardList.d.ts.map +1 -1
  37. package/dist/crud/components/EntityCardList.js +38 -90
  38. package/dist/crud/components/EntityDisplayRenderer.d.ts +1 -1
  39. package/dist/crud/components/EntityDisplayRenderer.d.ts.map +1 -1
  40. package/dist/crud/components/EntityDisplayRenderer.js +11 -3
  41. package/dist/crud/components/EntityFormRenderer.d.ts +1 -1
  42. package/dist/crud/components/EntityFormRenderer.d.ts.map +1 -1
  43. package/dist/crud/components/EntityFormRenderer.js +34 -40
  44. package/dist/crud/components/EntityList.d.ts +1 -1
  45. package/dist/crud/components/EntityList.d.ts.map +1 -1
  46. package/dist/crud/components/EntityList.js +1 -1
  47. package/dist/crud/components/EntityRecommendations.d.ts +29 -0
  48. package/dist/crud/components/EntityRecommendations.d.ts.map +1 -0
  49. package/dist/crud/components/EntityRecommendations.js +32 -0
  50. package/dist/crud/components/index.d.ts +2 -1
  51. package/dist/crud/components/index.d.ts.map +1 -1
  52. package/dist/crud/components/index.js +1 -0
  53. package/dist/dndev.css +1021 -196
  54. package/dist/index.js +4 -4
  55. package/dist/internal/common/RouteErrorFallback.d.ts.map +1 -1
  56. package/dist/internal/devtools/components/AuthDebugButton.js +1 -1
  57. package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
  58. package/dist/internal/devtools/components/DesignTab.js +3 -2
  59. package/dist/internal/devtools/components/LayoutReset.d.ts.map +1 -1
  60. package/dist/internal/devtools/components/LayoutReset.js +2 -0
  61. package/dist/internal/devtools/components/StoresTab.d.ts.map +1 -1
  62. package/dist/internal/devtools/components/StoresTab.js +3 -0
  63. package/dist/internal/devtools/utils/envVarDiscovery.d.ts +1 -0
  64. package/dist/internal/devtools/utils/envVarDiscovery.d.ts.map +1 -1
  65. package/dist/internal/devtools/utils/envVarDiscovery.js +5 -0
  66. package/dist/internal/devtools/utils/virtualModuleInspector.d.ts.map +1 -1
  67. package/dist/internal/devtools/utils/virtualModuleInspector.js +27 -21
  68. package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
  69. package/dist/internal/initializers/BaseStoresInitializer.js +30 -6
  70. package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
  71. package/dist/internal/layout/components/AutoMetaTags.js +10 -8
  72. package/dist/internal/layout/components/FontPreloadLinks.d.ts +16 -0
  73. package/dist/internal/layout/components/FontPreloadLinks.d.ts.map +1 -0
  74. package/dist/internal/layout/components/FontPreloadLinks.js +32 -0
  75. package/dist/internal/layout/components/PerformanceHints.d.ts +7 -12
  76. package/dist/internal/layout/components/PerformanceHints.d.ts.map +1 -1
  77. package/dist/internal/layout/components/PerformanceHints.js +8 -12
  78. package/dist/internal/layout/components/footer/useLegalLinks.d.ts +6 -5
  79. package/dist/internal/layout/components/footer/useLegalLinks.d.ts.map +1 -1
  80. package/dist/internal/layout/components/footer/useLegalLinks.js +6 -2
  81. package/dist/internal/layout/zones/DnDevFooter.d.ts +6 -0
  82. package/dist/internal/layout/zones/DnDevFooter.d.ts.map +1 -1
  83. package/dist/internal/layout/zones/DnDevFooter.js +10 -4
  84. package/dist/internal/layout/zones/DnDevHeader.d.ts +7 -0
  85. package/dist/internal/layout/zones/DnDevHeader.d.ts.map +1 -1
  86. package/dist/internal/layout/zones/DnDevHeader.js +7 -0
  87. package/dist/internal/layout/zones/DnDevMergedBar.d.ts +7 -0
  88. package/dist/internal/layout/zones/DnDevMergedBar.d.ts.map +1 -1
  89. package/dist/internal/layout/zones/DnDevMergedBar.js +9 -0
  90. package/dist/internal/layout/zones/DnDevSidebar.d.ts +4 -0
  91. package/dist/internal/layout/zones/DnDevSidebar.d.ts.map +1 -1
  92. package/dist/internal/layout/zones/DnDevSidebar.js +13 -1
  93. package/dist/internal/providers/NavigationProvider.d.ts.map +1 -1
  94. package/dist/internal/providers/NavigationProvider.js +3 -5
  95. package/dist/next.d.ts +1 -0
  96. package/dist/next.d.ts.map +1 -1
  97. package/dist/next.js +1 -0
  98. package/dist/providers/ViteAppProviders.d.ts.map +1 -1
  99. package/dist/providers/ViteAppProviders.js +3 -5
  100. package/dist/routing/AuthGuard.d.ts +1 -1
  101. package/dist/routing/AuthGuard.d.ts.map +1 -1
  102. package/dist/routing/AuthGuard.js +3 -1
  103. package/dist/routing/GoTo.d.ts.map +1 -1
  104. package/dist/routing/GoTo.js +3 -1
  105. package/dist/routing/GoToDialog.d.ts.map +1 -1
  106. package/dist/routing/GoToDialog.js +2 -7
  107. package/dist/routing/GoToInput.d.ts +0 -3
  108. package/dist/routing/GoToInput.d.ts.map +1 -1
  109. package/dist/routing/GoToInput.js +8 -7
  110. package/dist/routing/Link.js +1 -1
  111. package/dist/routing/NavigationItem.d.ts +29 -7
  112. package/dist/routing/NavigationItem.d.ts.map +1 -1
  113. package/dist/routing/NavigationItem.js +22 -6
  114. package/dist/routing/hooks/hooks.next.js +1 -1
  115. package/dist/routing/hooks/hooks.vite.js +1 -1
  116. package/dist/routing/hooks/useNavigate.next.d.ts +1 -1
  117. package/dist/routing/hooks/useNavigate.next.d.ts.map +1 -1
  118. package/dist/routing/hooks/useNavigate.next.js +1 -7
  119. package/dist/routing/hooks/useNavigate.vite.d.ts +1 -1
  120. package/dist/routing/hooks/useNavigate.vite.d.ts.map +1 -1
  121. package/dist/routing/hooks/useNavigate.vite.js +1 -7
  122. package/dist/routing/hooks/useRedirectGuard.next.d.ts.map +1 -1
  123. package/dist/routing/hooks/useRedirectGuard.next.js +9 -8
  124. package/dist/routing/hooks/useRedirectGuard.vite.d.ts.map +1 -1
  125. package/dist/routing/hooks/useRedirectGuard.vite.js +9 -8
  126. package/dist/routing/hooks/useSearchParams.next.d.ts +18 -1
  127. package/dist/routing/hooks/useSearchParams.next.d.ts.map +1 -1
  128. package/dist/routing/hooks/useSearchParams.next.js +16 -0
  129. package/dist/routing/hooks/useSearchParams.vite.d.ts +16 -0
  130. package/dist/routing/hooks/useSearchParams.vite.d.ts.map +1 -1
  131. package/dist/routing/hooks/useSearchParams.vite.js +17 -1
  132. package/dist/routing/index.d.ts.map +1 -1
  133. package/dist/routing/index.js +2 -0
  134. package/dist/routing/useNavigation.d.ts +30 -0
  135. package/dist/routing/useNavigation.d.ts.map +1 -1
  136. package/dist/routing/useNavigation.js +40 -3
  137. package/dist/routing/useRouteDiscovery.d.ts +6 -17
  138. package/dist/routing/useRouteDiscovery.d.ts.map +1 -1
  139. package/dist/routing/useRouteDiscovery.js +16 -9
  140. package/dist/styles/index.css +284 -88
  141. package/dist/utils/index.d.ts +1 -0
  142. package/dist/utils/index.d.ts.map +1 -1
  143. package/dist/utils/index.js +1 -0
  144. package/dist/utils/sanitizeSvg.d.ts +13 -0
  145. package/dist/utils/sanitizeSvg.d.ts.map +1 -0
  146. package/dist/utils/sanitizeSvg.js +47 -0
  147. package/dist/utils/useBillingVisibility.d.ts.map +1 -1
  148. package/dist/utils/useBillingVisibility.js +0 -7
  149. package/dist/utils/useCrudSafe.d.ts +0 -2
  150. package/dist/utils/useCrudSafe.d.ts.map +1 -1
  151. package/dist/utils/useFormStoreSafe.d.ts +5 -16
  152. package/dist/utils/useFormStoreSafe.d.ts.map +1 -1
  153. package/dist/utils/useFormStoreSafe.js +6 -37
  154. package/dist/vite-routing/AppRoutes.d.ts +19 -8
  155. package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
  156. package/dist/vite-routing/AppRoutes.js +0 -3
  157. package/dist/vite-routing/RootLayout.d.ts.map +1 -1
  158. package/dist/vite-routing/RootLayout.js +10 -15
  159. package/package.json +16 -12
  160. package/assets/fonts/fonts.css +0 -206
  161. package/dist/routing/Navigate.d.ts +0 -10
  162. package/dist/routing/Navigate.d.ts.map +0 -1
  163. package/dist/routing/Navigate.js +0 -10
@@ -14,4 +14,5 @@ export * from './useStripeBillingSafe';
14
14
  export * from './useBillingVisibility';
15
15
  export * from './useOAuthSafe';
16
16
  export * from './tList';
17
+ export * from './sanitizeSvg';
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC"}
@@ -15,3 +15,4 @@ export * from './useStripeBillingSafe';
15
15
  export * from './useBillingVisibility';
16
16
  export * from './useOAuthSafe';
17
17
  export * from './tList';
18
+ export * from './sanitizeSvg';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Strips known XSS vectors from an SVG string.
3
+ *
4
+ * @param svg - Raw SVG string (build-time or static source)
5
+ * @returns Sanitized SVG string safe for dangerouslySetInnerHTML
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * <div dangerouslySetInnerHTML={{ __html: sanitizeSvg(svgContent) }} />
10
+ * ```
11
+ */
12
+ export declare function sanitizeSvg(svg: string): string;
13
+ //# sourceMappingURL=sanitizeSvg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeSvg.d.ts","sourceRoot":"","sources":["../../src/utils/sanitizeSvg.ts"],"names":[],"mappings":"AA+BA;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO/C"}
@@ -0,0 +1,47 @@
1
+ // packages/ui/src/utils/sanitizeSvg.ts
2
+ /**
3
+ * @fileoverview Minimal SVG sanitizer
4
+ * @description Strips dangerous elements and attributes from SVG strings
5
+ * without requiring a third-party DOMPurify dependency.
6
+ *
7
+ * Removes:
8
+ * - `<script>` elements and their content
9
+ * - `<foreignObject>` elements (arbitrary HTML injection vector)
10
+ * - Event handler attributes (on*)
11
+ * - `href` / `xlink:href` values starting with `javascript:`
12
+ * - `data:` URIs in href attributes (except safe image types)
13
+ *
14
+ * @remarks
15
+ * This is intentionally a lightweight allowlist approach for SVG strings
16
+ * that originate from build-time assets (logo.svg) or internal static data
17
+ * (techLogos). For user-provided SVG content, use DOMPurify instead.
18
+ *
19
+ * @version 0.0.1
20
+ * @since 0.0.1
21
+ * @author AMBROISE PARK Consulting
22
+ */
23
+ /** Regex patterns for known XSS vectors in SVG */
24
+ const SCRIPT_TAG_RE = /<script[\s\S]*?<\/script>/gi;
25
+ const FOREIGN_OBJECT_RE = /<foreignObject[\s\S]*?<\/foreignObject>/gi;
26
+ const EVENT_HANDLER_RE = /\s+on\w+\s*=\s*["'][^"']*["']/gi;
27
+ const JAVASCRIPT_HREF_RE = /\s+(?:xlink:)?href\s*=\s*["']\s*javascript:[^"']*["']/gi;
28
+ const DATA_URI_HREF_RE = /\s+(?:xlink:)?href\s*=\s*["']\s*data:(?!image\/(?:png|jpe?g|gif|webp|svg\+xml))[^"']*["']/gi;
29
+ /**
30
+ * Strips known XSS vectors from an SVG string.
31
+ *
32
+ * @param svg - Raw SVG string (build-time or static source)
33
+ * @returns Sanitized SVG string safe for dangerouslySetInnerHTML
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * <div dangerouslySetInnerHTML={{ __html: sanitizeSvg(svgContent) }} />
38
+ * ```
39
+ */
40
+ export function sanitizeSvg(svg) {
41
+ return svg
42
+ .replace(SCRIPT_TAG_RE, '')
43
+ .replace(FOREIGN_OBJECT_RE, '')
44
+ .replace(EVENT_HANDLER_RE, '')
45
+ .replace(JAVASCRIPT_HREF_RE, '')
46
+ .replace(DATA_URI_HREF_RE, '');
47
+ }
@@ -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,CA0B7D"}
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,CAkB7D"}
@@ -49,13 +49,6 @@ export function useBillingVisibility() {
49
49
  const shouldHide = !isAvailable;
50
50
  const isLoading = billingStatus === 'initializing';
51
51
  const isReady = isAvailable && billingStatus === 'ready';
52
- console.log('[useBillingVisibility]', {
53
- billingStatus,
54
- isAvailable,
55
- shouldHide,
56
- isLoading,
57
- isReady,
58
- });
59
52
  return {
60
53
  shouldHide,
61
54
  isLoading,
@@ -1,7 +1,5 @@
1
1
  import type { CrudAPI, dndevSchema, Entity } from '@donotdev/core';
2
- type BackendType = 'firestore' | 'functions';
3
2
  interface UseCrudSafeOptions<T> {
4
- backend?: BackendType;
5
3
  schema?: dndevSchema<T>;
6
4
  entity?: Entity;
7
5
  staleTime?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"useCrudSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useCrudSafe.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAInE,KAAK,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAE7C,UAAU,kBAAkB,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAkBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EACrC,kBAAkB,EAAE,MAAM,GAAG,MAAM,EACnC,OAAO,GAAE,kBAAkB,CAAC,CAAC,CAAM,GAClC,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":"AAsCA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGnE,UAAU,kBAAkB,CAAC,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAkBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EACrC,kBAAkB,EAAE,MAAM,GAAG,MAAM,EACnC,OAAO,GAAE,kBAAkB,CAAC,CAAC,CAAM,GAClC,OAAO,CAAC,CAAC,CAAC,CAKZ;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,SAAoC,CAAC"}
@@ -12,15 +12,17 @@ declare const DEGRADED_FORM_STORE_STATE: {
12
12
  readonly setError: () => void;
13
13
  readonly reset: () => void;
14
14
  readonly cleanup: () => void;
15
- readonly setIsDirty: () => void;
15
+ readonly setIsDirty: (_formId: string, _isDirty: boolean) => void;
16
16
  readonly hasDirtyForms: () => boolean;
17
- readonly getDirtyFormIds: () => never[];
17
+ readonly getDirtyFormIds: () => string[];
18
18
  readonly getStatus: () => "idle";
19
19
  readonly isLoading: () => boolean;
20
20
  readonly getUploadProgress: () => number;
21
21
  readonly getError: () => null;
22
22
  readonly getIsDirty: () => boolean;
23
23
  };
24
+ /** Minimal shape shared between the real FormStore state and the degraded fallback */
25
+ type FormStoreLike = typeof DEGRADED_FORM_STORE_STATE;
24
26
  /**
25
27
  * Check if FormStore is available
26
28
  */
@@ -38,22 +40,9 @@ export declare const isFormStoreAvailable: boolean;
38
40
  * // Always safe to call - returns false when degraded
39
41
  * ```
40
42
  */
41
- export declare function useFormStoreSafe<T>(selector: (state: any) => T): T;
43
+ export declare function useFormStoreSafe<T>(selector: (state: FormStoreLike) => T): T;
42
44
  export declare namespace useFormStoreSafe {
43
45
  var getState: () => typeof DEGRADED_FORM_STORE_STATE;
44
46
  }
45
- /**
46
- * Check if any forms are dirty (safe version).
47
- * Returns false if CRUD package not available.
48
- */
49
- export declare function useHasDirtyFormsSafe(): boolean;
50
- /**
51
- * Check if navigation should be blocked (safe version).
52
- * Returns a function that checks FormStore and shows confirmation if needed.
53
- *
54
- * @param message - Confirmation message
55
- * @returns Promise<boolean> - true if navigation should proceed
56
- */
57
- export declare function checkFormNavigationSafe(message?: string): Promise<boolean>;
58
47
  export {};
59
48
  //# sourceMappingURL=useFormStoreSafe.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFormStoreSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useFormStoreSafe.ts"],"names":[],"mappings":"AA8BA;;;GAGG;AACH,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;CAqBrB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,oBAAoB,SAAyC,CAAC;AAE3E;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAKlE;yBALe,gBAAgB;wBAmBA,OAAO,yBAAyB;;AAOhE;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAG9C;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,SAA4C,GAClD,OAAO,CAAC,OAAO,CAAC,CAUlB"}
1
+ {"version":3,"file":"useFormStoreSafe.d.ts","sourceRoot":"","sources":["../../src/utils/useFormStoreSafe.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,QAAA,MAAM,yBAAyB;;;;;;;;;;mCAYP,MAAM,YAAY,OAAO;;oCAElB,MAAM,EAAE;;;;;;CAO7B,CAAC;AAEX,sFAAsF;AACtF,KAAK,aAAa,GAAG,OAAO,yBAAyB,CAAC;AAQtD;;GAEG;AACH,eAAO,MAAM,oBAAoB,SAAyC,CAAC;AAE3E;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,CAAC,GAAG,CAAC,CAK5E;yBALe,gBAAgB;wBAaA,OAAO,yBAAyB"}
@@ -11,16 +11,13 @@
11
11
  *
12
12
  * @see packages/ui/src/utils/useAuthSafe.ts for pattern reference
13
13
  * @see docs/development/GRACEFUL_DEGRADATION.md
14
- * @version 0.0.1
14
+ * @version 0.0.2
15
15
  * @since 0.0.1
16
16
  * @author AMBROISE PARK Consulting
17
17
  */
18
18
  import * as crudModule from '@donotdev/crud';
19
19
  // Sync import - bundler aliases to empty module if not installed
20
20
  // Decision made ONCE at module load time, never changes
21
- // Extract useFormStore if available (undefined if package not installed/aliased)
22
- // Zustand stores have both the hook and getState method
23
- const realUseFormStore = crudModule?.useFormStore;
24
21
  /**
25
22
  * Degraded FormStore state - returned when CRUD package not installed
26
23
  * Matches FormStoreState & FormStoreActions interface
@@ -37,8 +34,8 @@ const DEGRADED_FORM_STORE_STATE = {
37
34
  reset: () => { },
38
35
  cleanup: () => { },
39
36
  // Dirty state management
40
- setIsDirty: () => { },
41
- hasDirtyForms: () => false, // Key method - returns false when degraded
37
+ setIsDirty: (_formId, _isDirty) => { },
38
+ hasDirtyForms: () => false,
42
39
  getDirtyFormIds: () => [],
43
40
  // Getters
44
41
  getStatus: () => 'idle',
@@ -47,6 +44,9 @@ const DEGRADED_FORM_STORE_STATE = {
47
44
  getError: () => null,
48
45
  getIsDirty: () => false,
49
46
  };
47
+ // Extract useFormStore if available (undefined if package not installed/aliased)
48
+ // Zustand stores have both the hook and getState method
49
+ const realUseFormStore = crudModule?.useFormStore;
50
50
  /**
51
51
  * Check if FormStore is available
52
52
  */
@@ -75,12 +75,6 @@ export function useFormStoreSafe(selector) {
75
75
  * Use this in non-React contexts or for one-time checks.
76
76
  *
77
77
  * @returns FormStore state, or degraded state if CRUD not available
78
- *
79
- * @example
80
- * ```tsx
81
- * const state = useFormStoreSafe.getState();
82
- * const hasDirty = state.hasDirtyForms(); // Always safe to call
83
- * ```
84
78
  */
85
79
  useFormStoreSafe.getState = () => {
86
80
  if (realUseFormStore && typeof realUseFormStore.getState === 'function') {
@@ -88,28 +82,3 @@ useFormStoreSafe.getState = () => {
88
82
  }
89
83
  return DEGRADED_FORM_STORE_STATE;
90
84
  };
91
- /**
92
- * Check if any forms are dirty (safe version).
93
- * Returns false if CRUD package not available.
94
- */
95
- export function useHasDirtyFormsSafe() {
96
- const hasDirtyForms = useFormStoreSafe((state) => state.hasDirtyForms());
97
- return hasDirtyForms();
98
- }
99
- /**
100
- * Check if navigation should be blocked (safe version).
101
- * Returns a function that checks FormStore and shows confirmation if needed.
102
- *
103
- * @param message - Confirmation message
104
- * @returns Promise<boolean> - true if navigation should proceed
105
- */
106
- export async function checkFormNavigationSafe(message = 'You have unsaved changes. Discard them?') {
107
- const state = useFormStoreSafe.getState();
108
- const hasDirtyForms = state.hasDirtyForms();
109
- if (!hasDirtyForms)
110
- return true; // No dirty forms = allow navigation
111
- if (typeof window !== 'undefined' && window.confirm) {
112
- return window.confirm(message);
113
- }
114
- return true;
115
- }
@@ -1,16 +1,27 @@
1
- import type { LayoutConfig } from '@donotdev/core';
1
+ import type { PageAuth, LayoutConfig } from '@donotdev/core';
2
+ import type { ComponentType } from 'react';
3
+ /** Lazy-loadable page component factory or Vite glob string reference */
4
+ type PageComponentFactory = (() => Promise<{
5
+ default: ComponentType;
6
+ }>) | string;
2
7
  /**
3
8
  * Route group from useRouteDiscovery
4
9
  */
5
10
  export interface RouteGroup {
6
11
  label: string;
7
- icon?: any;
8
- routes: Array<{
9
- path: string;
10
- component: any;
11
- auth?: any;
12
- [key: string]: any;
13
- }>;
12
+ icon?: unknown;
13
+ routes: Array<RouteGroupEntry>;
14
+ }
15
+ /** Minimal route entry shape accepted by createAppRouter */
16
+ export interface RouteGroupEntry {
17
+ path: string;
18
+ component: PageComponentFactory;
19
+ auth?: boolean | PageAuth;
20
+ label?: string;
21
+ importPath?: string;
22
+ exportName?: string;
23
+ meta?: unknown;
24
+ icon?: unknown;
14
25
  }
15
26
  /**
16
27
  * Options for createAppRouter
@@ -1 +1 @@
1
- {"version":3,"file":"AppRoutes.d.ts","sourceRoot":"","sources":["../../src/vite-routing/AppRoutes.tsx"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAyF7D;;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"}
1
+ {"version":3,"file":"AppRoutes.d.ts","sourceRoot":"","sources":["../../src/vite-routing/AppRoutes.tsx"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM7D,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,OAAO,CAAC;AAGhE,yEAAyE;AACzE,KAAK,oBAAoB,GAAG,CAAC,MAAM,OAAO,CAAC;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC,GAAG,MAAM,CAAC;AA+EjF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;CAChC;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,oBAAoB,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;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"}
@@ -108,9 +108,6 @@ function parseAuthConfig(auth) {
108
108
  if (typeof auth === 'object' && auth !== null) {
109
109
  return auth; // Return PageAuth object as-is
110
110
  }
111
- if (typeof auth === 'function') {
112
- return false; // Functions are not valid auth configs
113
- }
114
111
  return false; // Default to public
115
112
  }
116
113
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"RootLayout.d.ts","sourceRoot":"","sources":["../../src/vite-routing/RootLayout.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA0LnD;;GAEG;AACH,UAAU,oBAAoB;IAC5B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,oBAAoB,2CAgC1D"}
1
+ {"version":3,"file":"RootLayout.d.ts","sourceRoot":"","sources":["../../src/vite-routing/RootLayout.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAwLnD;;GAEG;AACH,UAAU,oBAAoB;IAC5B,2BAA2B;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,oBAAoB,2CAgC1D"}
@@ -51,21 +51,17 @@ const RedirectOverlay = lazy(() => import('../components/common/RedirectOverlay'
51
51
  function CustomScrollRestoration() {
52
52
  const location = useLocation();
53
53
  const scrollPositions = useRef(new Map());
54
- const isFirstRender = useRef(true);
54
+ const prevLocationKey = useRef(null);
55
55
  useEffect(() => {
56
- // Skip on first render (initial page load)
57
- if (isFirstRender.current) {
58
- isFirstRender.current = false;
59
- return;
60
- }
61
56
  const mainElement = document.querySelector('main[role="main"]');
62
57
  if (!mainElement)
63
58
  return;
64
- // Save current scroll position before navigating
65
- const currentKey = location.key;
66
- // Check if this is a back/forward navigation (location.state can indicate this)
67
- // For now, we'll use a simple heuristic: if we have a saved position, it's likely POP
68
- const savedPosition = scrollPositions.current.get(currentKey);
59
+ // Save scroll position of the page we're leaving (Item 89)
60
+ if (prevLocationKey.current) {
61
+ scrollPositions.current.set(prevLocationKey.current, mainElement.scrollTop);
62
+ }
63
+ // Check if this is a back/forward navigation (POP) by checking saved position
64
+ const savedPosition = scrollPositions.current.get(location.key);
69
65
  if (savedPosition !== undefined) {
70
66
  // POP navigation - restore scroll position
71
67
  requestAnimationFrame(() => {
@@ -75,11 +71,10 @@ function CustomScrollRestoration() {
75
71
  else {
76
72
  // PUSH navigation - scroll to top
77
73
  mainElement.scrollTop = 0;
78
- // Save this position for potential back navigation
79
- scrollPositions.current.set(currentKey, 0);
80
74
  }
81
- // Cleanup: Keep only last 10 positions to prevent memory leaks
82
- if (scrollPositions.current.size > 10) {
75
+ prevLocationKey.current = location.key;
76
+ // Cleanup: Keep only last 20 positions to prevent memory leaks
77
+ if (scrollPositions.current.size > 20) {
83
78
  const firstKey = scrollPositions.current.keys().next().value;
84
79
  if (firstKey) {
85
80
  scrollPositions.current.delete(firstKey);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@donotdev/ui",
3
- "version": "0.0.13",
3
+ "version": "0.0.15",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -44,24 +44,28 @@
44
44
  "scripts": {
45
45
  "dev": "tsc --noEmit --watch --listFiles false --listEmittedFiles false",
46
46
  "clean": "rimraf dist tsconfig.tsbuildinfo",
47
- "type-check": "tsc --noEmit"
47
+ "type-check": "bunx tsc --noEmit"
48
48
  },
49
49
  "dependencies": {
50
+ "@fontsource/inter": "^5.2.8",
51
+ "@fontsource/playfair-display": "^5.2.8",
52
+ "@fontsource/roboto": "^5.2.9",
53
+ "@fontsource/space-grotesk": "^5.2.10",
50
54
  "@hookform/resolvers": "^5.2.2",
51
55
  "react-helmet-async": "^2.0.5",
52
56
  "react-hook-form": "^7.71.1"
53
57
  },
54
58
  "peerDependencies": {
55
- "@donotdev/adv-comps": "^0.0.9",
56
- "@donotdev/auth": "^0.0.6",
57
- "@donotdev/billing": "^0.0.5",
58
- "@donotdev/components": "^0.0.15",
59
- "@donotdev/core": "^0.0.20",
60
- "@donotdev/crud": "^0.0.11",
61
- "@donotdev/firebase": "^0.0.9",
62
- "@donotdev/oauth": "^0.0.5",
63
- "firebase": "^12.8.0",
64
- "lucide-react": "^0.563.0",
59
+ "@donotdev/adv-comps": "^0.0.13",
60
+ "@donotdev/auth": "^0.0.9",
61
+ "@donotdev/billing": "^0.0.8",
62
+ "@donotdev/components": "^0.0.19",
63
+ "@donotdev/core": "^0.0.25",
64
+ "@donotdev/crud": "^0.0.16",
65
+ "@donotdev/firebase": "^0.0.12",
66
+ "@donotdev/oauth": "^0.0.8",
67
+ "firebase": "^12.9.0",
68
+ "lucide-react": "^0.574.0",
65
69
  "react": "^19.2.4",
66
70
  "react-dom": "^19.2.4",
67
71
  "react-router-dom": "^7.13.0",
@@ -1,206 +0,0 @@
1
- /* packages/ui/assets/fonts/fonts.css */
2
-
3
- @font-face {
4
- font-family: Roboto;
5
- font-style: normal;
6
- font-weight: 400;
7
- font-display: swap;
8
- src: url('/fonts/Roboto-400-latin.woff2') format('woff2');
9
- unicode-range: U+0000-00FF; /* Basic Latin - loads first for performance */
10
- }
11
-
12
- @font-face {
13
- font-family: Roboto;
14
- font-style: normal;
15
- font-weight: 700;
16
- font-display: swap;
17
- src: url('/fonts/Roboto-700-latin.woff2') format('woff2');
18
- unicode-range: U+0000-00FF; /* Basic Latin - loads first for performance */
19
- }
20
-
21
- /* ✅ CRITICAL: Extended character sets load on-demand when needed */
22
- /* These load automatically when browser encounters characters in these ranges */
23
- @font-face {
24
- font-family: Roboto;
25
- font-style: normal;
26
- font-weight: 400;
27
- font-display: swap;
28
- src: url('/fonts/Roboto-400-latin-ext.woff2') format('woff2');
29
- unicode-range:
30
- U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113,
31
- U+2C60-2C7F, U+A720-A7FF;
32
- }
33
-
34
- @font-face {
35
- font-family: Roboto;
36
- font-style: normal;
37
- font-weight: 700;
38
- font-display: swap;
39
- src: url('/fonts/Roboto-700-latin-ext.woff2') format('woff2');
40
- unicode-range:
41
- U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113,
42
- U+2C60-2C7F, U+A720-A7FF;
43
- }
44
-
45
- /* Cyrillic */
46
- @font-face {
47
- font-family: Roboto;
48
- font-style: normal;
49
- font-weight: 400;
50
- font-display: swap;
51
- src: url('/fonts/Roboto-400-cyrillic.woff2') format('woff2');
52
- unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
53
- }
54
-
55
- @font-face {
56
- font-family: Roboto;
57
- font-style: normal;
58
- font-weight: 700;
59
- font-display: swap;
60
- src: url('/fonts/Roboto-700-cyrillic.woff2') format('woff2');
61
- unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
62
- }
63
-
64
- /* Cyrillic Extended */
65
- @font-face {
66
- font-family: Roboto;
67
- font-style: normal;
68
- font-weight: 400;
69
- font-display: swap;
70
- src: url('/fonts/Roboto-400-cyrillic-ext.woff2') format('woff2');
71
- unicode-range:
72
- U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
73
- }
74
-
75
- @font-face {
76
- font-family: Roboto;
77
- font-style: normal;
78
- font-weight: 700;
79
- font-display: swap;
80
- src: url('/fonts/Roboto-700-cyrillic-ext.woff2') format('woff2');
81
- unicode-range:
82
- U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
83
- }
84
-
85
- /* Greek */
86
- @font-face {
87
- font-family: Roboto;
88
- font-style: normal;
89
- font-weight: 400;
90
- font-display: swap;
91
- src: url('/fonts/Roboto-400-greek.woff2') format('woff2');
92
- unicode-range: U+0370-03FF;
93
- }
94
-
95
- @font-face {
96
- font-family: Roboto;
97
- font-style: normal;
98
- font-weight: 700;
99
- font-display: swap;
100
- src: url('/fonts/Roboto-700-greek.woff2') format('woff2');
101
- unicode-range: U+0370-03FF;
102
- }
103
-
104
- /* Greek Extended */
105
- @font-face {
106
- font-family: Roboto;
107
- font-style: normal;
108
- font-weight: 400;
109
- font-display: swap;
110
- src: url('/fonts/Roboto-400-greek-ext.woff2') format('woff2');
111
- unicode-range: U+1F00-1FFF;
112
- }
113
-
114
- @font-face {
115
- font-family: Roboto;
116
- font-style: normal;
117
- font-weight: 700;
118
- font-display: swap;
119
- src: url('/fonts/Roboto-700-greek-ext.woff2') format('woff2');
120
- unicode-range: U+1F00-1FFF;
121
- }
122
-
123
- /* Vietnamese */
124
- @font-face {
125
- font-family: Roboto;
126
- font-style: normal;
127
- font-weight: 400;
128
- font-display: swap;
129
- src: url('/fonts/Roboto-400-vietnamese.woff2') format('woff2');
130
- unicode-range:
131
- U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1,
132
- U+01AF-01B0, U+1EA0-1EF9, U+20AB;
133
- }
134
-
135
- @font-face {
136
- font-family: Roboto;
137
- font-style: normal;
138
- font-weight: 700;
139
- font-display: swap;
140
- src: url('/fonts/Roboto-700-vietnamese.woff2') format('woff2');
141
- unicode-range:
142
- U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1,
143
- U+01AF-01B0, U+1EA0-1EF9, U+20AB;
144
- }
145
-
146
- /* ===========================
147
- Inter - Modern Sans-Serif (Variable Font)
148
- Weights: 400-700
149
- =========================== */
150
-
151
- /* Latin - loads first */
152
- @font-face {
153
- font-family: Inter;
154
- font-style: normal;
155
- font-weight: 400 700;
156
- font-display: swap; /* Changed from optional to swap - we preload this font */
157
- src: url('/fonts/Inter-latin.woff2') format('woff2');
158
- unicode-range:
159
- U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
160
- U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
161
- U+2215, U+FEFF, U+FFFD;
162
- }
163
-
164
- /* Latin Extended - on-demand */
165
- @font-face {
166
- font-family: Inter;
167
- font-style: normal;
168
- font-weight: 400 700;
169
- font-display: swap;
170
- src: url('/fonts/Inter-latin-ext.woff2') format('woff2');
171
- unicode-range:
172
- U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304,
173
- U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB,
174
- U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
175
- }
176
-
177
- /* ===========================
178
- Playfair Display - Serif (Variable Font)
179
- Weights: 400-700
180
- =========================== */
181
-
182
- /* Latin - loads first */
183
- @font-face {
184
- font-family: 'Playfair Display';
185
- font-style: normal;
186
- font-weight: 400 700;
187
- font-display: swap;
188
- src: url('/fonts/PlayfairDisplay-latin.woff2') format('woff2');
189
- unicode-range:
190
- U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
191
- U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212,
192
- U+2215, U+FEFF, U+FFFD;
193
- }
194
-
195
- /* Latin Extended - on-demand */
196
- @font-face {
197
- font-family: 'Playfair Display';
198
- font-style: normal;
199
- font-weight: 400 700;
200
- font-display: swap;
201
- src: url('/fonts/PlayfairDisplay-latin-ext.woff2') format('woff2');
202
- unicode-range:
203
- U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304,
204
- U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB,
205
- U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
206
- }
@@ -1,10 +0,0 @@
1
- /**
2
- * @fileoverview Navigate Component
3
- * @description Navigation component for routing. Provides programmatic navigation utilities for client-side and server-side rendering.
4
- *
5
- * @version 0.0.1
6
- * @since 0.0.1
7
- * @author AMBROISE PARK Consulting
8
- */
9
- export {};
10
- //# sourceMappingURL=Navigate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Navigate.d.ts","sourceRoot":"","sources":["../../src/routing/Navigate.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC"}
@@ -1,10 +0,0 @@
1
- // packages/ui/src/routing/Navigate.tsx
2
- /**
3
- * @fileoverview Navigate Component
4
- * @description Navigation component for routing. Provides programmatic navigation utilities for client-side and server-side rendering.
5
- *
6
- * @version 0.0.1
7
- * @since 0.0.1
8
- * @author AMBROISE PARK Consulting
9
- */
10
- export {};