@eztrak/shared 0.17.0 → 0.18.0
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 +48 -0
- package/dist/{chunk-KJWCRX6F.mjs → chunk-2KXV5C3X.mjs} +3 -6
- package/dist/chunk-2KXV5C3X.mjs.map +1 -0
- package/dist/{chunk-A5BBQ7X5.mjs → chunk-A5Y5QGVL.mjs} +153 -33
- package/dist/chunk-A5Y5QGVL.mjs.map +1 -0
- package/dist/{chunk-HAW3AKJP.mjs → chunk-IQGTSEHC.mjs} +2 -2
- package/dist/components/index.d.mts +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.js +16 -5
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +2 -2
- package/dist/{handleApiError-SHMjCJHj.d.mts → handleApiError-BIAaN76q.d.mts} +7 -0
- package/dist/{handleApiError-SHMjCJHj.d.ts → handleApiError-BIAaN76q.d.ts} +7 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +151 -34
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/utils/index.d.mts +21 -5
- package/dist/utils/index.d.ts +21 -5
- package/dist/utils/index.js +150 -30
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +2 -2
- package/package.json +2 -1
- package/dist/chunk-A5BBQ7X5.mjs.map +0 -1
- package/dist/chunk-KJWCRX6F.mjs.map +0 -1
- /package/dist/{chunk-HAW3AKJP.mjs.map → chunk-IQGTSEHC.mjs.map} +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/cn.ts","../src/utils/resetPageParam.ts","../src/utils/helpers.ts","../src/utils/localStorage.ts","../src/utils/permissions.ts","../src/utils/handleApiError.ts","../src/utils/createBaseQueryWithRetry.ts","../src/hooks/usePaginationUrlSync.ts","../src/hooks/useGridHeight.ts","../src/components/tabs/EztrakTabs.tsx","../src/components/pagination/CustomPagination.tsx","../src/components/search-filters/DropdownFilter.tsx","../src/components/search-filters/dropdownStyles.ts","../src/components/search-filters/ResetFiltersButton.tsx","../src/components/search-filters/SearchInput.tsx","../src/components/modal/Modal.tsx","../src/components/Loader/Loader.css","../src/components/Loader/Loader.tsx","../src/components/button/Button.tsx","../src/components/card/Card.tsx","../src/components/header/Header.tsx","../src/components/breadcrumbs/Breadcrumbs.tsx","../src/components/sidebar/Sidebar.tsx","../src/components/tooltip/ToolTip.tsx","../src/components/skeleton/CardSkeleton.tsx","../src/components/tooltip/TooltipText.tsx","../src/components/cell-editor/CustomCellEditor.tsx","../src/components/popup-cell-renderer/PopupCellRenderer.tsx","../src/components/row-actions/presets.ts","../src/components/row-actions/ActionMenuItem.tsx","../src/components/row-actions/resolveActions.ts","../src/components/row-actions/RowActions.tsx","../src/components/table-error-boundary/TableErrorBoundary.tsx"],"sourcesContent":["export * from \"./utils\";\r\nexport * from \"./hooks\";\r\nexport * from \"./components\";\r\n","import clsx from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: Parameters<typeof clsx>) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","/**\n * Sends pagination back to the first page after a filter changes the result set.\n *\n * Only touches `pageKey` when it is already present, so filter-only screens that\n * never paginate keep their URL clean. Mutates and returns `params` so it can be\n * chained inside a `setSearchParams((prev) => ...)` updater.\n */\nexport function resetPageParam(\n params: URLSearchParams,\n pageKey = \"page\",\n defaultPage = \"1\",\n) {\n if (params.has(pageKey)) {\n params.set(pageKey, defaultPage);\n }\n return params;\n}\n","export const truncateText = (\r\n text: string | number | null | undefined,\r\n maxLength = 20\r\n): string => {\r\n if (text === null || text === undefined) return \"\";\r\n const value = String(text);\r\n if (value.length <= maxLength) {\r\n return value;\r\n }\r\n return value.slice(0, maxLength - 3) + \"...\";\r\n};\r\n\r\nexport const truncateFileName = (\r\n fileName: string | null | undefined,\r\n maxLength = 20\r\n): string => {\r\n if (!fileName) return \"\";\r\n if (fileName.length <= maxLength) {\r\n return fileName;\r\n }\r\n const extension = fileName.slice(fileName.lastIndexOf(\".\"));\r\n const truncatedName =\r\n fileName.slice(0, maxLength - extension.length - 3) + \"...\";\r\n return truncatedName + extension;\r\n};\r\n\r\nexport function getApiError(apiError: unknown): string {\r\n if (!apiError) return \"An unknown error occurred\";\r\n\r\n if (typeof apiError === \"string\") {\r\n return apiError;\r\n }\r\n\r\n const error = apiError as {\r\n response?: { data?: Record<string, unknown> };\r\n message?: string;\r\n };\r\n\r\n if (error.response?.data) {\r\n const responseData = error.response.data;\r\n\r\n if (typeof responseData === \"string\") {\r\n return responseData;\r\n }\r\n\r\n const errors = responseData.errors;\r\n if (errors && typeof errors === \"object\") {\r\n for (const key in errors) {\r\n const messages = (errors as Record<string, unknown>)[key];\r\n if (Array.isArray(messages) && messages.length > 0) {\r\n return String(messages[0]);\r\n }\r\n }\r\n }\r\n\r\n if (responseData.message) {\r\n return String(responseData.message);\r\n }\r\n\r\n if (responseData.title) {\r\n return String(responseData.title);\r\n }\r\n }\r\n\r\n if (error.message) {\r\n return error.message;\r\n }\r\n\r\n return \"An unknown error occurred\";\r\n}\r\n\r\nexport const normalizeApiListItems = (responseData: unknown): unknown[] => {\r\n if (responseData == null) return [];\r\n if (Array.isArray(responseData)) return responseData;\r\n\r\n const record = responseData as Record<string, unknown>;\r\n const data = record.data;\r\n\r\n if (\r\n data &&\r\n typeof data === \"object\" &&\r\n !Array.isArray(data) &&\r\n Array.isArray((data as { items?: unknown[] }).items)\r\n ) {\r\n return (data as { items: unknown[] }).items;\r\n }\r\n\r\n const returnModel = record.returnModel as { items?: unknown[] } | undefined;\r\n if (Array.isArray(returnModel?.items)) return returnModel.items;\r\n if (Array.isArray(data)) return data;\r\n if (typeof data === \"object\" && data !== null) {\r\n return [data];\r\n }\r\n return [];\r\n};\r\n\r\nexport function capitalizeText(name: string | null | undefined): string {\r\n if (!name) return \"\";\r\n return name\r\n .split(\" \")\r\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n .join(\" \");\r\n}\r\n\r\nexport function toLowerCaseText(text: string | null | undefined): string {\r\n if (!text) return \"\";\r\n return text.toLowerCase();\r\n}\r\n\r\nexport const formatDate = (dateString: string | null | undefined): string => {\r\n if (dateString === null || dateString === undefined) return \"-\";\r\n const date = new Date(dateString);\r\n\r\n if (isNaN(date.getTime())) {\r\n return dateString;\r\n }\r\n\r\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\r\n const day = date.getDate().toString().padStart(2, \"0\");\r\n const year = date.getFullYear().toString().slice(-2);\r\n return `${month}/${day}/${year}`;\r\n};\r\n\r\nexport const isEmpty = (obj: object): boolean => {\r\n return Object.keys(obj).length === 0;\r\n};\r\n\r\nexport const toDateInputValue = (date: string | Date | null | undefined): string => {\r\n if (!date) return \"\";\r\n\r\n let d: Date;\r\n\r\n if (typeof date === \"string\") {\r\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) {\r\n return date;\r\n }\r\n d = new Date(date);\r\n } else {\r\n d = new Date(date);\r\n }\r\n\r\n if (isNaN(d.getTime())) return \"\";\r\n\r\n const localDate = new Date(d.getTime() - d.getTimezoneOffset() * 60000);\r\n const year = localDate.getFullYear();\r\n const month = (localDate.getMonth() + 1).toString().padStart(2, \"0\");\r\n const day = localDate.getDate().toString().padStart(2, \"0\");\r\n\r\n return `${year}-${month}-${day}`;\r\n};\r\n\r\nexport function convertCommaDataToArray(data: string | null | undefined): string[] {\r\n if (!data || data.trim() === \"\") {\r\n return [];\r\n }\r\n return data.split(\",\").map((item) => item.trim());\r\n}\r\n\r\nexport function checkIfExistsInArray<T>(array: T[], searchValue: T): boolean {\r\n return array.includes(searchValue);\r\n}\r\n\r\nexport const currencyFormatter = (value: number | null | undefined): string => {\r\n return value?.toLocaleString(\"en-US\", {\r\n style: \"currency\",\r\n currency: \"USD\",\r\n }) ?? \"\";\r\n};\r\nexport const formatNumber = (number: number | string | null | undefined): string => {\r\n if (isNaN(Number(number)) || number === null || number === undefined) {\r\n return \"0\";\r\n }\r\n\r\n const formattedNumber = Number(number)\r\n .toString()\r\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n\r\n return formattedNumber;\r\n};\r\n\r\nexport const parseCurrencyValueToNumber = (value: unknown): number => {\r\n if (value == null || value === \"\") return 0;\r\n\r\n const raw =\r\n typeof value === \"object\" && value !== null && \"value\" in value\r\n ? (value as { value: unknown }).value\r\n : value;\r\n\r\n const stringValue = raw == null || raw === \"\" ? \"\" : String(raw);\r\n const numericValue = stringValue.replace(/[$,]/g, \"\");\r\n return parseFloat(numericValue) || 0;\r\n};\r\n\r\nexport function flattenTableData<T extends Record<string, unknown>>(\r\n data: T[] | null | undefined,\r\n columns: { field?: string }[] | null | undefined\r\n): T[] {\r\n if (!Array.isArray(data)) return [];\r\n return data.map((row) => {\r\n const flatRow = { ...row };\r\n (columns ?? []).forEach((col) => {\r\n const key = col.field;\r\n if (!key) return;\r\n if (key.includes(\".\")) {\r\n const value = key.split(\".\").reduce<unknown>(\r\n (acc, part) => (acc as Record<string, unknown> | undefined)?.[part],\r\n row\r\n );\r\n (flatRow as Record<string, unknown>)[key] = value ?? \"\";\r\n }\r\n });\r\n return flatRow;\r\n });\r\n}\r\n\r\nexport const getErrorMessages = (error: {\r\n data?: {\r\n errors?: Record<string, string[]>;\r\n title?: string;\r\n error?: { name?: string[] };\r\n };\r\n} | null | undefined): string => {\r\n if (error?.data?.errors) {\r\n return Object.values(error.data.errors).flat().join(\"\\n\");\r\n }\r\n return (\r\n error?.data?.title ??\r\n error?.data?.error?.name?.[0] ??\r\n \"Failed to save\"\r\n );\r\n};\r\n\r\nexport const getFieldsByCategory = <T extends { category?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields?.filter(({ category = \"\" }) => category === key);\r\n};\r\n\r\nexport const getFieldsByName = <T extends { name?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields.filter(({ name = \"\" }) => name === key);\r\n};\r\n\r\nexport const deserializeJson = <T = unknown>(jsonString: string): T | null => {\r\n try {\r\n return JSON.parse(jsonString) as T;\r\n } catch (error) {\r\n console.error(\"Error parsing JSON:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nexport const formatDateTime = (dateString: string | null | undefined): string => {\r\n if (!dateString) return \"Invalid Date\";\r\n const date = new Date(dateString);\r\n if (isNaN(date.getTime())) return \"Invalid Date\";\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: \"numeric\",\r\n month: \"numeric\",\r\n day: \"numeric\",\r\n hour: \"numeric\",\r\n minute: \"numeric\",\r\n hour12: true,\r\n };\r\n return date.toLocaleString(\"en-US\", options);\r\n};\r\n\r\nexport const removeByPropertyValues = <T extends Record<string, unknown>>(\r\n items: T[] = [],\r\n property: keyof T & string,\r\n values: unknown[] = [],\r\n { caseInsensitive = false }: { caseInsensitive?: boolean } = {}\r\n): T[] => {\r\n if (!Array.isArray(items) || !property) return Array.isArray(items) ? items : [];\r\n const normalize = (v: unknown) =>\r\n caseInsensitive && typeof v === \"string\" ? v.toLowerCase() : v;\r\n const valuesArr = Array.isArray(values) ? values : [values];\r\n const toRemove = new Set(valuesArr.map(normalize));\r\n return items.filter((item) => !toRemove.has(normalize(item?.[property])));\r\n};\r\n\r\nexport const getFieldsByInputType = <T extends { inputType?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields.filter(({ inputType = \"\" }) => inputType === key);\r\n};\r\n","export const USER_STATE_STORAGE_KEY = \"authState\";\r\n\r\nfunction getStorage(): Storage | null {\r\n if (typeof window === \"undefined\") return null;\r\n return window.localStorage;\r\n}\r\n\r\nexport function getItem<T>(key: string, fallback: T | null = null): T | null {\r\n try {\r\n const raw = getStorage()?.getItem(key);\r\n if (raw === null || raw === undefined) {\r\n return fallback;\r\n }\r\n return JSON.parse(raw) as T;\r\n } catch {\r\n return fallback;\r\n }\r\n}\r\n\r\nexport function setItem<T>(key: string, value: T): void {\r\n try {\r\n getStorage()?.setItem(key, JSON.stringify(value));\r\n } catch {\r\n // Ignore write errors (quota exceeded, private mode, etc.)\r\n }\r\n}\r\n\r\nexport function removeItem(key: string): void {\r\n try {\r\n getStorage()?.removeItem(key);\r\n } catch {\r\n // Ignore remove errors\r\n }\r\n}\r\n\r\nexport function loadUserState<T = unknown>(\r\n key: string = USER_STATE_STORAGE_KEY\r\n): T | undefined {\r\n const value = getItem<T | undefined>(key, undefined);\r\n return value === null ? undefined : value;\r\n}\r\n\r\nexport function saveUserState<T = unknown>(\r\n state: T,\r\n key: string = USER_STATE_STORAGE_KEY\r\n): void {\r\n setItem(key, state);\r\n}\r\n\r\n/** Task-aligned aliases */\r\nexport const get = getItem;\r\nexport const set = setItem;\r\n\r\n/** Backward-compatible aliases used in federation apps */\r\nexport const getItemFromLocalStorage = getItem;\r\nexport const storeItemInLocalStorage = setItem;\r\nexport const saveItemLocalStorage = setItem;\r\n","export interface PermissionRecord {\r\n moduleName: string;\r\n permission: string;\r\n permissionId: string | number;\r\n}\r\n\r\nexport type TransformedPermissions = Record<\r\n string,\r\n Record<string, string | number>\r\n>;\r\n\r\nexport function transformPermissions(\r\n permissions: PermissionRecord[]\r\n): TransformedPermissions {\r\n return permissions.reduce<TransformedPermissions>((acc, permission) => {\r\n const { moduleName, permission: perm, permissionId } = permission;\r\n\r\n if (!acc[moduleName]) {\r\n acc[moduleName] = {};\r\n }\r\n\r\n acc[moduleName][perm] = permissionId;\r\n\r\n return acc;\r\n }, {});\r\n}\r\n","import toast from \"react-hot-toast\";\r\nimport Swal, { type SweetAlertOptions, type SweetAlertResult } from \"sweetalert2\";\r\n\r\nexport type RtkQueryError = {\r\n status?: number | string;\r\n originalStatus?: number;\r\n data?: {\r\n errors?: Record<string, string[]>;\r\n message?: string;\r\n title?: string;\r\n };\r\n message?: string;\r\n error?: string;\r\n};\r\n\r\nexport interface HandleApiErrorOptions {\r\n showAlert?: boolean;\r\n fallbackMessage?: string;\r\n}\r\n\r\nexport type ErrorSuggestedAction =\r\n | \"retry\"\r\n | \"refresh\"\r\n | \"contact-support\"\r\n | \"none\";\r\n\r\nexport type ErrorClassification = {\r\n isRetryable: boolean;\r\n userMessage: string;\r\n technicalMessage: string;\r\n suggestedAction: ErrorSuggestedAction;\r\n};\r\n\r\n/** Returns true for transient network/server errors that warrant automatic retry. */\r\nexport function isRetryableError(\r\n error: RtkQueryError | null | undefined\r\n): boolean {\r\n if (!error) return false;\r\n\r\n const status = error.status ?? error.originalStatus;\r\n\r\n if (\r\n status === \"FETCH_ERROR\" ||\r\n status === \"TIMEOUT_ERROR\" ||\r\n status === \"PARSING_ERROR\"\r\n ) {\r\n return true;\r\n }\r\n\r\n if (typeof status === \"number\") {\r\n if (status === 502 || status === 503 || status === 504) return true;\r\n if (status >= 500 && status < 600) return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/** Classifies RTK Query errors for user messaging and retry guidance. */\r\nexport function classifyError(\r\n error: RtkQueryError | null | undefined\r\n): ErrorClassification {\r\n if (!error) {\r\n return {\r\n isRetryable: false,\r\n userMessage: \"An error occurred.\",\r\n technicalMessage: \"Unknown error\",\r\n suggestedAction: \"none\",\r\n };\r\n }\r\n\r\n const status = error.status ?? error.originalStatus;\r\n const data = error.data;\r\n\r\n if (\r\n status === \"FETCH_ERROR\" ||\r\n status === \"TIMEOUT_ERROR\" ||\r\n status === \"PARSING_ERROR\"\r\n ) {\r\n return {\r\n isRetryable: true,\r\n userMessage: \"Network error. Please check your connection.\",\r\n technicalMessage: \"Network request failed\",\r\n suggestedAction: \"retry\",\r\n };\r\n }\r\n\r\n if (typeof status === \"number\" && status >= 500 && status < 600) {\r\n return {\r\n isRetryable: true,\r\n userMessage: \"Server is temporarily unavailable. Please try again.\",\r\n technicalMessage: `Server error: ${status}`,\r\n suggestedAction: \"retry\",\r\n };\r\n }\r\n\r\n return {\r\n isRetryable: false,\r\n userMessage:\r\n data?.message ||\r\n data?.title ||\r\n error.error ||\r\n \"An error occurred. Please try again.\",\r\n technicalMessage:\r\n typeof status === \"number\" || typeof status === \"string\"\r\n ? `Client error: ${status}`\r\n : \"Request failed\",\r\n suggestedAction: \"none\",\r\n };\r\n}\r\n\r\nexport function formatValidationErrorsHtml(\r\n errors: Record<string, string[]>\r\n): string {\r\n const items = Object.keys(errors).flatMap((field) =>\r\n (errors[field] || []).map((msg) => `<li>${msg}</li>`)\r\n );\r\n return `\r\n <div style=\"text-align:left\">\r\n <p>Please review and correct the following:</p>\r\n <ul style=\"margin:8px 0 0 16px; list-style:disc;\">\r\n ${items.join(\"\")}\r\n </ul>\r\n </div>\r\n `;\r\n}\r\n\r\nfunction showValidationAlert(html: string): void {\r\n void Swal.fire({\r\n title: \"Validation errors\",\r\n html,\r\n icon: \"error\",\r\n confirmButtonText: \"OK\",\r\n showCancelButton: false,\r\n confirmButtonColor: \"#FF7335\",\r\n });\r\n}\r\n\r\n/** Handles RTK Query errors with built-in toast.error or SweetAlert (when showAlert is true). */\r\nexport function handleApiError(\r\n error: RtkQueryError | null | undefined,\r\n { showAlert = false, fallbackMessage }: HandleApiErrorOptions = {}\r\n): void {\r\n if (!error) return;\r\n\r\n const status = error.status ?? error.originalStatus;\r\n const data = error.data;\r\n\r\n if (status === 200) {\r\n return;\r\n }\r\n\r\n if (data?.errors && typeof data.errors === \"object\") {\r\n const errors = data.errors;\r\n\r\n if (showAlert) {\r\n showValidationAlert(formatValidationErrorsHtml(errors));\r\n } else {\r\n Object.keys(errors).forEach((field) => {\r\n (errors[field] || []).forEach((errorMessage) => {\r\n toast.error(errorMessage);\r\n });\r\n });\r\n }\r\n return;\r\n }\r\n\r\n if (status === 404) {\r\n return;\r\n }\r\n\r\n const message =\r\n fallbackMessage ||\r\n data?.message ||\r\n data?.title ||\r\n error.error ||\r\n error.message ||\r\n \"An error occurred. Please try again.\";\r\n\r\n toast.error(message);\r\n}\r\n\r\nconst BRAND_ORANGE = \"#FF7335\";\r\nconst DANGER_RED = \"#DC2626\";\r\nconst DANGER_ICON_BG = \"#FEE2E2\";\r\nconst CANCEL_BG = \"#ffffff\";\r\nconst CANCEL_TEXT = \"#374151\";\r\nconst CONFIRM_STYLE_ID = \"eztrak-confirm-alert-styles\";\r\n\r\nexport type ConfirmationAlertVariant = \"brand\" | \"danger\";\r\n\r\nexport interface ConfirmationAlertOptions {\r\n title?: string;\r\n text?: string;\r\n html?: string;\r\n icon?: \"warning\" | \"info\" | \"question\" | \"error\" | \"success\";\r\n /** Custom icon markup. When set, replaces SweetAlert's default icon content. */\r\n iconHtml?: string;\r\n iconColor?: string;\r\n iconBgColor?: string;\r\n showIcon?: boolean;\r\n confirmButtonText?: string;\r\n cancelButtonText?: string;\r\n confirmButtonColor?: string;\r\n cancelButtonColor?: string;\r\n confirmButtonTextColor?: string;\r\n cancelButtonTextColor?: string;\r\n showCancelButton?: boolean;\r\n showLoaderOnConfirm?: boolean;\r\n /** Type exactly — trimmed, case-sensitive. */\r\n inputExpectedValue?: string;\r\n inputPlaceholder?: string;\r\n reverseButtons?: boolean;\r\n focusCancel?: boolean;\r\n zIndex?: number;\r\n width?: string | number;\r\n /** Card corner radius. Default `1rem`. Number = px. */\r\n borderRadius?: string | number;\r\n /** Confirm/cancel button corner radius. Default `0.5rem`. Number = px. */\r\n buttonBorderRadius?: string | number;\r\n /** `danger` = delete look; `brand` = orange confirm. Explicit options win. */\r\n variant?: ConfirmationAlertVariant;\r\n customClass?: SweetAlertOptions[\"customClass\"];\r\n onCancel?: () => void;\r\n}\r\n\r\nfunction cssSize(value: string | number | undefined, fallback: string): string {\r\n if (value === undefined) return fallback;\r\n return typeof value === \"number\" ? `${value}px` : value;\r\n}\r\n\r\n/** Reusable icon markup — override via `iconHtml`. */\r\nexport const DEFAULT_CONFIRM_ICONS = {\r\n warning: `\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z\" />\r\n </svg>\r\n `.trim(),\r\n} as const;\r\n\r\ntype VariantDefaults = Partial<\r\n Pick<\r\n ConfirmationAlertOptions,\r\n | \"title\"\r\n | \"confirmButtonText\"\r\n | \"confirmButtonColor\"\r\n | \"confirmButtonTextColor\"\r\n | \"cancelButtonColor\"\r\n | \"cancelButtonTextColor\"\r\n | \"iconColor\"\r\n | \"iconBgColor\"\r\n | \"iconHtml\"\r\n | \"showLoaderOnConfirm\"\r\n | \"icon\"\r\n >\r\n>;\r\n\r\nconst VARIANT_DEFAULTS: Record<ConfirmationAlertVariant, VariantDefaults> = {\r\n brand: {\r\n confirmButtonText: \"Yes\",\r\n confirmButtonColor: BRAND_ORANGE,\r\n confirmButtonTextColor: \"#ffffff\",\r\n cancelButtonColor: CANCEL_BG,\r\n cancelButtonTextColor: CANCEL_TEXT,\r\n iconColor: BRAND_ORANGE,\r\n iconBgColor: \"#FFEDD5\",\r\n iconHtml: DEFAULT_CONFIRM_ICONS.warning,\r\n icon: \"warning\",\r\n },\r\n danger: {\r\n title: \"Delete this item\",\r\n confirmButtonText: \"Yes, delete it!\",\r\n confirmButtonColor: DANGER_RED,\r\n confirmButtonTextColor: \"#ffffff\",\r\n cancelButtonColor: CANCEL_BG,\r\n cancelButtonTextColor: CANCEL_TEXT,\r\n iconColor: DANGER_RED,\r\n iconBgColor: DANGER_ICON_BG,\r\n iconHtml: DEFAULT_CONFIRM_ICONS.warning,\r\n icon: \"warning\",\r\n showLoaderOnConfirm: true,\r\n },\r\n};\r\n\r\nfunction ensureConfirmAlertStyles(): void {\r\n if (typeof document === \"undefined\") return;\r\n if (document.getElementById(CONFIRM_STYLE_ID)) return;\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = CONFIRM_STYLE_ID;\r\n style.textContent = `\r\n .ez-confirm-popup {\r\n border-radius: var(--ez-confirm-radius, 1rem) !important;\r\n padding: 1.5rem !important;\r\n max-width: 24rem !important;\r\n width: var(--ez-confirm-width, 100%) !important;\r\n box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25) !important;\r\n }\r\n .ez-confirm-title {\r\n font-size: 1.125rem !important;\r\n font-weight: 600 !important;\r\n color: #111827 !important;\r\n margin: 0 0 0.25rem !important;\r\n padding: 0 !important;\r\n }\r\n .ez-confirm-html {\r\n font-size: 0.875rem !important;\r\n color: #6b7280 !important;\r\n margin: 0 0 1.5rem !important;\r\n }\r\n .ez-confirm-icon {\r\n border: none !important;\r\n background: var(--ez-confirm-icon-bg, #fee2e2) !important;\r\n color: var(--ez-confirm-icon-color, #dc2626) !important;\r\n width: 3rem !important;\r\n height: 3rem !important;\r\n margin: 0 auto 1rem !important;\r\n border-radius: 9999px !important;\r\n }\r\n .ez-confirm-icon .swal2-icon-content {\r\n font-size: inherit !important;\r\n display: flex !important;\r\n align-items: center !important;\r\n justify-content: center !important;\r\n color: inherit !important;\r\n }\r\n .ez-confirm-actions {\r\n width: 100% !important;\r\n margin: 0 !important;\r\n gap: 0.75rem !important;\r\n }\r\n .ez-confirm-confirm,\r\n .ez-confirm-cancel {\r\n flex: 1 1 0 !important;\r\n margin: 0 !important;\r\n border-radius: var(--ez-confirm-btn-radius, 0.5rem) !important;\r\n font-size: 0.875rem !important;\r\n font-weight: 500 !important;\r\n padding: 0.625rem 1rem !important;\r\n box-shadow: none !important;\r\n }\r\n .ez-confirm-confirm {\r\n background: var(--ez-confirm-confirm-bg, #ff7335) !important;\r\n color: var(--ez-confirm-confirm-fg, #fff) !important;\r\n border: none !important;\r\n }\r\n .ez-confirm-confirm:hover {\r\n filter: brightness(0.95);\r\n }\r\n .ez-confirm-cancel {\r\n background: var(--ez-confirm-cancel-bg, #fff) !important;\r\n color: var(--ez-confirm-cancel-fg, #374151) !important;\r\n border: 1px solid #d1d5db !important;\r\n }\r\n .ez-confirm-cancel:hover {\r\n background: #f9fafb !important;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\nfunction pick<T>(\r\n explicit: T | undefined,\r\n fromVariant: T | undefined,\r\n fallback: T\r\n): T {\r\n if (explicit !== undefined) return explicit;\r\n if (fromVariant !== undefined) return fromVariant;\r\n return fallback;\r\n}\r\n\r\nfunction mergeCustomClass(\r\n base: NonNullable<SweetAlertOptions[\"customClass\"]>,\r\n extra?: SweetAlertOptions[\"customClass\"]\r\n): SweetAlertOptions[\"customClass\"] {\r\n if (!extra || typeof extra !== \"object\") return base;\r\n const merged: Record<string, string> = { ...(base as Record<string, string>) };\r\n for (const [key, value] of Object.entries(extra)) {\r\n if (typeof value === \"string\" && value) {\r\n merged[key] = merged[key] ? `${merged[key]} ${value}` : value;\r\n }\r\n }\r\n return merged;\r\n}\r\n\r\nfunction getConfirmErrorMessage(error: unknown): string {\r\n if (error && typeof error === \"object\") {\r\n const err = error as {\r\n message?: string;\r\n data?: { message?: string; title?: string };\r\n };\r\n return (\r\n err.data?.message ||\r\n err.data?.title ||\r\n err.message ||\r\n \"Something went wrong. Please try again.\"\r\n );\r\n }\r\n return \"Something went wrong. Please try again.\";\r\n}\r\n\r\nexport function confirmationAlert(\r\n onConfirm: () => void | Promise<void>,\r\n options: ConfirmationAlertOptions = {}\r\n): void {\r\n ensureConfirmAlertStyles();\r\n\r\n const variant = options.variant ?? \"brand\";\r\n const vd = VARIANT_DEFAULTS[variant];\r\n\r\n const inputExpectedValue = options.inputExpectedValue;\r\n const hasInput = Boolean(inputExpectedValue);\r\n\r\n const title = pick(\r\n options.title,\r\n vd.title,\r\n hasInput ? \"Confirmation Required\" : \"Delete this item\"\r\n );\r\n const text = options.text;\r\n const html = options.html;\r\n const icon = pick(options.icon, vd.icon, \"warning\" as const);\r\n const iconHtml = pick(options.iconHtml, vd.iconHtml, undefined);\r\n const iconColor = pick(options.iconColor, vd.iconColor, BRAND_ORANGE);\r\n const iconBgColor = pick(options.iconBgColor, vd.iconBgColor, \"#FFEDD5\");\r\n const showIcon = options.showIcon !== false;\r\n const confirmButtonText = pick(options.confirmButtonText, vd.confirmButtonText, \"Yes\");\r\n const cancelButtonText = options.cancelButtonText ?? \"Cancel\";\r\n const confirmButtonColor = pick(\r\n options.confirmButtonColor,\r\n vd.confirmButtonColor,\r\n BRAND_ORANGE\r\n );\r\n const cancelButtonColor = pick(\r\n options.cancelButtonColor,\r\n vd.cancelButtonColor,\r\n CANCEL_BG\r\n );\r\n const confirmButtonTextColor = pick(\r\n options.confirmButtonTextColor,\r\n vd.confirmButtonTextColor,\r\n \"#ffffff\"\r\n );\r\n const cancelButtonTextColor = pick(\r\n options.cancelButtonTextColor,\r\n vd.cancelButtonTextColor,\r\n CANCEL_TEXT\r\n );\r\n const showCancelButton = options.showCancelButton !== false;\r\n const showLoaderOnConfirm = pick(\r\n options.showLoaderOnConfirm,\r\n vd.showLoaderOnConfirm,\r\n false\r\n );\r\n const inputPlaceholder =\r\n options.inputPlaceholder ?? \"Type confirmation text to proceed\";\r\n // Cancel left, Confirm right (matches gallery delete card)\r\n const reverseButtons = options.reverseButtons ?? false;\r\n const focusCancel = options.focusCancel;\r\n const zIndex = options.zIndex;\r\n const width = options.width;\r\n const borderRadius = cssSize(options.borderRadius, \"1rem\");\r\n const buttonBorderRadius = cssSize(options.buttonBorderRadius, \"0.5rem\");\r\n const onCancel = options.onCancel;\r\n\r\n const useLoader = showLoaderOnConfirm || hasInput;\r\n\r\n const inputHtml =\r\n html ??\r\n (hasInput\r\n ? `\r\n ${text ? `<p style=\"margin-bottom: 15px;\">${text}</p>` : \"\"}\r\n <p style=\"margin-bottom: 10px; font-weight: bold; color: #666;\">\r\n Please type \"<span style=\"color: ${BRAND_ORANGE}; font-weight: bold;\">${inputExpectedValue}</span>\" to confirm:\r\n </p>\r\n `\r\n : undefined);\r\n\r\n const baseCustomClass = {\r\n popup: \"ez-confirm-popup\",\r\n title: \"ez-confirm-title\",\r\n htmlContainer: \"ez-confirm-html\",\r\n actions: \"ez-confirm-actions\",\r\n confirmButton: \"ez-confirm-confirm\",\r\n cancelButton: \"ez-confirm-cancel\",\r\n icon: \"ez-confirm-icon\",\r\n };\r\n\r\n const swalOptions: SweetAlertOptions = {\r\n title,\r\n showCancelButton,\r\n confirmButtonText,\r\n cancelButtonText,\r\n confirmButtonColor,\r\n cancelButtonColor,\r\n reverseButtons,\r\n focusCancel,\r\n customClass: mergeCustomClass(baseCustomClass, options.customClass),\r\n allowOutsideClick: () => !Swal.isLoading(),\r\n allowEscapeKey: () => !Swal.isLoading(),\r\n didOpen: () => {\r\n const popup = Swal.getPopup();\r\n if (popup) {\r\n popup.style.setProperty(\"--ez-confirm-confirm-bg\", confirmButtonColor);\r\n popup.style.setProperty(\"--ez-confirm-confirm-fg\", confirmButtonTextColor);\r\n popup.style.setProperty(\"--ez-confirm-cancel-bg\", cancelButtonColor);\r\n popup.style.setProperty(\"--ez-confirm-cancel-fg\", cancelButtonTextColor);\r\n popup.style.setProperty(\"--ez-confirm-icon-color\", iconColor);\r\n popup.style.setProperty(\"--ez-confirm-icon-bg\", iconBgColor);\r\n popup.style.setProperty(\"--ez-confirm-radius\", borderRadius);\r\n popup.style.setProperty(\"--ez-confirm-btn-radius\", buttonBorderRadius);\r\n if (width != null) {\r\n popup.style.setProperty(\r\n \"--ez-confirm-width\",\r\n typeof width === \"number\" ? `${width}px` : String(width)\r\n );\r\n }\r\n }\r\n if (zIndex == null) return;\r\n const container = Swal.getContainer();\r\n if (container) container.style.zIndex = String(zIndex);\r\n },\r\n };\r\n\r\n if (showIcon) {\r\n swalOptions.icon = icon;\r\n if (iconHtml) {\r\n swalOptions.iconHtml = iconHtml;\r\n }\r\n }\r\n\r\n if (hasInput) {\r\n swalOptions.html = inputHtml;\r\n swalOptions.input = \"text\";\r\n swalOptions.inputPlaceholder = inputPlaceholder;\r\n swalOptions.inputValidator = (value: string) => {\r\n if (!value?.trim()) return \"You need to enter the confirmation text!\";\r\n if (value.trim() !== inputExpectedValue!.trim()) {\r\n return `Please type \"${inputExpectedValue}\" exactly as shown!`;\r\n }\r\n return null;\r\n };\r\n } else if (html) {\r\n swalOptions.html = html;\r\n } else {\r\n swalOptions.text = text;\r\n }\r\n\r\n if (useLoader) {\r\n swalOptions.showLoaderOnConfirm = true;\r\n swalOptions.preConfirm = (inputValue: string) => {\r\n if (hasInput && inputValue?.trim() !== inputExpectedValue!.trim()) {\r\n Swal.showValidationMessage(\r\n `Please type \"${inputExpectedValue}\" exactly as shown!`\r\n );\r\n return false;\r\n }\r\n return Promise.resolve()\r\n .then(() => onConfirm())\r\n .catch((error) => {\r\n Swal.showValidationMessage(getConfirmErrorMessage(error));\r\n throw error;\r\n });\r\n };\r\n }\r\n\r\n void Swal.fire(swalOptions).then((result: SweetAlertResult) => {\r\n if (result.isConfirmed && !useLoader) {\r\n void Promise.resolve(onConfirm());\r\n return;\r\n }\r\n if (result.isDismissed) {\r\n onCancel?.();\r\n }\r\n });\r\n}\r\n","import { retry } from \"@reduxjs/toolkit/query\";\r\nimport type { BaseQueryFn } from \"@reduxjs/toolkit/query\";\r\nimport { isRetryableError, type RtkQueryError } from \"./handleApiError\";\r\n\r\nexport type CreateBaseQueryWithRetryOptions = {\r\n maxRetries?: number;\r\n maxBackoffMs?: number;\r\n};\r\n\r\nfunction getRequestMethod(args: unknown): string {\r\n if (typeof args === \"string\") return \"GET\";\r\n if (args && typeof args === \"object\" && \"method\" in args) {\r\n const method = (args as { method?: string }).method;\r\n return (method || \"GET\").toUpperCase();\r\n }\r\n return \"GET\";\r\n}\r\n\r\n/**\r\n * Wraps an authenticated baseQuery with RTK Query retry for GET requests only.\r\n * Retries transient network/server errors with exponential backoff.\r\n */\r\nexport function createBaseQueryWithRetry(\r\n baseQueryWithReauth: BaseQueryFn,\r\n {\r\n maxRetries = 3,\r\n maxBackoffMs = 8000,\r\n }: CreateBaseQueryWithRetryOptions = {}\r\n): BaseQueryFn {\r\n const retryableQuery = retry(\r\n async (args, api, extraOptions) => {\r\n const result = await baseQueryWithReauth(args, api, extraOptions);\r\n\r\n if (result.error && !isRetryableError(result.error as RtkQueryError)) {\r\n retry.fail(result.error);\r\n }\r\n\r\n return result;\r\n },\r\n {\r\n maxRetries,\r\n backoff: (attempt: number) =>\r\n new Promise((resolve) =>\r\n setTimeout(resolve, Math.min(1000 * 2 ** attempt, maxBackoffMs))\r\n ),\r\n }\r\n );\r\n\r\n const baseQueryWithConditionalRetry: BaseQueryFn = async (\r\n args,\r\n api,\r\n extraOptions\r\n ) => {\r\n const method = getRequestMethod(args);\r\n if (method !== \"GET\") {\r\n return baseQueryWithReauth(args, api, extraOptions);\r\n }\r\n return retryableQuery(args, api, extraOptions);\r\n };\r\n\r\n return baseQueryWithConditionalRetry;\r\n}\r\n","import { useEffect } from \"react\";\nimport type { SetURLSearchParams } from \"react-router-dom\";\n\nexport const usePaginationUrlSync = (\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParams,\n page: number,\n setPage: (page: number) => void,\n perPage: number,\n setPerPage: (perPage: number) => void,\n defaultPage = 1,\n defaultPerPage = 20\n) => {\n useEffect(() => {\n const currentUrlPage = parseInt(searchParams.get(\"page\") ?? \"\") || defaultPage;\n const currentUrlPerPage =\n parseInt(searchParams.get(\"perPage\") ?? \"\") || defaultPerPage;\n const hasPageParam = searchParams.has(\"page\");\n const hasPerPageParam = searchParams.has(\"perPage\");\n\n if (!hasPageParam || !hasPerPageParam) {\n const newParams = new URLSearchParams(searchParams);\n\n if (!hasPageParam) {\n newParams.set(\"page\", defaultPage.toString());\n }\n\n if (!hasPerPageParam) {\n newParams.set(\"perPage\", defaultPerPage.toString());\n }\n\n setSearchParams(newParams, { replace: true });\n return;\n }\n\n if (currentUrlPage !== page) {\n setPage(currentUrlPage);\n }\n\n if (currentUrlPerPage !== perPage) {\n setPerPage(currentUrlPerPage);\n }\n }, [\n searchParams,\n setSearchParams,\n page,\n setPage,\n perPage,\n setPerPage,\n defaultPage,\n defaultPerPage,\n ]);\n};\n","import { useEffect, useState } from \"react\";\n\nexport interface UseGridHeightOptions {\n height?: string;\n headerId?: string;\n footerId?: string;\n offset?: number;\n}\n\nexport const useGridHeight = ({\n height,\n headerId = \"layout-header\",\n footerId = \"layout-footer\",\n offset = 390,\n}: UseGridHeightOptions = {}) => {\n const [gridHeight, setGridHeight] = useState(height || \"300px\");\n\n useEffect(() => {\n if (height) {\n setGridHeight(height);\n return;\n }\n\n const calculateHeight = () => {\n const header = document.getElementById(headerId);\n const footer = document.getElementById(footerId);\n\n const headerHeight = header ? header.offsetHeight : 0;\n const footerHeight = footer ? footer.offsetHeight : 0;\n const totalHeight = window.innerHeight;\n\n const remainingHeight = totalHeight - headerHeight - footerHeight - offset;\n setGridHeight(`${remainingHeight}px`);\n };\n\n calculateHeight();\n window.addEventListener(\"resize\", calculateHeight);\n return () => window.removeEventListener(\"resize\", calculateHeight);\n }, [height, headerId, footerId, offset]);\n\n return gridHeight;\n};\n","import {\r\n useCallback,\r\n useEffect,\r\n useId,\r\n useRef,\r\n useState,\r\n type KeyboardEvent,\r\n} from \"react\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { EztrakTab, EztrakTabsProps } from \"./types\";\r\n\r\nfunction getInitialTabId(\r\n tabs: EztrakTab[],\r\n defaultTabId?: string\r\n): string | undefined {\r\n if (defaultTabId && tabs.some((t) => t.id === defaultTabId && !t.disabled)) {\r\n return defaultTabId;\r\n }\r\n return tabs.find((t) => !t.disabled)?.id;\r\n}\r\n\r\nfunction getEnabledTabIds(tabs: EztrakTab[]): string[] {\r\n return tabs.filter((t) => !t.disabled).map((t) => t.id);\r\n}\r\n\r\nexport function EztrakTabs({\r\n tabs,\r\n activeTab,\r\n defaultTabId,\r\n onTabChange,\r\n showPanels = true,\r\n keepMounted = false,\r\n classNames,\r\n className,\r\n}: EztrakTabsProps) {\r\n const baseId = useId().replace(/:/g, \"\");\r\n const isControlled = activeTab !== undefined && activeTab !== null;\r\n const [uncontrolledActive, setUncontrolledActive] = useState(() =>\r\n getInitialTabId(tabs, defaultTabId)\r\n );\r\n const tabRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\r\n\r\n const displayActive = isControlled ? activeTab : uncontrolledActive;\r\n\r\n useEffect(() => {\r\n if (isControlled) return;\r\n const enabledIds = getEnabledTabIds(tabs);\r\n if (!displayActive || !enabledIds.includes(displayActive)) {\r\n const next = getInitialTabId(tabs, defaultTabId);\r\n if (next !== displayActive) {\r\n setUncontrolledActive(next);\r\n }\r\n }\r\n }, [tabs, defaultTabId, isControlled, displayActive]);\r\n\r\n const handleTabClick = useCallback(\r\n (tabId: string, disabled?: boolean) => {\r\n if (disabled) return;\r\n if (!isControlled) {\r\n setUncontrolledActive(tabId);\r\n }\r\n onTabChange?.(tabId);\r\n },\r\n [isControlled, onTabChange]\r\n );\r\n\r\n const focusTab = useCallback((tabId: string) => {\r\n tabRefs.current.get(tabId)?.focus();\r\n }, []);\r\n\r\n const handleListKeyDown = useCallback(\r\n (event: KeyboardEvent<HTMLUListElement>) => {\r\n const enabledIds = getEnabledTabIds(tabs);\r\n if (enabledIds.length === 0) return;\r\n\r\n const currentIndex = displayActive\r\n ? enabledIds.indexOf(displayActive)\r\n : -1;\r\n let nextIndex = currentIndex;\r\n\r\n switch (event.key) {\r\n case \"ArrowRight\":\r\n case \"ArrowDown\":\r\n event.preventDefault();\r\n nextIndex =\r\n currentIndex < 0\r\n ? 0\r\n : (currentIndex + 1) % enabledIds.length;\r\n break;\r\n case \"ArrowLeft\":\r\n case \"ArrowUp\":\r\n event.preventDefault();\r\n nextIndex =\r\n currentIndex < 0\r\n ? enabledIds.length - 1\r\n : (currentIndex - 1 + enabledIds.length) % enabledIds.length;\r\n break;\r\n case \"Home\":\r\n event.preventDefault();\r\n nextIndex = 0;\r\n break;\r\n case \"End\":\r\n event.preventDefault();\r\n nextIndex = enabledIds.length - 1;\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n const nextId = enabledIds[nextIndex];\r\n if (nextId) {\r\n handleTabClick(nextId);\r\n focusTab(nextId);\r\n }\r\n },\r\n [tabs, displayActive, handleTabClick, focusTab]\r\n );\r\n\r\n if (!tabs.length) {\r\n return null;\r\n }\r\n\r\n const wrapperClass = cn(\r\n \"eztrak-tabs-wrapper\",\r\n classNames?.wrapper,\r\n className\r\n );\r\n\r\n return (\r\n <div className={wrapperClass}>\r\n <div className={cn(\"eztrak-tabs-container\", classNames?.container)}>\r\n <nav\r\n className={cn(\"eztrak-tabs-nav\", classNames?.nav)}\r\n aria-label=\"Tabs\"\r\n >\r\n <ul\r\n role=\"tablist\"\r\n className={cn(\"eztrak-tabs-list\", classNames?.list)}\r\n onKeyDown={handleListKeyDown}\r\n >\r\n {tabs.map((tab) => {\r\n const isActive = displayActive === tab.id;\r\n const tabId = `${baseId}-tab-${tab.id}`;\r\n const panelId = `${baseId}-panel-${tab.id}`;\r\n\r\n return (\r\n <li\r\n key={tab.id}\r\n role=\"presentation\"\r\n className={cn(\r\n \"eztrak-tabs-item\",\r\n isActive && \"eztrak-tabs-item-active\",\r\n classNames?.item,\r\n isActive && classNames?.itemActive\r\n )}\r\n >\r\n <button\r\n ref={(el) => {\r\n if (el) {\r\n tabRefs.current.set(tab.id, el);\r\n } else {\r\n tabRefs.current.delete(tab.id);\r\n }\r\n }}\r\n type=\"button\"\r\n role=\"tab\"\r\n id={tabId}\r\n aria-selected={isActive}\r\n aria-controls={showPanels ? panelId : undefined}\r\n tabIndex={isActive ? 0 : -1}\r\n disabled={tab.disabled}\r\n className={cn(\r\n \"eztrak-tabs-button\",\r\n isActive && \"eztrak-tabs-button-active\",\r\n classNames?.button,\r\n isActive && classNames?.buttonActive\r\n )}\r\n onClick={() => handleTabClick(tab.id, tab.disabled)}\r\n >\r\n {tab.icon ? (\r\n <span\r\n className={cn(\"eztrak-tabs-icon\", classNames?.icon)}\r\n aria-hidden\r\n >\r\n {tab.icon}\r\n </span>\r\n ) : null}\r\n <span\r\n className={cn(\"eztrak-tabs-label\", classNames?.label)}\r\n >\r\n {tab.label}\r\n </span>\r\n {isActive ? (\r\n <span\r\n className={cn(\r\n \"eztrak-tabs-underline\",\r\n classNames?.underline\r\n )}\r\n aria-hidden\r\n />\r\n ) : null}\r\n </button>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </nav>\r\n\r\n {showPanels ? (\r\n <div className={cn(\"eztrak-tabs-content\", classNames?.content)}>\r\n {tabs.map((tab) => {\r\n const isActive = displayActive === tab.id;\r\n const panelId = `${baseId}-panel-${tab.id}`;\r\n const tabId = `${baseId}-tab-${tab.id}`;\r\n\r\n if (!keepMounted && !isActive) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n key={tab.id}\r\n id={panelId}\r\n role=\"tabpanel\"\r\n aria-labelledby={tabId}\r\n hidden={!isActive}\r\n className={cn(\"eztrak-tabs-panel\", classNames?.panel)}\r\n >\r\n {tab.content}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : null}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { type ChangeEvent, type ReactNode } from \"react\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { confirmationAlert } from \"../../utils/handleApiError\";\r\nimport type {\r\n CustomPaginationProps,\r\n ResetColumnsButtonProps,\r\n TableLayoutToolbarControlsProps,\r\n} from \"./types\";\r\n\r\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 30, 50, 100];\r\nconst ALL_PAGES_VALUE = -1;\r\n\r\nfunction padCount(num: number) {\r\n return num.toString().padStart(2, \"0\");\r\n}\r\n\r\nfunction RefreshIcon({\r\n size = 14,\r\n className,\r\n}: {\r\n size?: number;\r\n className?: string;\r\n}) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n className={className}\r\n >\r\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\r\n <path d=\"M21 3v5h-5\" />\r\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\r\n <path d=\"M8 16H3v5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ResetColumnsButton({\r\n onReset,\r\n disabled = false,\r\n isLoading = false,\r\n}: ResetColumnsButtonProps) {\r\n const handleClick = () => {\r\n confirmationAlert(onReset, {\r\n text: \"Reset column order, widths, and visibility to defaults?\",\r\n icon: \"warning\",\r\n title: \"Reset column layout to default\",\r\n });\r\n };\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n disabled={disabled || isLoading}\r\n title=\"Reset column layout to default\"\r\n className=\"inline-flex items-center gap-1.5 rounded-xl border border-primary-150 bg-white px-3 py-1.5 text-sm font-medium text-primary-150 hover:bg-gray-50 focus:outline-none disabled:hover:bg-white\"\r\n >\r\n <RefreshIcon size={14} className={cn(isLoading ? \"animate-spin\" : \"\")} />\r\n Reset columns\r\n </button>\r\n );\r\n}\r\n\r\nexport function TableLayoutToolbarControls({\r\n layoutStatus = {},\r\n onResetLayout,\r\n renderResetControl,\r\n isLoading = false,\r\n}: TableLayoutToolbarControlsProps) {\r\n const { isLayoutLoading, isLayoutSaving, isLayoutResetting } = layoutStatus;\r\n const isLayoutBusy = isLayoutLoading || isLayoutSaving || isLayoutResetting;\r\n\r\n return (\r\n <div className=\"flex items-center gap-3\">\r\n {onResetLayout &&\r\n (renderResetControl ? (\r\n renderResetControl(onResetLayout)\r\n ) : (\r\n <ResetColumnsButton\r\n onReset={onResetLayout}\r\n disabled={isLayoutBusy}\r\n isLoading={isLoading}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport function CustomPagination({\r\n paginationData,\r\n paginationPageSize,\r\n pageSizeOptions: pageSizeOptionsProp,\r\n isLoading = false,\r\n paramNames,\r\n onPageChange,\r\n onPageSizeChange,\r\n onResetLayout,\r\n renderResetControl,\r\n layoutStatus,\r\n showAllPagesOption = false,\r\n classNames,\r\n className,\r\n}: CustomPaginationProps) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const pageKey = paramNames?.page ?? \"page\";\r\n const perPageKey = paramNames?.perPage ?? \"perPage\";\r\n const pageSizeOptions =\r\n pageSizeOptionsProp ?? paginationPageSize ?? DEFAULT_PAGE_SIZE_OPTIONS;\r\n const perPageParam = searchParams.get(perPageKey);\r\n const perPageNumber =\r\n perPageParam !== null && perPageParam !== \"\"\r\n ? parseInt(perPageParam, 10)\r\n : NaN;\r\n const isShowingAll = perPageNumber === ALL_PAGES_VALUE;\r\n\r\n const currentPage = paginationData\r\n ? Math.max(0, paginationData.currentPage - 1)\r\n : 0;\r\n\r\n const handlePageChange = (pageNumber: number) => {\r\n if (\r\n !paginationData ||\r\n pageNumber < 0 ||\r\n pageNumber >= paginationData.pageCount\r\n ) {\r\n return;\r\n }\r\n\r\n const safePage = Math.max(\r\n 1,\r\n Math.min(pageNumber + 1, paginationData.pageCount)\r\n );\r\n const newParams = new URLSearchParams(searchParams);\r\n newParams.set(pageKey, String(safePage));\r\n setSearchParams(newParams, { replace: true });\r\n onPageChange?.(safePage);\r\n };\r\n\r\n const handlePageSizeChange = (event: ChangeEvent<HTMLSelectElement>) => {\r\n const parsed = parseInt(event.target.value, 10);\r\n if (\r\n !Number.isFinite(parsed) ||\r\n (parsed < 1 && parsed !== ALL_PAGES_VALUE)\r\n ) {\r\n return;\r\n }\r\n\r\n const newParams = new URLSearchParams(searchParams);\r\n newParams.set(pageKey, \"1\");\r\n newParams.set(perPageKey, String(parsed));\r\n setSearchParams(newParams, { replace: true });\r\n onPageSizeChange?.(parsed);\r\n };\r\n\r\n const createPageButtons = () => {\r\n const buttons: ReactNode[] = [];\r\n const maxButtons = 5;\r\n const totalPages = Math.max(1, paginationData?.pageCount ?? 1);\r\n\r\n let startPage = Math.max(0, currentPage - Math.floor(maxButtons / 2));\r\n let endPage = Math.min(totalPages - 1, startPage + maxButtons - 1);\r\n\r\n if (endPage - startPage + 1 < maxButtons) {\r\n startPage = Math.max(0, endPage - maxButtons + 1);\r\n }\r\n\r\n if (startPage > 0) {\r\n buttons.push(\r\n <button\r\n key=\"1\"\r\n type=\"button\"\r\n onClick={() => handlePageChange(0)}\r\n aria-label=\"Page 1\"\r\n className={cn(\r\n \"px-3 py-2 text-sm text-gray-600 hover:text-blue-600 hover:bg-blue-50 rounded-md transition-colors\",\r\n classNames?.pageButton\r\n )}\r\n >\r\n 1\r\n </button>\r\n );\r\n\r\n if (startPage > 1) {\r\n buttons.push(\r\n <span\r\n key=\"ellipsis1\"\r\n aria-hidden=\"true\"\r\n className=\"px-2 py-2 text-gray-400\"\r\n >\r\n ...\r\n </span>\r\n );\r\n }\r\n }\r\n\r\n for (let i = startPage; i <= endPage; i++) {\r\n const isActive = currentPage === i;\r\n buttons.push(\r\n <button\r\n key={i + 1}\r\n type=\"button\"\r\n onClick={() => handlePageChange(i)}\r\n aria-label={`Page ${i + 1}`}\r\n aria-current={isActive ? \"page\" : undefined}\r\n className={cn(\r\n \"px-3 py-2 text-sm rounded-md transition-colors\",\r\n isActive\r\n ? cn(\"bg-gray-400 text-white\", classNames?.activePageButton)\r\n : cn(\r\n \"text-gray-600 hover:text-gray-600 hover:bg-gray-50\",\r\n classNames?.pageButton\r\n )\r\n )}\r\n >\r\n {i + 1}\r\n </button>\r\n );\r\n }\r\n\r\n if (endPage < totalPages - 1) {\r\n if (endPage < totalPages - 2) {\r\n buttons.push(\r\n <span\r\n key=\"ellipsis2\"\r\n aria-hidden=\"true\"\r\n className=\"px-2 py-2 text-gray-400\"\r\n >\r\n ...\r\n </span>\r\n );\r\n }\r\n\r\n buttons.push(\r\n <button\r\n key={totalPages}\r\n type=\"button\"\r\n onClick={() => handlePageChange(totalPages - 1)}\r\n aria-label={`Page ${totalPages}`}\r\n className={cn(\r\n \"px-3 py-2 text-sm text-gray-600 hover:text-gray-600 hover:bg-gray-50 rounded-md transition-colors\",\r\n classNames?.pageButton\r\n )}\r\n >\r\n {totalPages}\r\n </button>\r\n );\r\n }\r\n\r\n return buttons;\r\n };\r\n\r\n if (isLoading || !paginationData) {\r\n return (\r\n <div className=\"flex items-center justify-center p-6 bg-gray-50\">\r\n <span className=\"text-gray-500\">\r\n {isLoading ? \"Loading...\" : \"No pagination data\"}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n const effectiveSizeOptions =\r\n paginationData.perPage > 0 &&\r\n !pageSizeOptions.includes(paginationData.perPage)\r\n ? [...pageSizeOptions, paginationData.perPage].sort((a, b) => a - b)\r\n : pageSizeOptions;\r\n\r\n const selectValue = isShowingAll\r\n ? ALL_PAGES_VALUE\r\n : paginationData.perPage ||\r\n (Number.isFinite(perPageNumber) && perPageNumber > 0\r\n ? perPageNumber\r\n : 10);\r\n\r\n const startItem =\r\n paginationData.totalCount === 0\r\n ? 0\r\n : (paginationData.currentPage - 1) * paginationData.perPage + 1;\r\n const endItem = Math.min(\r\n startItem + paginationData.perPage - 1,\r\n paginationData.totalCount\r\n );\r\n\r\n const { isLayoutLoading, isLayoutSaving, isLayoutResetting } =\r\n layoutStatus ?? {};\r\n const isLayoutBusy =\r\n isLayoutLoading || isLayoutSaving || isLayoutResetting;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center justify-between pb-4\",\r\n className,\r\n classNames?.root\r\n )}\r\n >\r\n <div className={cn(\"flex-1\", classNames?.info)}>\r\n <span className=\"text-xs font-medium text-neutral-400\">\r\n {isShowingAll\r\n ? `Showing All ${paginationData.totalCount ?? 0} Results`\r\n : `Showing ${padCount(startItem)} - ${padCount(endItem)} of ${paginationData.totalCount ?? 0} results`}\r\n </span>\r\n </div>\r\n\r\n <nav\r\n aria-label=\"Pagination\"\r\n className={cn(\"flex items-center space-x-1\", classNames?.nav)}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => handlePageChange(currentPage - 1)}\r\n disabled={currentPage === 0 || isShowingAll}\r\n className=\"p-2 text-gray-400 hover:text-gray-600 disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\r\n aria-label=\"Previous page\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M10.7 2.3a1 1 0 0 1 0 1.4L6.4 8l4.3 4.3a1 1 0 1 1-1.4 1.4l-5-5a1 1 0 0 1 0-1.4l5-5a1 1 0 0 1 1.4 0z\" />\r\n </svg>\r\n </button>\r\n\r\n <div className=\"flex items-center space-x-1\">\r\n {isShowingAll ? (\r\n <span className=\"px-3 py-2 text-sm text-gray-400\" aria-hidden=\"true\">\r\n All\r\n </span>\r\n ) : (\r\n createPageButtons()\r\n )}\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => handlePageChange(currentPage + 1)}\r\n disabled={\r\n currentPage >= paginationData.pageCount - 1 || isShowingAll\r\n }\r\n className=\"p-2 text-gray-400 hover:text-gray-600 disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\r\n aria-label=\"Next page\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M5.3 13.7a1 1 0 0 1 0-1.4L9.6 8 5.3 3.7a1 1 0 0 1 1.4-1.4l5 5a1 1 0 0 1 0 1.4l-5 5a1 1 0 0 1-1.4 0z\" />\r\n </svg>\r\n </button>\r\n </nav>\r\n\r\n <div className=\"flex-1 flex justify-end\">\r\n <div className=\"flex items-center gap-3\">\r\n {onResetLayout &&\r\n (renderResetControl ? (\r\n renderResetControl(onResetLayout)\r\n ) : (\r\n <ResetColumnsButton\r\n onReset={onResetLayout}\r\n disabled={isLayoutBusy}\r\n isLoading={isLoading}\r\n />\r\n ))}\r\n <div className=\"flex items-center space-x-2\">\r\n <label\r\n htmlFor=\"pagination-per-page\"\r\n className=\"text-sm text-gray-600\"\r\n >\r\n Items per page\r\n </label>\r\n <select\r\n id=\"pagination-per-page\"\r\n value={selectValue}\r\n onChange={handlePageSizeChange}\r\n className={cn(\r\n \"px-3 py-1.5 text-sm border border-gray-300 rounded-md bg-white text-gray-700 hover:border-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors\",\r\n classNames?.select\r\n )}\r\n >\r\n {showAllPagesOption && (\r\n <option value={ALL_PAGES_VALUE}>All</option>\r\n )}\r\n {effectiveSizeOptions.map((option) => (\r\n <option key={option} value={option}>\r\n {option}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default CustomPagination;\r\n","import { useEffect, useRef } from \"react\";\r\nimport Select from \"react-select\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { dropdownStyles } from \"./dropdownStyles\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { resetPageParam } from \"../../utils/resetPageParam\";\r\nimport {\r\n getItemFromLocalStorage,\r\n removeItem,\r\n storeItemInLocalStorage,\r\n} from \"../../utils/localStorage\";\r\nimport type { DropdownFilterProps } from \"./types\";\r\n\r\nexport function DropdownFilter<Option extends Record<string, unknown>>({\r\n name,\r\n valueKey = \"id\",\r\n options,\r\n placeholder,\r\n borderRadius = \"12px\",\r\n className,\r\n isClearable = true,\r\n isSearchable = true,\r\n isDisabled = false,\r\n isLoading = false,\r\n saveToLocalStorage = false,\r\n pageParam = \"page\",\r\n ...otherProps\r\n}: DropdownFilterProps<Option>) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const hasRestoredFromStorage = useRef(false);\r\n\r\n useEffect(() => {\r\n if (!saveToLocalStorage || hasRestoredFromStorage.current) return;\r\n hasRestoredFromStorage.current = true;\r\n\r\n if (searchParams.get(name)) return;\r\n\r\n const stored = getItemFromLocalStorage<string>(name);\r\n if (stored != null && stored !== \"\") {\r\n setSearchParams((prev) => {\r\n prev.set(name, String(stored));\r\n // Restoring a stored filter narrows the result set too, so a deep-linked\r\n // page number would land out of range.\r\n return resetPageParam(prev, pageParam);\r\n });\r\n }\r\n }, [saveToLocalStorage, name, pageParam, searchParams, setSearchParams]);\r\n\r\n const currentValue = searchParams.get(name);\r\n const selectedOption = currentValue\r\n ? options?.find(\r\n (option) => option[valueKey]?.toString() === currentValue,\r\n ) ?? null\r\n : null;\r\n\r\n const handleChange = (selected: Option | null) => {\r\n const selectedValue =\r\n selected && selected[valueKey] !== \"\" ? String(selected[valueKey]) : null;\r\n\r\n setSearchParams((prev) => {\r\n // Re-selecting the current option leaves the result set alone, so keep the\r\n // page the user is on.\r\n if ((prev.get(name) ?? \"\") === (selectedValue ?? \"\")) {\r\n return prev;\r\n }\r\n\r\n if (!selectedValue) {\r\n prev.delete(name);\r\n } else {\r\n prev.set(name, selectedValue);\r\n }\r\n\r\n return resetPageParam(prev, pageParam);\r\n });\r\n\r\n if (saveToLocalStorage) {\r\n if (selectedValue) {\r\n storeItemInLocalStorage(name, selectedValue);\r\n } else {\r\n removeItem(name);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn(className)}>\r\n <Select<Option, false>\r\n placeholder={placeholder ?? `Select ${name}`}\r\n value={selectedOption}\r\n onChange={handleChange}\r\n options={options}\r\n isClearable={isClearable}\r\n isSearchable={isSearchable}\r\n isDisabled={isDisabled}\r\n isLoading={isLoading}\r\n getOptionValue={(option) => String(option[valueKey] ?? \"\")}\r\n getOptionLabel={(option) =>\r\n String(option.label ?? option.name ?? option[valueKey] ?? \"\")\r\n }\r\n styles={dropdownStyles<Option>(borderRadius)}\r\n {...otherProps}\r\n />\r\n </div>\r\n );\r\n}\r\n","import type { StylesConfig } from \"react-select\";\r\n\r\nconst themeColors = {\r\n primary: \"#FF7335\",\r\n primaryHover: \"#E65C2E\",\r\n lightBackground: \"#FFF3EB\",\r\n textColor: \"black\",\r\n white: \"white\",\r\n};\r\n\r\nexport\r\n const dropdownStyles = <Option,>(\r\n _borderRadius: string\r\n): StylesConfig<Option, false> => ({\r\n control: (provided, state) => ({\r\n ...provided,\r\n fontSize: \"14px\",\r\n padding: \"4px 8px\",\r\n minWidth: \"180px\",\r\n borderRadius: _borderRadius,\r\n cursor: \"pointer\",\r\n borderColor: state.isFocused ? themeColors.primary : \"#e0e0e0\",\r\n boxShadow: state.isFocused\r\n ? \"0 0 0 2px rgba(255, 115, 53, 0.3)\"\r\n : \"none\",\r\n \"&:hover\": {\r\n borderColor: themeColors.primary,\r\n },\r\n transition: \"border-color 0.2s, box-shadow 0.2s\",\r\n zIndex: 50,\r\n }),\r\n option: (provided, state) => ({\r\n ...provided,\r\n fontSize: \"14px\",\r\n backgroundColor: state.isSelected\r\n ? themeColors.primary\r\n : state.isFocused\r\n ? themeColors.lightBackground\r\n : themeColors.white,\r\n borderRadius: \"5px\",\r\n cursor: \"pointer\",\r\n borderColor: state.isFocused ? themeColors.primary : \"#e0e0e0\",\r\n color: state.isSelected\r\n ? themeColors.white\r\n : state.isFocused\r\n ? themeColors.primary\r\n : themeColors.textColor,\r\n \"&:hover\": {\r\n backgroundColor: themeColors.lightBackground,\r\n color: themeColors.primary,\r\n },\r\n \"&:active\": {\r\n backgroundColor: themeColors.primary,\r\n color: themeColors.white,\r\n },\r\n transition: \"background-color 0.2s, color 0.2s\",\r\n zIndex: 50,\r\n }),\r\n singleValue: (provided) => ({\r\n ...provided,\r\n color: themeColors.textColor,\r\n zIndex: 50,\r\n }),\r\n menu: (provided) => ({\r\n ...provided,\r\n borderRadius: \"5px\",\r\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\r\n marginTop: \"4px\",\r\n zIndex: 50,\r\n }),\r\n dropdownIndicator: (provided) => ({\r\n ...provided,\r\n color: themeColors.primary,\r\n \"&:hover\": {\r\n color: themeColors.primaryHover,\r\n },\r\n zIndex: 50,\r\n }),\r\n indicatorSeparator: () => ({\r\n display: \"none\",\r\n }),\r\n});\r\n","import { useSearchParams } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type {\r\n ResetFiltersButtonProps,\r\n ResetFiltersButtonVariant,\r\n} from \"./types\";\r\n\r\nconst BASE_STYLES =\r\n \"inline-flex items-center gap-1.5 px-5 py-3 rounded-md text-sm font-medium transition-colors duration-200 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50\";\r\n\r\nconst VARIANTS: Record<ResetFiltersButtonVariant, string> = {\r\n primary:\r\n \"bg-white text-secondary border border-secondary hover:bg-lightGray hover:text-black\",\r\n \"primary-outline\":\r\n \"bg-white text-primary-150 border border-primary-150 font-bold hover:bg-primary-100 hover:text-white\",\r\n \"primary-fill\":\r\n \"bg-primary-150 text-white border border-primary-150 hover:bg-primary/90\",\r\n secondary:\r\n \"bg-primary-150 text-white border border-primary-150 hover:bg-primary/90\",\r\n danger: \"bg-red-600 text-white border border-red-600 hover:bg-red-700\",\r\n outline: \"bg-white text-primary border border-primary hover:bg-primary/10\",\r\n ghost:\r\n \"bg-transparent text-secondary border border-transparent hover:bg-primary/10\",\r\n};\r\n\r\nfunction ResetIcon({\r\n size = 16,\r\n className,\r\n}: {\r\n size?: number;\r\n className?: string;\r\n}) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n className={className}\r\n >\r\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\r\n <path d=\"M21 3v5h-5\" />\r\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\r\n <path d=\"M8 16H3v5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ResetFiltersButton({\r\n label = \"Reset Filters\",\r\n showLabel = true,\r\n icon,\r\n variant = \"primary-outline\",\r\n className,\r\n onReset,\r\n disabled = false,\r\n}: ResetFiltersButtonProps) {\r\n const [, setSearchParams] = useSearchParams();\r\n\r\n const handleReset = () => {\r\n setSearchParams({}, { replace: true });\r\n onReset?.();\r\n };\r\n\r\n const resolvedIcon = icon === undefined ? <ResetIcon size={16} /> : icon;\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={handleReset}\r\n disabled={disabled}\r\n className={cn(BASE_STYLES, VARIANTS[variant], className)}\r\n >\r\n {resolvedIcon}\r\n {showLabel && label}\r\n </button>\r\n );\r\n}\r\n","import {\r\n useEffect,\r\n useRef,\r\n useState,\r\n type ChangeEvent,\r\n type FormEvent,\r\n} from \"react\";\r\nimport { FiSearch } from \"react-icons/fi\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { resetPageParam } from \"../../utils/resetPageParam\";\r\nimport type { SearchInputProps } from \"./types\";\r\n\r\nexport function SearchInput({\r\n placeholder = \"Search...\",\r\n searchBtn = \"\",\r\n searchClassName = \"\",\r\n searchWrapperClass = \"\",\r\n searchIconClassName = \"\",\r\n defaultParam = \"query\",\r\n showIcon = true,\r\n name = \"search\",\r\n type = \"search\",\r\n liveSearch = false,\r\n debounceDelay = 500,\r\n customIcon = null,\r\n defaultValue,\r\n pageParam = \"page\",\r\n ...props\r\n}: SearchInputProps) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const queryParam = searchParams.get(defaultParam) || defaultValue || \"\";\r\n\r\n const [inputValue, setInputValue] = useState(queryParam);\r\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n const updateSearchParams = (searchQuery: string) => {\r\n const nextValue = searchQuery?.trim() ?? \"\";\r\n\r\n setSearchParams((prev) => {\r\n // Same query as the URL already holds: the result set is unchanged, so\r\n // leave the current page alone.\r\n if ((prev.get(defaultParam) ?? \"\") === nextValue) {\r\n return prev;\r\n }\r\n\r\n if (nextValue) {\r\n prev.set(defaultParam, nextValue);\r\n } else {\r\n prev.delete(defaultParam);\r\n }\r\n\r\n return resetPageParam(prev, pageParam);\r\n });\r\n };\r\n\r\n const handleSearch = (e: FormEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n const formData = new FormData(e.currentTarget);\r\n const searchQuery = formData.get(name);\r\n updateSearchParams(String(searchQuery ?? \"\"));\r\n };\r\n\r\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n setInputValue(value);\r\n\r\n if (liveSearch) {\r\n if (debounceTimerRef.current) {\r\n clearTimeout(debounceTimerRef.current);\r\n }\r\n\r\n debounceTimerRef.current = setTimeout(() => {\r\n updateSearchParams(value);\r\n }, debounceDelay);\r\n }\r\n\r\n if (value === \"\") {\r\n if (debounceTimerRef.current) {\r\n clearTimeout(debounceTimerRef.current);\r\n }\r\n setInputValue(\"\");\r\n updateSearchParams(\"\");\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n setInputValue(queryParam);\r\n }, [queryParam]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimerRef.current) {\r\n clearTimeout(debounceTimerRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n return (\r\n <form\r\n onSubmit={handleSearch}\r\n className={cn(\r\n \"flex items-center justify-between bg-white rounded-xl px-2 h-11 border\",\r\n searchWrapperClass,\r\n )}\r\n >\r\n {showIcon && (\r\n <button\r\n type=\"submit\"\r\n className={cn(\r\n \"bg-white text-secondary rounded-full flex items-center justify-center w-10 h-10\",\r\n searchBtn,\r\n )}\r\n >\r\n {customIcon ? (\r\n customIcon\r\n ) : (\r\n <FiSearch\r\n className={cn(\"h-5 w-5 text-gray-400\", searchIconClassName)}\r\n />\r\n )}\r\n </button>\r\n )}\r\n <input\r\n value={inputValue}\r\n onChange={handleInputChange}\r\n name={name}\r\n type={type}\r\n className={cn(\"outline-none text-sm w-96\", searchClassName)}\r\n placeholder={placeholder}\r\n {...props}\r\n />\r\n </form>\r\n );\r\n}\r\n","import { AnimatePresence, motion } from \"framer-motion\";\r\nimport { useEffect, useRef, type MouseEvent } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { FaFileExport, FaPrint } from \"react-icons/fa\";\r\nimport { IoCloseCircleOutline } from \"react-icons/io5\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { Loader } from \"../Loader\";\r\nimport type { ModalProps } from \"./types\";\r\n\r\nexport function Modal({\r\n isOpen,\r\n onClose,\r\n title,\r\n children,\r\n modalHeader,\r\n footer,\r\n className = \"w-2/3\",\r\n width,\r\n onPrint,\r\n onExport,\r\n modalBodyClassName,\r\n modalBodyWrapperClass,\r\n closeOnBackdropClick = false,\r\n closeOnEscape = true,\r\n zIndex = 1000,\r\n isLoading = false,\r\n customLoader = null,\r\n footerClassName,\r\n}: ModalProps) {\r\n const modalRef = useRef<HTMLDivElement>(null);\r\n\r\n const handleBackdropClick = (e: MouseEvent<HTMLDivElement>) => {\r\n if (e.target === e.currentTarget && closeOnBackdropClick) {\r\n onClose();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && isOpen && closeOnEscape) {\r\n onClose();\r\n }\r\n };\r\n\r\n if (isOpen) {\r\n document.addEventListener(\"keydown\", handleEscape);\r\n document.body.style.overflow = \"hidden\";\r\n }\r\n\r\n return () => {\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [isOpen, onClose, closeOnEscape]);\r\n\r\n const modalContent = (\r\n <AnimatePresence>\r\n {isOpen && (\r\n <div\r\n className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex justify-center items-center z-1000 p-4\"\r\n onClick={handleBackdropClick}\r\n style={{\r\n // Ensure it covers the entire viewport, even in micro frontend context\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n width: \"100vw\",\r\n height: \"100vh\",\r\n margin: 0,\r\n padding: \"1rem\",\r\n zIndex: zIndex,\r\n }}\r\n >\r\n <motion.div\r\n ref={modalRef}\r\n initial={{ y: \"-100vh\", opacity: 0 }}\r\n animate={{ y: 0, opacity: 1 }}\r\n exit={{ y: \"100vh\", opacity: 0 }}\r\n transition={{ duration: 0.3 }}\r\n className={cn(\r\n `bg-white rounded-3xl shadow-lg max-h-[90vh] flex flex-col mx-auto`,\r\n className,\r\n width,\r\n )}\r\n onClick={(e) => e.stopPropagation()} // Prevent backdrop click when clicking modal content\r\n style={{\r\n maxWidth: \"95vw\", // Ensure modal doesn't exceed viewport width\r\n maxHeight: \"90vh\", // Ensure modal doesn't exceed viewport height\r\n }}\r\n >\r\n {/* Modal Header */}\r\n {modalHeader ? \r\n modalHeader \r\n : (\r\n <div\r\n style={{\r\n borderRadius: \"24px 24px 0 0\",\r\n }}\r\n className=\"sticky top-0 z-10 flex justify-between items-center bg-white text-2xl p-8 pb-4 rounded-t-3xl\"\r\n >\r\n <h2 className=\"font-semibold\">{title}</h2>\r\n <div className=\"flex items-center space-x-4\">\r\n {onPrint && (\r\n <button\r\n onClick={onPrint}\r\n className=\"flex items-center gap-1 hover:text-gray-300 text-sm border p-1 rounded\"\r\n >\r\n <FaPrint name=\"FaPrint\" />\r\n <span>Print</span>\r\n </button>\r\n )}\r\n {onExport && (\r\n <button\r\n onClick={onExport}\r\n className=\"flex items-center gap-1 hover:text-gray-300 text-sm border p-1 rounded\"\r\n >\r\n <FaFileExport />\r\n <span>Export</span>\r\n </button>\r\n )}\r\n <button\r\n onClick={onClose}\r\n className=\"px-2 hover:opacity-70 transition-opacity\"\r\n >\r\n <IoCloseCircleOutline color=\"#8898AA\" size={25} />\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n <div\r\n className={cn(\r\n \"overflow-y-auto px-8 pb-8 grow scroll scrollbar-hidden\",\r\n modalBodyWrapperClass,\r\n )}\r\n >\r\n {children}\r\n </div>\r\n\r\n {/* Modal Footer */}\r\n {footer && (\r\n <div\r\n className={cn(\r\n \"sticky bottom-0 flex justify-end p-4 space-x-4 border-t bg-white \",\r\n footerClassName,\r\n )}\r\n style={{\r\n zIndex: 1000,\r\n\r\n borderRadius: \"24px\",\r\n }}\r\n >\r\n {footer}\r\n </div>\r\n )}\r\n </motion.div>\r\n {isLoading && (\r\n <div\r\n className=\"fixed inset-0 flex items-center justify-center bg-gray-200/60\"\r\n style={{ zIndex: 1100 }}\r\n aria-busy=\"true\"\r\n aria-live=\"polite\"\r\n role=\"status\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {customLoader ? customLoader : <Loader size=\"48px\" />}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </AnimatePresence>\r\n );\r\n\r\n let modalRoot = document.getElementById(\"modal-root\");\r\n if (!modalRoot) {\r\n modalRoot = document.createElement(\"div\");\r\n modalRoot.id = \"modal-root\";\r\n document.body.appendChild(modalRoot);\r\n }\r\n\r\n return createPortal(modalContent, modalRoot);\r\n}\r\n","import \"@eztrak/shared/components/loader.css\";","import React from 'react';\r\nimport './Loader.css';\r\nimport { LoaderProps } from './Loader.types';\r\n\r\nexport const Loader: React.FC<LoaderProps> = ({ className, color = \"#F54C00\", size = '50px', speed = '1s' }) => {\r\n return (\r\n <div className={`loader`}>\r\n <div \r\n className={`spinner ${className}`} \r\n style={{\r\n border: `4px solid rgba(0, 0, 0, 0.1)`,\r\n borderWidth: '4px',\r\n borderLeftColor: color,\r\n width: size,\r\n height: size,\r\n animation: `spin ${speed} linear infinite`\r\n }}\r\n ></div>\r\n </div>\r\n );\r\n};\r\n","import { forwardRef } from \"react\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { ButtonProps } from \"./types\";\r\n\r\nconst BASE_STYLES =\r\n \"flex gap-1 items-center font-medium text-sm px-5 py-3 rounded-md transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed\";\r\n\r\nconst VARIANTS: Record<string, string> = {\r\n primary:\r\n \"bg-white text-secondary border-secondary hover:bg-lightGray hover:text-black\",\r\n \"primary-outline\":\r\n \"bg-white text-primary-150 border-primary-150 hover:bg-primary-100 hover:text-white font-bold\",\r\n \"primary-fill\": \"bg-primary-150 text-white border-primary hover:bg-primary/90\",\r\n secondary: \"bg-primary-150 text-white border-primary hover:bg-primary/90\",\r\n danger: \"bg-red-600 text-white border-red-600 hover:bg-red-700\",\r\n outline: \"bg-white text-primary border-primary hover:bg-primary/10\",\r\n ghost:\r\n \"bg-transparent text-secondary border-transparent hover:bg-primary/10 p-2\",\r\n inline:\r\n \"bg-transparent text-gray-500 border-none hover:text-gray-600 underline shadow-none p-0 m-0\",\r\n};\r\n\r\nconst SIZES: Record<string, string> = {\r\n sm: \"px-3 py-2 text-xs\",\r\n md: \"px-5 py-3 text-sm\",\r\n lg: \"px-6 py-4 text-base\",\r\n};\r\n\r\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\r\n (\r\n {\r\n children,\r\n className = \"\",\r\n type = \"button\",\r\n onClick,\r\n disabled = false,\r\n variant = \"primary\",\r\n size = \"md\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const variantStyles = VARIANTS[variant] || VARIANTS.primary;\r\n const sizeStyles = SIZES[size];\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n type={type}\r\n className={cn(\r\n BASE_STYLES,\r\n variantStyles,\r\n size !== \"md\" && sizeStyles,\r\n className\r\n )}\r\n onClick={onClick}\r\n disabled={disabled}\r\n {...props}\r\n >\r\n {children}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nButton.displayName = \"Button\";\r\n","import { cn } from \"../../utils/cn\";\r\nimport type { CardProps } from \"./types\";\r\n\r\nexport function Card({\r\n title,\r\n content,\r\n icon,\r\n onClick,\r\n containerClassName = \"shadow p-6\",\r\n iconClassName = \"\",\r\n titleClassName = \"\",\r\n contentClassName = \"\",\r\n cardBodyClassName = \"\",\r\n}: CardProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"transform transition duration-300 cursor-pointer select-none\",\r\n containerClassName\r\n )}\r\n onClick={onClick}\r\n >\r\n <div className={cn(\"flex space-x-4\", cardBodyClassName)}>\r\n <span className={cn(\"text-primary text-3xl\", iconClassName)}>{icon}</span>\r\n <div>\r\n <h3 className={cn(\"font-semibold text-lg text-primary\", titleClassName)}>\r\n {title}\r\n </h3>\r\n {content != null && (\r\n <p className={cn(\"text-sm text-secondary\", contentClassName)}>{content}</p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { HeaderProps } from \"./types\";\r\n\r\nexport function Header({\r\n title = \"Header\",\r\n className = \"p-2 gap-2 flex-col\",\r\n containerClass = \"\",\r\n breadcrumbs = \"\",\r\n titleStyle = \"text-4xl h-fit font-bold\",\r\n breadcrumbsStyle = \"text-sm\",\r\n children,\r\n}: HeaderProps) {\r\n return (\r\n <div className={`flex ${className}`}>\r\n <div className=\"title-wrapper\">\r\n <h1 className={titleStyle}>{title}</h1>\r\n {breadcrumbs && (\r\n <div className={`breadcrumbs-wraper ${breadcrumbsStyle}`}>{breadcrumbs}</div>\r\n )}\r\n </div>\r\n <div className={`flex flex-row justify-between items-center ${containerClass}`}>\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import {\r\n cloneElement,\r\n isValidElement,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { Link, useLocation } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { BreadcrumbRoute, BreadcrumbsProps } from \"./types\";\r\n\r\nconst DEFAULT_BACKGROUND = \"#F7F7F5\";\r\nconst DEFAULT_INACTIVE = \"#6B7280\";\r\nconst DEFAULT_ACTIVE = \"#111111\";\r\nconst DEFAULT_SEPARATOR = \"#9CA3AF\";\r\n\r\nconst CRUMB_LAYOUT =\r\n \"inline-flex items-center gap-1.5 whitespace-nowrap leading-5 rounded-sm\";\r\n\r\nconst LINK_INTERACTION =\r\n \"font-normal transition-colors duration-200 motion-reduce:transition-none hover:!text-[color-mix(in_srgb,var(--bc-inactive)_65%,#111111)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#111111]\";\r\n\r\ntype BreadcrumbNavStyle = CSSProperties & {\r\n \"--bc-inactive\": string;\r\n};\r\n\r\nfunction BreadcrumbChevron() {\r\n return (\r\n <svg\r\n width=\"12\"\r\n height=\"12\"\r\n viewBox=\"0 0 12 12\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n className=\"shrink-0\"\r\n >\r\n <path\r\n d=\"M4.5 2.5L8 6L4.5 9.5\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction asTitleMap(\r\n customTitles: BreadcrumbsProps[\"customTitles\"]\r\n): Record<string, string> {\r\n if (Object.prototype.toString.call(customTitles) !== \"[object Object]\") {\r\n return {};\r\n }\r\n return customTitles as Record<string, string>;\r\n}\r\n\r\nfunction findRoute(\r\n pathname: string,\r\n routes: BreadcrumbRoute[],\r\n parentPath = \"\"\r\n): BreadcrumbRoute | null {\r\n for (const route of routes) {\r\n const fullPath = `${parentPath}/${route.path}`.replace(/\\/+/g, \"/\");\r\n if (fullPath === pathname) {\r\n return route;\r\n }\r\n if (route.children) {\r\n const childRoute = findRoute(pathname, route.children, fullPath);\r\n if (childRoute) {\r\n return childRoute;\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction getLastParam(str: string) {\r\n return str.endsWith(\"/\")\r\n ? str.slice(0, -1).split(\"/\").pop()\r\n : str.split(\"/\").pop();\r\n}\r\n\r\ntype Crumb = {\r\n key: string;\r\n to: string;\r\n title: string;\r\n icon: ReactNode | null;\r\n isCurrent: boolean;\r\n isLink: boolean;\r\n};\r\n\r\nexport function Breadcrumbs({\r\n routes = [],\r\n containerClassName,\r\n linkClassName = \"\",\r\n separatorClassName = \"\",\r\n separator,\r\n activeClassName = \"font-semibold\",\r\n customTitles = {},\r\n customIcons = {},\r\n prefix,\r\n suffix,\r\n nonClickablePaths = [],\r\n backgroundColor = DEFAULT_BACKGROUND,\r\n inactiveColor = DEFAULT_INACTIVE,\r\n activeColor = DEFAULT_ACTIVE,\r\n separatorColor = DEFAULT_SEPARATOR,\r\n iconColor,\r\n iconClassName,\r\n showHome = false,\r\n}: BreadcrumbsProps) {\r\n const location = useLocation();\r\n const pathnames = location.pathname.split(\"/\").filter((segment) => segment);\r\n const titles = asTitleMap(customTitles);\r\n\r\n const getTitle = (pathname: string) => {\r\n const match = findRoute(pathname, routes);\r\n if (match && match.title) {\r\n return match.title;\r\n }\r\n\r\n const lastParamPath = getLastParam(pathname);\r\n if (lastParamPath && titles[lastParamPath]) {\r\n return titles[lastParamPath];\r\n }\r\n\r\n if (lastParamPath) {\r\n return lastParamPath;\r\n }\r\n\r\n return pathname;\r\n };\r\n\r\n const getIcon = (pathname: string) => {\r\n const segment = getLastParam(pathname);\r\n if (segment && customIcons[segment]) {\r\n return customIcons[segment];\r\n }\r\n return null;\r\n };\r\n\r\n const crumbs: Crumb[] = [];\r\n\r\n if (showHome) {\r\n crumbs.push({\r\n key: \"home\",\r\n to: \"/\",\r\n title: titles.home || \"Home\",\r\n icon: customIcons.home ?? null,\r\n isCurrent: pathnames.length === 0,\r\n isLink: pathnames.length > 0,\r\n });\r\n }\r\n\r\n pathnames.forEach((segment, index) => {\r\n const to = `/${pathnames.slice(0, index + 1).join(\"/\")}`;\r\n const isCurrent = index === pathnames.length - 1;\r\n const isNonClickable = nonClickablePaths.some(\r\n (token) => to.includes(token) || segment === token\r\n );\r\n\r\n crumbs.push({\r\n key: to,\r\n to,\r\n title: getTitle(to),\r\n icon: getIcon(to),\r\n isCurrent,\r\n isLink: !isCurrent && !isNonClickable,\r\n });\r\n });\r\n\r\n const navStyle: BreadcrumbNavStyle = {\r\n backgroundColor,\r\n \"--bc-inactive\": inactiveColor,\r\n };\r\n\r\n const inactiveClassName = cn(CRUMB_LAYOUT, LINK_INTERACTION, linkClassName);\r\n const staticInactiveClassName = cn(CRUMB_LAYOUT, \"font-normal\", linkClassName);\r\n const currentClassName = cn(CRUMB_LAYOUT, activeClassName);\r\n\r\n const renderCrumb = (crumb: Crumb) => {\r\n const content = (\r\n <>\r\n {crumb.icon ? (\r\n <span\r\n className={cn(\"inline-flex shrink-0 items-center\", iconClassName)}\r\n style={iconColor ? { color: iconColor } : undefined}\r\n >\r\n {crumb.icon}\r\n </span>\r\n ) : null}\r\n {crumb.title}\r\n </>\r\n );\r\n\r\n if (crumb.isCurrent) {\r\n return (\r\n <span\r\n className={currentClassName}\r\n style={{ color: activeColor }}\r\n aria-current=\"page\"\r\n >\r\n {content}\r\n </span>\r\n );\r\n }\r\n\r\n if (crumb.isLink) {\r\n return (\r\n <Link\r\n to={crumb.to}\r\n className={inactiveClassName}\r\n style={{ color: inactiveColor }}\r\n >\r\n {content}\r\n </Link>\r\n );\r\n }\r\n\r\n return (\r\n <span className={staticInactiveClassName} style={{ color: inactiveColor }}>\r\n {content}\r\n </span>\r\n );\r\n };\r\n\r\n return (\r\n <nav\r\n aria-label=\"Breadcrumb\"\r\n className={cn(\r\n \"flex w-full flex-row items-center gap-2 overflow-x-auto px-4 py-3 text-sm leading-5\",\r\n containerClassName\r\n )}\r\n style={navStyle}\r\n >\r\n {prefix ? <div className=\"breadcrumb-prefix\">{prefix}</div> : null}\r\n <ol className=\"flex min-w-0 flex-row flex-nowrap items-center gap-2\">\r\n {crumbs.map((crumb, index) => (\r\n <li key={crumb.key} className=\"inline-flex items-center gap-2\">\r\n {index > 0 ? (\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(\r\n \"inline-flex shrink-0 items-center\",\r\n separatorClassName\r\n )}\r\n style={{ color: separatorColor }}\r\n >\r\n {separator === undefined ? (\r\n <BreadcrumbChevron />\r\n ) : isValidElement(separator) ? (\r\n cloneElement(separator)\r\n ) : (\r\n separator\r\n )}\r\n </span>\r\n ) : null}\r\n {renderCrumb(crumb)}\r\n </li>\r\n ))}\r\n </ol>\r\n {suffix ? <div className=\"breadcrumb-suffix\">{suffix}</div> : null}\r\n </nav>\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport { Link, useLocation } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { ToolTip } from \"../tooltip/ToolTip\";\r\nimport type { SidebarItem, SidebarProps } from \"./types\";\r\n\r\nfunction getItemTooltip(item: SidebarItem) {\r\n return item.tooltip || item.name;\r\n}\r\n\r\nfunction getTooltipPlacement(item: SidebarItem, collapsed: boolean) {\r\n return item.tooltipPlacement || (collapsed ? \"right\" : \"top\");\r\n}\r\n\r\nfunction isItemActive(pathname: string, link?: string) {\r\n if (!link || link === \"#\") return false;\r\n return pathname === link || pathname.startsWith(`${link}/`);\r\n}\r\n\r\nfunction SidebarItemLabel({\r\n name,\r\n collapsed,\r\n className,\r\n}: {\r\n name: string;\r\n collapsed: boolean;\r\n className?: string;\r\n}) {\r\n return (\r\n <span\r\n className={cn(\r\n className,\r\n collapsed &&\r\n \"block w-full text-center text-[10px] font-medium leading-tight line-clamp-2 wrap-break-word\"\r\n )}\r\n >\r\n {name}\r\n </span>\r\n );\r\n}\r\n\r\nfunction SidebarItemIcon({\r\n icon,\r\n className,\r\n}: {\r\n icon?: SidebarItem[\"icon\"];\r\n className?: string;\r\n}) {\r\n if (!icon) return null;\r\n return (\r\n <span className={cn(\"inline-flex shrink-0\", className)} aria-hidden=\"true\">\r\n {icon}\r\n </span>\r\n );\r\n}\r\n\r\nexport function Sidebar({\r\n className,\r\n sideCollapseWidth = \"w-24\",\r\n sidebarWidth = \"w-48\",\r\n header,\r\n children,\r\n footer,\r\n items = [],\r\n logoUrl = \"\",\r\n logoRouteUrl = \"\",\r\n logoAltText = \"Logo\",\r\n collapseButtonText = \"⬅️ Collapse\",\r\n expandButtonText = \"➡️\",\r\n location: _location,\r\n classNames = {},\r\n onCollapseChange,\r\n isCollapsed = false,\r\n itemDropdownIcon = <span>▼</span>,\r\n ...rest\r\n}: SidebarProps) {\r\n const location = useLocation();\r\n const [collapsed, setCollapsed] = useState<boolean>(isCollapsed);\r\n const [openGroups, setOpenGroups] = useState<Record<string, boolean>>({});\r\n const onCollapseChangeRef = useRef(onCollapseChange);\r\n onCollapseChangeRef.current = onCollapseChange;\r\n\r\n useEffect(() => {\r\n setCollapsed(isCollapsed);\r\n }, [isCollapsed]);\r\n\r\n useEffect(() => {\r\n onCollapseChangeRef.current?.(collapsed);\r\n }, [collapsed]);\r\n\r\n const toggleGroup = (group: string) => {\r\n setOpenGroups((prevState) => ({\r\n ...prevState,\r\n [group]: !prevState[group],\r\n }));\r\n };\r\n\r\n const itemLayoutClass = (active: boolean, itemClassName?: string) =>\r\n cn(\r\n \"flex cursor-pointer\",\r\n classNames?.navItem,\r\n collapsed &&\r\n \"w-full flex-col items-center justify-center gap-0.5 px-1 py-2 my-1 !mx-0 max-w-full min-w-0 box-border text-center min-h-11\",\r\n active && \"active\",\r\n itemClassName\r\n );\r\n\r\n const renderLink = (item: SidebarItem, key: string) => {\r\n const active = isItemActive(location.pathname, item.link);\r\n\r\n return (\r\n <div key={key} className=\"max-w-full min-w-0\" data-sidebar-item={item.name}>\r\n <ToolTip\r\n text={getItemTooltip(item)}\r\n placement={getTooltipPlacement(item, collapsed)}\r\n delayShow={150}\r\n className=\"block max-w-full min-w-0\"\r\n >\r\n <Link\r\n to={item.link || \"#\"}\r\n className={itemLayoutClass(active, item.itemClassName)}\r\n aria-current={active ? \"page\" : undefined}\r\n >\r\n <SidebarItemIcon icon={item.icon} className={classNames?.navItemText} />\r\n <SidebarItemLabel\r\n name={item.name}\r\n collapsed={collapsed}\r\n className={classNames?.navItemText}\r\n />\r\n </Link>\r\n </ToolTip>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex flex-col h-screen overflow-hidden\",\r\n collapsed ? `${sideCollapseWidth} items-stretch collapsed` : sidebarWidth,\r\n \"transition-[width] duration-200 ease-in-out motion-reduce:transition-none\",\r\n className\r\n )}\r\n {...rest}\r\n >\r\n {logoUrl && (\r\n <div\r\n className={cn(\r\n \"flex items-center justify-center h-16 border-b border-gray-300\",\r\n classNames.logoSection\r\n )}\r\n >\r\n {logoRouteUrl ? (\r\n <Link\r\n to={logoRouteUrl}\r\n className=\"sidebar-logo-link inline-flex items-center justify-center\"\r\n >\r\n <img src={logoUrl} alt={logoAltText} className=\"h-10\" />\r\n </Link>\r\n ) : (\r\n <img src={logoUrl} alt={logoAltText} className=\"h-10\" />\r\n )}\r\n </div>\r\n )}\r\n\r\n {header && (\r\n <div className=\"flex items-center justify-between p-4 border-b border-gray-300 shrink-0\">\r\n {header}\r\n </div>\r\n )}\r\n\r\n <nav\r\n aria-label=\"Sidebar\"\r\n className={cn(\r\n \"grow min-h-0 min-w-0 w-full\",\r\n classNames.navSection\r\n )}\r\n >\r\n {items.map((item, index) => {\r\n if (item.subItems) {\r\n const groupOpen = Boolean(openGroups[item.name]);\r\n const groupId = `sidebar-group-${index}`;\r\n\r\n return (\r\n <div\r\n key={index}\r\n data-sidebar-item={item.name}\r\n className={cn(\r\n \"has-sub-items max-w-full min-w-0 flex flex-col\",\r\n collapsed ? \"my-1\" : \"my-2\"\r\n )}\r\n >\r\n <ToolTip\r\n text={getItemTooltip(item)}\r\n placement={getTooltipPlacement(item, collapsed)}\r\n delayShow={150}\r\n className=\"flex flex-col w-full max-w-full min-w-0\"\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => toggleGroup(item.name)}\r\n data-sidebar-item={item.name}\r\n aria-expanded={groupOpen}\r\n aria-controls={groupId}\r\n className={cn(\r\n itemLayoutClass(false, item.itemClassName),\r\n !collapsed && \"dropdown-title-wrapper\",\r\n \"relative appearance-none border-0 bg-transparent [font:inherit]\"\r\n )}\r\n >\r\n <span\r\n className={cn(\r\n \"flex items-center min-w-0\",\r\n collapsed\r\n ? \"flex-col gap-0.5 w-full\"\r\n : \"space-x-2 flex-1\"\r\n )}\r\n >\r\n {collapsed ? (\r\n <span className=\"flex w-full items-center justify-center\">\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span className=\"inline-flex w-3 shrink-0\" aria-hidden=\"true\" />\r\n <SidebarItemIcon\r\n icon={item.icon}\r\n className={classNames?.navItemText}\r\n />\r\n <span\r\n className={cn(\r\n \"sidebar-group-caret inline-flex w-3 shrink-0 items-center justify-center text-current [&>svg]:h-3 [&>svg]:w-3 transition-transform duration-200 motion-reduce:transition-none\",\r\n groupOpen ? \"rotate-180\" : \"rotate-0\"\r\n )}\r\n aria-hidden=\"true\"\r\n >\r\n {itemDropdownIcon}\r\n </span>\r\n </span>\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center space-x-2 min-w-0 flex-1\">\r\n <SidebarItemIcon\r\n icon={item.icon}\r\n className={classNames?.navItemText}\r\n />\r\n <SidebarItemLabel\r\n name={item.name}\r\n collapsed={false}\r\n className={classNames?.navItemText}\r\n />\r\n </span>\r\n )}\r\n {collapsed && (\r\n <SidebarItemLabel\r\n name={item.name}\r\n collapsed\r\n className={classNames?.navItemText}\r\n />\r\n )}\r\n </span>\r\n {!collapsed && (\r\n <span\r\n className={cn(\r\n \"transform transition-transform duration-200 motion-reduce:transition-none\",\r\n groupOpen ? \"rotate-180\" : \"rotate-0\"\r\n )}\r\n aria-hidden=\"true\"\r\n >\r\n {itemDropdownIcon}\r\n </span>\r\n )}\r\n </button>\r\n </ToolTip>\r\n {groupOpen && (\r\n <div\r\n id={groupId}\r\n role=\"group\"\r\n aria-label={item.name}\r\n className={cn(\r\n collapsed\r\n ? \"sidebar-sub-panel flex flex-col items-center max-w-full min-w-0 box-border\"\r\n : \"collapse-btn-wrapper\",\r\n classNames.subItem\r\n )}\r\n >\r\n {item.subItems.map((subItem, subIndex) => {\r\n if (subItem.component) {\r\n const SubItemComponent = subItem.component;\r\n return (\r\n <div\r\n key={`${index}-${subIndex}`}\r\n className={cn(\r\n \"min-w-0 max-w-full\",\r\n collapsed && \"flex flex-col items-center text-center\"\r\n )}\r\n data-sidebar-item={subItem.name}\r\n >\r\n <SubItemComponent />\r\n {collapsed && (\r\n <SidebarItemLabel\r\n name={subItem.name}\r\n collapsed\r\n className={classNames?.navItemText}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return renderLink(subItem, `${index}-${subIndex}`);\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n if (item.component) {\r\n const ItemComponent = item.component;\r\n return <ItemComponent key={index} />;\r\n }\r\n\r\n return renderLink(item, String(index));\r\n })}\r\n </nav>\r\n {children != null && (\r\n <div\r\n className={cn(\r\n \"sidebar-chrome w-full shrink-0\",\r\n collapsed && \"flex flex-col items-center\"\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setCollapsed(!collapsed)}\r\n aria-expanded={!collapsed}\r\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\r\n className={cn(\r\n \"shrink-0 border-t border-gray-300\",\r\n classNames.collapseButton,\r\n collapsed && \"flex items-center justify-center\"\r\n )}\r\n >\r\n {collapsed ? expandButtonText : collapseButtonText}\r\n </button>\r\n\r\n {footer && (\r\n <div className={classNames?.footer ?? \"p-4 border-t border-gray-300\"}>\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useId } from \"react\";\r\nimport { Tooltip } from \"react-tooltip\";\r\nimport type { ToolTipProps } from \"./types\";\r\n\r\nconst defaultTooltipStyle = {\r\n color: \"#fff\",\r\n borderRadius: \"5px\",\r\n zIndex: 999,\r\n textAlign: \"justify\",\r\n maxWidth: \"300px\",\r\n whiteSpace: \"pre-wrap\",\r\n wordWrap: \"break-word\",\r\n overflowWrap: \"break-word\",\r\n} as const;\r\n\r\nexport function ToolTip({\r\n text = \"tool tip\",\r\n placement = \"top\",\r\n delayShow,\r\n delayHide,\r\n className,\r\n tooltipClassName,\r\n tooltipStyle,\r\n wrapperTabIndex,\r\n disabled = false,\r\n children,\r\n}: ToolTipProps) {\r\n const generatedId = useId();\r\n const tooltipId = `eztrak-tooltip-${generatedId.replace(/:/g, \"\")}`;\r\n const tooltipText = String(text ?? \"\");\r\n\r\n if (disabled || !tooltipText) {\r\n return <span className={className}>{children}</span>;\r\n }\r\n\r\n return (\r\n <>\r\n <span\r\n className={className}\r\n data-tooltip-id={tooltipId}\r\n data-tooltip-content={tooltipText}\r\n tabIndex={wrapperTabIndex}\r\n >\r\n {children}\r\n </span>\r\n <Tooltip\r\n id={tooltipId}\r\n place={placement}\r\n positionStrategy=\"fixed\"\r\n delayShow={delayShow}\r\n delayHide={delayHide}\r\n className={tooltipClassName}\r\n style={{ ...defaultTooltipStyle, ...tooltipStyle }}\r\n />\r\n </>\r\n );\r\n}\r\n","import { cn } from \"../../utils/cn\";\r\nimport type { CardSkeletonProps, CardSkeletonVariant } from \"./types\";\r\n\r\nconst DEFAULT_LINE_WIDTHS = [\"w-32\", \"w-48\"];\r\n\r\nfunction shouldShowAvatar(\r\n variant: CardSkeletonVariant,\r\n showAvatar: boolean | undefined\r\n) {\r\n return showAvatar ?? variant === \"profile\";\r\n}\r\n\r\nfunction shouldShowImage(\r\n variant: CardSkeletonVariant,\r\n showImage: boolean | undefined\r\n) {\r\n return showImage ?? variant === \"image\";\r\n}\r\n\r\nfunction AvatarSkeleton({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={cn(\"w-10 h-10 text-gray-200 dark:text-gray-700\", className)}\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"currentColor\"\r\n viewBox=\"0 0 20 20\"\r\n >\r\n <path d=\"M10 0a10 10 0 1 0 10 10A10.011 10.011 0 0 0 10 0Zm0 5a3 3 0 1 1 0 6 3 3 0 0 1 0-6Zm0 13a8.949 8.949 0 0 1-4.951-1.488A3.987 3.987 0 0 1 9 13h2a3.987 3.987 0 0 1 3.951 3.512A8.949 8.949 0 0 1 10 18Z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SkeletonBlock({\r\n widthClass,\r\n className,\r\n isFirst,\r\n}: {\r\n widthClass: string;\r\n className?: string;\r\n isFirst: boolean;\r\n}) {\r\n return (\r\n <div\r\n className={cn(\r\n isFirst ? \"h-2.5 mb-2\" : \"h-2\",\r\n \"bg-gray-200 rounded-full dark:bg-gray-700\",\r\n widthClass,\r\n className\r\n )}\r\n />\r\n );\r\n}\r\n\r\nexport function CardSkeleton({\r\n variant = \"profile\",\r\n count = 1,\r\n lines = 2,\r\n lineWidths = DEFAULT_LINE_WIDTHS,\r\n showAvatar,\r\n showImage,\r\n animationDuration = \"0.7s\",\r\n className,\r\n style,\r\n avatarClassName,\r\n imageClassName,\r\n contentClassName,\r\n lineClassName,\r\n srLabel = \"Loading...\",\r\n ...props\r\n}: CardSkeletonProps) {\r\n const skeletons = Array.from({ length: Math.max(1, count) }, (_, index) => {\r\n const renderAvatar = shouldShowAvatar(variant, showAvatar);\r\n const renderImage = shouldShowImage(variant, showImage);\r\n\r\n return (\r\n <div\r\n key={index}\r\n className={cn(\"animate-pulse md:p-6 dark:border-gray-700\", className)}\r\n style={{ animationDuration, ...style }}\r\n {...props}\r\n >\r\n {renderImage ? (\r\n <div\r\n className={cn(\r\n \"mb-4 h-32 w-full rounded-xl bg-gray-200 dark:bg-gray-700\",\r\n imageClassName\r\n )}\r\n />\r\n ) : null}\r\n <div className={cn(\"flex items-center mt-4 gap-4\", contentClassName)}>\r\n {renderAvatar ? <AvatarSkeleton className={avatarClassName} /> : null}\r\n <div>\r\n {Array.from({ length: Math.max(1, lines) }, (_, lineIndex) => (\r\n <SkeletonBlock\r\n key={lineIndex}\r\n widthClass={\r\n lineWidths[lineIndex] ??\r\n lineWidths[lineWidths.length - 1] ??\r\n DEFAULT_LINE_WIDTHS[1]\r\n }\r\n className={lineClassName}\r\n isFirst={lineIndex === 0}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n <span className=\"sr-only\">{srLabel}</span>\r\n </div>\r\n );\r\n });\r\n\r\n return <>{skeletons}</>;\r\n}\r\n","import { cn } from \"../../utils/cn\";\r\nimport { truncateText } from \"../../utils/helpers\";\r\nimport { ToolTip } from \"./ToolTip\";\r\nimport type { TooltipTextProps } from \"./types\";\r\n\r\nexport function TooltipText({\r\n text = \"\",\r\n maxLength = 20,\r\n fallback = \"-\",\r\n placement = \"top\",\r\n delayShow,\r\n delayHide,\r\n className,\r\n textClassName,\r\n tooltipClassName,\r\n tooltipStyle,\r\n showTooltip = true,\r\n tooltipWhenTruncatedOnly = false,\r\n}: TooltipTextProps) {\r\n const hasValue = text !== null && text !== undefined && text !== \"\";\r\n const fullText = hasValue ? String(text) : fallback;\r\n const displayText = truncateText(fullText, maxLength);\r\n const isTruncated = displayText !== fullText;\r\n const tooltipDisabled =\r\n !showTooltip || !hasValue || (tooltipWhenTruncatedOnly && !isTruncated);\r\n\r\n return (\r\n <ToolTip\r\n text={fullText}\r\n placement={placement}\r\n delayShow={delayShow}\r\n delayHide={delayHide}\r\n className={cn(\"inline-block max-w-full\", className)}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={tooltipStyle}\r\n wrapperTabIndex={tooltipDisabled ? undefined : 0}\r\n disabled={tooltipDisabled}\r\n >\r\n <span className={cn(\"inline-block max-w-full align-bottom\", textClassName)}>\r\n {displayText}\r\n </span>\r\n </ToolTip>\r\n );\r\n}\r\n","import {\r\n forwardRef,\r\n useEffect,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type ChangeEvent,\r\n type KeyboardEvent,\r\n} from \"react\";\r\nimport toast from \"react-hot-toast\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { toDateInputValue } from \"../../utils/helpers\";\r\nimport type { CellEditPayload, CustomCellEditorProps, CustomCellEditorRef, DropdownOption } from \"./types\";\r\n\r\nfunction ButtonSpinner() {\r\n return (\r\n <svg\r\n className=\"animate-spin\"\r\n width={12}\r\n height={12}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"white\"\r\n strokeWidth=\"4\"\r\n strokeOpacity=\"0.25\"\r\n />\r\n <path\r\n d=\"M12 2a10 10 0 0 1 10 10\"\r\n stroke=\"white\"\r\n strokeWidth=\"4\"\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction normalizeInitialValue(\r\n initialValue: CustomCellEditorProps[\"value\"],\r\n inputType: CustomCellEditorProps[\"inputType\"]\r\n): string | number {\r\n if (inputType === \"date\" && initialValue != null && initialValue !== \"\") {\r\n return toDateInputValue(String(initialValue));\r\n }\r\n if (initialValue == null) {\r\n return \"\";\r\n }\r\n return initialValue;\r\n}\r\n\r\nexport const CustomCellEditor = forwardRef<\r\n CustomCellEditorRef,\r\n CustomCellEditorProps\r\n>(\r\n (\r\n {\r\n value: initialValue,\r\n name,\r\n inputType = \"text\",\r\n stopEditing,\r\n entityId,\r\n entityName = \"Record\",\r\n onSave,\r\n dropdownOptions = [],\r\n customOptions,\r\n valueKey = \"value\",\r\n labelKey = \"label\",\r\n containerStyle,\r\n className,\r\n inputClassName,\r\n loadingIndicator,\r\n saveButtonContent,\r\n cancelButtonContent,\r\n saveButtonStyle,\r\n cancelButtonStyle,\r\n saveButtonClassName,\r\n cancelButtonClassName,\r\n },\r\n ref\r\n ) => {\r\n const normalizedInitial = normalizeInitialValue(initialValue, inputType);\r\n const [value, setValue] = useState<string | number>(normalizedInitial);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const selectRef = useRef<HTMLSelectElement>(null);\r\n\r\n // Merge customOptions (arbitrary shape) and dropdownOptions ({value,label}) into one array\r\n const normalizedOptions = useMemo<DropdownOption[]>(() => {\r\n if (customOptions && customOptions.length > 0) {\r\n return customOptions.map((opt) => ({\r\n value: String(opt[valueKey] ?? \"\"),\r\n label: String(opt[labelKey] ?? \"\"),\r\n }));\r\n }\r\n return dropdownOptions;\r\n }, [customOptions, dropdownOptions, valueKey, labelKey]);\r\n\r\n const isDropdown = inputType === \"dropdown\" || normalizedOptions.length > 0;\r\n\r\n useImperativeHandle(ref, () => ({\r\n getValue: () => value,\r\n isCancelBeforeStart: () => false,\r\n isCancelAfterEnd: () => false,\r\n isPopup: () => true,\r\n }));\r\n\r\n useEffect(() => {\r\n if (isDropdown) {\r\n selectRef.current?.focus();\r\n return;\r\n }\r\n const el = inputRef.current;\r\n if (!el) return;\r\n el.focus();\r\n if (inputType !== \"date\") {\r\n el.select();\r\n }\r\n }, [isDropdown, inputType]);\r\n\r\n const handleSave = async () => {\r\n if (isLoading) return;\r\n\r\n if (String(value) === String(normalizedInitial)) {\r\n stopEditing();\r\n return;\r\n }\r\n\r\n if (!name) {\r\n toast.error(\"Property name is required\");\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n const payloadValue: string | number =\r\n inputType === \"number\" && value !== \"\"\r\n ? parseFloat(String(value))\r\n : value;\r\n\r\n const payload: CellEditPayload = {\r\n propertyName: name,\r\n propertyValue: payloadValue,\r\n entityId,\r\n entityName,\r\n };\r\n\r\n try {\r\n await onSave(payload);\r\n toast.success(\"Record updated successfully\");\r\n stopEditing();\r\n } catch (error) {\r\n console.error(\"Update error:\", error);\r\n const errorMessage =\r\n error instanceof Error ? error.message : \"Failed to update record\";\r\n toast.error(errorMessage);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n setValue(normalizedInitial);\r\n stopEditing();\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement | HTMLSelectElement>) => {\r\n if (event.key === \"Enter\") {\r\n event.preventDefault();\r\n handleSave();\r\n } else if (event.key === \"Escape\") {\r\n event.preventDefault();\r\n handleCancel();\r\n }\r\n };\r\n\r\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n let newValue = event.target.value;\r\n if (inputType === \"number\") {\r\n newValue = newValue.replace(/[^0-9.-]/g, \"\");\r\n }\r\n setValue(newValue);\r\n };\r\n\r\n const handleDropdownChange = (event: ChangeEvent<HTMLSelectElement>) => {\r\n setValue(event.target.value);\r\n };\r\n\r\n const isSaveDisabled =\r\n isLoading || String(value) === String(normalizedInitial);\r\n\r\n const defaultInputClass =\r\n \"w-48 px-2 py-1 text-sm border border-gray-200 rounded-md bg-white focus:outline-none focus:ring-1 focus:ring-blue-400\";\r\n\r\n const defaultSaveBtnClass =\r\n \"px-3 py-1 text-sm font-medium text-white bg-green-500 rounded-md hover:bg-green-600 disabled:opacity-50 whitespace-nowrap shrink-0\";\r\n\r\n const defaultCancelBtnClass =\r\n \"px-3 py-1 text-sm font-medium text-white bg-red-500 rounded-md hover:bg-red-600 disabled:opacity-50 whitespace-nowrap shrink-0\";\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center gap-2 px-2 py-1 min-w-[320px] bg-white border border-gray-200 rounded-md shadow-md\",\r\n className\r\n )}\r\n style={containerStyle}\r\n >\r\n {isDropdown ? (\r\n <select\r\n ref={selectRef}\r\n value={String(value)}\r\n onChange={handleDropdownChange}\r\n onKeyDown={handleKeyDown}\r\n className={inputClassName ?? defaultInputClass}\r\n disabled={isLoading}\r\n >\r\n <option value=\"\" disabled>\r\n Select option...\r\n </option>\r\n {normalizedOptions.map((opt) => (\r\n <option key={opt.value} value={opt.value}>\r\n {opt.label}\r\n </option>\r\n ))}\r\n </select>\r\n ) : (\r\n <input\r\n ref={inputRef}\r\n type={inputType}\r\n value={String(value)}\r\n onChange={handleInputChange}\r\n onKeyDown={handleKeyDown}\r\n className={inputClassName ?? defaultInputClass}\r\n placeholder=\"...\"\r\n disabled={isLoading}\r\n />\r\n )}\r\n\r\n <button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={isSaveDisabled}\r\n className={saveButtonClassName ?? (saveButtonStyle ? undefined : defaultSaveBtnClass)}\r\n style={saveButtonStyle}\r\n title=\"Save (Enter)\"\r\n >\r\n {isLoading\r\n ? (loadingIndicator ?? <ButtonSpinner />)\r\n : (saveButtonContent ?? \"Save\")}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleCancel}\r\n disabled={isLoading}\r\n className={cancelButtonClassName ?? (cancelButtonStyle ? undefined : defaultCancelBtnClass)}\r\n style={cancelButtonStyle}\r\n title=\"Cancel (Escape)\"\r\n >\r\n {cancelButtonContent ?? \"Cancel\"}\r\n </button>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nCustomCellEditor.displayName = \"CustomCellEditor\";\r\n\r\nexport default CustomCellEditor;\r\n","import { useRef, useState } from \"react\";\r\nimport Tippy from \"@tippyjs/react\";\r\nimport type { TippyProps } from \"@tippyjs/react\";\r\nimport { BiDotsVerticalRounded } from \"react-icons/bi\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { PopupCellRendererProps } from \"./types\";\r\n\r\n/**\r\n * Interactive popup trigger for table row actions (e.g. AG Grid cell renderer).\r\n *\r\n * Import Tippy styles in your app once:\r\n * `import \"tippy.js/dist/tippy.css\"`\r\n * `import \"tippy.js/themes/light.css\"`\r\n */\r\nexport function PopupCellRenderer<TRow = unknown>({\r\n dropDownContent,\r\n actionIcon: ActionIcon = BiDotsVerticalRounded,\r\n title = \"Actions\",\r\n className,\r\n hideTitle = false,\r\n params,\r\n onAction,\r\n placement = \"bottom-end\",\r\n tippyProps,\r\n ariaLabel = \"Row actions\",\r\n openOnHover = false,\r\n}: PopupCellRendererProps<TRow>) {\r\n const [visible, setVisible] = useState(false);\r\n const instanceRef = useRef<{ hide: () => void } | null>(null);\r\n\r\n const show = () => setVisible(true);\r\n const hide = () => {\r\n setVisible(false);\r\n instanceRef.current?.hide();\r\n };\r\n\r\n const rowData = params?.data;\r\n\r\n const handleAction = (actionType: string, actionRowData?: TRow) => {\r\n onAction?.(actionType, actionRowData ?? rowData, hide);\r\n hide();\r\n };\r\n\r\n const content: TippyProps[\"content\"] =\r\n typeof dropDownContent === \"function\"\r\n ? dropDownContent(handleAction)\r\n : dropDownContent;\r\n\r\n const hoverOrClickProps: Partial<TippyProps> = openOnHover\r\n ? {\r\n trigger: \"mouseenter\",\r\n delay: [0, 150],\r\n hideOnClick: false,\r\n }\r\n : {\r\n visible,\r\n onClickOutside: hide,\r\n };\r\n\r\n return (\r\n <div className=\"flex h-full\">\r\n <Tippy\r\n content={content}\r\n allowHTML\r\n arrow={false}\r\n appendTo={() => document.body}\r\n interactive\r\n placement={placement}\r\n animation=\"shift-away\"\r\n theme=\"light\"\r\n maxWidth=\"none\"\r\n offset={[0, 5]}\r\n onCreate={(instance) => {\r\n instanceRef.current = instance;\r\n }}\r\n {...hoverOrClickProps}\r\n {...tippyProps}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={openOnHover ? undefined : visible ? hide : show}\r\n className={cn(\r\n \"flex items-center justify-center gap-2 rounded-full text-gray-500 hover:text-gray-800\",\r\n className,\r\n )}\r\n aria-label={ariaLabel}\r\n >\r\n {!hideTitle && title}\r\n <ActionIcon aria-hidden />\r\n </button>\r\n </Tippy>\r\n </div>\r\n );\r\n}\r\n","import type { CSSProperties } from \"react\";\r\nimport {\r\n FaArchive,\r\n FaCheckCircle,\r\n FaDownload,\r\n FaEdit,\r\n FaEye,\r\n FaFileAlt,\r\n FaHistory,\r\n FaTrashAlt,\r\n} from \"react-icons/fa\";\r\nimport type { RowActionPreset, RowActionPresetName } from \"./types\";\r\n\r\n/** Settings-app hover: peach bg `#FFF1EB` + orange text (`primary-50` / `primary-150`). */\r\nexport const ROW_ACTION_ITEM_HOVER_CLASS =\r\n \"hover:bg-primary-50 hover:text-primary-150\";\r\n\r\n/** Settings/Department rest color (`#6C757D`). */\r\nexport const ROW_ACTION_ITEM_TEXT_CLASS = \"text-secondary\";\r\n\r\nexport const ROW_ACTION_DEFAULT_ICON_SIZE = 16;\r\n\r\nexport const ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE: CSSProperties = {\r\n zIndex: 10000,\r\n};\r\n\r\nexport const ROW_ACTION_PRESETS: Record<RowActionPresetName, RowActionPreset> = {\r\n edit: { label: \"Edit\", icon: FaEdit },\r\n delete: { label: \"Delete\", icon: FaTrashAlt, danger: true, iconClassName: \"text-red-500\" },\r\n view: { label: \"View\", icon: FaEye },\r\n notes: { label: \"Notes\", icon: FaFileAlt },\r\n history: { label: \"History\", icon: FaHistory },\r\n download: { label: \"Download\", icon: FaDownload },\r\n archive: { label: \"Archive\", icon: FaArchive },\r\n resolve: { label: \"Resolve\", icon: FaCheckCircle },\r\n};\r\n","import { ToolTip } from \"../tooltip/ToolTip\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport {\r\n ROW_ACTION_DEFAULT_ICON_SIZE,\r\n ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE,\r\n ROW_ACTION_ITEM_HOVER_CLASS,\r\n ROW_ACTION_ITEM_TEXT_CLASS,\r\n} from \"./presets\";\r\nimport type { ActionMenuItemProps } from \"./types\";\r\n\r\nexport function ActionMenuItem({\r\n label,\r\n icon: Icon,\r\n iconSize = ROW_ACTION_DEFAULT_ICON_SIZE,\r\n iconClassName,\r\n labelClassName,\r\n tooltip,\r\n tooltipPlacement = \"top\",\r\n tooltipDelayShow,\r\n tooltipDelayHide,\r\n tooltipClassName,\r\n tooltipStyle,\r\n disabled = false,\r\n danger = false,\r\n highlight = false,\r\n showLabel = true,\r\n className,\r\n onClick,\r\n}: ActionMenuItemProps) {\r\n const tooltipText = tooltip ?? label;\r\n\r\n return (\r\n <ToolTip\r\n text={tooltipText}\r\n disabled={!tooltipText}\r\n placement={tooltipPlacement}\r\n delayShow={tooltipDelayShow}\r\n delayHide={tooltipDelayHide}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={{ ...ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE, ...tooltipStyle }}\r\n className={showLabel ? \"block w-full\" : \"inline-flex\"}\r\n >\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n aria-label={label}\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n if (disabled) return;\r\n onClick();\r\n }}\r\n className={cn(\r\n \"flex items-center gap-2 text-sm transition-colors duration-150\",\r\n ROW_ACTION_ITEM_TEXT_CLASS,\r\n showLabel\r\n ? \"w-full rounded-xl px-3 py-2 text-left\"\r\n : \"justify-center rounded-md p-1\",\r\n disabled ? \"cursor-not-allowed opacity-50\" : ROW_ACTION_ITEM_HOVER_CLASS,\r\n highlight && !danger && \"text-primary-150\",\r\n className,\r\n )}\r\n >\r\n {Icon ? (\r\n <Icon\r\n className={cn(\"shrink-0\", iconClassName)}\r\n aria-hidden\r\n size={iconSize}\r\n />\r\n ) : null}\r\n {showLabel ? <span className={labelClassName}>{label}</span> : null}\r\n </button>\r\n </ToolTip>\r\n );\r\n}\r\n","import { ROW_ACTION_PRESETS } from \"./presets\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type {\r\n ResolvedRowAction,\r\n RowAction,\r\n RowActionFlag,\r\n RowActionPreset,\r\n RowActionPresetName,\r\n RowActionsList,\r\n} from \"./types\";\r\n\r\nfunction evalFlag<TRow>(\r\n flag: RowActionFlag<TRow> | undefined,\r\n data: TRow | undefined,\r\n): boolean {\r\n if (typeof flag === \"function\") return Boolean(flag(data));\r\n return Boolean(flag);\r\n}\r\n\r\nfunction mergePreset(\r\n name: RowActionPresetName | undefined,\r\n overrides?: Partial<Record<RowActionPresetName, Partial<RowActionPreset>>>,\r\n): RowActionPreset | undefined {\r\n if (!name) return undefined;\r\n const base = ROW_ACTION_PRESETS[name];\r\n const extra = overrides?.[name];\r\n if (!extra) return base;\r\n return { ...base, ...extra };\r\n}\r\n\r\nexport function resolveActions<TRow>(\r\n actions: RowActionsList<TRow>,\r\n data: TRow | undefined,\r\n hasPermission?: (permission: string) => boolean,\r\n presets?: Partial<Record<RowActionPresetName, Partial<RowActionPreset>>>,\r\n): ResolvedRowAction<TRow>[] {\r\n const list = typeof actions === \"function\" ? actions(data) : actions;\r\n\r\n return list.flatMap((action: RowAction<TRow>, index) => {\r\n const type = action.type ?? \"item\";\r\n const preset = mergePreset(action.preset, presets);\r\n const key = action.key ?? action.preset ?? `action-${index}`;\r\n const label = action.label ?? preset?.label ?? key;\r\n\r\n if (action.permission && hasPermission && !hasPermission(action.permission)) {\r\n return [];\r\n }\r\n\r\n if (evalFlag(action.hidden, data)) {\r\n return [];\r\n }\r\n\r\n const tooltip =\r\n action.tooltip === false\r\n ? undefined\r\n : (action.tooltip ?? (type === \"divider\" ? undefined : label));\r\n\r\n const resolved: ResolvedRowAction<TRow> = {\r\n key,\r\n type,\r\n label,\r\n icon: action.icon ?? preset?.icon,\r\n iconSize: action.iconSize,\r\n content: action.content,\r\n onClick: action.onClick,\r\n disabled: evalFlag(action.disabled, data),\r\n danger: action.danger ?? preset?.danger ?? false,\r\n highlight: evalFlag(action.highlight, data),\r\n tooltip,\r\n tooltipPlacement: action.tooltipPlacement,\r\n confirm: action.confirm,\r\n closeOnClick: action.closeOnClick !== false,\r\n className: action.className,\r\n iconClassName: cn(preset?.iconClassName, action.iconClassName) || undefined,\r\n labelClassName: action.labelClassName,\r\n };\r\n\r\n return [resolved];\r\n });\r\n}\r\n","import type { ReactNode } from \"react\";\r\nimport { ToolTip } from \"../tooltip/ToolTip\";\r\nimport { PopupCellRenderer } from \"../popup-cell-renderer/PopupCellRenderer\";\r\nimport { confirmationAlert } from \"../../utils/handleApiError\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { ActionMenuItem } from \"./ActionMenuItem\";\r\nimport {\r\n ROW_ACTION_DEFAULT_ICON_SIZE,\r\n ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE,\r\n} from \"./presets\";\r\nimport { resolveActions } from \"./resolveActions\";\r\nimport type { ResolvedRowAction, RowActionsProps } from \"./types\";\r\n\r\nfunction runAction<TRow>(\r\n action: ResolvedRowAction<TRow>,\r\n data: TRow | undefined,\r\n hide?: () => void,\r\n confirmFn: RowActionsProps<TRow>[\"confirmFn\"] = confirmationAlert,\r\n) {\r\n if (!action.onClick) {\r\n if (action.closeOnClick) hide?.();\r\n return;\r\n }\r\n\r\n const execute = () => action.onClick?.(data);\r\n\r\n if (action.confirm) {\r\n confirmFn?.(execute, action.confirm);\r\n } else {\r\n execute();\r\n }\r\n\r\n if (action.closeOnClick) {\r\n hide?.();\r\n }\r\n}\r\n\r\nexport function RowActions<TRow = unknown>({\r\n actions,\r\n data,\r\n mode = \"menu\",\r\n actionIcon,\r\n className,\r\n menuClassName,\r\n itemClassName,\r\n itemIconClassName,\r\n itemLabelClassName,\r\n iconSize = ROW_ACTION_DEFAULT_ICON_SIZE,\r\n triggerTooltip = \"Actions\",\r\n triggerAriaLabel = \"Row actions\",\r\n hasPermission,\r\n placement = \"bottom-end\",\r\n openOnHover = false,\r\n tippyProps,\r\n presets,\r\n confirmFn = confirmationAlert,\r\n tooltipPlacement = \"top\",\r\n tooltipDelayShow,\r\n tooltipDelayHide,\r\n tooltipClassName,\r\n tooltipStyle,\r\n renderItem,\r\n renderMenu,\r\n renderTrigger,\r\n}: RowActionsProps<TRow>) {\r\n const resolved = resolveActions(actions, data, hasPermission, presets);\r\n\r\n if (resolved.length === 0) {\r\n return null;\r\n }\r\n\r\n const mergedTooltipStyle = {\r\n ...ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE,\r\n ...tooltipStyle,\r\n };\r\n\r\n const renderDefaultItem = (\r\n action: ResolvedRowAction<TRow>,\r\n hide?: () => void,\r\n showLabel = true,\r\n ): ReactNode => {\r\n if (action.type === \"divider\") {\r\n return (\r\n <div\r\n key={action.key}\r\n role=\"separator\"\r\n className={cn(\"my-1 h-px bg-gray-100\", action.className)}\r\n />\r\n );\r\n }\r\n\r\n if (action.content) {\r\n return (\r\n <div key={action.key} className={action.className}>\r\n {action.content}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <ActionMenuItem\r\n key={action.key}\r\n label={action.label}\r\n icon={action.icon}\r\n iconSize={action.iconSize ?? iconSize}\r\n iconClassName={cn(itemIconClassName, action.iconClassName)}\r\n labelClassName={cn(itemLabelClassName, action.labelClassName)}\r\n tooltip={action.tooltip}\r\n tooltipPlacement={action.tooltipPlacement ?? tooltipPlacement}\r\n tooltipDelayShow={tooltipDelayShow}\r\n tooltipDelayHide={tooltipDelayHide}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={mergedTooltipStyle}\r\n disabled={action.disabled}\r\n danger={action.danger}\r\n highlight={action.highlight}\r\n showLabel={showLabel}\r\n className={cn(itemClassName, action.className)}\r\n onClick={() => runAction(action, data, hide, confirmFn)}\r\n />\r\n );\r\n };\r\n\r\n const renderItems = (hide?: () => void, showLabel = true): ReactNode =>\r\n resolved.map((action) => {\r\n const defaultItem = renderDefaultItem(action, hide, showLabel);\r\n if (!renderItem) return defaultItem;\r\n return (\r\n <div key={action.key}>\r\n {renderItem(action, { data, hide: hide ?? (() => undefined), defaultItem })}\r\n </div>\r\n );\r\n });\r\n\r\n if (mode === \"inline\") {\r\n const inlineItems = renderItems(undefined, false);\r\n return (\r\n <div className={cn(\"flex h-full items-center justify-center gap-1\", className)}>\r\n {inlineItems}\r\n </div>\r\n );\r\n }\r\n\r\n const triggerTooltipText =\r\n triggerTooltip === false ? undefined : triggerTooltip;\r\n\r\n const buildMenu = (hide: () => void): ReactNode => {\r\n const defaultMenu = (\r\n <div\r\n className={cn(\r\n \"flex min-w-[180px] flex-col rounded-lg border border-gray-100 bg-white p-2 shadow-lg\",\r\n menuClassName,\r\n )}\r\n >\r\n {renderItems(hide, true)}\r\n </div>\r\n );\r\n\r\n if (!renderMenu) return defaultMenu;\r\n return renderMenu({\r\n data,\r\n actions: resolved,\r\n hide,\r\n defaultMenu,\r\n });\r\n };\r\n\r\n if (renderTrigger) {\r\n return (\r\n <>\r\n {renderTrigger({\r\n data,\r\n actions: resolved,\r\n hide: () => undefined,\r\n defaultMenu: buildMenu(() => undefined),\r\n })}\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <ToolTip\r\n text={triggerTooltipText}\r\n disabled={!triggerTooltipText}\r\n placement={tooltipPlacement}\r\n delayShow={tooltipDelayShow}\r\n delayHide={tooltipDelayHide}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={tooltipStyle}\r\n className=\"flex h-full items-center justify-center\"\r\n >\r\n <PopupCellRenderer\r\n params={{ data }}\r\n actionIcon={actionIcon}\r\n hideTitle\r\n className={className}\r\n placement={placement}\r\n openOnHover={openOnHover}\r\n tippyProps={tippyProps}\r\n ariaLabel={triggerAriaLabel}\r\n dropDownContent={(handleAction) =>\r\n buildMenu(() => handleAction(\"close\"))\r\n }\r\n />\r\n </ToolTip>\r\n );\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport { FaArrowsRotate, FaTriangleExclamation } from \"react-icons/fa6\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { classifyError } from \"../../utils/handleApiError\";\r\nimport { Loader } from \"../Loader\";\r\nimport type { TableErrorBoundaryProps } from \"./types\";\r\n\r\nexport const TableErrorBoundary: React.FC<TableErrorBoundaryProps> = ({\r\n isError,\r\n isLoading = false,\r\n refetch,\r\n children,\r\n error,\r\n errorMessage,\r\n className,\r\n minHeight = \"280px\",\r\n}) => {\r\n const message = useMemo(() => {\r\n if (errorMessage) return errorMessage;\r\n if (error) return classifyError(error).userMessage;\r\n return \"Unable to load table data. Please try again.\";\r\n }, [error, errorMessage]);\r\n\r\n if (isLoading && !isError) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex w-full items-center justify-center rounded-xl bg-neutral-50\",\r\n className\r\n )}\r\n style={{ minHeight }}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n >\r\n <Loader size=\"40px\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (isError) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex w-full flex-col items-center justify-center gap-4 rounded-xl border border-red-100 bg-red-50 px-6 py-10 text-center\",\r\n className\r\n )}\r\n style={{ minHeight }}\r\n role=\"alert\"\r\n aria-live=\"assertive\"\r\n >\r\n <FaTriangleExclamation\r\n className=\"text-red-500\"\r\n size={32}\r\n aria-hidden\r\n />\r\n <div className=\"max-w-md space-y-1\">\r\n <p className=\"text-base font-semibold text-gray-800\">\r\n Failed to load data\r\n </p>\r\n <p className=\"text-sm text-gray-600\">{message}</p>\r\n </div>\r\n {refetch && (\r\n <button\r\n type=\"button\"\r\n onClick={() => refetch()}\r\n disabled={isLoading}\r\n className=\"inline-flex items-center gap-2 rounded-lg bg-primary-150 px-4 py-2 text-sm font-medium text-white transition-colors hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60\"\r\n >\r\n <FaArrowsRotate className={cn(isLoading && \"animate-spin\")} />\r\n {isLoading ? \"Retrying...\" : \"Try again\"}\r\n </button>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAAiB;AACjB,4BAAwB;AAEjB,SAAS,MAAM,QAAiC;AACrD,aAAO,mCAAQ,YAAAA,SAAK,MAAM,CAAC;AAC7B;;;ACEO,SAAS,eACd,QACA,UAAU,QACV,cAAc,KACd;AACA,MAAI,OAAO,IAAI,OAAO,GAAG;AACvB,WAAO,IAAI,SAAS,WAAW;AAAA,EACjC;AACA,SAAO;AACT;;;AChBO,IAAM,eAAe,CAC1B,MACA,YAAY,OACD;AACX,MAAI,SAAS,QAAQ,SAAS,OAAW,QAAO;AAChD,QAAM,QAAQ,OAAO,IAAI;AACzB,MAAI,MAAM,UAAU,WAAW;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI;AACzC;AAEO,IAAM,mBAAmB,CAC9B,UACA,YAAY,OACD;AACX,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,SAAS,UAAU,WAAW;AAChC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,SAAS,MAAM,SAAS,YAAY,GAAG,CAAC;AAC1D,QAAM,gBACJ,SAAS,MAAM,GAAG,YAAY,UAAU,SAAS,CAAC,IAAI;AACxD,SAAO,gBAAgB;AACzB;AAEO,SAAS,YAAY,UAA2B;AACrD,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AAKd,MAAI,MAAM,UAAU,MAAM;AACxB,UAAM,eAAe,MAAM,SAAS;AAEpC,QAAI,OAAO,iBAAiB,UAAU;AACpC,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,aAAa;AAC5B,QAAI,UAAU,OAAO,WAAW,UAAU;AACxC,iBAAW,OAAO,QAAQ;AACxB,cAAM,WAAY,OAAmC,GAAG;AACxD,YAAI,MAAM,QAAQ,QAAQ,KAAK,SAAS,SAAS,GAAG;AAClD,iBAAO,OAAO,SAAS,CAAC,CAAC;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,SAAS;AACxB,aAAO,OAAO,aAAa,OAAO;AAAA,IACpC;AAEA,QAAI,aAAa,OAAO;AACtB,aAAO,OAAO,aAAa,KAAK;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,MAAM,SAAS;AACjB,WAAO,MAAM;AAAA,EACf;AAEA,SAAO;AACT;AAEO,IAAM,wBAAwB,CAAC,iBAAqC;AACzE,MAAI,gBAAgB,KAAM,QAAO,CAAC;AAClC,MAAI,MAAM,QAAQ,YAAY,EAAG,QAAO;AAExC,QAAM,SAAS;AACf,QAAM,OAAO,OAAO;AAEpB,MACE,QACA,OAAO,SAAS,YAChB,CAAC,MAAM,QAAQ,IAAI,KACnB,MAAM,QAAS,KAA+B,KAAK,GACnD;AACA,WAAQ,KAA8B;AAAA,EACxC;AAEA,QAAM,cAAc,OAAO;AAC3B,MAAI,MAAM,QAAQ,aAAa,KAAK,EAAG,QAAO,YAAY;AAC1D,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO;AAChC,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,WAAO,CAAC,IAAI;AAAA,EACd;AACA,SAAO,CAAC;AACV;AAEO,SAAS,eAAe,MAAyC;AACtE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,GAAG;AACb;AAEO,SAAS,gBAAgB,MAAyC;AACvE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,YAAY;AAC1B;AAEO,IAAM,aAAa,CAAC,eAAkD;AAC3E,MAAI,eAAe,QAAQ,eAAe,OAAW,QAAO;AAC5D,QAAM,OAAO,IAAI,KAAK,UAAU;AAEhC,MAAI,MAAM,KAAK,QAAQ,CAAC,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK,SAAS,IAAI,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG;AAC9D,QAAM,MAAM,KAAK,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,OAAO,KAAK,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE;AACnD,SAAO,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI;AAChC;AAEO,IAAM,UAAU,CAAC,QAAyB;AAC/C,SAAO,OAAO,KAAK,GAAG,EAAE,WAAW;AACrC;AAEO,IAAM,mBAAmB,CAAC,SAAmD;AAClF,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI;AAEJ,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,sBAAsB,KAAK,IAAI,GAAG;AACpC,aAAO;AAAA,IACT;AACA,QAAI,IAAI,KAAK,IAAI;AAAA,EACnB,OAAO;AACL,QAAI,IAAI,KAAK,IAAI;AAAA,EACnB;AAEA,MAAI,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO;AAE/B,QAAM,YAAY,IAAI,KAAK,EAAE,QAAQ,IAAI,EAAE,kBAAkB,IAAI,GAAK;AACtE,QAAM,OAAO,UAAU,YAAY;AACnC,QAAM,SAAS,UAAU,SAAS,IAAI,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG;AACnE,QAAM,MAAM,UAAU,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAE1D,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAChC;AAEO,SAAS,wBAAwB,MAA2C;AACjF,MAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,IAAI;AAC/B,WAAO,CAAC;AAAA,EACV;AACA,SAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AAClD;AAEO,SAAS,qBAAwB,OAAY,aAAyB;AAC3E,SAAO,MAAM,SAAS,WAAW;AACnC;AAEO,IAAM,oBAAoB,CAAC,UAA6C;AAC7E,SAAO,OAAO,eAAe,SAAS;AAAA,IACpC,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC,KAAK;AACR;AACO,IAAM,eAAe,CAAC,WAAuD;AAClF,MAAI,MAAM,OAAO,MAAM,CAAC,KAAK,WAAW,QAAQ,WAAW,QAAW;AACpE,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,OAAO,MAAM,EAClC,SAAS,EACT,QAAQ,yBAAyB,GAAG;AAEvC,SAAO;AACT;AAEO,IAAM,6BAA6B,CAAC,UAA2B;AACpE,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAE1C,QAAM,MACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,WAAW,QACrD,MAA6B,QAC9B;AAEN,QAAM,cAAc,OAAO,QAAQ,QAAQ,KAAK,KAAK,OAAO,GAAG;AAC/D,QAAM,eAAe,YAAY,QAAQ,SAAS,EAAE;AACpD,SAAO,WAAW,YAAY,KAAK;AACrC;AAEO,SAAS,iBACd,MACA,SACK;AACL,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC;AAClC,SAAO,KAAK,IAAI,CAAC,QAAQ;AACvB,UAAM,UAAU,EAAE,GAAG,IAAI;AACzB,KAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,QAAQ;AAC/B,YAAM,MAAM,IAAI;AAChB,UAAI,CAAC,IAAK;AACV,UAAI,IAAI,SAAS,GAAG,GAAG;AACrB,cAAM,QAAQ,IAAI,MAAM,GAAG,EAAE;AAAA,UAC3B,CAAC,KAAK,SAAU,MAA8C,IAAI;AAAA,UAClE;AAAA,QACF;AACA,QAAC,QAAoC,GAAG,IAAI,SAAS;AAAA,MACvD;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AACH;AAEO,IAAM,mBAAmB,CAAC,UAMA;AAC/B,MAAI,OAAO,MAAM,QAAQ;AACvB,WAAO,OAAO,OAAO,MAAM,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI;AAAA,EAC1D;AACA,SACE,OAAO,MAAM,SACb,OAAO,MAAM,OAAO,OAAO,CAAC,KAC5B;AAEJ;AAEO,IAAM,sBAAsB,CACjC,SAAc,CAAC,GACf,QACQ;AACR,SAAO,QAAQ,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,aAAa,GAAG;AAC/D;AAEO,IAAM,kBAAkB,CAC7B,SAAc,CAAC,GACf,QACQ;AACR,SAAO,OAAO,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,SAAS,GAAG;AACtD;AAEO,IAAM,kBAAkB,CAAc,eAAiC;AAC5E,MAAI;AACF,WAAO,KAAK,MAAM,UAAU;AAAA,EAC9B,SAAS,OAAO;AACd,YAAQ,MAAM,uBAAuB,KAAK;AAC1C,WAAO;AAAA,EACT;AACF;AAEO,IAAM,iBAAiB,CAAC,eAAkD;AAC/E,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,OAAO,IAAI,KAAK,UAAU;AAChC,MAAI,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO;AAClC,QAAM,UAAsC;AAAA,IAC1C,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,SAAO,KAAK,eAAe,SAAS,OAAO;AAC7C;AAEO,IAAM,yBAAyB,CACpC,QAAa,CAAC,GACd,UACA,SAAoB,CAAC,GACrB,EAAE,kBAAkB,MAAM,IAAmC,CAAC,MACtD;AACR,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,SAAU,QAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAC/E,QAAM,YAAY,CAAC,MACjB,mBAAmB,OAAO,MAAM,WAAW,EAAE,YAAY,IAAI;AAC/D,QAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAC1D,QAAM,WAAW,IAAI,IAAI,UAAU,IAAI,SAAS,CAAC;AACjD,SAAO,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,IAAI,UAAU,OAAO,QAAQ,CAAC,CAAC,CAAC;AAC1E;AAEO,IAAM,uBAAuB,CAClC,SAAc,CAAC,GACf,QACQ;AACR,SAAO,OAAO,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,cAAc,GAAG;AAChE;;;ACjSO,IAAM,yBAAyB;AAEtC,SAAS,aAA6B;AACpC,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO,OAAO;AAChB;AAEO,SAAS,QAAW,KAAa,WAAqB,MAAgB;AAC3E,MAAI;AACF,UAAM,MAAM,WAAW,GAAG,QAAQ,GAAG;AACrC,QAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,aAAO;AAAA,IACT;AACA,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,QAAW,KAAa,OAAgB;AACtD,MAAI;AACF,eAAW,GAAG,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EAClD,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,WAAW,KAAmB;AAC5C,MAAI;AACF,eAAW,GAAG,WAAW,GAAG;AAAA,EAC9B,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,cACd,MAAc,wBACC;AACf,QAAM,QAAQ,QAAuB,KAAK,MAAS;AACnD,SAAO,UAAU,OAAO,SAAY;AACtC;AAEO,SAAS,cACd,OACA,MAAc,wBACR;AACN,UAAQ,KAAK,KAAK;AACpB;AAGO,IAAM,MAAM;AACZ,IAAM,MAAM;AAGZ,IAAM,0BAA0B;AAChC,IAAM,0BAA0B;AAChC,IAAM,uBAAuB;;;AC7C7B,SAAS,qBACd,aACwB;AACxB,SAAO,YAAY,OAA+B,CAAC,KAAK,eAAe;AACrE,UAAM,EAAE,YAAY,YAAY,MAAM,aAAa,IAAI;AAEvD,QAAI,CAAC,IAAI,UAAU,GAAG;AACpB,UAAI,UAAU,IAAI,CAAC;AAAA,IACrB;AAEA,QAAI,UAAU,EAAE,IAAI,IAAI;AAExB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;;;ACzBA,6BAAkB;AAClB,yBAAoE;AAiC7D,SAAS,iBACd,OACS;AACT,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,SAAS,MAAM,UAAU,MAAM;AAErC,MACE,WAAW,iBACX,WAAW,mBACX,WAAW,iBACX;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI,WAAW,OAAO,WAAW,OAAO,WAAW,IAAK,QAAO;AAC/D,QAAI,UAAU,OAAO,SAAS,IAAK,QAAO;AAAA,EAC5C;AAEA,SAAO;AACT;AAGO,SAAS,cACd,OACqB;AACrB,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,aAAa;AAAA,MACb,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,UAAU,MAAM;AACrC,QAAM,OAAO,MAAM;AAEnB,MACE,WAAW,iBACX,WAAW,mBACX,WAAW,iBACX;AACA,WAAO;AAAA,MACL,aAAa;AAAA,MACb,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,YAAY,UAAU,OAAO,SAAS,KAAK;AAC/D,WAAO;AAAA,MACL,aAAa;AAAA,MACb,aAAa;AAAA,MACb,kBAAkB,iBAAiB,MAAM;AAAA,MACzC,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,IACb,aACE,MAAM,WACN,MAAM,SACN,MAAM,SACN;AAAA,IACF,kBACE,OAAO,WAAW,YAAY,OAAO,WAAW,WAC5C,iBAAiB,MAAM,KACvB;AAAA,IACN,iBAAiB;AAAA,EACnB;AACF;AAEO,SAAS,2BACd,QACQ;AACR,QAAM,QAAQ,OAAO,KAAK,MAAM,EAAE;AAAA,IAAQ,CAAC,WACxC,OAAO,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,OAAO,GAAG,OAAO;AAAA,EACtD;AACA,SAAO;AAAA;AAAA;AAAA;AAAA,cAIK,MAAM,KAAK,EAAE,CAAC;AAAA;AAAA;AAAA;AAI5B;AAEA,SAAS,oBAAoB,MAAoB;AAC/C,OAAK,mBAAAC,QAAK,KAAK;AAAA,IACb,OAAO;AAAA,IACP;AAAA,IACA,MAAM;AAAA,IACN,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,EACtB,CAAC;AACH;AAGO,SAAS,eACd,OACA,EAAE,YAAY,OAAO,gBAAgB,IAA2B,CAAC,GAC3D;AACN,MAAI,CAAC,MAAO;AAEZ,QAAM,SAAS,MAAM,UAAU,MAAM;AACrC,QAAM,OAAO,MAAM;AAEnB,MAAI,WAAW,KAAK;AAClB;AAAA,EACF;AAEA,MAAI,MAAM,UAAU,OAAO,KAAK,WAAW,UAAU;AACnD,UAAM,SAAS,KAAK;AAEpB,QAAI,WAAW;AACb,0BAAoB,2BAA2B,MAAM,CAAC;AAAA,IACxD,OAAO;AACL,aAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,UAAU;AACrC,SAAC,OAAO,KAAK,KAAK,CAAC,GAAG,QAAQ,CAAC,iBAAiB;AAC9C,iCAAAC,QAAM,MAAM,YAAY;AAAA,QAC1B,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAEA,MAAI,WAAW,KAAK;AAClB;AAAA,EACF;AAEA,QAAM,UACJ,mBACA,MAAM,WACN,MAAM,SACN,MAAM,SACP,MAAM,WACL;AAEF,yBAAAA,QAAM,MAAM,OAAO;AACrB;AAEA,IAAM,eAAe;AACrB,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,YAAY;AAClB,IAAM,cAAc;AACpB,IAAM,mBAAmB;AAuCzB,SAAS,QAAQ,OAAoC,UAA0B;AAC7E,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AACpD;AAGO,IAAM,wBAAwB;AAAA,EACnC,SAAS;AAAA;AAAA;AAAA;AAAA,IAIP,KAAK;AACT;AAmBA,IAAM,mBAAsE;AAAA,EAC1E,OAAO;AAAA,IACL,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,wBAAwB;AAAA,IACxB,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU,sBAAsB;AAAA,IAChC,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,wBAAwB;AAAA,IACxB,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,IACvB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU,sBAAsB;AAAA,IAChC,MAAM;AAAA,IACN,qBAAqB;AAAA,EACvB;AACF;AAEA,SAAS,2BAAiC;AACxC,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAe,gBAAgB,EAAG;AAE/C,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK;AACX,QAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoEpB,WAAS,KAAK,YAAY,KAAK;AACjC;AAEA,SAAS,KACP,UACA,aACA,UACG;AACH,MAAI,aAAa,OAAW,QAAO;AACnC,MAAI,gBAAgB,OAAW,QAAO;AACtC,SAAO;AACT;AAEA,SAAS,iBACP,MACA,OACkC;AAClC,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,SAAiC,EAAE,GAAI,KAAgC;AAC7E,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,OAAO,UAAU,YAAY,OAAO;AACtC,aAAO,GAAG,IAAI,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,KAAK;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAwB;AACtD,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,MAAM;AAIZ,WACE,IAAI,MAAM,WACV,IAAI,MAAM,SACV,IAAI,WACJ;AAAA,EAEJ;AACA,SAAO;AACT;AAEO,SAAS,kBACd,WACA,UAAoC,CAAC,GAC/B;AACN,2BAAyB;AAEzB,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,KAAK,iBAAiB,OAAO;AAEnC,QAAM,qBAAqB,QAAQ;AACnC,QAAM,WAAW,QAAQ,kBAAkB;AAE3C,QAAM,QAAQ;AAAA,IACZ,QAAQ;AAAA,IACR,GAAG;AAAA,IACH,WAAW,0BAA0B;AAAA,EACvC;AACA,QAAM,OAAO,QAAQ;AACrB,QAAM,OAAO,QAAQ;AACrB,QAAM,OAAO,KAAK,QAAQ,MAAM,GAAG,MAAM,SAAkB;AAC3D,QAAM,WAAW,KAAK,QAAQ,UAAU,GAAG,UAAU,MAAS;AAC9D,QAAM,YAAY,KAAK,QAAQ,WAAW,GAAG,WAAW,YAAY;AACpE,QAAM,cAAc,KAAK,QAAQ,aAAa,GAAG,aAAa,SAAS;AACvE,QAAM,WAAW,QAAQ,aAAa;AACtC,QAAM,oBAAoB,KAAK,QAAQ,mBAAmB,GAAG,mBAAmB,KAAK;AACrF,QAAM,mBAAmB,QAAQ,oBAAoB;AACrD,QAAM,qBAAqB;AAAA,IACzB,QAAQ;AAAA,IACR,GAAG;AAAA,IACH;AAAA,EACF;AACA,QAAM,oBAAoB;AAAA,IACxB,QAAQ;AAAA,IACR,GAAG;AAAA,IACH;AAAA,EACF;AACA,QAAM,yBAAyB;AAAA,IAC7B,QAAQ;AAAA,IACR,GAAG;AAAA,IACH;AAAA,EACF;AACA,QAAM,wBAAwB;AAAA,IAC5B,QAAQ;AAAA,IACR,GAAG;AAAA,IACH;AAAA,EACF;AACA,QAAM,mBAAmB,QAAQ,qBAAqB;AACtD,QAAM,sBAAsB;AAAA,IAC1B,QAAQ;AAAA,IACR,GAAG;AAAA,IACH;AAAA,EACF;AACA,QAAM,mBACJ,QAAQ,oBAAoB;AAE9B,QAAM,iBAAiB,QAAQ,kBAAkB;AACjD,QAAM,cAAc,QAAQ;AAC5B,QAAM,SAAS,QAAQ;AACvB,QAAM,QAAQ,QAAQ;AACtB,QAAM,eAAe,QAAQ,QAAQ,cAAc,MAAM;AACzD,QAAM,qBAAqB,QAAQ,QAAQ,oBAAoB,QAAQ;AACvE,QAAM,WAAW,QAAQ;AAEzB,QAAM,YAAY,uBAAuB;AAEzC,QAAM,YACJ,SACC,WACG;AAAA,QACA,OAAO,mCAAmC,IAAI,SAAS,EAAE;AAAA;AAAA,2CAEtB,YAAY,yBAAyB,kBAAkB;AAAA;AAAA,QAG1F;AAEN,QAAM,kBAAkB;AAAA,IACtB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,eAAe;AAAA,IACf,SAAS;AAAA,IACT,eAAe;AAAA,IACf,cAAc;AAAA,IACd,MAAM;AAAA,EACR;AAEA,QAAM,cAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,iBAAiB,iBAAiB,QAAQ,WAAW;AAAA,IAClE,mBAAmB,MAAM,CAAC,mBAAAD,QAAK,UAAU;AAAA,IACzC,gBAAgB,MAAM,CAAC,mBAAAA,QAAK,UAAU;AAAA,IACtC,SAAS,MAAM;AACb,YAAM,QAAQ,mBAAAA,QAAK,SAAS;AAC5B,UAAI,OAAO;AACT,cAAM,MAAM,YAAY,2BAA2B,kBAAkB;AACrE,cAAM,MAAM,YAAY,2BAA2B,sBAAsB;AACzE,cAAM,MAAM,YAAY,0BAA0B,iBAAiB;AACnE,cAAM,MAAM,YAAY,0BAA0B,qBAAqB;AACvE,cAAM,MAAM,YAAY,2BAA2B,SAAS;AAC5D,cAAM,MAAM,YAAY,wBAAwB,WAAW;AAC3D,cAAM,MAAM,YAAY,uBAAuB,YAAY;AAC3D,cAAM,MAAM,YAAY,2BAA2B,kBAAkB;AACrE,YAAI,SAAS,MAAM;AACjB,gBAAM,MAAM;AAAA,YACV;AAAA,YACA,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO,OAAO,KAAK;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AACA,UAAI,UAAU,KAAM;AACpB,YAAM,YAAY,mBAAAA,QAAK,aAAa;AACpC,UAAI,UAAW,WAAU,MAAM,SAAS,OAAO,MAAM;AAAA,IACvD;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,gBAAY,OAAO;AACnB,QAAI,UAAU;AACZ,kBAAY,WAAW;AAAA,IACzB;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,gBAAY,OAAO;AACnB,gBAAY,QAAQ;AACpB,gBAAY,mBAAmB;AAC/B,gBAAY,iBAAiB,CAAC,UAAkB;AAC9C,UAAI,CAAC,OAAO,KAAK,EAAG,QAAO;AAC3B,UAAI,MAAM,KAAK,MAAM,mBAAoB,KAAK,GAAG;AAC/C,eAAO,gBAAgB,kBAAkB;AAAA,MAC3C;AACA,aAAO;AAAA,IACT;AAAA,EACF,WAAW,MAAM;AACf,gBAAY,OAAO;AAAA,EACrB,OAAO;AACL,gBAAY,OAAO;AAAA,EACrB;AAEA,MAAI,WAAW;AACb,gBAAY,sBAAsB;AAClC,gBAAY,aAAa,CAAC,eAAuB;AAC/C,UAAI,YAAY,YAAY,KAAK,MAAM,mBAAoB,KAAK,GAAG;AACjE,2BAAAA,QAAK;AAAA,UACH,gBAAgB,kBAAkB;AAAA,QACpC;AACA,eAAO;AAAA,MACT;AACA,aAAO,QAAQ,QAAQ,EACpB,KAAK,MAAM,UAAU,CAAC,EACtB,MAAM,CAAC,UAAU;AAChB,2BAAAA,QAAK,sBAAsB,uBAAuB,KAAK,CAAC;AACxD,cAAM;AAAA,MACR,CAAC;AAAA,IACL;AAAA,EACF;AAEA,OAAK,mBAAAA,QAAK,KAAK,WAAW,EAAE,KAAK,CAAC,WAA6B;AAC7D,QAAI,OAAO,eAAe,CAAC,WAAW;AACpC,WAAK,QAAQ,QAAQ,UAAU,CAAC;AAChC;AAAA,IACF;AACA,QAAI,OAAO,aAAa;AACtB,iBAAW;AAAA,IACb;AAAA,EACF,CAAC;AACH;;;AC7jBA,mBAAsB;AAStB,SAAS,iBAAiB,MAAuB;AAC/C,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,QAAQ,OAAO,SAAS,YAAY,YAAY,MAAM;AACxD,UAAM,SAAU,KAA6B;AAC7C,YAAQ,UAAU,OAAO,YAAY;AAAA,EACvC;AACA,SAAO;AACT;AAMO,SAAS,yBACd,qBACA;AAAA,EACE,aAAa;AAAA,EACb,eAAe;AACjB,IAAqC,CAAC,GACzB;AACb,QAAM,qBAAiB;AAAA,IACrB,OAAO,MAAM,KAAK,iBAAiB;AACjC,YAAM,SAAS,MAAM,oBAAoB,MAAM,KAAK,YAAY;AAEhE,UAAI,OAAO,SAAS,CAAC,iBAAiB,OAAO,KAAsB,GAAG;AACpE,2BAAM,KAAK,OAAO,KAAK;AAAA,MACzB;AAEA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA,SAAS,CAAC,YACR,IAAI;AAAA,QAAQ,CAAC,YACX,WAAW,SAAS,KAAK,IAAI,MAAO,KAAK,SAAS,YAAY,CAAC;AAAA,MACjE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,gCAA6C,OACjD,MACA,KACA,iBACG;AACH,UAAM,SAAS,iBAAiB,IAAI;AACpC,QAAI,WAAW,OAAO;AACpB,aAAO,oBAAoB,MAAM,KAAK,YAAY;AAAA,IACpD;AACA,WAAO,eAAe,MAAM,KAAK,YAAY;AAAA,EAC/C;AAEA,SAAO;AACT;;;AC7DA,mBAA0B;AAGnB,IAAM,uBAAuB,CAClC,cACA,iBACA,MACA,SACA,SACA,YACA,cAAc,GACd,iBAAiB,OACd;AACH,8BAAU,MAAM;AACd,UAAM,iBAAiB,SAAS,aAAa,IAAI,MAAM,KAAK,EAAE,KAAK;AACnE,UAAM,oBACJ,SAAS,aAAa,IAAI,SAAS,KAAK,EAAE,KAAK;AACjD,UAAM,eAAe,aAAa,IAAI,MAAM;AAC5C,UAAM,kBAAkB,aAAa,IAAI,SAAS;AAElD,QAAI,CAAC,gBAAgB,CAAC,iBAAiB;AACrC,YAAM,YAAY,IAAI,gBAAgB,YAAY;AAElD,UAAI,CAAC,cAAc;AACjB,kBAAU,IAAI,QAAQ,YAAY,SAAS,CAAC;AAAA,MAC9C;AAEA,UAAI,CAAC,iBAAiB;AACpB,kBAAU,IAAI,WAAW,eAAe,SAAS,CAAC;AAAA,MACpD;AAEA,sBAAgB,WAAW,EAAE,SAAS,KAAK,CAAC;AAC5C;AAAA,IACF;AAEA,QAAI,mBAAmB,MAAM;AAC3B,cAAQ,cAAc;AAAA,IACxB;AAEA,QAAI,sBAAsB,SAAS;AACjC,iBAAW,iBAAiB;AAAA,IAC9B;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;ACpDA,IAAAE,gBAAoC;AAS7B,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AACX,IAA0B,CAAC,MAAM;AAC/B,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,UAAU,OAAO;AAE9D,+BAAU,MAAM;AACd,QAAI,QAAQ;AACV,oBAAc,MAAM;AACpB;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM;AAC5B,YAAM,SAAS,SAAS,eAAe,QAAQ;AAC/C,YAAM,SAAS,SAAS,eAAe,QAAQ;AAE/C,YAAM,eAAe,SAAS,OAAO,eAAe;AACpD,YAAM,eAAe,SAAS,OAAO,eAAe;AACpD,YAAM,cAAc,OAAO;AAE3B,YAAM,kBAAkB,cAAc,eAAe,eAAe;AACpE,oBAAc,GAAG,eAAe,IAAI;AAAA,IACtC;AAEA,oBAAgB;AAChB,WAAO,iBAAiB,UAAU,eAAe;AACjD,WAAO,MAAM,OAAO,oBAAoB,UAAU,eAAe;AAAA,EACnE,GAAG,CAAC,QAAQ,UAAU,UAAU,MAAM,CAAC;AAEvC,SAAO;AACT;;;ACzCA,IAAAC,gBAOO;AAqJW;AAjJlB,SAAS,gBACP,MACA,cACoB;AACpB,MAAI,gBAAgB,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,gBAAgB,CAAC,EAAE,QAAQ,GAAG;AAC1E,WAAO;AAAA,EACT;AACA,SAAO,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG;AACxC;AAEA,SAAS,iBAAiB,MAA6B;AACrD,SAAO,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AACxD;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,aAAS,qBAAM,EAAE,QAAQ,MAAM,EAAE;AACvC,QAAM,eAAe,cAAc,UAAa,cAAc;AAC9D,QAAM,CAAC,oBAAoB,qBAAqB,QAAI;AAAA,IAAS,MAC3D,gBAAgB,MAAM,YAAY;AAAA,EACpC;AACA,QAAM,cAAU,sBAAuC,oBAAI,IAAI,CAAC;AAEhE,QAAM,gBAAgB,eAAe,YAAY;AAEjD,+BAAU,MAAM;AACd,QAAI,aAAc;AAClB,UAAM,aAAa,iBAAiB,IAAI;AACxC,QAAI,CAAC,iBAAiB,CAAC,WAAW,SAAS,aAAa,GAAG;AACzD,YAAM,OAAO,gBAAgB,MAAM,YAAY;AAC/C,UAAI,SAAS,eAAe;AAC1B,8BAAsB,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,cAAc,cAAc,aAAa,CAAC;AAEpD,QAAM,qBAAiB;AAAA,IACrB,CAAC,OAAe,aAAuB;AACrC,UAAI,SAAU;AACd,UAAI,CAAC,cAAc;AACjB,8BAAsB,KAAK;AAAA,MAC7B;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,IACA,CAAC,cAAc,WAAW;AAAA,EAC5B;AAEA,QAAM,eAAW,2BAAY,CAAC,UAAkB;AAC9C,YAAQ,QAAQ,IAAI,KAAK,GAAG,MAAM;AAAA,EACpC,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAoB;AAAA,IACxB,CAAC,UAA2C;AAC1C,YAAM,aAAa,iBAAiB,IAAI;AACxC,UAAI,WAAW,WAAW,EAAG;AAE7B,YAAM,eAAe,gBACjB,WAAW,QAAQ,aAAa,IAChC;AACJ,UAAI,YAAY;AAEhB,cAAQ,MAAM,KAAK;AAAA,QACjB,KAAK;AAAA,QACL,KAAK;AACH,gBAAM,eAAe;AACrB,sBACE,eAAe,IACX,KACC,eAAe,KAAK,WAAW;AACtC;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,gBAAM,eAAe;AACrB,sBACE,eAAe,IACX,WAAW,SAAS,KACnB,eAAe,IAAI,WAAW,UAAU,WAAW;AAC1D;AAAA,QACF,KAAK;AACH,gBAAM,eAAe;AACrB,sBAAY;AACZ;AAAA,QACF,KAAK;AACH,gBAAM,eAAe;AACrB,sBAAY,WAAW,SAAS;AAChC;AAAA,QACF;AACE;AAAA,MACJ;AAEA,YAAM,SAAS,WAAW,SAAS;AACnC,UAAI,QAAQ;AACV,uBAAe,MAAM;AACrB,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAAC,MAAM,eAAe,gBAAgB,QAAQ;AAAA,EAChD;AAEA,MAAI,CAAC,KAAK,QAAQ;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe;AAAA,IACnB;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EACF;AAEA,SACE,4CAAC,SAAI,WAAW,cACd,uDAAC,SAAI,WAAW,GAAG,yBAAyB,YAAY,SAAS,GAC/D;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,mBAAmB,YAAY,GAAG;AAAA,QAChD,cAAW;AAAA,QAEX;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,GAAG,oBAAoB,YAAY,IAAI;AAAA,YAClD,WAAW;AAAA,YAEV,eAAK,IAAI,CAAC,QAAQ;AACjB,oBAAM,WAAW,kBAAkB,IAAI;AACvC,oBAAM,QAAQ,GAAG,MAAM,QAAQ,IAAI,EAAE;AACrC,oBAAM,UAAU,GAAG,MAAM,UAAU,IAAI,EAAE;AAEzC,qBACE;AAAA,gBAAC;AAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,WAAW;AAAA,oBACT;AAAA,oBACA,YAAY;AAAA,oBACZ,YAAY;AAAA,oBACZ,YAAY,YAAY;AAAA,kBAC1B;AAAA,kBAEA;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK,CAAC,OAAO;AACX,4BAAI,IAAI;AACN,kCAAQ,QAAQ,IAAI,IAAI,IAAI,EAAE;AAAA,wBAChC,OAAO;AACL,kCAAQ,QAAQ,OAAO,IAAI,EAAE;AAAA,wBAC/B;AAAA,sBACF;AAAA,sBACA,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,IAAI;AAAA,sBACJ,iBAAe;AAAA,sBACf,iBAAe,aAAa,UAAU;AAAA,sBACtC,UAAU,WAAW,IAAI;AAAA,sBACzB,UAAU,IAAI;AAAA,sBACd,WAAW;AAAA,wBACT;AAAA,wBACA,YAAY;AAAA,wBACZ,YAAY;AAAA,wBACZ,YAAY,YAAY;AAAA,sBAC1B;AAAA,sBACA,SAAS,MAAM,eAAe,IAAI,IAAI,IAAI,QAAQ;AAAA,sBAEjD;AAAA,4BAAI,OACH;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAW,GAAG,oBAAoB,YAAY,IAAI;AAAA,4BAClD,eAAW;AAAA,4BAEV,cAAI;AAAA;AAAA,wBACP,IACE;AAAA,wBACJ;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAW,GAAG,qBAAqB,YAAY,KAAK;AAAA,4BAEnD,cAAI;AAAA;AAAA,wBACP;AAAA,wBACC,WACC;AAAA,0BAAC;AAAA;AAAA,4BACC,WAAW;AAAA,8BACT;AAAA,8BACA,YAAY;AAAA,4BACd;AAAA,4BACA,eAAW;AAAA;AAAA,wBACb,IACE;AAAA;AAAA;AAAA,kBACN;AAAA;AAAA,gBAtDK,IAAI;AAAA,cAuDX;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,IAEC,aACC,4CAAC,SAAI,WAAW,GAAG,uBAAuB,YAAY,OAAO,GAC1D,eAAK,IAAI,CAAC,QAAQ;AACjB,YAAM,WAAW,kBAAkB,IAAI;AACvC,YAAM,UAAU,GAAG,MAAM,UAAU,IAAI,EAAE;AACzC,YAAM,QAAQ,GAAG,MAAM,QAAQ,IAAI,EAAE;AAErC,UAAI,CAAC,eAAe,CAAC,UAAU;AAC7B,eAAO;AAAA,MACT;AAEA,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,IAAI;AAAA,UACJ,MAAK;AAAA,UACL,mBAAiB;AAAA,UACjB,QAAQ,CAAC;AAAA,UACT,WAAW,GAAG,qBAAqB,YAAY,KAAK;AAAA,UAEnD,cAAI;AAAA;AAAA,QAPA,IAAI;AAAA,MAQX;AAAA,IAEJ,CAAC,GACH,IACE;AAAA,KACN,GACF;AAEJ;;;AC5OA,8BAAgC;AAwB5B,IAAAC,sBAAA;AAfJ,IAAM,4BAA4B,CAAC,IAAI,IAAI,IAAI,IAAI,GAAG;AACtD,IAAM,kBAAkB;AAExB,SAAS,SAAS,KAAa;AAC7B,SAAO,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG;AACvC;AAEA,SAAS,YAAY;AAAA,EACnB,OAAO;AAAA,EACP;AACF,GAGG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MACZ;AAAA,MAEA;AAAA,qDAAC,UAAK,GAAE,sDAAqD;AAAA,QAC7D,6CAAC,UAAK,GAAE,cAAa;AAAA,QACrB,6CAAC,UAAK,GAAE,uDAAsD;AAAA,QAC9D,6CAAC,UAAK,GAAE,aAAY;AAAA;AAAA;AAAA,EACtB;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AACd,GAA4B;AAC1B,QAAM,cAAc,MAAM;AACxB,sBAAkB,SAAS;AAAA,MACzB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,UAAU,YAAY;AAAA,MACtB,OAAM;AAAA,MACN,WAAU;AAAA,MAEV;AAAA,qDAAC,eAAY,MAAM,IAAI,WAAW,GAAG,YAAY,iBAAiB,EAAE,GAAG;AAAA,QAAE;AAAA;AAAA;AAAA,EAE3E;AAEJ;AAEO,SAAS,2BAA2B;AAAA,EACzC,eAAe,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAoC;AAClC,QAAM,EAAE,iBAAiB,gBAAgB,kBAAkB,IAAI;AAC/D,QAAM,eAAe,mBAAmB,kBAAkB;AAE1D,SACE,6CAAC,SAAI,WAAU,2BACZ,4BACE,qBACC,mBAAmB,aAAa,IAEhC;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,UAAU;AAAA,MACV;AAAA;AAAA,EACF,IAEN;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,CAAC,cAAc,eAAe,QAAI,yCAAgB;AACxD,QAAM,UAAU,YAAY,QAAQ;AACpC,QAAM,aAAa,YAAY,WAAW;AAC1C,QAAM,kBACJ,uBAAuB,sBAAsB;AAC/C,QAAM,eAAe,aAAa,IAAI,UAAU;AAChD,QAAM,gBACJ,iBAAiB,QAAQ,iBAAiB,KACtC,SAAS,cAAc,EAAE,IACzB;AACN,QAAM,eAAe,kBAAkB;AAEvC,QAAM,cAAc,iBAChB,KAAK,IAAI,GAAG,eAAe,cAAc,CAAC,IAC1C;AAEJ,QAAM,mBAAmB,CAAC,eAAuB;AAC/C,QACE,CAAC,kBACD,aAAa,KACb,cAAc,eAAe,WAC7B;AACA;AAAA,IACF;AAEA,UAAM,WAAW,KAAK;AAAA,MACpB;AAAA,MACA,KAAK,IAAI,aAAa,GAAG,eAAe,SAAS;AAAA,IACnD;AACA,UAAM,YAAY,IAAI,gBAAgB,YAAY;AAClD,cAAU,IAAI,SAAS,OAAO,QAAQ,CAAC;AACvC,oBAAgB,WAAW,EAAE,SAAS,KAAK,CAAC;AAC5C,mBAAe,QAAQ;AAAA,EACzB;AAEA,QAAM,uBAAuB,CAAC,UAA0C;AACtE,UAAM,SAAS,SAAS,MAAM,OAAO,OAAO,EAAE;AAC9C,QACE,CAAC,OAAO,SAAS,MAAM,KACtB,SAAS,KAAK,WAAW,iBAC1B;AACA;AAAA,IACF;AAEA,UAAM,YAAY,IAAI,gBAAgB,YAAY;AAClD,cAAU,IAAI,SAAS,GAAG;AAC1B,cAAU,IAAI,YAAY,OAAO,MAAM,CAAC;AACxC,oBAAgB,WAAW,EAAE,SAAS,KAAK,CAAC;AAC5C,uBAAmB,MAAM;AAAA,EAC3B;AAEA,QAAM,oBAAoB,MAAM;AAC9B,UAAM,UAAuB,CAAC;AAC9B,UAAM,aAAa;AACnB,UAAM,aAAa,KAAK,IAAI,GAAG,gBAAgB,aAAa,CAAC;AAE7D,QAAI,YAAY,KAAK,IAAI,GAAG,cAAc,KAAK,MAAM,aAAa,CAAC,CAAC;AACpE,QAAI,UAAU,KAAK,IAAI,aAAa,GAAG,YAAY,aAAa,CAAC;AAEjE,QAAI,UAAU,YAAY,IAAI,YAAY;AACxC,kBAAY,KAAK,IAAI,GAAG,UAAU,aAAa,CAAC;AAAA,IAClD;AAEA,QAAI,YAAY,GAAG;AACjB,cAAQ;AAAA,QACN;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,MAAM,iBAAiB,CAAC;AAAA,YACjC,cAAW;AAAA,YACX,WAAW;AAAA,cACT;AAAA,cACA,YAAY;AAAA,YACd;AAAA,YACD;AAAA;AAAA,UARK;AAAA,QAUN;AAAA,MACF;AAEA,UAAI,YAAY,GAAG;AACjB,gBAAQ;AAAA,UACN;AAAA,YAAC;AAAA;AAAA,cAEC,eAAY;AAAA,cACZ,WAAU;AAAA,cACX;AAAA;AAAA,YAHK;AAAA,UAKN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,aAAS,IAAI,WAAW,KAAK,SAAS,KAAK;AACzC,YAAM,WAAW,gBAAgB;AACjC,cAAQ;AAAA,QACN;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,MAAM,iBAAiB,CAAC;AAAA,YACjC,cAAY,QAAQ,IAAI,CAAC;AAAA,YACzB,gBAAc,WAAW,SAAS;AAAA,YAClC,WAAW;AAAA,cACT;AAAA,cACA,WACI,GAAG,0BAA0B,YAAY,gBAAgB,IACzD;AAAA,gBACE;AAAA,gBACA,YAAY;AAAA,cACd;AAAA,YACN;AAAA,YAEC,cAAI;AAAA;AAAA,UAfA,IAAI;AAAA,QAgBX;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU,aAAa,GAAG;AAC5B,UAAI,UAAU,aAAa,GAAG;AAC5B,gBAAQ;AAAA,UACN;AAAA,YAAC;AAAA;AAAA,cAEC,eAAY;AAAA,cACZ,WAAU;AAAA,cACX;AAAA;AAAA,YAHK;AAAA,UAKN;AAAA,QACF;AAAA,MACF;AAEA,cAAQ;AAAA,QACN;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,MAAM,iBAAiB,aAAa,CAAC;AAAA,YAC9C,cAAY,QAAQ,UAAU;AAAA,YAC9B,WAAW;AAAA,cACT;AAAA,cACA,YAAY;AAAA,YACd;AAAA,YAEC;AAAA;AAAA,UATI;AAAA,QAUP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,CAAC,gBAAgB;AAChC,WACE,6CAAC,SAAI,WAAU,mDACb,uDAAC,UAAK,WAAU,iBACb,sBAAY,eAAe,sBAC9B,GACF;AAAA,EAEJ;AAEA,QAAM,uBACJ,eAAe,UAAU,KACzB,CAAC,gBAAgB,SAAS,eAAe,OAAO,IAC5C,CAAC,GAAG,iBAAiB,eAAe,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,IACjE;AAEN,QAAM,cAAc,eAChB,kBACA,eAAe,YACd,OAAO,SAAS,aAAa,KAAK,gBAAgB,IAC/C,gBACA;AAER,QAAM,YACJ,eAAe,eAAe,IAC1B,KACC,eAAe,cAAc,KAAK,eAAe,UAAU;AAClE,QAAM,UAAU,KAAK;AAAA,IACnB,YAAY,eAAe,UAAU;AAAA,IACrC,eAAe;AAAA,EACjB;AAEA,QAAM,EAAE,iBAAiB,gBAAgB,kBAAkB,IACzD,gBAAgB,CAAC;AACnB,QAAM,eACJ,mBAAmB,kBAAkB;AAEvC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,qDAAC,SAAI,WAAW,GAAG,UAAU,YAAY,IAAI,GAC3C,uDAAC,UAAK,WAAU,wCACb,yBACG,eAAe,eAAe,cAAc,CAAC,aAC7C,WAAW,SAAS,SAAS,CAAC,MAAM,SAAS,OAAO,CAAC,OAAO,eAAe,cAAc,CAAC,YAChG,GACF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,WAAW,GAAG,+BAA+B,YAAY,GAAG;AAAA,YAE5D;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,iBAAiB,cAAc,CAAC;AAAA,kBAC/C,UAAU,gBAAgB,KAAK;AAAA,kBAC/B,WAAU;AAAA,kBACV,cAAW;AAAA,kBAEX,uDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,uDAAC,UAAK,GAAE,uGAAsG,GAChH;AAAA;AAAA,cACF;AAAA,cAEA,6CAAC,SAAI,WAAU,+BACZ,yBACC,6CAAC,UAAK,WAAU,mCAAkC,eAAY,QAAO,iBAErE,IAEA,kBAAkB,GAEtB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,iBAAiB,cAAc,CAAC;AAAA,kBAC/C,UACE,eAAe,eAAe,YAAY,KAAK;AAAA,kBAEjD,WAAU;AAAA,kBACV,cAAW;AAAA,kBAEX,uDAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,uDAAC,UAAK,GAAE,uGAAsG,GAChH;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QACF;AAAA,QAEA,6CAAC,SAAI,WAAU,2BACb,wDAAC,SAAI,WAAU,2BACZ;AAAA,4BACE,qBACC,mBAAmB,aAAa,IAEhC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,UAAU;AAAA,cACV;AAAA;AAAA,UACF;AAAA,UAEJ,8CAAC,SAAI,WAAU,+BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,WAAW;AAAA,kBACT;AAAA,kBACA,YAAY;AAAA,gBACd;AAAA,gBAEC;AAAA,wCACC,6CAAC,YAAO,OAAO,iBAAiB,iBAAG;AAAA,kBAEpC,qBAAqB,IAAI,CAAC,WACzB,6CAAC,YAAoB,OAAO,QACzB,oBADU,MAEb,CACD;AAAA;AAAA;AAAA,YACH;AAAA,aACF;AAAA,WACF,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC5YA,IAAAC,gBAAkC;AAClC,0BAAmB;AACnB,IAAAC,2BAAgC;;;ACAhC,IAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,OAAO;AACT;AAGC,IAAM,iBAAiB,CACtB,mBACiC;AAAA,EACjC,SAAS,CAAC,UAAU,WAAW;AAAA,IAC7B,GAAG;AAAA,IACH,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,aAAa,MAAM,YAAY,YAAY,UAAU;AAAA,IACrD,WAAW,MAAM,YACb,sCACA;AAAA,IACJ,WAAW;AAAA,MACT,aAAa,YAAY;AAAA,IAC3B;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ,CAAC,UAAU,WAAW;AAAA,IAC5B,GAAG;AAAA,IACH,UAAU;AAAA,IACV,iBAAiB,MAAM,aACnB,YAAY,UACZ,MAAM,YACJ,YAAY,kBACZ,YAAY;AAAA,IAClB,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,aAAa,MAAM,YAAY,YAAY,UAAU;AAAA,IACrD,OAAO,MAAM,aACT,YAAY,QACZ,MAAM,YACJ,YAAY,UACZ,YAAY;AAAA,IAClB,WAAW;AAAA,MACT,iBAAiB,YAAY;AAAA,MAC7B,OAAO,YAAY;AAAA,IACrB;AAAA,IACA,YAAY;AAAA,MACV,iBAAiB,YAAY;AAAA,MAC7B,OAAO,YAAY;AAAA,IACrB;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA,aAAa,CAAC,cAAc;AAAA,IAC1B,GAAG;AAAA,IACH,OAAO,YAAY;AAAA,IACnB,QAAQ;AAAA,EACV;AAAA,EACA,MAAM,CAAC,cAAc;AAAA,IACnB,GAAG;AAAA,IACH,cAAc;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,mBAAmB,CAAC,cAAc;AAAA,IAChC,GAAG;AAAA,IACH,OAAO,YAAY;AAAA,IACnB,WAAW;AAAA,MACT,OAAO,YAAY;AAAA,IACrB;AAAA,IACA,QAAQ;AAAA,EACV;AAAA,EACA,oBAAoB,OAAO;AAAA,IACzB,SAAS;AAAA,EACX;AACF;;;ADKI,IAAAC,sBAAA;AAzEG,SAAS,eAAuD;AAAA,EACrE;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,cAAc;AAAA,EACd,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,GAAG;AACL,GAAgC;AAC9B,QAAM,CAAC,cAAc,eAAe,QAAI,0CAAgB;AACxD,QAAM,6BAAyB,sBAAO,KAAK;AAE3C,+BAAU,MAAM;AACd,QAAI,CAAC,sBAAsB,uBAAuB,QAAS;AAC3D,2BAAuB,UAAU;AAEjC,QAAI,aAAa,IAAI,IAAI,EAAG;AAE5B,UAAM,SAAS,wBAAgC,IAAI;AACnD,QAAI,UAAU,QAAQ,WAAW,IAAI;AACnC,sBAAgB,CAAC,SAAS;AACxB,aAAK,IAAI,MAAM,OAAO,MAAM,CAAC;AAG7B,eAAO,eAAe,MAAM,SAAS;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,oBAAoB,MAAM,WAAW,cAAc,eAAe,CAAC;AAEvE,QAAM,eAAe,aAAa,IAAI,IAAI;AAC1C,QAAM,iBAAiB,eACnB,SAAS;AAAA,IACP,CAAC,WAAW,OAAO,QAAQ,GAAG,SAAS,MAAM;AAAA,EAC/C,KAAK,OACL;AAEJ,QAAM,eAAe,CAAC,aAA4B;AAChD,UAAM,gBACJ,YAAY,SAAS,QAAQ,MAAM,KAAK,OAAO,SAAS,QAAQ,CAAC,IAAI;AAEvE,oBAAgB,CAAC,SAAS;AAGxB,WAAK,KAAK,IAAI,IAAI,KAAK,SAAS,iBAAiB,KAAK;AACpD,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,eAAe;AAClB,aAAK,OAAO,IAAI;AAAA,MAClB,OAAO;AACL,aAAK,IAAI,MAAM,aAAa;AAAA,MAC9B;AAEA,aAAO,eAAe,MAAM,SAAS;AAAA,IACvC,CAAC;AAED,QAAI,oBAAoB;AACtB,UAAI,eAAe;AACjB,gCAAwB,MAAM,aAAa;AAAA,MAC7C,OAAO;AACL,mBAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,SACE,6CAAC,SAAI,WAAW,GAAG,SAAS,GAC5B;AAAA,IAAC,oBAAAC;AAAA,IAAA;AAAA,MACC,aAAa,eAAe,UAAU,IAAI;AAAA,MAC1C,OAAO;AAAA,MACP,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,CAAC,WAAW,OAAO,OAAO,QAAQ,KAAK,EAAE;AAAA,MACzD,gBAAgB,CAAC,WACf,OAAO,OAAO,SAAS,OAAO,QAAQ,OAAO,QAAQ,KAAK,EAAE;AAAA,MAE9D,QAAQ,eAAuB,YAAY;AAAA,MAC1C,GAAG;AAAA;AAAA,EACN,GACA;AAEJ;;;AExGA,IAAAC,2BAAgC;AAiC5B,IAAAC,sBAAA;AA1BJ,IAAM,cACJ;AAEF,IAAM,WAAsD;AAAA,EAC1D,SACE;AAAA,EACF,mBACE;AAAA,EACF,gBACE;AAAA,EACF,WACE;AAAA,EACF,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OACE;AACJ;AAEA,SAAS,UAAU;AAAA,EACjB,OAAO;AAAA,EACP;AACF,GAGG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,eAAY;AAAA,MACZ;AAAA,MAEA;AAAA,qDAAC,UAAK,GAAE,sDAAqD;AAAA,QAC7D,6CAAC,UAAK,GAAE,cAAa;AAAA,QACrB,6CAAC,UAAK,GAAE,uDAAsD;AAAA,QAC9D,6CAAC,UAAK,GAAE,aAAY;AAAA;AAAA;AAAA,EACtB;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAA4B;AAC1B,QAAM,CAAC,EAAE,eAAe,QAAI,0CAAgB;AAE5C,QAAM,cAAc,MAAM;AACxB,oBAAgB,CAAC,GAAG,EAAE,SAAS,KAAK,CAAC;AACrC,cAAU;AAAA,EACZ;AAEA,QAAM,eAAe,SAAS,SAAY,6CAAC,aAAU,MAAM,IAAI,IAAK;AAEpE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,WAAW,GAAG,aAAa,SAAS,OAAO,GAAG,SAAS;AAAA,MAEtD;AAAA;AAAA,QACA,aAAa;AAAA;AAAA;AAAA,EAChB;AAEJ;;;AClFA,IAAAC,gBAMO;AACP,gBAAyB;AACzB,IAAAC,2BAAgC;AA2F5B,IAAAC,sBAAA;AAtFG,SAAS,YAAY;AAAA,EAC1B,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb;AAAA,EACA,YAAY;AAAA,EACZ,GAAG;AACL,GAAqB;AACnB,QAAM,CAAC,cAAc,eAAe,QAAI,0CAAgB;AACxD,QAAM,aAAa,aAAa,IAAI,YAAY,KAAK,gBAAgB;AAErE,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,UAAU;AACvD,QAAM,uBAAmB,sBAA6C,IAAI;AAE1E,QAAM,qBAAqB,CAAC,gBAAwB;AAClD,UAAM,YAAY,aAAa,KAAK,KAAK;AAEzC,oBAAgB,CAAC,SAAS;AAGxB,WAAK,KAAK,IAAI,YAAY,KAAK,QAAQ,WAAW;AAChD,eAAO;AAAA,MACT;AAEA,UAAI,WAAW;AACb,aAAK,IAAI,cAAc,SAAS;AAAA,MAClC,OAAO;AACL,aAAK,OAAO,YAAY;AAAA,MAC1B;AAEA,aAAO,eAAe,MAAM,SAAS;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,CAAC,MAAkC;AACtD,MAAE,eAAe;AACjB,UAAM,WAAW,IAAI,SAAS,EAAE,aAAa;AAC7C,UAAM,cAAc,SAAS,IAAI,IAAI;AACrC,uBAAmB,OAAO,eAAe,EAAE,CAAC;AAAA,EAC9C;AAEA,QAAM,oBAAoB,CAAC,MAAqC;AAC9D,UAAM,QAAQ,EAAE,OAAO;AACvB,kBAAc,KAAK;AAEnB,QAAI,YAAY;AACd,UAAI,iBAAiB,SAAS;AAC5B,qBAAa,iBAAiB,OAAO;AAAA,MACvC;AAEA,uBAAiB,UAAU,WAAW,MAAM;AAC1C,2BAAmB,KAAK;AAAA,MAC1B,GAAG,aAAa;AAAA,IAClB;AAEA,QAAI,UAAU,IAAI;AAChB,UAAI,iBAAiB,SAAS;AAC5B,qBAAa,iBAAiB,OAAO;AAAA,MACvC;AACA,oBAAc,EAAE;AAChB,yBAAmB,EAAE;AAAA,IACvB;AAAA,EACF;AAEA,+BAAU,MAAM;AACd,kBAAc,UAAU;AAAA,EAC1B,GAAG,CAAC,UAAU,CAAC;AAEf,+BAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,iBAAiB,SAAS;AAC5B,qBAAa,iBAAiB,OAAO;AAAA,MACvC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA,oBACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC,uBACC,aAEA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,GAAG,yBAAyB,mBAAmB;AAAA;AAAA,YAC5D;AAAA;AAAA,QAEJ;AAAA,QAEF;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA,WAAW,GAAG,6BAA6B,eAAe;AAAA,YAC1D;AAAA,YACC,GAAG;AAAA;AAAA,QACN;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACtIA,2BAAwC;AACxC,IAAAC,gBAAmD;AACnD,uBAA6B;AAC7B,gBAAsC;AACtC,iBAAqC;;;ACJrC,oBAAO;;;ACOK,IAAAC,sBAAA;AAHL,IAAM,SAAgC,CAAC,EAAE,WAAW,QAAS,WAAW,OAAO,QAAQ,QAAQ,KAAK,MAAM;AAC7G,SACI,6CAAC,SAAI,WAAW,UACZ;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,WAAW,SAAS;AAAA,MAC/B,OAAO;AAAA,QACH,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,iBAAiB;AAAA,QACjB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW,QAAQ,KAAK;AAAA,MAC5B;AAAA;AAAA,EACH,GACL;AAER;;;AFkFgB,IAAAC,sBAAA;AA7FT,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,eAAe;AAAA,EACf;AACF,GAAe;AACb,QAAM,eAAW,sBAAuB,IAAI;AAE5C,QAAM,sBAAsB,CAAC,MAAkC;AAC7D,QAAI,EAAE,WAAW,EAAE,iBAAiB,sBAAsB;AACxD,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,+BAAU,MAAM;AACd,UAAM,eAAe,CAAC,MAAqB;AACzC,UAAI,EAAE,QAAQ,YAAY,UAAU,eAAe;AACjD,gBAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,eAAS,iBAAiB,WAAW,YAAY;AACjD,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAEA,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,YAAY;AACpD,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,aAAa,CAAC;AAEnC,QAAM,eACJ,6CAAC,wCACE,oBACC;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA;AAAA,QAEL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,SAAS;AAAA,QACT;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAC,4BAAO;AAAA,UAAP;AAAA,YACC,KAAK;AAAA,YACL,SAAS,EAAE,GAAG,UAAU,SAAS,EAAE;AAAA,YACnC,SAAS,EAAE,GAAG,GAAG,SAAS,EAAE;AAAA,YAC5B,MAAM,EAAE,GAAG,SAAS,SAAS,EAAE;AAAA,YAC/B,YAAY,EAAE,UAAU,IAAI;AAAA,YAC5B,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAClC,OAAO;AAAA,cACL,UAAU;AAAA;AAAA,cACV,WAAW;AAAA;AAAA,YACb;AAAA,YAGC;AAAA,4BACE,cAED;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,cAAc;AAAA,kBAChB;AAAA,kBACA,WAAU;AAAA,kBAEV;AAAA,iEAAC,QAAG,WAAU,iBAAiB,iBAAM;AAAA,oBACrC,8CAAC,SAAI,WAAU,+BACZ;AAAA,iCACC;AAAA,wBAAC;AAAA;AAAA,0BACC,SAAS;AAAA,0BACT,WAAU;AAAA,0BAEV;AAAA,yEAAC,qBAAQ,MAAK,WAAU;AAAA,4BACxB,6CAAC,UAAK,mBAAK;AAAA;AAAA;AAAA,sBACb;AAAA,sBAED,YACC;AAAA,wBAAC;AAAA;AAAA,0BACC,SAAS;AAAA,0BACT,WAAU;AAAA,0BAEV;AAAA,yEAAC,0BAAa;AAAA,4BACd,6CAAC,UAAK,oBAAM;AAAA;AAAA;AAAA,sBACd;AAAA,sBAEF;AAAA,wBAAC;AAAA;AAAA,0BACC,SAAS;AAAA,0BACT,WAAU;AAAA,0BAEV,uDAAC,mCAAqB,OAAM,WAAU,MAAM,IAAI;AAAA;AAAA,sBAClD;AAAA,uBACF;AAAA;AAAA;AAAA,cACF;AAAA,cAEF;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA;AAAA,kBACF;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA,cAGC,UACC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA;AAAA,kBACF;AAAA,kBACA,OAAO;AAAA,oBACL,QAAQ;AAAA,oBAER,cAAc;AAAA,kBAChB;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QAEJ;AAAA,QACC,aACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,QAAQ,KAAK;AAAA,YACtB,aAAU;AAAA,YACV,aAAU;AAAA,YACV,MAAK;AAAA,YACL,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAEjC,yBAAe,eAAe,6CAAC,UAAO,MAAK,QAAO;AAAA;AAAA,QACrD;AAAA;AAAA;AAAA,EAEJ,GAEJ;AAGF,MAAI,YAAY,SAAS,eAAe,YAAY;AACpD,MAAI,CAAC,WAAW;AACd,gBAAY,SAAS,cAAc,KAAK;AACxC,cAAU,KAAK;AACf,aAAS,KAAK,YAAY,SAAS;AAAA,EACrC;AAEA,aAAO,+BAAa,cAAc,SAAS;AAC7C;;;AGtLA,IAAAC,gBAA2B;AA8CrB,IAAAC,sBAAA;AA1CN,IAAMC,eACJ;AAEF,IAAMC,YAAmC;AAAA,EACvC,SACE;AAAA,EACF,mBACE;AAAA,EACF,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OACE;AAAA,EACF,QACE;AACJ;AAEA,IAAM,QAAgC;AAAA,EACpC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,aAAS;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA,YAAY;AAAA,IACZ,OAAO;AAAA,IACP;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,gBAAgBA,UAAS,OAAO,KAAKA,UAAS;AACpD,UAAM,aAAa,MAAM,IAAI;AAE7B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACTD;AAAA,UACA;AAAA,UACA,SAAS,QAAQ;AAAA,UACjB;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;;;AC1Cb,IAAAE,sBAAA;AApBD,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,oBAAoB;AACtB,GAAc;AACZ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MAEA,wDAAC,SAAI,WAAW,GAAG,kBAAkB,iBAAiB,GACpD;AAAA,qDAAC,UAAK,WAAW,GAAG,yBAAyB,aAAa,GAAI,gBAAK;AAAA,QACnE,8CAAC,SACC;AAAA,uDAAC,QAAG,WAAW,GAAG,sCAAsC,cAAc,GACnE,iBACH;AAAA,UACC,WAAW,QACV,6CAAC,OAAE,WAAW,GAAG,0BAA0B,gBAAgB,GAAI,mBAAQ;AAAA,WAE3E;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;ACtBM,IAAAC,uBAAA;AAXC,SAAS,OAAO;AAAA,EACrB,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB;AACF,GAAgB;AACd,SACE,+CAAC,SAAI,WAAW,QAAQ,SAAS,IAC/B;AAAA,mDAAC,SAAI,WAAU,iBACb;AAAA,oDAAC,QAAG,WAAW,YAAa,iBAAM;AAAA,MACjC,eACC,8CAAC,SAAI,WAAW,sBAAsB,gBAAgB,IAAK,uBAAY;AAAA,OAE3E;AAAA,IACA,8CAAC,SAAI,WAAW,8CAA8C,cAAc,IACzE,UACH;AAAA,KACF;AAEJ;;;ACxBA,IAAAC,gBAKO;AACP,IAAAC,2BAAkC;AA6B5B,IAAAC,uBAAA;AAzBN,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AACzB,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AAE1B,IAAM,eACJ;AAEF,IAAM,mBACJ;AAMF,SAAS,oBAAoB;AAC3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,eAAY;AAAA,MACZ,WAAU;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,WACP,cACwB;AACxB,MAAI,OAAO,UAAU,SAAS,KAAK,YAAY,MAAM,mBAAmB;AACtE,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AACT;AAEA,SAAS,UACP,UACA,QACA,aAAa,IACW;AACxB,aAAW,SAAS,QAAQ;AAC1B,UAAM,WAAW,GAAG,UAAU,IAAI,MAAM,IAAI,GAAG,QAAQ,QAAQ,GAAG;AAClE,QAAI,aAAa,UAAU;AACzB,aAAO;AAAA,IACT;AACA,QAAI,MAAM,UAAU;AAClB,YAAM,aAAa,UAAU,UAAU,MAAM,UAAU,QAAQ;AAC/D,UAAI,YAAY;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,KAAa;AACjC,SAAO,IAAI,SAAS,GAAG,IACnB,IAAI,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,IAChC,IAAI,MAAM,GAAG,EAAE,IAAI;AACzB;AAWO,SAAS,YAAY;AAAA,EAC1B,SAAS,CAAC;AAAA,EACV;AAAA,EACA,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB;AAAA,EACA,kBAAkB;AAAA,EAClB,eAAe,CAAC;AAAA,EAChB,cAAc,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA,oBAAoB,CAAC;AAAA,EACrB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAAqB;AACnB,QAAM,eAAW,sCAAY;AAC7B,QAAM,YAAY,SAAS,SAAS,MAAM,GAAG,EAAE,OAAO,CAAC,YAAY,OAAO;AAC1E,QAAM,SAAS,WAAW,YAAY;AAEtC,QAAM,WAAW,CAAC,aAAqB;AACrC,UAAM,QAAQ,UAAU,UAAU,MAAM;AACxC,QAAI,SAAS,MAAM,OAAO;AACxB,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,gBAAgB,aAAa,QAAQ;AAC3C,QAAI,iBAAiB,OAAO,aAAa,GAAG;AAC1C,aAAO,OAAO,aAAa;AAAA,IAC7B;AAEA,QAAI,eAAe;AACjB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,CAAC,aAAqB;AACpC,UAAM,UAAU,aAAa,QAAQ;AACrC,QAAI,WAAW,YAAY,OAAO,GAAG;AACnC,aAAO,YAAY,OAAO;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAkB,CAAC;AAEzB,MAAI,UAAU;AACZ,WAAO,KAAK;AAAA,MACV,KAAK;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,OAAO,QAAQ;AAAA,MACtB,MAAM,YAAY,QAAQ;AAAA,MAC1B,WAAW,UAAU,WAAW;AAAA,MAChC,QAAQ,UAAU,SAAS;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,YAAU,QAAQ,CAAC,SAAS,UAAU;AACpC,UAAM,KAAK,IAAI,UAAU,MAAM,GAAG,QAAQ,CAAC,EAAE,KAAK,GAAG,CAAC;AACtD,UAAM,YAAY,UAAU,UAAU,SAAS;AAC/C,UAAM,iBAAiB,kBAAkB;AAAA,MACvC,CAAC,UAAU,GAAG,SAAS,KAAK,KAAK,YAAY;AAAA,IAC/C;AAEA,WAAO,KAAK;AAAA,MACV,KAAK;AAAA,MACL;AAAA,MACA,OAAO,SAAS,EAAE;AAAA,MAClB,MAAM,QAAQ,EAAE;AAAA,MAChB;AAAA,MACA,QAAQ,CAAC,aAAa,CAAC;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AAED,QAAM,WAA+B;AAAA,IACnC;AAAA,IACA,iBAAiB;AAAA,EACnB;AAEA,QAAM,oBAAoB,GAAG,cAAc,kBAAkB,aAAa;AAC1E,QAAM,0BAA0B,GAAG,cAAc,eAAe,aAAa;AAC7E,QAAM,mBAAmB,GAAG,cAAc,eAAe;AAEzD,QAAM,cAAc,CAAC,UAAiB;AACpC,UAAM,UACJ,gFACG;AAAA,YAAM,OACL;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,qCAAqC,aAAa;AAAA,UAChE,OAAO,YAAY,EAAE,OAAO,UAAU,IAAI;AAAA,UAEzC,gBAAM;AAAA;AAAA,MACT,IACE;AAAA,MACH,MAAM;AAAA,OACT;AAGF,QAAI,MAAM,WAAW;AACnB,aACE;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,OAAO,EAAE,OAAO,YAAY;AAAA,UAC5B,gBAAa;AAAA,UAEZ;AAAA;AAAA,MACH;AAAA,IAEJ;AAEA,QAAI,MAAM,QAAQ;AAChB,aACE;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,MAAM;AAAA,UACV,WAAW;AAAA,UACX,OAAO,EAAE,OAAO,cAAc;AAAA,UAE7B;AAAA;AAAA,MACH;AAAA,IAEJ;AAEA,WACE,8CAAC,UAAK,WAAW,yBAAyB,OAAO,EAAE,OAAO,cAAc,GACrE,mBACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,MAEN;AAAA,iBAAS,8CAAC,SAAI,WAAU,qBAAqB,kBAAO,IAAS;AAAA,QAC9D,8CAAC,QAAG,WAAU,wDACX,iBAAO,IAAI,CAAC,OAAO,UAClB,+CAAC,QAAmB,WAAU,kCAC3B;AAAA,kBAAQ,IACP;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA,cACA,OAAO,EAAE,OAAO,eAAe;AAAA,cAE9B,wBAAc,SACb,8CAAC,qBAAkB,QACjB,8BAAe,SAAS,QAC1B,4BAAa,SAAS,IAEtB;AAAA;AAAA,UAEJ,IACE;AAAA,UACH,YAAY,KAAK;AAAA,aAnBX,MAAM,GAoBf,CACD,GACH;AAAA,QACC,SAAS,8CAAC,SAAI,WAAU,qBAAqB,kBAAO,IAAS;AAAA;AAAA;AAAA,EAChE;AAEJ;;;ACvQA,IAAAC,iBAA4C;AAC5C,IAAAC,2BAAkC;;;ACDlC,IAAAC,gBAAsB;AACtB,2BAAwB;AA+Bb,IAAAC,uBAAA;AA5BX,IAAM,sBAAsB;AAAA,EAC1B,OAAO;AAAA,EACP,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,cAAc;AAChB;AAEO,SAAS,QAAQ;AAAA,EACtB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAAiB;AACf,QAAM,kBAAc,qBAAM;AAC1B,QAAM,YAAY,kBAAkB,YAAY,QAAQ,MAAM,EAAE,CAAC;AACjE,QAAM,cAAc,OAAO,QAAQ,EAAE;AAErC,MAAI,YAAY,CAAC,aAAa;AAC5B,WAAO,8CAAC,UAAK,WAAuB,UAAS;AAAA,EAC/C;AAEA,SACE,gFACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,mBAAiB;AAAA,QACjB,wBAAsB;AAAA,QACtB,UAAU;AAAA,QAET;AAAA;AAAA,IACH;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,kBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,OAAO,EAAE,GAAG,qBAAqB,GAAG,aAAa;AAAA;AAAA,IACnD;AAAA,KACF;AAEJ;;;AD3BI,IAAAC,uBAAA;AAvBJ,SAAS,eAAe,MAAmB;AACzC,SAAO,KAAK,WAAW,KAAK;AAC9B;AAEA,SAAS,oBAAoB,MAAmB,WAAoB;AAClE,SAAO,KAAK,qBAAqB,YAAY,UAAU;AACzD;AAEA,SAAS,aAAa,UAAkB,MAAe;AACrD,MAAI,CAAC,QAAQ,SAAS,IAAK,QAAO;AAClC,SAAO,aAAa,QAAQ,SAAS,WAAW,GAAG,IAAI,GAAG;AAC5D;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,aACE;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AACF,GAGG;AACD,MAAI,CAAC,KAAM,QAAO;AAClB,SACE,8CAAC,UAAK,WAAW,GAAG,wBAAwB,SAAS,GAAG,eAAY,QACjE,gBACH;AAEJ;AAEO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ,CAAC;AAAA,EACT,UAAU;AAAA,EACV,eAAe;AAAA,EACf,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,aAAa,CAAC;AAAA,EACd;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB,8CAAC,UAAK,oBAAC;AAAA,EAC1B,GAAG;AACL,GAAiB;AACf,QAAM,eAAW,sCAAY;AAC7B,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAkB,WAAW;AAC/D,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAkC,CAAC,CAAC;AACxE,QAAM,0BAAsB,uBAAO,gBAAgB;AACnD,sBAAoB,UAAU;AAE9B,gCAAU,MAAM;AACd,iBAAa,WAAW;AAAA,EAC1B,GAAG,CAAC,WAAW,CAAC;AAEhB,gCAAU,MAAM;AACd,wBAAoB,UAAU,SAAS;AAAA,EACzC,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,cAAc,CAAC,UAAkB;AACrC,kBAAc,CAAC,eAAe;AAAA,MAC5B,GAAG;AAAA,MACH,CAAC,KAAK,GAAG,CAAC,UAAU,KAAK;AAAA,IAC3B,EAAE;AAAA,EACJ;AAEA,QAAM,kBAAkB,CAAC,QAAiB,kBACxC;AAAA,IACE;AAAA,IACA,YAAY;AAAA,IACZ,aACE;AAAA,IACF,UAAU;AAAA,IACV;AAAA,EACF;AAEF,QAAM,aAAa,CAAC,MAAmB,QAAgB;AACrD,UAAM,SAAS,aAAa,SAAS,UAAU,KAAK,IAAI;AAExD,WACE,8CAAC,SAAc,WAAU,sBAAqB,qBAAmB,KAAK,MACpE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,eAAe,IAAI;AAAA,QACzB,WAAW,oBAAoB,MAAM,SAAS;AAAA,QAC9C,WAAW;AAAA,QACX,WAAU;AAAA,QAEV;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,KAAK,QAAQ;AAAA,YACjB,WAAW,gBAAgB,QAAQ,KAAK,aAAa;AAAA,YACrD,gBAAc,SAAS,SAAS;AAAA,YAEhC;AAAA,4DAAC,mBAAgB,MAAM,KAAK,MAAM,WAAW,YAAY,aAAa;AAAA,cACtE;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM,KAAK;AAAA,kBACX;AAAA,kBACA,WAAW,YAAY;AAAA;AAAA,cACzB;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF,KAnBQ,GAoBV;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY,GAAG,iBAAiB,6BAA6B;AAAA,QAC7D;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,mBACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,WAAW;AAAA,YACb;AAAA,YAEC,yBACC;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,gBACJ,WAAU;AAAA,gBAEV,wDAAC,SAAI,KAAK,SAAS,KAAK,aAAa,WAAU,QAAO;AAAA;AAAA,YACxD,IAEA,8CAAC,SAAI,KAAK,SAAS,KAAK,aAAa,WAAU,QAAO;AAAA;AAAA,QAE1D;AAAA,QAGD,UACC,8CAAC,SAAI,WAAU,2EACZ,kBACH;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,WAAW;AAAA,cACT;AAAA,cACA,WAAW;AAAA,YACb;AAAA,YAEC,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,kBAAI,KAAK,UAAU;AACjB,sBAAM,YAAY,QAAQ,WAAW,KAAK,IAAI,CAAC;AAC/C,sBAAM,UAAU,iBAAiB,KAAK;AAEtC,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,qBAAmB,KAAK;AAAA,oBACxB,WAAW;AAAA,sBACT;AAAA,sBACA,YAAY,SAAS;AAAA,oBACvB;AAAA,oBAEA;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAM,eAAe,IAAI;AAAA,0BACzB,WAAW,oBAAoB,MAAM,SAAS;AAAA,0BAC9C,WAAW;AAAA,0BACX,WAAU;AAAA,0BAEV;AAAA,4BAAC;AAAA;AAAA,8BACC,MAAK;AAAA,8BACL,SAAS,MAAM,YAAY,KAAK,IAAI;AAAA,8BACpC,qBAAmB,KAAK;AAAA,8BACxB,iBAAe;AAAA,8BACf,iBAAe;AAAA,8BACf,WAAW;AAAA,gCACT,gBAAgB,OAAO,KAAK,aAAa;AAAA,gCACzC,CAAC,aAAa;AAAA,gCACd;AAAA,8BACF;AAAA,8BAEA;AAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,WAAW;AAAA,sCACT;AAAA,sCACA,YACI,4BACA;AAAA,oCACN;AAAA,oCAEC;AAAA,kDACC,8CAAC,UAAK,WAAU,2CACd,yDAAC,UAAK,WAAU,kCACd;AAAA,sFAAC,UAAK,WAAU,4BAA2B,eAAY,QAAO;AAAA,wCAC9D;AAAA,0CAAC;AAAA;AAAA,4CACC,MAAM,KAAK;AAAA,4CACX,WAAW,YAAY;AAAA;AAAA,wCACzB;AAAA,wCACA;AAAA,0CAAC;AAAA;AAAA,4CACC,WAAW;AAAA,8CACT;AAAA,8CACA,YAAY,eAAe;AAAA,4CAC7B;AAAA,4CACA,eAAY;AAAA,4CAEX;AAAA;AAAA,wCACH;AAAA,yCACF,GACF,IAEA,+CAAC,UAAK,WAAU,8CACd;AAAA;AAAA,0CAAC;AAAA;AAAA,4CACC,MAAM,KAAK;AAAA,4CACX,WAAW,YAAY;AAAA;AAAA,wCACzB;AAAA,wCACA;AAAA,0CAAC;AAAA;AAAA,4CACC,MAAM,KAAK;AAAA,4CACX,WAAW;AAAA,4CACX,WAAW,YAAY;AAAA;AAAA,wCACzB;AAAA,yCACF;AAAA,sCAED,aACC;AAAA,wCAAC;AAAA;AAAA,0CACC,MAAM,KAAK;AAAA,0CACX,WAAS;AAAA,0CACT,WAAW,YAAY;AAAA;AAAA,sCACzB;AAAA;AAAA;AAAA,gCAEJ;AAAA,gCACC,CAAC,aACA;AAAA,kCAAC;AAAA;AAAA,oCACC,WAAW;AAAA,sCACT;AAAA,sCACA,YAAY,eAAe;AAAA,oCAC7B;AAAA,oCACA,eAAY;AAAA,oCAEX;AAAA;AAAA,gCACH;AAAA;AAAA;AAAA,0BAEJ;AAAA;AAAA,sBACF;AAAA,sBACC,aACC;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAI;AAAA,0BACJ,MAAK;AAAA,0BACL,cAAY,KAAK;AAAA,0BACjB,WAAW;AAAA,4BACT,YACI,+EACA;AAAA,4BACJ,WAAW;AAAA,0BACb;AAAA,0BAEC,eAAK,SAAS,IAAI,CAAC,SAAS,aAAa;AACxC,gCAAI,QAAQ,WAAW;AACrB,oCAAM,mBAAmB,QAAQ;AACjC,qCACE;AAAA,gCAAC;AAAA;AAAA,kCAEC,WAAW;AAAA,oCACT;AAAA,oCACA,aAAa;AAAA,kCACf;AAAA,kCACA,qBAAmB,QAAQ;AAAA,kCAE3B;AAAA,kFAAC,oBAAiB;AAAA,oCACjB,aACC;AAAA,sCAAC;AAAA;AAAA,wCACC,MAAM,QAAQ;AAAA,wCACd,WAAS;AAAA,wCACT,WAAW,YAAY;AAAA;AAAA,oCACzB;AAAA;AAAA;AAAA,gCAbG,GAAG,KAAK,IAAI,QAAQ;AAAA,8BAe3B;AAAA,4BAEJ;AAEA,mCAAO,WAAW,SAAS,GAAG,KAAK,IAAI,QAAQ,EAAE;AAAA,0BACnD,CAAC;AAAA;AAAA,sBACH;AAAA;AAAA;AAAA,kBA5HG;AAAA,gBA8HP;AAAA,cAEJ;AAEA,kBAAI,KAAK,WAAW;AAClB,sBAAM,gBAAgB,KAAK;AAC3B,uBAAO,8CAAC,mBAAmB,KAAO;AAAA,cACpC;AAEA,qBAAO,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,YACvC,CAAC;AAAA;AAAA,QACH;AAAA,QACC,YAAY,QACX;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,aAAa;AAAA,YACf;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QAGF;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,aAAa,CAAC,SAAS;AAAA,YACtC,iBAAe,CAAC;AAAA,YAChB,cAAY,YAAY,mBAAmB;AAAA,YAC3C,WAAW;AAAA,cACT;AAAA,cACA,WAAW;AAAA,cACX,aAAa;AAAA,YACf;AAAA,YAEC,sBAAY,mBAAmB;AAAA;AAAA,QAClC;AAAA,QAEC,UACC,8CAAC,SAAI,WAAW,YAAY,UAAU,gCACnC,kBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AEvUM,IAAAC,uBAAA;AAzBN,IAAM,sBAAsB,CAAC,QAAQ,MAAM;AAE3C,SAAS,iBACP,SACA,YACA;AACA,SAAO,cAAc,YAAY;AACnC;AAEA,SAAS,gBACP,SACA,WACA;AACA,SAAO,aAAa,YAAY;AAClC;AAEA,SAAS,eAAe,EAAE,UAAU,GAA2B;AAC7D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,8CAA8C,SAAS;AAAA,MACrE,eAAY;AAAA,MACZ,OAAM;AAAA,MACN,MAAK;AAAA,MACL,SAAQ;AAAA,MAER,wDAAC,UAAK,GAAE,yMAAwM;AAAA;AAAA,EAClN;AAEJ;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT,UAAU,eAAe;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,aAAa;AAAA,EAC3B,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAAsB;AACpB,QAAM,YAAY,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,KAAK,EAAE,GAAG,CAAC,GAAG,UAAU;AACzE,UAAM,eAAe,iBAAiB,SAAS,UAAU;AACzD,UAAM,cAAc,gBAAgB,SAAS,SAAS;AAEtD,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,GAAG,6CAA6C,SAAS;AAAA,QACpE,OAAO,EAAE,mBAAmB,GAAG,MAAM;AAAA,QACpC,GAAG;AAAA,QAEH;AAAA,wBACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA;AAAA,UACF,IACE;AAAA,UACJ,+CAAC,SAAI,WAAW,GAAG,gCAAgC,gBAAgB,GAChE;AAAA,2BAAe,8CAAC,kBAAe,WAAW,iBAAiB,IAAK;AAAA,YACjE,8CAAC,SACE,gBAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,KAAK,EAAE,GAAG,CAACC,IAAG,cAC9C;AAAA,cAAC;AAAA;AAAA,gBAEC,YACE,WAAW,SAAS,KACpB,WAAW,WAAW,SAAS,CAAC,KAChC,oBAAoB,CAAC;AAAA,gBAEvB,WAAW;AAAA,gBACX,SAAS,cAAc;AAAA;AAAA,cAPlB;AAAA,YAQP,CACD,GACH;AAAA,aACF;AAAA,UACA,8CAAC,UAAK,WAAU,WAAW,mBAAQ;AAAA;AAAA;AAAA,MA9B9B;AAAA,IA+BP;AAAA,EAEJ,CAAC;AAED,SAAO,+EAAG,qBAAU;AACtB;;;AC3EM,IAAAC,uBAAA;AAjCC,SAAS,YAAY;AAAA,EAC1B,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,2BAA2B;AAC7B,GAAqB;AACnB,QAAM,WAAW,SAAS,QAAQ,SAAS,UAAa,SAAS;AACjE,QAAM,WAAW,WAAW,OAAO,IAAI,IAAI;AAC3C,QAAM,cAAc,aAAa,UAAU,SAAS;AACpD,QAAM,cAAc,gBAAgB;AACpC,QAAM,kBACJ,CAAC,eAAe,CAAC,YAAa,4BAA4B,CAAC;AAE7D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,GAAG,2BAA2B,SAAS;AAAA,MAClD;AAAA,MACA;AAAA,MACA,iBAAiB,kBAAkB,SAAY;AAAA,MAC/C,UAAU;AAAA,MAEV,wDAAC,UAAK,WAAW,GAAG,wCAAwC,aAAa,GACtE,uBACH;AAAA;AAAA,EACF;AAEJ;;;AC3CA,IAAAC,iBASO;AACP,IAAAC,0BAAkB;AAOd,IAAAC,uBAAA;AAFJ,SAAS,gBAAgB;AACvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,eAAW;AAAA,MAEX;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA;AAAA,QAChB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA;AAAA,QAChB;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,sBACP,cACA,WACiB;AACjB,MAAI,cAAc,UAAU,gBAAgB,QAAQ,iBAAiB,IAAI;AACvE,WAAO,iBAAiB,OAAO,YAAY,CAAC;AAAA,EAC9C;AACA,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,uBAAmB;AAAA,EAI9B,CACE;AAAA,IACE,OAAO;AAAA,IACP;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,kBAAkB,CAAC;AAAA,IACnB;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GACA,QACG;AACH,UAAM,oBAAoB,sBAAsB,cAAc,SAAS;AACvE,UAAM,CAAC,OAAO,QAAQ,QAAI,yBAA0B,iBAAiB;AACrE,UAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,UAAM,eAAW,uBAAyB,IAAI;AAC9C,UAAM,gBAAY,uBAA0B,IAAI;AAGhD,UAAM,wBAAoB,wBAA0B,MAAM;AACxD,UAAI,iBAAiB,cAAc,SAAS,GAAG;AAC7C,eAAO,cAAc,IAAI,CAAC,SAAS;AAAA,UACjC,OAAO,OAAO,IAAI,QAAQ,KAAK,EAAE;AAAA,UACjC,OAAO,OAAO,IAAI,QAAQ,KAAK,EAAE;AAAA,QACnC,EAAE;AAAA,MACJ;AACA,aAAO;AAAA,IACT,GAAG,CAAC,eAAe,iBAAiB,UAAU,QAAQ,CAAC;AAEvD,UAAM,aAAa,cAAc,cAAc,kBAAkB,SAAS;AAE1E,4CAAoB,KAAK,OAAO;AAAA,MAC9B,UAAU,MAAM;AAAA,MAChB,qBAAqB,MAAM;AAAA,MAC3B,kBAAkB,MAAM;AAAA,MACxB,SAAS,MAAM;AAAA,IACjB,EAAE;AAEF,kCAAU,MAAM;AACd,UAAI,YAAY;AACd,kBAAU,SAAS,MAAM;AACzB;AAAA,MACF;AACA,YAAM,KAAK,SAAS;AACpB,UAAI,CAAC,GAAI;AACT,SAAG,MAAM;AACT,UAAI,cAAc,QAAQ;AACxB,WAAG,OAAO;AAAA,MACZ;AAAA,IACF,GAAG,CAAC,YAAY,SAAS,CAAC;AAE1B,UAAM,aAAa,YAAY;AAC7B,UAAI,UAAW;AAEf,UAAI,OAAO,KAAK,MAAM,OAAO,iBAAiB,GAAG;AAC/C,oBAAY;AACZ;AAAA,MACF;AAEA,UAAI,CAAC,MAAM;AACT,gCAAAC,QAAM,MAAM,2BAA2B;AACvC;AAAA,MACF;AAEA,mBAAa,IAAI;AAEjB,YAAM,eACJ,cAAc,YAAY,UAAU,KAChC,WAAW,OAAO,KAAK,CAAC,IACxB;AAEN,YAAM,UAA2B;AAAA,QAC/B,cAAc;AAAA,QACd,eAAe;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAEA,UAAI;AACF,cAAM,OAAO,OAAO;AACpB,gCAAAA,QAAM,QAAQ,6BAA6B;AAC3C,oBAAY;AAAA,MACd,SAAS,OAAO;AACd,gBAAQ,MAAM,iBAAiB,KAAK;AACpC,cAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,gCAAAA,QAAM,MAAM,YAAY;AAAA,MAC1B,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,eAAe,MAAM;AACzB,eAAS,iBAAiB;AAC1B,kBAAY;AAAA,IACd;AAEA,UAAM,gBAAgB,CAAC,UAA+D;AACpF,UAAI,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAe;AACrB,mBAAW;AAAA,MACb,WAAW,MAAM,QAAQ,UAAU;AACjC,cAAM,eAAe;AACrB,qBAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,oBAAoB,CAAC,UAAyC;AAClE,UAAI,WAAW,MAAM,OAAO;AAC5B,UAAI,cAAc,UAAU;AAC1B,mBAAW,SAAS,QAAQ,aAAa,EAAE;AAAA,MAC7C;AACA,eAAS,QAAQ;AAAA,IACnB;AAEA,UAAM,uBAAuB,CAAC,UAA0C;AACtE,eAAS,MAAM,OAAO,KAAK;AAAA,IAC7B;AAEA,UAAM,iBACJ,aAAa,OAAO,KAAK,MAAM,OAAO,iBAAiB;AAEzD,UAAM,oBACJ;AAEF,UAAM,sBACJ;AAEF,UAAM,wBACJ;AAEF,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO;AAAA,QAEN;AAAA,uBACC;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,OAAO,OAAO,KAAK;AAAA,cACnB,UAAU;AAAA,cACV,WAAW;AAAA,cACX,WAAW,kBAAkB;AAAA,cAC7B,UAAU;AAAA,cAEV;AAAA,8DAAC,YAAO,OAAM,IAAG,UAAQ,MAAC,8BAE1B;AAAA,gBACC,kBAAkB,IAAI,CAAC,QACtB,8CAAC,YAAuB,OAAO,IAAI,OAChC,cAAI,SADM,IAAI,KAEjB,CACD;AAAA;AAAA;AAAA,UACH,IAEA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO,OAAO,KAAK;AAAA,cACnB,UAAU;AAAA,cACV,WAAW;AAAA,cACX,WAAW,kBAAkB;AAAA,cAC7B,aAAY;AAAA,cACZ,UAAU;AAAA;AAAA,UACZ;AAAA,UAGF;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,WAAW,wBAAwB,kBAAkB,SAAY;AAAA,cACjE,OAAO;AAAA,cACP,OAAM;AAAA,cAEL,sBACI,oBAAoB,8CAAC,iBAAc,IACnC,qBAAqB;AAAA;AAAA,UAC5B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,WAAW,0BAA0B,oBAAoB,SAAY;AAAA,cACrE,OAAO;AAAA,cACP,OAAM;AAAA,cAEL,iCAAuB;AAAA;AAAA,UAC1B;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;;;AC/Q/B,IAAAC,iBAAiC;AACjC,IAAAA,iBAAkB;AAElB,gBAAsC;AA2E9B,IAAAC,uBAAA;AAhED,SAAS,kBAAkC;AAAA,EAChD;AAAA,EACA,YAAY,aAAa;AAAA,EACzB,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAChB,GAAiC;AAC/B,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,kBAAc,uBAAoC,IAAI;AAE5D,QAAM,OAAO,MAAM,WAAW,IAAI;AAClC,QAAM,OAAO,MAAM;AACjB,eAAW,KAAK;AAChB,gBAAY,SAAS,KAAK;AAAA,EAC5B;AAEA,QAAM,UAAU,QAAQ;AAExB,QAAM,eAAe,CAAC,YAAoB,kBAAyB;AACjE,eAAW,YAAY,iBAAiB,SAAS,IAAI;AACrD,SAAK;AAAA,EACP;AAEA,QAAM,UACJ,OAAO,oBAAoB,aACvB,gBAAgB,YAAY,IAC5B;AAEN,QAAM,oBAAyC,cAC3C;AAAA,IACE,SAAS;AAAA,IACT,OAAO,CAAC,GAAG,GAAG;AAAA,IACd,aAAa;AAAA,EACf,IACA;AAAA,IACE;AAAA,IACA,gBAAgB;AAAA,EAClB;AAEJ,SACE,8CAAC,SAAI,WAAU,eACb;AAAA,IAAC,eAAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAS;AAAA,MACT,OAAO;AAAA,MACP,UAAU,MAAM,SAAS;AAAA,MACzB,aAAW;AAAA,MACX;AAAA,MACA,WAAU;AAAA,MACV,OAAM;AAAA,MACN,UAAS;AAAA,MACT,QAAQ,CAAC,GAAG,CAAC;AAAA,MACb,UAAU,CAAC,aAAa;AACtB,oBAAY,UAAU;AAAA,MACxB;AAAA,MACC,GAAG;AAAA,MACH,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,cAAc,SAAY,UAAU,OAAO;AAAA,UACpD,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,cAAY;AAAA,UAEX;AAAA,aAAC,aAAa;AAAA,YACf,8CAAC,cAAW,eAAW,MAAC;AAAA;AAAA;AAAA,MAC1B;AAAA;AAAA,EACF,GACF;AAEJ;;;AC5FA,IAAAC,aASO;AAIA,IAAM,8BACX;AAGK,IAAM,6BAA6B;AAEnC,IAAM,+BAA+B;AAErC,IAAM,wCAAuD;AAAA,EAClE,QAAQ;AACV;AAEO,IAAM,qBAAmE;AAAA,EAC9E,MAAM,EAAE,OAAO,QAAQ,MAAM,kBAAO;AAAA,EACpC,QAAQ,EAAE,OAAO,UAAU,MAAM,uBAAY,QAAQ,MAAM,eAAe,eAAe;AAAA,EACzF,MAAM,EAAE,OAAO,QAAQ,MAAM,iBAAM;AAAA,EACnC,OAAO,EAAE,OAAO,SAAS,MAAM,qBAAU;AAAA,EACzC,SAAS,EAAE,OAAO,WAAW,MAAM,qBAAU;AAAA,EAC7C,UAAU,EAAE,OAAO,YAAY,MAAM,sBAAW;AAAA,EAChD,SAAS,EAAE,OAAO,WAAW,MAAM,qBAAU;AAAA,EAC7C,SAAS,EAAE,OAAO,WAAW,MAAM,yBAAc;AACnD;;;ACOM,IAAAC,uBAAA;AAhCC,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,MAAM;AAAA,EACN,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,cAAc,WAAW;AAE/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA,cAAc,EAAE,GAAG,uCAAuC,GAAG,aAAa;AAAA,MAC1E,WAAW,YAAY,iBAAiB;AAAA,MAExC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA,cAAY;AAAA,UACZ,SAAS,CAAC,UAAU;AAClB,kBAAM,gBAAgB;AACtB,gBAAI,SAAU;AACd,oBAAQ;AAAA,UACV;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA,YACI,0CACA;AAAA,YACJ,WAAW,kCAAkC;AAAA,YAC7C,aAAa,CAAC,UAAU;AAAA,YACxB;AAAA,UACF;AAAA,UAEC;AAAA,mBACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,GAAG,YAAY,aAAa;AAAA,gBACvC,eAAW;AAAA,gBACX,MAAM;AAAA;AAAA,YACR,IACE;AAAA,YACH,YAAY,8CAAC,UAAK,WAAW,gBAAiB,iBAAM,IAAU;AAAA;AAAA;AAAA,MACjE;AAAA;AAAA,EACF;AAEJ;;;AC9DA,SAAS,SACP,MACA,MACS;AACT,MAAI,OAAO,SAAS,WAAY,QAAO,QAAQ,KAAK,IAAI,CAAC;AACzD,SAAO,QAAQ,IAAI;AACrB;AAEA,SAAS,YACP,MACA,WAC6B;AAC7B,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAO,mBAAmB,IAAI;AACpC,QAAM,QAAQ,YAAY,IAAI;AAC9B,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM;AAC7B;AAEO,SAAS,eACd,SACA,MACA,eACA,SAC2B;AAC3B,QAAM,OAAO,OAAO,YAAY,aAAa,QAAQ,IAAI,IAAI;AAE7D,SAAO,KAAK,QAAQ,CAAC,QAAyB,UAAU;AACtD,UAAM,OAAO,OAAO,QAAQ;AAC5B,UAAM,SAAS,YAAY,OAAO,QAAQ,OAAO;AACjD,UAAM,MAAM,OAAO,OAAO,OAAO,UAAU,UAAU,KAAK;AAC1D,UAAM,QAAQ,OAAO,SAAS,QAAQ,SAAS;AAE/C,QAAI,OAAO,cAAc,iBAAiB,CAAC,cAAc,OAAO,UAAU,GAAG;AAC3E,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,SAAS,OAAO,QAAQ,IAAI,GAAG;AACjC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UACJ,OAAO,YAAY,QACf,SACC,OAAO,YAAY,SAAS,YAAY,SAAY;AAE3D,UAAM,WAAoC;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,OAAO,QAAQ,QAAQ;AAAA,MAC7B,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,UAAU,SAAS,OAAO,UAAU,IAAI;AAAA,MACxC,QAAQ,OAAO,UAAU,QAAQ,UAAU;AAAA,MAC3C,WAAW,SAAS,OAAO,WAAW,IAAI;AAAA,MAC1C;AAAA,MACA,kBAAkB,OAAO;AAAA,MACzB,SAAS,OAAO;AAAA,MAChB,cAAc,OAAO,iBAAiB;AAAA,MACtC,WAAW,OAAO;AAAA,MAClB,eAAe,GAAG,QAAQ,eAAe,OAAO,aAAa,KAAK;AAAA,MAClE,gBAAgB,OAAO;AAAA,IACzB;AAEA,WAAO,CAAC,QAAQ;AAAA,EAClB,CAAC;AACH;;;ACIQ,IAAAC,uBAAA;AAtER,SAAS,UACP,QACA,MACA,MACA,YAAgD,mBAChD;AACA,MAAI,CAAC,OAAO,SAAS;AACnB,QAAI,OAAO,aAAc,QAAO;AAChC;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,OAAO,UAAU,IAAI;AAE3C,MAAI,OAAO,SAAS;AAClB,gBAAY,SAAS,OAAO,OAAO;AAAA,EACrC,OAAO;AACL,YAAQ;AAAA,EACV;AAEA,MAAI,OAAO,cAAc;AACvB,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,WAAW,eAAe,SAAS,MAAM,eAAe,OAAO;AAErE,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB;AAAA,IACzB,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,QAAM,oBAAoB,CACxB,QACA,MACA,YAAY,SACE;AACd,QAAI,OAAO,SAAS,WAAW;AAC7B,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAW,GAAG,yBAAyB,OAAO,SAAS;AAAA;AAAA,QAFlD,OAAO;AAAA,MAGd;AAAA,IAEJ;AAEA,QAAI,OAAO,SAAS;AAClB,aACE,8CAAC,SAAqB,WAAW,OAAO,WACrC,iBAAO,WADA,OAAO,GAEjB;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO,OAAO;AAAA,QACd,MAAM,OAAO;AAAA,QACb,UAAU,OAAO,YAAY;AAAA,QAC7B,eAAe,GAAG,mBAAmB,OAAO,aAAa;AAAA,QACzD,gBAAgB,GAAG,oBAAoB,OAAO,cAAc;AAAA,QAC5D,SAAS,OAAO;AAAA,QAChB,kBAAkB,OAAO,oBAAoB;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,UAAU,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf,WAAW,OAAO;AAAA,QAClB;AAAA,QACA,WAAW,GAAG,eAAe,OAAO,SAAS;AAAA,QAC7C,SAAS,MAAM,UAAU,QAAQ,MAAM,MAAM,SAAS;AAAA;AAAA,MAjBjD,OAAO;AAAA,IAkBd;AAAA,EAEJ;AAEA,QAAM,cAAc,CAAC,MAAmB,YAAY,SAClD,SAAS,IAAI,CAAC,WAAW;AACvB,UAAM,cAAc,kBAAkB,QAAQ,MAAM,SAAS;AAC7D,QAAI,CAAC,WAAY,QAAO;AACxB,WACE,8CAAC,SACE,qBAAW,QAAQ,EAAE,MAAM,MAAM,SAAS,MAAM,SAAY,YAAY,CAAC,KADlE,OAAO,GAEjB;AAAA,EAEJ,CAAC;AAEH,MAAI,SAAS,UAAU;AACrB,UAAM,cAAc,YAAY,QAAW,KAAK;AAChD,WACE,8CAAC,SAAI,WAAW,GAAG,iDAAiD,SAAS,GAC1E,uBACH;AAAA,EAEJ;AAEA,QAAM,qBACJ,mBAAmB,QAAQ,SAAY;AAEzC,QAAM,YAAY,CAAC,SAAgC;AACjD,UAAM,cACJ;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEC,sBAAY,MAAM,IAAI;AAAA;AAAA,IACzB;AAGF,QAAI,CAAC,WAAY,QAAO;AACxB,WAAO,WAAW;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,eAAe;AACjB,WACE,+EACG,wBAAc;AAAA,MACb;AAAA,MACA,SAAS;AAAA,MACT,MAAM,MAAM;AAAA,MACZ,aAAa,UAAU,MAAM,MAAS;AAAA,IACxC,CAAC,GACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,MACN,UAAU,CAAC;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,WAAU;AAAA,MAEV;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ,EAAE,KAAK;AAAA,UACf;AAAA,UACA,WAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,iBAAiB,CAAC,iBAChB,UAAU,MAAM,aAAa,OAAO,CAAC;AAAA;AAAA,MAEzC;AAAA;AAAA,EACF;AAEJ;;;AC9MA,IAAAC,iBAA+B;AAC/B,iBAAsD;AAkC9C,IAAAC,uBAAA;AA5BD,IAAM,qBAAwD,CAAC;AAAA,EACpE;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,cAAU,wBAAQ,MAAM;AAC5B,QAAI,aAAc,QAAO;AACzB,QAAI,MAAO,QAAO,cAAc,KAAK,EAAE;AACvC,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,MAAI,aAAa,CAAC,SAAS;AACzB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO,EAAE,UAAU;AAAA,QACnB,MAAK;AAAA,QACL,aAAU;AAAA,QACV,aAAU;AAAA,QAEV,wDAAC,UAAO,MAAK,QAAO;AAAA;AAAA,IACtB;AAAA,EAEJ;AAEA,MAAI,SAAS;AACX,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO,EAAE,UAAU;AAAA,QACnB,MAAK;AAAA,QACL,aAAU;AAAA,QAEV;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAM;AAAA,cACN,eAAW;AAAA;AAAA,UACb;AAAA,UACA,+CAAC,SAAI,WAAU,sBACb;AAAA,0DAAC,OAAE,WAAU,yCAAwC,iCAErD;AAAA,YACA,8CAAC,OAAE,WAAU,yBAAyB,mBAAQ;AAAA,aAChD;AAAA,UACC,WACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,QAAQ;AAAA,cACvB,UAAU;AAAA,cACV,WAAU;AAAA,cAEV;AAAA,8DAAC,6BAAe,WAAW,GAAG,aAAa,cAAc,GAAG;AAAA,gBAC3D,YAAY,gBAAgB;AAAA;AAAA;AAAA,UAC/B;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AAEA,SAAO,+EAAG,UAAS;AACrB;","names":["clsx","Swal","toast","import_react","import_react","import_jsx_runtime","import_react","import_react_router_dom","import_jsx_runtime","Select","import_react_router_dom","import_jsx_runtime","import_react","import_react_router_dom","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","BASE_STYLES","VARIANTS","import_jsx_runtime","import_jsx_runtime","import_react","import_react_router_dom","import_jsx_runtime","import_react","import_react_router_dom","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_","import_jsx_runtime","import_react","import_react_hot_toast","import_jsx_runtime","toast","import_react","import_jsx_runtime","Tippy","import_fa","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/cn.ts","../src/utils/resetPageParam.ts","../src/utils/format-date.ts","../src/utils/helpers.ts","../src/utils/localStorage.ts","../src/utils/permissions.ts","../src/utils/handleApiError.ts","../src/utils/createBaseQueryWithRetry.ts","../src/hooks/usePaginationUrlSync.ts","../src/hooks/useGridHeight.ts","../src/components/tabs/EztrakTabs.tsx","../src/components/pagination/CustomPagination.tsx","../src/components/search-filters/DropdownFilter.tsx","../src/components/search-filters/dropdownStyles.ts","../src/components/search-filters/ResetFiltersButton.tsx","../src/components/search-filters/SearchInput.tsx","../src/components/modal/Modal.tsx","../src/components/Loader/Loader.css","../src/components/Loader/Loader.tsx","../src/components/button/Button.tsx","../src/components/card/Card.tsx","../src/components/header/Header.tsx","../src/components/breadcrumbs/Breadcrumbs.tsx","../src/components/sidebar/Sidebar.tsx","../src/components/tooltip/ToolTip.tsx","../src/components/skeleton/CardSkeleton.tsx","../src/components/tooltip/TooltipText.tsx","../src/components/cell-editor/CustomCellEditor.tsx","../src/components/popup-cell-renderer/PopupCellRenderer.tsx","../src/components/row-actions/presets.ts","../src/components/row-actions/ActionMenuItem.tsx","../src/components/row-actions/resolveActions.ts","../src/components/row-actions/RowActions.tsx","../src/components/table-error-boundary/TableErrorBoundary.tsx"],"sourcesContent":["export * from \"./utils\";\r\nexport * from \"./hooks\";\r\nexport * from \"./components\";\r\n","import clsx from \"clsx\";\r\nimport { twMerge } from \"tailwind-merge\";\r\n\r\nexport function cn(...inputs: Parameters<typeof clsx>) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","/**\n * Sends pagination back to the first page after a filter changes the result set.\n *\n * Only touches `pageKey` when it is already present, so filter-only screens that\n * never paginate keep their URL clean. Mutates and returns `params` so it can be\n * chained inside a `setSearchParams((prev) => ...)` updater.\n */\nexport function resetPageParam(\n params: URLSearchParams,\n pageKey = \"page\",\n defaultPage = \"1\",\n) {\n if (params.has(pageKey)) {\n params.set(pageKey, defaultPage);\n }\n return params;\n}\n","export type DateUtcMode = \"preserve\" | \"local\";\r\n\r\nexport type FormatDateOptions = {\r\n pattern?: string;\r\n utc?: DateUtcMode;\r\n includeTime?: boolean;\r\n fallback?: string;\r\n};\r\n\r\ntype DateParts = {\r\n year: number;\r\n month: number;\r\n day: number;\r\n hours: number;\r\n minutes: number;\r\n seconds: number;\r\n};\r\n\r\nconst DEFAULT_DATE_FALLBACK = \"-\";\r\nconst DEFAULT_DATETIME_FALLBACK = \"Invalid Date\";\r\n\r\nconst pad2 = (n: number) => n.toString().padStart(2, \"0\");\r\n\r\nconst getParts = (date: Date, utc: DateUtcMode): DateParts => {\r\n if (utc === \"preserve\") {\r\n return {\r\n year: date.getUTCFullYear(),\r\n month: date.getUTCMonth() + 1,\r\n day: date.getUTCDate(),\r\n hours: date.getUTCHours(),\r\n minutes: date.getUTCMinutes(),\r\n seconds: date.getUTCSeconds(),\r\n };\r\n }\r\n return {\r\n year: date.getFullYear(),\r\n month: date.getMonth() + 1,\r\n day: date.getDate(),\r\n hours: date.getHours(),\r\n minutes: date.getMinutes(),\r\n seconds: date.getSeconds(),\r\n };\r\n};\r\n\r\nconst formatAmPmTime = (parts: DateParts): string => {\r\n const hour12 = parts.hours % 12 || 12;\r\n const ampm = parts.hours >= 12 ? \"PM\" : \"AM\";\r\n return `${hour12}:${pad2(parts.minutes)} ${ampm}`;\r\n};\r\n\r\nconst formatMmDdYy = (parts: DateParts): string =>\r\n `${pad2(parts.month)}/${pad2(parts.day)}/${String(parts.year).slice(-2)}`;\r\n\r\n/**\r\n * Apply a simple token pattern. Longer tokens first so `yyyy` wins over `yy`.\r\n * Supported: yyyy, yy, MM, dd, HH, hh, mm, ss, a\r\n */\r\nconst applyPattern = (pattern: string, parts: DateParts): string => {\r\n const hour12 = parts.hours % 12 || 12;\r\n const ampm = parts.hours >= 12 ? \"PM\" : \"AM\";\r\n const replacements: [string, string][] = [\r\n [\"yyyy\", String(parts.year)],\r\n [\"yy\", String(parts.year).slice(-2)],\r\n [\"MM\", pad2(parts.month)],\r\n [\"dd\", pad2(parts.day)],\r\n [\"HH\", pad2(parts.hours)],\r\n [\"hh\", pad2(hour12)],\r\n [\"mm\", pad2(parts.minutes)],\r\n [\"ss\", pad2(parts.seconds)],\r\n [\"a\", ampm],\r\n ];\r\n\r\n let result = \"\";\r\n let i = 0;\r\n while (i < pattern.length) {\r\n let matched = false;\r\n for (const [token, value] of replacements) {\r\n if (pattern.startsWith(token, i)) {\r\n result += value;\r\n i += token.length;\r\n matched = true;\r\n break;\r\n }\r\n }\r\n if (!matched) {\r\n result += pattern[i];\r\n i += 1;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\nconst parseDate = (dateString: string | null | undefined): Date | null => {\r\n if (dateString === null || dateString === undefined) return null;\r\n const date = new Date(dateString);\r\n if (isNaN(date.getTime())) return null;\r\n return date;\r\n};\r\n\r\nexport const formatDate = (\r\n dateString: string | null | undefined,\r\n options: FormatDateOptions = {}\r\n): string => {\r\n const {\r\n pattern,\r\n utc = \"local\",\r\n includeTime = false,\r\n fallback = DEFAULT_DATE_FALLBACK,\r\n } = options;\r\n\r\n const date = parseDate(dateString);\r\n if (!date) return fallback;\r\n\r\n const parts = getParts(date, utc);\r\n\r\n if (pattern) {\r\n return applyPattern(pattern, parts);\r\n }\r\n\r\n const datePart = formatMmDdYy(parts);\r\n if (!includeTime) return datePart;\r\n return `${datePart}, ${formatAmPmTime(parts)}`;\r\n};\r\n\r\nexport const formatDateTime = (\r\n dateString: string | null | undefined,\r\n options: FormatDateOptions = {}\r\n): string => {\r\n const {\r\n pattern,\r\n utc = \"local\",\r\n includeTime = true,\r\n fallback = DEFAULT_DATETIME_FALLBACK,\r\n } = options;\r\n\r\n const date = parseDate(dateString);\r\n if (!date) return fallback;\r\n\r\n if (pattern) {\r\n return applyPattern(pattern, getParts(date, utc));\r\n }\r\n\r\n const localeOptions: Intl.DateTimeFormatOptions = {\r\n year: \"numeric\",\r\n month: \"numeric\",\r\n day: \"numeric\",\r\n ...(includeTime\r\n ? {\r\n hour: \"numeric\",\r\n minute: \"numeric\",\r\n hour12: true,\r\n }\r\n : {}),\r\n ...(utc === \"preserve\" ? { timeZone: \"UTC\" } : {}),\r\n };\r\n\r\n return date.toLocaleString(\"en-US\", localeOptions);\r\n};\r\n","export const truncateText = (\r\n text: string | number | null | undefined,\r\n maxLength = 20\r\n): string => {\r\n if (text === null || text === undefined) return \"\";\r\n const value = String(text);\r\n if (value.length <= maxLength) {\r\n return value;\r\n }\r\n return value.slice(0, maxLength - 3) + \"...\";\r\n};\r\n\r\nexport const truncateFileName = (\r\n fileName: string | null | undefined,\r\n maxLength = 20\r\n): string => {\r\n if (!fileName) return \"\";\r\n if (fileName.length <= maxLength) {\r\n return fileName;\r\n }\r\n const extension = fileName.slice(fileName.lastIndexOf(\".\"));\r\n const truncatedName =\r\n fileName.slice(0, maxLength - extension.length - 3) + \"...\";\r\n return truncatedName + extension;\r\n};\r\n\r\nexport function getApiError(apiError: unknown): string {\r\n if (!apiError) return \"An unknown error occurred\";\r\n\r\n if (typeof apiError === \"string\") {\r\n return apiError;\r\n }\r\n\r\n const error = apiError as {\r\n response?: { data?: Record<string, unknown> };\r\n message?: string;\r\n };\r\n\r\n if (error.response?.data) {\r\n const responseData = error.response.data;\r\n\r\n if (typeof responseData === \"string\") {\r\n return responseData;\r\n }\r\n\r\n const errors = responseData.errors;\r\n if (errors && typeof errors === \"object\") {\r\n for (const key in errors) {\r\n const messages = (errors as Record<string, unknown>)[key];\r\n if (Array.isArray(messages) && messages.length > 0) {\r\n return String(messages[0]);\r\n }\r\n }\r\n }\r\n\r\n if (responseData.message) {\r\n return String(responseData.message);\r\n }\r\n\r\n if (responseData.title) {\r\n return String(responseData.title);\r\n }\r\n }\r\n\r\n if (error.message) {\r\n return error.message;\r\n }\r\n\r\n return \"An unknown error occurred\";\r\n}\r\n\r\nexport const normalizeApiListItems = (responseData: unknown): unknown[] => {\r\n if (responseData == null) return [];\r\n if (Array.isArray(responseData)) return responseData;\r\n\r\n const record = responseData as Record<string, unknown>;\r\n const data = record.data;\r\n\r\n if (\r\n data &&\r\n typeof data === \"object\" &&\r\n !Array.isArray(data) &&\r\n Array.isArray((data as { items?: unknown[] }).items)\r\n ) {\r\n return (data as { items: unknown[] }).items;\r\n }\r\n\r\n const returnModel = record.returnModel as { items?: unknown[] } | undefined;\r\n if (Array.isArray(returnModel?.items)) return returnModel.items;\r\n if (Array.isArray(data)) return data;\r\n if (typeof data === \"object\" && data !== null) {\r\n return [data];\r\n }\r\n return [];\r\n};\r\n\r\nexport function capitalizeText(name: string | null | undefined): string {\r\n if (!name) return \"\";\r\n return name\r\n .split(\" \")\r\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\r\n .join(\" \");\r\n}\r\n\r\nexport function toLowerCaseText(text: string | null | undefined): string {\r\n if (!text) return \"\";\r\n return text.toLowerCase();\r\n}\r\n\r\nexport {\r\n formatDate,\r\n formatDateTime,\r\n type DateUtcMode,\r\n type FormatDateOptions,\r\n} from \"./format-date\";\r\n\r\nexport const isEmpty = (obj: object): boolean => {\r\n return Object.keys(obj).length === 0;\r\n};\r\n\r\nexport const toDateInputValue = (date: string | Date | null | undefined): string => {\r\n if (!date) return \"\";\r\n\r\n let d: Date;\r\n\r\n if (typeof date === \"string\") {\r\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) {\r\n return date;\r\n }\r\n d = new Date(date);\r\n } else {\r\n d = new Date(date);\r\n }\r\n\r\n if (isNaN(d.getTime())) return \"\";\r\n\r\n const localDate = new Date(d.getTime() - d.getTimezoneOffset() * 60000);\r\n const year = localDate.getFullYear();\r\n const month = (localDate.getMonth() + 1).toString().padStart(2, \"0\");\r\n const day = localDate.getDate().toString().padStart(2, \"0\");\r\n\r\n return `${year}-${month}-${day}`;\r\n};\r\n\r\nexport function convertCommaDataToArray(data: string | null | undefined): string[] {\r\n if (!data || data.trim() === \"\") {\r\n return [];\r\n }\r\n return data.split(\",\").map((item) => item.trim());\r\n}\r\n\r\nexport function checkIfExistsInArray<T>(array: T[], searchValue: T): boolean {\r\n return array.includes(searchValue);\r\n}\r\n\r\nexport type CurrencyFormatterOptions = {\r\n currency?: string;\r\n locale?: string;\r\n hideSymbol?: boolean;\r\n minimumFractionDigits?: number;\r\n maximumFractionDigits?: number;\r\n};\r\n\r\nexport const currencyFormatter = (\r\n value: number | null | undefined,\r\n options?: CurrencyFormatterOptions,\r\n): string => {\r\n if (value == null) return \"\";\r\n\r\n const {\r\n currency = \"USD\",\r\n locale = \"en-US\",\r\n hideSymbol = false,\r\n minimumFractionDigits,\r\n maximumFractionDigits,\r\n } = options ?? {};\r\n\r\n const fractionDigits = {\r\n ...(minimumFractionDigits != null && { minimumFractionDigits }),\r\n ...(maximumFractionDigits != null && { maximumFractionDigits }),\r\n };\r\n\r\n if (hideSymbol) {\r\n return value.toLocaleString(locale, {\r\n minimumFractionDigits: minimumFractionDigits ?? 2,\r\n maximumFractionDigits: maximumFractionDigits ?? 2,\r\n });\r\n }\r\n\r\n return value.toLocaleString(locale, {\r\n style: \"currency\",\r\n currency,\r\n ...fractionDigits,\r\n });\r\n};\r\nexport const formatNumber = (number: number | string | null | undefined): string => {\r\n if (isNaN(Number(number)) || number === null || number === undefined) {\r\n return \"0\";\r\n }\r\n\r\n const formattedNumber = Number(number)\r\n .toString()\r\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n\r\n return formattedNumber;\r\n};\r\n\r\nexport const parseCurrencyValueToNumber = (value: unknown): number => {\r\n if (value == null || value === \"\") return 0;\r\n\r\n const raw =\r\n typeof value === \"object\" && value !== null && \"value\" in value\r\n ? (value as { value: unknown }).value\r\n : value;\r\n\r\n const stringValue = raw == null || raw === \"\" ? \"\" : String(raw);\r\n const numericValue = stringValue.replace(/[$,]/g, \"\");\r\n return parseFloat(numericValue) || 0;\r\n};\r\n\r\nexport function flattenTableData<T extends Record<string, unknown>>(\r\n data: T[] | null | undefined,\r\n columns: { field?: string }[] | null | undefined\r\n): T[] {\r\n if (!Array.isArray(data)) return [];\r\n return data.map((row) => {\r\n const flatRow = { ...row };\r\n (columns ?? []).forEach((col) => {\r\n const key = col.field;\r\n if (!key) return;\r\n if (key.includes(\".\")) {\r\n const value = key.split(\".\").reduce<unknown>(\r\n (acc, part) => (acc as Record<string, unknown> | undefined)?.[part],\r\n row\r\n );\r\n (flatRow as Record<string, unknown>)[key] = value ?? \"\";\r\n }\r\n });\r\n return flatRow;\r\n });\r\n}\r\n\r\nexport const getErrorMessages = (error: {\r\n data?: {\r\n errors?: Record<string, string[]>;\r\n title?: string;\r\n error?: { name?: string[] };\r\n };\r\n} | null | undefined): string => {\r\n if (error?.data?.errors) {\r\n return Object.values(error.data.errors).flat().join(\"\\n\");\r\n }\r\n return (\r\n error?.data?.title ??\r\n error?.data?.error?.name?.[0] ??\r\n \"Failed to save\"\r\n );\r\n};\r\n\r\nexport const getFieldsByCategory = <T extends { category?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields?.filter(({ category = \"\" }) => category === key);\r\n};\r\n\r\nexport const getFieldsByName = <T extends { name?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields.filter(({ name = \"\" }) => name === key);\r\n};\r\n\r\nexport const deserializeJson = <T = unknown>(jsonString: string): T | null => {\r\n try {\r\n return JSON.parse(jsonString) as T;\r\n } catch (error) {\r\n console.error(\"Error parsing JSON:\", error);\r\n return null;\r\n }\r\n};\r\n\r\nexport const removeByPropertyValues = <T extends Record<string, unknown>>(\r\n items: T[] = [],\r\n property: keyof T & string,\r\n values: unknown[] = [],\r\n { caseInsensitive = false }: { caseInsensitive?: boolean } = {}\r\n): T[] => {\r\n if (!Array.isArray(items) || !property) return Array.isArray(items) ? items : [];\r\n const normalize = (v: unknown) =>\r\n caseInsensitive && typeof v === \"string\" ? v.toLowerCase() : v;\r\n const valuesArr = Array.isArray(values) ? values : [values];\r\n const toRemove = new Set(valuesArr.map(normalize));\r\n return items.filter((item) => !toRemove.has(normalize(item?.[property])));\r\n};\r\n\r\nexport const getFieldsByInputType = <T extends { inputType?: string }>(\r\n fields: T[] = [],\r\n key: string\r\n): T[] => {\r\n return fields.filter(({ inputType = \"\" }) => inputType === key);\r\n};\r\n","export const USER_STATE_STORAGE_KEY = \"authState\";\r\n\r\nfunction getStorage(): Storage | null {\r\n if (typeof window === \"undefined\") return null;\r\n return window.localStorage;\r\n}\r\n\r\nexport function getItem<T>(key: string, fallback: T | null = null): T | null {\r\n try {\r\n const raw = getStorage()?.getItem(key);\r\n if (raw === null || raw === undefined) {\r\n return fallback;\r\n }\r\n return JSON.parse(raw) as T;\r\n } catch {\r\n return fallback;\r\n }\r\n}\r\n\r\nexport function setItem<T>(key: string, value: T): void {\r\n try {\r\n getStorage()?.setItem(key, JSON.stringify(value));\r\n } catch {\r\n // Ignore write errors (quota exceeded, private mode, etc.)\r\n }\r\n}\r\n\r\nexport function removeItem(key: string): void {\r\n try {\r\n getStorage()?.removeItem(key);\r\n } catch {\r\n // Ignore remove errors\r\n }\r\n}\r\n\r\nexport function loadUserState<T = unknown>(\r\n key: string = USER_STATE_STORAGE_KEY\r\n): T | undefined {\r\n const value = getItem<T | undefined>(key, undefined);\r\n return value === null ? undefined : value;\r\n}\r\n\r\nexport function saveUserState<T = unknown>(\r\n state: T,\r\n key: string = USER_STATE_STORAGE_KEY\r\n): void {\r\n setItem(key, state);\r\n}\r\n\r\n/** Task-aligned aliases */\r\nexport const get = getItem;\r\nexport const set = setItem;\r\n\r\n/** Backward-compatible aliases used in federation apps */\r\nexport const getItemFromLocalStorage = getItem;\r\nexport const storeItemInLocalStorage = setItem;\r\nexport const saveItemLocalStorage = setItem;\r\n","export interface PermissionRecord {\r\n moduleName: string;\r\n permission: string;\r\n permissionId: string | number;\r\n}\r\n\r\nexport type TransformedPermissions = Record<\r\n string,\r\n Record<string, string | number>\r\n>;\r\n\r\nexport function transformPermissions(\r\n permissions: PermissionRecord[]\r\n): TransformedPermissions {\r\n return permissions.reduce<TransformedPermissions>((acc, permission) => {\r\n const { moduleName, permission: perm, permissionId } = permission;\r\n\r\n if (!acc[moduleName]) {\r\n acc[moduleName] = {};\r\n }\r\n\r\n acc[moduleName][perm] = permissionId;\r\n\r\n return acc;\r\n }, {});\r\n}\r\n","import toast from \"react-hot-toast\";\r\nimport Swal, { type SweetAlertOptions, type SweetAlertResult } from \"sweetalert2\";\r\n\r\nexport type RtkQueryError = {\r\n status?: number | string;\r\n originalStatus?: number;\r\n data?: {\r\n errors?: Record<string, string[]>;\r\n message?: string;\r\n title?: string;\r\n };\r\n message?: string;\r\n error?: string;\r\n};\r\n\r\nexport interface HandleApiErrorOptions {\r\n showAlert?: boolean;\r\n fallbackMessage?: string;\r\n}\r\n\r\nexport type ErrorSuggestedAction =\r\n | \"retry\"\r\n | \"refresh\"\r\n | \"contact-support\"\r\n | \"none\";\r\n\r\nexport type ErrorClassification = {\r\n isRetryable: boolean;\r\n userMessage: string;\r\n technicalMessage: string;\r\n suggestedAction: ErrorSuggestedAction;\r\n};\r\n\r\n/** Returns true for transient network/server errors that warrant automatic retry. */\r\nexport function isRetryableError(\r\n error: RtkQueryError | null | undefined\r\n): boolean {\r\n if (!error) return false;\r\n\r\n const status = error.status ?? error.originalStatus;\r\n\r\n if (\r\n status === \"FETCH_ERROR\" ||\r\n status === \"TIMEOUT_ERROR\" ||\r\n status === \"PARSING_ERROR\"\r\n ) {\r\n return true;\r\n }\r\n\r\n if (typeof status === \"number\") {\r\n if (status === 502 || status === 503 || status === 504) return true;\r\n if (status >= 500 && status < 600) return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/** Classifies RTK Query errors for user messaging and retry guidance. */\r\nexport function classifyError(\r\n error: RtkQueryError | null | undefined\r\n): ErrorClassification {\r\n if (!error) {\r\n return {\r\n isRetryable: false,\r\n userMessage: \"An error occurred.\",\r\n technicalMessage: \"Unknown error\",\r\n suggestedAction: \"none\",\r\n };\r\n }\r\n\r\n const status = error.status ?? error.originalStatus;\r\n const data = error.data;\r\n\r\n if (\r\n status === \"FETCH_ERROR\" ||\r\n status === \"TIMEOUT_ERROR\" ||\r\n status === \"PARSING_ERROR\"\r\n ) {\r\n return {\r\n isRetryable: true,\r\n userMessage: \"Network error. Please check your connection.\",\r\n technicalMessage: \"Network request failed\",\r\n suggestedAction: \"retry\",\r\n };\r\n }\r\n\r\n if (typeof status === \"number\" && status >= 500 && status < 600) {\r\n return {\r\n isRetryable: true,\r\n userMessage: \"Server is temporarily unavailable. Please try again.\",\r\n technicalMessage: `Server error: ${status}`,\r\n suggestedAction: \"retry\",\r\n };\r\n }\r\n\r\n return {\r\n isRetryable: false,\r\n userMessage:\r\n data?.message ||\r\n data?.title ||\r\n error.error ||\r\n \"An error occurred. Please try again.\",\r\n technicalMessage:\r\n typeof status === \"number\" || typeof status === \"string\"\r\n ? `Client error: ${status}`\r\n : \"Request failed\",\r\n suggestedAction: \"none\",\r\n };\r\n}\r\n\r\nexport function formatValidationErrorsHtml(\r\n errors: Record<string, string[]>\r\n): string {\r\n const items = Object.keys(errors).flatMap((field) =>\r\n (errors[field] || []).map((msg) => `<li>${msg}</li>`)\r\n );\r\n return `\r\n <div style=\"text-align:left\">\r\n <p>Please review and correct the following:</p>\r\n <ul style=\"margin:8px 0 0 16px; list-style:disc;\">\r\n ${items.join(\"\")}\r\n </ul>\r\n </div>\r\n `;\r\n}\r\n\r\nfunction showValidationAlert(html: string): void {\r\n void Swal.fire({\r\n title: \"Validation errors\",\r\n html,\r\n icon: \"error\",\r\n confirmButtonText: \"OK\",\r\n showCancelButton: false,\r\n confirmButtonColor: \"#FF7335\",\r\n });\r\n}\r\n\r\n/** Handles RTK Query errors with built-in toast.error or SweetAlert (when showAlert is true). */\r\nexport function handleApiError(\r\n error: RtkQueryError | null | undefined,\r\n { showAlert = false, fallbackMessage }: HandleApiErrorOptions = {}\r\n): void {\r\n if (!error) return;\r\n\r\n const status = error.status ?? error.originalStatus;\r\n const data = error.data;\r\n\r\n if (status === 200) {\r\n return;\r\n }\r\n\r\n if (data?.errors && typeof data.errors === \"object\") {\r\n const errors = data.errors;\r\n\r\n if (showAlert) {\r\n showValidationAlert(formatValidationErrorsHtml(errors));\r\n } else {\r\n Object.keys(errors).forEach((field) => {\r\n (errors[field] || []).forEach((errorMessage) => {\r\n toast.error(errorMessage);\r\n });\r\n });\r\n }\r\n return;\r\n }\r\n\r\n if (status === 404) {\r\n return;\r\n }\r\n\r\n const message =\r\n fallbackMessage ||\r\n data?.message ||\r\n data?.title ||\r\n error.error ||\r\n error.message ||\r\n \"An error occurred. Please try again.\";\r\n\r\n toast.error(message);\r\n}\r\n\r\nconst BRAND_ORANGE = \"#FF7335\";\r\nconst DANGER_RED = \"#DC2626\";\r\nconst DANGER_ICON_BG = \"#FEE2E2\";\r\nconst CANCEL_BG = \"#ffffff\";\r\nconst CANCEL_TEXT = \"#374151\";\r\nconst CONFIRM_STYLE_ID = \"eztrak-confirm-alert-styles\";\r\n\r\nexport type ConfirmationAlertVariant = \"brand\" | \"danger\";\r\n\r\nexport interface ConfirmationAlertOptions {\r\n title?: string;\r\n text?: string;\r\n html?: string;\r\n /** Body HTML when `html` is not set. String only (not React nodes). */\r\n children?: string;\r\n icon?: \"warning\" | \"info\" | \"question\" | \"error\" | \"success\";\r\n /** Custom icon markup. When set, replaces SweetAlert's default icon content. */\r\n iconHtml?: string;\r\n iconColor?: string;\r\n iconBgColor?: string;\r\n showIcon?: boolean;\r\n confirmButtonText?: string;\r\n cancelButtonText?: string;\r\n confirmButtonColor?: string;\r\n cancelButtonColor?: string;\r\n confirmButtonTextColor?: string;\r\n cancelButtonTextColor?: string;\r\n showCancelButton?: boolean;\r\n showLoaderOnConfirm?: boolean;\r\n /** Type exactly — trimmed, case-sensitive. */\r\n inputExpectedValue?: string;\r\n inputPlaceholder?: string;\r\n reverseButtons?: boolean;\r\n focusCancel?: boolean;\r\n zIndex?: number;\r\n width?: string | number;\r\n /** Card corner radius. Default `1rem`. Number = px. */\r\n borderRadius?: string | number;\r\n /** Confirm/cancel button corner radius. Default `0.5rem`. Number = px. */\r\n buttonBorderRadius?: string | number;\r\n /** Typed-input margin. Number = px. Bottom default `1.25rem`; other sides default `0`. */\r\n inputMarginTop?: string | number;\r\n inputMarginRight?: string | number;\r\n inputMarginBottom?: string | number;\r\n inputMarginLeft?: string | number;\r\n /** `danger` = delete look; `brand` = orange confirm. Explicit options win. */\r\n variant?: ConfirmationAlertVariant;\r\n customClass?: SweetAlertOptions[\"customClass\"];\r\n onCancel?: () => void;\r\n}\r\n\r\nfunction cssSize(value: string | number | undefined, fallback: string): string {\r\n if (value === undefined) return fallback;\r\n return typeof value === \"number\" ? `${value}px` : value;\r\n}\r\n\r\n/** Reusable icon markup — override via `iconHtml`. */\r\nexport const DEFAULT_CONFIRM_ICONS = {\r\n warning: `\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n <path d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z\" />\r\n </svg>\r\n `.trim(),\r\n} as const;\r\n\r\ntype VariantDefaults = Partial<\r\n Pick<\r\n ConfirmationAlertOptions,\r\n | \"title\"\r\n | \"confirmButtonText\"\r\n | \"confirmButtonColor\"\r\n | \"confirmButtonTextColor\"\r\n | \"cancelButtonColor\"\r\n | \"cancelButtonTextColor\"\r\n | \"iconColor\"\r\n | \"iconBgColor\"\r\n | \"iconHtml\"\r\n | \"showLoaderOnConfirm\"\r\n | \"icon\"\r\n >\r\n>;\r\n\r\nconst VARIANT_DEFAULTS: Record<ConfirmationAlertVariant, VariantDefaults> = {\r\n brand: {\r\n confirmButtonText: \"Yes\",\r\n confirmButtonColor: BRAND_ORANGE,\r\n confirmButtonTextColor: \"#ffffff\",\r\n cancelButtonColor: CANCEL_BG,\r\n cancelButtonTextColor: CANCEL_TEXT,\r\n iconColor: BRAND_ORANGE,\r\n iconBgColor: \"#FFEDD5\",\r\n iconHtml: DEFAULT_CONFIRM_ICONS.warning,\r\n icon: \"warning\",\r\n },\r\n danger: {\r\n title: \"Delete this item\",\r\n confirmButtonText: \"Yes, delete it!\",\r\n confirmButtonColor: DANGER_RED,\r\n confirmButtonTextColor: \"#ffffff\",\r\n cancelButtonColor: CANCEL_BG,\r\n cancelButtonTextColor: CANCEL_TEXT,\r\n iconColor: DANGER_RED,\r\n iconBgColor: DANGER_ICON_BG,\r\n iconHtml: DEFAULT_CONFIRM_ICONS.warning,\r\n icon: \"warning\",\r\n showLoaderOnConfirm: true,\r\n },\r\n};\r\n\r\nfunction ensureConfirmAlertStyles(): void {\r\n if (typeof document === \"undefined\") return;\r\n if (document.getElementById(CONFIRM_STYLE_ID)) return;\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = CONFIRM_STYLE_ID;\r\n style.textContent = `\r\n .ez-confirm-popup {\r\n border-radius: var(--ez-confirm-radius, 1rem) !important;\r\n padding: 1.5rem !important;\r\n max-width: 24rem !important;\r\n width: var(--ez-confirm-width, 100%) !important;\r\n box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25) !important;\r\n }\r\n .ez-confirm-title {\r\n font-size: 1.125rem !important;\r\n font-weight: 600 !important;\r\n color: #111827 !important;\r\n margin: 0 0 0.25rem !important;\r\n padding: 0 !important;\r\n }\r\n .ez-confirm-html {\r\n font-size: 0.875rem !important;\r\n color: #6b7280 !important;\r\n margin: 0 0 1.5rem !important;\r\n }\r\n .ez-confirm-icon {\r\n border: none !important;\r\n background: var(--ez-confirm-icon-bg, #fee2e2) !important;\r\n color: var(--ez-confirm-icon-color, #dc2626) !important;\r\n width: 3rem !important;\r\n height: 3rem !important;\r\n margin: 0 auto 1rem !important;\r\n border-radius: 9999px !important;\r\n }\r\n .ez-confirm-icon .swal2-icon-content {\r\n font-size: inherit !important;\r\n display: flex !important;\r\n align-items: center !important;\r\n justify-content: center !important;\r\n color: inherit !important;\r\n }\r\n .ez-confirm-actions {\r\n width: 100% !important;\r\n margin: 0 !important;\r\n gap: 0.75rem !important;\r\n }\r\n .ez-confirm-confirm,\r\n .ez-confirm-cancel {\r\n flex: 1 1 0 !important;\r\n margin: 0 !important;\r\n border-radius: var(--ez-confirm-btn-radius, 0.5rem) !important;\r\n font-size: 0.875rem !important;\r\n font-weight: 500 !important;\r\n padding: 0.625rem 1rem !important;\r\n box-shadow: none !important;\r\n }\r\n .ez-confirm-confirm {\r\n background: var(--ez-confirm-confirm-bg, #ff7335) !important;\r\n color: var(--ez-confirm-confirm-fg, #fff) !important;\r\n border: none !important;\r\n }\r\n .ez-confirm-confirm:hover {\r\n filter: brightness(0.95);\r\n }\r\n .ez-confirm-cancel {\r\n background: var(--ez-confirm-cancel-bg, #fff) !important;\r\n color: var(--ez-confirm-cancel-fg, #374151) !important;\r\n border: 1px solid #d1d5db !important;\r\n }\r\n .ez-confirm-cancel:hover {\r\n background: #f9fafb !important;\r\n }\r\n .ez-confirm-popup .swal2-input {\r\n margin-top: var(--ez-confirm-input-mt, 0) !important;\r\n margin-right: var(--ez-confirm-input-mr, 0) !important;\r\n margin-bottom: var(--ez-confirm-input-mb, 1.25rem) !important;\r\n margin-left: var(--ez-confirm-input-ml, 0) !important;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\nfunction pick<T>(\r\n explicit: T | undefined,\r\n fromVariant: T | undefined,\r\n fallback: T\r\n): T {\r\n if (explicit !== undefined) return explicit;\r\n if (fromVariant !== undefined) return fromVariant;\r\n return fallback;\r\n}\r\n\r\nfunction mergeCustomClass(\r\n base: NonNullable<SweetAlertOptions[\"customClass\"]>,\r\n extra?: SweetAlertOptions[\"customClass\"]\r\n): SweetAlertOptions[\"customClass\"] {\r\n if (!extra || typeof extra !== \"object\") return base;\r\n const merged: Record<string, string> = { ...(base as Record<string, string>) };\r\n for (const [key, value] of Object.entries(extra)) {\r\n if (typeof value === \"string\" && value) {\r\n merged[key] = merged[key] ? `${merged[key]} ${value}` : value;\r\n }\r\n }\r\n return merged;\r\n}\r\n\r\nfunction getConfirmErrorMessage(error: unknown): string {\r\n if (error && typeof error === \"object\") {\r\n const err = error as {\r\n message?: string;\r\n data?: { message?: string; title?: string };\r\n };\r\n return (\r\n err.data?.message ||\r\n err.data?.title ||\r\n err.message ||\r\n \"Something went wrong. Please try again.\"\r\n );\r\n }\r\n return \"Something went wrong. Please try again.\";\r\n}\r\n\r\nexport function confirmationAlert(\r\n onConfirm: () => void | Promise<void>,\r\n options: ConfirmationAlertOptions = {}\r\n): void {\r\n ensureConfirmAlertStyles();\r\n\r\n const variant = options.variant ?? \"brand\";\r\n const vd = VARIANT_DEFAULTS[variant];\r\n\r\n const inputExpectedValue = options.inputExpectedValue;\r\n const hasInput = Boolean(inputExpectedValue);\r\n\r\n const title = pick(\r\n options.title,\r\n vd.title,\r\n hasInput ? \"Confirmation Required\" : \"Delete this item\"\r\n );\r\n const text = options.text;\r\n const html = options.html ?? options.children;\r\n const icon = pick(options.icon, vd.icon, \"warning\" as const);\r\n const iconHtml = pick(options.iconHtml, vd.iconHtml, undefined);\r\n const iconColor = pick(options.iconColor, vd.iconColor, BRAND_ORANGE);\r\n const iconBgColor = pick(options.iconBgColor, vd.iconBgColor, \"#FFEDD5\");\r\n const showIcon = options.showIcon !== false;\r\n const confirmButtonText = pick(options.confirmButtonText, vd.confirmButtonText, \"Yes\");\r\n const cancelButtonText = options.cancelButtonText ?? \"Cancel\";\r\n const confirmButtonColor = pick(\r\n options.confirmButtonColor,\r\n vd.confirmButtonColor,\r\n BRAND_ORANGE\r\n );\r\n const cancelButtonColor = pick(\r\n options.cancelButtonColor,\r\n vd.cancelButtonColor,\r\n CANCEL_BG\r\n );\r\n const confirmButtonTextColor = pick(\r\n options.confirmButtonTextColor,\r\n vd.confirmButtonTextColor,\r\n \"#ffffff\"\r\n );\r\n const cancelButtonTextColor = pick(\r\n options.cancelButtonTextColor,\r\n vd.cancelButtonTextColor,\r\n CANCEL_TEXT\r\n );\r\n const showCancelButton = options.showCancelButton !== false;\r\n const showLoaderOnConfirm = pick(\r\n options.showLoaderOnConfirm,\r\n vd.showLoaderOnConfirm,\r\n false\r\n );\r\n const inputPlaceholder =\r\n options.inputPlaceholder ?? \"Type confirmation text to proceed\";\r\n // Cancel left, Confirm right (matches gallery delete card)\r\n const reverseButtons = options.reverseButtons ?? false;\r\n const focusCancel = options.focusCancel;\r\n const zIndex = options.zIndex;\r\n const width = options.width;\r\n const borderRadius = cssSize(options.borderRadius, \"1rem\");\r\n const buttonBorderRadius = cssSize(options.buttonBorderRadius, \"0.5rem\");\r\n const inputMarginTop = cssSize(options.inputMarginTop, \"0\");\r\n const inputMarginRight = cssSize(options.inputMarginRight, \"0\");\r\n const inputMarginBottom = cssSize(options.inputMarginBottom, \"1.25rem\");\r\n const inputMarginLeft = cssSize(options.inputMarginLeft, \"0\");\r\n const onCancel = options.onCancel;\r\n\r\n const useLoader = showLoaderOnConfirm || hasInput;\r\n\r\n const inputHtml =\r\n html ??\r\n (hasInput\r\n ? `\r\n ${text ? `<p style=\"margin-bottom: 15px;\">${text}</p>` : \"\"}\r\n <p style=\"margin-bottom: 10px; font-weight: bold; color: #666;\">\r\n Please type \"<span style=\"color: ${BRAND_ORANGE}; font-weight: bold;\">${inputExpectedValue}</span>\" to confirm:\r\n </p>\r\n `\r\n : undefined);\r\n\r\n const baseCustomClass = {\r\n popup: \"ez-confirm-popup\",\r\n title: \"ez-confirm-title\",\r\n htmlContainer: \"ez-confirm-html\",\r\n actions: \"ez-confirm-actions\",\r\n confirmButton: \"ez-confirm-confirm\",\r\n cancelButton: \"ez-confirm-cancel\",\r\n icon: \"ez-confirm-icon\",\r\n };\r\n\r\n const swalOptions: SweetAlertOptions = {\r\n title,\r\n showCancelButton,\r\n confirmButtonText,\r\n cancelButtonText,\r\n confirmButtonColor,\r\n cancelButtonColor,\r\n reverseButtons,\r\n focusCancel,\r\n customClass: mergeCustomClass(baseCustomClass, options.customClass),\r\n allowOutsideClick: () => !Swal.isLoading(),\r\n allowEscapeKey: () => !Swal.isLoading(),\r\n didOpen: () => {\r\n const popup = Swal.getPopup();\r\n if (popup) {\r\n popup.style.setProperty(\"--ez-confirm-confirm-bg\", confirmButtonColor);\r\n popup.style.setProperty(\"--ez-confirm-confirm-fg\", confirmButtonTextColor);\r\n popup.style.setProperty(\"--ez-confirm-cancel-bg\", cancelButtonColor);\r\n popup.style.setProperty(\"--ez-confirm-cancel-fg\", cancelButtonTextColor);\r\n popup.style.setProperty(\"--ez-confirm-icon-color\", iconColor);\r\n popup.style.setProperty(\"--ez-confirm-icon-bg\", iconBgColor);\r\n popup.style.setProperty(\"--ez-confirm-radius\", borderRadius);\r\n popup.style.setProperty(\"--ez-confirm-btn-radius\", buttonBorderRadius);\r\n popup.style.setProperty(\"--ez-confirm-input-mt\", inputMarginTop);\r\n popup.style.setProperty(\"--ez-confirm-input-mr\", inputMarginRight);\r\n popup.style.setProperty(\"--ez-confirm-input-mb\", inputMarginBottom);\r\n popup.style.setProperty(\"--ez-confirm-input-ml\", inputMarginLeft);\r\n if (width != null) {\r\n popup.style.setProperty(\r\n \"--ez-confirm-width\",\r\n typeof width === \"number\" ? `${width}px` : String(width)\r\n );\r\n }\r\n }\r\n if (zIndex == null) return;\r\n const container = Swal.getContainer();\r\n if (container) container.style.zIndex = String(zIndex);\r\n },\r\n };\r\n\r\n if (showIcon) {\r\n swalOptions.icon = icon;\r\n if (iconHtml) {\r\n swalOptions.iconHtml = iconHtml;\r\n }\r\n }\r\n\r\n if (hasInput) {\r\n swalOptions.html = inputHtml;\r\n swalOptions.input = \"text\";\r\n swalOptions.inputPlaceholder = inputPlaceholder;\r\n swalOptions.inputValidator = (value: string) => {\r\n if (!value?.trim()) return \"You need to enter the confirmation text!\";\r\n if (value.trim() !== inputExpectedValue!.trim()) {\r\n return `Please type \"${inputExpectedValue}\" exactly as shown!`;\r\n }\r\n return null;\r\n };\r\n } else if (html) {\r\n swalOptions.html = html;\r\n } else {\r\n swalOptions.text = text;\r\n }\r\n\r\n if (useLoader) {\r\n swalOptions.showLoaderOnConfirm = true;\r\n swalOptions.preConfirm = (inputValue: string) => {\r\n if (hasInput && inputValue?.trim() !== inputExpectedValue!.trim()) {\r\n Swal.showValidationMessage(\r\n `Please type \"${inputExpectedValue}\" exactly as shown!`\r\n );\r\n return false;\r\n }\r\n return Promise.resolve()\r\n .then(() => onConfirm())\r\n .catch((error) => {\r\n Swal.showValidationMessage(getConfirmErrorMessage(error));\r\n throw error;\r\n });\r\n };\r\n }\r\n\r\n void Swal.fire(swalOptions).then((result: SweetAlertResult) => {\r\n if (result.isConfirmed && !useLoader) {\r\n void Promise.resolve(onConfirm());\r\n return;\r\n }\r\n if (result.isDismissed) {\r\n onCancel?.();\r\n }\r\n });\r\n}\r\n","import { retry } from \"@reduxjs/toolkit/query\";\r\nimport type { BaseQueryFn } from \"@reduxjs/toolkit/query\";\r\nimport { isRetryableError, type RtkQueryError } from \"./handleApiError\";\r\n\r\nexport type CreateBaseQueryWithRetryOptions = {\r\n maxRetries?: number;\r\n maxBackoffMs?: number;\r\n};\r\n\r\nfunction getRequestMethod(args: unknown): string {\r\n if (typeof args === \"string\") return \"GET\";\r\n if (args && typeof args === \"object\" && \"method\" in args) {\r\n const method = (args as { method?: string }).method;\r\n return (method || \"GET\").toUpperCase();\r\n }\r\n return \"GET\";\r\n}\r\n\r\n/**\r\n * Wraps an authenticated baseQuery with RTK Query retry for GET requests only.\r\n * Retries transient network/server errors with exponential backoff.\r\n */\r\nexport function createBaseQueryWithRetry(\r\n baseQueryWithReauth: BaseQueryFn,\r\n {\r\n maxRetries = 3,\r\n maxBackoffMs = 8000,\r\n }: CreateBaseQueryWithRetryOptions = {}\r\n): BaseQueryFn {\r\n const retryableQuery = retry(\r\n async (args, api, extraOptions) => {\r\n const result = await baseQueryWithReauth(args, api, extraOptions);\r\n\r\n if (result.error && !isRetryableError(result.error as RtkQueryError)) {\r\n retry.fail(result.error);\r\n }\r\n\r\n return result;\r\n },\r\n {\r\n maxRetries,\r\n backoff: (attempt: number) =>\r\n new Promise((resolve) =>\r\n setTimeout(resolve, Math.min(1000 * 2 ** attempt, maxBackoffMs))\r\n ),\r\n }\r\n );\r\n\r\n const baseQueryWithConditionalRetry: BaseQueryFn = async (\r\n args,\r\n api,\r\n extraOptions\r\n ) => {\r\n const method = getRequestMethod(args);\r\n if (method !== \"GET\") {\r\n return baseQueryWithReauth(args, api, extraOptions);\r\n }\r\n return retryableQuery(args, api, extraOptions);\r\n };\r\n\r\n return baseQueryWithConditionalRetry;\r\n}\r\n","import { useEffect } from \"react\";\nimport type { SetURLSearchParams } from \"react-router-dom\";\n\nexport const usePaginationUrlSync = (\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParams,\n page: number,\n setPage: (page: number) => void,\n perPage: number,\n setPerPage: (perPage: number) => void,\n defaultPage = 1,\n defaultPerPage = 20\n) => {\n useEffect(() => {\n const currentUrlPage = parseInt(searchParams.get(\"page\") ?? \"\") || defaultPage;\n const currentUrlPerPage =\n parseInt(searchParams.get(\"perPage\") ?? \"\") || defaultPerPage;\n const hasPageParam = searchParams.has(\"page\");\n const hasPerPageParam = searchParams.has(\"perPage\");\n\n if (!hasPageParam || !hasPerPageParam) {\n const newParams = new URLSearchParams(searchParams);\n\n if (!hasPageParam) {\n newParams.set(\"page\", defaultPage.toString());\n }\n\n if (!hasPerPageParam) {\n newParams.set(\"perPage\", defaultPerPage.toString());\n }\n\n setSearchParams(newParams, { replace: true });\n return;\n }\n\n if (currentUrlPage !== page) {\n setPage(currentUrlPage);\n }\n\n if (currentUrlPerPage !== perPage) {\n setPerPage(currentUrlPerPage);\n }\n }, [\n searchParams,\n setSearchParams,\n page,\n setPage,\n perPage,\n setPerPage,\n defaultPage,\n defaultPerPage,\n ]);\n};\n","import { useEffect, useState } from \"react\";\n\nexport interface UseGridHeightOptions {\n height?: string;\n headerId?: string;\n footerId?: string;\n offset?: number;\n}\n\nexport const useGridHeight = ({\n height,\n headerId = \"layout-header\",\n footerId = \"layout-footer\",\n offset = 390,\n}: UseGridHeightOptions = {}) => {\n const [gridHeight, setGridHeight] = useState(height || \"300px\");\n\n useEffect(() => {\n if (height) {\n setGridHeight(height);\n return;\n }\n\n const calculateHeight = () => {\n const header = document.getElementById(headerId);\n const footer = document.getElementById(footerId);\n\n const headerHeight = header ? header.offsetHeight : 0;\n const footerHeight = footer ? footer.offsetHeight : 0;\n const totalHeight = window.innerHeight;\n\n const remainingHeight = totalHeight - headerHeight - footerHeight - offset;\n setGridHeight(`${remainingHeight}px`);\n };\n\n calculateHeight();\n window.addEventListener(\"resize\", calculateHeight);\n return () => window.removeEventListener(\"resize\", calculateHeight);\n }, [height, headerId, footerId, offset]);\n\n return gridHeight;\n};\n","import {\r\n useCallback,\r\n useEffect,\r\n useId,\r\n useRef,\r\n useState,\r\n type KeyboardEvent,\r\n} from \"react\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { EztrakTab, EztrakTabsProps } from \"./types\";\r\n\r\nfunction getInitialTabId(\r\n tabs: EztrakTab[],\r\n defaultTabId?: string\r\n): string | undefined {\r\n if (defaultTabId && tabs.some((t) => t.id === defaultTabId && !t.disabled)) {\r\n return defaultTabId;\r\n }\r\n return tabs.find((t) => !t.disabled)?.id;\r\n}\r\n\r\nfunction getEnabledTabIds(tabs: EztrakTab[]): string[] {\r\n return tabs.filter((t) => !t.disabled).map((t) => t.id);\r\n}\r\n\r\nexport function EztrakTabs({\r\n tabs,\r\n activeTab,\r\n defaultTabId,\r\n onTabChange,\r\n showPanels = true,\r\n keepMounted = false,\r\n classNames,\r\n className,\r\n}: EztrakTabsProps) {\r\n const baseId = useId().replace(/:/g, \"\");\r\n const isControlled = activeTab !== undefined && activeTab !== null;\r\n const [uncontrolledActive, setUncontrolledActive] = useState(() =>\r\n getInitialTabId(tabs, defaultTabId)\r\n );\r\n const tabRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\r\n\r\n const displayActive = isControlled ? activeTab : uncontrolledActive;\r\n\r\n useEffect(() => {\r\n if (isControlled) return;\r\n const enabledIds = getEnabledTabIds(tabs);\r\n if (!displayActive || !enabledIds.includes(displayActive)) {\r\n const next = getInitialTabId(tabs, defaultTabId);\r\n if (next !== displayActive) {\r\n setUncontrolledActive(next);\r\n }\r\n }\r\n }, [tabs, defaultTabId, isControlled, displayActive]);\r\n\r\n const handleTabClick = useCallback(\r\n (tabId: string, disabled?: boolean) => {\r\n if (disabled) return;\r\n if (!isControlled) {\r\n setUncontrolledActive(tabId);\r\n }\r\n onTabChange?.(tabId);\r\n },\r\n [isControlled, onTabChange]\r\n );\r\n\r\n const focusTab = useCallback((tabId: string) => {\r\n tabRefs.current.get(tabId)?.focus();\r\n }, []);\r\n\r\n const handleListKeyDown = useCallback(\r\n (event: KeyboardEvent<HTMLUListElement>) => {\r\n const enabledIds = getEnabledTabIds(tabs);\r\n if (enabledIds.length === 0) return;\r\n\r\n const currentIndex = displayActive\r\n ? enabledIds.indexOf(displayActive)\r\n : -1;\r\n let nextIndex = currentIndex;\r\n\r\n switch (event.key) {\r\n case \"ArrowRight\":\r\n case \"ArrowDown\":\r\n event.preventDefault();\r\n nextIndex =\r\n currentIndex < 0\r\n ? 0\r\n : (currentIndex + 1) % enabledIds.length;\r\n break;\r\n case \"ArrowLeft\":\r\n case \"ArrowUp\":\r\n event.preventDefault();\r\n nextIndex =\r\n currentIndex < 0\r\n ? enabledIds.length - 1\r\n : (currentIndex - 1 + enabledIds.length) % enabledIds.length;\r\n break;\r\n case \"Home\":\r\n event.preventDefault();\r\n nextIndex = 0;\r\n break;\r\n case \"End\":\r\n event.preventDefault();\r\n nextIndex = enabledIds.length - 1;\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n const nextId = enabledIds[nextIndex];\r\n if (nextId) {\r\n handleTabClick(nextId);\r\n focusTab(nextId);\r\n }\r\n },\r\n [tabs, displayActive, handleTabClick, focusTab]\r\n );\r\n\r\n if (!tabs.length) {\r\n return null;\r\n }\r\n\r\n const wrapperClass = cn(\r\n \"eztrak-tabs-wrapper\",\r\n classNames?.wrapper,\r\n className\r\n );\r\n\r\n return (\r\n <div className={wrapperClass}>\r\n <div className={cn(\"eztrak-tabs-container\", classNames?.container)}>\r\n <nav\r\n className={cn(\"eztrak-tabs-nav\", classNames?.nav)}\r\n aria-label=\"Tabs\"\r\n >\r\n <ul\r\n role=\"tablist\"\r\n className={cn(\"eztrak-tabs-list\", classNames?.list)}\r\n onKeyDown={handleListKeyDown}\r\n >\r\n {tabs.map((tab) => {\r\n const isActive = displayActive === tab.id;\r\n const tabId = `${baseId}-tab-${tab.id}`;\r\n const panelId = `${baseId}-panel-${tab.id}`;\r\n\r\n return (\r\n <li\r\n key={tab.id}\r\n role=\"presentation\"\r\n className={cn(\r\n \"eztrak-tabs-item\",\r\n isActive && \"eztrak-tabs-item-active\",\r\n classNames?.item,\r\n isActive && classNames?.itemActive\r\n )}\r\n >\r\n <button\r\n ref={(el) => {\r\n if (el) {\r\n tabRefs.current.set(tab.id, el);\r\n } else {\r\n tabRefs.current.delete(tab.id);\r\n }\r\n }}\r\n type=\"button\"\r\n role=\"tab\"\r\n id={tabId}\r\n aria-selected={isActive}\r\n aria-controls={showPanels ? panelId : undefined}\r\n tabIndex={isActive ? 0 : -1}\r\n disabled={tab.disabled}\r\n className={cn(\r\n \"eztrak-tabs-button\",\r\n isActive && \"eztrak-tabs-button-active\",\r\n classNames?.button,\r\n isActive && classNames?.buttonActive\r\n )}\r\n onClick={() => handleTabClick(tab.id, tab.disabled)}\r\n >\r\n {tab.icon ? (\r\n <span\r\n className={cn(\"eztrak-tabs-icon\", classNames?.icon)}\r\n aria-hidden\r\n >\r\n {tab.icon}\r\n </span>\r\n ) : null}\r\n <span\r\n className={cn(\"eztrak-tabs-label\", classNames?.label)}\r\n >\r\n {tab.label}\r\n </span>\r\n {isActive ? (\r\n <span\r\n className={cn(\r\n \"eztrak-tabs-underline\",\r\n classNames?.underline\r\n )}\r\n aria-hidden\r\n />\r\n ) : null}\r\n </button>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </nav>\r\n\r\n {showPanels ? (\r\n <div className={cn(\"eztrak-tabs-content\", classNames?.content)}>\r\n {tabs.map((tab) => {\r\n const isActive = displayActive === tab.id;\r\n const panelId = `${baseId}-panel-${tab.id}`;\r\n const tabId = `${baseId}-tab-${tab.id}`;\r\n\r\n if (!keepMounted && !isActive) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n key={tab.id}\r\n id={panelId}\r\n role=\"tabpanel\"\r\n aria-labelledby={tabId}\r\n hidden={!isActive}\r\n className={cn(\"eztrak-tabs-panel\", classNames?.panel)}\r\n >\r\n {tab.content}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n ) : null}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { type ChangeEvent, type ReactNode } from \"react\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { confirmationAlert } from \"../../utils/handleApiError\";\r\nimport type {\r\n CustomPaginationProps,\r\n ResetColumnsButtonProps,\r\n TableLayoutToolbarControlsProps,\r\n} from \"./types\";\r\n\r\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 30, 50, 100];\r\nconst ALL_PAGES_VALUE = -1;\r\n\r\nfunction padCount(num: number) {\r\n return num.toString().padStart(2, \"0\");\r\n}\r\n\r\nfunction RefreshIcon({\r\n size = 14,\r\n className,\r\n}: {\r\n size?: number;\r\n className?: string;\r\n}) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n className={className}\r\n >\r\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\r\n <path d=\"M21 3v5h-5\" />\r\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\r\n <path d=\"M8 16H3v5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ResetColumnsButton({\r\n onReset,\r\n disabled = false,\r\n isLoading = false,\r\n}: ResetColumnsButtonProps) {\r\n const handleClick = () => {\r\n confirmationAlert(onReset, {\r\n text: \"Reset column order, widths, and visibility to defaults?\",\r\n icon: \"warning\",\r\n title: \"Reset column layout to default\",\r\n });\r\n };\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={handleClick}\r\n disabled={disabled || isLoading}\r\n title=\"Reset column layout to default\"\r\n className=\"inline-flex items-center gap-1.5 rounded-xl border border-primary-150 bg-white px-3 py-1.5 text-sm font-medium text-primary-150 hover:bg-gray-50 focus:outline-none disabled:hover:bg-white\"\r\n >\r\n <RefreshIcon size={14} className={cn(isLoading ? \"animate-spin\" : \"\")} />\r\n Reset columns\r\n </button>\r\n );\r\n}\r\n\r\nexport function TableLayoutToolbarControls({\r\n layoutStatus = {},\r\n onResetLayout,\r\n renderResetControl,\r\n isLoading = false,\r\n}: TableLayoutToolbarControlsProps) {\r\n const { isLayoutLoading, isLayoutSaving, isLayoutResetting } = layoutStatus;\r\n const isLayoutBusy = isLayoutLoading || isLayoutSaving || isLayoutResetting;\r\n\r\n return (\r\n <div className=\"flex items-center gap-3\">\r\n {onResetLayout &&\r\n (renderResetControl ? (\r\n renderResetControl(onResetLayout)\r\n ) : (\r\n <ResetColumnsButton\r\n onReset={onResetLayout}\r\n disabled={isLayoutBusy}\r\n isLoading={isLoading}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nexport function CustomPagination({\r\n paginationData,\r\n paginationPageSize,\r\n pageSizeOptions: pageSizeOptionsProp,\r\n isLoading = false,\r\n paramNames,\r\n onPageChange,\r\n onPageSizeChange,\r\n onResetLayout,\r\n renderResetControl,\r\n layoutStatus,\r\n showAllPagesOption = false,\r\n classNames,\r\n className,\r\n}: CustomPaginationProps) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const pageKey = paramNames?.page ?? \"page\";\r\n const perPageKey = paramNames?.perPage ?? \"perPage\";\r\n const pageSizeOptions =\r\n pageSizeOptionsProp ?? paginationPageSize ?? DEFAULT_PAGE_SIZE_OPTIONS;\r\n const perPageParam = searchParams.get(perPageKey);\r\n const perPageNumber =\r\n perPageParam !== null && perPageParam !== \"\"\r\n ? parseInt(perPageParam, 10)\r\n : NaN;\r\n const isShowingAll = perPageNumber === ALL_PAGES_VALUE;\r\n\r\n const currentPage = paginationData\r\n ? Math.max(0, paginationData.currentPage - 1)\r\n : 0;\r\n\r\n const handlePageChange = (pageNumber: number) => {\r\n if (\r\n !paginationData ||\r\n pageNumber < 0 ||\r\n pageNumber >= paginationData.pageCount\r\n ) {\r\n return;\r\n }\r\n\r\n const safePage = Math.max(\r\n 1,\r\n Math.min(pageNumber + 1, paginationData.pageCount)\r\n );\r\n const newParams = new URLSearchParams(searchParams);\r\n newParams.set(pageKey, String(safePage));\r\n setSearchParams(newParams, { replace: true });\r\n onPageChange?.(safePage);\r\n };\r\n\r\n const handlePageSizeChange = (event: ChangeEvent<HTMLSelectElement>) => {\r\n const parsed = parseInt(event.target.value, 10);\r\n if (\r\n !Number.isFinite(parsed) ||\r\n (parsed < 1 && parsed !== ALL_PAGES_VALUE)\r\n ) {\r\n return;\r\n }\r\n\r\n const newParams = new URLSearchParams(searchParams);\r\n newParams.set(pageKey, \"1\");\r\n newParams.set(perPageKey, String(parsed));\r\n setSearchParams(newParams, { replace: true });\r\n onPageSizeChange?.(parsed);\r\n };\r\n\r\n const createPageButtons = () => {\r\n const buttons: ReactNode[] = [];\r\n const maxButtons = 5;\r\n const totalPages = Math.max(1, paginationData?.pageCount ?? 1);\r\n\r\n let startPage = Math.max(0, currentPage - Math.floor(maxButtons / 2));\r\n let endPage = Math.min(totalPages - 1, startPage + maxButtons - 1);\r\n\r\n if (endPage - startPage + 1 < maxButtons) {\r\n startPage = Math.max(0, endPage - maxButtons + 1);\r\n }\r\n\r\n if (startPage > 0) {\r\n buttons.push(\r\n <button\r\n key=\"1\"\r\n type=\"button\"\r\n onClick={() => handlePageChange(0)}\r\n aria-label=\"Page 1\"\r\n className={cn(\r\n \"px-3 py-2 text-sm text-gray-600 hover:text-blue-600 hover:bg-blue-50 rounded-md transition-colors\",\r\n classNames?.pageButton\r\n )}\r\n >\r\n 1\r\n </button>\r\n );\r\n\r\n if (startPage > 1) {\r\n buttons.push(\r\n <span\r\n key=\"ellipsis1\"\r\n aria-hidden=\"true\"\r\n className=\"px-2 py-2 text-gray-400\"\r\n >\r\n ...\r\n </span>\r\n );\r\n }\r\n }\r\n\r\n for (let i = startPage; i <= endPage; i++) {\r\n const isActive = currentPage === i;\r\n buttons.push(\r\n <button\r\n key={i + 1}\r\n type=\"button\"\r\n onClick={() => handlePageChange(i)}\r\n aria-label={`Page ${i + 1}`}\r\n aria-current={isActive ? \"page\" : undefined}\r\n className={cn(\r\n \"px-3 py-2 text-sm rounded-md transition-colors\",\r\n isActive\r\n ? cn(\"bg-gray-400 text-white\", classNames?.activePageButton)\r\n : cn(\r\n \"text-gray-600 hover:text-gray-600 hover:bg-gray-50\",\r\n classNames?.pageButton\r\n )\r\n )}\r\n >\r\n {i + 1}\r\n </button>\r\n );\r\n }\r\n\r\n if (endPage < totalPages - 1) {\r\n if (endPage < totalPages - 2) {\r\n buttons.push(\r\n <span\r\n key=\"ellipsis2\"\r\n aria-hidden=\"true\"\r\n className=\"px-2 py-2 text-gray-400\"\r\n >\r\n ...\r\n </span>\r\n );\r\n }\r\n\r\n buttons.push(\r\n <button\r\n key={totalPages}\r\n type=\"button\"\r\n onClick={() => handlePageChange(totalPages - 1)}\r\n aria-label={`Page ${totalPages}`}\r\n className={cn(\r\n \"px-3 py-2 text-sm text-gray-600 hover:text-gray-600 hover:bg-gray-50 rounded-md transition-colors\",\r\n classNames?.pageButton\r\n )}\r\n >\r\n {totalPages}\r\n </button>\r\n );\r\n }\r\n\r\n return buttons;\r\n };\r\n\r\n if (isLoading || !paginationData) {\r\n return (\r\n <div className=\"flex items-center justify-center p-6 bg-gray-50\">\r\n <span className=\"text-gray-500\">\r\n {isLoading ? \"Loading...\" : \"No pagination data\"}\r\n </span>\r\n </div>\r\n );\r\n }\r\n\r\n const effectiveSizeOptions =\r\n paginationData.perPage > 0 &&\r\n !pageSizeOptions.includes(paginationData.perPage)\r\n ? [...pageSizeOptions, paginationData.perPage].sort((a, b) => a - b)\r\n : pageSizeOptions;\r\n\r\n const selectValue = isShowingAll\r\n ? ALL_PAGES_VALUE\r\n : paginationData.perPage ||\r\n (Number.isFinite(perPageNumber) && perPageNumber > 0\r\n ? perPageNumber\r\n : 10);\r\n\r\n const startItem =\r\n paginationData.totalCount === 0\r\n ? 0\r\n : (paginationData.currentPage - 1) * paginationData.perPage + 1;\r\n const endItem = Math.min(\r\n startItem + paginationData.perPage - 1,\r\n paginationData.totalCount\r\n );\r\n\r\n const { isLayoutLoading, isLayoutSaving, isLayoutResetting } =\r\n layoutStatus ?? {};\r\n const isLayoutBusy =\r\n isLayoutLoading || isLayoutSaving || isLayoutResetting;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center justify-between pb-4\",\r\n className,\r\n classNames?.root\r\n )}\r\n >\r\n <div className={cn(\"flex-1\", classNames?.info)}>\r\n <span className=\"text-xs font-medium text-neutral-400\">\r\n {isShowingAll\r\n ? `Showing All ${paginationData.totalCount ?? 0} Results`\r\n : `Showing ${padCount(startItem)} - ${padCount(endItem)} of ${paginationData.totalCount ?? 0} results`}\r\n </span>\r\n </div>\r\n\r\n <nav\r\n aria-label=\"Pagination\"\r\n className={cn(\"flex items-center space-x-1\", classNames?.nav)}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => handlePageChange(currentPage - 1)}\r\n disabled={currentPage === 0 || isShowingAll}\r\n className=\"p-2 text-gray-400 hover:text-gray-600 disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\r\n aria-label=\"Previous page\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M10.7 2.3a1 1 0 0 1 0 1.4L6.4 8l4.3 4.3a1 1 0 1 1-1.4 1.4l-5-5a1 1 0 0 1 0-1.4l5-5a1 1 0 0 1 1.4 0z\" />\r\n </svg>\r\n </button>\r\n\r\n <div className=\"flex items-center space-x-1\">\r\n {isShowingAll ? (\r\n <span className=\"px-3 py-2 text-sm text-gray-400\" aria-hidden=\"true\">\r\n All\r\n </span>\r\n ) : (\r\n createPageButtons()\r\n )}\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => handlePageChange(currentPage + 1)}\r\n disabled={\r\n currentPage >= paginationData.pageCount - 1 || isShowingAll\r\n }\r\n className=\"p-2 text-gray-400 hover:text-gray-600 disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\r\n aria-label=\"Next page\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M5.3 13.7a1 1 0 0 1 0-1.4L9.6 8 5.3 3.7a1 1 0 0 1 1.4-1.4l5 5a1 1 0 0 1 0 1.4l-5 5a1 1 0 0 1-1.4 0z\" />\r\n </svg>\r\n </button>\r\n </nav>\r\n\r\n <div className=\"flex-1 flex justify-end\">\r\n <div className=\"flex items-center gap-3\">\r\n {onResetLayout &&\r\n (renderResetControl ? (\r\n renderResetControl(onResetLayout)\r\n ) : (\r\n <ResetColumnsButton\r\n onReset={onResetLayout}\r\n disabled={isLayoutBusy}\r\n isLoading={isLoading}\r\n />\r\n ))}\r\n <div className=\"flex items-center space-x-2\">\r\n <label\r\n htmlFor=\"pagination-per-page\"\r\n className=\"text-sm text-gray-600\"\r\n >\r\n Items per page\r\n </label>\r\n <select\r\n id=\"pagination-per-page\"\r\n value={selectValue}\r\n onChange={handlePageSizeChange}\r\n className={cn(\r\n \"px-3 py-1.5 text-sm border border-gray-300 rounded-md bg-white text-gray-700 hover:border-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors\",\r\n classNames?.select\r\n )}\r\n >\r\n {showAllPagesOption && (\r\n <option value={ALL_PAGES_VALUE}>All</option>\r\n )}\r\n {effectiveSizeOptions.map((option) => (\r\n <option key={option} value={option}>\r\n {option}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default CustomPagination;\r\n","import { useEffect, useRef } from \"react\";\r\nimport Select from \"react-select\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { dropdownStyles } from \"./dropdownStyles\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { resetPageParam } from \"../../utils/resetPageParam\";\r\nimport {\r\n getItemFromLocalStorage,\r\n removeItem,\r\n storeItemInLocalStorage,\r\n} from \"../../utils/localStorage\";\r\nimport type { DropdownFilterProps } from \"./types\";\r\n\r\nexport function DropdownFilter<Option extends Record<string, unknown>>({\r\n name,\r\n valueKey = \"id\",\r\n options,\r\n placeholder,\r\n borderRadius = \"12px\",\r\n className,\r\n isClearable = true,\r\n isSearchable = true,\r\n isDisabled = false,\r\n isLoading = false,\r\n saveToLocalStorage = false,\r\n pageParam = \"page\",\r\n ...otherProps\r\n}: DropdownFilterProps<Option>) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const hasRestoredFromStorage = useRef(false);\r\n\r\n useEffect(() => {\r\n if (!saveToLocalStorage || hasRestoredFromStorage.current) return;\r\n hasRestoredFromStorage.current = true;\r\n\r\n if (searchParams.get(name)) return;\r\n\r\n const stored = getItemFromLocalStorage<string>(name);\r\n if (stored != null && stored !== \"\") {\r\n setSearchParams((prev) => {\r\n prev.set(name, String(stored));\r\n // Restoring a stored filter narrows the result set too, so a deep-linked\r\n // page number would land out of range.\r\n return resetPageParam(prev, pageParam);\r\n });\r\n }\r\n }, [saveToLocalStorage, name, pageParam, searchParams, setSearchParams]);\r\n\r\n const currentValue = searchParams.get(name);\r\n const selectedOption = currentValue\r\n ? options?.find(\r\n (option) => option[valueKey]?.toString() === currentValue,\r\n ) ?? null\r\n : null;\r\n\r\n const handleChange = (selected: Option | null) => {\r\n const selectedValue =\r\n selected && selected[valueKey] !== \"\" ? String(selected[valueKey]) : null;\r\n\r\n setSearchParams((prev) => {\r\n // Re-selecting the current option leaves the result set alone, so keep the\r\n // page the user is on.\r\n if ((prev.get(name) ?? \"\") === (selectedValue ?? \"\")) {\r\n return prev;\r\n }\r\n\r\n if (!selectedValue) {\r\n prev.delete(name);\r\n } else {\r\n prev.set(name, selectedValue);\r\n }\r\n\r\n return resetPageParam(prev, pageParam);\r\n });\r\n\r\n if (saveToLocalStorage) {\r\n if (selectedValue) {\r\n storeItemInLocalStorage(name, selectedValue);\r\n } else {\r\n removeItem(name);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <div className={cn(className)}>\r\n <Select<Option, false>\r\n placeholder={placeholder ?? `Select ${name}`}\r\n value={selectedOption}\r\n onChange={handleChange}\r\n options={options}\r\n isClearable={isClearable}\r\n isSearchable={isSearchable}\r\n isDisabled={isDisabled}\r\n isLoading={isLoading}\r\n getOptionValue={(option) => String(option[valueKey] ?? \"\")}\r\n getOptionLabel={(option) =>\r\n String(option.label ?? option.name ?? option[valueKey] ?? \"\")\r\n }\r\n styles={dropdownStyles<Option>(borderRadius)}\r\n {...otherProps}\r\n />\r\n </div>\r\n );\r\n}\r\n","import type { StylesConfig } from \"react-select\";\r\n\r\nconst themeColors = {\r\n primary: \"#FF7335\",\r\n primaryHover: \"#E65C2E\",\r\n lightBackground: \"#FFF3EB\",\r\n textColor: \"black\",\r\n white: \"white\",\r\n};\r\n\r\nexport\r\n const dropdownStyles = <Option,>(\r\n _borderRadius: string\r\n): StylesConfig<Option, false> => ({\r\n control: (provided, state) => ({\r\n ...provided,\r\n fontSize: \"14px\",\r\n padding: \"4px 8px\",\r\n minWidth: \"180px\",\r\n borderRadius: _borderRadius,\r\n cursor: \"pointer\",\r\n borderColor: state.isFocused ? themeColors.primary : \"#e0e0e0\",\r\n boxShadow: state.isFocused\r\n ? \"0 0 0 2px rgba(255, 115, 53, 0.3)\"\r\n : \"none\",\r\n \"&:hover\": {\r\n borderColor: themeColors.primary,\r\n },\r\n transition: \"border-color 0.2s, box-shadow 0.2s\",\r\n zIndex: 50,\r\n }),\r\n option: (provided, state) => ({\r\n ...provided,\r\n fontSize: \"14px\",\r\n backgroundColor: state.isSelected\r\n ? themeColors.primary\r\n : state.isFocused\r\n ? themeColors.lightBackground\r\n : themeColors.white,\r\n borderRadius: \"5px\",\r\n cursor: \"pointer\",\r\n borderColor: state.isFocused ? themeColors.primary : \"#e0e0e0\",\r\n color: state.isSelected\r\n ? themeColors.white\r\n : state.isFocused\r\n ? themeColors.primary\r\n : themeColors.textColor,\r\n \"&:hover\": {\r\n backgroundColor: themeColors.lightBackground,\r\n color: themeColors.primary,\r\n },\r\n \"&:active\": {\r\n backgroundColor: themeColors.primary,\r\n color: themeColors.white,\r\n },\r\n transition: \"background-color 0.2s, color 0.2s\",\r\n zIndex: 50,\r\n }),\r\n singleValue: (provided) => ({\r\n ...provided,\r\n color: themeColors.textColor,\r\n zIndex: 50,\r\n }),\r\n menu: (provided) => ({\r\n ...provided,\r\n borderRadius: \"5px\",\r\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\r\n marginTop: \"4px\",\r\n zIndex: 50,\r\n }),\r\n dropdownIndicator: (provided) => ({\r\n ...provided,\r\n color: themeColors.primary,\r\n \"&:hover\": {\r\n color: themeColors.primaryHover,\r\n },\r\n zIndex: 50,\r\n }),\r\n indicatorSeparator: () => ({\r\n display: \"none\",\r\n }),\r\n});\r\n","import { useSearchParams } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type {\r\n ResetFiltersButtonProps,\r\n ResetFiltersButtonVariant,\r\n} from \"./types\";\r\n\r\nconst BASE_STYLES =\r\n \"inline-flex items-center gap-1.5 px-5 py-3 rounded-md text-sm font-medium transition-colors duration-200 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50\";\r\n\r\nconst VARIANTS: Record<ResetFiltersButtonVariant, string> = {\r\n primary:\r\n \"bg-white text-secondary border border-secondary hover:bg-lightGray hover:text-black\",\r\n \"primary-outline\":\r\n \"bg-white text-primary-150 border border-primary-150 font-bold hover:bg-primary-100 hover:text-white\",\r\n \"primary-fill\":\r\n \"bg-primary-150 text-white border border-primary-150 hover:bg-primary/90\",\r\n secondary:\r\n \"bg-primary-150 text-white border border-primary-150 hover:bg-primary/90\",\r\n danger: \"bg-red-600 text-white border border-red-600 hover:bg-red-700\",\r\n outline: \"bg-white text-primary border border-primary hover:bg-primary/10\",\r\n ghost:\r\n \"bg-transparent text-secondary border border-transparent hover:bg-primary/10\",\r\n};\r\n\r\nfunction ResetIcon({\r\n size = 16,\r\n className,\r\n}: {\r\n size?: number;\r\n className?: string;\r\n}) {\r\n return (\r\n <svg\r\n width={size}\r\n height={size}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n aria-hidden=\"true\"\r\n className={className}\r\n >\r\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\r\n <path d=\"M21 3v5h-5\" />\r\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\r\n <path d=\"M8 16H3v5\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ResetFiltersButton({\r\n label = \"Reset Filters\",\r\n showLabel = true,\r\n icon,\r\n variant = \"primary-outline\",\r\n className,\r\n onReset,\r\n disabled = false,\r\n}: ResetFiltersButtonProps) {\r\n const [, setSearchParams] = useSearchParams();\r\n\r\n const handleReset = () => {\r\n setSearchParams({}, { replace: true });\r\n onReset?.();\r\n };\r\n\r\n const resolvedIcon = icon === undefined ? <ResetIcon size={16} /> : icon;\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n onClick={handleReset}\r\n disabled={disabled}\r\n className={cn(BASE_STYLES, VARIANTS[variant], className)}\r\n >\r\n {resolvedIcon}\r\n {showLabel && label}\r\n </button>\r\n );\r\n}\r\n","import {\r\n useEffect,\r\n useRef,\r\n useState,\r\n type ChangeEvent,\r\n type FormEvent,\r\n} from \"react\";\r\nimport { FiSearch } from \"react-icons/fi\";\r\nimport { useSearchParams } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { resetPageParam } from \"../../utils/resetPageParam\";\r\nimport type { SearchInputProps } from \"./types\";\r\n\r\nexport function SearchInput({\r\n placeholder = \"Search...\",\r\n searchBtn = \"\",\r\n searchClassName = \"\",\r\n searchWrapperClass = \"\",\r\n searchIconClassName = \"\",\r\n defaultParam = \"query\",\r\n showIcon = true,\r\n name = \"search\",\r\n type = \"search\",\r\n liveSearch = false,\r\n debounceDelay = 500,\r\n customIcon = null,\r\n defaultValue,\r\n pageParam = \"page\",\r\n ...props\r\n}: SearchInputProps) {\r\n const [searchParams, setSearchParams] = useSearchParams();\r\n const queryParam = searchParams.get(defaultParam) || defaultValue || \"\";\r\n\r\n const [inputValue, setInputValue] = useState(queryParam);\r\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n const updateSearchParams = (searchQuery: string) => {\r\n const nextValue = searchQuery?.trim() ?? \"\";\r\n\r\n setSearchParams((prev) => {\r\n // Same query as the URL already holds: the result set is unchanged, so\r\n // leave the current page alone.\r\n if ((prev.get(defaultParam) ?? \"\") === nextValue) {\r\n return prev;\r\n }\r\n\r\n if (nextValue) {\r\n prev.set(defaultParam, nextValue);\r\n } else {\r\n prev.delete(defaultParam);\r\n }\r\n\r\n return resetPageParam(prev, pageParam);\r\n });\r\n };\r\n\r\n const handleSearch = (e: FormEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n const formData = new FormData(e.currentTarget);\r\n const searchQuery = formData.get(name);\r\n updateSearchParams(String(searchQuery ?? \"\"));\r\n };\r\n\r\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n setInputValue(value);\r\n\r\n if (liveSearch) {\r\n if (debounceTimerRef.current) {\r\n clearTimeout(debounceTimerRef.current);\r\n }\r\n\r\n debounceTimerRef.current = setTimeout(() => {\r\n updateSearchParams(value);\r\n }, debounceDelay);\r\n }\r\n\r\n if (value === \"\") {\r\n if (debounceTimerRef.current) {\r\n clearTimeout(debounceTimerRef.current);\r\n }\r\n setInputValue(\"\");\r\n updateSearchParams(\"\");\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n setInputValue(queryParam);\r\n }, [queryParam]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimerRef.current) {\r\n clearTimeout(debounceTimerRef.current);\r\n }\r\n };\r\n }, []);\r\n\r\n return (\r\n <form\r\n onSubmit={handleSearch}\r\n className={cn(\r\n \"flex items-center justify-between bg-white rounded-xl px-2 h-11 border\",\r\n searchWrapperClass,\r\n )}\r\n >\r\n {showIcon && (\r\n <button\r\n type=\"submit\"\r\n className={cn(\r\n \"bg-white text-secondary rounded-full flex items-center justify-center w-10 h-10\",\r\n searchBtn,\r\n )}\r\n >\r\n {customIcon ? (\r\n customIcon\r\n ) : (\r\n <FiSearch\r\n className={cn(\"h-5 w-5 text-gray-400\", searchIconClassName)}\r\n />\r\n )}\r\n </button>\r\n )}\r\n <input\r\n value={inputValue}\r\n onChange={handleInputChange}\r\n name={name}\r\n type={type}\r\n className={cn(\"outline-none text-sm w-96\", searchClassName)}\r\n placeholder={placeholder}\r\n {...props}\r\n />\r\n </form>\r\n );\r\n}\r\n","import { AnimatePresence, motion } from \"framer-motion\";\r\nimport { useEffect, useRef, type MouseEvent } from \"react\";\r\nimport { createPortal } from \"react-dom\";\r\nimport { FaFileExport, FaPrint } from \"react-icons/fa\";\r\nimport { IoCloseCircleOutline } from \"react-icons/io5\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { Loader } from \"../Loader\";\r\nimport type { ModalProps } from \"./types\";\r\n\r\nexport function Modal({\r\n isOpen,\r\n onClose,\r\n title,\r\n children,\r\n modalHeader,\r\n footer,\r\n className = \"w-2/3\",\r\n width,\r\n onPrint,\r\n onExport,\r\n modalBodyClassName,\r\n modalBodyWrapperClass,\r\n closeOnBackdropClick = false,\r\n closeOnEscape = true,\r\n zIndex = 1000,\r\n isLoading = false,\r\n customLoader = null,\r\n footerClassName,\r\n}: ModalProps) {\r\n const modalRef = useRef<HTMLDivElement>(null);\r\n\r\n const handleBackdropClick = (e: MouseEvent<HTMLDivElement>) => {\r\n if (e.target === e.currentTarget && closeOnBackdropClick) {\r\n onClose();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && isOpen && closeOnEscape) {\r\n onClose();\r\n }\r\n };\r\n\r\n if (isOpen) {\r\n document.addEventListener(\"keydown\", handleEscape);\r\n document.body.style.overflow = \"hidden\";\r\n }\r\n\r\n return () => {\r\n document.removeEventListener(\"keydown\", handleEscape);\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [isOpen, onClose, closeOnEscape]);\r\n\r\n const modalContent = (\r\n <AnimatePresence>\r\n {isOpen && (\r\n <div\r\n className=\"fixed inset-0 bg-gray-500 bg-opacity-50 flex justify-center items-center z-1000 p-4\"\r\n onClick={handleBackdropClick}\r\n style={{\r\n // Ensure it covers the entire viewport, even in micro frontend context\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n width: \"100vw\",\r\n height: \"100vh\",\r\n margin: 0,\r\n padding: \"1rem\",\r\n zIndex: zIndex,\r\n }}\r\n >\r\n <motion.div\r\n ref={modalRef}\r\n initial={{ y: \"-100vh\", opacity: 0 }}\r\n animate={{ y: 0, opacity: 1 }}\r\n exit={{ y: \"100vh\", opacity: 0 }}\r\n transition={{ duration: 0.3 }}\r\n className={cn(\r\n `bg-white rounded-3xl shadow-lg max-h-[90vh] flex flex-col mx-auto`,\r\n className,\r\n width,\r\n )}\r\n onClick={(e) => e.stopPropagation()} // Prevent backdrop click when clicking modal content\r\n style={{\r\n maxWidth: \"95vw\", // Ensure modal doesn't exceed viewport width\r\n maxHeight: \"90vh\", // Ensure modal doesn't exceed viewport height\r\n }}\r\n >\r\n {/* Modal Header */}\r\n {modalHeader ? \r\n modalHeader \r\n : (\r\n <div\r\n style={{\r\n borderRadius: \"24px 24px 0 0\",\r\n }}\r\n className=\"sticky top-0 z-10 flex justify-between items-center bg-white text-2xl p-8 pb-4 rounded-t-3xl\"\r\n >\r\n <h2 className=\"font-semibold\">{title}</h2>\r\n <div className=\"flex items-center space-x-4\">\r\n {onPrint && (\r\n <button\r\n onClick={onPrint}\r\n className=\"flex items-center gap-1 hover:text-gray-300 text-sm border p-1 rounded\"\r\n >\r\n <FaPrint name=\"FaPrint\" />\r\n <span>Print</span>\r\n </button>\r\n )}\r\n {onExport && (\r\n <button\r\n onClick={onExport}\r\n className=\"flex items-center gap-1 hover:text-gray-300 text-sm border p-1 rounded\"\r\n >\r\n <FaFileExport />\r\n <span>Export</span>\r\n </button>\r\n )}\r\n <button\r\n onClick={onClose}\r\n className=\"px-2 hover:opacity-70 transition-opacity\"\r\n >\r\n <IoCloseCircleOutline color=\"#8898AA\" size={25} />\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n <div\r\n className={cn(\r\n \"overflow-y-auto px-8 pb-8 grow scroll scrollbar-hidden\",\r\n modalBodyWrapperClass,\r\n )}\r\n >\r\n {children}\r\n </div>\r\n\r\n {/* Modal Footer */}\r\n {footer && (\r\n <div\r\n className={cn(\r\n \"sticky bottom-0 flex justify-end p-4 space-x-4 border-t bg-white \",\r\n footerClassName,\r\n )}\r\n style={{\r\n zIndex: 1000,\r\n\r\n borderRadius: \"24px\",\r\n }}\r\n >\r\n {footer}\r\n </div>\r\n )}\r\n </motion.div>\r\n {isLoading && (\r\n <div\r\n className=\"fixed inset-0 flex items-center justify-center bg-gray-200/60\"\r\n style={{ zIndex: 1100 }}\r\n aria-busy=\"true\"\r\n aria-live=\"polite\"\r\n role=\"status\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {customLoader ? customLoader : <Loader size=\"48px\" />}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </AnimatePresence>\r\n );\r\n\r\n let modalRoot = document.getElementById(\"modal-root\");\r\n if (!modalRoot) {\r\n modalRoot = document.createElement(\"div\");\r\n modalRoot.id = \"modal-root\";\r\n document.body.appendChild(modalRoot);\r\n }\r\n\r\n return createPortal(modalContent, modalRoot);\r\n}\r\n","import \"@eztrak/shared/components/loader.css\";","import React from 'react';\r\nimport './Loader.css';\r\nimport { LoaderProps } from './Loader.types';\r\n\r\nexport const Loader: React.FC<LoaderProps> = ({ className, color = \"#F54C00\", size = '50px', speed = '1s' }) => {\r\n return (\r\n <div className={`loader`}>\r\n <div \r\n className={`spinner ${className}`} \r\n style={{\r\n border: `4px solid rgba(0, 0, 0, 0.1)`,\r\n borderWidth: '4px',\r\n borderLeftColor: color,\r\n width: size,\r\n height: size,\r\n animation: `spin ${speed} linear infinite`\r\n }}\r\n ></div>\r\n </div>\r\n );\r\n};\r\n","import { forwardRef } from \"react\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { ButtonProps } from \"./types\";\r\n\r\nconst BASE_STYLES =\r\n \"flex gap-1 items-center font-medium text-sm px-5 py-3 rounded-md transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed\";\r\n\r\nconst VARIANTS: Record<string, string> = {\r\n primary:\r\n \"bg-white text-secondary border-secondary hover:bg-lightGray hover:text-black\",\r\n \"primary-outline\":\r\n \"bg-white text-primary-150 border-primary-150 hover:bg-primary-100 hover:text-white font-bold\",\r\n \"primary-fill\": \"bg-primary-150 text-white border-primary hover:bg-primary/90\",\r\n secondary: \"bg-primary-150 text-white border-primary hover:bg-primary/90\",\r\n danger: \"bg-red-600 text-white border-red-600 hover:bg-red-700\",\r\n outline: \"bg-white text-primary border-primary hover:bg-primary/10\",\r\n ghost:\r\n \"bg-transparent text-secondary border-transparent hover:bg-primary/10 p-2\",\r\n inline:\r\n \"bg-transparent text-gray-500 border-none hover:text-gray-600 underline shadow-none p-0 m-0\",\r\n};\r\n\r\nconst SIZES: Record<string, string> = {\r\n sm: \"px-3 py-2 text-xs\",\r\n md: \"px-5 py-3 text-sm\",\r\n lg: \"px-6 py-4 text-base\",\r\n};\r\n\r\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\r\n (\r\n {\r\n children,\r\n className = \"\",\r\n type = \"button\",\r\n onClick,\r\n disabled = false,\r\n variant = \"primary\",\r\n size = \"md\",\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const variantStyles = VARIANTS[variant] || VARIANTS.primary;\r\n const sizeStyles = SIZES[size];\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n type={type}\r\n className={cn(\r\n BASE_STYLES,\r\n variantStyles,\r\n size !== \"md\" && sizeStyles,\r\n className\r\n )}\r\n onClick={onClick}\r\n disabled={disabled}\r\n {...props}\r\n >\r\n {children}\r\n </button>\r\n );\r\n }\r\n);\r\n\r\nButton.displayName = \"Button\";\r\n","import { cn } from \"../../utils/cn\";\r\nimport type { CardProps } from \"./types\";\r\n\r\nexport function Card({\r\n title,\r\n content,\r\n icon,\r\n onClick,\r\n containerClassName = \"shadow p-6\",\r\n iconClassName = \"\",\r\n titleClassName = \"\",\r\n contentClassName = \"\",\r\n cardBodyClassName = \"\",\r\n}: CardProps) {\r\n return (\r\n <div\r\n className={cn(\r\n \"transform transition duration-300 cursor-pointer select-none\",\r\n containerClassName\r\n )}\r\n onClick={onClick}\r\n >\r\n <div className={cn(\"flex space-x-4\", cardBodyClassName)}>\r\n <span className={cn(\"text-primary text-3xl\", iconClassName)}>{icon}</span>\r\n <div>\r\n <h3 className={cn(\"font-semibold text-lg text-primary\", titleClassName)}>\r\n {title}\r\n </h3>\r\n {content != null && (\r\n <p className={cn(\"text-sm text-secondary\", contentClassName)}>{content}</p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { HeaderProps } from \"./types\";\r\n\r\nexport function Header({\r\n title = \"Header\",\r\n className = \"p-2 gap-2 flex-col\",\r\n containerClass = \"\",\r\n breadcrumbs = \"\",\r\n titleStyle = \"text-4xl h-fit font-bold\",\r\n breadcrumbsStyle = \"text-sm\",\r\n children,\r\n}: HeaderProps) {\r\n return (\r\n <div className={`flex ${className}`}>\r\n <div className=\"title-wrapper\">\r\n <h1 className={titleStyle}>{title}</h1>\r\n {breadcrumbs && (\r\n <div className={`breadcrumbs-wraper ${breadcrumbsStyle}`}>{breadcrumbs}</div>\r\n )}\r\n </div>\r\n <div className={`flex flex-row justify-between items-center ${containerClass}`}>\r\n {children}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import {\r\n cloneElement,\r\n isValidElement,\r\n type CSSProperties,\r\n type ReactNode,\r\n} from \"react\";\r\nimport { Link, useLocation } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { BreadcrumbRoute, BreadcrumbsProps } from \"./types\";\r\n\r\nconst DEFAULT_BACKGROUND = \"#F7F7F5\";\r\nconst DEFAULT_INACTIVE = \"#6B7280\";\r\nconst DEFAULT_ACTIVE = \"#111111\";\r\nconst DEFAULT_SEPARATOR = \"#9CA3AF\";\r\n\r\nconst CRUMB_LAYOUT =\r\n \"inline-flex items-center gap-1.5 whitespace-nowrap leading-5 rounded-sm\";\r\n\r\nconst LINK_INTERACTION =\r\n \"font-normal transition-colors duration-200 motion-reduce:transition-none hover:!text-[color-mix(in_srgb,var(--bc-inactive)_65%,#111111)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#111111]\";\r\n\r\ntype BreadcrumbNavStyle = CSSProperties & {\r\n \"--bc-inactive\": string;\r\n};\r\n\r\nfunction BreadcrumbChevron() {\r\n return (\r\n <svg\r\n width=\"12\"\r\n height=\"12\"\r\n viewBox=\"0 0 12 12\"\r\n fill=\"none\"\r\n aria-hidden=\"true\"\r\n className=\"shrink-0\"\r\n >\r\n <path\r\n d=\"M4.5 2.5L8 6L4.5 9.5\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"1.5\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction asTitleMap(\r\n customTitles: BreadcrumbsProps[\"customTitles\"]\r\n): Record<string, string> {\r\n if (Object.prototype.toString.call(customTitles) !== \"[object Object]\") {\r\n return {};\r\n }\r\n return customTitles as Record<string, string>;\r\n}\r\n\r\nfunction findRoute(\r\n pathname: string,\r\n routes: BreadcrumbRoute[],\r\n parentPath = \"\"\r\n): BreadcrumbRoute | null {\r\n for (const route of routes) {\r\n const fullPath = `${parentPath}/${route.path}`.replace(/\\/+/g, \"/\");\r\n if (fullPath === pathname) {\r\n return route;\r\n }\r\n if (route.children) {\r\n const childRoute = findRoute(pathname, route.children, fullPath);\r\n if (childRoute) {\r\n return childRoute;\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction getLastParam(str: string) {\r\n return str.endsWith(\"/\")\r\n ? str.slice(0, -1).split(\"/\").pop()\r\n : str.split(\"/\").pop();\r\n}\r\n\r\ntype Crumb = {\r\n key: string;\r\n to: string;\r\n title: string;\r\n icon: ReactNode | null;\r\n isCurrent: boolean;\r\n isLink: boolean;\r\n};\r\n\r\nexport function Breadcrumbs({\r\n routes = [],\r\n containerClassName,\r\n linkClassName = \"\",\r\n separatorClassName = \"\",\r\n separator,\r\n activeClassName = \"font-semibold\",\r\n customTitles = {},\r\n customIcons = {},\r\n prefix,\r\n suffix,\r\n nonClickablePaths = [],\r\n backgroundColor = DEFAULT_BACKGROUND,\r\n inactiveColor = DEFAULT_INACTIVE,\r\n activeColor = DEFAULT_ACTIVE,\r\n separatorColor = DEFAULT_SEPARATOR,\r\n iconColor,\r\n iconClassName,\r\n showHome = false,\r\n}: BreadcrumbsProps) {\r\n const location = useLocation();\r\n const pathnames = location.pathname.split(\"/\").filter((segment) => segment);\r\n const titles = asTitleMap(customTitles);\r\n\r\n const getTitle = (pathname: string) => {\r\n const match = findRoute(pathname, routes);\r\n if (match && match.title) {\r\n return match.title;\r\n }\r\n\r\n const lastParamPath = getLastParam(pathname);\r\n if (lastParamPath && titles[lastParamPath]) {\r\n return titles[lastParamPath];\r\n }\r\n\r\n if (lastParamPath) {\r\n return lastParamPath;\r\n }\r\n\r\n return pathname;\r\n };\r\n\r\n const getIcon = (pathname: string) => {\r\n const segment = getLastParam(pathname);\r\n if (segment && customIcons[segment]) {\r\n return customIcons[segment];\r\n }\r\n return null;\r\n };\r\n\r\n const crumbs: Crumb[] = [];\r\n\r\n if (showHome) {\r\n crumbs.push({\r\n key: \"home\",\r\n to: \"/\",\r\n title: titles.home || \"Home\",\r\n icon: customIcons.home ?? null,\r\n isCurrent: pathnames.length === 0,\r\n isLink: pathnames.length > 0,\r\n });\r\n }\r\n\r\n pathnames.forEach((segment, index) => {\r\n const to = `/${pathnames.slice(0, index + 1).join(\"/\")}`;\r\n const isCurrent = index === pathnames.length - 1;\r\n const isNonClickable = nonClickablePaths.some(\r\n (token) => to.includes(token) || segment === token\r\n );\r\n\r\n crumbs.push({\r\n key: to,\r\n to,\r\n title: getTitle(to),\r\n icon: getIcon(to),\r\n isCurrent,\r\n isLink: !isCurrent && !isNonClickable,\r\n });\r\n });\r\n\r\n const navStyle: BreadcrumbNavStyle = {\r\n backgroundColor,\r\n \"--bc-inactive\": inactiveColor,\r\n };\r\n\r\n const inactiveClassName = cn(CRUMB_LAYOUT, LINK_INTERACTION, linkClassName);\r\n const staticInactiveClassName = cn(CRUMB_LAYOUT, \"font-normal\", linkClassName);\r\n const currentClassName = cn(CRUMB_LAYOUT, activeClassName);\r\n\r\n const renderCrumb = (crumb: Crumb) => {\r\n const content = (\r\n <>\r\n {crumb.icon ? (\r\n <span\r\n className={cn(\"inline-flex shrink-0 items-center\", iconClassName)}\r\n style={iconColor ? { color: iconColor } : undefined}\r\n >\r\n {crumb.icon}\r\n </span>\r\n ) : null}\r\n {crumb.title}\r\n </>\r\n );\r\n\r\n if (crumb.isCurrent) {\r\n return (\r\n <span\r\n className={currentClassName}\r\n style={{ color: activeColor }}\r\n aria-current=\"page\"\r\n >\r\n {content}\r\n </span>\r\n );\r\n }\r\n\r\n if (crumb.isLink) {\r\n return (\r\n <Link\r\n to={crumb.to}\r\n className={inactiveClassName}\r\n style={{ color: inactiveColor }}\r\n >\r\n {content}\r\n </Link>\r\n );\r\n }\r\n\r\n return (\r\n <span className={staticInactiveClassName} style={{ color: inactiveColor }}>\r\n {content}\r\n </span>\r\n );\r\n };\r\n\r\n return (\r\n <nav\r\n aria-label=\"Breadcrumb\"\r\n className={cn(\r\n \"flex w-full flex-row items-center gap-2 overflow-x-auto px-4 py-3 text-sm leading-5\",\r\n containerClassName\r\n )}\r\n style={navStyle}\r\n >\r\n {prefix ? <div className=\"breadcrumb-prefix\">{prefix}</div> : null}\r\n <ol className=\"flex min-w-0 flex-row flex-nowrap items-center gap-2\">\r\n {crumbs.map((crumb, index) => (\r\n <li key={crumb.key} className=\"inline-flex items-center gap-2\">\r\n {index > 0 ? (\r\n <span\r\n aria-hidden=\"true\"\r\n className={cn(\r\n \"inline-flex shrink-0 items-center\",\r\n separatorClassName\r\n )}\r\n style={{ color: separatorColor }}\r\n >\r\n {separator === undefined ? (\r\n <BreadcrumbChevron />\r\n ) : isValidElement(separator) ? (\r\n cloneElement(separator)\r\n ) : (\r\n separator\r\n )}\r\n </span>\r\n ) : null}\r\n {renderCrumb(crumb)}\r\n </li>\r\n ))}\r\n </ol>\r\n {suffix ? <div className=\"breadcrumb-suffix\">{suffix}</div> : null}\r\n </nav>\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport { Link, useLocation } from \"react-router-dom\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { ToolTip } from \"../tooltip/ToolTip\";\r\nimport type { SidebarItem, SidebarProps } from \"./types\";\r\n\r\nfunction getItemTooltip(item: SidebarItem) {\r\n return item.tooltip || item.name;\r\n}\r\n\r\nfunction getTooltipPlacement(item: SidebarItem, collapsed: boolean) {\r\n return item.tooltipPlacement || (collapsed ? \"right\" : \"top\");\r\n}\r\n\r\nfunction isItemActive(pathname: string, link?: string) {\r\n if (!link || link === \"#\") return false;\r\n return pathname === link || pathname.startsWith(`${link}/`);\r\n}\r\n\r\nfunction SidebarItemLabel({\r\n name,\r\n collapsed,\r\n className,\r\n}: {\r\n name: string;\r\n collapsed: boolean;\r\n className?: string;\r\n}) {\r\n return (\r\n <span\r\n className={cn(\r\n className,\r\n collapsed &&\r\n \"block w-full text-center text-[10px] font-medium leading-tight line-clamp-2 wrap-break-word\"\r\n )}\r\n >\r\n {name}\r\n </span>\r\n );\r\n}\r\n\r\nfunction SidebarItemIcon({\r\n icon,\r\n className,\r\n}: {\r\n icon?: SidebarItem[\"icon\"];\r\n className?: string;\r\n}) {\r\n if (!icon) return null;\r\n return (\r\n <span className={cn(\"inline-flex shrink-0\", className)} aria-hidden=\"true\">\r\n {icon}\r\n </span>\r\n );\r\n}\r\n\r\nexport function Sidebar({\r\n className,\r\n sideCollapseWidth = \"w-24\",\r\n sidebarWidth = \"w-48\",\r\n header,\r\n children,\r\n footer,\r\n items = [],\r\n logoUrl = \"\",\r\n logoRouteUrl = \"\",\r\n logoAltText = \"Logo\",\r\n collapseButtonText = \"⬅️ Collapse\",\r\n expandButtonText = \"➡️\",\r\n location: _location,\r\n classNames = {},\r\n onCollapseChange,\r\n isCollapsed = false,\r\n itemDropdownIcon = <span>▼</span>,\r\n ...rest\r\n}: SidebarProps) {\r\n const location = useLocation();\r\n const [collapsed, setCollapsed] = useState<boolean>(isCollapsed);\r\n const [openGroups, setOpenGroups] = useState<Record<string, boolean>>({});\r\n const onCollapseChangeRef = useRef(onCollapseChange);\r\n onCollapseChangeRef.current = onCollapseChange;\r\n\r\n useEffect(() => {\r\n setCollapsed(isCollapsed);\r\n }, [isCollapsed]);\r\n\r\n useEffect(() => {\r\n onCollapseChangeRef.current?.(collapsed);\r\n }, [collapsed]);\r\n\r\n const toggleGroup = (group: string) => {\r\n setOpenGroups((prevState) => ({\r\n ...prevState,\r\n [group]: !prevState[group],\r\n }));\r\n };\r\n\r\n const itemLayoutClass = (active: boolean, itemClassName?: string) =>\r\n cn(\r\n \"flex cursor-pointer\",\r\n classNames?.navItem,\r\n collapsed &&\r\n \"w-full flex-col items-center justify-center gap-0.5 px-1 py-2 my-1 !mx-0 max-w-full min-w-0 box-border text-center min-h-11\",\r\n active && \"active\",\r\n itemClassName\r\n );\r\n\r\n const renderLink = (item: SidebarItem, key: string) => {\r\n const active = isItemActive(location.pathname, item.link);\r\n\r\n return (\r\n <div key={key} className=\"max-w-full min-w-0\" data-sidebar-item={item.name}>\r\n <ToolTip\r\n text={getItemTooltip(item)}\r\n placement={getTooltipPlacement(item, collapsed)}\r\n delayShow={150}\r\n className=\"block max-w-full min-w-0\"\r\n >\r\n <Link\r\n to={item.link || \"#\"}\r\n className={itemLayoutClass(active, item.itemClassName)}\r\n aria-current={active ? \"page\" : undefined}\r\n >\r\n <SidebarItemIcon icon={item.icon} className={classNames?.navItemText} />\r\n <SidebarItemLabel\r\n name={item.name}\r\n collapsed={collapsed}\r\n className={classNames?.navItemText}\r\n />\r\n </Link>\r\n </ToolTip>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex flex-col h-screen overflow-hidden\",\r\n collapsed ? `${sideCollapseWidth} items-stretch collapsed` : sidebarWidth,\r\n \"transition-[width] duration-200 ease-in-out motion-reduce:transition-none\",\r\n className\r\n )}\r\n {...rest}\r\n >\r\n {logoUrl && (\r\n <div\r\n className={cn(\r\n \"flex items-center justify-center h-16 border-b border-gray-300\",\r\n classNames.logoSection\r\n )}\r\n >\r\n {logoRouteUrl ? (\r\n <Link\r\n to={logoRouteUrl}\r\n className=\"sidebar-logo-link inline-flex items-center justify-center\"\r\n >\r\n <img src={logoUrl} alt={logoAltText} className=\"h-10\" />\r\n </Link>\r\n ) : (\r\n <img src={logoUrl} alt={logoAltText} className=\"h-10\" />\r\n )}\r\n </div>\r\n )}\r\n\r\n {header && (\r\n <div className=\"flex items-center justify-between p-4 border-b border-gray-300 shrink-0\">\r\n {header}\r\n </div>\r\n )}\r\n\r\n <nav\r\n aria-label=\"Sidebar\"\r\n className={cn(\r\n \"grow min-h-0 min-w-0 w-full\",\r\n classNames.navSection\r\n )}\r\n >\r\n {items.map((item, index) => {\r\n if (item.subItems) {\r\n const groupOpen = Boolean(openGroups[item.name]);\r\n const groupId = `sidebar-group-${index}`;\r\n\r\n return (\r\n <div\r\n key={index}\r\n data-sidebar-item={item.name}\r\n className=\"has-sub-items max-w-full min-w-0 flex flex-col\"\r\n >\r\n <ToolTip\r\n text={getItemTooltip(item)}\r\n placement={getTooltipPlacement(item, collapsed)}\r\n delayShow={150}\r\n className=\"flex flex-col w-full max-w-full min-w-0\"\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => toggleGroup(item.name)}\r\n data-sidebar-item={item.name}\r\n aria-expanded={groupOpen}\r\n aria-controls={groupId}\r\n className={cn(\r\n itemLayoutClass(false, item.itemClassName),\r\n !collapsed && \"dropdown-title-wrapper\",\r\n \"relative appearance-none border-0 bg-transparent [font:inherit]\"\r\n )}\r\n >\r\n <span\r\n className={cn(\r\n \"flex items-center min-w-0\",\r\n collapsed\r\n ? \"flex-col gap-0.5 w-full\"\r\n : \"space-x-2 flex-1\"\r\n )}\r\n >\r\n {collapsed ? (\r\n <span className=\"flex w-full items-center justify-center\">\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span className=\"inline-flex w-3 shrink-0\" aria-hidden=\"true\" />\r\n <SidebarItemIcon\r\n icon={item.icon}\r\n className={classNames?.navItemText}\r\n />\r\n <span\r\n className={cn(\r\n \"sidebar-group-caret inline-flex w-3 shrink-0 items-center justify-center text-current [&>svg]:h-3 [&>svg]:w-3 transition-transform duration-200 motion-reduce:transition-none\",\r\n groupOpen ? \"rotate-180\" : \"rotate-0\"\r\n )}\r\n aria-hidden=\"true\"\r\n >\r\n {itemDropdownIcon}\r\n </span>\r\n </span>\r\n </span>\r\n ) : (\r\n <span className=\"flex items-center space-x-2 min-w-0 flex-1\">\r\n <SidebarItemIcon\r\n icon={item.icon}\r\n className={classNames?.navItemText}\r\n />\r\n <SidebarItemLabel\r\n name={item.name}\r\n collapsed={false}\r\n className={classNames?.navItemText}\r\n />\r\n </span>\r\n )}\r\n {collapsed && (\r\n <SidebarItemLabel\r\n name={item.name}\r\n collapsed\r\n className={classNames?.navItemText}\r\n />\r\n )}\r\n </span>\r\n {!collapsed && (\r\n <span\r\n className={cn(\r\n \"transform transition-transform duration-200 motion-reduce:transition-none\",\r\n groupOpen ? \"rotate-180\" : \"rotate-0\"\r\n )}\r\n aria-hidden=\"true\"\r\n >\r\n {itemDropdownIcon}\r\n </span>\r\n )}\r\n </button>\r\n </ToolTip>\r\n {groupOpen && (\r\n <div\r\n id={groupId}\r\n role=\"group\"\r\n aria-label={item.name}\r\n className={cn(\r\n collapsed\r\n ? \"sidebar-sub-panel flex flex-col items-center max-w-full min-w-0 box-border\"\r\n : \"collapse-btn-wrapper\",\r\n classNames.subItem\r\n )}\r\n >\r\n {item.subItems.map((subItem, subIndex) => {\r\n if (subItem.component) {\r\n const SubItemComponent = subItem.component;\r\n return (\r\n <div\r\n key={`${index}-${subIndex}`}\r\n className={cn(\r\n \"min-w-0 max-w-full\",\r\n collapsed && \"flex flex-col items-center text-center\"\r\n )}\r\n data-sidebar-item={subItem.name}\r\n >\r\n <SubItemComponent />\r\n {collapsed && (\r\n <SidebarItemLabel\r\n name={subItem.name}\r\n collapsed\r\n className={classNames?.navItemText}\r\n />\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return renderLink(subItem, `${index}-${subIndex}`);\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n if (item.component) {\r\n const ItemComponent = item.component;\r\n return <ItemComponent key={index} />;\r\n }\r\n\r\n return renderLink(item, String(index));\r\n })}\r\n </nav>\r\n {children != null && (\r\n <div\r\n className={cn(\r\n \"sidebar-chrome w-full shrink-0\",\r\n collapsed && \"flex flex-col items-center\"\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )}\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setCollapsed(!collapsed)}\r\n aria-expanded={!collapsed}\r\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\r\n className={cn(\r\n \"shrink-0 border-t border-gray-300\",\r\n classNames.collapseButton,\r\n collapsed && \"flex items-center justify-center\"\r\n )}\r\n >\r\n {collapsed ? expandButtonText : collapseButtonText}\r\n </button>\r\n\r\n {footer && (\r\n <div className={classNames?.footer ?? \"p-4 border-t border-gray-300\"}>\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useId } from \"react\";\r\nimport { Tooltip } from \"react-tooltip\";\r\nimport type { ToolTipProps } from \"./types\";\r\n\r\nconst defaultTooltipStyle = {\r\n color: \"#fff\",\r\n borderRadius: \"5px\",\r\n zIndex: 999,\r\n textAlign: \"justify\",\r\n maxWidth: \"300px\",\r\n whiteSpace: \"pre-wrap\",\r\n wordWrap: \"break-word\",\r\n overflowWrap: \"break-word\",\r\n} as const;\r\n\r\nexport function ToolTip({\r\n text = \"tool tip\",\r\n placement = \"top\",\r\n delayShow,\r\n delayHide,\r\n className,\r\n tooltipClassName,\r\n tooltipStyle,\r\n wrapperTabIndex,\r\n disabled = false,\r\n children,\r\n}: ToolTipProps) {\r\n const generatedId = useId();\r\n const tooltipId = `eztrak-tooltip-${generatedId.replace(/:/g, \"\")}`;\r\n const tooltipText = String(text ?? \"\");\r\n\r\n if (disabled || !tooltipText) {\r\n return <span className={className}>{children}</span>;\r\n }\r\n\r\n return (\r\n <>\r\n <span\r\n className={className}\r\n data-tooltip-id={tooltipId}\r\n data-tooltip-content={tooltipText}\r\n tabIndex={wrapperTabIndex}\r\n >\r\n {children}\r\n </span>\r\n <Tooltip\r\n id={tooltipId}\r\n place={placement}\r\n positionStrategy=\"fixed\"\r\n delayShow={delayShow}\r\n delayHide={delayHide}\r\n className={tooltipClassName}\r\n style={{ ...defaultTooltipStyle, ...tooltipStyle }}\r\n />\r\n </>\r\n );\r\n}\r\n","import { cn } from \"../../utils/cn\";\r\nimport type { CardSkeletonProps, CardSkeletonVariant } from \"./types\";\r\n\r\nconst DEFAULT_LINE_WIDTHS = [\"w-32\", \"w-48\"];\r\n\r\nfunction shouldShowAvatar(\r\n variant: CardSkeletonVariant,\r\n showAvatar: boolean | undefined\r\n) {\r\n return showAvatar ?? variant === \"profile\";\r\n}\r\n\r\nfunction shouldShowImage(\r\n variant: CardSkeletonVariant,\r\n showImage: boolean | undefined\r\n) {\r\n return showImage ?? variant === \"image\";\r\n}\r\n\r\nfunction AvatarSkeleton({ className }: { className?: string }) {\r\n return (\r\n <svg\r\n className={cn(\"w-10 h-10 text-gray-200 dark:text-gray-700\", className)}\r\n aria-hidden=\"true\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"currentColor\"\r\n viewBox=\"0 0 20 20\"\r\n >\r\n <path d=\"M10 0a10 10 0 1 0 10 10A10.011 10.011 0 0 0 10 0Zm0 5a3 3 0 1 1 0 6 3 3 0 0 1 0-6Zm0 13a8.949 8.949 0 0 1-4.951-1.488A3.987 3.987 0 0 1 9 13h2a3.987 3.987 0 0 1 3.951 3.512A8.949 8.949 0 0 1 10 18Z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SkeletonBlock({\r\n widthClass,\r\n className,\r\n isFirst,\r\n}: {\r\n widthClass: string;\r\n className?: string;\r\n isFirst: boolean;\r\n}) {\r\n return (\r\n <div\r\n className={cn(\r\n isFirst ? \"h-2.5 mb-2\" : \"h-2\",\r\n \"bg-gray-200 rounded-full dark:bg-gray-700\",\r\n widthClass,\r\n className\r\n )}\r\n />\r\n );\r\n}\r\n\r\nexport function CardSkeleton({\r\n variant = \"profile\",\r\n count = 1,\r\n lines = 2,\r\n lineWidths = DEFAULT_LINE_WIDTHS,\r\n showAvatar,\r\n showImage,\r\n animationDuration = \"0.7s\",\r\n className,\r\n style,\r\n avatarClassName,\r\n imageClassName,\r\n contentClassName,\r\n lineClassName,\r\n srLabel = \"Loading...\",\r\n ...props\r\n}: CardSkeletonProps) {\r\n const skeletons = Array.from({ length: Math.max(1, count) }, (_, index) => {\r\n const renderAvatar = shouldShowAvatar(variant, showAvatar);\r\n const renderImage = shouldShowImage(variant, showImage);\r\n\r\n return (\r\n <div\r\n key={index}\r\n className={cn(\"animate-pulse md:p-6 dark:border-gray-700\", className)}\r\n style={{ animationDuration, ...style }}\r\n {...props}\r\n >\r\n {renderImage ? (\r\n <div\r\n className={cn(\r\n \"mb-4 h-32 w-full rounded-xl bg-gray-200 dark:bg-gray-700\",\r\n imageClassName\r\n )}\r\n />\r\n ) : null}\r\n <div className={cn(\"flex items-center mt-4 gap-4\", contentClassName)}>\r\n {renderAvatar ? <AvatarSkeleton className={avatarClassName} /> : null}\r\n <div>\r\n {Array.from({ length: Math.max(1, lines) }, (_, lineIndex) => (\r\n <SkeletonBlock\r\n key={lineIndex}\r\n widthClass={\r\n lineWidths[lineIndex] ??\r\n lineWidths[lineWidths.length - 1] ??\r\n DEFAULT_LINE_WIDTHS[1]\r\n }\r\n className={lineClassName}\r\n isFirst={lineIndex === 0}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n <span className=\"sr-only\">{srLabel}</span>\r\n </div>\r\n );\r\n });\r\n\r\n return <>{skeletons}</>;\r\n}\r\n","import { cn } from \"../../utils/cn\";\r\nimport { truncateText } from \"../../utils/helpers\";\r\nimport { ToolTip } from \"./ToolTip\";\r\nimport type { TooltipTextProps } from \"./types\";\r\n\r\nexport function TooltipText({\r\n text = \"\",\r\n maxLength = 20,\r\n fallback = \"-\",\r\n placement = \"top\",\r\n delayShow,\r\n delayHide,\r\n className,\r\n textClassName,\r\n tooltipClassName,\r\n tooltipStyle,\r\n showTooltip = true,\r\n tooltipWhenTruncatedOnly = false,\r\n}: TooltipTextProps) {\r\n const hasValue = text !== null && text !== undefined && text !== \"\";\r\n const fullText = hasValue ? String(text) : fallback;\r\n const displayText = truncateText(fullText, maxLength);\r\n const isTruncated = displayText !== fullText;\r\n const tooltipDisabled =\r\n !showTooltip || !hasValue || (tooltipWhenTruncatedOnly && !isTruncated);\r\n\r\n return (\r\n <ToolTip\r\n text={fullText}\r\n placement={placement}\r\n delayShow={delayShow}\r\n delayHide={delayHide}\r\n className={cn(\"inline-block max-w-full\", className)}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={tooltipStyle}\r\n wrapperTabIndex={tooltipDisabled ? undefined : 0}\r\n disabled={tooltipDisabled}\r\n >\r\n <span className={cn(\"inline-block max-w-full align-bottom\", textClassName)}>\r\n {displayText}\r\n </span>\r\n </ToolTip>\r\n );\r\n}\r\n","import {\r\n forwardRef,\r\n useEffect,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type ChangeEvent,\r\n type KeyboardEvent,\r\n} from \"react\";\r\nimport toast from \"react-hot-toast\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { toDateInputValue } from \"../../utils/helpers\";\r\nimport type { CellEditPayload, CustomCellEditorProps, CustomCellEditorRef, DropdownOption } from \"./types\";\r\n\r\nfunction ButtonSpinner() {\r\n return (\r\n <svg\r\n className=\"animate-spin\"\r\n width={12}\r\n height={12}\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n aria-hidden\r\n >\r\n <circle\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"white\"\r\n strokeWidth=\"4\"\r\n strokeOpacity=\"0.25\"\r\n />\r\n <path\r\n d=\"M12 2a10 10 0 0 1 10 10\"\r\n stroke=\"white\"\r\n strokeWidth=\"4\"\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction normalizeInitialValue(\r\n initialValue: CustomCellEditorProps[\"value\"],\r\n inputType: CustomCellEditorProps[\"inputType\"]\r\n): string | number {\r\n if (inputType === \"date\" && initialValue != null && initialValue !== \"\") {\r\n return toDateInputValue(String(initialValue));\r\n }\r\n if (initialValue == null) {\r\n return \"\";\r\n }\r\n return initialValue;\r\n}\r\n\r\nexport const CustomCellEditor = forwardRef<\r\n CustomCellEditorRef,\r\n CustomCellEditorProps\r\n>(\r\n (\r\n {\r\n value: initialValue,\r\n name,\r\n inputType = \"text\",\r\n stopEditing,\r\n entityId,\r\n entityName = \"Record\",\r\n onSave,\r\n dropdownOptions = [],\r\n customOptions,\r\n valueKey = \"value\",\r\n labelKey = \"label\",\r\n containerStyle,\r\n className,\r\n inputClassName,\r\n loadingIndicator,\r\n saveButtonContent,\r\n cancelButtonContent,\r\n saveButtonStyle,\r\n cancelButtonStyle,\r\n saveButtonClassName,\r\n cancelButtonClassName,\r\n },\r\n ref\r\n ) => {\r\n const normalizedInitial = normalizeInitialValue(initialValue, inputType);\r\n const [value, setValue] = useState<string | number>(normalizedInitial);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const selectRef = useRef<HTMLSelectElement>(null);\r\n\r\n // Merge customOptions (arbitrary shape) and dropdownOptions ({value,label}) into one array\r\n const normalizedOptions = useMemo<DropdownOption[]>(() => {\r\n if (customOptions && customOptions.length > 0) {\r\n return customOptions.map((opt) => ({\r\n value: String(opt[valueKey] ?? \"\"),\r\n label: String(opt[labelKey] ?? \"\"),\r\n }));\r\n }\r\n return dropdownOptions;\r\n }, [customOptions, dropdownOptions, valueKey, labelKey]);\r\n\r\n const isDropdown = inputType === \"dropdown\" || normalizedOptions.length > 0;\r\n\r\n useImperativeHandle(ref, () => ({\r\n getValue: () => value,\r\n isCancelBeforeStart: () => false,\r\n isCancelAfterEnd: () => false,\r\n isPopup: () => true,\r\n }));\r\n\r\n useEffect(() => {\r\n if (isDropdown) {\r\n selectRef.current?.focus();\r\n return;\r\n }\r\n const el = inputRef.current;\r\n if (!el) return;\r\n el.focus();\r\n if (inputType !== \"date\") {\r\n el.select();\r\n }\r\n }, [isDropdown, inputType]);\r\n\r\n const handleSave = async () => {\r\n if (isLoading) return;\r\n\r\n if (String(value) === String(normalizedInitial)) {\r\n stopEditing();\r\n return;\r\n }\r\n\r\n if (!name) {\r\n toast.error(\"Property name is required\");\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n const payloadValue: string | number =\r\n inputType === \"number\" && value !== \"\"\r\n ? parseFloat(String(value))\r\n : value;\r\n\r\n const payload: CellEditPayload = {\r\n propertyName: name,\r\n propertyValue: payloadValue,\r\n entityId,\r\n entityName,\r\n };\r\n\r\n try {\r\n await onSave(payload);\r\n toast.success(\"Record updated successfully\");\r\n stopEditing();\r\n } catch (error) {\r\n console.error(\"Update error:\", error);\r\n const errorMessage =\r\n error instanceof Error ? error.message : \"Failed to update record\";\r\n toast.error(errorMessage);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n setValue(normalizedInitial);\r\n stopEditing();\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement | HTMLSelectElement>) => {\r\n if (event.key === \"Enter\") {\r\n event.preventDefault();\r\n handleSave();\r\n } else if (event.key === \"Escape\") {\r\n event.preventDefault();\r\n handleCancel();\r\n }\r\n };\r\n\r\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n let newValue = event.target.value;\r\n if (inputType === \"number\") {\r\n newValue = newValue.replace(/[^0-9.-]/g, \"\");\r\n }\r\n setValue(newValue);\r\n };\r\n\r\n const handleDropdownChange = (event: ChangeEvent<HTMLSelectElement>) => {\r\n setValue(event.target.value);\r\n };\r\n\r\n const isSaveDisabled =\r\n isLoading || String(value) === String(normalizedInitial);\r\n\r\n const defaultInputClass =\r\n \"w-48 px-2 py-1 text-sm border border-gray-200 rounded-md bg-white focus:outline-none focus:ring-1 focus:ring-blue-400\";\r\n\r\n const defaultSaveBtnClass =\r\n \"px-3 py-1 text-sm font-medium text-white bg-green-500 rounded-md hover:bg-green-600 disabled:opacity-50 whitespace-nowrap shrink-0\";\r\n\r\n const defaultCancelBtnClass =\r\n \"px-3 py-1 text-sm font-medium text-white bg-red-500 rounded-md hover:bg-red-600 disabled:opacity-50 whitespace-nowrap shrink-0\";\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"flex items-center gap-2 px-2 py-1 min-w-[320px] bg-white border border-gray-200 rounded-md shadow-md\",\r\n className\r\n )}\r\n style={containerStyle}\r\n >\r\n {isDropdown ? (\r\n <select\r\n ref={selectRef}\r\n value={String(value)}\r\n onChange={handleDropdownChange}\r\n onKeyDown={handleKeyDown}\r\n className={inputClassName ?? defaultInputClass}\r\n disabled={isLoading}\r\n >\r\n <option value=\"\" disabled>\r\n Select option...\r\n </option>\r\n {normalizedOptions.map((opt) => (\r\n <option key={opt.value} value={opt.value}>\r\n {opt.label}\r\n </option>\r\n ))}\r\n </select>\r\n ) : (\r\n <input\r\n ref={inputRef}\r\n type={inputType}\r\n value={String(value)}\r\n onChange={handleInputChange}\r\n onKeyDown={handleKeyDown}\r\n className={inputClassName ?? defaultInputClass}\r\n placeholder=\"...\"\r\n disabled={isLoading}\r\n />\r\n )}\r\n\r\n <button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={isSaveDisabled}\r\n className={saveButtonClassName ?? (saveButtonStyle ? undefined : defaultSaveBtnClass)}\r\n style={saveButtonStyle}\r\n title=\"Save (Enter)\"\r\n >\r\n {isLoading\r\n ? (loadingIndicator ?? <ButtonSpinner />)\r\n : (saveButtonContent ?? \"Save\")}\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleCancel}\r\n disabled={isLoading}\r\n className={cancelButtonClassName ?? (cancelButtonStyle ? undefined : defaultCancelBtnClass)}\r\n style={cancelButtonStyle}\r\n title=\"Cancel (Escape)\"\r\n >\r\n {cancelButtonContent ?? \"Cancel\"}\r\n </button>\r\n </div>\r\n );\r\n }\r\n);\r\n\r\nCustomCellEditor.displayName = \"CustomCellEditor\";\r\n\r\nexport default CustomCellEditor;\r\n","import { useRef, useState } from \"react\";\r\nimport Tippy from \"@tippyjs/react\";\r\nimport type { TippyProps } from \"@tippyjs/react\";\r\nimport { BiDotsVerticalRounded } from \"react-icons/bi\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type { PopupCellRendererProps } from \"./types\";\r\n\r\n/**\r\n * Interactive popup trigger for table row actions (e.g. AG Grid cell renderer).\r\n *\r\n * Import Tippy styles in your app once:\r\n * `import \"tippy.js/dist/tippy.css\"`\r\n * `import \"tippy.js/themes/light.css\"`\r\n */\r\nexport function PopupCellRenderer<TRow = unknown>({\r\n dropDownContent,\r\n actionIcon: ActionIcon = BiDotsVerticalRounded,\r\n title = \"Actions\",\r\n className,\r\n hideTitle = false,\r\n params,\r\n onAction,\r\n placement = \"bottom-end\",\r\n tippyProps,\r\n ariaLabel = \"Row actions\",\r\n openOnHover = false,\r\n}: PopupCellRendererProps<TRow>) {\r\n const [visible, setVisible] = useState(false);\r\n const instanceRef = useRef<{ hide: () => void } | null>(null);\r\n\r\n const show = () => setVisible(true);\r\n const hide = () => {\r\n setVisible(false);\r\n instanceRef.current?.hide();\r\n };\r\n\r\n const rowData = params?.data;\r\n\r\n const handleAction = (actionType: string, actionRowData?: TRow) => {\r\n onAction?.(actionType, actionRowData ?? rowData, hide);\r\n hide();\r\n };\r\n\r\n const content: TippyProps[\"content\"] =\r\n typeof dropDownContent === \"function\"\r\n ? dropDownContent(handleAction)\r\n : dropDownContent;\r\n\r\n const hoverOrClickProps: Partial<TippyProps> = openOnHover\r\n ? {\r\n trigger: \"mouseenter\",\r\n delay: [0, 150],\r\n hideOnClick: false,\r\n }\r\n : {\r\n visible,\r\n onClickOutside: hide,\r\n };\r\n\r\n return (\r\n <div className=\"flex h-full\">\r\n <Tippy\r\n content={content}\r\n allowHTML\r\n arrow={false}\r\n appendTo={() => document.body}\r\n interactive\r\n placement={placement}\r\n animation=\"shift-away\"\r\n theme=\"light\"\r\n maxWidth=\"none\"\r\n offset={[0, 5]}\r\n onCreate={(instance) => {\r\n instanceRef.current = instance;\r\n }}\r\n {...hoverOrClickProps}\r\n {...tippyProps}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={openOnHover ? undefined : visible ? hide : show}\r\n className={cn(\r\n \"flex items-center justify-center gap-2 rounded-full text-gray-500 hover:text-gray-800\",\r\n className,\r\n )}\r\n aria-label={ariaLabel}\r\n >\r\n {!hideTitle && title}\r\n <ActionIcon aria-hidden />\r\n </button>\r\n </Tippy>\r\n </div>\r\n );\r\n}\r\n","import type { CSSProperties } from \"react\";\r\nimport {\r\n FaArchive,\r\n FaCheckCircle,\r\n FaDownload,\r\n FaEdit,\r\n FaEye,\r\n FaFileAlt,\r\n FaHistory,\r\n FaTrashAlt,\r\n} from \"react-icons/fa\";\r\nimport type { RowActionPreset, RowActionPresetName } from \"./types\";\r\n\r\n/** Settings-app hover: peach bg `#FFF1EB` + orange text (`primary-50` / `primary-150`). */\r\nexport const ROW_ACTION_ITEM_HOVER_CLASS =\r\n \"hover:bg-primary-50 hover:text-primary-150\";\r\n\r\n/** Settings/Department rest color (`#6C757D`). */\r\nexport const ROW_ACTION_ITEM_TEXT_CLASS = \"text-secondary\";\r\n\r\nexport const ROW_ACTION_DEFAULT_ICON_SIZE = 16;\r\n\r\nexport const ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE: CSSProperties = {\r\n zIndex: 10000,\r\n};\r\n\r\nexport const ROW_ACTION_PRESETS: Record<RowActionPresetName, RowActionPreset> = {\r\n edit: { label: \"Edit\", icon: FaEdit },\r\n delete: { label: \"Delete\", icon: FaTrashAlt, danger: true, iconClassName: \"text-red-500\" },\r\n view: { label: \"View\", icon: FaEye },\r\n notes: { label: \"Notes\", icon: FaFileAlt },\r\n history: { label: \"History\", icon: FaHistory },\r\n download: { label: \"Download\", icon: FaDownload },\r\n archive: { label: \"Archive\", icon: FaArchive },\r\n resolve: { label: \"Resolve\", icon: FaCheckCircle },\r\n};\r\n","import { ToolTip } from \"../tooltip/ToolTip\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport {\r\n ROW_ACTION_DEFAULT_ICON_SIZE,\r\n ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE,\r\n ROW_ACTION_ITEM_HOVER_CLASS,\r\n ROW_ACTION_ITEM_TEXT_CLASS,\r\n} from \"./presets\";\r\nimport type { ActionMenuItemProps } from \"./types\";\r\n\r\nexport function ActionMenuItem({\r\n label,\r\n icon: Icon,\r\n iconSize = ROW_ACTION_DEFAULT_ICON_SIZE,\r\n iconClassName,\r\n labelClassName,\r\n tooltip,\r\n tooltipPlacement = \"top\",\r\n tooltipDelayShow,\r\n tooltipDelayHide,\r\n tooltipClassName,\r\n tooltipStyle,\r\n disabled = false,\r\n danger = false,\r\n highlight = false,\r\n showLabel = true,\r\n className,\r\n onClick,\r\n}: ActionMenuItemProps) {\r\n const tooltipText = tooltip ?? label;\r\n\r\n return (\r\n <ToolTip\r\n text={tooltipText}\r\n disabled={!tooltipText}\r\n placement={tooltipPlacement}\r\n delayShow={tooltipDelayShow}\r\n delayHide={tooltipDelayHide}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={{ ...ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE, ...tooltipStyle }}\r\n className={showLabel ? \"block w-full\" : \"inline-flex\"}\r\n >\r\n <button\r\n type=\"button\"\r\n disabled={disabled}\r\n aria-label={label}\r\n onClick={(event) => {\r\n event.stopPropagation();\r\n if (disabled) return;\r\n onClick();\r\n }}\r\n className={cn(\r\n \"flex items-center gap-2 text-sm transition-colors duration-150\",\r\n ROW_ACTION_ITEM_TEXT_CLASS,\r\n showLabel\r\n ? \"w-full rounded-xl px-3 py-2 text-left\"\r\n : \"justify-center rounded-md p-1\",\r\n disabled ? \"cursor-not-allowed opacity-50\" : ROW_ACTION_ITEM_HOVER_CLASS,\r\n highlight && !danger && \"text-primary-150\",\r\n className,\r\n )}\r\n >\r\n {Icon ? (\r\n <Icon\r\n className={cn(\"shrink-0\", iconClassName)}\r\n aria-hidden\r\n size={iconSize}\r\n />\r\n ) : null}\r\n {showLabel ? <span className={labelClassName}>{label}</span> : null}\r\n </button>\r\n </ToolTip>\r\n );\r\n}\r\n","import { ROW_ACTION_PRESETS } from \"./presets\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport type {\r\n ResolvedRowAction,\r\n RowAction,\r\n RowActionFlag,\r\n RowActionPreset,\r\n RowActionPresetName,\r\n RowActionsList,\r\n} from \"./types\";\r\n\r\nfunction evalFlag<TRow>(\r\n flag: RowActionFlag<TRow> | undefined,\r\n data: TRow | undefined,\r\n): boolean {\r\n if (typeof flag === \"function\") return Boolean(flag(data));\r\n return Boolean(flag);\r\n}\r\n\r\nfunction mergePreset(\r\n name: RowActionPresetName | undefined,\r\n overrides?: Partial<Record<RowActionPresetName, Partial<RowActionPreset>>>,\r\n): RowActionPreset | undefined {\r\n if (!name) return undefined;\r\n const base = ROW_ACTION_PRESETS[name];\r\n const extra = overrides?.[name];\r\n if (!extra) return base;\r\n return { ...base, ...extra };\r\n}\r\n\r\nexport function resolveActions<TRow>(\r\n actions: RowActionsList<TRow>,\r\n data: TRow | undefined,\r\n hasPermission?: (permission: string) => boolean,\r\n presets?: Partial<Record<RowActionPresetName, Partial<RowActionPreset>>>,\r\n): ResolvedRowAction<TRow>[] {\r\n const list = typeof actions === \"function\" ? actions(data) : actions;\r\n\r\n return list.flatMap((action: RowAction<TRow>, index) => {\r\n const type = action.type ?? \"item\";\r\n const preset = mergePreset(action.preset, presets);\r\n const key = action.key ?? action.preset ?? `action-${index}`;\r\n const label = action.label ?? preset?.label ?? key;\r\n\r\n if (action.permission && hasPermission && !hasPermission(action.permission)) {\r\n return [];\r\n }\r\n\r\n if (evalFlag(action.hidden, data)) {\r\n return [];\r\n }\r\n\r\n const tooltip =\r\n action.tooltip === false\r\n ? undefined\r\n : (action.tooltip ?? (type === \"divider\" ? undefined : label));\r\n\r\n const resolved: ResolvedRowAction<TRow> = {\r\n key,\r\n type,\r\n label,\r\n icon: action.icon ?? preset?.icon,\r\n iconSize: action.iconSize,\r\n content: action.content,\r\n onClick: action.onClick,\r\n disabled: evalFlag(action.disabled, data),\r\n danger: action.danger ?? preset?.danger ?? false,\r\n highlight: evalFlag(action.highlight, data),\r\n tooltip,\r\n tooltipPlacement: action.tooltipPlacement,\r\n confirm: action.confirm,\r\n closeOnClick: action.closeOnClick !== false,\r\n className: action.className,\r\n iconClassName: cn(preset?.iconClassName, action.iconClassName) || undefined,\r\n labelClassName: action.labelClassName,\r\n };\r\n\r\n return [resolved];\r\n });\r\n}\r\n","import type { ReactNode } from \"react\";\r\nimport { ToolTip } from \"../tooltip/ToolTip\";\r\nimport { PopupCellRenderer } from \"../popup-cell-renderer/PopupCellRenderer\";\r\nimport { confirmationAlert } from \"../../utils/handleApiError\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { ActionMenuItem } from \"./ActionMenuItem\";\r\nimport {\r\n ROW_ACTION_DEFAULT_ICON_SIZE,\r\n ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE,\r\n} from \"./presets\";\r\nimport { resolveActions } from \"./resolveActions\";\r\nimport type { ResolvedRowAction, RowActionsProps } from \"./types\";\r\n\r\nfunction runAction<TRow>(\r\n action: ResolvedRowAction<TRow>,\r\n data: TRow | undefined,\r\n hide?: () => void,\r\n confirmFn: RowActionsProps<TRow>[\"confirmFn\"] = confirmationAlert,\r\n) {\r\n if (!action.onClick) {\r\n if (action.closeOnClick) hide?.();\r\n return;\r\n }\r\n\r\n const execute = () => action.onClick?.(data);\r\n\r\n if (action.confirm) {\r\n confirmFn?.(execute, action.confirm);\r\n } else {\r\n execute();\r\n }\r\n\r\n if (action.closeOnClick) {\r\n hide?.();\r\n }\r\n}\r\n\r\nexport function RowActions<TRow = unknown>({\r\n actions,\r\n data,\r\n mode = \"menu\",\r\n actionIcon,\r\n className,\r\n menuClassName,\r\n itemClassName,\r\n itemIconClassName,\r\n itemLabelClassName,\r\n iconSize = ROW_ACTION_DEFAULT_ICON_SIZE,\r\n triggerTooltip = \"Actions\",\r\n triggerAriaLabel = \"Row actions\",\r\n hasPermission,\r\n placement = \"bottom-end\",\r\n openOnHover = false,\r\n tippyProps,\r\n presets,\r\n confirmFn = confirmationAlert,\r\n tooltipPlacement = \"top\",\r\n tooltipDelayShow,\r\n tooltipDelayHide,\r\n tooltipClassName,\r\n tooltipStyle,\r\n renderItem,\r\n renderMenu,\r\n renderTrigger,\r\n}: RowActionsProps<TRow>) {\r\n const resolved = resolveActions(actions, data, hasPermission, presets);\r\n\r\n if (resolved.length === 0) {\r\n return null;\r\n }\r\n\r\n const mergedTooltipStyle = {\r\n ...ROW_ACTION_DEFAULT_MENU_TOOLTIP_STYLE,\r\n ...tooltipStyle,\r\n };\r\n\r\n const renderDefaultItem = (\r\n action: ResolvedRowAction<TRow>,\r\n hide?: () => void,\r\n showLabel = true,\r\n ): ReactNode => {\r\n if (action.type === \"divider\") {\r\n return (\r\n <div\r\n key={action.key}\r\n role=\"separator\"\r\n className={cn(\"my-1 h-px bg-gray-100\", action.className)}\r\n />\r\n );\r\n }\r\n\r\n if (action.content) {\r\n return (\r\n <div key={action.key} className={action.className}>\r\n {action.content}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <ActionMenuItem\r\n key={action.key}\r\n label={action.label}\r\n icon={action.icon}\r\n iconSize={action.iconSize ?? iconSize}\r\n iconClassName={cn(itemIconClassName, action.iconClassName)}\r\n labelClassName={cn(itemLabelClassName, action.labelClassName)}\r\n tooltip={action.tooltip}\r\n tooltipPlacement={action.tooltipPlacement ?? tooltipPlacement}\r\n tooltipDelayShow={tooltipDelayShow}\r\n tooltipDelayHide={tooltipDelayHide}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={mergedTooltipStyle}\r\n disabled={action.disabled}\r\n danger={action.danger}\r\n highlight={action.highlight}\r\n showLabel={showLabel}\r\n className={cn(itemClassName, action.className)}\r\n onClick={() => runAction(action, data, hide, confirmFn)}\r\n />\r\n );\r\n };\r\n\r\n const renderItems = (hide?: () => void, showLabel = true): ReactNode =>\r\n resolved.map((action) => {\r\n const defaultItem = renderDefaultItem(action, hide, showLabel);\r\n if (!renderItem) return defaultItem;\r\n return (\r\n <div key={action.key}>\r\n {renderItem(action, { data, hide: hide ?? (() => undefined), defaultItem })}\r\n </div>\r\n );\r\n });\r\n\r\n if (mode === \"inline\") {\r\n const inlineItems = renderItems(undefined, false);\r\n return (\r\n <div className={cn(\"flex h-full items-center justify-center gap-1\", className)}>\r\n {inlineItems}\r\n </div>\r\n );\r\n }\r\n\r\n const triggerTooltipText =\r\n triggerTooltip === false ? undefined : triggerTooltip;\r\n\r\n const buildMenu = (hide: () => void): ReactNode => {\r\n const defaultMenu = (\r\n <div\r\n className={cn(\r\n \"flex min-w-[180px] flex-col rounded-lg border border-gray-100 bg-white p-2 shadow-lg\",\r\n menuClassName,\r\n )}\r\n >\r\n {renderItems(hide, true)}\r\n </div>\r\n );\r\n\r\n if (!renderMenu) return defaultMenu;\r\n return renderMenu({\r\n data,\r\n actions: resolved,\r\n hide,\r\n defaultMenu,\r\n });\r\n };\r\n\r\n if (renderTrigger) {\r\n return (\r\n <>\r\n {renderTrigger({\r\n data,\r\n actions: resolved,\r\n hide: () => undefined,\r\n defaultMenu: buildMenu(() => undefined),\r\n })}\r\n </>\r\n );\r\n }\r\n\r\n return (\r\n <ToolTip\r\n text={triggerTooltipText}\r\n disabled={!triggerTooltipText}\r\n placement={tooltipPlacement}\r\n delayShow={tooltipDelayShow}\r\n delayHide={tooltipDelayHide}\r\n tooltipClassName={tooltipClassName}\r\n tooltipStyle={tooltipStyle}\r\n className=\"flex h-full items-center justify-center\"\r\n >\r\n <PopupCellRenderer\r\n params={{ data }}\r\n actionIcon={actionIcon}\r\n hideTitle\r\n className={className}\r\n placement={placement}\r\n openOnHover={openOnHover}\r\n tippyProps={tippyProps}\r\n ariaLabel={triggerAriaLabel}\r\n dropDownContent={(handleAction) =>\r\n buildMenu(() => handleAction(\"close\"))\r\n }\r\n />\r\n </ToolTip>\r\n );\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport { FaArrowsRotate, FaTriangleExclamation } from \"react-icons/fa6\";\r\nimport { cn } from \"../../utils/cn\";\r\nimport { classifyError } from \"../../utils/handleApiError\";\r\nimport { Loader } from \"../Loader\";\r\nimport type { TableErrorBoundaryProps } from \"./types\";\r\n\r\nexport const TableErrorBoundary: React.FC<TableErrorBoundaryProps> = ({\r\n isError,\r\n isLoading = false,\r\n refetch,\r\n children,\r\n error,\r\n errorMessage,\r\n className,\r\n minHeight = \"280px\",\r\n}) => {\r\n const message = useMemo(() => {\r\n if (errorMessage) return errorMessage;\r\n if (error) return classifyError(error).userMessage;\r\n return \"Unable to load table data. Please try again.\";\r\n }, [error, errorMessage]);\r\n\r\n if (isLoading && !isError) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex w-full items-center justify-center rounded-xl bg-neutral-50\",\r\n className\r\n )}\r\n style={{ minHeight }}\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n >\r\n <Loader size=\"40px\" />\r\n </div>\r\n );\r\n }\r\n\r\n if (isError) {\r\n return (\r\n <div\r\n className={cn(\r\n \"flex w-full flex-col items-center justify-center gap-4 rounded-xl border border-red-100 bg-red-50 px-6 py-10 text-center\",\r\n className\r\n )}\r\n style={{ minHeight }}\r\n role=\"alert\"\r\n aria-live=\"assertive\"\r\n >\r\n <FaTriangleExclamation\r\n className=\"text-red-500\"\r\n size={32}\r\n aria-hidden\r\n />\r\n <div className=\"max-w-md space-y-1\">\r\n <p className=\"text-base font-semibold text-gray-800\">\r\n Failed to load data\r\n </p>\r\n <p className=\"text-sm text-gray-600\">{message}</p>\r\n </div>\r\n {refetch && (\r\n <button\r\n type=\"button\"\r\n onClick={() => refetch()}\r\n disabled={isLoading}\r\n className=\"inline-flex items-center gap-2 rounded-lg bg-primary-150 px-4 py-2 text-sm font-medium text-white transition-colors hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60\"\r\n >\r\n <FaArrowsRotate className={cn(isLoading && \"animate-spin\")} />\r\n {isLoading ? \"Retrying...\" : \"Try again\"}\r\n </button>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n"],"mappings":"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","names":["clsx","Swal","toast","import_react","import_react","import_jsx_runtime","import_react","import_react_router_dom","import_jsx_runtime","Select","import_react_router_dom","import_jsx_runtime","import_react","import_react_router_dom","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","BASE_STYLES","VARIANTS","import_jsx_runtime","import_jsx_runtime","import_react","import_react_router_dom","import_jsx_runtime","import_react","import_react_router_dom","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_","import_jsx_runtime","import_react","import_react_hot_toast","import_jsx_runtime","toast","import_react","import_jsx_runtime","Tippy","import_fa","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}
|