ad-feature-components 0.0.4 → 0.0.6
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/README.md +73 -73
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +72 -72
package/README.md
CHANGED
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
# React + TypeScript + Vite
|
|
2
|
-
|
|
3
|
-
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
|
4
|
-
|
|
5
|
-
Currently, two official plugins are available:
|
|
6
|
-
|
|
7
|
-
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
|
|
8
|
-
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
|
9
|
-
|
|
10
|
-
## React Compiler
|
|
11
|
-
|
|
12
|
-
The React Compiler is currently not compatible with SWC. See [this issue](https://github.com/vitejs/vite-plugin-react/issues/428) for tracking the progress.
|
|
13
|
-
|
|
14
|
-
## Expanding the ESLint configuration
|
|
15
|
-
|
|
16
|
-
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
|
17
|
-
|
|
18
|
-
```js
|
|
19
|
-
export default defineConfig([
|
|
20
|
-
globalIgnores(['dist']),
|
|
21
|
-
{
|
|
22
|
-
files: ['**/*.{ts,tsx}'],
|
|
23
|
-
extends: [
|
|
24
|
-
// Other configs...
|
|
25
|
-
|
|
26
|
-
// Remove tseslint.configs.recommended and replace with this
|
|
27
|
-
tseslint.configs.recommendedTypeChecked,
|
|
28
|
-
// Alternatively, use this for stricter rules
|
|
29
|
-
tseslint.configs.strictTypeChecked,
|
|
30
|
-
// Optionally, add this for stylistic rules
|
|
31
|
-
tseslint.configs.stylisticTypeChecked,
|
|
32
|
-
|
|
33
|
-
// Other configs...
|
|
34
|
-
],
|
|
35
|
-
languageOptions: {
|
|
36
|
-
parserOptions: {
|
|
37
|
-
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
38
|
-
tsconfigRootDir: import.meta.dirname,
|
|
39
|
-
},
|
|
40
|
-
// other options...
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
])
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
|
47
|
-
|
|
48
|
-
```js
|
|
49
|
-
// eslint.config.js
|
|
50
|
-
import reactX from 'eslint-plugin-react-x'
|
|
51
|
-
import reactDom from 'eslint-plugin-react-dom'
|
|
52
|
-
|
|
53
|
-
export default defineConfig([
|
|
54
|
-
globalIgnores(['dist']),
|
|
55
|
-
{
|
|
56
|
-
files: ['**/*.{ts,tsx}'],
|
|
57
|
-
extends: [
|
|
58
|
-
// Other configs...
|
|
59
|
-
// Enable lint rules for React
|
|
60
|
-
reactX.configs['recommended-typescript'],
|
|
61
|
-
// Enable lint rules for React DOM
|
|
62
|
-
reactDom.configs.recommended,
|
|
63
|
-
],
|
|
64
|
-
languageOptions: {
|
|
65
|
-
parserOptions: {
|
|
66
|
-
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
67
|
-
tsconfigRootDir: import.meta.dirname,
|
|
68
|
-
},
|
|
69
|
-
// other options...
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
])
|
|
73
|
-
```
|
|
1
|
+
# React + TypeScript + Vite
|
|
2
|
+
|
|
3
|
+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
|
4
|
+
|
|
5
|
+
Currently, two official plugins are available:
|
|
6
|
+
|
|
7
|
+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
|
|
8
|
+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
|
9
|
+
|
|
10
|
+
## React Compiler
|
|
11
|
+
|
|
12
|
+
The React Compiler is currently not compatible with SWC. See [this issue](https://github.com/vitejs/vite-plugin-react/issues/428) for tracking the progress.
|
|
13
|
+
|
|
14
|
+
## Expanding the ESLint configuration
|
|
15
|
+
|
|
16
|
+
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
export default defineConfig([
|
|
20
|
+
globalIgnores(['dist']),
|
|
21
|
+
{
|
|
22
|
+
files: ['**/*.{ts,tsx}'],
|
|
23
|
+
extends: [
|
|
24
|
+
// Other configs...
|
|
25
|
+
|
|
26
|
+
// Remove tseslint.configs.recommended and replace with this
|
|
27
|
+
tseslint.configs.recommendedTypeChecked,
|
|
28
|
+
// Alternatively, use this for stricter rules
|
|
29
|
+
tseslint.configs.strictTypeChecked,
|
|
30
|
+
// Optionally, add this for stylistic rules
|
|
31
|
+
tseslint.configs.stylisticTypeChecked,
|
|
32
|
+
|
|
33
|
+
// Other configs...
|
|
34
|
+
],
|
|
35
|
+
languageOptions: {
|
|
36
|
+
parserOptions: {
|
|
37
|
+
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
38
|
+
tsconfigRootDir: import.meta.dirname,
|
|
39
|
+
},
|
|
40
|
+
// other options...
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
])
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
// eslint.config.js
|
|
50
|
+
import reactX from 'eslint-plugin-react-x'
|
|
51
|
+
import reactDom from 'eslint-plugin-react-dom'
|
|
52
|
+
|
|
53
|
+
export default defineConfig([
|
|
54
|
+
globalIgnores(['dist']),
|
|
55
|
+
{
|
|
56
|
+
files: ['**/*.{ts,tsx}'],
|
|
57
|
+
extends: [
|
|
58
|
+
// Other configs...
|
|
59
|
+
// Enable lint rules for React
|
|
60
|
+
reactX.configs['recommended-typescript'],
|
|
61
|
+
// Enable lint rules for React DOM
|
|
62
|
+
reactDom.configs.recommended,
|
|
63
|
+
],
|
|
64
|
+
languageOptions: {
|
|
65
|
+
parserOptions: {
|
|
66
|
+
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
67
|
+
tsconfigRootDir: import.meta.dirname,
|
|
68
|
+
},
|
|
69
|
+
// other options...
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
])
|
|
73
|
+
```
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/index.ts","../lib/components/appInsights/AppInsightsProvider.tsx","../lib/components/msAuth/AuthProvider.tsx","../lib/components/msAuth/useAuth.ts","../lib/components/msAuth/Protected.tsx","../lib/components/pageRouter/RouterProvider.tsx","../lib/components/pageRouter/RouteRenderer.tsx","../lib/components/pageRouter/ErrorBoundary.tsx","../lib/components/pageRouter/navigation.ts","../lib/components/reactQuery/apiClient.ts","../lib/components/reactQuery/hooks.ts","../lib/components/reactQuery/queryProvider.tsx","../lib/components/formManager/Form.tsx","../lib/components/formManager/InputField.tsx","../lib/components/formManager/InputDropdown.tsx","../lib/components/formManager/InputRadio.tsx","../lib/components/formManager/InputCheckbox.tsx","../lib/components/formManager/InputTextarea.tsx","../lib/components/formManager/ResetButton.tsx","../lib/components/formManager/InputFile.tsx","../lib/components/globalErrorSuccessManager/ToastContext.tsx","../lib/components/globalErrorSuccessManager/useToast.ts","../lib/components/globalErrorSuccessManager/ToastContainer.tsx","../lib/components/globalErrorSuccessManager/InlineAlert.tsx","../lib/components/storageManager/StorageProvider.tsx","../lib/components/storageManager/useStorage.ts","../lib/components/contextManager/createContext.tsx","../lib/components/contextManager/createContextWithHook.tsx"],"sourcesContent":["export * from \"./components\";\r\n","import React, { useEffect } from \"react\";\r\nimport { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\r\n\r\ninterface AppInsightProps {\r\n instrumentationKey: string;\r\n}\r\n\r\nconst AppInsight: React.FC<AppInsightProps> = ({ instrumentationKey }) => {\r\n useEffect(() => {\r\n const appInsights = new ApplicationInsights({\r\n config: {\r\n instrumentationKey,\r\n enableAutoRouteTracking: true,\r\n },\r\n });\r\n appInsights.loadAppInsights();\r\n appInsights.trackPageView();\r\n }, [instrumentationKey]);\r\n\r\n return null; // No UI, just telemetry\r\n};\r\n\r\nexport default AppInsight;\r\n","import React, { useRef } from \"react\";\r\nimport { MsalProvider } from \"@azure/msal-react\";\r\nimport { PublicClientApplication, LogLevel } from \"@azure/msal-browser\";\r\nimport type { Configuration } from \"@azure/msal-browser\";\r\n\r\nexport type AuthProviderProps = {\r\n config: Configuration; // MSAL config: clientId, authority, redirectUri, cache, etc.\r\n children: React.ReactNode;\r\n};\r\n\r\nexport const AuthProvider: React.FC<AuthProviderProps> = ({\r\n config,\r\n children,\r\n}) => {\r\n const pcaRef = useRef<PublicClientApplication>(null);\r\n\r\n if (!pcaRef.current) {\r\n pcaRef.current = new PublicClientApplication({\r\n ...config,\r\n system: {\r\n ...config.system,\r\n loggerOptions: { logLevel: LogLevel.Info },\r\n },\r\n });\r\n }\r\n\r\n return <MsalProvider instance={pcaRef.current!}>{children}</MsalProvider>;\r\n};\r\n","import { useMsal, useIsAuthenticated, useAccount } from \"@azure/msal-react\";\r\nimport { InteractionType } from \"@azure/msal-browser\";\r\nimport type {\r\n PopupRequest,\r\n RedirectRequest,\r\n SilentRequest,\r\n} from \"@azure/msal-browser\";\r\n\r\ntype Options = {\r\n loginType?: \"popup\" | \"redirect\";\r\n defaultScopes?: string[]; // e.g., [\"User.Read\"]\r\n};\r\n\r\nexport function useAuth(options?: Options) {\r\n const { instance, accounts } = useMsal();\r\n const isAuthenticated = useIsAuthenticated();\r\n const account = useAccount(accounts[0] || {});\r\n\r\n const login = async (request?: PopupRequest | RedirectRequest) => {\r\n const req = request ?? {\r\n scopes: options?.defaultScopes ?? [\"openid\", \"profile\", \"offline_access\"],\r\n };\r\n if (options?.loginType === \"redirect\") {\r\n await instance.loginRedirect(req as RedirectRequest);\r\n } else {\r\n await instance.loginPopup(req as PopupRequest);\r\n }\r\n };\r\n\r\n const logout = async () => {\r\n try {\r\n if (options?.loginType === \"redirect\") {\r\n await instance.logoutRedirect();\r\n } else {\r\n await instance.logoutPopup();\r\n }\r\n } catch {\r\n console.error(\"Failed while trying to logout user!\");\r\n }\r\n };\r\n\r\n const acquireToken = async (scopes: string[]) => {\r\n const silentReq: SilentRequest = { account: accounts[0], scopes };\r\n try {\r\n const res = await instance.acquireTokenSilent(silentReq);\r\n return res.accessToken;\r\n } catch {\r\n if (options?.loginType === \"redirect\") {\r\n await instance.acquireTokenRedirect({ scopes });\r\n return \"\"; // token will be available after redirect completes\r\n } else {\r\n const res = await instance.acquireTokenPopup({ scopes });\r\n return res.accessToken;\r\n }\r\n }\r\n };\r\n\r\n return {\r\n isAuthenticated,\r\n account,\r\n login,\r\n logout,\r\n acquireToken,\r\n InteractionType,\r\n };\r\n}\r\n","import React from \"react\";\r\n\r\nexport const Protected: React.FC<{\r\n children: React.ReactNode;\r\n}> = ({ children }) => {\r\n return <>{children}</>;\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { BrowserRouter, useNavigate } from 'react-router-dom';\r\nimport RouteRenderer from './RouteRenderer';\r\nimport { type RouterProviderProps } from './types';\r\nimport { setNavigate } from './navigation';\r\n\r\nconst NavigatorInitializer: React.FC = () => {\r\n const navigate = useNavigate();\r\n\r\n useEffect(() => {\r\n setNavigate(navigate);\r\n }, [navigate]);\r\n\r\n return null;\r\n};\r\n\r\nconst RouterProvider: React.FC<RouterProviderProps> = ({ routes, fallbackUI }) => {\r\n return (\r\n <BrowserRouter>\r\n <NavigatorInitializer />\r\n <RouteRenderer routes={routes} fallbackUI={fallbackUI} />\r\n </BrowserRouter>\r\n );\r\n};\r\n\r\nexport default RouterProvider;","import React from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { ErrorBoundary } from './ErrorBoundary';\r\nimport { type RouteConfig } from './types';\r\n\r\ninterface Props {\r\n routes: RouteConfig[];\r\n fallbackUI?: React.ReactNode;\r\n}\r\n\r\nconst RouteRenderer: React.FC<Props> = ({ routes, fallbackUI }) => {\r\n const location = useLocation();\r\n const currentRoute = routes.find(route => route.path === location.pathname);\r\n\r\n if (!currentRoute) {\r\n return fallbackUI ?? <div>404 - Page Not Found</div>;\r\n }\r\n\r\n const Component = currentRoute.component;\r\n\r\n return (\r\n <ErrorBoundary fallback={currentRoute.errorFallback}>\r\n <Component />\r\n </ErrorBoundary>\r\n );\r\n};\r\n\r\nexport default RouteRenderer","import React, { Component, type ReactNode } from \"react\";\r\n\r\ninterface ErrorBoundaryProps {\r\n fallback?: ReactNode;\r\n children: ReactNode;\r\n}\r\n\r\ninterface ErrorBoundaryState {\r\n hasError: boolean;\r\n}\r\n\r\nexport class ErrorBoundary extends Component<\r\n ErrorBoundaryProps,\r\n ErrorBoundaryState\r\n> {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = { hasError: false };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n static getDerivedStateFromError(_: Error): ErrorBoundaryState {\r\n return { hasError: true };\r\n }\r\n\r\n componentDidCatch(error: Error, info: React.ErrorInfo) {\r\n console.error(\"Error caught in boundary:\", error, info);\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n return this.props.fallback ?? <div>Something went wrong.</div>;\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n","import { type NavigateFunction } from 'react-router-dom';\r\n\r\nlet navigate: NavigateFunction | null = null;\r\n\r\nexport const setNavigate = (navFn: NavigateFunction) => {\r\n navigate = navFn;\r\n};\r\n\r\nexport const getNavigate = (): NavigateFunction => {\r\n if (!navigate) {\r\n throw new Error('Navigate function not initialized.');\r\n }\r\n return navigate;\r\n};","import axios, { type AxiosRequestConfig } from \"axios\";\r\n\r\nlet baseURL = \"\";\r\nlet globalHeaders: Record<string, string> = {};\r\n\r\nexport interface ClientConfig {\r\n endpoint: string;\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport const configureClient = ({ endpoint, headers }: ClientConfig): void => {\r\n baseURL = endpoint;\r\n globalHeaders = headers || {};\r\n};\r\n\r\nconst request = async <T>(\r\n method: string,\r\n url: string,\r\n data?: any\r\n): Promise<T> => {\r\n try {\r\n const config: AxiosRequestConfig = {\r\n method,\r\n url: `${baseURL}${url}`,\r\n data,\r\n headers: globalHeaders,\r\n };\r\n const response = await axios(config);\r\n return response.data as T;\r\n } catch (error: any) {\r\n const message =\r\n error.response?.data?.message || error.message || \"Unknown error\";\r\n throw new Error(message);\r\n }\r\n};\r\n\r\nexport const get = <T>(url: string): Promise<T> => request<T>(\"GET\", url);\r\nexport const post = <T>(url: string, data: any): Promise<T> =>\r\n request<T>(\"POST\", url, data);\r\nexport const put = <T>(url: string, data: any): Promise<T> =>\r\n request<T>(\"PUT\", url, data);\r\nexport const del = <T>(url: string): Promise<T> => request<T>(\"DELETE\", url);\r\n","\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport { get, post, put, del } from './apiClient';\r\n\r\n// ✅ GET Hook\r\nexport const useGetQuery = <T>(key: string, url: string) => {\r\n return useQuery<T>({\r\n queryKey: [key],\r\n queryFn: () => get<T>(url),\r\n });\r\n};\r\n\r\n// ✅ POST Hook with optional invalidateKeys\r\nexport const usePostMutation = <T>() => {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: (variables: { url: string; data: any; invalidateKeys?: string[] }) =>\r\n post<T>(variables.url, variables.data),\r\n onSuccess: (_data, variables) => {\r\n if (variables.invalidateKeys) {\r\n variables.invalidateKeys.forEach((key) =>\r\n queryClient.invalidateQueries({ queryKey: [key] })\r\n );\r\n }\r\n },\r\n });\r\n};\r\n\r\n// ✅ PUT Hook\r\nexport const usePutMutation = <T>() => {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: (variables: { url: string; data: any; invalidateKeys?: string[] }) =>\r\n put<T>(variables.url, variables.data),\r\n onSuccess: (_data, variables) => {\r\n if (variables.invalidateKeys) {\r\n variables.invalidateKeys.forEach((key) =>\r\n queryClient.invalidateQueries({ queryKey: [key] })\r\n );\r\n }\r\n },\r\n });\r\n};\r\n\r\n// ✅ DELETE Hook\r\nexport const useDeleteMutation = <T>() => {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: (variables: { url: string; invalidateKeys?: string[] }) =>\r\n del<T>(variables.url),\r\n onSuccess: (_data, variables) => {\r\n if (variables.invalidateKeys) {\r\n variables.invalidateKeys.forEach((key) =>\r\n queryClient.invalidateQueries({ queryKey: [key] })\r\n );\r\n }\r\n },\r\n });\r\n};\r\n","\r\nimport React, { type ReactNode } from 'react';\r\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\r\n\r\nlet queryClient: QueryClient;\r\n\r\nconst createQueryClient = (options?: object) => {\r\n queryClient = new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n retry: 1,\r\n refetchOnWindowFocus: false,\r\n },\r\n },\r\n ...options,\r\n });\r\n return queryClient;\r\n};\r\n\r\ninterface QueryProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport const QueryProvider: React.FC<QueryProviderProps> = ({ children }) => {\r\n if (!queryClient) {\r\n queryClient = createQueryClient();\r\n }\r\n return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;\r\n};\r\n","import React, {\r\n createContext,\r\n useCallback,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport type { Values, Validator, FormErrors } from \"./types\";\r\n\r\ninterface FormContextShape {\r\n values: Values;\r\n errors: FormErrors;\r\n isValidating: boolean;\r\n setValue: (name: string, value: string) => void;\r\n clearValue: (name: string) => void;\r\n registerField: (\r\n name: string,\r\n validator?: Validator,\r\n fallbackErrorMsg?: string\r\n ) => void;\r\n unregisterField: (name: string) => void;\r\n validateField: (name: string) => Promise<boolean>;\r\n validateAll: () => Promise<boolean>;\r\n reset: () => void;\r\n}\r\n\r\n// eslint-disable-next-line react-refresh/only-export-components\r\nexport const FormContext = createContext<FormContextShape | null>(null);\r\n\r\nexport interface FormProps {\r\n initialValues?: Values;\r\n /** Async submit handler from target application */\r\n onSubmit: (values: Values) => Promise<void>;\r\n /** Optional error callback when onSubmit throws */\r\n onSubmitError?: (error: unknown) => void;\r\n /** Optional reset side-effect */\r\n onReset?: () => void;\r\n /** Children should include InputField and buttons */\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const Form: React.FC<FormProps> = ({\r\n initialValues = {},\r\n onSubmit,\r\n onSubmitError,\r\n onReset,\r\n children,\r\n}) => {\r\n const [values, setValues] = useState<Values>(initialValues);\r\n const [errors, setErrors] = useState<FormErrors>({});\r\n const [isValidating, setIsValidating] = useState<boolean>(false);\r\n\r\n // registry: name -> {validator, fallbackErrorMsg}\r\n const registry = useRef<\r\n Map<string, { validator?: Validator; fallbackErrorMsg?: string }>\r\n >(new Map());\r\n\r\n const setValue = useCallback((name: string, value: string) => {\r\n setValues((prev) => ({ ...prev, [name]: value }));\r\n // Clear error as user types; re-validate on blur/submit\r\n setErrors((prev) => ({ ...prev, [name]: undefined }));\r\n }, []);\r\n\r\n const clearValue = useCallback((name: string) => {\r\n setValues((prev) => ({ ...prev, [name]: \"\" }));\r\n setErrors((prev) => ({ ...prev, [name]: undefined }));\r\n }, []);\r\n\r\n const registerField = useCallback(\r\n (name: string, validator?: Validator, fallbackErrorMsg?: string) => {\r\n registry.current.set(name, { validator, fallbackErrorMsg });\r\n // Initialize missing value to empty string to simplify logic\r\n setValues((prev) => (name in prev ? prev : { ...prev, [name]: \"\" }));\r\n },\r\n []\r\n );\r\n\r\n const unregisterField = useCallback((name: string) => {\r\n registry.current.delete(name);\r\n setErrors((prev) => {\r\n const next = { ...prev };\r\n delete next[name];\r\n return next;\r\n });\r\n }, []);\r\n\r\n const validateField = useCallback(\r\n async (name: string): Promise<boolean> => {\r\n const entry = registry.current.get(name);\r\n const value = values[name] ?? \"\";\r\n if (!entry?.validator) {\r\n // No validator: consider valid\r\n setErrors((prev) => ({ ...prev, [name]: undefined }));\r\n return true;\r\n }\r\n\r\n const result = await entry.validator(value, values);\r\n // validator can return boolean or string\r\n if (typeof result === \"string\") {\r\n setErrors((prev) => ({ ...prev, [name]: result }));\r\n return false;\r\n }\r\n if (result === true) {\r\n setErrors((prev) => ({ ...prev, [name]: undefined }));\r\n return true;\r\n } else {\r\n // false -> show fallback error message provided as a prop from target app\r\n const fallback = entry.fallbackErrorMsg || \"Invalid value.\";\r\n setErrors((prev) => ({ ...prev, [name]: fallback }));\r\n return false;\r\n }\r\n },\r\n [values]\r\n );\r\n\r\n const validateAll = useCallback(async (): Promise<boolean> => {\r\n setIsValidating(true);\r\n try {\r\n const names = Array.from(registry.current.keys());\r\n const results = await Promise.all(names.map((n) => validateField(n)));\r\n return results.every(Boolean);\r\n } finally {\r\n setIsValidating(false);\r\n }\r\n }, [validateField]);\r\n\r\n const reset = useCallback(() => {\r\n setValues(initialValues);\r\n setErrors({});\r\n onReset?.();\r\n }, [initialValues, onReset]);\r\n\r\n const ctx = useMemo<FormContextShape>(\r\n () => ({\r\n values,\r\n errors,\r\n isValidating,\r\n setValue,\r\n clearValue,\r\n registerField,\r\n unregisterField,\r\n validateField,\r\n validateAll,\r\n reset,\r\n }),\r\n [\r\n values,\r\n errors,\r\n isValidating,\r\n setValue,\r\n clearValue,\r\n registerField,\r\n unregisterField,\r\n validateField,\r\n validateAll,\r\n reset,\r\n ]\r\n );\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n\r\n // Ensure all validations complete before submission\r\n const ok = await validateAll();\r\n if (!ok) return;\r\n\r\n // Requirement: wrap the target app's async submit handler with try/catch\r\n try {\r\n await onSubmit(values);\r\n } catch (err) {\r\n console.error(\"Submit handler threw:\", err);\r\n onSubmitError?.(err);\r\n // Optional: set a form-level error state or toast here if needed\r\n }\r\n };\r\n\r\n return (\r\n <form onSubmit={handleSubmit} noValidate>\r\n <FormContext.Provider value={ctx}>{children}</FormContext.Provider>\r\n </form>\r\n );\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\nimport type { Validator } from \"./types\";\r\n\r\nexport interface InputFieldProps\r\n extends Omit<\r\n React.InputHTMLAttributes<HTMLInputElement>,\r\n \"name\" | \"onChange\" | \"value\"\r\n > {\r\n /** Unique field name */\r\n name: string;\r\n /** Visible label (optional) */\r\n label?: string;\r\n /** Show a clear icon inside input (default true) */\r\n clearable?: boolean;\r\n /** Validator function; can be sync or async and return boolean or string */\r\n validator?: Validator;\r\n /**\r\n * Fallback error message to show if validator returns false.\r\n * This satisfies: \"take error message as a prop from target application\"\r\n */\r\n errorMessage?: string;\r\n /** Additional CSS class name */\r\n className?: string;\r\n}\r\n\r\nexport const InputField: React.FC<InputFieldProps> = ({\r\n name,\r\n label,\r\n clearable = true,\r\n validator,\r\n errorMessage,\r\n type = \"text\",\r\n placeholder,\r\n disabled,\r\n className,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"InputField must be used inside <Form>.\");\r\n }\r\n\r\n const value = form.values[name] ?? \"\";\r\n\r\n // Register/unregister the field with its validator and fallback message\r\n useEffect(() => {\r\n form.registerField(name, validator, errorMessage);\r\n return () => form.unregisterField(name);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, validator, errorMessage]);\r\n\r\n // Re-validate on blur\r\n const onBlur = async () => {\r\n await form.validateField(name);\r\n };\r\n\r\n const showClear = clearable && !!value && !disabled;\r\n const hasError = !!form.errors[name];\r\n\r\n const containerClassName = [\r\n \"input-field-container\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const inputClassName = [\r\n \"input-field-input\",\r\n showClear && \"with-clear\",\r\n hasError && \"has-error\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={containerClassName}>\r\n {label && (\r\n <label htmlFor={name} className=\"input-field-label\">\r\n {label}\r\n </label>\r\n )}\r\n <div className=\"input-field-wrapper\">\r\n <input\r\n id={name}\r\n name={name}\r\n type={type}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n value={value}\r\n onChange={(e) => form.setValue(name, e.target.value)}\r\n onBlur={onBlur}\r\n className={inputClassName}\r\n {...rest}\r\n />\r\n {showClear && (\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label={`Clear ${label || name}`}\r\n title=\"Clear\"\r\n onClick={() => form.clearValue(name)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n form.clearValue(name);\r\n }\r\n }}\r\n className=\"input-field-clear-button\"\r\n >\r\n ×\r\n </span>\r\n )}\r\n </div>\r\n {hasError && (\r\n <div role=\"alert\" className=\"input-field-error\">\r\n {form.errors[name]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\nimport type { Validator } from \"./types\";\r\n\r\nexport interface DropdownOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport interface InputDropdownProps {\r\n /** Unique field name */\r\n name: string;\r\n /** Visible label (optional) */\r\n label?: string;\r\n /** Array of dropdown options */\r\n options: DropdownOption[];\r\n /** Placeholder text for empty selection */\r\n placeholder?: string;\r\n /** Show a clear icon (default true) */\r\n clearable?: boolean;\r\n /** Validator function; can be sync or async and return boolean or string */\r\n validator?: Validator;\r\n /**\r\n * Fallback error message to show if validator returns false.\r\n * This satisfies: \"take error message as a prop from target application\"\r\n */\r\n errorMessage?: string;\r\n /** Whether the dropdown is disabled */\r\n disabled?: boolean;\r\n /** Additional CSS class name */\r\n className?: string;\r\n /** Additional inline styles */\r\n style?: React.CSSProperties;\r\n /** Accessibility attributes */\r\n 'aria-label'?: string;\r\n 'aria-describedby'?: string;\r\n}\r\n\r\nexport const InputDropdown: React.FC<InputDropdownProps> = ({\r\n name,\r\n label,\r\n options,\r\n placeholder = \"Select an option\",\r\n clearable = true,\r\n validator,\r\n errorMessage,\r\n disabled,\r\n className,\r\n style,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"InputDropdown must be used inside <Form>.\");\r\n }\r\n\r\n const value = form.values[name] ?? \"\";\r\n\r\n // Register/unregister the field with its validator and fallback message\r\n useEffect(() => {\r\n form.registerField(name, validator, errorMessage);\r\n return () => form.unregisterField(name);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, validator, errorMessage]);\r\n\r\n // Re-validate on blur\r\n const onBlur = async () => {\r\n await form.validateField(name);\r\n };\r\n\r\n const showClear = clearable && !!value && !disabled;\r\n const hasError = !!form.errors[name];\r\n\r\n const selectClassName = [\r\n \"input-dropdown-select\",\r\n showClear && \"with-clear\",\r\n hasError && \"has-error\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className=\"input-dropdown-container\">\r\n {label && (\r\n <label htmlFor={name} className=\"input-dropdown-label\">\r\n {label}\r\n </label>\r\n )}\r\n <div className=\"input-dropdown-wrapper\">\r\n <select\r\n id={name}\r\n name={name}\r\n disabled={disabled}\r\n value={value}\r\n onChange={(e) => form.setValue(name, e.target.value)}\r\n onBlur={onBlur}\r\n className={selectClassName}\r\n style={style}\r\n {...rest}\r\n >\r\n <option value=\"\" disabled>\r\n {placeholder}\r\n </option>\r\n {options.map((option) => (\r\n <option key={option.value} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n {showClear && (\r\n <button\r\n type=\"button\"\r\n aria-label={`Clear ${label || name}`}\r\n title=\"Clear\"\r\n onClick={() => form.clearValue(name)}\r\n className=\"input-dropdown-clear-button\"\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n {hasError && (\r\n <div role=\"alert\" className=\"input-dropdown-error\">\r\n {form.errors[name]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\nimport type { Validator } from \"./types\";\r\n\r\nexport interface RadioOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport interface InputRadioProps {\r\n /** Unique field name */\r\n name: string;\r\n /** Visible label (optional) */\r\n label?: string;\r\n /** Array of radio options */\r\n options: RadioOption[];\r\n /** Validator function; can be sync or async and return boolean or string */\r\n validator?: Validator;\r\n /**\r\n * Fallback error message to show if validator returns false.\r\n * This satisfies: \"take error message as a prop from target application\"\r\n */\r\n errorMessage?: string;\r\n /** Whether the radio group is disabled */\r\n disabled?: boolean;\r\n /** Additional CSS class name */\r\n className?: string;\r\n /** Accessibility attributes */\r\n 'aria-label'?: string;\r\n 'aria-describedby'?: string;\r\n}\r\n\r\nexport const InputRadio: React.FC<InputRadioProps> = ({\r\n name,\r\n label,\r\n options,\r\n validator,\r\n errorMessage,\r\n disabled,\r\n className,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"InputRadio must be used inside <Form>.\");\r\n }\r\n\r\n const value = form.values[name] ?? \"\";\r\n\r\n // Register/unregister the field with its validator and fallback message\r\n useEffect(() => {\r\n form.registerField(name, validator, errorMessage);\r\n return () => form.unregisterField(name);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, validator, errorMessage]);\r\n\r\n // Re-validate on blur\r\n const onBlur = async () => {\r\n await form.validateField(name);\r\n };\r\n\r\n const hasError = !!form.errors[name];\r\n\r\n const containerClassName = [\r\n \"input-radio-container\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={containerClassName}>\r\n {label && (\r\n <div className=\"input-radio-label\">\r\n {label}\r\n </div>\r\n )}\r\n <div className=\"input-radio-options\" role=\"radiogroup\" {...rest}>\r\n {options.map((option) => (\r\n <label\r\n key={option.value}\r\n className={`input-radio-option ${disabled ? \"disabled\" : \"\"}`}\r\n >\r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={option.value}\r\n checked={value === option.value}\r\n onChange={(e) => form.setValue(name, e.target.value)}\r\n onBlur={onBlur}\r\n disabled={disabled}\r\n className=\"input-radio-input\"\r\n />\r\n <span className=\"input-radio-option-label\">{option.label}</span>\r\n </label>\r\n ))}\r\n </div>\r\n {hasError && (\r\n <div role=\"alert\" className=\"input-radio-error\">\r\n {form.errors[name]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\nimport type { Validator } from \"./types\";\r\n\r\nexport interface CheckboxOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport interface InputCheckboxProps {\r\n /** Unique field name */\r\n name: string;\r\n /** Visible label (optional) */\r\n label?: string;\r\n /** Array of checkbox options */\r\n options: CheckboxOption[];\r\n /** Validator function; can be sync or async and return boolean or string */\r\n validator?: Validator;\r\n /**\r\n * Fallback error message to show if validator returns false.\r\n * This satisfies: \"take error message as a prop from target application\"\r\n */\r\n errorMessage?: string;\r\n /** Whether the checkbox group is disabled */\r\n disabled?: boolean;\r\n /** Additional CSS class name */\r\n className?: string;\r\n /** Accessibility attributes */\r\n 'aria-label'?: string;\r\n 'aria-describedby'?: string;\r\n}\r\n\r\nexport const InputCheckbox: React.FC<InputCheckboxProps> = ({\r\n name,\r\n label,\r\n options,\r\n validator,\r\n errorMessage,\r\n disabled,\r\n className,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"InputCheckbox must be used inside <Form>.\");\r\n }\r\n\r\n const value = form.values[name] ?? \"\";\r\n const selectedValues = value ? value.split(\",\") : [];\r\n\r\n // Register/unregister the field with its validator and fallback message\r\n useEffect(() => {\r\n form.registerField(name, validator, errorMessage);\r\n return () => form.unregisterField(name);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, validator, errorMessage]);\r\n\r\n // Re-validate on blur\r\n const onBlur = async () => {\r\n await form.validateField(name);\r\n };\r\n\r\n const handleChange = (optionValue: string, checked: boolean) => {\r\n let newSelectedValues: string[];\r\n \r\n if (checked) {\r\n newSelectedValues = [...selectedValues, optionValue];\r\n } else {\r\n newSelectedValues = selectedValues.filter((v) => v !== optionValue);\r\n }\r\n \r\n form.setValue(name, newSelectedValues.join(\",\"));\r\n };\r\n\r\n const hasError = !!form.errors[name];\r\n\r\n const containerClassName = [\r\n \"input-checkbox-container\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={containerClassName}>\r\n {label && (\r\n <div className=\"input-checkbox-label\">\r\n {label}\r\n </div>\r\n )}\r\n <div className=\"input-checkbox-options\" role=\"group\" {...rest}>\r\n {options.map((option) => (\r\n <label\r\n key={option.value}\r\n className={`input-checkbox-option ${disabled ? \"disabled\" : \"\"}`}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n name={`${name}-${option.value}`}\r\n value={option.value}\r\n checked={selectedValues.includes(option.value)}\r\n onChange={(e) => handleChange(option.value, e.target.checked)}\r\n onBlur={onBlur}\r\n disabled={disabled}\r\n className=\"input-checkbox-input\"\r\n />\r\n <span className=\"input-checkbox-option-label\">{option.label}</span>\r\n </label>\r\n ))}\r\n </div>\r\n {hasError && (\r\n <div role=\"alert\" className=\"input-checkbox-error\">\r\n {form.errors[name]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\nimport type { Validator } from \"./types\";\r\n\r\nexport interface InputTextareaProps {\r\n /** Unique field name */\r\n name: string;\r\n /** Visible label (optional) */\r\n label?: string;\r\n /** Placeholder text */\r\n placeholder?: string;\r\n /** Show a clear icon (default true) */\r\n clearable?: boolean;\r\n /** Validator function; can be sync or async and return boolean or string */\r\n validator?: Validator;\r\n /**\r\n * Fallback error message to show if validator returns false.\r\n * This satisfies: \"take error message as a prop from target application\"\r\n */\r\n errorMessage?: string;\r\n /** Whether the textarea is disabled */\r\n disabled?: boolean;\r\n /** Number of rows */\r\n rows?: number;\r\n /** Maximum length */\r\n maxLength?: number;\r\n /** Additional CSS class name */\r\n className?: string;\r\n /** Additional inline styles */\r\n style?: React.CSSProperties;\r\n /** Accessibility attributes */\r\n 'aria-label'?: string;\r\n 'aria-describedby'?: string;\r\n}\r\n\r\nexport const InputTextarea: React.FC<InputTextareaProps> = ({\r\n name,\r\n label,\r\n placeholder,\r\n clearable = true,\r\n validator,\r\n errorMessage,\r\n disabled,\r\n rows,\r\n maxLength,\r\n className,\r\n style,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"InputTextarea must be used inside <Form>.\");\r\n }\r\n\r\n const value = form.values[name] ?? \"\";\r\n\r\n // Register/unregister the field with its validator and fallback message\r\n useEffect(() => {\r\n form.registerField(name, validator, errorMessage);\r\n return () => form.unregisterField(name);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, validator, errorMessage]);\r\n\r\n // Re-validate on blur\r\n const onBlur = async () => {\r\n await form.validateField(name);\r\n };\r\n\r\n const showClear = clearable && !!value && !disabled;\r\n const hasError = !!form.errors[name];\r\n\r\n const textareaClassName = [\r\n \"input-textarea-field\",\r\n showClear && \"with-clear\",\r\n hasError && \"has-error\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className=\"input-textarea-container\">\r\n {label && (\r\n <label htmlFor={name} className=\"input-textarea-label\">\r\n {label}\r\n </label>\r\n )}\r\n <div className=\"input-textarea-wrapper\">\r\n <textarea\r\n id={name}\r\n name={name}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n rows={rows}\r\n maxLength={maxLength}\r\n value={value}\r\n onChange={(e) => form.setValue(name, e.target.value)}\r\n onBlur={onBlur}\r\n className={textareaClassName}\r\n style={style}\r\n {...rest}\r\n />\r\n {showClear && (\r\n <button\r\n type=\"button\"\r\n aria-label={`Clear ${label || name}`}\r\n title=\"Clear\"\r\n onClick={() => form.clearValue(name)}\r\n className=\"input-textarea-clear-button\"\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n {hasError && (\r\n <div role=\"alert\" className=\"input-textarea-error\">\r\n {form.errors[name]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useContext } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\n\r\nexport interface ResetButtonProps\r\n extends Omit<\r\n React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n \"type\" | \"onClick\"\r\n > {\r\n /** Optional custom text (default: \"Reset\") */\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const ResetButton: React.FC<ResetButtonProps> = ({\r\n children,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"ResetButton must be used inside <Form>.\");\r\n }\r\n\r\n return (\r\n <button type=\"button\" onClick={form.reset} {...rest}>\r\n {children ?? \"Reset\"}\r\n </button>\r\n );\r\n};\r\n","import React, { useContext, useEffect, useRef, useState } from 'react';\r\nimport { FormContext } from './Form';\r\n\r\ninterface InputFileProps {\r\n name?: string;\r\n label?: string;\r\n accept?: string;\r\n maxLength?: number;\r\n maxFileSize?: number; // in bytes, default 2MB\r\n uploadUrl?: string;\r\n onFileChange?: (file: File | null) => void;\r\n disabled?: boolean;\r\n validator?: (value: string) => boolean | string;\r\n errorMessage?: string;\r\n /** Additional CSS class name */\r\n className?: string;\r\n}\r\n\r\nconst InputFile: React.FC<InputFileProps> = ({\r\n name,\r\n label = 'Upload File',\r\n accept,\r\n maxLength = 20,\r\n maxFileSize = 2 * 1024 * 1024, // 2MB default\r\n onFileChange,\r\n disabled = false,\r\n validator,\r\n errorMessage = 'Please select a file.',\r\n className,\r\n}) => {\r\n const formContext = useContext(FormContext);\r\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Register field with form context if name is provided\r\n useEffect(() => {\r\n if (name && formContext) {\r\n formContext.registerField(name, validator, errorMessage);\r\n return () => formContext.unregisterField(name);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name]);\r\n\r\n const truncateFileName = (fileName: string, maxLen: number): string => {\r\n if (fileName.length <= maxLen) {\r\n return fileName;\r\n }\r\n\r\n const extensionIndex = fileName.lastIndexOf('.');\r\n const extension = extensionIndex !== -1 ? fileName.substring(extensionIndex) : '';\r\n const nameWithoutExt = extensionIndex !== -1 ? fileName.substring(0, extensionIndex) : fileName;\r\n\r\n const availableLength = maxLen - extension.length - 10; // 10 dots for ellipsis\r\n const initialChars = nameWithoutExt.substring(0, Math.max(availableLength, 5));\r\n\r\n return `${initialChars}..........${extension}`;\r\n };\r\n\r\n const handleBrowseClick = () => {\r\n fileInputRef.current?.click();\r\n };\r\n\r\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = event.target.files?.[0];\r\n if (!file) {\r\n setSelectedFile(null);\r\n if (onFileChange) onFileChange(null);\r\n if (name && formContext) {\r\n formContext.setValue(name, '');\r\n }\r\n return;\r\n }\r\n\r\n // Validate file size\r\n if (file.size > maxFileSize) {\r\n const maxSizeMB = (maxFileSize / (1024 * 1024)).toFixed(2);\r\n \r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = '';\r\n }\r\n setSelectedFile(null);\r\n if (onFileChange) onFileChange(null);\r\n if (name && formContext) {\r\n formContext.setValue(name, '');\r\n }\r\n alert(`File size exceeds ${maxSizeMB}MB limit.`);\r\n return;\r\n }\r\n\r\n setSelectedFile(file);\r\n \r\n // Update form context with file name\r\n if (name && formContext) {\r\n formContext.setValue(name, file.name);\r\n }\r\n \r\n // Notify parent of file selection\r\n if (onFileChange) {\r\n onFileChange(file);\r\n }\r\n };\r\n\r\n\r\n\r\n const hasError = name && formContext?.errors[name];\r\n const errorMsg = hasError ? formContext?.errors[name] : null;\r\n\r\n const containerClassName = [\r\n \"input-file-container\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={containerClassName}>\r\n {label && <label className=\"input-file-label\">{label}</label>}\r\n \r\n <div className=\"input-file-wrapper\">\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept={accept}\r\n onChange={handleFileChange}\r\n disabled={disabled}\r\n className=\"input-file-hidden\"\r\n />\r\n \r\n <button\r\n type=\"button\"\r\n onClick={handleBrowseClick}\r\n disabled={disabled}\r\n className=\"input-file-browse-btn\"\r\n >\r\n Browse\r\n </button>\r\n\r\n {selectedFile && (\r\n <span\r\n className=\"input-file-name\"\r\n title={selectedFile.name}\r\n >\r\n {truncateFileName(selectedFile.name, maxLength)}\r\n </span>\r\n )}\r\n </div>\r\n \r\n {errorMsg && <div className=\"input-file-error\">{errorMsg}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nexport default InputFile;\r\n","import React, { useState, useCallback } from 'react';\r\nimport type { ReactNode } from 'react';\r\nimport type { Toast, ToastType, ToastContextValue } from './ToastContext.types';\r\nimport { ToastContext } from './useToast';\r\n\r\ninterface ToastProviderProps {\r\n children: ReactNode;\r\n /** Default duration in milliseconds (default: 3000) */\r\n defaultDuration?: number;\r\n /** Maximum number of toasts to show at once (default: 5) */\r\n maxToasts?: number;\r\n}\r\n\r\nexport const ToastProvider: React.FC<ToastProviderProps> = ({\r\n children,\r\n defaultDuration = 3000,\r\n maxToasts = 5,\r\n}) => {\r\n const [toasts, setToasts] = useState<Toast[]>([]);\r\n\r\n const removeToast = useCallback((id: string) => {\r\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\r\n }, []);\r\n\r\n const showToast = useCallback(\r\n (message: string, type: ToastType, duration: number = defaultDuration) => {\r\n const id = `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n const newToast: Toast = { id, message, type, duration };\r\n\r\n setToasts((prev) => {\r\n const updated = [...prev, newToast];\r\n // Keep only the last maxToasts\r\n return updated.slice(-maxToasts);\r\n });\r\n\r\n if (duration > 0) {\r\n setTimeout(() => {\r\n removeToast(id);\r\n }, duration);\r\n }\r\n },\r\n [defaultDuration, maxToasts, removeToast]\r\n );\r\n\r\n const showSuccess = useCallback(\r\n (message: string, duration?: number) => {\r\n showToast(message, 'success', duration);\r\n },\r\n [showToast]\r\n );\r\n\r\n const showError = useCallback(\r\n (message: string, duration?: number) => {\r\n showToast(message, 'error', duration);\r\n },\r\n [showToast]\r\n );\r\n\r\n const showInfo = useCallback(\r\n (message: string, duration?: number) => {\r\n showToast(message, 'info', duration);\r\n },\r\n [showToast]\r\n );\r\n\r\n const showWarning = useCallback(\r\n (message: string, duration?: number) => {\r\n showToast(message, 'warning', duration);\r\n },\r\n [showToast]\r\n );\r\n\r\n const value: ToastContextValue = {\r\n toasts,\r\n showToast,\r\n showSuccess,\r\n showError,\r\n showInfo,\r\n showWarning,\r\n removeToast,\r\n };\r\n\r\n return <ToastContext.Provider value={value}>{children}</ToastContext.Provider>;\r\n};\r\n","import { useContext, createContext } from 'react';\r\nimport type { ToastContextValue } from './ToastContext.types';\r\n\r\nexport const ToastContext = createContext<ToastContextValue | undefined>(undefined);\r\n\r\nexport const useToast = (): ToastContextValue => {\r\n const context = useContext(ToastContext);\r\n if (!context) {\r\n throw new Error('useToast must be used within a ToastProvider');\r\n }\r\n return context;\r\n};\r\n","import React from 'react';\r\nimport { useToast } from './useToast';\r\nimport type { Toast } from './ToastContext.types';\r\n\r\ninterface ToastContainerProps {\r\n /** Position of toast container (default: 'top-right') */\r\n position?: 'top-left' | 'top-right' | 'top-center' | 'bottom-left' | 'bottom-right' | 'bottom-center';\r\n /** Additional CSS class name */\r\n className?: string;\r\n}\r\n\r\nexport const ToastContainer: React.FC<ToastContainerProps> = ({\r\n position = 'top-right',\r\n className,\r\n}) => {\r\n const { toasts, removeToast } = useToast();\r\n\r\n const containerClassName = [\r\n 'toast-container',\r\n `toast-container-${position}`,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const getToastClassName = (type: string) => {\r\n return [\r\n 'toast',\r\n `toast-${type}`,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n };\r\n\r\n return (\r\n <div className={containerClassName}>\r\n {toasts.map((toast: Toast) => (\r\n <div\r\n key={toast.id}\r\n className={getToastClassName(toast.type)}\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n >\r\n <div className=\"toast-content\">\r\n <span className=\"toast-icon\">{getIcon(toast.type)}</span>\r\n <span className=\"toast-message\">{toast.message}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"toast-close\"\r\n onClick={() => removeToast(toast.id)}\r\n aria-label=\"Close\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nfunction getIcon(type: string): string {\r\n switch (type) {\r\n case 'success':\r\n return '✓';\r\n case 'error':\r\n return '✕';\r\n case 'warning':\r\n return '⚠';\r\n case 'info':\r\n return 'ℹ';\r\n default:\r\n return '';\r\n }\r\n}\r\n","import React from 'react';\r\n\r\nexport interface InlineAlertProps {\r\n /** Type of alert */\r\n type: 'success' | 'error' | 'warning' | 'info';\r\n /** Alert message */\r\n message: string;\r\n /** Optional title */\r\n title?: string;\r\n /** Whether to show close button */\r\n dismissible?: boolean;\r\n /** Callback when alert is dismissed */\r\n onDismiss?: () => void;\r\n /** Additional CSS class name */\r\n className?: string;\r\n}\r\n\r\nexport const InlineAlert: React.FC<InlineAlertProps> = ({\r\n type,\r\n message,\r\n title,\r\n dismissible = false,\r\n onDismiss,\r\n className,\r\n}) => {\r\n const alertClassName = [\r\n 'inline-alert',\r\n `inline-alert-${type}`,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const getIcon = () => {\r\n switch (type) {\r\n case 'success':\r\n return '✓';\r\n case 'error':\r\n return '✕';\r\n case 'warning':\r\n return '⚠';\r\n case 'info':\r\n return 'ℹ';\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n return (\r\n <div className={alertClassName} role=\"alert\">\r\n <div className=\"inline-alert-icon\">{getIcon()}</div>\r\n <div className=\"inline-alert-content\">\r\n {title && <div className=\"inline-alert-title\">{title}</div>}\r\n <div className=\"inline-alert-message\">{message}</div>\r\n </div>\r\n {dismissible && (\r\n <button\r\n type=\"button\"\r\n className=\"inline-alert-close\"\r\n onClick={onDismiss}\r\n aria-label=\"Close\"\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useRef, useMemo } from 'react';\r\nimport type { ReactNode } from 'react';\r\nimport { StorageContext } from './useStorage';\r\nimport type { StorageOptions, StorageContextValue, StorageType } from './types';\r\n\r\nexport interface StorageProviderProps extends StorageOptions {\r\n children: ReactNode;\r\n}\r\n\r\nclass StorageAdapter {\r\n private storage: Storage | Map<string, string>;\r\n private namespace: string;\r\n private serialize: boolean;\r\n private encrypt: boolean;\r\n private storageType: StorageType;\r\n\r\n constructor(options: StorageOptions = {}) {\r\n this.namespace = options.namespace || '';\r\n this.serialize = options.serialize ?? true;\r\n this.encrypt = options.encrypt ?? false;\r\n this.storageType = options.storageType || 'local';\r\n\r\n // Select storage backend\r\n if (this.storageType === 'local') {\r\n this.storage = typeof window !== 'undefined' ? window.localStorage : new Map();\r\n } else if (this.storageType === 'session') {\r\n this.storage = typeof window !== 'undefined' ? window.sessionStorage : new Map();\r\n } else {\r\n this.storage = new Map();\r\n }\r\n }\r\n\r\n private getKey(key: string): string {\r\n return this.namespace ? `${this.namespace}:${key}` : key;\r\n }\r\n\r\n private encodeValue(value: string): string {\r\n if (!this.encrypt) return value;\r\n // Basic obfuscation (not cryptographically secure)\r\n return btoa(encodeURIComponent(value));\r\n }\r\n\r\n private decodeValue(value: string): string {\r\n if (!this.encrypt) return value;\r\n try {\r\n return decodeURIComponent(atob(value));\r\n } catch {\r\n return value;\r\n }\r\n }\r\n\r\n getItem<T = string>(key: string, defaultValue?: T): T | null {\r\n try {\r\n const fullKey = this.getKey(key);\r\n const rawValue = this.storage instanceof Map \r\n ? this.storage.get(fullKey) \r\n : this.storage.getItem(fullKey);\r\n\r\n if (rawValue === null || rawValue === undefined) {\r\n return defaultValue ?? null;\r\n }\r\n\r\n const decodedValue = this.decodeValue(rawValue);\r\n\r\n if (this.serialize) {\r\n return JSON.parse(decodedValue) as T;\r\n }\r\n return decodedValue as T;\r\n } catch (error) {\r\n console.error(`Error getting item \"${key}\" from storage:`, error);\r\n return defaultValue ?? null;\r\n }\r\n }\r\n\r\n setItem<T = unknown>(key: string, value: T): void {\r\n try {\r\n const fullKey = this.getKey(key);\r\n const serializedValue = this.serialize ? JSON.stringify(value) : String(value);\r\n const encodedValue = this.encodeValue(serializedValue);\r\n\r\n if (this.storage instanceof Map) {\r\n this.storage.set(fullKey, encodedValue);\r\n } else {\r\n this.storage.setItem(fullKey, encodedValue);\r\n }\r\n } catch (error) {\r\n console.error(`Error setting item \"${key}\" in storage:`, error);\r\n }\r\n }\r\n\r\n removeItem(key: string): void {\r\n try {\r\n const fullKey = this.getKey(key);\r\n if (this.storage instanceof Map) {\r\n this.storage.delete(fullKey);\r\n } else {\r\n this.storage.removeItem(fullKey);\r\n }\r\n } catch (error) {\r\n console.error(`Error removing item \"${key}\" from storage:`, error);\r\n }\r\n }\r\n\r\n clear(): void {\r\n try {\r\n if (this.storage instanceof Map) {\r\n this.storage.clear();\r\n } else {\r\n // Only clear items with the namespace\r\n if (this.namespace) {\r\n const keys = this.getAllKeys();\r\n keys.forEach(key => this.removeItem(key));\r\n } else {\r\n this.storage.clear();\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error clearing storage:', error);\r\n }\r\n }\r\n\r\n hasItem(key: string): boolean {\r\n const fullKey = this.getKey(key);\r\n if (this.storage instanceof Map) {\r\n return this.storage.has(fullKey);\r\n }\r\n return this.storage.getItem(fullKey) !== null;\r\n }\r\n\r\n getAllKeys(): string[] {\r\n try {\r\n if (this.storage instanceof Map) {\r\n return Array.from(this.storage.keys())\r\n .filter(key => !this.namespace || key.startsWith(`${this.namespace}:`))\r\n .map(key => this.namespace ? key.slice(this.namespace.length + 1) : key);\r\n } else {\r\n const allKeys = Object.keys(this.storage);\r\n return allKeys\r\n .filter(key => !this.namespace || key.startsWith(`${this.namespace}:`))\r\n .map(key => this.namespace ? key.slice(this.namespace.length + 1) : key);\r\n }\r\n } catch (error) {\r\n console.error('Error getting all keys from storage:', error);\r\n return [];\r\n }\r\n }\r\n\r\n getStorageType(): StorageType {\r\n return this.storageType;\r\n }\r\n}\r\n\r\nexport const StorageProvider: React.FC<StorageProviderProps> = ({\r\n children,\r\n storageType = 'local',\r\n namespace = '',\r\n serialize = true,\r\n encrypt = false,\r\n}) => {\r\n // Create singleton storage adapter\r\n const adapterRef = useRef<StorageAdapter | null>(null);\r\n\r\n if (!adapterRef.current) {\r\n adapterRef.current = new StorageAdapter({\r\n storageType,\r\n namespace,\r\n serialize,\r\n encrypt,\r\n });\r\n }\r\n\r\n const value: StorageContextValue = useMemo(\r\n () => ({\r\n getItem: <T = string>(key: string, defaultValue?: T) =>\r\n adapterRef.current!.getItem<T>(key, defaultValue),\r\n setItem: <T = unknown>(key: string, value: T) =>\r\n adapterRef.current!.setItem<T>(key, value),\r\n removeItem: (key: string) => adapterRef.current!.removeItem(key),\r\n clear: () => adapterRef.current!.clear(),\r\n hasItem: (key: string) => adapterRef.current!.hasItem(key),\r\n getAllKeys: () => adapterRef.current!.getAllKeys(),\r\n storageType: adapterRef.current!.getStorageType(),\r\n }),\r\n []\r\n );\r\n\r\n return (\r\n <StorageContext.Provider value={value}>\r\n {children}\r\n </StorageContext.Provider>\r\n );\r\n};\r\n","import { createContext, useContext } from 'react';\r\nimport type { StorageContextValue } from './types';\r\n\r\nexport const StorageContext = createContext<StorageContextValue | undefined>(\r\n undefined\r\n);\r\n\r\n/**\r\n * Hook to access storage functionality\r\n * Must be used within a StorageProvider\r\n * \r\n * @example\r\n * ```tsx\r\n * const storage = useStorage();\r\n * \r\n * // Store data\r\n * storage.setItem('user', { name: 'John', age: 30 });\r\n * \r\n * // Retrieve data\r\n * const user = storage.getItem('user', { name: '', age: 0 });\r\n * \r\n * // Remove data\r\n * storage.removeItem('user');\r\n * \r\n * // Check if key exists\r\n * if (storage.hasItem('user')) {\r\n * console.log('User exists');\r\n * }\r\n * \r\n * // Clear all storage\r\n * storage.clear();\r\n * ```\r\n */\r\nexport function useStorage() {\r\n const context = useContext(StorageContext);\r\n\r\n if (!context) {\r\n throw new Error('useStorage must be used within a StorageProvider');\r\n }\r\n\r\n return context;\r\n}\r\n","import React, { createContext as createReactContext, useContext as useReactContext } from 'react';\r\nimport type { ContextConfig, CreateContextResult, ProviderProps } from './types';\r\n\r\n/**\r\n * Factory function to create a type-safe context with provider and hook\r\n * \r\n * @example\r\n * ```tsx\r\n * // Define your context value type\r\n * interface ThemeContextValue {\r\n * theme: 'light' | 'dark';\r\n * toggleTheme: () => void;\r\n * }\r\n * \r\n * // Create the context\r\n * const { Provider: ThemeProvider, useContext: useTheme } = createContext<ThemeContextValue>({\r\n * name: 'Theme',\r\n * });\r\n * \r\n * // Use in your app\r\n * function App() {\r\n * const [theme, setTheme] = useState<'light' | 'dark'>('light');\r\n * \r\n * const toggleTheme = () => {\r\n * setTheme(prev => prev === 'light' ? 'dark' : 'light');\r\n * };\r\n * \r\n * return (\r\n * <ThemeProvider value={{ theme, toggleTheme }}>\r\n * <YourComponents />\r\n * </ThemeProvider>\r\n * );\r\n * }\r\n * \r\n * // Access in child components\r\n * function ChildComponent() {\r\n * const { theme, toggleTheme } = useTheme();\r\n * return <button onClick={toggleTheme}>Current: {theme}</button>;\r\n * }\r\n * ```\r\n */\r\nexport function createContext<T>(config: ContextConfig<T>): CreateContextResult<T> {\r\n const { name, errorMessage, defaultValue } = config;\r\n\r\n // Create the React context\r\n const Context = createReactContext<T | undefined>(defaultValue);\r\n Context.displayName = name;\r\n\r\n // Create the Provider component\r\n const Provider: React.FC<ProviderProps<T>> = ({ children, value }) => {\r\n return <Context.Provider value={value}>{children}</Context.Provider>;\r\n };\r\n\r\n Provider.displayName = `${name}Provider`;\r\n\r\n // Create the hook\r\n const useContext = (): T => {\r\n const context = useReactContext(Context);\r\n\r\n if (context === undefined) {\r\n const error =\r\n errorMessage ||\r\n `use${name} must be used within a ${name}Provider. ` +\r\n `Make sure you wrap your component tree with <${name}Provider>.`;\r\n throw new Error(error);\r\n }\r\n\r\n return context;\r\n };\r\n\r\n return {\r\n Context,\r\n Provider,\r\n useContext,\r\n };\r\n}\r\n","import React, { createContext as createReactContext, useContext as useReactContext } from 'react';\r\nimport type { ReactNode } from 'react';\r\n\r\nexport interface ContextWithHookConfig<T, P> {\r\n /**\r\n * Display name for the context (used in error messages and DevTools)\r\n */\r\n name: string;\r\n /**\r\n * Hook that provides the context value based on props\r\n */\r\n useValue: (props: P) => T;\r\n /**\r\n * Error message to show when hook is used outside provider\r\n */\r\n errorMessage?: string;\r\n}\r\n\r\nexport interface ProviderWithHookProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport interface CreateContextWithHookResult<T, P> {\r\n /**\r\n * The React Context object\r\n */\r\n Context: React.Context<T | undefined>;\r\n /**\r\n * Provider component that uses the hook internally\r\n */\r\n Provider: React.FC<ProviderWithHookProps & P>;\r\n /**\r\n * Hook to access the context value\r\n * @throws Error if used outside the Provider\r\n */\r\n useContext: () => T;\r\n}\r\n\r\n/**\r\n * Factory function to create a context with a custom hook that manages state\r\n * This pattern is useful when you want to encapsulate state logic in the provider\r\n *\r\n * @example\r\n * ```tsx\r\n * // Define your context value and props types\r\n * interface CounterContextValue {\r\n * count: number;\r\n * increment: () => void;\r\n * decrement: () => void;\r\n * reset: () => void;\r\n * }\r\n *\r\n * interface CounterProviderProps {\r\n * initialCount?: number;\r\n * }\r\n *\r\n * // Create the context with a custom hook\r\n * const { Provider: CounterProvider, useContext: useCounter } = createContextWithHook<\r\n * CounterContextValue,\r\n * CounterProviderProps\r\n * >({\r\n * name: 'Counter',\r\n * useValue: ({ initialCount = 0 }) => {\r\n * const [count, setCount] = useState(initialCount);\r\n *\r\n * return {\r\n * count,\r\n * increment: () => setCount(prev => prev + 1),\r\n * decrement: () => setCount(prev => prev - 1),\r\n * reset: () => setCount(initialCount),\r\n * };\r\n * },\r\n * });\r\n *\r\n * // Use in your app\r\n * function App() {\r\n * return (\r\n * <CounterProvider initialCount={10}>\r\n * <YourComponents />\r\n * </CounterProvider>\r\n * );\r\n * }\r\n *\r\n * // Access in child components\r\n * function ChildComponent() {\r\n * const { count, increment, decrement } = useCounter();\r\n * return (\r\n * <div>\r\n * <p>Count: {count}</p>\r\n * <button onClick={increment}>+</button>\r\n * <button onClick={decrement}>-</button>\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function createContextWithHook<T, P = Record<string, never>>(\r\n config: ContextWithHookConfig<T, P>\r\n): CreateContextWithHookResult<T, P> {\r\n const { name, useValue, errorMessage } = config;\r\n\r\n // Create the React context\r\n const Context = createReactContext<T | undefined>(undefined);\r\n Context.displayName = name;\r\n\r\n // Create the Provider component that uses the hook\r\n const Provider: React.FC<ProviderWithHookProps & P> = ({ children, ...props }) => {\r\n const value = useValue(props as P);\r\n return <Context.Provider value={value}>{children}</Context.Provider>;\r\n };\r\n\r\n Provider.displayName = `${name}Provider`;\r\n\r\n // Create the consumer hook\r\n const useContext = (): T => {\r\n const context = useReactContext(Context);\r\n\r\n if (context === undefined) {\r\n const error =\r\n errorMessage ||\r\n `use${name} must be used within a ${name}Provider. ` +\r\n `Make sure you wrap your component tree with <${name}Provider>.`;\r\n throw new Error(error);\r\n }\r\n\r\n return context;\r\n };\r\n\r\n return {\r\n Context,\r\n Provider,\r\n useContext,\r\n };\r\n}\r\n"],"mappings":"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","names":["createContext","import_react","import_msal_react","import_msal_browser","request","import_jsx_runtime","import_react","import_react_router_dom","import_react","import_jsx_runtime","import_jsx_runtime","Component","import_jsx_runtime","navigate","axios","queryClient","import_react_query","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","getIcon","import_react","import_react","import_jsx_runtime","value","import_react","import_jsx_runtime","createContext","createReactContext","useContext","useReactContext","import_react","import_jsx_runtime","createReactContext","useContext","useReactContext"]}
|
|
1
|
+
{"version":3,"sources":["../lib/index.ts","../lib/components/appInsights/AppInsightsProvider.tsx","../lib/components/msAuth/AuthProvider.tsx","../lib/components/msAuth/useAuth.ts","../lib/components/msAuth/Protected.tsx","../lib/components/pageRouter/RouterProvider.tsx","../lib/components/pageRouter/RouteRenderer.tsx","../lib/components/pageRouter/ErrorBoundary.tsx","../lib/components/pageRouter/navigation.ts","../lib/components/reactQuery/apiClient.ts","../lib/components/reactQuery/hooks.ts","../lib/components/reactQuery/queryProvider.tsx","../lib/components/formManager/Form.tsx","../lib/components/formManager/InputField.tsx","../lib/components/formManager/InputDropdown.tsx","../lib/components/formManager/InputRadio.tsx","../lib/components/formManager/InputCheckbox.tsx","../lib/components/formManager/InputTextarea.tsx","../lib/components/formManager/ResetButton.tsx","../lib/components/formManager/InputFile.tsx","../lib/components/globalErrorSuccessManager/ToastContext.tsx","../lib/components/globalErrorSuccessManager/useToast.ts","../lib/components/globalErrorSuccessManager/ToastContainer.tsx","../lib/components/globalErrorSuccessManager/InlineAlert.tsx","../lib/components/storageManager/StorageProvider.tsx","../lib/components/storageManager/useStorage.ts","../lib/components/contextManager/createContext.tsx","../lib/components/contextManager/createContextWithHook.tsx"],"sourcesContent":["export * from \"./components\";\n","import React, { useEffect } from \"react\";\nimport { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\n\ninterface AppInsightProps {\n instrumentationKey: string;\n}\n\nconst AppInsight: React.FC<AppInsightProps> = ({ instrumentationKey }) => {\n useEffect(() => {\n const appInsights = new ApplicationInsights({\n config: {\n instrumentationKey,\n enableAutoRouteTracking: true,\n },\n });\n appInsights.loadAppInsights();\n appInsights.trackPageView();\n }, [instrumentationKey]);\n\n return null; // No UI, just telemetry\n};\n\nexport default AppInsight;\n","import React, { useRef } from \"react\";\nimport { MsalProvider } from \"@azure/msal-react\";\nimport { PublicClientApplication, LogLevel } from \"@azure/msal-browser\";\nimport type { Configuration } from \"@azure/msal-browser\";\n\nexport type AuthProviderProps = {\n config: Configuration; // MSAL config: clientId, authority, redirectUri, cache, etc.\n children: React.ReactNode;\n};\n\nexport const AuthProvider: React.FC<AuthProviderProps> = ({\n config,\n children,\n}) => {\n const pcaRef = useRef<PublicClientApplication>(null);\n\n if (!pcaRef.current) {\n pcaRef.current = new PublicClientApplication({\n ...config,\n system: {\n ...config.system,\n loggerOptions: { logLevel: LogLevel.Info },\n },\n });\n }\n\n return <MsalProvider instance={pcaRef.current!}>{children}</MsalProvider>;\n};\n","import { useMsal, useIsAuthenticated, useAccount } from \"@azure/msal-react\";\nimport { InteractionType } from \"@azure/msal-browser\";\nimport type {\n PopupRequest,\n RedirectRequest,\n SilentRequest,\n} from \"@azure/msal-browser\";\n\ntype Options = {\n loginType?: \"popup\" | \"redirect\";\n defaultScopes?: string[]; // e.g., [\"User.Read\"]\n};\n\nexport function useAuth(options?: Options) {\n const { instance, accounts } = useMsal();\n const isAuthenticated = useIsAuthenticated();\n const account = useAccount(accounts[0] || {});\n\n const login = async (request?: PopupRequest | RedirectRequest) => {\n const req = request ?? {\n scopes: options?.defaultScopes ?? [\"openid\", \"profile\", \"offline_access\"],\n };\n if (options?.loginType === \"redirect\") {\n await instance.loginRedirect(req as RedirectRequest);\n } else {\n await instance.loginPopup(req as PopupRequest);\n }\n };\n\n const logout = async () => {\n try {\n if (options?.loginType === \"redirect\") {\n await instance.logoutRedirect();\n } else {\n await instance.logoutPopup();\n }\n } catch {\n console.error(\"Failed while trying to logout user!\");\n }\n };\n\n const acquireToken = async (scopes: string[]) => {\n const silentReq: SilentRequest = { account: accounts[0], scopes };\n try {\n const res = await instance.acquireTokenSilent(silentReq);\n return res.accessToken;\n } catch {\n if (options?.loginType === \"redirect\") {\n await instance.acquireTokenRedirect({ scopes });\n return \"\"; // token will be available after redirect completes\n } else {\n const res = await instance.acquireTokenPopup({ scopes });\n return res.accessToken;\n }\n }\n };\n\n return {\n isAuthenticated,\n account,\n login,\n logout,\n acquireToken,\n InteractionType,\n };\n}\n","import React from \"react\";\n\nexport const Protected: React.FC<{\n children: React.ReactNode;\n}> = ({ children }) => {\n return <>{children}</>;\n};\n","import React, { useEffect } from 'react';\nimport { BrowserRouter, useNavigate } from 'react-router-dom';\nimport RouteRenderer from './RouteRenderer';\nimport { type RouterProviderProps } from './types';\nimport { setNavigate } from './navigation';\n\nconst NavigatorInitializer: React.FC = () => {\n const navigate = useNavigate();\n\n useEffect(() => {\n setNavigate(navigate);\n }, [navigate]);\n\n return null;\n};\n\nconst RouterProvider: React.FC<RouterProviderProps> = ({ routes, fallbackUI }) => {\n return (\n <BrowserRouter>\n <NavigatorInitializer />\n <RouteRenderer routes={routes} fallbackUI={fallbackUI} />\n </BrowserRouter>\n );\n};\n\nexport default RouterProvider;","import React from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { type RouteConfig } from './types';\n\ninterface Props {\n routes: RouteConfig[];\n fallbackUI?: React.ReactNode;\n}\n\nconst RouteRenderer: React.FC<Props> = ({ routes, fallbackUI }) => {\n const location = useLocation();\n const currentRoute = routes.find(route => route.path === location.pathname);\n\n if (!currentRoute) {\n return fallbackUI ?? <div>404 - Page Not Found</div>;\n }\n\n const Component = currentRoute.component;\n\n return (\n <ErrorBoundary fallback={currentRoute.errorFallback}>\n <Component />\n </ErrorBoundary>\n );\n};\n\nexport default RouteRenderer","import React, { Component, type ReactNode } from \"react\";\n\ninterface ErrorBoundaryProps {\n fallback?: ReactNode;\n children: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static getDerivedStateFromError(_: Error): ErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, info: React.ErrorInfo) {\n console.error(\"Error caught in boundary:\", error, info);\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback ?? <div>Something went wrong.</div>;\n }\n\n return this.props.children;\n }\n}\n","import { type NavigateFunction } from 'react-router-dom';\n\nlet navigate: NavigateFunction | null = null;\n\nexport const setNavigate = (navFn: NavigateFunction) => {\n navigate = navFn;\n};\n\nexport const getNavigate = (): NavigateFunction => {\n if (!navigate) {\n throw new Error('Navigate function not initialized.');\n }\n return navigate;\n};","import axios, { type AxiosRequestConfig } from \"axios\";\n\nlet baseURL = \"\";\nlet globalHeaders: Record<string, string> = {};\n\nexport interface ClientConfig {\n endpoint: string;\n headers?: Record<string, string>;\n}\n\nexport const configureClient = ({ endpoint, headers }: ClientConfig): void => {\n baseURL = endpoint;\n globalHeaders = headers || {};\n};\n\nconst request = async <T>(\n method: string,\n url: string,\n data?: any\n): Promise<T> => {\n try {\n const config: AxiosRequestConfig = {\n method,\n url: `${baseURL}${url}`,\n data,\n headers: globalHeaders,\n };\n const response = await axios(config);\n return response.data as T;\n } catch (error: any) {\n const message =\n error.response?.data?.message || error.message || \"Unknown error\";\n throw new Error(message);\n }\n};\n\nexport const get = <T>(url: string): Promise<T> => request<T>(\"GET\", url);\nexport const post = <T>(url: string, data: any): Promise<T> =>\n request<T>(\"POST\", url, data);\nexport const put = <T>(url: string, data: any): Promise<T> =>\n request<T>(\"PUT\", url, data);\nexport const del = <T>(url: string): Promise<T> => request<T>(\"DELETE\", url);\n","\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { get, post, put, del } from './apiClient';\n\n// ✅ GET Hook\nexport const useGetQuery = <T>(key: string, url: string) => {\n return useQuery<T>({\n queryKey: [key],\n queryFn: () => get<T>(url),\n });\n};\n\n// ✅ POST Hook with optional invalidateKeys\nexport const usePostMutation = <T>() => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (variables: { url: string; data: any; invalidateKeys?: string[] }) =>\n post<T>(variables.url, variables.data),\n onSuccess: (_data, variables) => {\n if (variables.invalidateKeys) {\n variables.invalidateKeys.forEach((key) =>\n queryClient.invalidateQueries({ queryKey: [key] })\n );\n }\n },\n });\n};\n\n// ✅ PUT Hook\nexport const usePutMutation = <T>() => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (variables: { url: string; data: any; invalidateKeys?: string[] }) =>\n put<T>(variables.url, variables.data),\n onSuccess: (_data, variables) => {\n if (variables.invalidateKeys) {\n variables.invalidateKeys.forEach((key) =>\n queryClient.invalidateQueries({ queryKey: [key] })\n );\n }\n },\n });\n};\n\n// ✅ DELETE Hook\nexport const useDeleteMutation = <T>() => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (variables: { url: string; invalidateKeys?: string[] }) =>\n del<T>(variables.url),\n onSuccess: (_data, variables) => {\n if (variables.invalidateKeys) {\n variables.invalidateKeys.forEach((key) =>\n queryClient.invalidateQueries({ queryKey: [key] })\n );\n }\n },\n });\n};\n","\nimport React, { type ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nlet queryClient: QueryClient;\n\nconst createQueryClient = (options?: object) => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n ...options,\n });\n return queryClient;\n};\n\ninterface QueryProviderProps {\n children: ReactNode;\n}\n\nexport const QueryProvider: React.FC<QueryProviderProps> = ({ children }) => {\n if (!queryClient) {\n queryClient = createQueryClient();\n }\n return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;\n};\n","import React, {\n createContext,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { Values, Validator, FormErrors } from \"./types\";\n\ninterface FormContextShape {\n values: Values;\n errors: FormErrors;\n isValidating: boolean;\n setValue: (name: string, value: string) => void;\n clearValue: (name: string) => void;\n registerField: (\n name: string,\n validator?: Validator,\n fallbackErrorMsg?: string\n ) => void;\n unregisterField: (name: string) => void;\n validateField: (name: string) => Promise<boolean>;\n validateAll: () => Promise<boolean>;\n reset: () => void;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const FormContext = createContext<FormContextShape | null>(null);\n\nexport interface FormProps {\n initialValues?: Values;\n /** Async submit handler from target application */\n onSubmit: (values: Values) => Promise<void>;\n /** Optional error callback when onSubmit throws */\n onSubmitError?: (error: unknown) => void;\n /** Optional reset side-effect */\n onReset?: () => void;\n /** Children should include InputField and buttons */\n children: React.ReactNode;\n}\n\nexport const Form: React.FC<FormProps> = ({\n initialValues = {},\n onSubmit,\n onSubmitError,\n onReset,\n children,\n}) => {\n const [values, setValues] = useState<Values>(initialValues);\n const [errors, setErrors] = useState<FormErrors>({});\n const [isValidating, setIsValidating] = useState<boolean>(false);\n\n // registry: name -> {validator, fallbackErrorMsg}\n const registry = useRef<\n Map<string, { validator?: Validator; fallbackErrorMsg?: string }>\n >(new Map());\n\n const setValue = useCallback((name: string, value: string) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n // Clear error as user types; re-validate on blur/submit\n setErrors((prev) => ({ ...prev, [name]: undefined }));\n }, []);\n\n const clearValue = useCallback((name: string) => {\n setValues((prev) => ({ ...prev, [name]: \"\" }));\n setErrors((prev) => ({ ...prev, [name]: undefined }));\n }, []);\n\n const registerField = useCallback(\n (name: string, validator?: Validator, fallbackErrorMsg?: string) => {\n registry.current.set(name, { validator, fallbackErrorMsg });\n // Initialize missing value to empty string to simplify logic\n setValues((prev) => (name in prev ? prev : { ...prev, [name]: \"\" }));\n },\n []\n );\n\n const unregisterField = useCallback((name: string) => {\n registry.current.delete(name);\n setErrors((prev) => {\n const next = { ...prev };\n delete next[name];\n return next;\n });\n }, []);\n\n const validateField = useCallback(\n async (name: string): Promise<boolean> => {\n const entry = registry.current.get(name);\n const value = values[name] ?? \"\";\n if (!entry?.validator) {\n // No validator: consider valid\n setErrors((prev) => ({ ...prev, [name]: undefined }));\n return true;\n }\n\n const result = await entry.validator(value, values);\n // validator can return boolean or string\n if (typeof result === \"string\") {\n setErrors((prev) => ({ ...prev, [name]: result }));\n return false;\n }\n if (result === true) {\n setErrors((prev) => ({ ...prev, [name]: undefined }));\n return true;\n } else {\n // false -> show fallback error message provided as a prop from target app\n const fallback = entry.fallbackErrorMsg || \"Invalid value.\";\n setErrors((prev) => ({ ...prev, [name]: fallback }));\n return false;\n }\n },\n [values]\n );\n\n const validateAll = useCallback(async (): Promise<boolean> => {\n setIsValidating(true);\n try {\n const names = Array.from(registry.current.keys());\n const results = await Promise.all(names.map((n) => validateField(n)));\n return results.every(Boolean);\n } finally {\n setIsValidating(false);\n }\n }, [validateField]);\n\n const reset = useCallback(() => {\n setValues(initialValues);\n setErrors({});\n onReset?.();\n }, [initialValues, onReset]);\n\n const ctx = useMemo<FormContextShape>(\n () => ({\n values,\n errors,\n isValidating,\n setValue,\n clearValue,\n registerField,\n unregisterField,\n validateField,\n validateAll,\n reset,\n }),\n [\n values,\n errors,\n isValidating,\n setValue,\n clearValue,\n registerField,\n unregisterField,\n validateField,\n validateAll,\n reset,\n ]\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Ensure all validations complete before submission\n const ok = await validateAll();\n if (!ok) return;\n\n // Requirement: wrap the target app's async submit handler with try/catch\n try {\n await onSubmit(values);\n } catch (err) {\n console.error(\"Submit handler threw:\", err);\n onSubmitError?.(err);\n // Optional: set a form-level error state or toast here if needed\n }\n };\n\n return (\n <form onSubmit={handleSubmit} noValidate>\n <FormContext.Provider value={ctx}>{children}</FormContext.Provider>\n </form>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { FormContext } from \"./Form\";\nimport type { Validator } from \"./types\";\n\nexport interface InputFieldProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"name\" | \"onChange\" | \"value\"\n > {\n /** Unique field name */\n name: string;\n /** Visible label (optional) */\n label?: string;\n /** Show a clear icon inside input (default true) */\n clearable?: boolean;\n /** Validator function; can be sync or async and return boolean or string */\n validator?: Validator;\n /**\n * Fallback error message to show if validator returns false.\n * This satisfies: \"take error message as a prop from target application\"\n */\n errorMessage?: string;\n /** Additional CSS class name */\n className?: string;\n}\n\nexport const InputField: React.FC<InputFieldProps> = ({\n name,\n label,\n clearable = true,\n validator,\n errorMessage,\n type = \"text\",\n placeholder,\n disabled,\n className,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"InputField must be used inside <Form>.\");\n }\n\n const value = form.values[name] ?? \"\";\n\n // Register/unregister the field with its validator and fallback message\n useEffect(() => {\n form.registerField(name, validator, errorMessage);\n return () => form.unregisterField(name);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, validator, errorMessage]);\n\n // Re-validate on blur\n const onBlur = async () => {\n await form.validateField(name);\n };\n\n const showClear = clearable && !!value && !disabled;\n const hasError = !!form.errors[name];\n\n const containerClassName = [\n \"input-field-container\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const inputClassName = [\n \"input-field-input\",\n showClear && \"with-clear\",\n hasError && \"has-error\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={containerClassName}>\n {label && (\n <label htmlFor={name} className=\"input-field-label\">\n {label}\n </label>\n )}\n <div className=\"input-field-wrapper\">\n <input\n id={name}\n name={name}\n type={type}\n placeholder={placeholder}\n disabled={disabled}\n value={value}\n onChange={(e) => form.setValue(name, e.target.value)}\n onBlur={onBlur}\n className={inputClassName}\n {...rest}\n />\n {showClear && (\n <span\n role=\"button\"\n tabIndex={0}\n aria-label={`Clear ${label || name}`}\n title=\"Clear\"\n onClick={() => form.clearValue(name)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n form.clearValue(name);\n }\n }}\n className=\"input-field-clear-button\"\n >\n ×\n </span>\n )}\n </div>\n {hasError && (\n <div role=\"alert\" className=\"input-field-error\">\n {form.errors[name]}\n </div>\n )}\n </div>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { FormContext } from \"./Form\";\nimport type { Validator } from \"./types\";\n\nexport interface DropdownOption {\n value: string;\n label: string;\n}\n\nexport interface InputDropdownProps {\n /** Unique field name */\n name: string;\n /** Visible label (optional) */\n label?: string;\n /** Array of dropdown options */\n options: DropdownOption[];\n /** Placeholder text for empty selection */\n placeholder?: string;\n /** Show a clear icon (default true) */\n clearable?: boolean;\n /** Validator function; can be sync or async and return boolean or string */\n validator?: Validator;\n /**\n * Fallback error message to show if validator returns false.\n * This satisfies: \"take error message as a prop from target application\"\n */\n errorMessage?: string;\n /** Whether the dropdown is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Accessibility attributes */\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\nexport const InputDropdown: React.FC<InputDropdownProps> = ({\n name,\n label,\n options,\n placeholder = \"Select an option\",\n clearable = true,\n validator,\n errorMessage,\n disabled,\n className,\n style,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"InputDropdown must be used inside <Form>.\");\n }\n\n const value = form.values[name] ?? \"\";\n\n // Register/unregister the field with its validator and fallback message\n useEffect(() => {\n form.registerField(name, validator, errorMessage);\n return () => form.unregisterField(name);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, validator, errorMessage]);\n\n // Re-validate on blur\n const onBlur = async () => {\n await form.validateField(name);\n };\n\n const showClear = clearable && !!value && !disabled;\n const hasError = !!form.errors[name];\n\n const selectClassName = [\n \"input-dropdown-select\",\n showClear && \"with-clear\",\n hasError && \"has-error\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"input-dropdown-container\">\n {label && (\n <label htmlFor={name} className=\"input-dropdown-label\">\n {label}\n </label>\n )}\n <div className=\"input-dropdown-wrapper\">\n <select\n id={name}\n name={name}\n disabled={disabled}\n value={value}\n onChange={(e) => form.setValue(name, e.target.value)}\n onBlur={onBlur}\n className={selectClassName}\n style={style}\n {...rest}\n >\n <option value=\"\" disabled>\n {placeholder}\n </option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n {showClear && (\n <button\n type=\"button\"\n aria-label={`Clear ${label || name}`}\n title=\"Clear\"\n onClick={() => form.clearValue(name)}\n className=\"input-dropdown-clear-button\"\n >\n ×\n </button>\n )}\n </div>\n {hasError && (\n <div role=\"alert\" className=\"input-dropdown-error\">\n {form.errors[name]}\n </div>\n )}\n </div>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { FormContext } from \"./Form\";\nimport type { Validator } from \"./types\";\n\nexport interface RadioOption {\n value: string;\n label: string;\n}\n\nexport interface InputRadioProps {\n /** Unique field name */\n name: string;\n /** Visible label (optional) */\n label?: string;\n /** Array of radio options */\n options: RadioOption[];\n /** Validator function; can be sync or async and return boolean or string */\n validator?: Validator;\n /**\n * Fallback error message to show if validator returns false.\n * This satisfies: \"take error message as a prop from target application\"\n */\n errorMessage?: string;\n /** Whether the radio group is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Accessibility attributes */\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\nexport const InputRadio: React.FC<InputRadioProps> = ({\n name,\n label,\n options,\n validator,\n errorMessage,\n disabled,\n className,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"InputRadio must be used inside <Form>.\");\n }\n\n const value = form.values[name] ?? \"\";\n\n // Register/unregister the field with its validator and fallback message\n useEffect(() => {\n form.registerField(name, validator, errorMessage);\n return () => form.unregisterField(name);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, validator, errorMessage]);\n\n // Re-validate on blur\n const onBlur = async () => {\n await form.validateField(name);\n };\n\n const hasError = !!form.errors[name];\n\n const containerClassName = [\n \"input-radio-container\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={containerClassName}>\n {label && (\n <div className=\"input-radio-label\">\n {label}\n </div>\n )}\n <div className=\"input-radio-options\" role=\"radiogroup\" {...rest}>\n {options.map((option) => (\n <label\n key={option.value}\n className={`input-radio-option ${disabled ? \"disabled\" : \"\"}`}\n >\n <input\n type=\"radio\"\n name={name}\n value={option.value}\n checked={value === option.value}\n onChange={(e) => form.setValue(name, e.target.value)}\n onBlur={onBlur}\n disabled={disabled}\n className=\"input-radio-input\"\n />\n <span className=\"input-radio-option-label\">{option.label}</span>\n </label>\n ))}\n </div>\n {hasError && (\n <div role=\"alert\" className=\"input-radio-error\">\n {form.errors[name]}\n </div>\n )}\n </div>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { FormContext } from \"./Form\";\nimport type { Validator } from \"./types\";\n\nexport interface CheckboxOption {\n value: string;\n label: string;\n}\n\nexport interface InputCheckboxProps {\n /** Unique field name */\n name: string;\n /** Visible label (optional) */\n label?: string;\n /** Array of checkbox options */\n options: CheckboxOption[];\n /** Validator function; can be sync or async and return boolean or string */\n validator?: Validator;\n /**\n * Fallback error message to show if validator returns false.\n * This satisfies: \"take error message as a prop from target application\"\n */\n errorMessage?: string;\n /** Whether the checkbox group is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Accessibility attributes */\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\nexport const InputCheckbox: React.FC<InputCheckboxProps> = ({\n name,\n label,\n options,\n validator,\n errorMessage,\n disabled,\n className,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"InputCheckbox must be used inside <Form>.\");\n }\n\n const value = form.values[name] ?? \"\";\n const selectedValues = value ? value.split(\",\") : [];\n\n // Register/unregister the field with its validator and fallback message\n useEffect(() => {\n form.registerField(name, validator, errorMessage);\n return () => form.unregisterField(name);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, validator, errorMessage]);\n\n // Re-validate on blur\n const onBlur = async () => {\n await form.validateField(name);\n };\n\n const handleChange = (optionValue: string, checked: boolean) => {\n let newSelectedValues: string[];\n \n if (checked) {\n newSelectedValues = [...selectedValues, optionValue];\n } else {\n newSelectedValues = selectedValues.filter((v) => v !== optionValue);\n }\n \n form.setValue(name, newSelectedValues.join(\",\"));\n };\n\n const hasError = !!form.errors[name];\n\n const containerClassName = [\n \"input-checkbox-container\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={containerClassName}>\n {label && (\n <div className=\"input-checkbox-label\">\n {label}\n </div>\n )}\n <div className=\"input-checkbox-options\" role=\"group\" {...rest}>\n {options.map((option) => (\n <label\n key={option.value}\n className={`input-checkbox-option ${disabled ? \"disabled\" : \"\"}`}\n >\n <input\n type=\"checkbox\"\n name={`${name}-${option.value}`}\n value={option.value}\n checked={selectedValues.includes(option.value)}\n onChange={(e) => handleChange(option.value, e.target.checked)}\n onBlur={onBlur}\n disabled={disabled}\n className=\"input-checkbox-input\"\n />\n <span className=\"input-checkbox-option-label\">{option.label}</span>\n </label>\n ))}\n </div>\n {hasError && (\n <div role=\"alert\" className=\"input-checkbox-error\">\n {form.errors[name]}\n </div>\n )}\n </div>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { FormContext } from \"./Form\";\nimport type { Validator } from \"./types\";\n\nexport interface InputTextareaProps {\n /** Unique field name */\n name: string;\n /** Visible label (optional) */\n label?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Show a clear icon (default true) */\n clearable?: boolean;\n /** Validator function; can be sync or async and return boolean or string */\n validator?: Validator;\n /**\n * Fallback error message to show if validator returns false.\n * This satisfies: \"take error message as a prop from target application\"\n */\n errorMessage?: string;\n /** Whether the textarea is disabled */\n disabled?: boolean;\n /** Number of rows */\n rows?: number;\n /** Maximum length */\n maxLength?: number;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Accessibility attributes */\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\nexport const InputTextarea: React.FC<InputTextareaProps> = ({\n name,\n label,\n placeholder,\n clearable = true,\n validator,\n errorMessage,\n disabled,\n rows,\n maxLength,\n className,\n style,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"InputTextarea must be used inside <Form>.\");\n }\n\n const value = form.values[name] ?? \"\";\n\n // Register/unregister the field with its validator and fallback message\n useEffect(() => {\n form.registerField(name, validator, errorMessage);\n return () => form.unregisterField(name);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, validator, errorMessage]);\n\n // Re-validate on blur\n const onBlur = async () => {\n await form.validateField(name);\n };\n\n const showClear = clearable && !!value && !disabled;\n const hasError = !!form.errors[name];\n\n const textareaClassName = [\n \"input-textarea-field\",\n showClear && \"with-clear\",\n hasError && \"has-error\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"input-textarea-container\">\n {label && (\n <label htmlFor={name} className=\"input-textarea-label\">\n {label}\n </label>\n )}\n <div className=\"input-textarea-wrapper\">\n <textarea\n id={name}\n name={name}\n placeholder={placeholder}\n disabled={disabled}\n rows={rows}\n maxLength={maxLength}\n value={value}\n onChange={(e) => form.setValue(name, e.target.value)}\n onBlur={onBlur}\n className={textareaClassName}\n style={style}\n {...rest}\n />\n {showClear && (\n <button\n type=\"button\"\n aria-label={`Clear ${label || name}`}\n title=\"Clear\"\n onClick={() => form.clearValue(name)}\n className=\"input-textarea-clear-button\"\n >\n ×\n </button>\n )}\n </div>\n {hasError && (\n <div role=\"alert\" className=\"input-textarea-error\">\n {form.errors[name]}\n </div>\n )}\n </div>\n );\n};\n","import React, { useContext } from \"react\";\nimport { FormContext } from \"./Form\";\n\nexport interface ResetButtonProps\n extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"onClick\"\n > {\n /** Optional custom text (default: \"Reset\") */\n children?: React.ReactNode;\n}\n\nexport const ResetButton: React.FC<ResetButtonProps> = ({\n children,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"ResetButton must be used inside <Form>.\");\n }\n\n return (\n <button type=\"button\" onClick={form.reset} {...rest}>\n {children ?? \"Reset\"}\n </button>\n );\n};\n","import React, { useContext, useEffect, useRef, useState } from 'react';\nimport { FormContext } from './Form';\n\ninterface InputFileProps {\n name?: string;\n label?: string;\n accept?: string;\n maxLength?: number;\n maxFileSize?: number; // in bytes, default 2MB\n uploadUrl?: string;\n onFileChange?: (file: File | null) => void;\n disabled?: boolean;\n validator?: (value: string) => boolean | string;\n errorMessage?: string;\n /** Additional CSS class name */\n className?: string;\n}\n\nconst InputFile: React.FC<InputFileProps> = ({\n name,\n label = 'Upload File',\n accept,\n maxLength = 20,\n maxFileSize = 2 * 1024 * 1024, // 2MB default\n onFileChange,\n disabled = false,\n validator,\n errorMessage = 'Please select a file.',\n className,\n}) => {\n const formContext = useContext(FormContext);\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Register field with form context if name is provided\n useEffect(() => {\n if (name && formContext) {\n formContext.registerField(name, validator, errorMessage);\n return () => formContext.unregisterField(name);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name]);\n\n const truncateFileName = (fileName: string, maxLen: number): string => {\n if (fileName.length <= maxLen) {\n return fileName;\n }\n\n const extensionIndex = fileName.lastIndexOf('.');\n const extension = extensionIndex !== -1 ? fileName.substring(extensionIndex) : '';\n const nameWithoutExt = extensionIndex !== -1 ? fileName.substring(0, extensionIndex) : fileName;\n\n const availableLength = maxLen - extension.length - 10; // 10 dots for ellipsis\n const initialChars = nameWithoutExt.substring(0, Math.max(availableLength, 5));\n\n return `${initialChars}..........${extension}`;\n };\n\n const handleBrowseClick = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) {\n setSelectedFile(null);\n if (onFileChange) onFileChange(null);\n if (name && formContext) {\n formContext.setValue(name, '');\n }\n return;\n }\n\n // Validate file size\n if (file.size > maxFileSize) {\n const maxSizeMB = (maxFileSize / (1024 * 1024)).toFixed(2);\n \n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n setSelectedFile(null);\n if (onFileChange) onFileChange(null);\n if (name && formContext) {\n formContext.setValue(name, '');\n }\n alert(`File size exceeds ${maxSizeMB}MB limit.`);\n return;\n }\n\n setSelectedFile(file);\n \n // Update form context with file name\n if (name && formContext) {\n formContext.setValue(name, file.name);\n }\n \n // Notify parent of file selection\n if (onFileChange) {\n onFileChange(file);\n }\n };\n\n\n\n const hasError = name && formContext?.errors[name];\n const errorMsg = hasError ? formContext?.errors[name] : null;\n\n const containerClassName = [\n \"input-file-container\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={containerClassName}>\n {label && <label className=\"input-file-label\">{label}</label>}\n \n <div className=\"input-file-wrapper\">\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={accept}\n onChange={handleFileChange}\n disabled={disabled}\n className=\"input-file-hidden\"\n />\n \n <button\n type=\"button\"\n onClick={handleBrowseClick}\n disabled={disabled}\n className=\"input-file-browse-btn\"\n >\n Browse\n </button>\n\n {selectedFile && (\n <span\n className=\"input-file-name\"\n title={selectedFile.name}\n >\n {truncateFileName(selectedFile.name, maxLength)}\n </span>\n )}\n </div>\n \n {errorMsg && <div className=\"input-file-error\">{errorMsg}</div>}\n </div>\n );\n};\n\nexport default InputFile;\n","import React, { useState, useCallback } from 'react';\nimport type { ReactNode } from 'react';\nimport type { Toast, ToastType, ToastContextValue } from './ToastContext.types';\nimport { ToastContext } from './useToast';\n\ninterface ToastProviderProps {\n children: ReactNode;\n /** Default duration in milliseconds (default: 3000) */\n defaultDuration?: number;\n /** Maximum number of toasts to show at once (default: 5) */\n maxToasts?: number;\n}\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({\n children,\n defaultDuration = 3000,\n maxToasts = 5,\n}) => {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const showToast = useCallback(\n (message: string, type: ToastType, duration: number = defaultDuration) => {\n const id = `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const newToast: Toast = { id, message, type, duration };\n\n setToasts((prev) => {\n const updated = [...prev, newToast];\n // Keep only the last maxToasts\n return updated.slice(-maxToasts);\n });\n\n if (duration > 0) {\n setTimeout(() => {\n removeToast(id);\n }, duration);\n }\n },\n [defaultDuration, maxToasts, removeToast]\n );\n\n const showSuccess = useCallback(\n (message: string, duration?: number) => {\n showToast(message, 'success', duration);\n },\n [showToast]\n );\n\n const showError = useCallback(\n (message: string, duration?: number) => {\n showToast(message, 'error', duration);\n },\n [showToast]\n );\n\n const showInfo = useCallback(\n (message: string, duration?: number) => {\n showToast(message, 'info', duration);\n },\n [showToast]\n );\n\n const showWarning = useCallback(\n (message: string, duration?: number) => {\n showToast(message, 'warning', duration);\n },\n [showToast]\n );\n\n const value: ToastContextValue = {\n toasts,\n showToast,\n showSuccess,\n showError,\n showInfo,\n showWarning,\n removeToast,\n };\n\n return <ToastContext.Provider value={value}>{children}</ToastContext.Provider>;\n};\n","import { useContext, createContext } from 'react';\nimport type { ToastContextValue } from './ToastContext.types';\n\nexport const ToastContext = createContext<ToastContextValue | undefined>(undefined);\n\nexport const useToast = (): ToastContextValue => {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return context;\n};\n","import React from 'react';\nimport { useToast } from './useToast';\nimport type { Toast } from './ToastContext.types';\n\ninterface ToastContainerProps {\n /** Position of toast container (default: 'top-right') */\n position?: 'top-left' | 'top-right' | 'top-center' | 'bottom-left' | 'bottom-right' | 'bottom-center';\n /** Additional CSS class name */\n className?: string;\n}\n\nexport const ToastContainer: React.FC<ToastContainerProps> = ({\n position = 'top-right',\n className,\n}) => {\n const { toasts, removeToast } = useToast();\n\n const containerClassName = [\n 'toast-container',\n `toast-container-${position}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const getToastClassName = (type: string) => {\n return [\n 'toast',\n `toast-${type}`,\n ]\n .filter(Boolean)\n .join(' ');\n };\n\n return (\n <div className={containerClassName}>\n {toasts.map((toast: Toast) => (\n <div\n key={toast.id}\n className={getToastClassName(toast.type)}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <div className=\"toast-content\">\n <span className=\"toast-icon\">{getIcon(toast.type)}</span>\n <span className=\"toast-message\">{toast.message}</span>\n </div>\n <button\n type=\"button\"\n className=\"toast-close\"\n onClick={() => removeToast(toast.id)}\n aria-label=\"Close\"\n >\n ×\n </button>\n </div>\n ))}\n </div>\n );\n};\n\nfunction getIcon(type: string): string {\n switch (type) {\n case 'success':\n return '✓';\n case 'error':\n return '✕';\n case 'warning':\n return '⚠';\n case 'info':\n return 'ℹ';\n default:\n return '';\n }\n}\n","import React from 'react';\n\nexport interface InlineAlertProps {\n /** Type of alert */\n type: 'success' | 'error' | 'warning' | 'info';\n /** Alert message */\n message: string;\n /** Optional title */\n title?: string;\n /** Whether to show close button */\n dismissible?: boolean;\n /** Callback when alert is dismissed */\n onDismiss?: () => void;\n /** Additional CSS class name */\n className?: string;\n}\n\nexport const InlineAlert: React.FC<InlineAlertProps> = ({\n type,\n message,\n title,\n dismissible = false,\n onDismiss,\n className,\n}) => {\n const alertClassName = [\n 'inline-alert',\n `inline-alert-${type}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const getIcon = () => {\n switch (type) {\n case 'success':\n return '✓';\n case 'error':\n return '✕';\n case 'warning':\n return '⚠';\n case 'info':\n return 'ℹ';\n default:\n return '';\n }\n };\n\n return (\n <div className={alertClassName} role=\"alert\">\n <div className=\"inline-alert-icon\">{getIcon()}</div>\n <div className=\"inline-alert-content\">\n {title && <div className=\"inline-alert-title\">{title}</div>}\n <div className=\"inline-alert-message\">{message}</div>\n </div>\n {dismissible && (\n <button\n type=\"button\"\n className=\"inline-alert-close\"\n onClick={onDismiss}\n aria-label=\"Close\"\n >\n ×\n </button>\n )}\n </div>\n );\n};\n","import React, { useRef, useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport { StorageContext } from './useStorage';\nimport type { StorageOptions, StorageContextValue, StorageType } from './types';\n\nexport interface StorageProviderProps extends StorageOptions {\n children: ReactNode;\n}\n\nclass StorageAdapter {\n private storage: Storage | Map<string, string>;\n private namespace: string;\n private serialize: boolean;\n private encrypt: boolean;\n private storageType: StorageType;\n\n constructor(options: StorageOptions = {}) {\n this.namespace = options.namespace || '';\n this.serialize = options.serialize ?? true;\n this.encrypt = options.encrypt ?? false;\n this.storageType = options.storageType || 'local';\n\n // Select storage backend\n if (this.storageType === 'local') {\n this.storage = typeof window !== 'undefined' ? window.localStorage : new Map();\n } else if (this.storageType === 'session') {\n this.storage = typeof window !== 'undefined' ? window.sessionStorage : new Map();\n } else {\n this.storage = new Map();\n }\n }\n\n private getKey(key: string): string {\n return this.namespace ? `${this.namespace}:${key}` : key;\n }\n\n private encodeValue(value: string): string {\n if (!this.encrypt) return value;\n // Basic obfuscation (not cryptographically secure)\n return btoa(encodeURIComponent(value));\n }\n\n private decodeValue(value: string): string {\n if (!this.encrypt) return value;\n try {\n return decodeURIComponent(atob(value));\n } catch {\n return value;\n }\n }\n\n getItem<T = string>(key: string, defaultValue?: T): T | null {\n try {\n const fullKey = this.getKey(key);\n const rawValue = this.storage instanceof Map \n ? this.storage.get(fullKey) \n : this.storage.getItem(fullKey);\n\n if (rawValue === null || rawValue === undefined) {\n return defaultValue ?? null;\n }\n\n const decodedValue = this.decodeValue(rawValue);\n\n if (this.serialize) {\n return JSON.parse(decodedValue) as T;\n }\n return decodedValue as T;\n } catch (error) {\n console.error(`Error getting item \"${key}\" from storage:`, error);\n return defaultValue ?? null;\n }\n }\n\n setItem<T = unknown>(key: string, value: T): void {\n try {\n const fullKey = this.getKey(key);\n const serializedValue = this.serialize ? JSON.stringify(value) : String(value);\n const encodedValue = this.encodeValue(serializedValue);\n\n if (this.storage instanceof Map) {\n this.storage.set(fullKey, encodedValue);\n } else {\n this.storage.setItem(fullKey, encodedValue);\n }\n } catch (error) {\n console.error(`Error setting item \"${key}\" in storage:`, error);\n }\n }\n\n removeItem(key: string): void {\n try {\n const fullKey = this.getKey(key);\n if (this.storage instanceof Map) {\n this.storage.delete(fullKey);\n } else {\n this.storage.removeItem(fullKey);\n }\n } catch (error) {\n console.error(`Error removing item \"${key}\" from storage:`, error);\n }\n }\n\n clear(): void {\n try {\n if (this.storage instanceof Map) {\n this.storage.clear();\n } else {\n // Only clear items with the namespace\n if (this.namespace) {\n const keys = this.getAllKeys();\n keys.forEach(key => this.removeItem(key));\n } else {\n this.storage.clear();\n }\n }\n } catch (error) {\n console.error('Error clearing storage:', error);\n }\n }\n\n hasItem(key: string): boolean {\n const fullKey = this.getKey(key);\n if (this.storage instanceof Map) {\n return this.storage.has(fullKey);\n }\n return this.storage.getItem(fullKey) !== null;\n }\n\n getAllKeys(): string[] {\n try {\n if (this.storage instanceof Map) {\n return Array.from(this.storage.keys())\n .filter(key => !this.namespace || key.startsWith(`${this.namespace}:`))\n .map(key => this.namespace ? key.slice(this.namespace.length + 1) : key);\n } else {\n const allKeys = Object.keys(this.storage);\n return allKeys\n .filter(key => !this.namespace || key.startsWith(`${this.namespace}:`))\n .map(key => this.namespace ? key.slice(this.namespace.length + 1) : key);\n }\n } catch (error) {\n console.error('Error getting all keys from storage:', error);\n return [];\n }\n }\n\n getStorageType(): StorageType {\n return this.storageType;\n }\n}\n\nexport const StorageProvider: React.FC<StorageProviderProps> = ({\n children,\n storageType = 'local',\n namespace = '',\n serialize = true,\n encrypt = false,\n}) => {\n // Create singleton storage adapter\n const adapterRef = useRef<StorageAdapter | null>(null);\n\n if (!adapterRef.current) {\n adapterRef.current = new StorageAdapter({\n storageType,\n namespace,\n serialize,\n encrypt,\n });\n }\n\n const value: StorageContextValue = useMemo(\n () => ({\n getItem: <T = string>(key: string, defaultValue?: T) =>\n adapterRef.current!.getItem<T>(key, defaultValue),\n setItem: <T = unknown>(key: string, value: T) =>\n adapterRef.current!.setItem<T>(key, value),\n removeItem: (key: string) => adapterRef.current!.removeItem(key),\n clear: () => adapterRef.current!.clear(),\n hasItem: (key: string) => adapterRef.current!.hasItem(key),\n getAllKeys: () => adapterRef.current!.getAllKeys(),\n storageType: adapterRef.current!.getStorageType(),\n }),\n []\n );\n\n return (\n <StorageContext.Provider value={value}>\n {children}\n </StorageContext.Provider>\n );\n};\n","import { createContext, useContext } from 'react';\nimport type { StorageContextValue } from './types';\n\nexport const StorageContext = createContext<StorageContextValue | undefined>(\n undefined\n);\n\n/**\n * Hook to access storage functionality\n * Must be used within a StorageProvider\n * \n * @example\n * ```tsx\n * const storage = useStorage();\n * \n * // Store data\n * storage.setItem('user', { name: 'John', age: 30 });\n * \n * // Retrieve data\n * const user = storage.getItem('user', { name: '', age: 0 });\n * \n * // Remove data\n * storage.removeItem('user');\n * \n * // Check if key exists\n * if (storage.hasItem('user')) {\n * console.log('User exists');\n * }\n * \n * // Clear all storage\n * storage.clear();\n * ```\n */\nexport function useStorage() {\n const context = useContext(StorageContext);\n\n if (!context) {\n throw new Error('useStorage must be used within a StorageProvider');\n }\n\n return context;\n}\n","import React, { createContext as createReactContext, useContext as useReactContext } from 'react';\nimport type { ContextConfig, CreateContextResult, ProviderProps } from './types';\n\n/**\n * Factory function to create a type-safe context with provider and hook\n * \n * @example\n * ```tsx\n * // Define your context value type\n * interface ThemeContextValue {\n * theme: 'light' | 'dark';\n * toggleTheme: () => void;\n * }\n * \n * // Create the context\n * const { Provider: ThemeProvider, useContext: useTheme } = createContext<ThemeContextValue>({\n * name: 'Theme',\n * });\n * \n * // Use in your app\n * function App() {\n * const [theme, setTheme] = useState<'light' | 'dark'>('light');\n * \n * const toggleTheme = () => {\n * setTheme(prev => prev === 'light' ? 'dark' : 'light');\n * };\n * \n * return (\n * <ThemeProvider value={{ theme, toggleTheme }}>\n * <YourComponents />\n * </ThemeProvider>\n * );\n * }\n * \n * // Access in child components\n * function ChildComponent() {\n * const { theme, toggleTheme } = useTheme();\n * return <button onClick={toggleTheme}>Current: {theme}</button>;\n * }\n * ```\n */\nexport function createContext<T>(config: ContextConfig<T>): CreateContextResult<T> {\n const { name, errorMessage, defaultValue } = config;\n\n // Create the React context\n const Context = createReactContext<T | undefined>(defaultValue);\n Context.displayName = name;\n\n // Create the Provider component\n const Provider: React.FC<ProviderProps<T>> = ({ children, value }) => {\n return <Context.Provider value={value}>{children}</Context.Provider>;\n };\n\n Provider.displayName = `${name}Provider`;\n\n // Create the hook\n const useContext = (): T => {\n const context = useReactContext(Context);\n\n if (context === undefined) {\n const error =\n errorMessage ||\n `use${name} must be used within a ${name}Provider. ` +\n `Make sure you wrap your component tree with <${name}Provider>.`;\n throw new Error(error);\n }\n\n return context;\n };\n\n return {\n Context,\n Provider,\n useContext,\n };\n}\n","import React, { createContext as createReactContext, useContext as useReactContext } from 'react';\nimport type { ReactNode } from 'react';\n\nexport interface ContextWithHookConfig<T, P> {\n /**\n * Display name for the context (used in error messages and DevTools)\n */\n name: string;\n /**\n * Hook that provides the context value based on props\n */\n useValue: (props: P) => T;\n /**\n * Error message to show when hook is used outside provider\n */\n errorMessage?: string;\n}\n\nexport interface ProviderWithHookProps {\n children: ReactNode;\n}\n\nexport interface CreateContextWithHookResult<T, P> {\n /**\n * The React Context object\n */\n Context: React.Context<T | undefined>;\n /**\n * Provider component that uses the hook internally\n */\n Provider: React.FC<ProviderWithHookProps & P>;\n /**\n * Hook to access the context value\n * @throws Error if used outside the Provider\n */\n useContext: () => T;\n}\n\n/**\n * Factory function to create a context with a custom hook that manages state\n * This pattern is useful when you want to encapsulate state logic in the provider\n *\n * @example\n * ```tsx\n * // Define your context value and props types\n * interface CounterContextValue {\n * count: number;\n * increment: () => void;\n * decrement: () => void;\n * reset: () => void;\n * }\n *\n * interface CounterProviderProps {\n * initialCount?: number;\n * }\n *\n * // Create the context with a custom hook\n * const { Provider: CounterProvider, useContext: useCounter } = createContextWithHook<\n * CounterContextValue,\n * CounterProviderProps\n * >({\n * name: 'Counter',\n * useValue: ({ initialCount = 0 }) => {\n * const [count, setCount] = useState(initialCount);\n *\n * return {\n * count,\n * increment: () => setCount(prev => prev + 1),\n * decrement: () => setCount(prev => prev - 1),\n * reset: () => setCount(initialCount),\n * };\n * },\n * });\n *\n * // Use in your app\n * function App() {\n * return (\n * <CounterProvider initialCount={10}>\n * <YourComponents />\n * </CounterProvider>\n * );\n * }\n *\n * // Access in child components\n * function ChildComponent() {\n * const { count, increment, decrement } = useCounter();\n * return (\n * <div>\n * <p>Count: {count}</p>\n * <button onClick={increment}>+</button>\n * <button onClick={decrement}>-</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function createContextWithHook<T, P = Record<string, never>>(\n config: ContextWithHookConfig<T, P>\n): CreateContextWithHookResult<T, P> {\n const { name, useValue, errorMessage } = config;\n\n // Create the React context\n const Context = createReactContext<T | undefined>(undefined);\n Context.displayName = name;\n\n // Create the Provider component that uses the hook\n const Provider: React.FC<ProviderWithHookProps & P> = ({ children, ...props }) => {\n const value = useValue(props as P);\n return <Context.Provider value={value}>{children}</Context.Provider>;\n };\n\n Provider.displayName = `${name}Provider`;\n\n // Create the consumer hook\n const useContext = (): T => {\n const context = useReactContext(Context);\n\n if (context === undefined) {\n const error =\n errorMessage ||\n `use${name} must be used within a ${name}Provider. ` +\n `Make sure you wrap your component tree with <${name}Provider>.`;\n throw new Error(error);\n }\n\n return context;\n };\n\n return {\n Context,\n Provider,\n useContext,\n };\n}\n"],"mappings":"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","names":["createContext","import_react","import_msal_react","import_msal_browser","request","import_jsx_runtime","import_react","import_react_router_dom","import_react","import_jsx_runtime","import_jsx_runtime","Component","import_jsx_runtime","navigate","axios","queryClient","import_react_query","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","getIcon","import_react","import_react","import_jsx_runtime","value","import_react","import_jsx_runtime","createContext","createReactContext","useContext","useReactContext","import_react","import_jsx_runtime","createReactContext","useContext","useReactContext"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/components/appInsights/AppInsightsProvider.tsx","../lib/components/msAuth/AuthProvider.tsx","../lib/components/msAuth/useAuth.ts","../lib/components/msAuth/Protected.tsx","../lib/components/pageRouter/RouterProvider.tsx","../lib/components/pageRouter/RouteRenderer.tsx","../lib/components/pageRouter/ErrorBoundary.tsx","../lib/components/pageRouter/navigation.ts","../lib/components/reactQuery/apiClient.ts","../lib/components/reactQuery/hooks.ts","../lib/components/reactQuery/queryProvider.tsx","../lib/components/formManager/Form.tsx","../lib/components/formManager/InputField.tsx","../lib/components/formManager/InputDropdown.tsx","../lib/components/formManager/InputRadio.tsx","../lib/components/formManager/InputCheckbox.tsx","../lib/components/formManager/InputTextarea.tsx","../lib/components/formManager/ResetButton.tsx","../lib/components/formManager/InputFile.tsx","../lib/components/globalErrorSuccessManager/ToastContext.tsx","../lib/components/globalErrorSuccessManager/useToast.ts","../lib/components/globalErrorSuccessManager/ToastContainer.tsx","../lib/components/globalErrorSuccessManager/InlineAlert.tsx","../lib/components/storageManager/StorageProvider.tsx","../lib/components/storageManager/useStorage.ts","../lib/components/contextManager/createContext.tsx","../lib/components/contextManager/createContextWithHook.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\r\nimport { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\r\n\r\ninterface AppInsightProps {\r\n instrumentationKey: string;\r\n}\r\n\r\nconst AppInsight: React.FC<AppInsightProps> = ({ instrumentationKey }) => {\r\n useEffect(() => {\r\n const appInsights = new ApplicationInsights({\r\n config: {\r\n instrumentationKey,\r\n enableAutoRouteTracking: true,\r\n },\r\n });\r\n appInsights.loadAppInsights();\r\n appInsights.trackPageView();\r\n }, [instrumentationKey]);\r\n\r\n return null; // No UI, just telemetry\r\n};\r\n\r\nexport default AppInsight;\r\n","import React, { useRef } from \"react\";\r\nimport { MsalProvider } from \"@azure/msal-react\";\r\nimport { PublicClientApplication, LogLevel } from \"@azure/msal-browser\";\r\nimport type { Configuration } from \"@azure/msal-browser\";\r\n\r\nexport type AuthProviderProps = {\r\n config: Configuration; // MSAL config: clientId, authority, redirectUri, cache, etc.\r\n children: React.ReactNode;\r\n};\r\n\r\nexport const AuthProvider: React.FC<AuthProviderProps> = ({\r\n config,\r\n children,\r\n}) => {\r\n const pcaRef = useRef<PublicClientApplication>(null);\r\n\r\n if (!pcaRef.current) {\r\n pcaRef.current = new PublicClientApplication({\r\n ...config,\r\n system: {\r\n ...config.system,\r\n loggerOptions: { logLevel: LogLevel.Info },\r\n },\r\n });\r\n }\r\n\r\n return <MsalProvider instance={pcaRef.current!}>{children}</MsalProvider>;\r\n};\r\n","import { useMsal, useIsAuthenticated, useAccount } from \"@azure/msal-react\";\r\nimport { InteractionType } from \"@azure/msal-browser\";\r\nimport type {\r\n PopupRequest,\r\n RedirectRequest,\r\n SilentRequest,\r\n} from \"@azure/msal-browser\";\r\n\r\ntype Options = {\r\n loginType?: \"popup\" | \"redirect\";\r\n defaultScopes?: string[]; // e.g., [\"User.Read\"]\r\n};\r\n\r\nexport function useAuth(options?: Options) {\r\n const { instance, accounts } = useMsal();\r\n const isAuthenticated = useIsAuthenticated();\r\n const account = useAccount(accounts[0] || {});\r\n\r\n const login = async (request?: PopupRequest | RedirectRequest) => {\r\n const req = request ?? {\r\n scopes: options?.defaultScopes ?? [\"openid\", \"profile\", \"offline_access\"],\r\n };\r\n if (options?.loginType === \"redirect\") {\r\n await instance.loginRedirect(req as RedirectRequest);\r\n } else {\r\n await instance.loginPopup(req as PopupRequest);\r\n }\r\n };\r\n\r\n const logout = async () => {\r\n try {\r\n if (options?.loginType === \"redirect\") {\r\n await instance.logoutRedirect();\r\n } else {\r\n await instance.logoutPopup();\r\n }\r\n } catch {\r\n console.error(\"Failed while trying to logout user!\");\r\n }\r\n };\r\n\r\n const acquireToken = async (scopes: string[]) => {\r\n const silentReq: SilentRequest = { account: accounts[0], scopes };\r\n try {\r\n const res = await instance.acquireTokenSilent(silentReq);\r\n return res.accessToken;\r\n } catch {\r\n if (options?.loginType === \"redirect\") {\r\n await instance.acquireTokenRedirect({ scopes });\r\n return \"\"; // token will be available after redirect completes\r\n } else {\r\n const res = await instance.acquireTokenPopup({ scopes });\r\n return res.accessToken;\r\n }\r\n }\r\n };\r\n\r\n return {\r\n isAuthenticated,\r\n account,\r\n login,\r\n logout,\r\n acquireToken,\r\n InteractionType,\r\n };\r\n}\r\n","import React from \"react\";\r\n\r\nexport const Protected: React.FC<{\r\n children: React.ReactNode;\r\n}> = ({ children }) => {\r\n return <>{children}</>;\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { BrowserRouter, useNavigate } from 'react-router-dom';\r\nimport RouteRenderer from './RouteRenderer';\r\nimport { type RouterProviderProps } from './types';\r\nimport { setNavigate } from './navigation';\r\n\r\nconst NavigatorInitializer: React.FC = () => {\r\n const navigate = useNavigate();\r\n\r\n useEffect(() => {\r\n setNavigate(navigate);\r\n }, [navigate]);\r\n\r\n return null;\r\n};\r\n\r\nconst RouterProvider: React.FC<RouterProviderProps> = ({ routes, fallbackUI }) => {\r\n return (\r\n <BrowserRouter>\r\n <NavigatorInitializer />\r\n <RouteRenderer routes={routes} fallbackUI={fallbackUI} />\r\n </BrowserRouter>\r\n );\r\n};\r\n\r\nexport default RouterProvider;","import React from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { ErrorBoundary } from './ErrorBoundary';\r\nimport { type RouteConfig } from './types';\r\n\r\ninterface Props {\r\n routes: RouteConfig[];\r\n fallbackUI?: React.ReactNode;\r\n}\r\n\r\nconst RouteRenderer: React.FC<Props> = ({ routes, fallbackUI }) => {\r\n const location = useLocation();\r\n const currentRoute = routes.find(route => route.path === location.pathname);\r\n\r\n if (!currentRoute) {\r\n return fallbackUI ?? <div>404 - Page Not Found</div>;\r\n }\r\n\r\n const Component = currentRoute.component;\r\n\r\n return (\r\n <ErrorBoundary fallback={currentRoute.errorFallback}>\r\n <Component />\r\n </ErrorBoundary>\r\n );\r\n};\r\n\r\nexport default RouteRenderer","import React, { Component, type ReactNode } from \"react\";\r\n\r\ninterface ErrorBoundaryProps {\r\n fallback?: ReactNode;\r\n children: ReactNode;\r\n}\r\n\r\ninterface ErrorBoundaryState {\r\n hasError: boolean;\r\n}\r\n\r\nexport class ErrorBoundary extends Component<\r\n ErrorBoundaryProps,\r\n ErrorBoundaryState\r\n> {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = { hasError: false };\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n static getDerivedStateFromError(_: Error): ErrorBoundaryState {\r\n return { hasError: true };\r\n }\r\n\r\n componentDidCatch(error: Error, info: React.ErrorInfo) {\r\n console.error(\"Error caught in boundary:\", error, info);\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n return this.props.fallback ?? <div>Something went wrong.</div>;\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n","import { type NavigateFunction } from 'react-router-dom';\r\n\r\nlet navigate: NavigateFunction | null = null;\r\n\r\nexport const setNavigate = (navFn: NavigateFunction) => {\r\n navigate = navFn;\r\n};\r\n\r\nexport const getNavigate = (): NavigateFunction => {\r\n if (!navigate) {\r\n throw new Error('Navigate function not initialized.');\r\n }\r\n return navigate;\r\n};","import axios, { type AxiosRequestConfig } from \"axios\";\r\n\r\nlet baseURL = \"\";\r\nlet globalHeaders: Record<string, string> = {};\r\n\r\nexport interface ClientConfig {\r\n endpoint: string;\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport const configureClient = ({ endpoint, headers }: ClientConfig): void => {\r\n baseURL = endpoint;\r\n globalHeaders = headers || {};\r\n};\r\n\r\nconst request = async <T>(\r\n method: string,\r\n url: string,\r\n data?: any\r\n): Promise<T> => {\r\n try {\r\n const config: AxiosRequestConfig = {\r\n method,\r\n url: `${baseURL}${url}`,\r\n data,\r\n headers: globalHeaders,\r\n };\r\n const response = await axios(config);\r\n return response.data as T;\r\n } catch (error: any) {\r\n const message =\r\n error.response?.data?.message || error.message || \"Unknown error\";\r\n throw new Error(message);\r\n }\r\n};\r\n\r\nexport const get = <T>(url: string): Promise<T> => request<T>(\"GET\", url);\r\nexport const post = <T>(url: string, data: any): Promise<T> =>\r\n request<T>(\"POST\", url, data);\r\nexport const put = <T>(url: string, data: any): Promise<T> =>\r\n request<T>(\"PUT\", url, data);\r\nexport const del = <T>(url: string): Promise<T> => request<T>(\"DELETE\", url);\r\n","\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport { get, post, put, del } from './apiClient';\r\n\r\n// ✅ GET Hook\r\nexport const useGetQuery = <T>(key: string, url: string) => {\r\n return useQuery<T>({\r\n queryKey: [key],\r\n queryFn: () => get<T>(url),\r\n });\r\n};\r\n\r\n// ✅ POST Hook with optional invalidateKeys\r\nexport const usePostMutation = <T>() => {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: (variables: { url: string; data: any; invalidateKeys?: string[] }) =>\r\n post<T>(variables.url, variables.data),\r\n onSuccess: (_data, variables) => {\r\n if (variables.invalidateKeys) {\r\n variables.invalidateKeys.forEach((key) =>\r\n queryClient.invalidateQueries({ queryKey: [key] })\r\n );\r\n }\r\n },\r\n });\r\n};\r\n\r\n// ✅ PUT Hook\r\nexport const usePutMutation = <T>() => {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: (variables: { url: string; data: any; invalidateKeys?: string[] }) =>\r\n put<T>(variables.url, variables.data),\r\n onSuccess: (_data, variables) => {\r\n if (variables.invalidateKeys) {\r\n variables.invalidateKeys.forEach((key) =>\r\n queryClient.invalidateQueries({ queryKey: [key] })\r\n );\r\n }\r\n },\r\n });\r\n};\r\n\r\n// ✅ DELETE Hook\r\nexport const useDeleteMutation = <T>() => {\r\n const queryClient = useQueryClient();\r\n return useMutation({\r\n mutationFn: (variables: { url: string; invalidateKeys?: string[] }) =>\r\n del<T>(variables.url),\r\n onSuccess: (_data, variables) => {\r\n if (variables.invalidateKeys) {\r\n variables.invalidateKeys.forEach((key) =>\r\n queryClient.invalidateQueries({ queryKey: [key] })\r\n );\r\n }\r\n },\r\n });\r\n};\r\n","\r\nimport React, { type ReactNode } from 'react';\r\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\r\n\r\nlet queryClient: QueryClient;\r\n\r\nconst createQueryClient = (options?: object) => {\r\n queryClient = new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n retry: 1,\r\n refetchOnWindowFocus: false,\r\n },\r\n },\r\n ...options,\r\n });\r\n return queryClient;\r\n};\r\n\r\ninterface QueryProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport const QueryProvider: React.FC<QueryProviderProps> = ({ children }) => {\r\n if (!queryClient) {\r\n queryClient = createQueryClient();\r\n }\r\n return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;\r\n};\r\n","import React, {\r\n createContext,\r\n useCallback,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport type { Values, Validator, FormErrors } from \"./types\";\r\n\r\ninterface FormContextShape {\r\n values: Values;\r\n errors: FormErrors;\r\n isValidating: boolean;\r\n setValue: (name: string, value: string) => void;\r\n clearValue: (name: string) => void;\r\n registerField: (\r\n name: string,\r\n validator?: Validator,\r\n fallbackErrorMsg?: string\r\n ) => void;\r\n unregisterField: (name: string) => void;\r\n validateField: (name: string) => Promise<boolean>;\r\n validateAll: () => Promise<boolean>;\r\n reset: () => void;\r\n}\r\n\r\n// eslint-disable-next-line react-refresh/only-export-components\r\nexport const FormContext = createContext<FormContextShape | null>(null);\r\n\r\nexport interface FormProps {\r\n initialValues?: Values;\r\n /** Async submit handler from target application */\r\n onSubmit: (values: Values) => Promise<void>;\r\n /** Optional error callback when onSubmit throws */\r\n onSubmitError?: (error: unknown) => void;\r\n /** Optional reset side-effect */\r\n onReset?: () => void;\r\n /** Children should include InputField and buttons */\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const Form: React.FC<FormProps> = ({\r\n initialValues = {},\r\n onSubmit,\r\n onSubmitError,\r\n onReset,\r\n children,\r\n}) => {\r\n const [values, setValues] = useState<Values>(initialValues);\r\n const [errors, setErrors] = useState<FormErrors>({});\r\n const [isValidating, setIsValidating] = useState<boolean>(false);\r\n\r\n // registry: name -> {validator, fallbackErrorMsg}\r\n const registry = useRef<\r\n Map<string, { validator?: Validator; fallbackErrorMsg?: string }>\r\n >(new Map());\r\n\r\n const setValue = useCallback((name: string, value: string) => {\r\n setValues((prev) => ({ ...prev, [name]: value }));\r\n // Clear error as user types; re-validate on blur/submit\r\n setErrors((prev) => ({ ...prev, [name]: undefined }));\r\n }, []);\r\n\r\n const clearValue = useCallback((name: string) => {\r\n setValues((prev) => ({ ...prev, [name]: \"\" }));\r\n setErrors((prev) => ({ ...prev, [name]: undefined }));\r\n }, []);\r\n\r\n const registerField = useCallback(\r\n (name: string, validator?: Validator, fallbackErrorMsg?: string) => {\r\n registry.current.set(name, { validator, fallbackErrorMsg });\r\n // Initialize missing value to empty string to simplify logic\r\n setValues((prev) => (name in prev ? prev : { ...prev, [name]: \"\" }));\r\n },\r\n []\r\n );\r\n\r\n const unregisterField = useCallback((name: string) => {\r\n registry.current.delete(name);\r\n setErrors((prev) => {\r\n const next = { ...prev };\r\n delete next[name];\r\n return next;\r\n });\r\n }, []);\r\n\r\n const validateField = useCallback(\r\n async (name: string): Promise<boolean> => {\r\n const entry = registry.current.get(name);\r\n const value = values[name] ?? \"\";\r\n if (!entry?.validator) {\r\n // No validator: consider valid\r\n setErrors((prev) => ({ ...prev, [name]: undefined }));\r\n return true;\r\n }\r\n\r\n const result = await entry.validator(value, values);\r\n // validator can return boolean or string\r\n if (typeof result === \"string\") {\r\n setErrors((prev) => ({ ...prev, [name]: result }));\r\n return false;\r\n }\r\n if (result === true) {\r\n setErrors((prev) => ({ ...prev, [name]: undefined }));\r\n return true;\r\n } else {\r\n // false -> show fallback error message provided as a prop from target app\r\n const fallback = entry.fallbackErrorMsg || \"Invalid value.\";\r\n setErrors((prev) => ({ ...prev, [name]: fallback }));\r\n return false;\r\n }\r\n },\r\n [values]\r\n );\r\n\r\n const validateAll = useCallback(async (): Promise<boolean> => {\r\n setIsValidating(true);\r\n try {\r\n const names = Array.from(registry.current.keys());\r\n const results = await Promise.all(names.map((n) => validateField(n)));\r\n return results.every(Boolean);\r\n } finally {\r\n setIsValidating(false);\r\n }\r\n }, [validateField]);\r\n\r\n const reset = useCallback(() => {\r\n setValues(initialValues);\r\n setErrors({});\r\n onReset?.();\r\n }, [initialValues, onReset]);\r\n\r\n const ctx = useMemo<FormContextShape>(\r\n () => ({\r\n values,\r\n errors,\r\n isValidating,\r\n setValue,\r\n clearValue,\r\n registerField,\r\n unregisterField,\r\n validateField,\r\n validateAll,\r\n reset,\r\n }),\r\n [\r\n values,\r\n errors,\r\n isValidating,\r\n setValue,\r\n clearValue,\r\n registerField,\r\n unregisterField,\r\n validateField,\r\n validateAll,\r\n reset,\r\n ]\r\n );\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n\r\n // Ensure all validations complete before submission\r\n const ok = await validateAll();\r\n if (!ok) return;\r\n\r\n // Requirement: wrap the target app's async submit handler with try/catch\r\n try {\r\n await onSubmit(values);\r\n } catch (err) {\r\n console.error(\"Submit handler threw:\", err);\r\n onSubmitError?.(err);\r\n // Optional: set a form-level error state or toast here if needed\r\n }\r\n };\r\n\r\n return (\r\n <form onSubmit={handleSubmit} noValidate>\r\n <FormContext.Provider value={ctx}>{children}</FormContext.Provider>\r\n </form>\r\n );\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\nimport type { Validator } from \"./types\";\r\n\r\nexport interface InputFieldProps\r\n extends Omit<\r\n React.InputHTMLAttributes<HTMLInputElement>,\r\n \"name\" | \"onChange\" | \"value\"\r\n > {\r\n /** Unique field name */\r\n name: string;\r\n /** Visible label (optional) */\r\n label?: string;\r\n /** Show a clear icon inside input (default true) */\r\n clearable?: boolean;\r\n /** Validator function; can be sync or async and return boolean or string */\r\n validator?: Validator;\r\n /**\r\n * Fallback error message to show if validator returns false.\r\n * This satisfies: \"take error message as a prop from target application\"\r\n */\r\n errorMessage?: string;\r\n /** Additional CSS class name */\r\n className?: string;\r\n}\r\n\r\nexport const InputField: React.FC<InputFieldProps> = ({\r\n name,\r\n label,\r\n clearable = true,\r\n validator,\r\n errorMessage,\r\n type = \"text\",\r\n placeholder,\r\n disabled,\r\n className,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"InputField must be used inside <Form>.\");\r\n }\r\n\r\n const value = form.values[name] ?? \"\";\r\n\r\n // Register/unregister the field with its validator and fallback message\r\n useEffect(() => {\r\n form.registerField(name, validator, errorMessage);\r\n return () => form.unregisterField(name);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, validator, errorMessage]);\r\n\r\n // Re-validate on blur\r\n const onBlur = async () => {\r\n await form.validateField(name);\r\n };\r\n\r\n const showClear = clearable && !!value && !disabled;\r\n const hasError = !!form.errors[name];\r\n\r\n const containerClassName = [\r\n \"input-field-container\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const inputClassName = [\r\n \"input-field-input\",\r\n showClear && \"with-clear\",\r\n hasError && \"has-error\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={containerClassName}>\r\n {label && (\r\n <label htmlFor={name} className=\"input-field-label\">\r\n {label}\r\n </label>\r\n )}\r\n <div className=\"input-field-wrapper\">\r\n <input\r\n id={name}\r\n name={name}\r\n type={type}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n value={value}\r\n onChange={(e) => form.setValue(name, e.target.value)}\r\n onBlur={onBlur}\r\n className={inputClassName}\r\n {...rest}\r\n />\r\n {showClear && (\r\n <span\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-label={`Clear ${label || name}`}\r\n title=\"Clear\"\r\n onClick={() => form.clearValue(name)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n form.clearValue(name);\r\n }\r\n }}\r\n className=\"input-field-clear-button\"\r\n >\r\n ×\r\n </span>\r\n )}\r\n </div>\r\n {hasError && (\r\n <div role=\"alert\" className=\"input-field-error\">\r\n {form.errors[name]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\nimport type { Validator } from \"./types\";\r\n\r\nexport interface DropdownOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport interface InputDropdownProps {\r\n /** Unique field name */\r\n name: string;\r\n /** Visible label (optional) */\r\n label?: string;\r\n /** Array of dropdown options */\r\n options: DropdownOption[];\r\n /** Placeholder text for empty selection */\r\n placeholder?: string;\r\n /** Show a clear icon (default true) */\r\n clearable?: boolean;\r\n /** Validator function; can be sync or async and return boolean or string */\r\n validator?: Validator;\r\n /**\r\n * Fallback error message to show if validator returns false.\r\n * This satisfies: \"take error message as a prop from target application\"\r\n */\r\n errorMessage?: string;\r\n /** Whether the dropdown is disabled */\r\n disabled?: boolean;\r\n /** Additional CSS class name */\r\n className?: string;\r\n /** Additional inline styles */\r\n style?: React.CSSProperties;\r\n /** Accessibility attributes */\r\n 'aria-label'?: string;\r\n 'aria-describedby'?: string;\r\n}\r\n\r\nexport const InputDropdown: React.FC<InputDropdownProps> = ({\r\n name,\r\n label,\r\n options,\r\n placeholder = \"Select an option\",\r\n clearable = true,\r\n validator,\r\n errorMessage,\r\n disabled,\r\n className,\r\n style,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"InputDropdown must be used inside <Form>.\");\r\n }\r\n\r\n const value = form.values[name] ?? \"\";\r\n\r\n // Register/unregister the field with its validator and fallback message\r\n useEffect(() => {\r\n form.registerField(name, validator, errorMessage);\r\n return () => form.unregisterField(name);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, validator, errorMessage]);\r\n\r\n // Re-validate on blur\r\n const onBlur = async () => {\r\n await form.validateField(name);\r\n };\r\n\r\n const showClear = clearable && !!value && !disabled;\r\n const hasError = !!form.errors[name];\r\n\r\n const selectClassName = [\r\n \"input-dropdown-select\",\r\n showClear && \"with-clear\",\r\n hasError && \"has-error\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className=\"input-dropdown-container\">\r\n {label && (\r\n <label htmlFor={name} className=\"input-dropdown-label\">\r\n {label}\r\n </label>\r\n )}\r\n <div className=\"input-dropdown-wrapper\">\r\n <select\r\n id={name}\r\n name={name}\r\n disabled={disabled}\r\n value={value}\r\n onChange={(e) => form.setValue(name, e.target.value)}\r\n onBlur={onBlur}\r\n className={selectClassName}\r\n style={style}\r\n {...rest}\r\n >\r\n <option value=\"\" disabled>\r\n {placeholder}\r\n </option>\r\n {options.map((option) => (\r\n <option key={option.value} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n {showClear && (\r\n <button\r\n type=\"button\"\r\n aria-label={`Clear ${label || name}`}\r\n title=\"Clear\"\r\n onClick={() => form.clearValue(name)}\r\n className=\"input-dropdown-clear-button\"\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n {hasError && (\r\n <div role=\"alert\" className=\"input-dropdown-error\">\r\n {form.errors[name]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\nimport type { Validator } from \"./types\";\r\n\r\nexport interface RadioOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport interface InputRadioProps {\r\n /** Unique field name */\r\n name: string;\r\n /** Visible label (optional) */\r\n label?: string;\r\n /** Array of radio options */\r\n options: RadioOption[];\r\n /** Validator function; can be sync or async and return boolean or string */\r\n validator?: Validator;\r\n /**\r\n * Fallback error message to show if validator returns false.\r\n * This satisfies: \"take error message as a prop from target application\"\r\n */\r\n errorMessage?: string;\r\n /** Whether the radio group is disabled */\r\n disabled?: boolean;\r\n /** Additional CSS class name */\r\n className?: string;\r\n /** Accessibility attributes */\r\n 'aria-label'?: string;\r\n 'aria-describedby'?: string;\r\n}\r\n\r\nexport const InputRadio: React.FC<InputRadioProps> = ({\r\n name,\r\n label,\r\n options,\r\n validator,\r\n errorMessage,\r\n disabled,\r\n className,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"InputRadio must be used inside <Form>.\");\r\n }\r\n\r\n const value = form.values[name] ?? \"\";\r\n\r\n // Register/unregister the field with its validator and fallback message\r\n useEffect(() => {\r\n form.registerField(name, validator, errorMessage);\r\n return () => form.unregisterField(name);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, validator, errorMessage]);\r\n\r\n // Re-validate on blur\r\n const onBlur = async () => {\r\n await form.validateField(name);\r\n };\r\n\r\n const hasError = !!form.errors[name];\r\n\r\n const containerClassName = [\r\n \"input-radio-container\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={containerClassName}>\r\n {label && (\r\n <div className=\"input-radio-label\">\r\n {label}\r\n </div>\r\n )}\r\n <div className=\"input-radio-options\" role=\"radiogroup\" {...rest}>\r\n {options.map((option) => (\r\n <label\r\n key={option.value}\r\n className={`input-radio-option ${disabled ? \"disabled\" : \"\"}`}\r\n >\r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={option.value}\r\n checked={value === option.value}\r\n onChange={(e) => form.setValue(name, e.target.value)}\r\n onBlur={onBlur}\r\n disabled={disabled}\r\n className=\"input-radio-input\"\r\n />\r\n <span className=\"input-radio-option-label\">{option.label}</span>\r\n </label>\r\n ))}\r\n </div>\r\n {hasError && (\r\n <div role=\"alert\" className=\"input-radio-error\">\r\n {form.errors[name]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\nimport type { Validator } from \"./types\";\r\n\r\nexport interface CheckboxOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport interface InputCheckboxProps {\r\n /** Unique field name */\r\n name: string;\r\n /** Visible label (optional) */\r\n label?: string;\r\n /** Array of checkbox options */\r\n options: CheckboxOption[];\r\n /** Validator function; can be sync or async and return boolean or string */\r\n validator?: Validator;\r\n /**\r\n * Fallback error message to show if validator returns false.\r\n * This satisfies: \"take error message as a prop from target application\"\r\n */\r\n errorMessage?: string;\r\n /** Whether the checkbox group is disabled */\r\n disabled?: boolean;\r\n /** Additional CSS class name */\r\n className?: string;\r\n /** Accessibility attributes */\r\n 'aria-label'?: string;\r\n 'aria-describedby'?: string;\r\n}\r\n\r\nexport const InputCheckbox: React.FC<InputCheckboxProps> = ({\r\n name,\r\n label,\r\n options,\r\n validator,\r\n errorMessage,\r\n disabled,\r\n className,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"InputCheckbox must be used inside <Form>.\");\r\n }\r\n\r\n const value = form.values[name] ?? \"\";\r\n const selectedValues = value ? value.split(\",\") : [];\r\n\r\n // Register/unregister the field with its validator and fallback message\r\n useEffect(() => {\r\n form.registerField(name, validator, errorMessage);\r\n return () => form.unregisterField(name);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, validator, errorMessage]);\r\n\r\n // Re-validate on blur\r\n const onBlur = async () => {\r\n await form.validateField(name);\r\n };\r\n\r\n const handleChange = (optionValue: string, checked: boolean) => {\r\n let newSelectedValues: string[];\r\n \r\n if (checked) {\r\n newSelectedValues = [...selectedValues, optionValue];\r\n } else {\r\n newSelectedValues = selectedValues.filter((v) => v !== optionValue);\r\n }\r\n \r\n form.setValue(name, newSelectedValues.join(\",\"));\r\n };\r\n\r\n const hasError = !!form.errors[name];\r\n\r\n const containerClassName = [\r\n \"input-checkbox-container\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={containerClassName}>\r\n {label && (\r\n <div className=\"input-checkbox-label\">\r\n {label}\r\n </div>\r\n )}\r\n <div className=\"input-checkbox-options\" role=\"group\" {...rest}>\r\n {options.map((option) => (\r\n <label\r\n key={option.value}\r\n className={`input-checkbox-option ${disabled ? \"disabled\" : \"\"}`}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n name={`${name}-${option.value}`}\r\n value={option.value}\r\n checked={selectedValues.includes(option.value)}\r\n onChange={(e) => handleChange(option.value, e.target.checked)}\r\n onBlur={onBlur}\r\n disabled={disabled}\r\n className=\"input-checkbox-input\"\r\n />\r\n <span className=\"input-checkbox-option-label\">{option.label}</span>\r\n </label>\r\n ))}\r\n </div>\r\n {hasError && (\r\n <div role=\"alert\" className=\"input-checkbox-error\">\r\n {form.errors[name]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useContext, useEffect } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\nimport type { Validator } from \"./types\";\r\n\r\nexport interface InputTextareaProps {\r\n /** Unique field name */\r\n name: string;\r\n /** Visible label (optional) */\r\n label?: string;\r\n /** Placeholder text */\r\n placeholder?: string;\r\n /** Show a clear icon (default true) */\r\n clearable?: boolean;\r\n /** Validator function; can be sync or async and return boolean or string */\r\n validator?: Validator;\r\n /**\r\n * Fallback error message to show if validator returns false.\r\n * This satisfies: \"take error message as a prop from target application\"\r\n */\r\n errorMessage?: string;\r\n /** Whether the textarea is disabled */\r\n disabled?: boolean;\r\n /** Number of rows */\r\n rows?: number;\r\n /** Maximum length */\r\n maxLength?: number;\r\n /** Additional CSS class name */\r\n className?: string;\r\n /** Additional inline styles */\r\n style?: React.CSSProperties;\r\n /** Accessibility attributes */\r\n 'aria-label'?: string;\r\n 'aria-describedby'?: string;\r\n}\r\n\r\nexport const InputTextarea: React.FC<InputTextareaProps> = ({\r\n name,\r\n label,\r\n placeholder,\r\n clearable = true,\r\n validator,\r\n errorMessage,\r\n disabled,\r\n rows,\r\n maxLength,\r\n className,\r\n style,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"InputTextarea must be used inside <Form>.\");\r\n }\r\n\r\n const value = form.values[name] ?? \"\";\r\n\r\n // Register/unregister the field with its validator and fallback message\r\n useEffect(() => {\r\n form.registerField(name, validator, errorMessage);\r\n return () => form.unregisterField(name);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name, validator, errorMessage]);\r\n\r\n // Re-validate on blur\r\n const onBlur = async () => {\r\n await form.validateField(name);\r\n };\r\n\r\n const showClear = clearable && !!value && !disabled;\r\n const hasError = !!form.errors[name];\r\n\r\n const textareaClassName = [\r\n \"input-textarea-field\",\r\n showClear && \"with-clear\",\r\n hasError && \"has-error\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className=\"input-textarea-container\">\r\n {label && (\r\n <label htmlFor={name} className=\"input-textarea-label\">\r\n {label}\r\n </label>\r\n )}\r\n <div className=\"input-textarea-wrapper\">\r\n <textarea\r\n id={name}\r\n name={name}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n rows={rows}\r\n maxLength={maxLength}\r\n value={value}\r\n onChange={(e) => form.setValue(name, e.target.value)}\r\n onBlur={onBlur}\r\n className={textareaClassName}\r\n style={style}\r\n {...rest}\r\n />\r\n {showClear && (\r\n <button\r\n type=\"button\"\r\n aria-label={`Clear ${label || name}`}\r\n title=\"Clear\"\r\n onClick={() => form.clearValue(name)}\r\n className=\"input-textarea-clear-button\"\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n {hasError && (\r\n <div role=\"alert\" className=\"input-textarea-error\">\r\n {form.errors[name]}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useContext } from \"react\";\r\nimport { FormContext } from \"./Form\";\r\n\r\nexport interface ResetButtonProps\r\n extends Omit<\r\n React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n \"type\" | \"onClick\"\r\n > {\r\n /** Optional custom text (default: \"Reset\") */\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const ResetButton: React.FC<ResetButtonProps> = ({\r\n children,\r\n ...rest\r\n}) => {\r\n const form = useContext(FormContext);\r\n if (!form) {\r\n throw new Error(\"ResetButton must be used inside <Form>.\");\r\n }\r\n\r\n return (\r\n <button type=\"button\" onClick={form.reset} {...rest}>\r\n {children ?? \"Reset\"}\r\n </button>\r\n );\r\n};\r\n","import React, { useContext, useEffect, useRef, useState } from 'react';\r\nimport { FormContext } from './Form';\r\n\r\ninterface InputFileProps {\r\n name?: string;\r\n label?: string;\r\n accept?: string;\r\n maxLength?: number;\r\n maxFileSize?: number; // in bytes, default 2MB\r\n uploadUrl?: string;\r\n onFileChange?: (file: File | null) => void;\r\n disabled?: boolean;\r\n validator?: (value: string) => boolean | string;\r\n errorMessage?: string;\r\n /** Additional CSS class name */\r\n className?: string;\r\n}\r\n\r\nconst InputFile: React.FC<InputFileProps> = ({\r\n name,\r\n label = 'Upload File',\r\n accept,\r\n maxLength = 20,\r\n maxFileSize = 2 * 1024 * 1024, // 2MB default\r\n onFileChange,\r\n disabled = false,\r\n validator,\r\n errorMessage = 'Please select a file.',\r\n className,\r\n}) => {\r\n const formContext = useContext(FormContext);\r\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Register field with form context if name is provided\r\n useEffect(() => {\r\n if (name && formContext) {\r\n formContext.registerField(name, validator, errorMessage);\r\n return () => formContext.unregisterField(name);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [name]);\r\n\r\n const truncateFileName = (fileName: string, maxLen: number): string => {\r\n if (fileName.length <= maxLen) {\r\n return fileName;\r\n }\r\n\r\n const extensionIndex = fileName.lastIndexOf('.');\r\n const extension = extensionIndex !== -1 ? fileName.substring(extensionIndex) : '';\r\n const nameWithoutExt = extensionIndex !== -1 ? fileName.substring(0, extensionIndex) : fileName;\r\n\r\n const availableLength = maxLen - extension.length - 10; // 10 dots for ellipsis\r\n const initialChars = nameWithoutExt.substring(0, Math.max(availableLength, 5));\r\n\r\n return `${initialChars}..........${extension}`;\r\n };\r\n\r\n const handleBrowseClick = () => {\r\n fileInputRef.current?.click();\r\n };\r\n\r\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = event.target.files?.[0];\r\n if (!file) {\r\n setSelectedFile(null);\r\n if (onFileChange) onFileChange(null);\r\n if (name && formContext) {\r\n formContext.setValue(name, '');\r\n }\r\n return;\r\n }\r\n\r\n // Validate file size\r\n if (file.size > maxFileSize) {\r\n const maxSizeMB = (maxFileSize / (1024 * 1024)).toFixed(2);\r\n \r\n if (fileInputRef.current) {\r\n fileInputRef.current.value = '';\r\n }\r\n setSelectedFile(null);\r\n if (onFileChange) onFileChange(null);\r\n if (name && formContext) {\r\n formContext.setValue(name, '');\r\n }\r\n alert(`File size exceeds ${maxSizeMB}MB limit.`);\r\n return;\r\n }\r\n\r\n setSelectedFile(file);\r\n \r\n // Update form context with file name\r\n if (name && formContext) {\r\n formContext.setValue(name, file.name);\r\n }\r\n \r\n // Notify parent of file selection\r\n if (onFileChange) {\r\n onFileChange(file);\r\n }\r\n };\r\n\r\n\r\n\r\n const hasError = name && formContext?.errors[name];\r\n const errorMsg = hasError ? formContext?.errors[name] : null;\r\n\r\n const containerClassName = [\r\n \"input-file-container\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return (\r\n <div className={containerClassName}>\r\n {label && <label className=\"input-file-label\">{label}</label>}\r\n \r\n <div className=\"input-file-wrapper\">\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept={accept}\r\n onChange={handleFileChange}\r\n disabled={disabled}\r\n className=\"input-file-hidden\"\r\n />\r\n \r\n <button\r\n type=\"button\"\r\n onClick={handleBrowseClick}\r\n disabled={disabled}\r\n className=\"input-file-browse-btn\"\r\n >\r\n Browse\r\n </button>\r\n\r\n {selectedFile && (\r\n <span\r\n className=\"input-file-name\"\r\n title={selectedFile.name}\r\n >\r\n {truncateFileName(selectedFile.name, maxLength)}\r\n </span>\r\n )}\r\n </div>\r\n \r\n {errorMsg && <div className=\"input-file-error\">{errorMsg}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nexport default InputFile;\r\n","import React, { useState, useCallback } from 'react';\r\nimport type { ReactNode } from 'react';\r\nimport type { Toast, ToastType, ToastContextValue } from './ToastContext.types';\r\nimport { ToastContext } from './useToast';\r\n\r\ninterface ToastProviderProps {\r\n children: ReactNode;\r\n /** Default duration in milliseconds (default: 3000) */\r\n defaultDuration?: number;\r\n /** Maximum number of toasts to show at once (default: 5) */\r\n maxToasts?: number;\r\n}\r\n\r\nexport const ToastProvider: React.FC<ToastProviderProps> = ({\r\n children,\r\n defaultDuration = 3000,\r\n maxToasts = 5,\r\n}) => {\r\n const [toasts, setToasts] = useState<Toast[]>([]);\r\n\r\n const removeToast = useCallback((id: string) => {\r\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\r\n }, []);\r\n\r\n const showToast = useCallback(\r\n (message: string, type: ToastType, duration: number = defaultDuration) => {\r\n const id = `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n const newToast: Toast = { id, message, type, duration };\r\n\r\n setToasts((prev) => {\r\n const updated = [...prev, newToast];\r\n // Keep only the last maxToasts\r\n return updated.slice(-maxToasts);\r\n });\r\n\r\n if (duration > 0) {\r\n setTimeout(() => {\r\n removeToast(id);\r\n }, duration);\r\n }\r\n },\r\n [defaultDuration, maxToasts, removeToast]\r\n );\r\n\r\n const showSuccess = useCallback(\r\n (message: string, duration?: number) => {\r\n showToast(message, 'success', duration);\r\n },\r\n [showToast]\r\n );\r\n\r\n const showError = useCallback(\r\n (message: string, duration?: number) => {\r\n showToast(message, 'error', duration);\r\n },\r\n [showToast]\r\n );\r\n\r\n const showInfo = useCallback(\r\n (message: string, duration?: number) => {\r\n showToast(message, 'info', duration);\r\n },\r\n [showToast]\r\n );\r\n\r\n const showWarning = useCallback(\r\n (message: string, duration?: number) => {\r\n showToast(message, 'warning', duration);\r\n },\r\n [showToast]\r\n );\r\n\r\n const value: ToastContextValue = {\r\n toasts,\r\n showToast,\r\n showSuccess,\r\n showError,\r\n showInfo,\r\n showWarning,\r\n removeToast,\r\n };\r\n\r\n return <ToastContext.Provider value={value}>{children}</ToastContext.Provider>;\r\n};\r\n","import { useContext, createContext } from 'react';\r\nimport type { ToastContextValue } from './ToastContext.types';\r\n\r\nexport const ToastContext = createContext<ToastContextValue | undefined>(undefined);\r\n\r\nexport const useToast = (): ToastContextValue => {\r\n const context = useContext(ToastContext);\r\n if (!context) {\r\n throw new Error('useToast must be used within a ToastProvider');\r\n }\r\n return context;\r\n};\r\n","import React from 'react';\r\nimport { useToast } from './useToast';\r\nimport type { Toast } from './ToastContext.types';\r\n\r\ninterface ToastContainerProps {\r\n /** Position of toast container (default: 'top-right') */\r\n position?: 'top-left' | 'top-right' | 'top-center' | 'bottom-left' | 'bottom-right' | 'bottom-center';\r\n /** Additional CSS class name */\r\n className?: string;\r\n}\r\n\r\nexport const ToastContainer: React.FC<ToastContainerProps> = ({\r\n position = 'top-right',\r\n className,\r\n}) => {\r\n const { toasts, removeToast } = useToast();\r\n\r\n const containerClassName = [\r\n 'toast-container',\r\n `toast-container-${position}`,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const getToastClassName = (type: string) => {\r\n return [\r\n 'toast',\r\n `toast-${type}`,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n };\r\n\r\n return (\r\n <div className={containerClassName}>\r\n {toasts.map((toast: Toast) => (\r\n <div\r\n key={toast.id}\r\n className={getToastClassName(toast.type)}\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n >\r\n <div className=\"toast-content\">\r\n <span className=\"toast-icon\">{getIcon(toast.type)}</span>\r\n <span className=\"toast-message\">{toast.message}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n className=\"toast-close\"\r\n onClick={() => removeToast(toast.id)}\r\n aria-label=\"Close\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nfunction getIcon(type: string): string {\r\n switch (type) {\r\n case 'success':\r\n return '✓';\r\n case 'error':\r\n return '✕';\r\n case 'warning':\r\n return '⚠';\r\n case 'info':\r\n return 'ℹ';\r\n default:\r\n return '';\r\n }\r\n}\r\n","import React from 'react';\r\n\r\nexport interface InlineAlertProps {\r\n /** Type of alert */\r\n type: 'success' | 'error' | 'warning' | 'info';\r\n /** Alert message */\r\n message: string;\r\n /** Optional title */\r\n title?: string;\r\n /** Whether to show close button */\r\n dismissible?: boolean;\r\n /** Callback when alert is dismissed */\r\n onDismiss?: () => void;\r\n /** Additional CSS class name */\r\n className?: string;\r\n}\r\n\r\nexport const InlineAlert: React.FC<InlineAlertProps> = ({\r\n type,\r\n message,\r\n title,\r\n dismissible = false,\r\n onDismiss,\r\n className,\r\n}) => {\r\n const alertClassName = [\r\n 'inline-alert',\r\n `inline-alert-${type}`,\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const getIcon = () => {\r\n switch (type) {\r\n case 'success':\r\n return '✓';\r\n case 'error':\r\n return '✕';\r\n case 'warning':\r\n return '⚠';\r\n case 'info':\r\n return 'ℹ';\r\n default:\r\n return '';\r\n }\r\n };\r\n\r\n return (\r\n <div className={alertClassName} role=\"alert\">\r\n <div className=\"inline-alert-icon\">{getIcon()}</div>\r\n <div className=\"inline-alert-content\">\r\n {title && <div className=\"inline-alert-title\">{title}</div>}\r\n <div className=\"inline-alert-message\">{message}</div>\r\n </div>\r\n {dismissible && (\r\n <button\r\n type=\"button\"\r\n className=\"inline-alert-close\"\r\n onClick={onDismiss}\r\n aria-label=\"Close\"\r\n >\r\n ×\r\n </button>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useRef, useMemo } from 'react';\r\nimport type { ReactNode } from 'react';\r\nimport { StorageContext } from './useStorage';\r\nimport type { StorageOptions, StorageContextValue, StorageType } from './types';\r\n\r\nexport interface StorageProviderProps extends StorageOptions {\r\n children: ReactNode;\r\n}\r\n\r\nclass StorageAdapter {\r\n private storage: Storage | Map<string, string>;\r\n private namespace: string;\r\n private serialize: boolean;\r\n private encrypt: boolean;\r\n private storageType: StorageType;\r\n\r\n constructor(options: StorageOptions = {}) {\r\n this.namespace = options.namespace || '';\r\n this.serialize = options.serialize ?? true;\r\n this.encrypt = options.encrypt ?? false;\r\n this.storageType = options.storageType || 'local';\r\n\r\n // Select storage backend\r\n if (this.storageType === 'local') {\r\n this.storage = typeof window !== 'undefined' ? window.localStorage : new Map();\r\n } else if (this.storageType === 'session') {\r\n this.storage = typeof window !== 'undefined' ? window.sessionStorage : new Map();\r\n } else {\r\n this.storage = new Map();\r\n }\r\n }\r\n\r\n private getKey(key: string): string {\r\n return this.namespace ? `${this.namespace}:${key}` : key;\r\n }\r\n\r\n private encodeValue(value: string): string {\r\n if (!this.encrypt) return value;\r\n // Basic obfuscation (not cryptographically secure)\r\n return btoa(encodeURIComponent(value));\r\n }\r\n\r\n private decodeValue(value: string): string {\r\n if (!this.encrypt) return value;\r\n try {\r\n return decodeURIComponent(atob(value));\r\n } catch {\r\n return value;\r\n }\r\n }\r\n\r\n getItem<T = string>(key: string, defaultValue?: T): T | null {\r\n try {\r\n const fullKey = this.getKey(key);\r\n const rawValue = this.storage instanceof Map \r\n ? this.storage.get(fullKey) \r\n : this.storage.getItem(fullKey);\r\n\r\n if (rawValue === null || rawValue === undefined) {\r\n return defaultValue ?? null;\r\n }\r\n\r\n const decodedValue = this.decodeValue(rawValue);\r\n\r\n if (this.serialize) {\r\n return JSON.parse(decodedValue) as T;\r\n }\r\n return decodedValue as T;\r\n } catch (error) {\r\n console.error(`Error getting item \"${key}\" from storage:`, error);\r\n return defaultValue ?? null;\r\n }\r\n }\r\n\r\n setItem<T = unknown>(key: string, value: T): void {\r\n try {\r\n const fullKey = this.getKey(key);\r\n const serializedValue = this.serialize ? JSON.stringify(value) : String(value);\r\n const encodedValue = this.encodeValue(serializedValue);\r\n\r\n if (this.storage instanceof Map) {\r\n this.storage.set(fullKey, encodedValue);\r\n } else {\r\n this.storage.setItem(fullKey, encodedValue);\r\n }\r\n } catch (error) {\r\n console.error(`Error setting item \"${key}\" in storage:`, error);\r\n }\r\n }\r\n\r\n removeItem(key: string): void {\r\n try {\r\n const fullKey = this.getKey(key);\r\n if (this.storage instanceof Map) {\r\n this.storage.delete(fullKey);\r\n } else {\r\n this.storage.removeItem(fullKey);\r\n }\r\n } catch (error) {\r\n console.error(`Error removing item \"${key}\" from storage:`, error);\r\n }\r\n }\r\n\r\n clear(): void {\r\n try {\r\n if (this.storage instanceof Map) {\r\n this.storage.clear();\r\n } else {\r\n // Only clear items with the namespace\r\n if (this.namespace) {\r\n const keys = this.getAllKeys();\r\n keys.forEach(key => this.removeItem(key));\r\n } else {\r\n this.storage.clear();\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error clearing storage:', error);\r\n }\r\n }\r\n\r\n hasItem(key: string): boolean {\r\n const fullKey = this.getKey(key);\r\n if (this.storage instanceof Map) {\r\n return this.storage.has(fullKey);\r\n }\r\n return this.storage.getItem(fullKey) !== null;\r\n }\r\n\r\n getAllKeys(): string[] {\r\n try {\r\n if (this.storage instanceof Map) {\r\n return Array.from(this.storage.keys())\r\n .filter(key => !this.namespace || key.startsWith(`${this.namespace}:`))\r\n .map(key => this.namespace ? key.slice(this.namespace.length + 1) : key);\r\n } else {\r\n const allKeys = Object.keys(this.storage);\r\n return allKeys\r\n .filter(key => !this.namespace || key.startsWith(`${this.namespace}:`))\r\n .map(key => this.namespace ? key.slice(this.namespace.length + 1) : key);\r\n }\r\n } catch (error) {\r\n console.error('Error getting all keys from storage:', error);\r\n return [];\r\n }\r\n }\r\n\r\n getStorageType(): StorageType {\r\n return this.storageType;\r\n }\r\n}\r\n\r\nexport const StorageProvider: React.FC<StorageProviderProps> = ({\r\n children,\r\n storageType = 'local',\r\n namespace = '',\r\n serialize = true,\r\n encrypt = false,\r\n}) => {\r\n // Create singleton storage adapter\r\n const adapterRef = useRef<StorageAdapter | null>(null);\r\n\r\n if (!adapterRef.current) {\r\n adapterRef.current = new StorageAdapter({\r\n storageType,\r\n namespace,\r\n serialize,\r\n encrypt,\r\n });\r\n }\r\n\r\n const value: StorageContextValue = useMemo(\r\n () => ({\r\n getItem: <T = string>(key: string, defaultValue?: T) =>\r\n adapterRef.current!.getItem<T>(key, defaultValue),\r\n setItem: <T = unknown>(key: string, value: T) =>\r\n adapterRef.current!.setItem<T>(key, value),\r\n removeItem: (key: string) => adapterRef.current!.removeItem(key),\r\n clear: () => adapterRef.current!.clear(),\r\n hasItem: (key: string) => adapterRef.current!.hasItem(key),\r\n getAllKeys: () => adapterRef.current!.getAllKeys(),\r\n storageType: adapterRef.current!.getStorageType(),\r\n }),\r\n []\r\n );\r\n\r\n return (\r\n <StorageContext.Provider value={value}>\r\n {children}\r\n </StorageContext.Provider>\r\n );\r\n};\r\n","import { createContext, useContext } from 'react';\r\nimport type { StorageContextValue } from './types';\r\n\r\nexport const StorageContext = createContext<StorageContextValue | undefined>(\r\n undefined\r\n);\r\n\r\n/**\r\n * Hook to access storage functionality\r\n * Must be used within a StorageProvider\r\n * \r\n * @example\r\n * ```tsx\r\n * const storage = useStorage();\r\n * \r\n * // Store data\r\n * storage.setItem('user', { name: 'John', age: 30 });\r\n * \r\n * // Retrieve data\r\n * const user = storage.getItem('user', { name: '', age: 0 });\r\n * \r\n * // Remove data\r\n * storage.removeItem('user');\r\n * \r\n * // Check if key exists\r\n * if (storage.hasItem('user')) {\r\n * console.log('User exists');\r\n * }\r\n * \r\n * // Clear all storage\r\n * storage.clear();\r\n * ```\r\n */\r\nexport function useStorage() {\r\n const context = useContext(StorageContext);\r\n\r\n if (!context) {\r\n throw new Error('useStorage must be used within a StorageProvider');\r\n }\r\n\r\n return context;\r\n}\r\n","import React, { createContext as createReactContext, useContext as useReactContext } from 'react';\r\nimport type { ContextConfig, CreateContextResult, ProviderProps } from './types';\r\n\r\n/**\r\n * Factory function to create a type-safe context with provider and hook\r\n * \r\n * @example\r\n * ```tsx\r\n * // Define your context value type\r\n * interface ThemeContextValue {\r\n * theme: 'light' | 'dark';\r\n * toggleTheme: () => void;\r\n * }\r\n * \r\n * // Create the context\r\n * const { Provider: ThemeProvider, useContext: useTheme } = createContext<ThemeContextValue>({\r\n * name: 'Theme',\r\n * });\r\n * \r\n * // Use in your app\r\n * function App() {\r\n * const [theme, setTheme] = useState<'light' | 'dark'>('light');\r\n * \r\n * const toggleTheme = () => {\r\n * setTheme(prev => prev === 'light' ? 'dark' : 'light');\r\n * };\r\n * \r\n * return (\r\n * <ThemeProvider value={{ theme, toggleTheme }}>\r\n * <YourComponents />\r\n * </ThemeProvider>\r\n * );\r\n * }\r\n * \r\n * // Access in child components\r\n * function ChildComponent() {\r\n * const { theme, toggleTheme } = useTheme();\r\n * return <button onClick={toggleTheme}>Current: {theme}</button>;\r\n * }\r\n * ```\r\n */\r\nexport function createContext<T>(config: ContextConfig<T>): CreateContextResult<T> {\r\n const { name, errorMessage, defaultValue } = config;\r\n\r\n // Create the React context\r\n const Context = createReactContext<T | undefined>(defaultValue);\r\n Context.displayName = name;\r\n\r\n // Create the Provider component\r\n const Provider: React.FC<ProviderProps<T>> = ({ children, value }) => {\r\n return <Context.Provider value={value}>{children}</Context.Provider>;\r\n };\r\n\r\n Provider.displayName = `${name}Provider`;\r\n\r\n // Create the hook\r\n const useContext = (): T => {\r\n const context = useReactContext(Context);\r\n\r\n if (context === undefined) {\r\n const error =\r\n errorMessage ||\r\n `use${name} must be used within a ${name}Provider. ` +\r\n `Make sure you wrap your component tree with <${name}Provider>.`;\r\n throw new Error(error);\r\n }\r\n\r\n return context;\r\n };\r\n\r\n return {\r\n Context,\r\n Provider,\r\n useContext,\r\n };\r\n}\r\n","import React, { createContext as createReactContext, useContext as useReactContext } from 'react';\r\nimport type { ReactNode } from 'react';\r\n\r\nexport interface ContextWithHookConfig<T, P> {\r\n /**\r\n * Display name for the context (used in error messages and DevTools)\r\n */\r\n name: string;\r\n /**\r\n * Hook that provides the context value based on props\r\n */\r\n useValue: (props: P) => T;\r\n /**\r\n * Error message to show when hook is used outside provider\r\n */\r\n errorMessage?: string;\r\n}\r\n\r\nexport interface ProviderWithHookProps {\r\n children: ReactNode;\r\n}\r\n\r\nexport interface CreateContextWithHookResult<T, P> {\r\n /**\r\n * The React Context object\r\n */\r\n Context: React.Context<T | undefined>;\r\n /**\r\n * Provider component that uses the hook internally\r\n */\r\n Provider: React.FC<ProviderWithHookProps & P>;\r\n /**\r\n * Hook to access the context value\r\n * @throws Error if used outside the Provider\r\n */\r\n useContext: () => T;\r\n}\r\n\r\n/**\r\n * Factory function to create a context with a custom hook that manages state\r\n * This pattern is useful when you want to encapsulate state logic in the provider\r\n *\r\n * @example\r\n * ```tsx\r\n * // Define your context value and props types\r\n * interface CounterContextValue {\r\n * count: number;\r\n * increment: () => void;\r\n * decrement: () => void;\r\n * reset: () => void;\r\n * }\r\n *\r\n * interface CounterProviderProps {\r\n * initialCount?: number;\r\n * }\r\n *\r\n * // Create the context with a custom hook\r\n * const { Provider: CounterProvider, useContext: useCounter } = createContextWithHook<\r\n * CounterContextValue,\r\n * CounterProviderProps\r\n * >({\r\n * name: 'Counter',\r\n * useValue: ({ initialCount = 0 }) => {\r\n * const [count, setCount] = useState(initialCount);\r\n *\r\n * return {\r\n * count,\r\n * increment: () => setCount(prev => prev + 1),\r\n * decrement: () => setCount(prev => prev - 1),\r\n * reset: () => setCount(initialCount),\r\n * };\r\n * },\r\n * });\r\n *\r\n * // Use in your app\r\n * function App() {\r\n * return (\r\n * <CounterProvider initialCount={10}>\r\n * <YourComponents />\r\n * </CounterProvider>\r\n * );\r\n * }\r\n *\r\n * // Access in child components\r\n * function ChildComponent() {\r\n * const { count, increment, decrement } = useCounter();\r\n * return (\r\n * <div>\r\n * <p>Count: {count}</p>\r\n * <button onClick={increment}>+</button>\r\n * <button onClick={decrement}>-</button>\r\n * </div>\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function createContextWithHook<T, P = Record<string, never>>(\r\n config: ContextWithHookConfig<T, P>\r\n): CreateContextWithHookResult<T, P> {\r\n const { name, useValue, errorMessage } = config;\r\n\r\n // Create the React context\r\n const Context = createReactContext<T | undefined>(undefined);\r\n Context.displayName = name;\r\n\r\n // Create the Provider component that uses the hook\r\n const Provider: React.FC<ProviderWithHookProps & P> = ({ children, ...props }) => {\r\n const value = useValue(props as P);\r\n return <Context.Provider value={value}>{children}</Context.Provider>;\r\n };\r\n\r\n Provider.displayName = `${name}Provider`;\r\n\r\n // Create the consumer hook\r\n const useContext = (): T => {\r\n const context = useReactContext(Context);\r\n\r\n if (context === undefined) {\r\n const error =\r\n errorMessage ||\r\n `use${name} must be used within a ${name}Provider. ` +\r\n `Make sure you wrap your component tree with <${name}Provider>.`;\r\n throw new Error(error);\r\n }\r\n\r\n return context;\r\n };\r\n\r\n return {\r\n Context,\r\n Provider,\r\n useContext,\r\n };\r\n}\r\n"],"mappings":"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","names":["request","jsx","useEffect","jsx","jsx","Component","jsx","navigate","useEffect","queryClient","jsx","useRef","jsx","useEffect","jsx","jsxs","useEffect","useContext","useEffect","jsx","jsxs","useContext","useEffect","useContext","useEffect","jsx","jsxs","useContext","useEffect","useContext","useEffect","jsx","jsxs","useContext","useEffect","useContext","useEffect","jsx","jsxs","useContext","useEffect","useContext","jsx","useContext","useContext","useEffect","useRef","useState","jsx","jsxs","useContext","useState","useRef","useEffect","useState","useCallback","useContext","createContext","jsx","useState","useCallback","jsx","jsxs","jsx","jsxs","getIcon","useRef","useMemo","createContext","useContext","jsx","useRef","useMemo","value","jsx","createContext","useContext","createReactContext","useReactContext","jsx","useContext"]}
|
|
1
|
+
{"version":3,"sources":["../lib/components/appInsights/AppInsightsProvider.tsx","../lib/components/msAuth/AuthProvider.tsx","../lib/components/msAuth/useAuth.ts","../lib/components/msAuth/Protected.tsx","../lib/components/pageRouter/RouterProvider.tsx","../lib/components/pageRouter/RouteRenderer.tsx","../lib/components/pageRouter/ErrorBoundary.tsx","../lib/components/pageRouter/navigation.ts","../lib/components/reactQuery/apiClient.ts","../lib/components/reactQuery/hooks.ts","../lib/components/reactQuery/queryProvider.tsx","../lib/components/formManager/Form.tsx","../lib/components/formManager/InputField.tsx","../lib/components/formManager/InputDropdown.tsx","../lib/components/formManager/InputRadio.tsx","../lib/components/formManager/InputCheckbox.tsx","../lib/components/formManager/InputTextarea.tsx","../lib/components/formManager/ResetButton.tsx","../lib/components/formManager/InputFile.tsx","../lib/components/globalErrorSuccessManager/ToastContext.tsx","../lib/components/globalErrorSuccessManager/useToast.ts","../lib/components/globalErrorSuccessManager/ToastContainer.tsx","../lib/components/globalErrorSuccessManager/InlineAlert.tsx","../lib/components/storageManager/StorageProvider.tsx","../lib/components/storageManager/useStorage.ts","../lib/components/contextManager/createContext.tsx","../lib/components/contextManager/createContextWithHook.tsx"],"sourcesContent":["import React, { useEffect } from \"react\";\nimport { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\n\ninterface AppInsightProps {\n instrumentationKey: string;\n}\n\nconst AppInsight: React.FC<AppInsightProps> = ({ instrumentationKey }) => {\n useEffect(() => {\n const appInsights = new ApplicationInsights({\n config: {\n instrumentationKey,\n enableAutoRouteTracking: true,\n },\n });\n appInsights.loadAppInsights();\n appInsights.trackPageView();\n }, [instrumentationKey]);\n\n return null; // No UI, just telemetry\n};\n\nexport default AppInsight;\n","import React, { useRef } from \"react\";\nimport { MsalProvider } from \"@azure/msal-react\";\nimport { PublicClientApplication, LogLevel } from \"@azure/msal-browser\";\nimport type { Configuration } from \"@azure/msal-browser\";\n\nexport type AuthProviderProps = {\n config: Configuration; // MSAL config: clientId, authority, redirectUri, cache, etc.\n children: React.ReactNode;\n};\n\nexport const AuthProvider: React.FC<AuthProviderProps> = ({\n config,\n children,\n}) => {\n const pcaRef = useRef<PublicClientApplication>(null);\n\n if (!pcaRef.current) {\n pcaRef.current = new PublicClientApplication({\n ...config,\n system: {\n ...config.system,\n loggerOptions: { logLevel: LogLevel.Info },\n },\n });\n }\n\n return <MsalProvider instance={pcaRef.current!}>{children}</MsalProvider>;\n};\n","import { useMsal, useIsAuthenticated, useAccount } from \"@azure/msal-react\";\nimport { InteractionType } from \"@azure/msal-browser\";\nimport type {\n PopupRequest,\n RedirectRequest,\n SilentRequest,\n} from \"@azure/msal-browser\";\n\ntype Options = {\n loginType?: \"popup\" | \"redirect\";\n defaultScopes?: string[]; // e.g., [\"User.Read\"]\n};\n\nexport function useAuth(options?: Options) {\n const { instance, accounts } = useMsal();\n const isAuthenticated = useIsAuthenticated();\n const account = useAccount(accounts[0] || {});\n\n const login = async (request?: PopupRequest | RedirectRequest) => {\n const req = request ?? {\n scopes: options?.defaultScopes ?? [\"openid\", \"profile\", \"offline_access\"],\n };\n if (options?.loginType === \"redirect\") {\n await instance.loginRedirect(req as RedirectRequest);\n } else {\n await instance.loginPopup(req as PopupRequest);\n }\n };\n\n const logout = async () => {\n try {\n if (options?.loginType === \"redirect\") {\n await instance.logoutRedirect();\n } else {\n await instance.logoutPopup();\n }\n } catch {\n console.error(\"Failed while trying to logout user!\");\n }\n };\n\n const acquireToken = async (scopes: string[]) => {\n const silentReq: SilentRequest = { account: accounts[0], scopes };\n try {\n const res = await instance.acquireTokenSilent(silentReq);\n return res.accessToken;\n } catch {\n if (options?.loginType === \"redirect\") {\n await instance.acquireTokenRedirect({ scopes });\n return \"\"; // token will be available after redirect completes\n } else {\n const res = await instance.acquireTokenPopup({ scopes });\n return res.accessToken;\n }\n }\n };\n\n return {\n isAuthenticated,\n account,\n login,\n logout,\n acquireToken,\n InteractionType,\n };\n}\n","import React from \"react\";\n\nexport const Protected: React.FC<{\n children: React.ReactNode;\n}> = ({ children }) => {\n return <>{children}</>;\n};\n","import React, { useEffect } from 'react';\nimport { BrowserRouter, useNavigate } from 'react-router-dom';\nimport RouteRenderer from './RouteRenderer';\nimport { type RouterProviderProps } from './types';\nimport { setNavigate } from './navigation';\n\nconst NavigatorInitializer: React.FC = () => {\n const navigate = useNavigate();\n\n useEffect(() => {\n setNavigate(navigate);\n }, [navigate]);\n\n return null;\n};\n\nconst RouterProvider: React.FC<RouterProviderProps> = ({ routes, fallbackUI }) => {\n return (\n <BrowserRouter>\n <NavigatorInitializer />\n <RouteRenderer routes={routes} fallbackUI={fallbackUI} />\n </BrowserRouter>\n );\n};\n\nexport default RouterProvider;","import React from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { type RouteConfig } from './types';\n\ninterface Props {\n routes: RouteConfig[];\n fallbackUI?: React.ReactNode;\n}\n\nconst RouteRenderer: React.FC<Props> = ({ routes, fallbackUI }) => {\n const location = useLocation();\n const currentRoute = routes.find(route => route.path === location.pathname);\n\n if (!currentRoute) {\n return fallbackUI ?? <div>404 - Page Not Found</div>;\n }\n\n const Component = currentRoute.component;\n\n return (\n <ErrorBoundary fallback={currentRoute.errorFallback}>\n <Component />\n </ErrorBoundary>\n );\n};\n\nexport default RouteRenderer","import React, { Component, type ReactNode } from \"react\";\n\ninterface ErrorBoundaryProps {\n fallback?: ReactNode;\n children: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n static getDerivedStateFromError(_: Error): ErrorBoundaryState {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, info: React.ErrorInfo) {\n console.error(\"Error caught in boundary:\", error, info);\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback ?? <div>Something went wrong.</div>;\n }\n\n return this.props.children;\n }\n}\n","import { type NavigateFunction } from 'react-router-dom';\n\nlet navigate: NavigateFunction | null = null;\n\nexport const setNavigate = (navFn: NavigateFunction) => {\n navigate = navFn;\n};\n\nexport const getNavigate = (): NavigateFunction => {\n if (!navigate) {\n throw new Error('Navigate function not initialized.');\n }\n return navigate;\n};","import axios, { type AxiosRequestConfig } from \"axios\";\n\nlet baseURL = \"\";\nlet globalHeaders: Record<string, string> = {};\n\nexport interface ClientConfig {\n endpoint: string;\n headers?: Record<string, string>;\n}\n\nexport const configureClient = ({ endpoint, headers }: ClientConfig): void => {\n baseURL = endpoint;\n globalHeaders = headers || {};\n};\n\nconst request = async <T>(\n method: string,\n url: string,\n data?: any\n): Promise<T> => {\n try {\n const config: AxiosRequestConfig = {\n method,\n url: `${baseURL}${url}`,\n data,\n headers: globalHeaders,\n };\n const response = await axios(config);\n return response.data as T;\n } catch (error: any) {\n const message =\n error.response?.data?.message || error.message || \"Unknown error\";\n throw new Error(message);\n }\n};\n\nexport const get = <T>(url: string): Promise<T> => request<T>(\"GET\", url);\nexport const post = <T>(url: string, data: any): Promise<T> =>\n request<T>(\"POST\", url, data);\nexport const put = <T>(url: string, data: any): Promise<T> =>\n request<T>(\"PUT\", url, data);\nexport const del = <T>(url: string): Promise<T> => request<T>(\"DELETE\", url);\n","\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { get, post, put, del } from './apiClient';\n\n// ✅ GET Hook\nexport const useGetQuery = <T>(key: string, url: string) => {\n return useQuery<T>({\n queryKey: [key],\n queryFn: () => get<T>(url),\n });\n};\n\n// ✅ POST Hook with optional invalidateKeys\nexport const usePostMutation = <T>() => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (variables: { url: string; data: any; invalidateKeys?: string[] }) =>\n post<T>(variables.url, variables.data),\n onSuccess: (_data, variables) => {\n if (variables.invalidateKeys) {\n variables.invalidateKeys.forEach((key) =>\n queryClient.invalidateQueries({ queryKey: [key] })\n );\n }\n },\n });\n};\n\n// ✅ PUT Hook\nexport const usePutMutation = <T>() => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (variables: { url: string; data: any; invalidateKeys?: string[] }) =>\n put<T>(variables.url, variables.data),\n onSuccess: (_data, variables) => {\n if (variables.invalidateKeys) {\n variables.invalidateKeys.forEach((key) =>\n queryClient.invalidateQueries({ queryKey: [key] })\n );\n }\n },\n });\n};\n\n// ✅ DELETE Hook\nexport const useDeleteMutation = <T>() => {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (variables: { url: string; invalidateKeys?: string[] }) =>\n del<T>(variables.url),\n onSuccess: (_data, variables) => {\n if (variables.invalidateKeys) {\n variables.invalidateKeys.forEach((key) =>\n queryClient.invalidateQueries({ queryKey: [key] })\n );\n }\n },\n });\n};\n","\nimport React, { type ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\n\nlet queryClient: QueryClient;\n\nconst createQueryClient = (options?: object) => {\n queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n },\n },\n ...options,\n });\n return queryClient;\n};\n\ninterface QueryProviderProps {\n children: ReactNode;\n}\n\nexport const QueryProvider: React.FC<QueryProviderProps> = ({ children }) => {\n if (!queryClient) {\n queryClient = createQueryClient();\n }\n return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;\n};\n","import React, {\n createContext,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { Values, Validator, FormErrors } from \"./types\";\n\ninterface FormContextShape {\n values: Values;\n errors: FormErrors;\n isValidating: boolean;\n setValue: (name: string, value: string) => void;\n clearValue: (name: string) => void;\n registerField: (\n name: string,\n validator?: Validator,\n fallbackErrorMsg?: string\n ) => void;\n unregisterField: (name: string) => void;\n validateField: (name: string) => Promise<boolean>;\n validateAll: () => Promise<boolean>;\n reset: () => void;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport const FormContext = createContext<FormContextShape | null>(null);\n\nexport interface FormProps {\n initialValues?: Values;\n /** Async submit handler from target application */\n onSubmit: (values: Values) => Promise<void>;\n /** Optional error callback when onSubmit throws */\n onSubmitError?: (error: unknown) => void;\n /** Optional reset side-effect */\n onReset?: () => void;\n /** Children should include InputField and buttons */\n children: React.ReactNode;\n}\n\nexport const Form: React.FC<FormProps> = ({\n initialValues = {},\n onSubmit,\n onSubmitError,\n onReset,\n children,\n}) => {\n const [values, setValues] = useState<Values>(initialValues);\n const [errors, setErrors] = useState<FormErrors>({});\n const [isValidating, setIsValidating] = useState<boolean>(false);\n\n // registry: name -> {validator, fallbackErrorMsg}\n const registry = useRef<\n Map<string, { validator?: Validator; fallbackErrorMsg?: string }>\n >(new Map());\n\n const setValue = useCallback((name: string, value: string) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n // Clear error as user types; re-validate on blur/submit\n setErrors((prev) => ({ ...prev, [name]: undefined }));\n }, []);\n\n const clearValue = useCallback((name: string) => {\n setValues((prev) => ({ ...prev, [name]: \"\" }));\n setErrors((prev) => ({ ...prev, [name]: undefined }));\n }, []);\n\n const registerField = useCallback(\n (name: string, validator?: Validator, fallbackErrorMsg?: string) => {\n registry.current.set(name, { validator, fallbackErrorMsg });\n // Initialize missing value to empty string to simplify logic\n setValues((prev) => (name in prev ? prev : { ...prev, [name]: \"\" }));\n },\n []\n );\n\n const unregisterField = useCallback((name: string) => {\n registry.current.delete(name);\n setErrors((prev) => {\n const next = { ...prev };\n delete next[name];\n return next;\n });\n }, []);\n\n const validateField = useCallback(\n async (name: string): Promise<boolean> => {\n const entry = registry.current.get(name);\n const value = values[name] ?? \"\";\n if (!entry?.validator) {\n // No validator: consider valid\n setErrors((prev) => ({ ...prev, [name]: undefined }));\n return true;\n }\n\n const result = await entry.validator(value, values);\n // validator can return boolean or string\n if (typeof result === \"string\") {\n setErrors((prev) => ({ ...prev, [name]: result }));\n return false;\n }\n if (result === true) {\n setErrors((prev) => ({ ...prev, [name]: undefined }));\n return true;\n } else {\n // false -> show fallback error message provided as a prop from target app\n const fallback = entry.fallbackErrorMsg || \"Invalid value.\";\n setErrors((prev) => ({ ...prev, [name]: fallback }));\n return false;\n }\n },\n [values]\n );\n\n const validateAll = useCallback(async (): Promise<boolean> => {\n setIsValidating(true);\n try {\n const names = Array.from(registry.current.keys());\n const results = await Promise.all(names.map((n) => validateField(n)));\n return results.every(Boolean);\n } finally {\n setIsValidating(false);\n }\n }, [validateField]);\n\n const reset = useCallback(() => {\n setValues(initialValues);\n setErrors({});\n onReset?.();\n }, [initialValues, onReset]);\n\n const ctx = useMemo<FormContextShape>(\n () => ({\n values,\n errors,\n isValidating,\n setValue,\n clearValue,\n registerField,\n unregisterField,\n validateField,\n validateAll,\n reset,\n }),\n [\n values,\n errors,\n isValidating,\n setValue,\n clearValue,\n registerField,\n unregisterField,\n validateField,\n validateAll,\n reset,\n ]\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n // Ensure all validations complete before submission\n const ok = await validateAll();\n if (!ok) return;\n\n // Requirement: wrap the target app's async submit handler with try/catch\n try {\n await onSubmit(values);\n } catch (err) {\n console.error(\"Submit handler threw:\", err);\n onSubmitError?.(err);\n // Optional: set a form-level error state or toast here if needed\n }\n };\n\n return (\n <form onSubmit={handleSubmit} noValidate>\n <FormContext.Provider value={ctx}>{children}</FormContext.Provider>\n </form>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { FormContext } from \"./Form\";\nimport type { Validator } from \"./types\";\n\nexport interface InputFieldProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"name\" | \"onChange\" | \"value\"\n > {\n /** Unique field name */\n name: string;\n /** Visible label (optional) */\n label?: string;\n /** Show a clear icon inside input (default true) */\n clearable?: boolean;\n /** Validator function; can be sync or async and return boolean or string */\n validator?: Validator;\n /**\n * Fallback error message to show if validator returns false.\n * This satisfies: \"take error message as a prop from target application\"\n */\n errorMessage?: string;\n /** Additional CSS class name */\n className?: string;\n}\n\nexport const InputField: React.FC<InputFieldProps> = ({\n name,\n label,\n clearable = true,\n validator,\n errorMessage,\n type = \"text\",\n placeholder,\n disabled,\n className,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"InputField must be used inside <Form>.\");\n }\n\n const value = form.values[name] ?? \"\";\n\n // Register/unregister the field with its validator and fallback message\n useEffect(() => {\n form.registerField(name, validator, errorMessage);\n return () => form.unregisterField(name);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, validator, errorMessage]);\n\n // Re-validate on blur\n const onBlur = async () => {\n await form.validateField(name);\n };\n\n const showClear = clearable && !!value && !disabled;\n const hasError = !!form.errors[name];\n\n const containerClassName = [\n \"input-field-container\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n const inputClassName = [\n \"input-field-input\",\n showClear && \"with-clear\",\n hasError && \"has-error\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={containerClassName}>\n {label && (\n <label htmlFor={name} className=\"input-field-label\">\n {label}\n </label>\n )}\n <div className=\"input-field-wrapper\">\n <input\n id={name}\n name={name}\n type={type}\n placeholder={placeholder}\n disabled={disabled}\n value={value}\n onChange={(e) => form.setValue(name, e.target.value)}\n onBlur={onBlur}\n className={inputClassName}\n {...rest}\n />\n {showClear && (\n <span\n role=\"button\"\n tabIndex={0}\n aria-label={`Clear ${label || name}`}\n title=\"Clear\"\n onClick={() => form.clearValue(name)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n form.clearValue(name);\n }\n }}\n className=\"input-field-clear-button\"\n >\n ×\n </span>\n )}\n </div>\n {hasError && (\n <div role=\"alert\" className=\"input-field-error\">\n {form.errors[name]}\n </div>\n )}\n </div>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { FormContext } from \"./Form\";\nimport type { Validator } from \"./types\";\n\nexport interface DropdownOption {\n value: string;\n label: string;\n}\n\nexport interface InputDropdownProps {\n /** Unique field name */\n name: string;\n /** Visible label (optional) */\n label?: string;\n /** Array of dropdown options */\n options: DropdownOption[];\n /** Placeholder text for empty selection */\n placeholder?: string;\n /** Show a clear icon (default true) */\n clearable?: boolean;\n /** Validator function; can be sync or async and return boolean or string */\n validator?: Validator;\n /**\n * Fallback error message to show if validator returns false.\n * This satisfies: \"take error message as a prop from target application\"\n */\n errorMessage?: string;\n /** Whether the dropdown is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Accessibility attributes */\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\nexport const InputDropdown: React.FC<InputDropdownProps> = ({\n name,\n label,\n options,\n placeholder = \"Select an option\",\n clearable = true,\n validator,\n errorMessage,\n disabled,\n className,\n style,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"InputDropdown must be used inside <Form>.\");\n }\n\n const value = form.values[name] ?? \"\";\n\n // Register/unregister the field with its validator and fallback message\n useEffect(() => {\n form.registerField(name, validator, errorMessage);\n return () => form.unregisterField(name);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, validator, errorMessage]);\n\n // Re-validate on blur\n const onBlur = async () => {\n await form.validateField(name);\n };\n\n const showClear = clearable && !!value && !disabled;\n const hasError = !!form.errors[name];\n\n const selectClassName = [\n \"input-dropdown-select\",\n showClear && \"with-clear\",\n hasError && \"has-error\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"input-dropdown-container\">\n {label && (\n <label htmlFor={name} className=\"input-dropdown-label\">\n {label}\n </label>\n )}\n <div className=\"input-dropdown-wrapper\">\n <select\n id={name}\n name={name}\n disabled={disabled}\n value={value}\n onChange={(e) => form.setValue(name, e.target.value)}\n onBlur={onBlur}\n className={selectClassName}\n style={style}\n {...rest}\n >\n <option value=\"\" disabled>\n {placeholder}\n </option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n {showClear && (\n <button\n type=\"button\"\n aria-label={`Clear ${label || name}`}\n title=\"Clear\"\n onClick={() => form.clearValue(name)}\n className=\"input-dropdown-clear-button\"\n >\n ×\n </button>\n )}\n </div>\n {hasError && (\n <div role=\"alert\" className=\"input-dropdown-error\">\n {form.errors[name]}\n </div>\n )}\n </div>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { FormContext } from \"./Form\";\nimport type { Validator } from \"./types\";\n\nexport interface RadioOption {\n value: string;\n label: string;\n}\n\nexport interface InputRadioProps {\n /** Unique field name */\n name: string;\n /** Visible label (optional) */\n label?: string;\n /** Array of radio options */\n options: RadioOption[];\n /** Validator function; can be sync or async and return boolean or string */\n validator?: Validator;\n /**\n * Fallback error message to show if validator returns false.\n * This satisfies: \"take error message as a prop from target application\"\n */\n errorMessage?: string;\n /** Whether the radio group is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Accessibility attributes */\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\nexport const InputRadio: React.FC<InputRadioProps> = ({\n name,\n label,\n options,\n validator,\n errorMessage,\n disabled,\n className,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"InputRadio must be used inside <Form>.\");\n }\n\n const value = form.values[name] ?? \"\";\n\n // Register/unregister the field with its validator and fallback message\n useEffect(() => {\n form.registerField(name, validator, errorMessage);\n return () => form.unregisterField(name);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, validator, errorMessage]);\n\n // Re-validate on blur\n const onBlur = async () => {\n await form.validateField(name);\n };\n\n const hasError = !!form.errors[name];\n\n const containerClassName = [\n \"input-radio-container\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={containerClassName}>\n {label && (\n <div className=\"input-radio-label\">\n {label}\n </div>\n )}\n <div className=\"input-radio-options\" role=\"radiogroup\" {...rest}>\n {options.map((option) => (\n <label\n key={option.value}\n className={`input-radio-option ${disabled ? \"disabled\" : \"\"}`}\n >\n <input\n type=\"radio\"\n name={name}\n value={option.value}\n checked={value === option.value}\n onChange={(e) => form.setValue(name, e.target.value)}\n onBlur={onBlur}\n disabled={disabled}\n className=\"input-radio-input\"\n />\n <span className=\"input-radio-option-label\">{option.label}</span>\n </label>\n ))}\n </div>\n {hasError && (\n <div role=\"alert\" className=\"input-radio-error\">\n {form.errors[name]}\n </div>\n )}\n </div>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { FormContext } from \"./Form\";\nimport type { Validator } from \"./types\";\n\nexport interface CheckboxOption {\n value: string;\n label: string;\n}\n\nexport interface InputCheckboxProps {\n /** Unique field name */\n name: string;\n /** Visible label (optional) */\n label?: string;\n /** Array of checkbox options */\n options: CheckboxOption[];\n /** Validator function; can be sync or async and return boolean or string */\n validator?: Validator;\n /**\n * Fallback error message to show if validator returns false.\n * This satisfies: \"take error message as a prop from target application\"\n */\n errorMessage?: string;\n /** Whether the checkbox group is disabled */\n disabled?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** Accessibility attributes */\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\nexport const InputCheckbox: React.FC<InputCheckboxProps> = ({\n name,\n label,\n options,\n validator,\n errorMessage,\n disabled,\n className,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"InputCheckbox must be used inside <Form>.\");\n }\n\n const value = form.values[name] ?? \"\";\n const selectedValues = value ? value.split(\",\") : [];\n\n // Register/unregister the field with its validator and fallback message\n useEffect(() => {\n form.registerField(name, validator, errorMessage);\n return () => form.unregisterField(name);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, validator, errorMessage]);\n\n // Re-validate on blur\n const onBlur = async () => {\n await form.validateField(name);\n };\n\n const handleChange = (optionValue: string, checked: boolean) => {\n let newSelectedValues: string[];\n \n if (checked) {\n newSelectedValues = [...selectedValues, optionValue];\n } else {\n newSelectedValues = selectedValues.filter((v) => v !== optionValue);\n }\n \n form.setValue(name, newSelectedValues.join(\",\"));\n };\n\n const hasError = !!form.errors[name];\n\n const containerClassName = [\n \"input-checkbox-container\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={containerClassName}>\n {label && (\n <div className=\"input-checkbox-label\">\n {label}\n </div>\n )}\n <div className=\"input-checkbox-options\" role=\"group\" {...rest}>\n {options.map((option) => (\n <label\n key={option.value}\n className={`input-checkbox-option ${disabled ? \"disabled\" : \"\"}`}\n >\n <input\n type=\"checkbox\"\n name={`${name}-${option.value}`}\n value={option.value}\n checked={selectedValues.includes(option.value)}\n onChange={(e) => handleChange(option.value, e.target.checked)}\n onBlur={onBlur}\n disabled={disabled}\n className=\"input-checkbox-input\"\n />\n <span className=\"input-checkbox-option-label\">{option.label}</span>\n </label>\n ))}\n </div>\n {hasError && (\n <div role=\"alert\" className=\"input-checkbox-error\">\n {form.errors[name]}\n </div>\n )}\n </div>\n );\n};\n","import React, { useContext, useEffect } from \"react\";\nimport { FormContext } from \"./Form\";\nimport type { Validator } from \"./types\";\n\nexport interface InputTextareaProps {\n /** Unique field name */\n name: string;\n /** Visible label (optional) */\n label?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Show a clear icon (default true) */\n clearable?: boolean;\n /** Validator function; can be sync or async and return boolean or string */\n validator?: Validator;\n /**\n * Fallback error message to show if validator returns false.\n * This satisfies: \"take error message as a prop from target application\"\n */\n errorMessage?: string;\n /** Whether the textarea is disabled */\n disabled?: boolean;\n /** Number of rows */\n rows?: number;\n /** Maximum length */\n maxLength?: number;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Accessibility attributes */\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\nexport const InputTextarea: React.FC<InputTextareaProps> = ({\n name,\n label,\n placeholder,\n clearable = true,\n validator,\n errorMessage,\n disabled,\n rows,\n maxLength,\n className,\n style,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"InputTextarea must be used inside <Form>.\");\n }\n\n const value = form.values[name] ?? \"\";\n\n // Register/unregister the field with its validator and fallback message\n useEffect(() => {\n form.registerField(name, validator, errorMessage);\n return () => form.unregisterField(name);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, validator, errorMessage]);\n\n // Re-validate on blur\n const onBlur = async () => {\n await form.validateField(name);\n };\n\n const showClear = clearable && !!value && !disabled;\n const hasError = !!form.errors[name];\n\n const textareaClassName = [\n \"input-textarea-field\",\n showClear && \"with-clear\",\n hasError && \"has-error\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"input-textarea-container\">\n {label && (\n <label htmlFor={name} className=\"input-textarea-label\">\n {label}\n </label>\n )}\n <div className=\"input-textarea-wrapper\">\n <textarea\n id={name}\n name={name}\n placeholder={placeholder}\n disabled={disabled}\n rows={rows}\n maxLength={maxLength}\n value={value}\n onChange={(e) => form.setValue(name, e.target.value)}\n onBlur={onBlur}\n className={textareaClassName}\n style={style}\n {...rest}\n />\n {showClear && (\n <button\n type=\"button\"\n aria-label={`Clear ${label || name}`}\n title=\"Clear\"\n onClick={() => form.clearValue(name)}\n className=\"input-textarea-clear-button\"\n >\n ×\n </button>\n )}\n </div>\n {hasError && (\n <div role=\"alert\" className=\"input-textarea-error\">\n {form.errors[name]}\n </div>\n )}\n </div>\n );\n};\n","import React, { useContext } from \"react\";\nimport { FormContext } from \"./Form\";\n\nexport interface ResetButtonProps\n extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"type\" | \"onClick\"\n > {\n /** Optional custom text (default: \"Reset\") */\n children?: React.ReactNode;\n}\n\nexport const ResetButton: React.FC<ResetButtonProps> = ({\n children,\n ...rest\n}) => {\n const form = useContext(FormContext);\n if (!form) {\n throw new Error(\"ResetButton must be used inside <Form>.\");\n }\n\n return (\n <button type=\"button\" onClick={form.reset} {...rest}>\n {children ?? \"Reset\"}\n </button>\n );\n};\n","import React, { useContext, useEffect, useRef, useState } from 'react';\nimport { FormContext } from './Form';\n\ninterface InputFileProps {\n name?: string;\n label?: string;\n accept?: string;\n maxLength?: number;\n maxFileSize?: number; // in bytes, default 2MB\n uploadUrl?: string;\n onFileChange?: (file: File | null) => void;\n disabled?: boolean;\n validator?: (value: string) => boolean | string;\n errorMessage?: string;\n /** Additional CSS class name */\n className?: string;\n}\n\nconst InputFile: React.FC<InputFileProps> = ({\n name,\n label = 'Upload File',\n accept,\n maxLength = 20,\n maxFileSize = 2 * 1024 * 1024, // 2MB default\n onFileChange,\n disabled = false,\n validator,\n errorMessage = 'Please select a file.',\n className,\n}) => {\n const formContext = useContext(FormContext);\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Register field with form context if name is provided\n useEffect(() => {\n if (name && formContext) {\n formContext.registerField(name, validator, errorMessage);\n return () => formContext.unregisterField(name);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name]);\n\n const truncateFileName = (fileName: string, maxLen: number): string => {\n if (fileName.length <= maxLen) {\n return fileName;\n }\n\n const extensionIndex = fileName.lastIndexOf('.');\n const extension = extensionIndex !== -1 ? fileName.substring(extensionIndex) : '';\n const nameWithoutExt = extensionIndex !== -1 ? fileName.substring(0, extensionIndex) : fileName;\n\n const availableLength = maxLen - extension.length - 10; // 10 dots for ellipsis\n const initialChars = nameWithoutExt.substring(0, Math.max(availableLength, 5));\n\n return `${initialChars}..........${extension}`;\n };\n\n const handleBrowseClick = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) {\n setSelectedFile(null);\n if (onFileChange) onFileChange(null);\n if (name && formContext) {\n formContext.setValue(name, '');\n }\n return;\n }\n\n // Validate file size\n if (file.size > maxFileSize) {\n const maxSizeMB = (maxFileSize / (1024 * 1024)).toFixed(2);\n \n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n setSelectedFile(null);\n if (onFileChange) onFileChange(null);\n if (name && formContext) {\n formContext.setValue(name, '');\n }\n alert(`File size exceeds ${maxSizeMB}MB limit.`);\n return;\n }\n\n setSelectedFile(file);\n \n // Update form context with file name\n if (name && formContext) {\n formContext.setValue(name, file.name);\n }\n \n // Notify parent of file selection\n if (onFileChange) {\n onFileChange(file);\n }\n };\n\n\n\n const hasError = name && formContext?.errors[name];\n const errorMsg = hasError ? formContext?.errors[name] : null;\n\n const containerClassName = [\n \"input-file-container\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={containerClassName}>\n {label && <label className=\"input-file-label\">{label}</label>}\n \n <div className=\"input-file-wrapper\">\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={accept}\n onChange={handleFileChange}\n disabled={disabled}\n className=\"input-file-hidden\"\n />\n \n <button\n type=\"button\"\n onClick={handleBrowseClick}\n disabled={disabled}\n className=\"input-file-browse-btn\"\n >\n Browse\n </button>\n\n {selectedFile && (\n <span\n className=\"input-file-name\"\n title={selectedFile.name}\n >\n {truncateFileName(selectedFile.name, maxLength)}\n </span>\n )}\n </div>\n \n {errorMsg && <div className=\"input-file-error\">{errorMsg}</div>}\n </div>\n );\n};\n\nexport default InputFile;\n","import React, { useState, useCallback } from 'react';\nimport type { ReactNode } from 'react';\nimport type { Toast, ToastType, ToastContextValue } from './ToastContext.types';\nimport { ToastContext } from './useToast';\n\ninterface ToastProviderProps {\n children: ReactNode;\n /** Default duration in milliseconds (default: 3000) */\n defaultDuration?: number;\n /** Maximum number of toasts to show at once (default: 5) */\n maxToasts?: number;\n}\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({\n children,\n defaultDuration = 3000,\n maxToasts = 5,\n}) => {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((toast) => toast.id !== id));\n }, []);\n\n const showToast = useCallback(\n (message: string, type: ToastType, duration: number = defaultDuration) => {\n const id = `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const newToast: Toast = { id, message, type, duration };\n\n setToasts((prev) => {\n const updated = [...prev, newToast];\n // Keep only the last maxToasts\n return updated.slice(-maxToasts);\n });\n\n if (duration > 0) {\n setTimeout(() => {\n removeToast(id);\n }, duration);\n }\n },\n [defaultDuration, maxToasts, removeToast]\n );\n\n const showSuccess = useCallback(\n (message: string, duration?: number) => {\n showToast(message, 'success', duration);\n },\n [showToast]\n );\n\n const showError = useCallback(\n (message: string, duration?: number) => {\n showToast(message, 'error', duration);\n },\n [showToast]\n );\n\n const showInfo = useCallback(\n (message: string, duration?: number) => {\n showToast(message, 'info', duration);\n },\n [showToast]\n );\n\n const showWarning = useCallback(\n (message: string, duration?: number) => {\n showToast(message, 'warning', duration);\n },\n [showToast]\n );\n\n const value: ToastContextValue = {\n toasts,\n showToast,\n showSuccess,\n showError,\n showInfo,\n showWarning,\n removeToast,\n };\n\n return <ToastContext.Provider value={value}>{children}</ToastContext.Provider>;\n};\n","import { useContext, createContext } from 'react';\nimport type { ToastContextValue } from './ToastContext.types';\n\nexport const ToastContext = createContext<ToastContextValue | undefined>(undefined);\n\nexport const useToast = (): ToastContextValue => {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return context;\n};\n","import React from 'react';\nimport { useToast } from './useToast';\nimport type { Toast } from './ToastContext.types';\n\ninterface ToastContainerProps {\n /** Position of toast container (default: 'top-right') */\n position?: 'top-left' | 'top-right' | 'top-center' | 'bottom-left' | 'bottom-right' | 'bottom-center';\n /** Additional CSS class name */\n className?: string;\n}\n\nexport const ToastContainer: React.FC<ToastContainerProps> = ({\n position = 'top-right',\n className,\n}) => {\n const { toasts, removeToast } = useToast();\n\n const containerClassName = [\n 'toast-container',\n `toast-container-${position}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const getToastClassName = (type: string) => {\n return [\n 'toast',\n `toast-${type}`,\n ]\n .filter(Boolean)\n .join(' ');\n };\n\n return (\n <div className={containerClassName}>\n {toasts.map((toast: Toast) => (\n <div\n key={toast.id}\n className={getToastClassName(toast.type)}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <div className=\"toast-content\">\n <span className=\"toast-icon\">{getIcon(toast.type)}</span>\n <span className=\"toast-message\">{toast.message}</span>\n </div>\n <button\n type=\"button\"\n className=\"toast-close\"\n onClick={() => removeToast(toast.id)}\n aria-label=\"Close\"\n >\n ×\n </button>\n </div>\n ))}\n </div>\n );\n};\n\nfunction getIcon(type: string): string {\n switch (type) {\n case 'success':\n return '✓';\n case 'error':\n return '✕';\n case 'warning':\n return '⚠';\n case 'info':\n return 'ℹ';\n default:\n return '';\n }\n}\n","import React from 'react';\n\nexport interface InlineAlertProps {\n /** Type of alert */\n type: 'success' | 'error' | 'warning' | 'info';\n /** Alert message */\n message: string;\n /** Optional title */\n title?: string;\n /** Whether to show close button */\n dismissible?: boolean;\n /** Callback when alert is dismissed */\n onDismiss?: () => void;\n /** Additional CSS class name */\n className?: string;\n}\n\nexport const InlineAlert: React.FC<InlineAlertProps> = ({\n type,\n message,\n title,\n dismissible = false,\n onDismiss,\n className,\n}) => {\n const alertClassName = [\n 'inline-alert',\n `inline-alert-${type}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const getIcon = () => {\n switch (type) {\n case 'success':\n return '✓';\n case 'error':\n return '✕';\n case 'warning':\n return '⚠';\n case 'info':\n return 'ℹ';\n default:\n return '';\n }\n };\n\n return (\n <div className={alertClassName} role=\"alert\">\n <div className=\"inline-alert-icon\">{getIcon()}</div>\n <div className=\"inline-alert-content\">\n {title && <div className=\"inline-alert-title\">{title}</div>}\n <div className=\"inline-alert-message\">{message}</div>\n </div>\n {dismissible && (\n <button\n type=\"button\"\n className=\"inline-alert-close\"\n onClick={onDismiss}\n aria-label=\"Close\"\n >\n ×\n </button>\n )}\n </div>\n );\n};\n","import React, { useRef, useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport { StorageContext } from './useStorage';\nimport type { StorageOptions, StorageContextValue, StorageType } from './types';\n\nexport interface StorageProviderProps extends StorageOptions {\n children: ReactNode;\n}\n\nclass StorageAdapter {\n private storage: Storage | Map<string, string>;\n private namespace: string;\n private serialize: boolean;\n private encrypt: boolean;\n private storageType: StorageType;\n\n constructor(options: StorageOptions = {}) {\n this.namespace = options.namespace || '';\n this.serialize = options.serialize ?? true;\n this.encrypt = options.encrypt ?? false;\n this.storageType = options.storageType || 'local';\n\n // Select storage backend\n if (this.storageType === 'local') {\n this.storage = typeof window !== 'undefined' ? window.localStorage : new Map();\n } else if (this.storageType === 'session') {\n this.storage = typeof window !== 'undefined' ? window.sessionStorage : new Map();\n } else {\n this.storage = new Map();\n }\n }\n\n private getKey(key: string): string {\n return this.namespace ? `${this.namespace}:${key}` : key;\n }\n\n private encodeValue(value: string): string {\n if (!this.encrypt) return value;\n // Basic obfuscation (not cryptographically secure)\n return btoa(encodeURIComponent(value));\n }\n\n private decodeValue(value: string): string {\n if (!this.encrypt) return value;\n try {\n return decodeURIComponent(atob(value));\n } catch {\n return value;\n }\n }\n\n getItem<T = string>(key: string, defaultValue?: T): T | null {\n try {\n const fullKey = this.getKey(key);\n const rawValue = this.storage instanceof Map \n ? this.storage.get(fullKey) \n : this.storage.getItem(fullKey);\n\n if (rawValue === null || rawValue === undefined) {\n return defaultValue ?? null;\n }\n\n const decodedValue = this.decodeValue(rawValue);\n\n if (this.serialize) {\n return JSON.parse(decodedValue) as T;\n }\n return decodedValue as T;\n } catch (error) {\n console.error(`Error getting item \"${key}\" from storage:`, error);\n return defaultValue ?? null;\n }\n }\n\n setItem<T = unknown>(key: string, value: T): void {\n try {\n const fullKey = this.getKey(key);\n const serializedValue = this.serialize ? JSON.stringify(value) : String(value);\n const encodedValue = this.encodeValue(serializedValue);\n\n if (this.storage instanceof Map) {\n this.storage.set(fullKey, encodedValue);\n } else {\n this.storage.setItem(fullKey, encodedValue);\n }\n } catch (error) {\n console.error(`Error setting item \"${key}\" in storage:`, error);\n }\n }\n\n removeItem(key: string): void {\n try {\n const fullKey = this.getKey(key);\n if (this.storage instanceof Map) {\n this.storage.delete(fullKey);\n } else {\n this.storage.removeItem(fullKey);\n }\n } catch (error) {\n console.error(`Error removing item \"${key}\" from storage:`, error);\n }\n }\n\n clear(): void {\n try {\n if (this.storage instanceof Map) {\n this.storage.clear();\n } else {\n // Only clear items with the namespace\n if (this.namespace) {\n const keys = this.getAllKeys();\n keys.forEach(key => this.removeItem(key));\n } else {\n this.storage.clear();\n }\n }\n } catch (error) {\n console.error('Error clearing storage:', error);\n }\n }\n\n hasItem(key: string): boolean {\n const fullKey = this.getKey(key);\n if (this.storage instanceof Map) {\n return this.storage.has(fullKey);\n }\n return this.storage.getItem(fullKey) !== null;\n }\n\n getAllKeys(): string[] {\n try {\n if (this.storage instanceof Map) {\n return Array.from(this.storage.keys())\n .filter(key => !this.namespace || key.startsWith(`${this.namespace}:`))\n .map(key => this.namespace ? key.slice(this.namespace.length + 1) : key);\n } else {\n const allKeys = Object.keys(this.storage);\n return allKeys\n .filter(key => !this.namespace || key.startsWith(`${this.namespace}:`))\n .map(key => this.namespace ? key.slice(this.namespace.length + 1) : key);\n }\n } catch (error) {\n console.error('Error getting all keys from storage:', error);\n return [];\n }\n }\n\n getStorageType(): StorageType {\n return this.storageType;\n }\n}\n\nexport const StorageProvider: React.FC<StorageProviderProps> = ({\n children,\n storageType = 'local',\n namespace = '',\n serialize = true,\n encrypt = false,\n}) => {\n // Create singleton storage adapter\n const adapterRef = useRef<StorageAdapter | null>(null);\n\n if (!adapterRef.current) {\n adapterRef.current = new StorageAdapter({\n storageType,\n namespace,\n serialize,\n encrypt,\n });\n }\n\n const value: StorageContextValue = useMemo(\n () => ({\n getItem: <T = string>(key: string, defaultValue?: T) =>\n adapterRef.current!.getItem<T>(key, defaultValue),\n setItem: <T = unknown>(key: string, value: T) =>\n adapterRef.current!.setItem<T>(key, value),\n removeItem: (key: string) => adapterRef.current!.removeItem(key),\n clear: () => adapterRef.current!.clear(),\n hasItem: (key: string) => adapterRef.current!.hasItem(key),\n getAllKeys: () => adapterRef.current!.getAllKeys(),\n storageType: adapterRef.current!.getStorageType(),\n }),\n []\n );\n\n return (\n <StorageContext.Provider value={value}>\n {children}\n </StorageContext.Provider>\n );\n};\n","import { createContext, useContext } from 'react';\nimport type { StorageContextValue } from './types';\n\nexport const StorageContext = createContext<StorageContextValue | undefined>(\n undefined\n);\n\n/**\n * Hook to access storage functionality\n * Must be used within a StorageProvider\n * \n * @example\n * ```tsx\n * const storage = useStorage();\n * \n * // Store data\n * storage.setItem('user', { name: 'John', age: 30 });\n * \n * // Retrieve data\n * const user = storage.getItem('user', { name: '', age: 0 });\n * \n * // Remove data\n * storage.removeItem('user');\n * \n * // Check if key exists\n * if (storage.hasItem('user')) {\n * console.log('User exists');\n * }\n * \n * // Clear all storage\n * storage.clear();\n * ```\n */\nexport function useStorage() {\n const context = useContext(StorageContext);\n\n if (!context) {\n throw new Error('useStorage must be used within a StorageProvider');\n }\n\n return context;\n}\n","import React, { createContext as createReactContext, useContext as useReactContext } from 'react';\nimport type { ContextConfig, CreateContextResult, ProviderProps } from './types';\n\n/**\n * Factory function to create a type-safe context with provider and hook\n * \n * @example\n * ```tsx\n * // Define your context value type\n * interface ThemeContextValue {\n * theme: 'light' | 'dark';\n * toggleTheme: () => void;\n * }\n * \n * // Create the context\n * const { Provider: ThemeProvider, useContext: useTheme } = createContext<ThemeContextValue>({\n * name: 'Theme',\n * });\n * \n * // Use in your app\n * function App() {\n * const [theme, setTheme] = useState<'light' | 'dark'>('light');\n * \n * const toggleTheme = () => {\n * setTheme(prev => prev === 'light' ? 'dark' : 'light');\n * };\n * \n * return (\n * <ThemeProvider value={{ theme, toggleTheme }}>\n * <YourComponents />\n * </ThemeProvider>\n * );\n * }\n * \n * // Access in child components\n * function ChildComponent() {\n * const { theme, toggleTheme } = useTheme();\n * return <button onClick={toggleTheme}>Current: {theme}</button>;\n * }\n * ```\n */\nexport function createContext<T>(config: ContextConfig<T>): CreateContextResult<T> {\n const { name, errorMessage, defaultValue } = config;\n\n // Create the React context\n const Context = createReactContext<T | undefined>(defaultValue);\n Context.displayName = name;\n\n // Create the Provider component\n const Provider: React.FC<ProviderProps<T>> = ({ children, value }) => {\n return <Context.Provider value={value}>{children}</Context.Provider>;\n };\n\n Provider.displayName = `${name}Provider`;\n\n // Create the hook\n const useContext = (): T => {\n const context = useReactContext(Context);\n\n if (context === undefined) {\n const error =\n errorMessage ||\n `use${name} must be used within a ${name}Provider. ` +\n `Make sure you wrap your component tree with <${name}Provider>.`;\n throw new Error(error);\n }\n\n return context;\n };\n\n return {\n Context,\n Provider,\n useContext,\n };\n}\n","import React, { createContext as createReactContext, useContext as useReactContext } from 'react';\nimport type { ReactNode } from 'react';\n\nexport interface ContextWithHookConfig<T, P> {\n /**\n * Display name for the context (used in error messages and DevTools)\n */\n name: string;\n /**\n * Hook that provides the context value based on props\n */\n useValue: (props: P) => T;\n /**\n * Error message to show when hook is used outside provider\n */\n errorMessage?: string;\n}\n\nexport interface ProviderWithHookProps {\n children: ReactNode;\n}\n\nexport interface CreateContextWithHookResult<T, P> {\n /**\n * The React Context object\n */\n Context: React.Context<T | undefined>;\n /**\n * Provider component that uses the hook internally\n */\n Provider: React.FC<ProviderWithHookProps & P>;\n /**\n * Hook to access the context value\n * @throws Error if used outside the Provider\n */\n useContext: () => T;\n}\n\n/**\n * Factory function to create a context with a custom hook that manages state\n * This pattern is useful when you want to encapsulate state logic in the provider\n *\n * @example\n * ```tsx\n * // Define your context value and props types\n * interface CounterContextValue {\n * count: number;\n * increment: () => void;\n * decrement: () => void;\n * reset: () => void;\n * }\n *\n * interface CounterProviderProps {\n * initialCount?: number;\n * }\n *\n * // Create the context with a custom hook\n * const { Provider: CounterProvider, useContext: useCounter } = createContextWithHook<\n * CounterContextValue,\n * CounterProviderProps\n * >({\n * name: 'Counter',\n * useValue: ({ initialCount = 0 }) => {\n * const [count, setCount] = useState(initialCount);\n *\n * return {\n * count,\n * increment: () => setCount(prev => prev + 1),\n * decrement: () => setCount(prev => prev - 1),\n * reset: () => setCount(initialCount),\n * };\n * },\n * });\n *\n * // Use in your app\n * function App() {\n * return (\n * <CounterProvider initialCount={10}>\n * <YourComponents />\n * </CounterProvider>\n * );\n * }\n *\n * // Access in child components\n * function ChildComponent() {\n * const { count, increment, decrement } = useCounter();\n * return (\n * <div>\n * <p>Count: {count}</p>\n * <button onClick={increment}>+</button>\n * <button onClick={decrement}>-</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function createContextWithHook<T, P = Record<string, never>>(\n config: ContextWithHookConfig<T, P>\n): CreateContextWithHookResult<T, P> {\n const { name, useValue, errorMessage } = config;\n\n // Create the React context\n const Context = createReactContext<T | undefined>(undefined);\n Context.displayName = name;\n\n // Create the Provider component that uses the hook\n const Provider: React.FC<ProviderWithHookProps & P> = ({ children, ...props }) => {\n const value = useValue(props as P);\n return <Context.Provider value={value}>{children}</Context.Provider>;\n };\n\n Provider.displayName = `${name}Provider`;\n\n // Create the consumer hook\n const useContext = (): T => {\n const context = useReactContext(Context);\n\n if (context === undefined) {\n const error =\n errorMessage ||\n `use${name} must be used within a ${name}Provider. ` +\n `Make sure you wrap your component tree with <${name}Provider>.`;\n throw new Error(error);\n }\n\n return context;\n };\n\n return {\n Context,\n Provider,\n useContext,\n };\n}\n"],"mappings":"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","names":["request","jsx","useEffect","jsx","jsx","Component","jsx","navigate","useEffect","queryClient","jsx","useRef","jsx","useEffect","jsx","jsxs","useEffect","useContext","useEffect","jsx","jsxs","useContext","useEffect","useContext","useEffect","jsx","jsxs","useContext","useEffect","useContext","useEffect","jsx","jsxs","useContext","useEffect","useContext","useEffect","jsx","jsxs","useContext","useEffect","useContext","jsx","useContext","useContext","useEffect","useRef","useState","jsx","jsxs","useContext","useState","useRef","useEffect","useState","useCallback","useContext","createContext","jsx","useState","useCallback","jsx","jsxs","jsx","jsxs","getIcon","useRef","useMemo","createContext","useContext","jsx","useRef","useMemo","value","jsx","createContext","useContext","createReactContext","useReactContext","jsx","useContext"]}
|
package/package.json
CHANGED
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "ad-feature-components",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"type": "module",
|
|
5
|
-
"main": "dist/index.cjs",
|
|
6
|
-
"module": "dist/index.js",
|
|
7
|
-
"types": "dist/index.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"types": "./dist/index.d.ts",
|
|
11
|
-
"import": "./dist/index.js",
|
|
12
|
-
"require": "./dist/index.cjs"
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"dist",
|
|
17
|
-
"README.md",
|
|
18
|
-
"LICENSE"
|
|
19
|
-
],
|
|
20
|
-
"scripts": {
|
|
21
|
-
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
|
|
22
|
-
"dev": "npm run lint && vite",
|
|
23
|
-
"build": "npm run lint && tsup",
|
|
24
|
-
"preview": "vite preview",
|
|
25
|
-
"pack": "npm pack",
|
|
26
|
-
"publish:public": "npm publish",
|
|
27
|
-
"prepare": "husky install"
|
|
28
|
-
},
|
|
29
|
-
"lint-staged": {
|
|
30
|
-
"lib/**/*.{js,jsx,ts,tsx}": [
|
|
31
|
-
"eslint . --ext .js,.jsx,.ts,.tsx"
|
|
32
|
-
],
|
|
33
|
-
"*.css": [
|
|
34
|
-
"stylelint --fix"
|
|
35
|
-
]
|
|
36
|
-
},
|
|
37
|
-
"peerDependencies": {
|
|
38
|
-
"@azure/msal-browser": ">=2",
|
|
39
|
-
"@azure/msal-react": ">=2",
|
|
40
|
-
"@tanstack/react-query": ">=5.90.11",
|
|
41
|
-
"axios": ">=1.13.2",
|
|
42
|
-
"react": ">=17",
|
|
43
|
-
"react-dom": ">=17",
|
|
44
|
-
"react-router-dom": ">=7.9.5"
|
|
45
|
-
},
|
|
46
|
-
"dependencies": {
|
|
47
|
-
"@azure/msal-browser": ">=2",
|
|
48
|
-
"@azure/msal-react": ">=2",
|
|
49
|
-
"@microsoft/applicationinsights-web": "^3.3.10",
|
|
50
|
-
"react": ">=17",
|
|
51
|
-
"react-dom": ">=17",
|
|
52
|
-
"react-transition-group": "^4.4.5",
|
|
53
|
-
"sass": "^1.93.2",
|
|
54
|
-
"tsup": "^8.5.0"
|
|
55
|
-
},
|
|
56
|
-
"devDependencies": {
|
|
57
|
-
"@eslint/js": "^9.36.0",
|
|
58
|
-
"@types/node": "^24.6.0",
|
|
59
|
-
"@types/react": "^19.1.16",
|
|
60
|
-
"@types/react-dom": "^19.1.9",
|
|
61
|
-
"@vitejs/plugin-react-swc": "^4.1.0",
|
|
62
|
-
"eslint": "^9.36.0",
|
|
63
|
-
"eslint-plugin-react-hooks": "^5.2.0",
|
|
64
|
-
"eslint-plugin-react-refresh": "^0.4.22",
|
|
65
|
-
"globals": "^16.4.0",
|
|
66
|
-
"husky": "^8.0.0",
|
|
67
|
-
"lint-staged": "^16.2.7",
|
|
68
|
-
"typescript": "~5.9.3",
|
|
69
|
-
"typescript-eslint": "^8.45.0",
|
|
70
|
-
"vite": "^7.1.7"
|
|
71
|
-
}
|
|
72
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "ad-feature-components",
|
|
3
|
+
"version": "0.0.6",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
|
+
"module": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
|
|
22
|
+
"dev": "npm run lint && vite",
|
|
23
|
+
"build": "npm run lint && tsup",
|
|
24
|
+
"preview": "vite preview",
|
|
25
|
+
"pack": "npm pack",
|
|
26
|
+
"publish:public": "npm publish",
|
|
27
|
+
"prepare": "husky install"
|
|
28
|
+
},
|
|
29
|
+
"lint-staged": {
|
|
30
|
+
"lib/**/*.{js,jsx,ts,tsx}": [
|
|
31
|
+
"eslint . --ext .js,.jsx,.ts,.tsx"
|
|
32
|
+
],
|
|
33
|
+
"*.css": [
|
|
34
|
+
"stylelint --fix"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"@azure/msal-browser": ">=2",
|
|
39
|
+
"@azure/msal-react": ">=2",
|
|
40
|
+
"@tanstack/react-query": ">=5.90.11",
|
|
41
|
+
"axios": ">=1.13.2",
|
|
42
|
+
"react": ">=17",
|
|
43
|
+
"react-dom": ">=17",
|
|
44
|
+
"react-router-dom": ">=7.9.5"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@azure/msal-browser": ">=2",
|
|
48
|
+
"@azure/msal-react": ">=2",
|
|
49
|
+
"@microsoft/applicationinsights-web": "^3.3.10",
|
|
50
|
+
"react": ">=17",
|
|
51
|
+
"react-dom": ">=17",
|
|
52
|
+
"react-transition-group": "^4.4.5",
|
|
53
|
+
"sass": "^1.93.2",
|
|
54
|
+
"tsup": "^8.5.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@eslint/js": "^9.36.0",
|
|
58
|
+
"@types/node": "^24.6.0",
|
|
59
|
+
"@types/react": "^19.1.16",
|
|
60
|
+
"@types/react-dom": "^19.1.9",
|
|
61
|
+
"@vitejs/plugin-react-swc": "^4.1.0",
|
|
62
|
+
"eslint": "^9.36.0",
|
|
63
|
+
"eslint-plugin-react-hooks": "^5.2.0",
|
|
64
|
+
"eslint-plugin-react-refresh": "^0.4.22",
|
|
65
|
+
"globals": "^16.4.0",
|
|
66
|
+
"husky": "^8.0.0",
|
|
67
|
+
"lint-staged": "^16.2.7",
|
|
68
|
+
"typescript": "~5.9.3",
|
|
69
|
+
"typescript-eslint": "^8.45.0",
|
|
70
|
+
"vite": "^7.1.7"
|
|
71
|
+
}
|
|
72
|
+
}
|