@sudobility/components 4.0.109 → 4.0.111

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 (57) hide show
  1. package/dist/core/auth/ProtectedRoute.d.ts +51 -0
  2. package/dist/core/auth/ProtectedRoute.d.ts.map +1 -0
  3. package/dist/core/auth/index.d.ts +6 -0
  4. package/dist/core/auth/index.d.ts.map +1 -0
  5. package/dist/core/error/DetailErrorState.d.ts +64 -0
  6. package/dist/core/error/DetailErrorState.d.ts.map +1 -0
  7. package/dist/core/error/index.d.ts +6 -0
  8. package/dist/core/error/index.d.ts.map +1 -0
  9. package/dist/core/i18n-routing/LanguageValidator.d.ts +47 -0
  10. package/dist/core/i18n-routing/LanguageValidator.d.ts.map +1 -0
  11. package/dist/core/i18n-routing/LocalizedLink.d.ts +35 -0
  12. package/dist/core/i18n-routing/LocalizedLink.d.ts.map +1 -0
  13. package/dist/core/i18n-routing/index.d.ts +42 -0
  14. package/dist/core/i18n-routing/index.d.ts.map +1 -0
  15. package/dist/core/index.d.ts +4 -0
  16. package/dist/core/index.d.ts.map +1 -1
  17. package/dist/core/theme/index.d.ts +34 -0
  18. package/dist/core/theme/index.d.ts.map +1 -0
  19. package/dist/core/theme/theme-context.d.ts +39 -0
  20. package/dist/core/theme/theme-context.d.ts.map +1 -0
  21. package/dist/core/theme/types.d.ts +59 -0
  22. package/dist/core/theme/types.d.ts.map +1 -0
  23. package/dist/hooks/index.d.ts +12 -0
  24. package/dist/hooks/index.d.ts.map +1 -0
  25. package/dist/hooks/useLocalizedNavigate.d.ts +55 -0
  26. package/dist/hooks/useLocalizedNavigate.d.ts.map +1 -0
  27. package/dist/hooks/useRoutePerformance.d.ts +11 -0
  28. package/dist/hooks/useRoutePerformance.d.ts.map +1 -0
  29. package/dist/index.d.ts +1 -5
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.esm.js +5708 -5052
  32. package/dist/index.umd.js +20 -11
  33. package/dist/optimization/index.d.ts +1 -0
  34. package/dist/optimization/index.d.ts.map +1 -1
  35. package/dist/optimization/web-vitals.d.ts +62 -0
  36. package/dist/optimization/web-vitals.d.ts.map +1 -0
  37. package/dist/ui/toast/Toast.d.ts +7 -0
  38. package/dist/ui/toast/Toast.d.ts.map +1 -0
  39. package/dist/ui/toast/ToastContainer.d.ts +7 -0
  40. package/dist/ui/toast/ToastContainer.d.ts.map +1 -0
  41. package/dist/ui/toast/index.d.ts +43 -0
  42. package/dist/ui/toast/index.d.ts.map +1 -0
  43. package/dist/ui/toast/toast-context.d.ts +8 -0
  44. package/dist/ui/toast/toast-context.d.ts.map +1 -0
  45. package/dist/ui/toast/types.d.ts +46 -0
  46. package/dist/ui/toast/types.d.ts.map +1 -0
  47. package/dist/ui/toast/useToast.d.ts +24 -0
  48. package/dist/ui/toast/useToast.d.ts.map +1 -0
  49. package/dist/utils/analytics-utils.d.ts +84 -0
  50. package/dist/utils/analytics-utils.d.ts.map +1 -0
  51. package/dist/utils/error-utils.d.ts +47 -0
  52. package/dist/utils/error-utils.d.ts.map +1 -0
  53. package/dist/utils/index.d.ts +2 -0
  54. package/dist/utils/index.d.ts.map +1 -1
  55. package/package.json +1 -1
  56. package/dist/ui/toast.d.ts +0 -47
  57. package/dist/ui/toast.d.ts.map +0 -1
