@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.
- package/dist/components/auth/AuthMenu.d.ts.map +1 -1
- package/dist/components/auth/AuthMenu.js +19 -20
- package/dist/components/common/FeatureCard.d.ts +3 -1
- package/dist/components/common/FeatureCard.d.ts.map +1 -1
- package/dist/components/common/FeatureCard.js +2 -2
- package/dist/components/common/ProgressBar.js +2 -2
- package/dist/components/common/TechBento.d.ts +14 -2
- package/dist/components/common/TechBento.d.ts.map +1 -1
- package/dist/components/common/TechBento.js +8 -9
- package/dist/components/cookie-consent/CookieConsent.d.ts.map +1 -1
- package/dist/components/cookie-consent/CookieConsent.js +3 -4
- package/dist/components/layout/components/DropdownNavigation.d.ts.map +1 -1
- package/dist/components/layout/components/DropdownNavigation.js +3 -12
- package/dist/components/layout/components/FloatingLanguageSwitcher.js +1 -1
- package/dist/components/layout/components/Notifications.d.ts +1 -3
- package/dist/components/layout/components/Notifications.d.ts.map +1 -1
- package/dist/components/layout/components/Notifications.js +4 -2
- package/dist/components/layout/components/header/AppBranding.d.ts.map +1 -1
- package/dist/components/layout/components/header/AppBranding.js +2 -1
- package/dist/components/layout/components/header/AppIcon.d.ts.map +1 -1
- package/dist/components/layout/components/header/AppIcon.js +5 -2
- package/dist/components/layout/components/header/CacheSettings.d.ts.map +1 -1
- package/dist/components/layout/components/header/CacheSettings.js +3 -1
- package/dist/components/layout/components/header/HeaderNavigation.d.ts +6 -0
- package/dist/components/layout/components/header/HeaderNavigation.d.ts.map +1 -1
- package/dist/components/layout/components/header/HeaderNavigation.js +12 -2
- package/dist/components/layout/components/index.d.ts +3 -0
- package/dist/components/layout/components/index.d.ts.map +1 -1
- package/dist/components/layout/components/index.js +3 -0
- package/dist/components/license/LicenseWatermark.d.ts.map +1 -1
- package/dist/components/license/LicenseWatermark.js +3 -1
- package/dist/crud/components/CrudCardLink.d.ts +17 -0
- package/dist/crud/components/CrudCardLink.d.ts.map +1 -0
- package/dist/crud/components/CrudCardLink.js +17 -0
- package/dist/crud/components/EntityCardList.d.ts +1 -1
- package/dist/crud/components/EntityCardList.d.ts.map +1 -1
- package/dist/crud/components/EntityCardList.js +38 -90
- package/dist/crud/components/EntityDisplayRenderer.d.ts +1 -1
- package/dist/crud/components/EntityDisplayRenderer.d.ts.map +1 -1
- package/dist/crud/components/EntityDisplayRenderer.js +11 -3
- package/dist/crud/components/EntityFormRenderer.d.ts +1 -1
- package/dist/crud/components/EntityFormRenderer.d.ts.map +1 -1
- package/dist/crud/components/EntityFormRenderer.js +34 -40
- package/dist/crud/components/EntityList.d.ts +1 -1
- package/dist/crud/components/EntityList.d.ts.map +1 -1
- package/dist/crud/components/EntityList.js +1 -1
- package/dist/crud/components/EntityRecommendations.d.ts +29 -0
- package/dist/crud/components/EntityRecommendations.d.ts.map +1 -0
- package/dist/crud/components/EntityRecommendations.js +32 -0
- package/dist/crud/components/index.d.ts +2 -1
- package/dist/crud/components/index.d.ts.map +1 -1
- package/dist/crud/components/index.js +1 -0
- package/dist/dndev.css +1021 -196
- package/dist/index.js +4 -4
- package/dist/internal/common/RouteErrorFallback.d.ts.map +1 -1
- package/dist/internal/devtools/components/AuthDebugButton.js +1 -1
- package/dist/internal/devtools/components/DesignTab.d.ts.map +1 -1
- package/dist/internal/devtools/components/DesignTab.js +3 -2
- package/dist/internal/devtools/components/LayoutReset.d.ts.map +1 -1
- package/dist/internal/devtools/components/LayoutReset.js +2 -0
- package/dist/internal/devtools/components/StoresTab.d.ts.map +1 -1
- package/dist/internal/devtools/components/StoresTab.js +3 -0
- package/dist/internal/devtools/utils/envVarDiscovery.d.ts +1 -0
- package/dist/internal/devtools/utils/envVarDiscovery.d.ts.map +1 -1
- package/dist/internal/devtools/utils/envVarDiscovery.js +5 -0
- package/dist/internal/devtools/utils/virtualModuleInspector.d.ts.map +1 -1
- package/dist/internal/devtools/utils/virtualModuleInspector.js +27 -21
- package/dist/internal/initializers/BaseStoresInitializer.d.ts.map +1 -1
- package/dist/internal/initializers/BaseStoresInitializer.js +30 -6
- package/dist/internal/layout/components/AutoMetaTags.d.ts.map +1 -1
- package/dist/internal/layout/components/AutoMetaTags.js +10 -8
- package/dist/internal/layout/components/FontPreloadLinks.d.ts +16 -0
- package/dist/internal/layout/components/FontPreloadLinks.d.ts.map +1 -0
- package/dist/internal/layout/components/FontPreloadLinks.js +32 -0
- package/dist/internal/layout/components/PerformanceHints.d.ts +7 -12
- package/dist/internal/layout/components/PerformanceHints.d.ts.map +1 -1
- package/dist/internal/layout/components/PerformanceHints.js +8 -12
- package/dist/internal/layout/components/footer/useLegalLinks.d.ts +6 -5
- package/dist/internal/layout/components/footer/useLegalLinks.d.ts.map +1 -1
- package/dist/internal/layout/components/footer/useLegalLinks.js +6 -2
- package/dist/internal/layout/zones/DnDevFooter.d.ts +6 -0
- package/dist/internal/layout/zones/DnDevFooter.d.ts.map +1 -1
- package/dist/internal/layout/zones/DnDevFooter.js +10 -4
- package/dist/internal/layout/zones/DnDevHeader.d.ts +7 -0
- package/dist/internal/layout/zones/DnDevHeader.d.ts.map +1 -1
- package/dist/internal/layout/zones/DnDevHeader.js +7 -0
- package/dist/internal/layout/zones/DnDevMergedBar.d.ts +7 -0
- package/dist/internal/layout/zones/DnDevMergedBar.d.ts.map +1 -1
- package/dist/internal/layout/zones/DnDevMergedBar.js +9 -0
- package/dist/internal/layout/zones/DnDevSidebar.d.ts +4 -0
- package/dist/internal/layout/zones/DnDevSidebar.d.ts.map +1 -1
- package/dist/internal/layout/zones/DnDevSidebar.js +13 -1
- package/dist/internal/providers/NavigationProvider.d.ts.map +1 -1
- package/dist/internal/providers/NavigationProvider.js +3 -5
- package/dist/next.d.ts +1 -0
- package/dist/next.d.ts.map +1 -1
- package/dist/next.js +1 -0
- package/dist/providers/ViteAppProviders.d.ts.map +1 -1
- package/dist/providers/ViteAppProviders.js +3 -5
- package/dist/routing/AuthGuard.d.ts +1 -1
- package/dist/routing/AuthGuard.d.ts.map +1 -1
- package/dist/routing/AuthGuard.js +3 -1
- package/dist/routing/GoTo.d.ts.map +1 -1
- package/dist/routing/GoTo.js +3 -1
- package/dist/routing/GoToDialog.d.ts.map +1 -1
- package/dist/routing/GoToDialog.js +2 -7
- package/dist/routing/GoToInput.d.ts +0 -3
- package/dist/routing/GoToInput.d.ts.map +1 -1
- package/dist/routing/GoToInput.js +8 -7
- package/dist/routing/Link.js +1 -1
- package/dist/routing/NavigationItem.d.ts +29 -7
- package/dist/routing/NavigationItem.d.ts.map +1 -1
- package/dist/routing/NavigationItem.js +22 -6
- package/dist/routing/hooks/hooks.next.js +1 -1
- package/dist/routing/hooks/hooks.vite.js +1 -1
- package/dist/routing/hooks/useNavigate.next.d.ts +1 -1
- package/dist/routing/hooks/useNavigate.next.d.ts.map +1 -1
- package/dist/routing/hooks/useNavigate.next.js +1 -7
- package/dist/routing/hooks/useNavigate.vite.d.ts +1 -1
- package/dist/routing/hooks/useNavigate.vite.d.ts.map +1 -1
- package/dist/routing/hooks/useNavigate.vite.js +1 -7
- package/dist/routing/hooks/useRedirectGuard.next.d.ts.map +1 -1
- package/dist/routing/hooks/useRedirectGuard.next.js +9 -8
- package/dist/routing/hooks/useRedirectGuard.vite.d.ts.map +1 -1
- package/dist/routing/hooks/useRedirectGuard.vite.js +9 -8
- package/dist/routing/hooks/useSearchParams.next.d.ts +18 -1
- package/dist/routing/hooks/useSearchParams.next.d.ts.map +1 -1
- package/dist/routing/hooks/useSearchParams.next.js +16 -0
- package/dist/routing/hooks/useSearchParams.vite.d.ts +16 -0
- package/dist/routing/hooks/useSearchParams.vite.d.ts.map +1 -1
- package/dist/routing/hooks/useSearchParams.vite.js +17 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/index.js +2 -0
- package/dist/routing/useNavigation.d.ts +30 -0
- package/dist/routing/useNavigation.d.ts.map +1 -1
- package/dist/routing/useNavigation.js +40 -3
- package/dist/routing/useRouteDiscovery.d.ts +6 -17
- package/dist/routing/useRouteDiscovery.d.ts.map +1 -1
- package/dist/routing/useRouteDiscovery.js +16 -9
- package/dist/styles/index.css +284 -88
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/sanitizeSvg.d.ts +13 -0
- package/dist/utils/sanitizeSvg.d.ts.map +1 -0
- package/dist/utils/sanitizeSvg.js +47 -0
- package/dist/utils/useBillingVisibility.d.ts.map +1 -1
- package/dist/utils/useBillingVisibility.js +0 -7
- package/dist/utils/useCrudSafe.d.ts +0 -2
- package/dist/utils/useCrudSafe.d.ts.map +1 -1
- package/dist/utils/useFormStoreSafe.d.ts +5 -16
- package/dist/utils/useFormStoreSafe.d.ts.map +1 -1
- package/dist/utils/useFormStoreSafe.js +6 -37
- package/dist/vite-routing/AppRoutes.d.ts +19 -8
- package/dist/vite-routing/AppRoutes.d.ts.map +1 -1
- package/dist/vite-routing/AppRoutes.js +0 -3
- package/dist/vite-routing/RootLayout.d.ts.map +1 -1
- package/dist/vite-routing/RootLayout.js +10 -15
- package/package.json +16 -12
- package/assets/fonts/fonts.css +0 -206
- package/dist/routing/Navigate.d.ts +0 -10
- package/dist/routing/Navigate.d.ts.map +0 -1
- package/dist/routing/Navigate.js +0 -10
package/dist/utils/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/utils/index.js
CHANGED
|
@@ -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,
|
|
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 +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;
|
|
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: () =>
|
|
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:
|
|
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":"
|
|
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.
|
|
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,
|
|
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?:
|
|
8
|
-
routes: Array<
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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,
|
|
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;
|
|
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
|
|
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
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
82
|
-
|
|
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.
|
|
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.
|
|
56
|
-
"@donotdev/auth": "^0.0.
|
|
57
|
-
"@donotdev/billing": "^0.0.
|
|
58
|
-
"@donotdev/components": "^0.0.
|
|
59
|
-
"@donotdev/core": "^0.0.
|
|
60
|
-
"@donotdev/crud": "^0.0.
|
|
61
|
-
"@donotdev/firebase": "^0.0.
|
|
62
|
-
"@donotdev/oauth": "^0.0.
|
|
63
|
-
"firebase": "^12.
|
|
64
|
-
"lucide-react": "^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",
|
package/assets/fonts/fonts.css
DELETED
|
@@ -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"}
|
package/dist/routing/Navigate.js
DELETED
|
@@ -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 {};
|