@@ -0,0 +1,51 @@
1
+ import { ReactNode } from 'react';
2
+ export interface ProtectedRouteProps {
3
+ children: ReactNode;
4
+ /**
5
+ * Whether the user is authenticated
6
+ */
7
+ isAuthenticated: boolean;
8
+ /**
9
+ * Whether authentication status is still being determined
10
+ */
11
+ isLoading?: boolean;
12
+ /**
13
+ * Path to redirect to when not authenticated
14
+ * Use ':lang' placeholder for language parameter
15
+ * @default '/:lang' or '/en' if no lang param
16
+ */
17
+ redirectPath?: string;
18
+ /**
19
+ * Custom loading component
20
+ */
21
+ loadingComponent?: ReactNode;
22
+ /**
23
+ * Custom fallback when not authenticated (before redirect)
24
+ */
25
+ fallback?: ReactNode;
26
+ }
27
+ /**
28
+ * Route wrapper that protects content behind authentication.
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * // Basic usage
33
+ * const { user, loading } = useAuth();
34
+ *
35
+ * <ProtectedRoute isAuthenticated={!!user} isLoading={loading}>
36
+ * <Dashboard />
37
+ * </ProtectedRoute>
38
+ *
39
+ * // With custom redirect
40
+ * <ProtectedRoute
41
+ * isAuthenticated={!!user}
42
+ * isLoading={loading}
43
+ * redirectPath="/:lang/login"
44
+ * >
45
+ * <Dashboard />
46
+ * </ProtectedRoute>
47
+ * ```
48
+ */
49
+ export declare function ProtectedRoute({ children, isAuthenticated, isLoading, redirectPath, loadingComponent, fallback, }: ProtectedRouteProps): React.ReactElement | null;
50
+ export default ProtectedRoute;
51
+ //# sourceMappingURL=ProtectedRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtectedRoute.d.ts","sourceRoot":"","sources":["../../../src/core/auth/ProtectedRoute.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAaD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,eAAe,EACf,SAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,QAAe,GAChB,EAAE,mBAAmB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAyBjD;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Authentication-related routing components
3
+ */
4
+ export { ProtectedRoute } from './ProtectedRoute';
5
+ export type { ProtectedRouteProps } from './ProtectedRoute';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { ReactNode } from 'react';
2
+ export interface DetailErrorStateProps {
3
+ /**
4
+ * Error title
5
+ */
6
+ title?: string;
7
+ /**
8
+ * Error message/description
9
+ */
10
+ message?: string;
11
+ /**
12
+ * Retry callback
13
+ */
14
+ onRetry?: () => void;
15
+ /**
16
+ * Whether a retry is in progress
17
+ */
18
+ isRetrying?: boolean;
19
+ /**
20
+ * Custom retry button text
21
+ * @default 'Retry'
22
+ */
23
+ retryText?: string;
24
+ /**
25
+ * Custom loading text shown during retry
26
+ * @default 'Loading...'
27
+ */
28
+ loadingText?: string;
29
+ /**
30
+ * Custom icon to display (defaults to warning triangle)
31
+ */
32
+ icon?: ReactNode;
33
+ /**
34
+ * Additional className for the container
35
+ */
36
+ className?: string;
37
+ }
38
+ /**
39
+ * Error state display component with optional retry functionality.
40
+ *
41
+ * @example
42
+ * ```tsx
43
+ * // Basic usage
44
+ * <DetailErrorState
45
+ * title="Something went wrong"
46
+ * message="Unable to load data from the server."
47
+ * onRetry={() => refetch()}
48
+ * isRetrying={isRefetching}
49
+ * />
50
+ *
51
+ * // With translations
52
+ * const { t } = useTranslation();
53
+ * <DetailErrorState
54
+ * title={t('errors.serverDown.title')}
55
+ * message={t('errors.serverDown.message')}
56
+ * retryText={t('common.retry')}
57
+ * loadingText={t('common.loading')}
58
+ * onRetry={handleRetry}
59
+ * />
60
+ * ```
61
+ */
62
+ export declare function DetailErrorState({ title, message, onRetry, isRetrying, retryText, loadingText, icon, className, }: DetailErrorStateProps): React.ReactElement;
63
+ export default DetailErrorState;
64
+ //# sourceMappingURL=DetailErrorState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailErrorState.d.ts","sourceRoot":"","sources":["../../../src/core/error/DetailErrorState.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgDD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAA8B,EAC9B,OAA2D,EAC3D,OAAO,EACP,UAAkB,EAClB,SAAmB,EACnB,WAA0B,EAC1B,IAAI,EACJ,SAAc,GACf,EAAE,qBAAqB,GAAG,KAAK,CAAC,YAAY,CA6B5C;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Error display components
3
+ */
4
+ export { DetailErrorState } from './DetailErrorState';
5
+ export type { DetailErrorStateProps } from './DetailErrorState';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/error/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Language validator route component for i18n routing
3
+ * Validates the language parameter and syncs with i18next
4
+ */
5
+ export interface LanguageValidatorProps {
6
+ /**
7
+ * Function to check if a language code is supported
8
+ * Required to validate against your app's supported languages
9
+ */
10
+ isLanguageSupported: (lang: string) => boolean;
11
+ /**
12
+ * Default language to redirect to when invalid
13
+ * @default 'en'
14
+ */
15
+ defaultLanguage?: string;
16
+ /**
17
+ * localStorage key for persisting language preference
18
+ * @default 'language'
19
+ */
20
+ storageKey?: string;
21
+ /**
22
+ * Custom fallback component to render instead of null during redirect
23
+ */
24
+ fallback?: React.ReactNode;
25
+ }
26
+ /**
27
+ * Route wrapper that validates the language parameter and syncs i18n.
28
+ * Use this as a parent route to wrap all language-prefixed routes.
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * // In your router config
33
+ * const router = createBrowserRouter([
34
+ * {
35
+ * path: '/:lang',
36
+ * element: <LanguageValidator isLanguageSupported={isLangSupported} />,
37
+ * children: [
38
+ * { path: '', element: <HomePage /> },
39
+ * { path: 'about', element: <AboutPage /> },
40
+ * ],
41
+ * },
42
+ * ]);
43
+ * ```
44
+ */
45
+ export declare function LanguageValidator({ isLanguageSupported, defaultLanguage, storageKey, fallback, }: LanguageValidatorProps): React.ReactElement | null;
46
+ export default LanguageValidator;
47
+ //# sourceMappingURL=LanguageValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageValidator.d.ts","sourceRoot":"","sources":["../../../src/core/i18n-routing/LanguageValidator.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,mBAAmB,EACnB,eAAsB,EACtB,UAAuB,EACvB,QAAe,GAChB,EAAE,sBAAsB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CA+BpD;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { LinkProps } from 'react-router-dom';
2
+ export interface LocalizedLinkProps extends Omit<LinkProps, 'to'> {
3
+ to: string;
4
+ /**
5
+ * Optional specific language override
6
+ */
7
+ language?: string;
8
+ /**
9
+ * Function to check if a language code is supported
10
+ * If not provided, any 2-letter code is considered valid
11
+ */
12
+ isLanguageSupported?: (lang: string) => boolean;
13
+ /**
14
+ * Default language to use when none is detected
15
+ * @default 'en'
16
+ */
17
+ defaultLanguage?: string;
18
+ }
19
+ /**
20
+ * A Link component that automatically adds the current language prefix to paths.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * // Current URL: /en/dashboard
25
+ * <LocalizedLink to="/about">About</LocalizedLink>
26
+ * // Renders: <a href="/en/about">About</a>
27
+ *
28
+ * // With language override
29
+ * <LocalizedLink to="/about" language="fr">About (French)</LocalizedLink>
30
+ * // Renders: <a href="/fr/about">About (French)</a>
31
+ * ```
32
+ */
33
+ export declare function LocalizedLink({ to, language, children, isLanguageSupported, defaultLanguage, ...props }: LocalizedLinkProps): React.ReactElement;
34
+ export default LocalizedLink;
35
+ //# sourceMappingURL=LocalizedLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalizedLink.d.ts","sourceRoot":"","sources":["../../../src/core/i18n-routing/LocalizedLink.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AASD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,EAC5B,EAAE,EACF,QAAQ,EACR,QAAQ,EACR,mBAAgD,EAChD,eAAsB,EACtB,GAAG,KAAK,EACT,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAkBzC;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * i18n routing components and utilities
3
+ *
4
+ * Components and hooks for language-aware routing in React applications.
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * import {
9
+ * LocalizedLink,
10
+ * LanguageValidator,
11
+ * useLocalizedNavigate,
12
+ * } from '@sudobility/components/core/i18n-routing';
13
+ *
14
+ * // Define your supported languages
15
+ * const LANGUAGES = ['en', 'es', 'fr', 'de'] as const;
16
+ * const isSupported = (lang: string) => LANGUAGES.includes(lang as any);
17
+ *
18
+ * // Use in router
19
+ * const router = createBrowserRouter([
20
+ * {
21
+ * path: '/:lang',
22
+ * element: <LanguageValidator isLanguageSupported={isSupported} />,
23
+ * children: [
24
+ * { path: '', element: <Home /> },
25
+ * ],
26
+ * },
27
+ * ]);
28
+ *
29
+ * // Use LocalizedLink
30
+ * <LocalizedLink to="/about" isLanguageSupported={isSupported}>About</LocalizedLink>
31
+ *
32
+ * // Use navigation hook
33
+ * const { navigate, switchLanguage } = useLocalizedNavigate({ isLanguageSupported: isSupported });
34
+ * ```
35
+ */
36
+ export { LocalizedLink } from './LocalizedLink';
37
+ export type { LocalizedLinkProps } from './LocalizedLink';
38
+ export { LanguageValidator } from './LanguageValidator';
39
+ export type { LanguageValidatorProps } from './LanguageValidator';
40
+ export { useLocalizedNavigate, addLanguageToPath, removeLanguageFromPath, } from '../../hooks/useLocalizedNavigate';
41
+ export type { UseLocalizedNavigateOptions, UseLocalizedNavigateReturn, } from '../../hooks/useLocalizedNavigate';
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/i18n-routing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAGlE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,kCAAkC,CAAC"}
@@ -16,4 +16,8 @@ export { SafeAppWrapper } from './SafeAppWrapper';
16
16
  export { SecurityProvider } from './SecurityProvider';
17
17
  export * from './icons';
18
18
  export * from './optimized';
19
+ export * from './i18n-routing';
20
+ export * from './auth';
21
+ export * from './error';
22
+ export * from './theme';
19
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,6BAA6B,EAC7B,KAAK,kCAAkC,EACvC,KAAK,UAAU,GAChB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,aAAa,EACb,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,WAAW,EACX,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,6BAA6B,EAC7B,KAAK,kCAAkC,EACvC,KAAK,UAAU,GAChB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,aAAa,EACb,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,WAAW,EACX,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAG5B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,QAAQ,CAAC;AAGvB,cAAc,SAAS,CAAC;AAGxB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Theme system for managing application appearance
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * import { ThemeProvider, useTheme, Theme, FontSize } from '@sudobility/components/core/theme';
7
+ *
8
+ * // Wrap your app
9
+ * function App() {
10
+ * return (
11
+ * <ThemeProvider defaultTheme={Theme.SYSTEM}>
12
+ * <YourApp />
13
+ * </ThemeProvider>
14
+ * );
15
+ * }
16
+ *
17
+ * // Use in components
18
+ * function ThemeToggle() {
19
+ * const { theme, setTheme, resolvedTheme } = useTheme();
20
+ *
21
+ * return (
22
+ * <select value={theme} onChange={(e) => setTheme(e.target.value as Theme)}>
23
+ * <option value={Theme.LIGHT}>Light</option>
24
+ * <option value={Theme.DARK}>Dark</option>
25
+ * <option value={Theme.SYSTEM}>System</option>
26
+ * </select>
27
+ * );
28
+ * }
29
+ * ```
30
+ */
31
+ export { ThemeProvider, ThemeContext, useTheme } from './theme-context';
32
+ export { Theme, FontSize } from './types';
33
+ export type { ThemeContextType, ThemeProviderProps } from './types';
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/theme/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { ThemeContextType, ThemeProviderProps } from './types';
2
+ export declare const ThemeContext: import('react').Context<ThemeContextType | undefined>;
3
+ /**
4
+ * Hook to access the theme context
5
+ *
6
+ * @returns Theme context value
7
+ * @throws Error if used outside ThemeProvider
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * const { theme, setTheme, resolvedTheme } = useTheme();
12
+ *
13
+ * // Toggle between light and dark
14
+ * <button onClick={() => setTheme(resolvedTheme === Theme.LIGHT ? Theme.DARK : Theme.LIGHT)}>
15
+ * Toggle Theme
16
+ * </button>
17
+ * ```
18
+ */
19
+ export declare function useTheme(): ThemeContextType;
20
+ /**
21
+ * Theme provider component that manages theme and font size preferences.
22
+ *
23
+ * @example
24
+ * ```tsx
25
+ * function App() {
26
+ * return (
27
+ * <ThemeProvider
28
+ * themeStorageKey="my-app-theme"
29
+ * defaultTheme={Theme.SYSTEM}
30
+ * >
31
+ * <YourApp />
32
+ * </ThemeProvider>
33
+ * );
34
+ * }
35
+ * ```
36
+ */
37
+ export declare function ThemeProvider({ children, themeStorageKey, fontSizeStorageKey, defaultTheme, defaultFontSize, }: ThemeProviderProps): React.ReactElement;
38
+ export default ThemeProvider;
39
+ //# sourceMappingURL=theme-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-context.d.ts","sourceRoot":"","sources":["../../../src/core/theme/theme-context.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAsBpE,eAAO,MAAM,YAAY,uDAExB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,IAAI,gBAAgB,CAM3C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,eAAyB,EACzB,kBAAgC,EAChC,YAA0B,EAC1B,eAAiC,GAClC,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAqGzC;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Theme system types
3
+ */
4
+ /**
5
+ * Available theme modes
6
+ */
7
+ export declare enum Theme {
8
+ LIGHT = "light",
9
+ DARK = "dark",
10
+ SYSTEM = "system"
11
+ }
12
+ /**
13
+ * Available font sizes
14
+ */
15
+ export declare enum FontSize {
16
+ SMALL = "small",
17
+ MEDIUM = "medium",
18
+ LARGE = "large"
19
+ }
20
+ /**
21
+ * Theme context value
22
+ */
23
+ export interface ThemeContextType {
24
+ theme: Theme;
25
+ fontSize: FontSize;
26
+ setTheme: (theme: Theme) => void;
27
+ setFontSize: (fontSize: FontSize) => void;
28
+ /**
29
+ * The actual theme being applied (resolves 'system' to 'light' or 'dark')
30
+ */
31
+ resolvedTheme: Theme.LIGHT | Theme.DARK;
32
+ }
33
+ /**
34
+ * Theme provider props
35
+ */
36
+ export interface ThemeProviderProps {
37
+ children: React.ReactNode;
38
+ /**
39
+ * Storage key for theme preference
40
+ * @default 'theme'
41
+ */
42
+ themeStorageKey?: string;
43
+ /**
44
+ * Storage key for font size preference
45
+ * @default 'font-size'
46
+ */
47
+ fontSizeStorageKey?: string;
48
+ /**
49
+ * Default theme
50
+ * @default Theme.LIGHT
51
+ */
52
+ defaultTheme?: Theme;
53
+ /**
54
+ * Default font size
55
+ * @default FontSize.MEDIUM
56
+ */
57
+ defaultFontSize?: FontSize;
58
+ }
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/theme/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,oBAAY,KAAK;IACf,KAAK,UAAU;IACf,IAAI,SAAS;IACb,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,oBAAY,QAAQ;IAClB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC1C;;OAEG;IACH,aAAa,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB;;;OAGG;IACH,eAAe,CAAC,EAAE,QAAQ,CAAC;CAC5B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Hooks
3
+ */
4
+ export { useClickOutside } from './useClickOutside';
5
+ export { useCodeLoader } from './useCodeLoader';
6
+ export { useFormSubmission, type UseFormSubmissionOptions, type UseFormSubmissionReturn, } from './useFormSubmission';
7
+ export { useToggle, type UseToggleReturn } from './useToggle';
8
+ export { useCopyToClipboard, useMultipleCopyToClipboard, type CopyToClipboardOptions, type CopyToClipboardResult, } from './useCopyToClipboard';
9
+ export { useLocalizedNavigate, addLanguageToPath, removeLanguageFromPath, } from './useLocalizedNavigate';
10
+ export type { UseLocalizedNavigateOptions, UseLocalizedNavigateReturn, } from './useLocalizedNavigate';
11
+ export { useRoutePerformance } from './useRoutePerformance';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Hook for language-aware navigation in i18n applications
3
+ */
4
+ /**
5
+ * Add language prefix to a path
6
+ */
7
+ export declare function addLanguageToPath(path: string, lang: string): string;
8
+ /**
9
+ * Remove language prefix from a path
10
+ * Assumes language codes are 2 lowercase letters, optionally followed by -xx
11
+ */
12
+ export declare function removeLanguageFromPath(path: string, isLanguageSupported?: (lang: string) => boolean): string;
13
+ export interface UseLocalizedNavigateOptions {
14
+ /**
15
+ * Function to check if a language code is supported
16
+ * If not provided, any 2-letter code is considered valid
17
+ */
18
+ isLanguageSupported?: (lang: string) => boolean;
19
+ /**
20
+ * Default language to use if none is detected
21
+ * @default 'en'
22
+ */
23
+ defaultLanguage?: string;
24
+ /**
25
+ * localStorage key for persisting language preference
26
+ * @default 'language'
27
+ */
28
+ storageKey?: string;
29
+ }
30
+ export interface UseLocalizedNavigateReturn {
31
+ /**
32
+ * Navigate to a path with the current language prefix
33
+ */
34
+ navigate: (to: string | number, options?: {
35
+ replace?: boolean;
36
+ state?: unknown;
37
+ }) => void;
38
+ /**
39
+ * Switch to a different language and navigate to the same page in that language
40
+ */
41
+ switchLanguage: (newLanguage: string, currentPath?: string) => void;
42
+ /**
43
+ * The current language
44
+ */
45
+ currentLanguage: string;
46
+ }
47
+ /**
48
+ * Hook for language-aware navigation
49
+ *
50
+ * @param options - Configuration options
51
+ * @returns Navigation functions and current language
52
+ */
53
+ export declare function useLocalizedNavigate(options?: UseLocalizedNavigateOptions): UseLocalizedNavigateReturn;
54
+ export default useLocalizedNavigate;
55
+ //# sourceMappingURL=useLocalizedNavigate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLocalizedNavigate.d.ts","sourceRoot":"","sources":["../../src/hooks/useLocalizedNavigate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAC9C,MAAM,CAcR;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,QAAQ,EAAE,CACR,EAAE,EAAE,MAAM,GAAG,MAAM,EACnB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,KAC7C,IAAI,CAAC;IACV;;OAEG;IACH,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,2BAAgC,GACxC,0BAA0B,CAmD5B;AAED,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Hook to track route change performance
3
+ * Measures time between route changes and reports to performance monitoring
4
+ */
5
+ /**
6
+ * Hook that tracks route change performance
7
+ * Measures the time between route changes and reports it
8
+ */
9
+ export declare function useRoutePerformance(): void;
10
+ export default useRoutePerformance;
11
+ //# sourceMappingURL=useRoutePerformance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRoutePerformance.d.ts","sourceRoot":"","sources":["../../src/hooks/useRoutePerformance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CA2B1C;AAED,eAAe,mBAAmB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -53,11 +53,7 @@ export * from './layout';
53
53
  export * from './seo';
54
54
  export * from './optimization';
55
55
  export * from './dev-tools';
56
- export { useClickOutside } from './hooks/useClickOutside';
57
- export { useCodeLoader } from './hooks/useCodeLoader';
58
- export { useFormSubmission, type UseFormSubmissionOptions, type UseFormSubmissionReturn, } from './hooks/useFormSubmission';
59
- export { useToggle, type UseToggleReturn } from './hooks/useToggle';
60
- export { useCopyToClipboard, useMultipleCopyToClipboard, type CopyToClipboardOptions, type CopyToClipboardResult, } from './hooks/useCopyToClipboard';
56
+ export * from './hooks';
61
57
  export { formatFileSize, convertFileSize, parseFileSize, } from './utils/formatFileSize';
62
58
  export * from './utils';
63
59
  export { getPerformanceMonitor, initializePerformanceMonitoring, type PerformanceMetrics, } from './optimization/performance-monitoring';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjC,cAAc,cAAc,CAAC;AAG7B,cAAc,SAAS,CAAC;AAGxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,cAAc,CAAC;AAG7B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,UAAU,CAAC;AAGzB,cAAc,SAAS,CAAC;AAGxB,cAAc,UAAU,CAAC;AAGzB,cAAc,eAAe,CAAC;AAG9B,cAAc,QAAQ,CAAC;AAGvB,cAAc,YAAY,CAAC;AAG3B,cAAc,OAAO,CAAC;AAGtB,cAAc,UAAU,CAAC;AAGzB,cAAc,OAAO,CAAC;AAGtB,cAAc,gBAAgB,CAAC;AAG/B,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,wBAAwB,CAAC;AAGhC,cAAc,SAAS,CAAC;AAGxB,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,KAAK,kBAAkB,GACxB,MAAM,uCAAuC,CAAC;AAY/C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;;;;;;AAEjC,wBAIE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjC,cAAc,cAAc,CAAC;AAG7B,cAAc,SAAS,CAAC;AAGxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,WAAW,CAAC;AAC1B,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,cAAc,CAAC;AAG7B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,UAAU,CAAC;AAGzB,cAAc,SAAS,CAAC;AAGxB,cAAc,UAAU,CAAC;AAGzB,cAAc,eAAe,CAAC;AAG9B,cAAc,QAAQ,CAAC;AAGvB,cAAc,YAAY,CAAC;AAG3B,cAAc,OAAO,CAAC;AAGtB,cAAc,UAAU,CAAC;AAGzB,cAAc,OAAO,CAAC;AAGtB,cAAc,gBAAgB,CAAC;AAG/B,cAAc,aAAa,CAAC;AAG5B,cAAc,SAAS,CAAC;AAGxB,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,wBAAwB,CAAC;AAGhC,cAAc,SAAS,CAAC;AAGxB,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,KAAK,kBAAkB,GACxB,MAAM,uCAAuC,CAAC;AAY/C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;;;;;;AAEjC,wBAIE"}