@startdownnotez404/ui 1.3.5 → 1.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AutocompleteField-653233JU.mjs +203 -0
- package/dist/AutocompleteField-653233JU.mjs.map +1 -0
- package/dist/AvatarField-KFASMVZU.mjs +378 -0
- package/dist/AvatarField-KFASMVZU.mjs.map +1 -0
- package/dist/{DateField-ZYMZFHL4.mjs → DateField-CDJ6W6XF.mjs} +19 -7
- package/dist/DateField-CDJ6W6XF.mjs.map +1 -0
- package/dist/DateRangeField-ZWSFT5KV.mjs +118 -0
- package/dist/DateRangeField-ZWSFT5KV.mjs.map +1 -0
- package/dist/{DateTimeField-TPTJ7YIZ.mjs → DateTimeField-SFAF4I6A.mjs} +36 -11
- package/dist/DateTimeField-SFAF4I6A.mjs.map +1 -0
- package/dist/FileUploadField-TSNCSLXX.mjs +101 -0
- package/dist/FileUploadField-TSNCSLXX.mjs.map +1 -0
- package/dist/{JSONEditorField-TMRWGXVR.mjs → JSONEditorField-3KXC2GOG.mjs} +7 -6
- package/dist/{JSONEditorField-TMRWGXVR.mjs.map → JSONEditorField-3KXC2GOG.mjs.map} +1 -1
- package/dist/{PopperMenu-LJ36RPBW.mjs → PopperMenu-PSHLKIEZ.mjs} +26 -12
- package/dist/{PopperMenu-LJ36RPBW.mjs.map → PopperMenu-PSHLKIEZ.mjs.map} +1 -1
- package/dist/{TelField-LOGRVZ4I.mjs → TelField-FRQT2UBJ.mjs} +8 -7
- package/dist/{TelField-LOGRVZ4I.mjs.map → TelField-FRQT2UBJ.mjs.map} +1 -1
- package/dist/TimeField-XVWXBJID.mjs +94 -0
- package/dist/TimeField-XVWXBJID.mjs.map +1 -0
- package/dist/alert.d.mts +148 -18
- package/dist/alert.d.ts +148 -18
- package/dist/alert.js +698 -254
- package/dist/alert.js.map +1 -1
- package/dist/alert.mjs +46 -10
- package/dist/autocomplete.d.mts +438 -4
- package/dist/autocomplete.d.ts +438 -4
- package/dist/autocomplete.js +632 -21
- package/dist/autocomplete.js.map +1 -1
- package/dist/autocomplete.mjs +26 -7
- package/dist/avatar.js +2 -1
- package/dist/avatar.js.map +1 -1
- package/dist/avatar.mjs +12 -11
- package/dist/box.mjs +2 -1
- package/dist/button.mjs +3 -2
- package/dist/chart.mjs +3 -2
- package/dist/checkbox.mjs +3 -2
- package/dist/chunk-2FK24ZPJ.mjs +78 -0
- package/dist/chunk-2FK24ZPJ.mjs.map +1 -0
- package/dist/{chunk-V26V2S3W.mjs → chunk-3O3N6X6D.mjs} +3 -3
- package/dist/{chunk-Y74ALKBL.mjs → chunk-4MSPA7U7.mjs} +11 -9
- package/dist/{chunk-Y74ALKBL.mjs.map → chunk-4MSPA7U7.mjs.map} +1 -1
- package/dist/{chunk-24XDGNJ6.mjs → chunk-4P45Z5LR.mjs} +63 -41
- package/dist/chunk-4P45Z5LR.mjs.map +1 -0
- package/dist/chunk-4SSJY32J.mjs +1182 -0
- package/dist/chunk-4SSJY32J.mjs.map +1 -0
- package/dist/{chunk-XJ2SXC2Q.mjs → chunk-6B6I27TT.mjs} +18 -16
- package/dist/{chunk-XJ2SXC2Q.mjs.map → chunk-6B6I27TT.mjs.map} +1 -1
- package/dist/chunk-6JKMEH2L.mjs +205 -0
- package/dist/chunk-6JKMEH2L.mjs.map +1 -0
- package/dist/{chunk-IN3O4R7Q.mjs → chunk-7O526A2D.mjs} +6 -4
- package/dist/{chunk-IN3O4R7Q.mjs.map → chunk-7O526A2D.mjs.map} +1 -1
- package/dist/chunk-AFLEG5ZC.mjs +28 -0
- package/dist/chunk-AFLEG5ZC.mjs.map +1 -0
- package/dist/{chunk-UGMRJMFZ.mjs → chunk-BO5CU4ZM.mjs} +4 -4
- package/dist/{chunk-JIU5GVM7.mjs → chunk-D4XPNSSI.mjs} +5 -3
- package/dist/{chunk-JIU5GVM7.mjs.map → chunk-D4XPNSSI.mjs.map} +1 -1
- package/dist/chunk-DPIMA5IO.mjs +72 -0
- package/dist/chunk-DPIMA5IO.mjs.map +1 -0
- package/dist/chunk-F2CGFVIZ.mjs +83 -0
- package/dist/chunk-F2CGFVIZ.mjs.map +1 -0
- package/dist/{chunk-R5MKQN6D.mjs → chunk-FBLSJQWK.mjs} +3 -3
- package/dist/{chunk-BGB7JHIU.mjs → chunk-FMGZCOJC.mjs} +5 -3
- package/dist/{chunk-BGB7JHIU.mjs.map → chunk-FMGZCOJC.mjs.map} +1 -1
- package/dist/{chunk-UTVSYS6S.mjs → chunk-FNSIQ2B7.mjs} +18 -6
- package/dist/chunk-FNSIQ2B7.mjs.map +1 -0
- package/dist/{chunk-JWANK42G.mjs → chunk-FUZ2JNTZ.mjs} +3 -3
- package/dist/{chunk-CRYIEYZZ.mjs → chunk-HAJWE62X.mjs} +66 -42
- package/dist/chunk-HAJWE62X.mjs.map +1 -0
- package/dist/{chunk-CWFWRZWU.mjs → chunk-KSN33A6I.mjs} +3 -2
- package/dist/{chunk-CWFWRZWU.mjs.map → chunk-KSN33A6I.mjs.map} +1 -1
- package/dist/chunk-KYTHGFFY.mjs +866 -0
- package/dist/chunk-KYTHGFFY.mjs.map +1 -0
- package/dist/{chunk-QKGCW37O.mjs → chunk-LDFM46LV.mjs} +5 -3
- package/dist/{chunk-QKGCW37O.mjs.map → chunk-LDFM46LV.mjs.map} +1 -1
- package/dist/chunk-LQNDBPHU.mjs +142 -0
- package/dist/chunk-LQNDBPHU.mjs.map +1 -0
- package/dist/{chunk-E3I2VDHZ.mjs → chunk-M2PYXSAF.mjs} +6 -4
- package/dist/{chunk-E3I2VDHZ.mjs.map → chunk-M2PYXSAF.mjs.map} +1 -1
- package/dist/{chunk-DELCADNF.mjs → chunk-ODVKRIVN.mjs} +30 -30
- package/dist/{chunk-HR3A4H4E.mjs → chunk-PEJL2T2K.mjs} +13 -11
- package/dist/{chunk-HR3A4H4E.mjs.map → chunk-PEJL2T2K.mjs.map} +1 -1
- package/dist/{chunk-OGNGPI3M.mjs → chunk-PL55YKT4.mjs} +2 -2
- package/dist/{chunk-S6EZVRZC.mjs → chunk-PNSJC6PC.mjs} +5 -28
- package/dist/chunk-PNSJC6PC.mjs.map +1 -0
- package/dist/{chunk-TDRA5EZI.mjs → chunk-PUREEN2J.mjs} +7 -7
- package/dist/chunk-QFS5CENY.mjs +659 -0
- package/dist/chunk-QFS5CENY.mjs.map +1 -0
- package/dist/chunk-RSN7NH2J.mjs +250 -0
- package/dist/chunk-RSN7NH2J.mjs.map +1 -0
- package/dist/{chunk-UDREPVEY.mjs → chunk-RVSMEZE3.mjs} +12 -78
- package/dist/chunk-RVSMEZE3.mjs.map +1 -0
- package/dist/{chunk-SRWPHN2N.mjs → chunk-S64IYJ6Y.mjs} +2 -2
- package/dist/{chunk-ZG3NQI77.mjs → chunk-SMD7OEUW.mjs} +6 -4
- package/dist/{chunk-ZG3NQI77.mjs.map → chunk-SMD7OEUW.mjs.map} +1 -1
- package/dist/{chunk-NJYNJLT7.mjs → chunk-SWFB3A3G.mjs} +2 -2
- package/dist/{chunk-RXBQ7KXF.mjs → chunk-USXGNKWJ.mjs} +98 -44
- package/dist/chunk-USXGNKWJ.mjs.map +1 -0
- package/dist/{chunk-OJV6V7YZ.mjs → chunk-VL7V52YD.mjs} +27 -20
- package/dist/chunk-VL7V52YD.mjs.map +1 -0
- package/dist/{chunk-2ZZJTBTE.mjs → chunk-WJZ3IYET.mjs} +2 -2
- package/dist/chunk-XAJAMVAG.mjs +1720 -0
- package/dist/chunk-XAJAMVAG.mjs.map +1 -0
- package/dist/chunk-YIJ5QVJ6.mjs +277 -0
- package/dist/chunk-YIJ5QVJ6.mjs.map +1 -0
- package/dist/{chunk-T6AMRENK.mjs → chunk-YRW5NKD7.mjs} +148 -112
- package/dist/chunk-YRW5NKD7.mjs.map +1 -0
- package/dist/chunk-ZMJKG2UI.mjs +71 -0
- package/dist/chunk-ZMJKG2UI.mjs.map +1 -0
- package/dist/confirm.d.mts +48 -0
- package/dist/confirm.d.ts +48 -0
- package/dist/confirm.js +334 -0
- package/dist/confirm.js.map +1 -0
- package/dist/confirm.mjs +20 -0
- package/dist/datePicker.d.mts +256 -14
- package/dist/datePicker.d.ts +256 -14
- package/dist/datePicker.js +1624 -145
- package/dist/datePicker.js.map +1 -1
- package/dist/datePicker.mjs +19 -6
- package/dist/dialog.d.mts +166 -0
- package/dist/dialog.d.ts +166 -0
- package/dist/dialog.js +362 -0
- package/dist/dialog.js.map +1 -0
- package/dist/dialog.mjs +45 -0
- package/dist/emptyState.d.mts +17 -0
- package/dist/emptyState.d.ts +17 -0
- package/dist/emptyState.js +253 -0
- package/dist/emptyState.js.map +1 -0
- package/dist/emptyState.mjs +12 -0
- package/dist/emptyState.mjs.map +1 -0
- package/dist/errorState.d.mts +18 -0
- package/dist/errorState.d.ts +18 -0
- package/dist/{displayFile.js → errorState.js} +107 -156
- package/dist/errorState.js.map +1 -0
- package/dist/errorState.mjs +15 -0
- package/dist/errorState.mjs.map +1 -0
- package/dist/fileUpload.d.mts +197 -0
- package/dist/fileUpload.d.ts +197 -0
- package/dist/fileUpload.js +1483 -0
- package/dist/fileUpload.js.map +1 -0
- package/dist/fileUpload.mjs +65 -0
- package/dist/fileUpload.mjs.map +1 -0
- package/dist/flowMap.mjs +7 -6
- package/dist/flowMap.mjs.map +1 -1
- package/dist/image.js +1195 -429
- package/dist/image.js.map +1 -1
- package/dist/image.mjs +8 -6
- package/dist/index.d.ts +7 -2
- package/dist/index.js +8606 -4087
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +314 -152
- package/dist/inlineError.d.mts +16 -0
- package/dist/inlineError.d.ts +16 -0
- package/dist/inlineError.js +297 -0
- package/dist/inlineError.js.map +1 -0
- package/dist/inlineError.mjs +15 -0
- package/dist/inlineError.mjs.map +1 -0
- package/dist/input.mjs +8 -7
- package/dist/jsonEditor.mjs +3 -2
- package/dist/list.mjs +7 -6
- package/dist/loading.mjs +8 -6
- package/dist/markdown.mjs +7 -6
- package/dist/markdown.mjs.map +1 -1
- package/dist/menu.mjs +9 -8
- package/dist/modal.js +2 -1
- package/dist/modal.js.map +1 -1
- package/dist/modal.mjs +7 -5
- package/dist/process.d.mts +33 -75
- package/dist/process.d.ts +33 -75
- package/dist/process.js +1275 -203
- package/dist/process.js.map +1 -1
- package/dist/process.mjs +12 -9
- package/dist/scrollToLoad.mjs +4 -3
- package/dist/select.mjs +10 -9
- package/dist/skeleton.d.mts +15 -1
- package/dist/skeleton.d.ts +15 -1
- package/dist/skeleton.js +114 -2
- package/dist/skeleton.js.map +1 -1
- package/dist/skeleton.mjs +6 -3
- package/dist/stepper.mjs +4 -3
- package/dist/tab.mjs +10 -9
- package/dist/table.d.mts +269 -85
- package/dist/table.d.ts +269 -85
- package/dist/table.js +5102 -3153
- package/dist/table.js.map +1 -1
- package/dist/table.mjs +21 -19
- package/dist/theme.js +1766 -432
- package/dist/theme.js.map +1 -1
- package/dist/theme.mjs +32 -25
- package/dist/timeline.mjs +4 -3
- package/dist/toast.d.mts +49 -0
- package/dist/toast.d.ts +49 -0
- package/dist/toast.js +175 -0
- package/dist/toast.js.map +1 -0
- package/dist/toast.mjs +9 -0
- package/dist/toast.mjs.map +1 -0
- package/dist/toggleButtonGroup.mjs +3 -2
- package/dist/useForm.d.mts +270 -86
- package/dist/useForm.d.ts +270 -86
- package/dist/useForm.js +4672 -2727
- package/dist/useForm.js.map +1 -1
- package/dist/useForm.mjs +18 -16
- package/dist/useSearch.mjs +13 -12
- package/dist/variablesRenderer.mjs +8 -7
- package/package.json +3 -3
- package/dist/AutocompleteField-ZKNU2IRR.mjs +0 -181
- package/dist/AutocompleteField-ZKNU2IRR.mjs.map +0 -1
- package/dist/AvatarField-SAODT3CZ.mjs +0 -275
- package/dist/AvatarField-SAODT3CZ.mjs.map +0 -1
- package/dist/DateField-ZYMZFHL4.mjs.map +0 -1
- package/dist/DateTimeField-TPTJ7YIZ.mjs.map +0 -1
- package/dist/FileUploadField-NTMWBJER.mjs +0 -78
- package/dist/FileUploadField-NTMWBJER.mjs.map +0 -1
- package/dist/chunk-24XDGNJ6.mjs.map +0 -1
- package/dist/chunk-27KYFU7R.mjs +0 -30
- package/dist/chunk-27KYFU7R.mjs.map +0 -1
- package/dist/chunk-AAH2O24U.mjs +0 -325
- package/dist/chunk-AAH2O24U.mjs.map +0 -1
- package/dist/chunk-CRYIEYZZ.mjs.map +0 -1
- package/dist/chunk-EEH7HACG.mjs +0 -249
- package/dist/chunk-EEH7HACG.mjs.map +0 -1
- package/dist/chunk-EKPULYPU.mjs +0 -497
- package/dist/chunk-EKPULYPU.mjs.map +0 -1
- package/dist/chunk-OJV6V7YZ.mjs.map +0 -1
- package/dist/chunk-RXBQ7KXF.mjs.map +0 -1
- package/dist/chunk-S6EZVRZC.mjs.map +0 -1
- package/dist/chunk-SGCUDWO3.mjs +0 -396
- package/dist/chunk-SGCUDWO3.mjs.map +0 -1
- package/dist/chunk-T6AMRENK.mjs.map +0 -1
- package/dist/chunk-UDREPVEY.mjs.map +0 -1
- package/dist/chunk-UTVSYS6S.mjs.map +0 -1
- package/dist/chunk-XIMFP6RB.mjs +0 -161
- package/dist/chunk-XIMFP6RB.mjs.map +0 -1
- package/dist/displayFile.d.mts +0 -95
- package/dist/displayFile.d.ts +0 -95
- package/dist/displayFile.js.map +0 -1
- package/dist/displayFile.mjs +0 -19
- package/dist/fileUploader.d.mts +0 -86
- package/dist/fileUploader.d.ts +0 -86
- package/dist/fileUploader.js +0 -722
- package/dist/fileUploader.js.map +0 -1
- package/dist/fileUploader.mjs +0 -16
- /package/dist/{chunk-V26V2S3W.mjs.map → chunk-3O3N6X6D.mjs.map} +0 -0
- /package/dist/{chunk-UGMRJMFZ.mjs.map → chunk-BO5CU4ZM.mjs.map} +0 -0
- /package/dist/{chunk-R5MKQN6D.mjs.map → chunk-FBLSJQWK.mjs.map} +0 -0
- /package/dist/{chunk-JWANK42G.mjs.map → chunk-FUZ2JNTZ.mjs.map} +0 -0
- /package/dist/{chunk-DELCADNF.mjs.map → chunk-ODVKRIVN.mjs.map} +0 -0
- /package/dist/{chunk-OGNGPI3M.mjs.map → chunk-PL55YKT4.mjs.map} +0 -0
- /package/dist/{chunk-TDRA5EZI.mjs.map → chunk-PUREEN2J.mjs.map} +0 -0
- /package/dist/{chunk-SRWPHN2N.mjs.map → chunk-S64IYJ6Y.mjs.map} +0 -0
- /package/dist/{chunk-NJYNJLT7.mjs.map → chunk-SWFB3A3G.mjs.map} +0 -0
- /package/dist/{chunk-2ZZJTBTE.mjs.map → chunk-WJZ3IYET.mjs.map} +0 -0
- /package/dist/{displayFile.mjs.map → confirm.mjs.map} +0 -0
- /package/dist/{fileUploader.mjs.map → dialog.mjs.map} +0 -0
package/dist/image.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/elemental/Image/index.ts","../src/components/elemental/Image/src/MuiImageList/MuiImageList.tsx","../src/components/elemental/Image/src/Cropper/Cropper.tsx","../src/_utils/_func/sx.ts","../src/components/elemental/Box/src/index.ts","../src/components/elemental/Image/src/Cropper/theme.ts","../src/components/elemental/Image/src/Cropper/layout/CropperLayout.tsx","../src/components/elemental/Image/src/Cropper/sections/CropperSourceSection.tsx","../src/components/elemental/Slider/src/Slider/index.ts","../src/components/elemental/Typography/src/Typography.ts","../src/components/elemental/Image/src/Cropper/sections/CropperControlsSection.tsx","../src/components/elemental/Button/src/Button/Button.tsx","../src/components/elemental/Button/src/IconButton/IconButton.tsx","../src/components/elemental/Tooltip/src/Tooltip/index.ts","../src/components/Icons/MuiIcon/index.ts","../src/components/elemental/Image/src/Cropper/sections/CropperActionSection.tsx","../src/components/elemental/Image/src/Cropper/sections/CropperFileSelector.tsx","../src/components/compound/FileUploader/src/ReactDropzone.tsx","../src/components/compound/FileUploader/src/theme.ts","../src/_utils/_func/downloadFile.ts","../src/_utils/_const/file.ts","../src/_utils/classes/PreviewableFile.ts","../src/components/compound/DisplayFile/src/DisplayFile.tsx","../src/components/compound/FileUploader/src/DropZoneBox.tsx","../src/components/compound/FileUploader/src/DropZoneButton.tsx","../src/components/elemental/Image/src/Cropper/hooks/useCropperState.ts"],"sourcesContent":["export * from './src'\n","import ImageList from '@mui/material/ImageList';\nimport ImageListItem from '@mui/material/ImageListItem';\n\n/**\n * Mui compnent for ImageList\n * \n * [Doc](https://mui.com/material-ui/react-image-list/)\n */\nconst MuiImageList = ({imageList,cols=3,rowHeight=164,width='100%',height='auto'}: {\n imageList: {\n id: string | number;\n url: string; \n title?: string;\n }[];\n cols?: number; \n rowHeight?: number;\n width?: number | string;\n height?: number | string;\n}) => {\n return (\n <ImageList sx={{ width, height }} cols={cols} rowHeight={rowHeight}>\n {imageList.map((item) => (\n <ImageListItem key={item.id}>\n <img\n src={`${item.url}?w=${rowHeight * 2}&h=${rowHeight * 2}&fit=crop&auto=format`}\n alt={item.title??\"\"}\n loading=\"lazy\"\n width={rowHeight} height={rowHeight}\n style={{objectFit: 'cover'}}\n />\n </ImageListItem>\n ))}\n </ImageList>\n )\n}\n\nexport default MuiImageList\n","import 'react-image-crop/dist/ReactCrop.css';\nimport CropperLayout from './layout/CropperLayout';\nimport CropperSourceSection from './sections/CropperSourceSection';\nimport CropperControlsSection from './sections/CropperControlsSection';\nimport CropperActionSection from './sections/CropperActionSection';\nimport CropperFileSelector from './sections/CropperFileSelector';\nimport { useCropperState } from './hooks/useCropperState';\nimport type { CropperProps } from './types';\n\nconst Cropper: React.FC<CropperProps> = ({\n blobUrl,\n onSave,\n setImgNull,\n onClear, // optional parent callback when the image is removed\n circularCrop = false,\n defaultRatio,\n resizeCropEnabled = true,\n cropConfig,\n PreviewRenderer,\n footerExtra,\n showFileSelector = false,\n fileSelectorAccept = 'image/*',\n fileSelectorButtonLabel = 'Select Image',\n onFileSelect,\n}) => {\n const {\n imageRef,\n canvasRef,\n activeBlobUrl,\n crop,\n setCrop,\n completedCrop,\n setCompletedCrop,\n scale,\n setScale,\n rotate,\n setRotate,\n onImageLoad,\n handleSave,\n handleClear,\n handleResetTransforms,\n } = useCropperState({\n blobUrl,\n onSave,\n setImgNull,\n circularCrop,\n defaultRatio,\n cropConfig,\n });\n\n return (\n <CropperLayout\n left={(\n <CropperSourceSection\n activeBlobUrl={activeBlobUrl}\n crop={crop}\n setCrop={setCrop}\n setCompletedCrop={setCompletedCrop}\n circularCrop={circularCrop}\n defaultRatio={defaultRatio}\n resizeCropEnabled={resizeCropEnabled}\n rotate={rotate}\n scale={scale}\n imageRef={imageRef}\n onImageLoad={onImageLoad}\n />\n )}\n right={(\n <CropperControlsSection\n PreviewRenderer={PreviewRenderer}\n canvasRef={canvasRef}\n rotate={rotate}\n setRotate={setRotate}\n scale={scale}\n setScale={setScale}\n />\n )}\n leftFooter={(\n <>\n {footerExtra}\n {showFileSelector && (\n <CropperFileSelector\n accept={fileSelectorAccept}\n buttonLabel={fileSelectorButtonLabel}\n onPick={(f) => onFileSelect?.(f)}\n />\n )}\n </>\n )}\n footer={(\n <CropperActionSection\n onSave={handleSave}\n onResetTransforms={handleResetTransforms}\n onClear={() => {\n // clear internal cropper state and also notify parent if it wants to persist the removal\n handleClear();\n onClear?.();\n }}\n saveDisabled={!completedCrop || !activeBlobUrl}\n />\n )}\n />\n );\n};\n\nexport default Cropper;\nexport type { CropperProps };\n","import type { SxProps, Theme } from '@mui/material/styles'\n\n/** Values accepted by {@link mergeSx}: objects, callbacks, arrays (nested ok), or omitted. */\nexport type SxMergePart =\n | SxProps<Theme>\n | Record<string, unknown>\n | ReadonlyArray<SxMergePart>\n | false\n | null\n | undefined\n\nfunction flattenSx(part: unknown): unknown[] {\n if (part == null || typeof part === 'boolean') {\n return []\n }\n if (Array.isArray(part)) {\n return part.flatMap(flattenSx)\n }\n if (typeof part === 'function' || typeof part === 'object') {\n return [part]\n }\n return []\n}\n\n/**\n * Combine MUI `sx` values into one prop.\n *\n * Nested arrays are flattened (`[base, [a, b]]` → `[base, a, b]`).\n * `null` / `undefined` / `false` entries are dropped. Later parts win,\n * same as MUI's `sx` array merge.\n */\nexport function mergeSx(...parts: SxMergePart[]): SxProps<Theme> | undefined {\n const list = parts.flatMap(flattenSx)\n if (list.length === 0) {\n return undefined\n }\n if (list.length === 1) {\n return list[0] as SxProps<Theme>\n }\n return list as SxProps<Theme>\n}\n","export * from './BorderBox'\nexport {default as Box} from '@mui/material/Box'\nexport {default as Stack} from '@mui/material/Stack'\nexport {default as Grid} from '@mui/material/Grid'\n","import type { SxProps, Theme } from '@mui/material/styles'\n\n/**\n * Root-level CSS variable aliases for Cropper.\n * Children consume these vars; palette refs are declared only here.\n *\n * Also overrides react-image-crop public CSS vars (--rc-*) via cascade:\n * https://github.com/DominicTobias/react-image-crop#css-variables\n */\nexport const cropperRootSx: SxProps<Theme> = {\n '--image-border-radius': 'var(--mui-shape-borderRadius)',\n '--image-border': '2px solid var(--mui-palette-secondary-main)',\n // react-image-crop selection theming\n '--rc-border-color': 'var(--mui-palette-border-1)',\n '--rc-focus-color': 'var(--mui-palette-primary-main)',\n '--rc-drag-handle-bg-colour': 'var(--mui-palette-focus-1)',\n \"& .ReactCrop__crop-selection:not(.ReactCrop--no-animate .ReactCrop__crop-selection)\": {\n '--animated-dash-light-color': 'var(--mui-palette-border-1)',\n '--animated-dash-dark-color': 'var(--mui-palette-grey-300)',\n backgroundImage: `\n linear-gradient(to right,var(--animated-dash-light-color) 50%,var(--animated-dash-dark-color) 50%),\n linear-gradient(to right,var(--animated-dash-light-color) 50%,var(--animated-dash-dark-color) 50%),\n linear-gradient(to bottom,var(--animated-dash-light-color) 50%,var(--animated-dash-dark-color) 50%),\n linear-gradient(to bottom,var(--animated-dash-light-color) 50%,var(--animated-dash-dark-color) 50%)`,\n },\n [`& .ReactCrop__rule-of-thirds-vt:before, \n .ReactCrop__rule-of-thirds-vt:after, \n .ReactCrop__rule-of-thirds-hz:before, \n .ReactCrop__rule-of-thirds-hz:after`]: {\n background:\"#fff6\",\n },\n}\n","import { Box } from '@/ele/Box';\nimport { cropperRootSx } from '../theme';\nimport { mergeSx } from '@/_utils/_func';\n\ninterface CropperLayoutProps {\n left: React.ReactNode;\n right: React.ReactNode;\n leftFooter?: React.ReactNode; // content shown at bottom of the left column (e.g. file selector)\n footer?: React.ReactNode; // bottom action/footer bar\n}\n\nexport default function CropperLayout({\n left,\n right,\n leftFooter,\n footer,\n}: CropperLayoutProps) {\n return (\n <Box sx={mergeSx({ display: 'flex', flexDirection: 'column', gap: 2, height: '100%' }, cropperRootSx)}>\n <Box\n sx={{\n // stack children vertically on small screens, switch to two‑column grid at md\n display: { xs: 'table-row-group', md: 'grid' },\n flexDirection: { xs: 'column', md: undefined },\n gridTemplateColumns: { xs: '1fr', md: '1fr 280px' },\n gap: 2,\n alignItems: 'start',\n minHeight: 0,\n flex: '1 1 auto',\n overflow: 'auto',\n }}\n >\n <Box sx={{ display: 'flex', flexDirection: 'column', justifyContent: 'space-between', minHeight: 0, height: '100%', alignItems: 'center', width: '-webkit-fill-available' }}>\n {left}\n {leftFooter}\n </Box>\n\n <Box sx={{ display: 'flex', flexDirection: 'column', justifyContent: 'space-between', minHeight: 0, height: '100%', }}>\n {right}\n {footer}\n </Box>\n </Box>\n </Box>\n );\n}\n","import React from 'react'\nimport ReactCrop, { type Crop, type PixelCrop } from 'react-image-crop';\nimport { Box } from '@/ele/Box';\n\ninterface CropperSourceSectionProps {\n activeBlobUrl: string;\n crop: Crop;\n setCrop: (crop: Crop) => void;\n setCompletedCrop: (crop: PixelCrop) => void;\n circularCrop: boolean;\n defaultRatio?: number;\n resizeCropEnabled: boolean;\n rotate: number;\n scale: number;\n imageRef: React.RefObject<HTMLImageElement | null>;\n onImageLoad: (e: React.SyntheticEvent<HTMLImageElement>) => void;\n}\n\nexport default function CropperSourceSection({\n activeBlobUrl,\n crop,\n setCrop,\n setCompletedCrop,\n circularCrop,\n defaultRatio,\n resizeCropEnabled,\n rotate,\n scale,\n imageRef,\n onImageLoad,\n}: CropperSourceSectionProps) {\n return (\n <Box\n sx={{\n minHeight: 0,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n\n \"& .ReactCrop\": {\n borderRadius: 'var(--image-border-radius)',\n border: 'var(--image-border)',\n\n },\n }}\n >\n {!!activeBlobUrl && (\n <ReactCrop\n crop={crop}\n onChange={(nextCrop) => setCrop(nextCrop)}\n onComplete={(nextCrop) => setCompletedCrop(nextCrop)}\n circularCrop={circularCrop}\n aspect={defaultRatio}\n keepSelection\n ruleOfThirds\n disabled={!resizeCropEnabled}\n style={{ maxWidth: '100%', maxHeight: 420, overflow: 'hidden' }}\n >\n <img\n ref={imageRef}\n alt=\"Crop source\"\n src={activeBlobUrl}\n style={{\n display: 'block',\n width: '100%',\n maxWidth: '100%',\n maxHeight: 420,\n objectFit: 'contain',\n transform: `rotate(${rotate}deg) scale(${scale})`,\n transformOrigin: 'center center',\n }}\n onLoad={onImageLoad}\n />\n </ReactCrop>\n )}\n </Box>\n );\n}\n","export {default as Slider} from '@mui/material/Slider'\nexport * from './theme'\n","export { default } from '@mui/material/Typography'","import React from 'react'\nimport { Box, Stack } from '@/ele/Box';\nimport { Slider } from '@/ele/Slider';\nimport { Typography } from '@/ele/Typography';\n\nconst scaleMarks = [\n { value: 0.5, label: '0.5x' },\n { value: 1, label: '1x' },\n { value: 1.5, label: '1.5x' },\n { value: 2, label: '2x' },\n { value: 2.5, label: '2.5x' },\n { value: 3, label: '3x' },\n];\n\nconst rotationMarks = [\n { value: -180, label: '-180°' },\n { value: -90, label: '-90°' },\n { value: 0, label: '0°' },\n { value: 90, label: '90°' },\n { value: 180, label: '180°' },\n];\n\ninterface CropperControlsSectionProps {\n PreviewRenderer?: React.ForwardRefExoticComponent<React.RefAttributes<HTMLCanvasElement>>;\n canvasRef: React.RefObject<HTMLCanvasElement | null>;\n rotate: number;\n setRotate: (value: number) => void;\n scale: number;\n setScale: (value: number) => void;\n}\n\nexport default function CropperControlsSection({\n PreviewRenderer,\n canvasRef,\n rotate,\n setRotate,\n scale,\n setScale,\n}: CropperControlsSectionProps) {\n return (\n <Stack spacing={2} sx={{ minWidth: 0, px: 2 }}>\n <Box display=\"flex\" justifyContent=\"center\">\n {PreviewRenderer ? (\n <PreviewRenderer ref={canvasRef} />\n ) : (\n <canvas\n ref={canvasRef}\n style={{ width: '100%', maxWidth: 260,\n border: 'var(--image-border)',\n borderRadius: 'var(--image-border-radius)',\n }}\n />\n )}\n </Box>\n\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Rotation ({rotate}°)\n </Typography>\n <Slider\n min={-180}\n max={180}\n step={1}\n marks={rotationMarks}\n value={rotate}\n onChange={(_, value) => setRotate(Array.isArray(value) ? value[0] : value)}\n />\n </Box>\n\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Resize scale ({scale.toFixed(2)}x)\n </Typography>\n <Slider\n min={0.5}\n max={3}\n step={0.05}\n marks={scaleMarks}\n value={scale}\n onChange={(_, value) => setScale(Array.isArray(value) ? value[0] : value)}\n />\n </Box>\n </Stack>\n );\n}\n","import React from 'react';\n\nimport MuiButton from '@mui/material/Button';\nimport { Box } from '@/ele/Box';\nimport { mergeSx } from '@/_utils/_func';\n\n/**\n * A modified MUI Button that truncates long text with ellipsis.\n * \n * [Doc](https://mui.com/material-ui/react-button/)\n * [API](https://mui.com/material-ui/api/button/)\n */\nexport default function Button(p:\n React.ComponentProps<typeof MuiButton> & {\n slotProps?: {\n innerBox?: React.ComponentProps<typeof Box>\n }\n }) {\n const {children, slotProps, ...rest} = p\n const {sx, ...boxRest} = slotProps?.innerBox ?? {}\n return <MuiButton {...rest}>\n <Box \n {...boxRest}\n sx={mergeSx(\n {\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'pre',\n },\n sx,\n )}>\n {children}\n </Box>\n </MuiButton>\n}","'use client'\nimport {forwardRef} from 'react'\nimport MuiIconButton from '@mui/material/IconButton'\nimport { Tooltip } from '@/ele/Tooltip'\nimport { type TooltipProps } from '@mui/material/Tooltip'\nimport { Box } from '@/ele/Box'\n\ntype IconButtonProps = React.ComponentProps<typeof MuiIconButton>\ntype Props = {\n /** The Icon to render */\n children: React.ReactNode;\n /** The title of the tooltip */\n title?: string;\n /** \n * The color theme of the entire component.\n * @default 'secondary' (from theme)\n */\n color?: IconButtonProps['color'];\n /**\n * The size of the component.\n * @default 'small' (from theme)\n */\n size?: IconButtonProps['size'];\n \n selected?: boolean;\n \n slotProps?: {\n tooltip?: Omit<TooltipProps, \"children\">\n };\n} & Omit<IconButtonProps, \"color\" | \"size\">;\n\n/**\n * A MuiIconButton wrapped in a MuiTooltip.\n * Default props like `size` and `color` are handled by the theme.\n */\nconst IconButton = forwardRef<HTMLButtonElement, Props>(({\n title = \"\",\n children,\n color,\n size,\n slotProps,\n selected,\n className,\n ...props\n}, ref) => {\n return (\n <Tooltip \n title={title} \n slotProps={{\n popper: {\n sx: {\n textTransform: \"capitalize\",\n }\n },\n ...slotProps?.tooltip\n }}\n >\n <Box component=\"span\" sx={{width: \"fit-content\"}}>\n <MuiIconButton\n ref={ref}\n color={color}\n size={size}\n className={[className, selected ? 'Mui-selected' : ''].filter(Boolean).join(' ')}\n {...props}\n >\n {children}\n </MuiIconButton>\n </Box>\n </Tooltip>\n )\n})\n\nexport default IconButton","export {default as Tooltip} from '@mui/material/Tooltip'\nexport * from './theme'\n","// display\nexport {default as ArrowIcon} from '@mui/icons-material/ArrowRightAlt'\nexport {default as FileIcon} from '@mui/icons-material/DescriptionOutlined'\nexport {default as DescriptionIcon} from '@mui/icons-material/Description'\nexport {default as PictureAsPdfIcon} from '@mui/icons-material/PictureAsPdf'\nexport {default as AudioFileIcon} from '@mui/icons-material/AudioFile'\nexport {default as VideoFileIcon} from '@mui/icons-material/VideoFile'\nexport {default as TableChartIcon} from '@mui/icons-material/TableChart'\nexport {default as FolderZipIcon} from '@mui/icons-material/FolderZip'\nexport {default as InsertDriveFileIcon} from '@mui/icons-material/InsertDriveFile'\nexport {default as ImageIcon} from '@mui/icons-material/ImageOutlined'\nexport {default as LayersIcon} from '@mui/icons-material/LayersOutlined'\nexport {default as TextIcon} from '@mui/icons-material/TextFormat'\nexport {default as RemoveIcon} from '@mui/icons-material/Remove'\nexport {default as AddFileIcon} from '@mui/icons-material/PostAdd'\nexport {default as ErrorIcon} from '@mui/icons-material/ErrorOutline'\nexport {default as QuestionIcon} from '@mui/icons-material/QuestionMarkOutlined'\nexport {default as RoomIcon} from '@mui/icons-material/MeetingRoomOutlined'\nexport {default as BlacklistIcon} from '@mui/icons-material/PlaylistRemove'\nexport {default as WhitelistIcon} from '@mui/icons-material/ChecklistRtl'\nexport {default as NoImageIcon} from '@mui/icons-material/HideImageOutlined'\nexport {default as EyeIcon} from '@mui/icons-material/RemoveRedEyeTwoTone'\nexport {default as CropSizeIcon} from '@mui/icons-material/PhotoSizeSelectLarge'\nexport {default as AdminIcon} from '@mui/icons-material/LockPersonOutlined'\nexport {default as UserIcon} from '@mui/icons-material/Person'\nexport {default as EmoticonIcon} from '@mui/icons-material/InsertEmoticon'\nexport {default as DisabledSelectionIcon} from '@mui/icons-material/RemoveDoneOutlined'\nexport {default as TagIcon} from '@mui/icons-material/Tag'\nexport {default as AudioIcon} from '@mui/icons-material/Audiotrack'\nexport {default as VideoIcon} from '@mui/icons-material/Videocam'\nexport {default as CodeIcon} from '@mui/icons-material/Code'\nexport {default as ChartIcon} from '@mui/icons-material/Equalizer'\nexport {default as TableIcon} from '@mui/icons-material/PivotTableChart'\nexport {default as SearchIcon} from '@mui/icons-material/Search'\nexport {default as DataObjectIcon} from '@mui/icons-material/DataObject'\nexport {default as A2ZIcon} from '@mui/icons-material/SortByAlpha'\nexport {default as ThumbUpIcon} from '@mui/icons-material/ThumbUp'\nexport {default as MoneyIcon} from '@mui/icons-material/AttachMoneyOutlined'\nexport {default as ServerIcon} from '@mui/icons-material/Storage'\nexport {default as CerticateIcon} from '@mui/icons-material/WorkspacePremium'\nexport {default as NumberIcon} from '@mui/icons-material/Numbers'\nexport {default as SumIcon} from '@mui/icons-material/Functions'\nexport {default as LightBulbIcon} from '@mui/icons-material/Lightbulb'\nexport {default as RotateIcon} from '@mui/icons-material/CropRotate'\nexport {default as ImageSzieScaleIcon} from '@mui/icons-material/PhotoSizeSelectLarge'\nexport {default as CollectionIcon} from '@mui/icons-material/CollectionsBookmark'\nexport {default as HistoryIcon} from '@mui/icons-material/Schedule'\nexport {default as StyleIcon} from '@mui/icons-material/Style'\nexport {default as ARHorizontalIcon} from '@mui/icons-material/Crop169'\nexport {default as ARSquareIcon} from '@mui/icons-material/CropSquare'\nexport {default as VoiceIcon} from '@mui/icons-material/GraphicEqRounded'\nexport {default as MemoryIcon} from '@mui/icons-material/MemoryRounded'\n\n// button\nexport {default as AddCircleIcon} from '@mui/icons-material/AddCircleOutlineRounded'\nexport {default as AddIcon} from '@mui/icons-material/Add'\nexport {default as CloseIcon} from '@mui/icons-material/Close'\nexport {default as ExpandMoreIcon} from '@mui/icons-material/ExpandMore'\nexport {default as AutorenewIcon} from '@mui/icons-material/Autorenew'\nexport {default as CheckCircleIcon} from '@mui/icons-material/CheckCircle'\nexport {default as MenuIcon} from '@mui/icons-material/Menu'\nexport {default as MoreIcon} from '@mui/icons-material/MoreVert'\nexport {default as MoreHorizIcon} from '@mui/icons-material/MoreHoriz'\nexport {default as CopyIcon} from '@mui/icons-material/ContentCopy'\nexport {default as PasteIcon} from '@mui/icons-material/ContentPaste'\nexport {default as CloudIcon} from '@mui/icons-material/Cloud'\nexport {default as DownloadIcon} from '@mui/icons-material/DownloadOutlined'\nexport {default as DownloadDoneIcon} from '@mui/icons-material/DownloadDoneOutlined'\nexport {default as StartIcon} from '@mui/icons-material/StarBorderOutlined'\nexport {default as DeleteIcon} from '@mui/icons-material/DeleteForever'\nexport {default as LayerClearIcon } from '@mui/icons-material/LayersClear'\nexport {default as CheckIcon } from '@mui/icons-material/Check'\nexport {default as CheckAllIcon } from '@mui/icons-material/DoneAll'\nexport {default as PowerIcon } from '@mui/icons-material/PowerSettingsNew'\nexport {default as SendIcon } from '@mui/icons-material/Send'\nexport {default as ZoomInIcon } from '@mui/icons-material/ZoomInMap'\nexport {default as ZoomOutIcon } from '@mui/icons-material/ZoomOutMap'\nexport {default as ToolIcon } from '@mui/icons-material/HomeRepairService'\nexport {default as ConstructionIcon } from '@mui/icons-material/Construction'\nexport {default as HelpIcon } from '@mui/icons-material/Help'\nexport {default as ReportIcon } from '@mui/icons-material/EmojiFlags'\nexport {default as EditIcon } from '@mui/icons-material/Edit'\nexport {default as ForkIcon } from '@mui/icons-material/ForkRight'\nexport {default as SettingIcon } from '@mui/icons-material/Settings'\nexport {default as RestoreIcon } from '@mui/icons-material/Restore'\nexport {default as EditListIcon } from '@mui/icons-material/EditNote'\nexport {default as HomeIcon } from '@mui/icons-material/HomeOutlined'\nexport {default as EnterRoomIcon } from '@mui/icons-material/ExitToAppOutlined'\nexport {default as SunIcon} from '@mui/icons-material/WbSunnyOutlined'\nexport {default as MoonIcon} from '@mui/icons-material/DarkModeOutlined'\nexport {default as AttachFileIcon} from '@mui/icons-material/AttachFileOutlined'\nexport {default as NoteAddIcon} from '@mui/icons-material/NoteAdd'\nexport {default as CloudUploadIcon} from '@mui/icons-material/CloudUpload'\nexport {default as DoubleRightArrowIcon} from '@mui/icons-material/KeyboardDoubleArrowRight'\nexport {default as DoubleLeftArrowIcon} from '@mui/icons-material/KeyboardDoubleArrowLeft'\nexport {default as DoubleArrowIcon} from '@mui/icons-material/KeyboardDoubleArrowRightRounded'\nexport {default as FitScreenIcon} from '@mui/icons-material/FitScreen'\nexport {default as FullscreenIcon} from '@mui/icons-material/Fullscreen'\nexport {default as TestIcon} from '@mui/icons-material/Biotech'\nexport {default as ShareIcon} from '@mui/icons-material/Share'\nexport {default as FilterIcon} from '@mui/icons-material/FilterAlt'\nexport {default as SyncIcon} from '@mui/icons-material/Sync'\nexport {default as PlayIcon} from '@mui/icons-material/PlayArrow'\nexport {default as PauseIcon} from '@mui/icons-material/PauseOutlined'\nexport {default as RandomIcon} from '@mui/icons-material/Casino'\nexport {default as CoinIcon} from '@mui/icons-material/Paid'\nexport {default as SaveChangesIcon} from '@mui/icons-material/Save'\nexport {default as StopIcon} from '@mui/icons-material/StopRounded'\nexport {default as ReplayIcon} from '@mui/icons-material/Replay'\nexport {default as TreeIcon} from '@mui/icons-material/AccountTree'\nexport {default as ClearIcon} from '@mui/icons-material/Close'\nexport {default as KeyboardArrowDownIcon} from '@mui/icons-material/KeyboardArrowDown'\nexport {default as KeyboardArrowRightIcon} from '@mui/icons-material/KeyboardArrowRight'\nexport {default as SearchRoundedIcon} from '@mui/icons-material/SearchRounded'\nexport {default as CloseRoundedIcon} from '@mui/icons-material/CloseRounded'\nexport {default as SortByAlphaRoundedIcon} from '@mui/icons-material/SortByAlphaRounded'\nexport {default as FilterAltOutlinedIcon} from '@mui/icons-material/FilterAltOutlined'\nexport {default as InboxOutlinedIcon} from '@mui/icons-material/InboxOutlined'\nexport {default as SearchOffIcon} from '@mui/icons-material/SearchOff'\nexport {default as ClearRoundedIcon} from '@mui/icons-material/ClearRounded'\nexport {default as ArrowDropDownRoundedIcon} from '@mui/icons-material/ArrowDropDownRounded'\n\n// login\nexport {default as AccountIcon} from '@mui/icons-material/AccountBox'\nexport {default as LogoutIcon} from '@mui/icons-material/Logout'\nexport {default as LoginIcon} from '@mui/icons-material/Login'\nexport {default as DashboardIcon} from '@mui/icons-material/Dashboard'\n\n//logo\nexport {default as WorkFlowIcon} from '@mui/icons-material/AccountTreeOutlined'\nexport {default as HelpOutlineIcon} from '@mui/icons-material/HelpOutline'\nexport {default as NavigateBeforeIcon} from '@mui/icons-material/NavigateBefore'\nexport {default as NavigateNextIcon} from '@mui/icons-material/NavigateNext'\nexport {default as PersonIcon} from '@mui/icons-material/Person'\nexport {default as CalendarTodayIcon} from '@mui/icons-material/CalendarToday'\nexport {default as ChatIcon} from '@mui/icons-material/QuestionAnswerOutlined'\nexport {default as TodayIcon} from '@mui/icons-material/Today'\nexport {default as DeleteForeverIcon} from '@mui/icons-material/DeleteForever'\n\nexport {default as AdsClickIcon} from '@mui/icons-material/AdsClick'\nexport {default as FingerprintIcon} from '@mui/icons-material/Fingerprint'\nexport {default as SportsEsportsOutlinedIcon} from '@mui/icons-material/SportsEsportsOutlined'\nexport {default as HelpOutlineRoundedIcon} from '@mui/icons-material/HelpOutlineRounded'\nexport {default as AccountTreeOutlinedIcon} from '@mui/icons-material/AccountTreeOutlined'\nexport {default as SmartToyOutlinedIcon} from '@mui/icons-material/SmartToyOutlined'\nexport {default as AcUnitIcon} from '@mui/icons-material/AcUnit'\nexport {default as LoopIcon} from '@mui/icons-material/Loop'\nexport {default as PendingIcon} from '@mui/icons-material/Pending'\nexport {default as AllInclusiveIcon} from '@mui/icons-material/AllInclusive'\nexport {default as WarningOutlinedIcon} from '@mui/icons-material/WarningOutlined'\nexport {default as InfoOutlinedIcon} from '@mui/icons-material/InfoOutlined'\nexport {default as AutoAwesomeRoundedIcon} from '@mui/icons-material/AutoAwesomeRounded'\nexport {default as ErrorOutlineOutlinedIcon} from '@mui/icons-material/ErrorOutlineOutlined'\nexport {default as DownloadFilledIcon} from '@mui/icons-material/Download'","import { Box } from '@/ele/Box';\nimport { IconButton } from '@/ele/Button';\nimport { CheckIcon } from '@/icons/MuiIcon';\nimport { ClearIcon } from '@/icons/MuiIcon';\nimport { ReplayIcon } from '@/icons/MuiIcon';\n\ninterface CropperActionSectionProps {\n onSave: () => void;\n onResetTransforms: () => void;\n onClear: () => void;\n saveDisabled?: boolean;\n}\n\nexport default function CropperActionSection({\n onSave,\n onResetTransforms,\n onClear,\n saveDisabled,\n}: CropperActionSectionProps) {\n return (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 1,\n flexWrap: 'wrap',\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' }}>\n <IconButton onClick={onResetTransforms} title=\"Reset Scale & Rotation\">\n <ReplayIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton onClick={onClear} color=\"error\" title=\"Remove image\">\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton onClick={onSave} color=\"success\" disabled={saveDisabled} title=\"Save\">\n <CheckIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n </Box>\n );\n}\n","import React from 'react'\nimport { Box } from '@/ele/Box'\nimport { ReactDropzone } from '@/compound/FileUploader'\nimport PreviewableFile from '@/_utils/classes/PreviewableFile'\nimport type { DropzoneOptions } from 'react-dropzone'\n\ninterface Props {\n accept?: string | DropzoneOptions['accept'];\n buttonLabel?: string;\n /** `null` means the dropzone was cleared */\n onPick?: (file: File | null) => void;\n}\n\nexport default function CropperFileSelector({ accept = 'image/*', buttonLabel = 'Select Image', onPick }: Props) {\n const [files, setFiles] = React.useState<PreviewableFile[]>([])\n React.useEffect(() => {\n // debug render lifecycle for troubleshooting recursive render\n // console.debug('[CropperFileSelector] render — files.length=', files.length);\n }, [files]);\n\n const lastForwardedRef = React.useRef<string | null>(null);\n\n React.useEffect(() => {\n // when a file is removed from the dropzone, notify parent with null\n if (!files.length) {\n if (lastForwardedRef.current) {\n lastForwardedRef.current = null;\n onPick?.(null);\n }\n return;\n }\n\n const pf = files[0];\n if (!pf.blobUrl) return;\n\n // avoid forwarding the same file repeatedly (prevents recursion/loops)\n if (lastForwardedRef.current === pf.blobUrl) {\n return;\n }\n\n let cancelled = false;\n (async () => {\n try {\n const res = await fetch(pf.blobUrl);\n const blob = await res.blob();\n const file = new File([blob], pf.filename || 'file', { type: pf.mimeType || undefined });\n if (!cancelled) {\n lastForwardedRef.current = pf.blobUrl;\n onPick?.(file);\n }\n } catch {\n // silently ignore fetch/conversion errors — leave dropzone in place\n }\n })();\n\n return () => { cancelled = true };\n }, [files, onPick]);\n\n const acceptProp: DropzoneOptions['accept'] | undefined = typeof accept === 'string' ? { [accept]: [] } : accept\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', pt:0, width: '100%', justifyContent: 'center' }}>\n <ReactDropzone filesProps={[files, setFiles]} accept={acceptProp} maxFiles={1} dropzoneType=\"button\" label={buttonLabel} />\n </Box>\n )\n}\n","import React, { useCallback, useEffect, useRef } from 'react';\nimport { useDropzone, FileWithPath, DropzoneOptions } from 'react-dropzone';\nimport { Box, Stack } from '@/ele/Box';\nimport { fileUploaderRootSx } from './theme';\nimport { mergeSx } from '@/_utils/_func';\nimport PreviewableFile, { displayFileSize } from '@/_utils/classes/PreviewableFile';\nimport DisplayFile from '@/compound/DisplayFile';\nimport DropZoneBox from './DropZoneBox';\nimport DropZoneButton from './DropZoneButton';\n\nexport type DropzoneType = \"box\" | \"button\";\n\nexport interface ReactDropzoneProps {\n filesProps: [PreviewableFile[], React.Dispatch<React.SetStateAction<PreviewableFile[]>>];\n accept?: DropzoneOptions['accept'];\n maxFiles?: number;\n error?: boolean;\n dropzoneType?: DropzoneType;\n label?: string;\n}\n\nconst ReactDropzone: React.FC<ReactDropzoneProps> = ({\n filesProps,\n accept,\n maxFiles = 0, // 0 means unlimited\n error = false,\n dropzoneType = 'box',\n label = 'Upload File'\n}) => {\n const [files, setFiles] = filesProps;\n\n // Track all active blob URLs so the unmount cleanup can revoke them\n // even if the user never called handleDelete.\n const blobRegistryRef = useRef<Set<string>>(new Set());\n\n const onDrop = useCallback((acceptedFiles: FileWithPath[]) => {\n const newFiles = acceptedFiles.map(file => {\n const blobUrl = URL.createObjectURL(file);\n blobRegistryRef.current.add(blobUrl);\n return new PreviewableFile({\n path: file.path,\n blobUrl,\n filename: file.name,\n mimeType: file.type,\n size: file.size,\n displaySize: displayFileSize(file.size),\n fileType: file.type.startsWith('image/') ? 'image'\n : file.type.startsWith('application/json') ? 'json' : 'other'\n });\n });\n\n setFiles(prev => [...prev, ...newFiles]);\n }, [setFiles]);\n\n // hide dropzone UI when reached limit (already handled) — add explicit guard in render\n const isLimitReached = maxFiles > 0 && files.length >= maxFiles;\n\n const { getRootProps, getInputProps } = useDropzone({\n onDrop,\n accept,\n maxFiles: maxFiles > 0 ? (maxFiles - files.length) : undefined,\n disabled: isLimitReached,\n });\n\n const handleDelete = (fileToDelete: PreviewableFile) => {\n setFiles(prev => prev.filter(f => f !== fileToDelete));\n if (fileToDelete.blobUrl) {\n URL.revokeObjectURL(fileToDelete.blobUrl);\n blobRegistryRef.current.delete(fileToDelete.blobUrl);\n }\n };\n\n useEffect(() => {\n const blobRegistry = blobRegistryRef.current;\n return () => {\n blobRegistry.forEach(url => URL.revokeObjectURL(url));\n blobRegistry.clear();\n };\n }, []); // Cleanup remaining blob URLs on unmount\n\n return (\n <Box sx={mergeSx({ maxWidth: '100%' }, fileUploaderRootSx)}>\n {!isLimitReached && (\n <Box component=\"section\">\n {dropzoneType === 'box' ? (\n <DropZoneBox getRootProps={getRootProps} getInputProps={getInputProps} error={error}/>\n ) : (\n <DropZoneButton getRootProps={getRootProps} getInputProps={getInputProps} label={label} error={error}/>\n )}\n </Box>\n )}\n\n {files.length > 0 && (\n <Stack spacing={1} sx={{ mt: 0 }}>\n {files.map((file) => (\n <DisplayFile \n key={file.blobUrl || file.filename || file.path} \n file={file} \n onDelete={handleDelete}\n />\n ))}\n </Stack>\n )}\n </Box>\n );\n};\n\nexport default ReactDropzone;\n","import type { SxProps, Theme } from '@mui/material/styles';\n\n/**\n * Root-level CSS variable aliases for the FileUploader compound component.\n * Declared once on the root element — child components consume via `var(--*)`.\n */\nexport const fileUploaderRootSx: SxProps<Theme> = {\n '--dropzone-bg': 'var(--mui-palette-background-paper)',\n '--dropzone-text-color': 'var(--mui-palette-text-secondary)',\n '--dropzone-border-hover': 'var(--mui-palette-primary-main)',\n '--dropzone-bg-hover': 'var(--mui-palette-action-hover)',\n};\n","import { fileTypeFromBuffer } from 'file-type';\n\n/**\n * download file from url and return blob url\n * @param url\n * @param fetchOptions\n */\nexport async function downloadFile(url: string, fetchOptions?: RequestInit) {\n const res = await fetch(url, fetchOptions);\n const blob = await res.blob();\n const buffer = await blob.arrayBuffer();\n\n // application/octet-stream make it hard to detect\n // so we use buffer to detect the mime type\n const fType = await fileTypeFromBuffer(buffer);\n\n const data = {\n blobUrl: URL.createObjectURL(blob),\n size: blob.size,\n mimeType: fType?.mime || blob.type, // use file-type to get the mime type\n };\n\n const nonImgRes = {\n ...data,\n dimensions: {\n width: 0,\n height: 0,\n },\n };\n // if file is an image\n try {\n if (data.mimeType.includes('image/')) {\n const dimensions = await handleImageDownload(data.blobUrl);\n // check the mime type\n return {\n ...data,\n dimensions: dimensions,\n };\n } else {\n return nonImgRes;\n }\n\n } catch (err) {\n // if there is an error, it might not be an image or the image failed to load\n console.warn('Failed to handle image download:', err);\n return nonImgRes;\n }\n}\n\n/**\n * handle image download\n * @param blobUrl \n * @returns \n */\nasync function handleImageDownload(blobUrl: string) {\n // Create an Image object to load the image\n const img = new Image();\n img.src = blobUrl;\n\n // Wait for the image to load to access its dimensions\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = reject;\n });\n const metaData = {\n width: img.width,\n height: img.height,\n };\n\n // clear the img from memory\n img.remove();\n\n return metaData;\n}\n","import { ValueOf } from '../_types';\n\nexport const FILE_STATUSs = {\n // local status\n uploadingToLocal:\"local-uploading\",\n uploadedToLocal:\"local-uploaded\",\n localError:\"local-error\",\n\n \n pending:\"pending\",\n // upload s3\n uploadPending:'upload-pending',\n gettingSignedURL:'upload-gettingSignedURL',\n beginUploadToS3:'upload-beginUploadToS3',\n uploadedToCloud:'upload-uploadedToCloud',\n error:'upload-error',\n // download\n downloadPending:'download-pending',\n downloading:'download-in-progress',\n downloaded:'download-completed',\n downloadError:'download-error',\n} as const\n\nexport const FILE_TYPEs = {\n image:\"image\",\n video:\"video\",\n audio:\"audio\",\n pdf:\"pdf\",\n doc:\"doc\",\n xls:\"xls\",\n ppt:\"ppt\",\n txt:\"txt\",\n zip:\"zip\",\n json:\"json\",\n other:\"other\",\n} as const\n\nexport const MAX_FILE_NAME_LENGTH = 100\n\nexport type FileStatusType = ValueOf<typeof FILE_STATUSs>;\nexport type FileType = ValueOf<typeof FILE_TYPEs>;\n\nexport type Attachment = {\n url: string;\n keyPath: string;\n filename: string;\n fileType: string;\n hostname: string;\n}\n","import { downloadFile } from \"../_func/downloadFile\";\nimport { type FileStatusType, type FileType, FILE_STATUSs, FILE_TYPEs, type Attachment } from \"../_const/file\";\n\nexport { FILE_TYPEs, FILE_STATUSs };\n\ninterface PreviewableFileProps {\n path?: string;\n blobUrl?: string;\n filename?: string;\n randomName?: string;\n fileType?: string;\n mimeType?: Blob[\"type\"];\n size?: number;\n displaySize?: string;\n url?: string;\n fetchOptions?: object;\n putUrl?: string;\n getUrl?: string;\n status?: FileStatusType;\n revokeable?: boolean;\n imageProps?:{\n width: number;\n height: number;\n };\n}\n\nexport default class PreviewableFile {\n path: NonNullable<PreviewableFileProps[\"path\"]>;\n blobUrl: NonNullable<PreviewableFileProps[\"blobUrl\"]>;\n filename: NonNullable<PreviewableFileProps[\"filename\"]>;\n randomName: NonNullable<PreviewableFileProps[\"randomName\"]>;\n fileType: NonNullable<PreviewableFileProps[\"fileType\"]>;\n mimeType: NonNullable<PreviewableFileProps[\"mimeType\"]>;\n size: NonNullable<PreviewableFileProps[\"size\"]>;\n displaySize: NonNullable<PreviewableFileProps[\"displaySize\"]>;\n url: NonNullable<PreviewableFileProps[\"url\"]>;\n fetchOptions: NonNullable<PreviewableFileProps[\"fetchOptions\"]>;\n putUrl: NonNullable<PreviewableFileProps[\"putUrl\"]>;\n getUrl: NonNullable<PreviewableFileProps[\"getUrl\"]>;\n status: NonNullable<PreviewableFileProps[\"status\"]>;\n revokeable: NonNullable<PreviewableFileProps[\"revokeable\"]>;\n imageProps: NonNullable<PreviewableFileProps[\"imageProps\"]>;\n\n constructor(props: PreviewableFileProps = {}) { \n this.path = props.path ?? \"\"\n this.blobUrl = props.blobUrl ?? \"\"\n this.filename = props.filename ?? \"\"\n this.randomName = props.randomName ?? \"\"\n this.fileType = (props.fileType ?? getFileType(props.mimeType ?? \"\")) as FileType\n this.mimeType = props.mimeType ?? \"\"\n this.size = props.size ?? 0\n this.displaySize = props.displaySize ?? displayFileSize(props.size ?? 0)\n\n this.url = props.url ?? \"\"\n this.fetchOptions = props.fetchOptions ?? {}\n this.putUrl = props.putUrl ?? \"\"\n this.getUrl = props.getUrl ?? \"\"\n\n this.status = props.status ?? FILE_STATUSs.pending\n this.revokeable = props.revokeable ?? true\n this.imageProps = props.imageProps ?? {\n width: 0,\n height: 0,\n }\n\n Object.preventExtensions(this)\n }\n\n toPlainObj(){\n return {\n ...this\n }\n }\n\n updateFile(file: PreviewableFile | undefined){\n if(!file) return\n\n this.path = file.path\n this.blobUrl = file.blobUrl\n this.filename = file.filename\n this.randomName = file.randomName\n this.fileType = file.fileType\n this.size = file.size\n this.displaySize = file.displaySize\n\n this.url = file.url\n this.fetchOptions = file.fetchOptions\n this.putUrl = file.putUrl\n this.getUrl = file.getUrl\n\n this.status = file.status\n this.revokeable = file.revokeable\n\n this.imageProps = file.imageProps\n }\n updateStatus(status: FileStatusType){\n this.status = status\n }\n async downloadFile(){\n // if dont have url, return\n if(!this.url) return this\n // use the current url to download the file\n try{\n const res = await downloadFile(this.url, this.fetchOptions)\n // update the file\n\n // ensure `url` points to the usable blob URL returned from the download\n // (fixes cases where `this.url` was an ephemeral/revoked object URL)\n this.url = res.blobUrl\n this.path = res.blobUrl\n this.status = FILE_STATUSs.downloaded\n this.blobUrl = res.blobUrl\n this.fileType = getFileType(res.mimeType)\n this.mimeType = res.mimeType\n this.size = res.size\n this.displaySize = displayFileSize(res.size)\n this.imageProps = res.dimensions\n\n return this\n }catch(err){\n console.log(err)\n return this\n }\n }\n\n _displayFileSize(){\n return displayFileSize(this.size)\n }\n\n getUploadFormat():Attachment{\n return {\n url: this.putUrl,\n keyPath: this.putUrl,\n filename: this.filename,\n fileType: this.mimeType,\n hostname: \"\",\n }\n }\n}\n\nexport function displayFileSize(size: number): string {\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n\n // Determine the appropriate unit index\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n // Format the file size with the unit\n // 2 decimal places\n const sizeWithUnit = size.toFixed(2) + ' ' + units[unitIndex];\n\n return `[${sizeWithUnit}]`;\n}\n\n/**\n * get the file type based on the mime type\n */\nfunction getFileType(mimeType:Blob[\"type\"]): FileType {\n const types = Object.values(FILE_TYPEs) as FileType[];\n \n // 1. Check if the type is explicitly defined in the start (e.g. image/jpeg -> image)\n const [type] = mimeType.split('/');\n if(types.includes(type as FileType)){\n return type as FileType;\n }\n\n // 2. Check if the type is included in the mime type (e.g. application/pdf -> pdf)\n const found = types.find((t) => mimeType.includes(t) && t !== FILE_TYPEs.other);\n if(found){\n return found;\n }\n\n return FILE_TYPEs.other;\n}\n","// src/components/compound/DisplayFile/src/DisplayFile.tsx\nimport React from 'react';\nimport { Box } from '@/ele/Box';\nimport { Typography } from '@/ele/Typography';\nimport { IconButton } from '@/ele/Button';\nimport {\n CloseIcon,\n DescriptionIcon,\n PictureAsPdfIcon,\n ImageIcon,\n AudioFileIcon,\n VideoFileIcon,\n TableChartIcon,\n FolderZipIcon,\n DataObjectIcon,\n InsertDriveFileIcon,\n} from '@/icons/MuiIcon';\n\nimport PreviewableFile, { FILE_TYPEs } from '@/_utils/classes/PreviewableFile';\n\nexport interface DisplayFileProps {\n file: PreviewableFile;\n onDelete?: (file: PreviewableFile) => void;\n mode?: 'thumbnail' | 'name';\n}\n\nexport const getFileIcon = (fileType: string) => {\n switch (fileType) {\n case FILE_TYPEs.image: return ImageIcon;\n case FILE_TYPEs.pdf: return PictureAsPdfIcon;\n case FILE_TYPEs.audio: return AudioFileIcon;\n case FILE_TYPEs.video: return VideoFileIcon;\n case FILE_TYPEs.xls: return TableChartIcon;\n case FILE_TYPEs.zip: return FolderZipIcon;\n case FILE_TYPEs.json: return DataObjectIcon;\n\n case FILE_TYPEs.ppt:\n case FILE_TYPEs.doc: \n case FILE_TYPEs.txt: \n return DescriptionIcon;\n default: return InsertDriveFileIcon;\n }\n};\n\nexport const FileThumbnail: React.FC<{ file: PreviewableFile; size?: number }> = ({ file, size = 60 }) => {\n const isImage = file.fileType === FILE_TYPEs.image;\n const FileIcon = getFileIcon(file.fileType || '');\n\n return (\n <Box\n sx={{\n width: size,\n height: size,\n minWidth: size,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n bgcolor: 'transparent',\n borderRadius: 1,\n overflow: 'hidden'\n }}\n >\n {isImage && file.blobUrl ? (\n <Box\n component=\"img\"\n src={file.blobUrl}\n alt={file.filename}\n sx={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n ) : (\n <FileIcon fontSize={size >= 60 ? \"large\" : \"medium\"} color=\"action\" />\n )}\n </Box>\n );\n};\n\nconst DisplayFile: React.FC<DisplayFileProps> & { DISPLAY_MODEs: { thumbnail: 'thumbnail'; name: 'name' } } = ({\n file,\n onDelete,\n mode = 'thumbnail'\n}) => {\n return (\n <Box sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n p: 1,\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 1,\n width: mode === 'thumbnail' ? 'fit-content' : '100%',\n maxWidth: '100%',\n position: 'relative',\n }}>\n <FileThumbnail file={file} />\n \n <Box sx={{ flex: 1, overflow: 'hidden' }}>\n <Typography variant=\"body2\" noWrap sx={{ maxWidth: 150 }}>\n {file.filename}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {file.displaySize}\n </Typography>\n </Box>\n\n {onDelete && (\n <IconButton \n size=\"small\" \n onClick={() => onDelete(file)}\n sx={{ ml: 'auto' }}\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n );\n};\n\nDisplayFile.DISPLAY_MODEs = {\n thumbnail: 'thumbnail',\n name: 'name'\n};\n\nexport default DisplayFile;\n","import React from 'react';\nimport { DropzoneState } from 'react-dropzone';\nimport { Box } from '@/ele/Box';\nimport { Typography } from '@/ele/Typography';\nimport { NoteAddIcon } from '@/icons/MuiIcon';\n\nconst DropZoneBox: React.FC<{\n getRootProps: DropzoneState[\"getRootProps\"];\n getInputProps: DropzoneState[\"getInputProps\"];\n error?: boolean;\n}> = ({ getRootProps, getInputProps, error }) => {\n return (\n <Box \n {...getRootProps()} \n sx={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n p: 3,\n border: \"2px dashed\",\n borderColor: error ? 'error.main' : 'divider',\n borderRadius: 1,\n backgroundColor: 'var(--dropzone-bg)',\n outline: \"none\",\n transition: \"border .24s ease-in-out\",\n color: 'var(--dropzone-text-color)',\n cursor: 'pointer',\n '&:hover': {\n borderColor: 'var(--dropzone-border-hover)',\n backgroundColor: 'var(--dropzone-bg-hover)'\n }\n }}\n >\n <input {...getInputProps()} />\n \n <NoteAddIcon sx={{ fontSize: \"2.5rem\", mb: 1 }} />\n <Typography variant=\"caption\" align=\"center\">\n Drag "n" drop some files here, or click to select files\n </Typography>\n </Box>\n )\n}\n\nexport default DropZoneBox;\n","import React from 'react';\nimport { DropzoneState } from 'react-dropzone';\nimport { CloudUploadIcon } from '@/icons/MuiIcon';\nimport { Button } from '@/ele/Button'; \n\nconst DropZoneButton: React.FC<{\n getRootProps: DropzoneState[\"getRootProps\"];\n getInputProps: DropzoneState[\"getInputProps\"];\n label?: string;\n error?: boolean;\n}> = ({\n getRootProps, getInputProps, \n label=\"Upload file\",\n error=false\n}) => {\n return (\n <Button \n variant=\"outlined\"\n startIcon={<CloudUploadIcon/>} \n color={error ? \"error\" : \"primary\"}\n {...getRootProps()}\n >\n {label}\n <input {...getInputProps()}/>\n </Button>\n )\n}\n\nexport default DropZoneButton;\n","import React from 'react';\nimport {\n centerCrop,\n convertToPixelCrop,\n makeAspectCrop,\n type Crop,\n type PixelCrop,\n} from 'react-image-crop';\n\ninterface UseCropperStateParams {\n blobUrl: string;\n onSave: (url: string) => void | Promise<void>;\n setImgNull: () => void;\n circularCrop: boolean;\n defaultRatio?: number;\n cropConfig?: Partial<Crop>;\n}\n\nfunction toRad(degrees: number) {\n return (degrees * Math.PI) / 180;\n}\n\nfunction defaultCrop(): Crop {\n return {\n unit: '%',\n x: 10,\n y: 10,\n width: 80,\n height: 80,\n };\n}\n\nfunction makeCenteredAspectCrop(mediaWidth: number, mediaHeight: number, aspect: number): Crop {\n return centerCrop(\n makeAspectCrop(\n {\n unit: '%',\n width: 90,\n },\n aspect,\n mediaWidth,\n mediaHeight,\n ),\n mediaWidth,\n mediaHeight,\n );\n}\n\nfunction initialCrop(\n mediaWidth: number,\n mediaHeight: number,\n defaultRatio: number | undefined,\n cropConfig: Partial<Crop> | undefined,\n): Crop {\n if (defaultRatio) {\n return makeCenteredAspectCrop(mediaWidth, mediaHeight, defaultRatio);\n }\n return { ...defaultCrop(), ...cropConfig };\n}\n\nfunction drawPreviewToCanvas(\n image: HTMLImageElement,\n canvas: HTMLCanvasElement,\n crop: PixelCrop,\n scale: number,\n rotate: number,\n circularCrop?: boolean,\n) {\n const context = canvas.getContext('2d');\n if (!context) return;\n if (!crop.width || !crop.height) return;\n\n const scaleX = image.naturalWidth / image.width;\n const scaleY = image.naturalHeight / image.height;\n const pixelRatio = window.devicePixelRatio || 1;\n\n canvas.width = Math.floor(crop.width * scaleX * pixelRatio);\n canvas.height = Math.floor(crop.height * scaleY * pixelRatio);\n\n context.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n context.imageSmoothingQuality = 'high';\n context.clearRect(0, 0, canvas.width, canvas.height);\n\n const cropX = crop.x * scaleX;\n const cropY = crop.y * scaleY;\n const rotateRads = toRad(rotate);\n const centerX = image.naturalWidth / 2;\n const centerY = image.naturalHeight / 2;\n\n context.save();\n if (circularCrop) {\n const width = crop.width * scaleX;\n const height = crop.height * scaleY;\n const radius = Math.min(width, height) / 2;\n context.beginPath();\n context.arc(width / 2, height / 2, radius, 0, Math.PI * 2);\n context.closePath();\n context.clip();\n }\n\n context.translate(-cropX, -cropY);\n context.translate(centerX, centerY);\n context.rotate(rotateRads);\n context.scale(scale, scale);\n context.translate(-centerX, -centerY);\n\n context.drawImage(\n image,\n 0,\n 0,\n image.naturalWidth,\n image.naturalHeight,\n 0,\n 0,\n image.naturalWidth,\n image.naturalHeight,\n );\n context.restore();\n}\n\nexport function useCropperState({\n blobUrl,\n onSave,\n setImgNull,\n circularCrop,\n defaultRatio,\n cropConfig,\n}: UseCropperStateParams) {\n const imageRef = React.useRef<HTMLImageElement | null>(null);\n const canvasRef = React.useRef<HTMLCanvasElement | null>(null);\n const cropConfigRef = React.useRef(cropConfig);\n cropConfigRef.current = cropConfig;\n const scaleRef = React.useRef(1);\n const rotateRef = React.useRef(0);\n\n const [activeBlobUrl, setActiveBlobUrl] = React.useState(blobUrl);\n const [crop, setCrop] = React.useState<Crop>({ ...defaultCrop(), ...cropConfig });\n const [completedCrop, setCompletedCrop] = React.useState<PixelCrop>();\n const [scale, setScale] = React.useState(1);\n const [rotate, setRotate] = React.useState(0);\n scaleRef.current = scale;\n rotateRef.current = rotate;\n\n const applyCropFromImage = React.useCallback((image: HTMLImageElement) => {\n const { width, height } = image;\n if (!width || !height) return;\n\n const nextCrop = initialCrop(width, height, defaultRatio, cropConfigRef.current);\n const pixelCrop = convertToPixelCrop(nextCrop, width, height);\n if (!pixelCrop.width || !pixelCrop.height) return;\n\n setCrop(nextCrop);\n setCompletedCrop(pixelCrop);\n\n const canvas = canvasRef.current;\n if (canvas) {\n drawPreviewToCanvas(\n image,\n canvas,\n pixelCrop,\n scaleRef.current,\n rotateRef.current,\n circularCrop,\n );\n }\n }, [circularCrop, defaultRatio]);\n\n React.useEffect(() => {\n setActiveBlobUrl(blobUrl);\n }, [blobUrl]);\n\n React.useLayoutEffect(() => {\n if (!activeBlobUrl) {\n setCrop({ ...defaultCrop(), ...cropConfigRef.current });\n setCompletedCrop(undefined);\n setScale(1);\n setRotate(0);\n return;\n }\n\n setScale(1);\n setRotate(0);\n\n const tryApply = () => {\n const image = imageRef.current;\n if (image?.complete && image.width > 0 && image.height > 0) {\n applyCropFromImage(image);\n return true;\n }\n return false;\n };\n\n if (tryApply()) return;\n\n const frame = requestAnimationFrame(() => {\n tryApply();\n });\n return () => cancelAnimationFrame(frame);\n }, [activeBlobUrl, applyCropFromImage]);\n\n React.useEffect(() => {\n if (!completedCrop || !imageRef.current || !canvasRef.current) return;\n drawPreviewToCanvas(\n imageRef.current,\n canvasRef.current,\n completedCrop,\n scale,\n rotate,\n circularCrop,\n );\n }, [completedCrop, scale, rotate, circularCrop]);\n\n const onImageLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n applyCropFromImage(e.currentTarget);\n };\n\n const handleCompletedCrop = (nextCrop: PixelCrop) => {\n if (!nextCrop.width || !nextCrop.height) return;\n setCompletedCrop(nextCrop);\n };\n\n const handleSave = async () => {\n if (!completedCrop || !imageRef.current) return;\n\n const previewCanvas = document.createElement('canvas');\n drawPreviewToCanvas(\n imageRef.current,\n previewCanvas,\n completedCrop,\n scale,\n rotate,\n circularCrop,\n );\n\n const blob = await new Promise<Blob | null>((resolve) => {\n previewCanvas.toBlob((nextBlob) => resolve(nextBlob), 'image/png');\n });\n\n if (!blob) return;\n const resultUrl = URL.createObjectURL(blob);\n await onSave(resultUrl);\n };\n\n const handleClear = () => {\n setActiveBlobUrl('');\n setImgNull();\n imageRef.current = null;\n const canvas = canvasRef.current;\n if (canvas) {\n const context = canvas.getContext('2d');\n if (context) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n }\n setCrop({ ...defaultCrop(), ...cropConfigRef.current });\n setScale(1);\n setRotate(0);\n setCompletedCrop(undefined);\n };\n\n const handleResetTransforms = () => {\n setScale(1);\n setRotate(0);\n };\n\n return {\n imageRef,\n canvasRef,\n activeBlobUrl,\n crop,\n setCrop,\n completedCrop,\n setCompletedCrop: handleCompletedCrop,\n scale,\n setScale,\n rotate,\n setRotate,\n onImageLoad,\n handleSave,\n handleClear,\n handleResetTransforms,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,uBAAsB;AACtB,2BAA0B;AAsBc;AAfxC,IAAM,eAAe,CAAC,EAAC,WAAU,OAAK,GAAE,YAAU,KAAI,QAAM,QAAO,SAAO,OAAM,MAU1E;AACE,SACQ,4CAAC,iBAAAA,SAAA,EAAU,IAAI,EAAE,OAAO,OAAO,GAAG,MAAY,WACrC,oBAAU,IAAI,CAAC,SACR,4CAAC,qBAAAC,SAAA,EACO;AAAA,IAAC;AAAA;AAAA,MACO,KAAK,GAAG,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,YAAY,CAAC;AAAA,MACtD,KAAK,KAAK,SAAO;AAAA,MACjB,SAAQ;AAAA,MACR,OAAO;AAAA,MAAW,QAAQ;AAAA,MAC1B,OAAO,EAAC,WAAW,QAAO;AAAA;AAAA,EAClC,KAPY,KAAK,EAQzB,CACP,GACT;AAEhB;AAEA,IAAO,uBAAQ;;;ACpCf,uBAAO;;;ACWP,SAAS,UAAU,MAA0B;AAC3C,MAAI,QAAQ,QAAQ,OAAO,SAAS,WAAW;AAC7C,WAAO,CAAC;AAAA,EACV;AACA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AACA,MAAI,OAAO,SAAS,cAAc,OAAO,SAAS,UAAU;AAC1D,WAAO,CAAC,IAAI;AAAA,EACd;AACA,SAAO,CAAC;AACV;AASO,SAAS,WAAW,OAAkD;AAC3E,QAAM,OAAO,MAAM,QAAQ,SAAS;AACpC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,KAAK,CAAC;AAAA,EACf;AACA,SAAO;AACT;;;ACvCA,iBAA6B;AAC7B,mBAA+B;AAC/B,kBAA8B;;;ACMvB,IAAM,gBAAgC;AAAA,EAC3C,yBAAyB;AAAA,EACzB,kBAAkB;AAAA;AAAA,EAElB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,8BAA8B;AAAA,EAC9B,uFAAuF;AAAA,IACrF,+BAA+B;AAAA,IAC/B,8BAA8B;AAAA,IAC9B,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnB;AAAA,EACA,CAAC;AAAA;AAAA;AAAA,wCAGqC,GAAG;AAAA,IACrC,YAAW;AAAA,EACb;AACJ;;;ACbI,IAAAC,sBAAA;AAPW,SAAR,cAA+B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,SACE,6CAAC,sBAAI,IAAI,QAAQ,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,QAAQ,OAAO,GAAG,aAAa,GAClG;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA;AAAA,QAEF,SAAS,EAAE,IAAI,mBAAmB,IAAI,OAAO;AAAA,QAC7C,eAAe,EAAE,IAAI,UAAU,IAAI,OAAU;AAAA,QAC7C,qBAAqB,EAAE,IAAI,OAAO,IAAI,YAAY;AAAA,QAClD,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA,sDAAC,sBAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,gBAAgB,iBAAiB,WAAW,GAAG,QAAQ,QAAQ,YAAY,UAAU,OAAO,yBAAyB,GACvK;AAAA;AAAA,UACA;AAAA,WACH;AAAA,QAEA,8CAAC,sBAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,gBAAgB,iBAAiB,WAAW,GAAG,QAAQ,OAAQ,GACjH;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;;;AC3CA,8BAAqD;AA0D3C,IAAAC,sBAAA;AAzCK,SAAR,qBAAsC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAEhB,gBAAgB;AAAA,UACd,cAAc;AAAA,UACd,QAAQ;AAAA,QAEV;AAAA,MACF;AAAA,MAEC,WAAC,CAAC,iBACD;AAAA,QAAC,wBAAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,aAAa,QAAQ,QAAQ;AAAA,UACxC,YAAY,CAAC,aAAa,iBAAiB,QAAQ;AAAA,UACnD;AAAA,UACA,QAAQ;AAAA,UACR,eAAa;AAAA,UACb,cAAY;AAAA,UACZ,UAAU,CAAC;AAAA,UACX,OAAO,EAAE,UAAU,QAAQ,WAAW,KAAK,UAAU,SAAS;AAAA,UAE9D;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,KAAK;AAAA,cACL,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,WAAW,UAAU,MAAM,cAAc,KAAK;AAAA,gBAC9C,iBAAiB;AAAA,cACnB;AAAA,cACA,QAAQ;AAAA;AAAA,UACV;AAAA;AAAA,MACF;AAAA;AAAA,EAEJ;AAEJ;;;AC9EA,oBAAgC;;;ACAhC,wBAAwB;;;AC2Cd,IAAAC,sBAAA;AAtCV,IAAM,aAAa;AAAA,EACjB,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,EAC5B,EAAE,OAAO,GAAG,OAAO,KAAK;AAAA,EACxB,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,EAC5B,EAAE,OAAO,GAAG,OAAO,KAAK;AAAA,EACxB,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,EAC5B,EAAE,OAAO,GAAG,OAAO,KAAK;AAC1B;AAEA,IAAM,gBAAgB;AAAA,EACpB,EAAE,OAAO,MAAM,OAAO,WAAQ;AAAA,EAC9B,EAAE,OAAO,KAAK,OAAO,UAAO;AAAA,EAC5B,EAAE,OAAO,GAAG,OAAO,QAAK;AAAA,EACxB,EAAE,OAAO,IAAI,OAAO,SAAM;AAAA,EAC1B,EAAE,OAAO,KAAK,OAAO,UAAO;AAC9B;AAWe,SAAR,uBAAwC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAC9B,SACE,8CAAC,wBAAM,SAAS,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,GAC1C;AAAA,iDAAC,sBAAI,SAAQ,QAAO,gBAAe,UAChC,4BACC,6CAAC,mBAAgB,KAAK,WAAW,IAEjC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UAAE,OAAO;AAAA,UAAQ,UAAU;AAAA,UAChC,QAAQ;AAAA,UACR,cAAc;AAAA,QAChB;AAAA;AAAA,IACF,GAEJ;AAAA,IAEA,8CAAC,sBACC;AAAA,oDAAC,6BAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,EAAE,GAAG;AAAA;AAAA,QAC9B;AAAA,QAAO;AAAA,SACpB;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,UAAU,CAAC,GAAG,UAAU,UAAU,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK;AAAA;AAAA,MAC3E;AAAA,OACF;AAAA,IAEA,8CAAC,sBACC;AAAA,oDAAC,6BAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,EAAE,GAAG;AAAA;AAAA,QAC1B,MAAM,QAAQ,CAAC;AAAA,QAAE;AAAA,SAClC;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,UAAU,CAAC,GAAG,UAAU,SAAS,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK;AAAA;AAAA,MAC1E;AAAA,OACF;AAAA,KACF;AAEJ;;;AClFA,oBAAsB;AAmBlB,IAAAC,sBAAA;AATW,SAAR,OAAwB,GAK1B;AACH,QAAM,EAAC,UAAU,WAAW,GAAG,KAAI,IAAI;AACvC,QAAM,EAAC,IAAI,GAAG,QAAO,IAAI,WAAW,YAAY,CAAC;AACjD,SAAO,6CAAC,cAAAC,SAAA,EAAW,GAAG,MACpB;AAAA,IAAC;AAAA;AAAA,MACA,GAAG;AAAA,MACJ,IAAI;AAAA,QACF;AAAA,UACE,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,MACG;AAAA;AAAA,EACH,GACF;AACF;;;ACjCA,mBAAyB;AACzB,wBAA0B;;;ACF1B,qBAAiC;;;AD0DzB,IAAAC,sBAAA;AAvBR,IAAM,iBAAa,yBAAqC,CAAC;AAAA,EACvD,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAG,QAAQ;AACT,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT,QAAQ;AAAA,UACN,IAAI;AAAA,YACF,eAAe;AAAA,UACjB;AAAA,QACF;AAAA,QACA,GAAG,WAAW;AAAA,MAChB;AAAA,MAEA,uDAAC,sBAAI,WAAU,QAAO,IAAI,EAAC,OAAO,cAAa,GAC7C;AAAA,QAAC,kBAAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,CAAC,WAAW,WAAW,iBAAiB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UAC9E,GAAG;AAAA,UAEH;AAAA;AAAA,MACH,GACF;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,IAAO,qBAAQ;;;AEvEf,2BAAmC;AACnC,iCAAkC;AAClC,yBAAyC;AACzC,0BAA0C;AAC1C,uBAAuC;AACvC,uBAAuC;AACvC,wBAAwC;AACxC,uBAAuC;AACvC,6BAA6C;AAC7C,2BAAmC;AACnC,4BAAoC;AACpC,wBAAkC;AAClC,oBAAoC;AACpC,qBAAqC;AACrC,0BAAmC;AACnC,kCAAsC;AACtC,iCAAkC;AAClC,4BAAuC;AACvC,0BAAuC;AACvC,+BAAqC;AACrC,iCAAiC;AACjC,kCAAsC;AACtC,gCAAmC;AACnC,oBAAkC;AAClC,4BAAsC;AACtC,gCAA+C;AAC/C,iBAAiC;AACjC,wBAAmC;AACnC,sBAAmC;AACnC,kBAAkC;AAClC,uBAAmC;AACnC,6BAAmC;AACnC,oBAAoC;AACpC,wBAAwC;AACxC,yBAAiC;AACjC,qBAAqC;AACrC,iCAAmC;AACnC,qBAAoC;AACpC,8BAAuC;AACvC,qBAAoC;AACpC,uBAAiC;AACjC,uBAAuC;AACvC,wBAAoC;AACpC,IAAAC,+BAA4C;AAC5C,iCAAwC;AACxC,sBAAqC;AACrC,mBAAmC;AACnC,qBAA0C;AAC1C,wBAAsC;AACtC,8BAAmC;AACnC,2BAAoC;AAGpC,qCAAuC;AACvC,iBAAiC;AACjC,mBAAmC;AACnC,wBAAwC;AACxC,uBAAuC;AACvC,yBAAyC;AACzC,kBAAkC;AAClC,sBAAkC;AAClC,uBAAuC;AACvC,yBAAkC;AAClC,0BAAmC;AACnC,mBAAmC;AACnC,8BAAsC;AACtC,kCAA0C;AAC1C,gCAAmC;AACnC,2BAAoC;AACpC,yBAAyC;AACzC,mBAAoC;AACpC,qBAAuC;AACvC,8BAAoC;AACpC,kBAAmC;AACnC,uBAAqC;AACrC,wBAAsC;AACtC,+BAAmC;AACnC,0BAA2C;AAC3C,kBAAmC;AACnC,wBAAqC;AACrC,kBAAmC;AACnC,uBAAmC;AACnC,sBAAsC;AACtC,qBAAsC;AACtC,sBAAuC;AACvC,0BAAmC;AACnC,+BAAwC;AACxC,6BAAiC;AACjC,8BAAkC;AAClC,gCAAwC;AACxC,qBAAqC;AACrC,yBAAyC;AACzC,sCAA8C;AAC9C,qCAA6C;AAC7C,6CAAyC;AACzC,uBAAuC;AACvC,wBAAwC;AACxC,qBAAkC;AAClC,mBAAmC;AACnC,uBAAqC;AACrC,kBAAkC;AAClC,uBAAkC;AAClC,2BAAmC;AACnC,oBAAoC;AACpC,kBAAkC;AAClC,kBAAyC;AACzC,yBAAkC;AAClC,oBAAqC;AACrC,yBAAkC;AAClC,IAAAC,gBAAmC;AACnC,+BAA+C;AAC/C,gCAAgD;AAChD,2BAA2C;AAC3C,0BAA0C;AAC1C,gCAAgD;AAChD,+BAA+C;AAC/C,2BAA2C;AAC3C,uBAAuC;AACvC,0BAA0C;AAC1C,kCAAkD;AAGlD,wBAAqC;AACrC,oBAAoC;AACpC,mBAAmC;AACnC,uBAAuC;AAGvC,iCAAsC;AACtC,yBAAyC;AACzC,4BAA4C;AAC5C,0BAA0C;AAC1C,IAAAC,iBAAoC;AACpC,2BAA2C;AAC3C,oCAAkC;AAClC,mBAAmC;AACnC,IAAAC,wBAA2C;AAE3C,sBAAsC;AACtC,yBAAyC;AACzC,mCAAmD;AACnD,gCAAgD;AAChD,IAAAC,8BAAiD;AACjD,8BAA8C;AAC9C,oBAAoC;AACpC,kBAAkC;AAClC,qBAAqC;AACrC,0BAA0C;AAC1C,6BAA6C;AAC7C,0BAA0C;AAC1C,gCAAgD;AAChD,kCAAkD;AAClD,sBAA4C;;;AC5HtC,IAAAC,sBAAA;AAhBS,SAAR,qBAAsC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,KAAK;AAAA,QACL,UAAU;AAAA,MACZ;AAAA,MAEA,wDAAC,sBAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,UAAU,OAAO,GACzE;AAAA,qDAAC,sBAAW,SAAS,mBAAmB,OAAM,0BAC5C,uDAAC,yBAAW,UAAS,SAAQ,GAC/B;AAAA,QAEA,6CAAC,sBAAW,SAAS,SAAS,OAAM,SAAQ,OAAM,gBAChD,uDAAC,yBAAU,UAAS,SAAQ,GAC9B;AAAA,QAEA,6CAAC,sBAAW,SAAS,QAAQ,OAAM,WAAU,UAAU,cAAc,OAAM,QACzE,uDAAC,wBAAU,UAAS,SAAQ,GAC9B;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AC5CA,IAAAC,gBAAkB;;;ACAlB,IAAAC,gBAAsD;AACtD,4BAA2D;;;ACKpD,IAAM,qBAAqC;AAAA,EAChD,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,uBAAuB;AACzB;;;ACXA,uBAAmC;AAOnC,eAAsB,aAAa,KAAa,cAA4B;AAC1E,QAAM,MAAM,MAAM,MAAM,KAAK,YAAY;AACzC,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAM,SAAS,MAAM,KAAK,YAAY;AAItC,QAAM,QAAQ,UAAM,qCAAmB,MAAM;AAE7C,QAAM,OAAO;AAAA,IACX,SAAS,IAAI,gBAAgB,IAAI;AAAA,IACjC,MAAM,KAAK;AAAA,IACX,UAAU,OAAO,QAAQ,KAAK;AAAA;AAAA,EAChC;AAEA,QAAM,YAAY;AAAA,IAChB,GAAG;AAAA,IACH,YAAY;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI;AACF,QAAI,KAAK,SAAS,SAAS,QAAQ,GAAG;AACpC,YAAM,aAAa,MAAM,oBAAoB,KAAK,OAAO;AAEzD,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EAEF,SAAS,KAAK;AAEZ,YAAQ,KAAK,oCAAoC,GAAG;AACpD,WAAO;AAAA,EACT;AACF;AAOA,eAAe,oBAAoB,SAAiB;AAElD,QAAM,MAAM,IAAI,MAAM;AACtB,MAAI,MAAM;AAGV,QAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AACrC,QAAI,SAAS;AACb,QAAI,UAAU;AAAA,EAChB,CAAC;AACD,QAAM,WAAW;AAAA,IACf,OAAO,IAAI;AAAA,IACX,QAAQ,IAAI;AAAA,EACd;AAGA,MAAI,OAAO;AAEX,SAAO;AACT;;;ACvEO,IAAM,eAAe;AAAA;AAAA,EAE1B,kBAAiB;AAAA,EACjB,iBAAgB;AAAA,EAChB,YAAW;AAAA,EAGX,SAAQ;AAAA;AAAA,EAER,eAAc;AAAA,EACd,kBAAiB;AAAA,EACjB,iBAAgB;AAAA,EAChB,iBAAgB;AAAA,EAChB,OAAM;AAAA;AAAA,EAEN,iBAAgB;AAAA,EAChB,aAAY;AAAA,EACZ,YAAW;AAAA,EACX,eAAc;AAChB;AAEO,IAAM,aAAa;AAAA,EACxB,OAAM;AAAA,EACN,OAAM;AAAA,EACN,OAAM;AAAA,EACN,KAAI;AAAA,EACJ,KAAI;AAAA,EACJ,KAAI;AAAA,EACJ,KAAI;AAAA,EACJ,KAAI;AAAA,EACJ,KAAI;AAAA,EACJ,MAAK;AAAA,EACL,OAAM;AACR;;;ACTA,IAAqB,kBAArB,MAAqC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,QAA8B,CAAC,GAAG;AAC5C,SAAK,OAAO,MAAM,QAAQ;AAC1B,SAAK,UAAU,MAAM,WAAW;AAChC,SAAK,WAAW,MAAM,YAAY;AAClC,SAAK,aAAa,MAAM,cAAc;AACtC,SAAK,WAAY,MAAM,YAAY,YAAY,MAAM,YAAY,EAAE;AACnE,SAAK,WAAW,MAAM,YAAY;AAClC,SAAK,OAAO,MAAM,QAAQ;AAC1B,SAAK,cAAc,MAAM,eAAe,gBAAgB,MAAM,QAAQ,CAAC;AAEvE,SAAK,MAAM,MAAM,OAAO;AACxB,SAAK,eAAe,MAAM,gBAAgB,CAAC;AAC3C,SAAK,SAAS,MAAM,UAAU;AAC9B,SAAK,SAAS,MAAM,UAAU;AAE9B,SAAK,SAAS,MAAM,UAAU,aAAa;AAC3C,SAAK,aAAa,MAAM,cAAc;AACtC,SAAK,aAAa,MAAM,cAAc;AAAA,MACpC,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAEA,WAAO,kBAAkB,IAAI;AAAA,EAC/B;AAAA,EAEA,aAAY;AACV,WAAO;AAAA,MACL,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,WAAW,MAAkC;AAC3C,QAAG,CAAC,KAAM;AAEV,SAAK,OAAO,KAAK;AACjB,SAAK,UAAU,KAAK;AACpB,SAAK,WAAW,KAAK;AACrB,SAAK,aAAa,KAAK;AACvB,SAAK,WAAW,KAAK;AACrB,SAAK,OAAO,KAAK;AACjB,SAAK,cAAc,KAAK;AAExB,SAAK,MAAM,KAAK;AAChB,SAAK,eAAe,KAAK;AACzB,SAAK,SAAS,KAAK;AACnB,SAAK,SAAS,KAAK;AAEnB,SAAK,SAAS,KAAK;AACnB,SAAK,aAAa,KAAK;AAEvB,SAAK,aAAa,KAAK;AAAA,EACzB;AAAA,EACA,aAAa,QAAuB;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,MAAM,eAAc;AAElB,QAAG,CAAC,KAAK,IAAK,QAAO;AAErB,QAAG;AACD,YAAM,MAAM,MAAM,aAAa,KAAK,KAAK,KAAK,YAAY;AAK1D,WAAK,MAAM,IAAI;AACf,WAAK,OAAO,IAAI;AAChB,WAAK,SAAS,aAAa;AAC3B,WAAK,UAAU,IAAI;AACnB,WAAK,WAAW,YAAY,IAAI,QAAQ;AACxC,WAAK,WAAW,IAAI;AACpB,WAAK,OAAO,IAAI;AAChB,WAAK,cAAc,gBAAgB,IAAI,IAAI;AAC3C,WAAK,aAAa,IAAI;AAEtB,aAAO;AAAA,IACT,SAAO,KAAI;AACT,cAAQ,IAAI,GAAG;AACf,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,mBAAkB;AAChB,WAAO,gBAAgB,KAAK,IAAI;AAAA,EAClC;AAAA,EAEA,kBAA4B;AAC1B,WAAO;AAAA,MACL,KAAK,KAAK;AAAA,MACV,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,MAAsB;AACpD,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,IAAI;AAG1C,MAAI,YAAY;AAChB,SAAO,QAAQ,QAAQ,YAAY,MAAM,SAAS,GAAG;AACnD,YAAQ;AACR;AAAA,EACF;AAIA,QAAM,eAAe,KAAK,QAAQ,CAAC,IAAI,MAAM,MAAM,SAAS;AAE5D,SAAO,IAAI,YAAY;AACzB;AAKA,SAAS,YAAY,UAAiC;AACpD,QAAM,QAAQ,OAAO,OAAO,UAAU;AAGtC,QAAM,CAAC,IAAI,IAAI,SAAS,MAAM,GAAG;AACjC,MAAG,MAAM,SAAS,IAAgB,GAAE;AAClC,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,SAAS,SAAS,CAAC,KAAK,MAAM,WAAW,KAAK;AAC9E,MAAG,OAAM;AACP,WAAO;AAAA,EACT;AAEA,SAAO,WAAW;AACpB;;;ACjHgB,IAAAC,sBAAA;AArCT,IAAM,cAAc,CAAC,aAAqB;AAC7C,UAAQ,UAAU;AAAA,IACd,KAAK,WAAW;AAAO,aAAO;AAAA,IAC9B,KAAK,WAAW;AAAK,aAAO;AAAA,IAC5B,KAAK,WAAW;AAAO,aAAO;AAAA,IAC9B,KAAK,WAAW;AAAO,aAAO;AAAA,IAC9B,KAAK,WAAW;AAAK,aAAO;AAAA,IAC5B,KAAK,WAAW;AAAK,aAAO;AAAA,IAC5B,KAAK,WAAW;AAAM,aAAO;AAAA,IAE7B,KAAK,WAAW;AAAA,IAChB,KAAK,WAAW;AAAA,IAChB,KAAK,WAAW;AACZ,aAAO;AAAA,IACX;AAAS,aAAO;AAAA,EACpB;AACJ;AAEO,IAAM,gBAAoE,CAAC,EAAE,MAAM,OAAO,GAAG,MAAM;AACtG,QAAM,UAAU,KAAK,aAAa,WAAW;AAC7C,QAAM,WAAW,YAAY,KAAK,YAAY,EAAE;AAEhD,SACI;AAAA,IAAC;AAAA;AAAA,MACG,IAAI;AAAA,QACA,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,cAAc;AAAA,QACd,UAAU;AAAA,MACd;AAAA,MAEC,qBAAW,KAAK,UACb;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,KAAK,KAAK;AAAA,UACV,KAAK,KAAK;AAAA,UACV,IAAI,EAAE,OAAO,QAAQ,QAAQ,QAAQ,WAAW,QAAQ;AAAA;AAAA,MAC5D,IAEA,6CAAC,YAAS,UAAU,QAAQ,KAAK,UAAU,UAAU,OAAM,UAAS;AAAA;AAAA,EAE5E;AAER;AAEA,IAAM,cAAwG,CAAC;AAAA,EAC3G;AAAA,EACA;AAAA,EACA,OAAO;AACX,MAAM;AACF,SACI,8CAAC,sBAAI,IAAI;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,cAAc;AAAA,IACd,OAAO,SAAS,cAAc,gBAAgB;AAAA,IAC9C,UAAU;AAAA,IACV,UAAU;AAAA,EACd,GACI;AAAA,iDAAC,iBAAc,MAAY;AAAA,IAE3B,8CAAC,sBAAI,IAAI,EAAE,MAAM,GAAG,UAAU,SAAS,GACnC;AAAA,mDAAC,6BAAW,SAAQ,SAAQ,QAAM,MAAC,IAAI,EAAE,UAAU,IAAI,GAClD,eAAK,UACV;AAAA,MACA,6CAAC,6BAAW,SAAQ,WAAU,OAAM,kBAC/B,eAAK,aACV;AAAA,OACJ;AAAA,IAEC,YACG;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,SAAS,MAAM,SAAS,IAAI;AAAA,QAC5B,IAAI,EAAE,IAAI,OAAO;AAAA,QAEjB,uDAAC,wBAAU,UAAS,SAAQ;AAAA;AAAA,IAChC;AAAA,KAER;AAER;AAEA,YAAY,gBAAgB;AAAA,EACxB,WAAW;AAAA,EACX,MAAM;AACV;AAEA,IAAO,sBAAQ;;;AC/GP,IAAAC,sBAAA;AANR,IAAM,cAID,CAAC,EAAE,cAAc,eAAe,MAAM,MAAM;AAC7C,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG,aAAa;AAAA,MACjB,IAAI;AAAA,QACA,MAAM;AAAA,QACN,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,aAAa,QAAQ,eAAe;AAAA,QACpC,cAAc;AAAA,QACd,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,UACP,aAAa;AAAA,UACb,iBAAiB;AAAA,QACrB;AAAA,MACJ;AAAA,MAEA;AAAA,qDAAC,WAAO,GAAG,cAAc,GAAG;AAAA,QAE5B,6CAAC,0BAAY,IAAI,EAAE,UAAU,UAAU,IAAI,EAAE,GAAG;AAAA,QAChD,6CAAC,6BAAW,SAAQ,WAAU,OAAM,UAAS,qEAE7C;AAAA;AAAA;AAAA,EACJ;AAER;AAEA,IAAO,sBAAQ;;;AC5BP,IAAAC,uBAAA;AAXR,IAAM,iBAKD,CAAC;AAAA,EACF;AAAA,EAAc;AAAA,EACd,QAAM;AAAA,EACN,QAAM;AACV,MAAM;AACF,SACI;AAAA,IAAC;AAAA;AAAA,MACG,SAAQ;AAAA,MACR,WAAW,8CAAC,8BAAe;AAAA,MAC3B,OAAO,QAAQ,UAAU;AAAA,MACxB,GAAG,aAAa;AAAA,MAEhB;AAAA;AAAA,QACD,8CAAC,WAAO,GAAG,cAAc,GAAE;AAAA;AAAA;AAAA,EAC/B;AAER;AAEA,IAAO,yBAAQ;;;APqDP,IAAAC,uBAAA;AA5DR,IAAM,gBAA8C,CAAC;AAAA,EACjD;AAAA,EACA;AAAA,EACA,WAAW;AAAA;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,QAAQ;AACZ,MAAM;AACF,QAAM,CAAC,OAAO,QAAQ,IAAI;AAI1B,QAAM,sBAAkB,sBAAoB,oBAAI,IAAI,CAAC;AAErD,QAAM,aAAS,2BAAY,CAAC,kBAAkC;AAC1D,UAAM,WAAW,cAAc,IAAI,UAAQ;AACvC,YAAM,UAAU,IAAI,gBAAgB,IAAI;AACxC,sBAAgB,QAAQ,IAAI,OAAO;AACnC,aAAO,IAAI,gBAAgB;AAAA,QACvB,MAAM,KAAK;AAAA,QACX;AAAA,QACA,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,QACX,aAAa,gBAAgB,KAAK,IAAI;AAAA,QACtC,UAAU,KAAK,KAAK,WAAW,QAAQ,IAAI,UAC/B,KAAK,KAAK,WAAW,kBAAkB,IAAI,SAAS;AAAA,MACpE,CAAC;AAAA,IACL,CAAC;AAED,aAAS,UAAQ,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;AAAA,EAC3C,GAAG,CAAC,QAAQ,CAAC;AAGb,QAAM,iBAAiB,WAAW,KAAK,MAAM,UAAU;AAEvD,QAAM,EAAE,cAAc,cAAc,QAAI,mCAAY;AAAA,IAChD;AAAA,IACA;AAAA,IACA,UAAU,WAAW,IAAK,WAAW,MAAM,SAAU;AAAA,IACrD,UAAU;AAAA,EACd,CAAC;AAED,QAAM,eAAe,CAAC,iBAAkC;AACpD,aAAS,UAAQ,KAAK,OAAO,OAAK,MAAM,YAAY,CAAC;AACrD,QAAI,aAAa,SAAS;AACtB,UAAI,gBAAgB,aAAa,OAAO;AACxC,sBAAgB,QAAQ,OAAO,aAAa,OAAO;AAAA,IACvD;AAAA,EACJ;AAEA,+BAAU,MAAM;AACZ,UAAM,eAAe,gBAAgB;AACrC,WAAO,MAAM;AACT,mBAAa,QAAQ,SAAO,IAAI,gBAAgB,GAAG,CAAC;AACpD,mBAAa,MAAM;AAAA,IACvB;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,SACI,+CAAC,sBAAI,IAAI,QAAQ,EAAE,UAAU,OAAO,GAAG,kBAAkB,GACpD;AAAA,KAAC,kBACE,8CAAC,sBAAI,WAAU,WACV,2BAAiB,QACd,8CAAC,uBAAY,cAA4B,eAA8B,OAAa,IAEpF,8CAAC,0BAAe,cAA4B,eAA8B,OAAc,OAAa,GAE7G;AAAA,IAGH,MAAM,SAAS,KACZ,8CAAC,wBAAM,SAAS,GAAG,IAAI,EAAE,IAAI,EAAE,GAC1B,gBAAM,IAAI,CAAC,SACR;AAAA,MAAC;AAAA;AAAA,QAEG;AAAA,QACA,UAAU;AAAA;AAAA,MAFL,KAAK,WAAW,KAAK,YAAY,KAAK;AAAA,IAG/C,CACH,GACL;AAAA,KAER;AAER;AAEA,IAAO,wBAAQ;;;AD7CT,IAAAC,uBAAA;AAjDS,SAAR,oBAAqC,EAAE,SAAS,WAAW,cAAc,gBAAgB,OAAO,GAAU;AAC/G,QAAM,CAAC,OAAO,QAAQ,IAAI,cAAAC,QAAM,SAA4B,CAAC,CAAC;AAC9D,gBAAAA,QAAM,UAAU,MAAM;AAAA,EAGtB,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,mBAAmB,cAAAA,QAAM,OAAsB,IAAI;AAEzD,gBAAAA,QAAM,UAAU,MAAM;AAEpB,QAAI,CAAC,MAAM,QAAQ;AACjB,UAAI,iBAAiB,SAAS;AAC5B,yBAAiB,UAAU;AAC3B,iBAAS,IAAI;AAAA,MACf;AACA;AAAA,IACF;AAEA,UAAM,KAAK,MAAM,CAAC;AAClB,QAAI,CAAC,GAAG,QAAS;AAGjB,QAAI,iBAAiB,YAAY,GAAG,SAAS;AAC3C;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,KAAC,YAAY;AACX,UAAI;AACF,cAAM,MAAM,MAAM,MAAM,GAAG,OAAO;AAClC,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,YAAY,QAAQ,EAAE,MAAM,GAAG,YAAY,OAAU,CAAC;AACvF,YAAI,CAAC,WAAW;AACd,2BAAiB,UAAU,GAAG;AAC9B,mBAAS,IAAI;AAAA,QACf;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,GAAG;AAEH,WAAO,MAAM;AAAE,kBAAY;AAAA,IAAK;AAAA,EAClC,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,QAAM,aAAoD,OAAO,WAAW,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI;AAE1G,SACE,8CAAC,sBAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,IAAG,GAAG,OAAO,QAAQ,gBAAgB,SAAS,GAC9F,wDAAC,yBAAc,YAAY,CAAC,OAAO,QAAQ,GAAG,QAAQ,YAAY,UAAU,GAAG,cAAa,UAAS,OAAO,aAAa,GAC3H;AAEJ;;;ASjEA,IAAAC,gBAAkB;AAClB,IAAAC,2BAMO;AAWP,SAAS,MAAM,SAAiB;AAC9B,SAAQ,UAAU,KAAK,KAAM;AAC/B;AAEA,SAAS,cAAoB;AAC3B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,uBAAuB,YAAoB,aAAqB,QAAsB;AAC7F,aAAO;AAAA,QACL;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,YACP,YACA,aACA,cACA,YACM;AACN,MAAI,cAAc;AAChB,WAAO,uBAAuB,YAAY,aAAa,YAAY;AAAA,EACrE;AACA,SAAO,EAAE,GAAG,YAAY,GAAG,GAAG,WAAW;AAC3C;AAEA,SAAS,oBACP,OACA,QACA,MACA,OACA,QACA,cACA;AACA,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,MAAI,CAAC,QAAS;AACd,MAAI,CAAC,KAAK,SAAS,CAAC,KAAK,OAAQ;AAEjC,QAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,QAAM,SAAS,MAAM,gBAAgB,MAAM;AAC3C,QAAM,aAAa,OAAO,oBAAoB;AAE9C,SAAO,QAAQ,KAAK,MAAM,KAAK,QAAQ,SAAS,UAAU;AAC1D,SAAO,SAAS,KAAK,MAAM,KAAK,SAAS,SAAS,UAAU;AAE5D,UAAQ,aAAa,YAAY,GAAG,GAAG,YAAY,GAAG,CAAC;AACvD,UAAQ,wBAAwB;AAChC,UAAQ,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAEnD,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,aAAa,MAAM,MAAM;AAC/B,QAAM,UAAU,MAAM,eAAe;AACrC,QAAM,UAAU,MAAM,gBAAgB;AAEtC,UAAQ,KAAK;AACb,MAAI,cAAc;AAChB,UAAM,QAAQ,KAAK,QAAQ;AAC3B,UAAM,SAAS,KAAK,SAAS;AAC7B,UAAM,SAAS,KAAK,IAAI,OAAO,MAAM,IAAI;AACzC,YAAQ,UAAU;AAClB,YAAQ,IAAI,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,KAAK,CAAC;AACzD,YAAQ,UAAU;AAClB,YAAQ,KAAK;AAAA,EACf;AAEA,UAAQ,UAAU,CAAC,OAAO,CAAC,KAAK;AAChC,UAAQ,UAAU,SAAS,OAAO;AAClC,UAAQ,OAAO,UAAU;AACzB,UAAQ,MAAM,OAAO,KAAK;AAC1B,UAAQ,UAAU,CAAC,SAAS,CAAC,OAAO;AAEpC,UAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,UAAQ,QAAQ;AAClB;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,WAAW,cAAAC,QAAM,OAAgC,IAAI;AAC3D,QAAM,YAAY,cAAAA,QAAM,OAAiC,IAAI;AAC7D,QAAM,gBAAgB,cAAAA,QAAM,OAAO,UAAU;AAC7C,gBAAc,UAAU;AACxB,QAAM,WAAW,cAAAA,QAAM,OAAO,CAAC;AAC/B,QAAM,YAAY,cAAAA,QAAM,OAAO,CAAC;AAEhC,QAAM,CAAC,eAAe,gBAAgB,IAAI,cAAAA,QAAM,SAAS,OAAO;AAChE,QAAM,CAAC,MAAM,OAAO,IAAI,cAAAA,QAAM,SAAe,EAAE,GAAG,YAAY,GAAG,GAAG,WAAW,CAAC;AAChF,QAAM,CAAC,eAAe,gBAAgB,IAAI,cAAAA,QAAM,SAAoB;AACpE,QAAM,CAAC,OAAO,QAAQ,IAAI,cAAAA,QAAM,SAAS,CAAC;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAI,cAAAA,QAAM,SAAS,CAAC;AAC5C,WAAS,UAAU;AACnB,YAAU,UAAU;AAEpB,QAAM,qBAAqB,cAAAA,QAAM,YAAY,CAAC,UAA4B;AACxE,UAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAI,CAAC,SAAS,CAAC,OAAQ;AAEvB,UAAM,WAAW,YAAY,OAAO,QAAQ,cAAc,cAAc,OAAO;AAC/E,UAAM,gBAAY,6CAAmB,UAAU,OAAO,MAAM;AAC5D,QAAI,CAAC,UAAU,SAAS,CAAC,UAAU,OAAQ;AAE3C,YAAQ,QAAQ;AAChB,qBAAiB,SAAS;AAE1B,UAAM,SAAS,UAAU;AACzB,QAAI,QAAQ;AACV;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,YAAY,CAAC;AAE/B,gBAAAA,QAAM,UAAU,MAAM;AACpB,qBAAiB,OAAO;AAAA,EAC1B,GAAG,CAAC,OAAO,CAAC;AAEZ,gBAAAA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAAC,eAAe;AAClB,cAAQ,EAAE,GAAG,YAAY,GAAG,GAAG,cAAc,QAAQ,CAAC;AACtD,uBAAiB,MAAS;AAC1B,eAAS,CAAC;AACV,gBAAU,CAAC;AACX;AAAA,IACF;AAEA,aAAS,CAAC;AACV,cAAU,CAAC;AAEX,UAAM,WAAW,MAAM;AACrB,YAAM,QAAQ,SAAS;AACvB,UAAI,OAAO,YAAY,MAAM,QAAQ,KAAK,MAAM,SAAS,GAAG;AAC1D,2BAAmB,KAAK;AACxB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,EAAG;AAEhB,UAAM,QAAQ,sBAAsB,MAAM;AACxC,eAAS;AAAA,IACX,CAAC;AACD,WAAO,MAAM,qBAAqB,KAAK;AAAA,EACzC,GAAG,CAAC,eAAe,kBAAkB,CAAC;AAEtC,gBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,iBAAiB,CAAC,SAAS,WAAW,CAAC,UAAU,QAAS;AAC/D;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,eAAe,OAAO,QAAQ,YAAY,CAAC;AAE/C,QAAM,cAAc,CAAC,MAA8C;AACjE,uBAAmB,EAAE,aAAa;AAAA,EACpC;AAEA,QAAM,sBAAsB,CAAC,aAAwB;AACnD,QAAI,CAAC,SAAS,SAAS,CAAC,SAAS,OAAQ;AACzC,qBAAiB,QAAQ;AAAA,EAC3B;AAEA,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,iBAAiB,CAAC,SAAS,QAAS;AAEzC,UAAM,gBAAgB,SAAS,cAAc,QAAQ;AACrD;AAAA,MACE,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,IAAI,QAAqB,CAAC,YAAY;AACvD,oBAAc,OAAO,CAAC,aAAa,QAAQ,QAAQ,GAAG,WAAW;AAAA,IACnE,CAAC;AAED,QAAI,CAAC,KAAM;AACX,UAAM,YAAY,IAAI,gBAAgB,IAAI;AAC1C,UAAM,OAAO,SAAS;AAAA,EACxB;AAEA,QAAM,cAAc,MAAM;AACxB,qBAAiB,EAAE;AACnB,eAAW;AACX,aAAS,UAAU;AACnB,UAAM,SAAS,UAAU;AACzB,QAAI,QAAQ;AACV,YAAM,UAAU,OAAO,WAAW,IAAI;AACtC,UAAI,SAAS;AACX,gBAAQ,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,MACrD;AAAA,IACF;AACA,YAAQ,EAAE,GAAG,YAAY,GAAG,GAAG,cAAc,QAAQ,CAAC;AACtD,aAAS,CAAC;AACV,cAAU,CAAC;AACX,qBAAiB,MAAS;AAAA,EAC5B;AAEA,QAAM,wBAAwB,MAAM;AAClC,aAAS,CAAC;AACV,cAAU,CAAC;AAAA,EACb;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AvBrOQ,IAAAC,uBAAA;AA5CR,IAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B;AACF,MAAM;AACJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAEF,OACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAEF,YACE,gFACG;AAAA;AAAA,QACA,oBACC;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,QAAQ,CAAC,MAAM,eAAe,CAAC;AAAA;AAAA,QACjC;AAAA,SAEJ;AAAA,MAEF,QACE;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,mBAAmB;AAAA,UACnB,SAAS,MAAM;AAEb,wBAAY;AACZ,sBAAU;AAAA,UACZ;AAAA,UACA,cAAc,CAAC,iBAAiB,CAAC;AAAA;AAAA,MACnC;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,kBAAQ;","names":["ImageList","ImageListItem","import_jsx_runtime","import_jsx_runtime","ReactCrop","import_jsx_runtime","import_jsx_runtime","MuiButton","import_jsx_runtime","MuiIconButton","import_PhotoSizeSelectLarge","import_Close","import_Person","import_DeleteForever","import_AccountTreeOutlined","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_react","import_react_image_crop","React","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/elemental/Image/index.ts","../src/components/elemental/Image/src/MuiImageList/MuiImageList.tsx","../src/components/elemental/Image/src/Cropper/Cropper.tsx","../src/_utils/_func/sx.ts","../src/components/elemental/Box/src/index.ts","../src/components/elemental/Image/src/Cropper/theme.ts","../src/components/elemental/Image/src/Cropper/layout/CropperLayout.tsx","../src/components/elemental/Image/src/Cropper/sections/CropperSourceSection.tsx","../src/components/elemental/Slider/src/Slider/index.ts","../src/components/elemental/Typography/src/Typography.ts","../src/components/elemental/Image/src/Cropper/sections/CropperControlsSection.tsx","../src/components/elemental/Button/src/Button/Button.tsx","../src/components/elemental/Button/src/IconButton/IconButton.tsx","../src/components/elemental/Tooltip/src/Tooltip/index.ts","../src/components/Icons/MuiIcon/index.ts","../src/components/elemental/Image/src/Cropper/sections/CropperActionSection.tsx","../src/components/elemental/Image/src/Cropper/sections/CropperFileSelector.tsx","../src/components/elemental/FileUpload/src/FileUpload.tsx","../src/components/elemental/Form/src/FormLabel/FormLabel.tsx","../src/components/elemental/Form/src/index.ts","../src/components/elemental/Progress/src/LinearProgress.tsx","../src/components/elemental/FileUpload/src/theme.ts","../src/components/elemental/FileUpload/src/utils.ts","../src/components/elemental/Image/src/Cropper/hooks/useCropperState.ts"],"sourcesContent":["export * from './src'\n","import ImageList from '@mui/material/ImageList';\nimport ImageListItem from '@mui/material/ImageListItem';\n\n/**\n * Mui compnent for ImageList\n * \n * [Doc](https://mui.com/material-ui/react-image-list/)\n */\nconst MuiImageList = ({imageList,cols=3,rowHeight=164,width='100%',height='auto'}: {\n imageList: {\n id: string | number;\n url: string; \n title?: string;\n }[];\n cols?: number; \n rowHeight?: number;\n width?: number | string;\n height?: number | string;\n}) => {\n return (\n <ImageList sx={{ width, height }} cols={cols} rowHeight={rowHeight}>\n {imageList.map((item) => (\n <ImageListItem key={item.id}>\n <img\n src={`${item.url}?w=${rowHeight * 2}&h=${rowHeight * 2}&fit=crop&auto=format`}\n alt={item.title??\"\"}\n loading=\"lazy\"\n width={rowHeight} height={rowHeight}\n style={{objectFit: 'cover'}}\n />\n </ImageListItem>\n ))}\n </ImageList>\n )\n}\n\nexport default MuiImageList\n","import 'react-image-crop/dist/ReactCrop.css';\nimport CropperLayout from './layout/CropperLayout';\nimport CropperSourceSection from './sections/CropperSourceSection';\nimport CropperControlsSection from './sections/CropperControlsSection';\nimport CropperActionSection from './sections/CropperActionSection';\nimport CropperFileSelector from './sections/CropperFileSelector';\nimport { useCropperState } from './hooks/useCropperState';\nimport type { CropperProps } from './types';\n\nconst Cropper: React.FC<CropperProps> = ({\n blobUrl,\n onSave,\n setImgNull,\n onClear, // optional parent callback when the image is removed\n circularCrop = false,\n defaultRatio,\n resizeCropEnabled = true,\n cropConfig,\n PreviewRenderer,\n footerExtra,\n showFileSelector = false,\n fileSelectorAccept = 'image/*',\n fileSelectorButtonLabel = 'Select Image',\n onFileSelect,\n}) => {\n const {\n imageRef,\n canvasRef,\n activeBlobUrl,\n crop,\n setCrop,\n completedCrop,\n setCompletedCrop,\n scale,\n setScale,\n rotate,\n setRotate,\n onImageLoad,\n handleSave,\n handleClear,\n handleResetTransforms,\n } = useCropperState({\n blobUrl,\n onSave,\n setImgNull,\n circularCrop,\n defaultRatio,\n cropConfig,\n });\n\n return (\n <CropperLayout\n left={(\n <CropperSourceSection\n activeBlobUrl={activeBlobUrl}\n crop={crop}\n setCrop={setCrop}\n setCompletedCrop={setCompletedCrop}\n circularCrop={circularCrop}\n defaultRatio={defaultRatio}\n resizeCropEnabled={resizeCropEnabled}\n rotate={rotate}\n scale={scale}\n imageRef={imageRef}\n onImageLoad={onImageLoad}\n />\n )}\n right={(\n <CropperControlsSection\n PreviewRenderer={PreviewRenderer}\n canvasRef={canvasRef}\n rotate={rotate}\n setRotate={setRotate}\n scale={scale}\n setScale={setScale}\n />\n )}\n leftFooter={(\n <>\n {footerExtra}\n {showFileSelector && (\n <CropperFileSelector\n accept={fileSelectorAccept}\n buttonLabel={fileSelectorButtonLabel}\n onPick={(f) => onFileSelect?.(f)}\n />\n )}\n </>\n )}\n footer={(\n <CropperActionSection\n onSave={handleSave}\n onResetTransforms={handleResetTransforms}\n onClear={() => {\n // clear internal cropper state and also notify parent if it wants to persist the removal\n handleClear();\n onClear?.();\n }}\n saveDisabled={!completedCrop || !activeBlobUrl}\n />\n )}\n />\n );\n};\n\nexport default Cropper;\nexport type { CropperProps };\n","import type { SxProps, Theme } from '@mui/material/styles'\n\n/** Values accepted by {@link mergeSx}: objects, callbacks, arrays (nested ok), or omitted. */\nexport type SxMergePart =\n | SxProps<Theme>\n | Record<string, unknown>\n | ReadonlyArray<SxMergePart>\n | false\n | null\n | undefined\n\nfunction flattenSx(part: unknown): unknown[] {\n if (part == null || typeof part === 'boolean') {\n return []\n }\n if (Array.isArray(part)) {\n return part.flatMap(flattenSx)\n }\n if (typeof part === 'function' || typeof part === 'object') {\n return [part]\n }\n return []\n}\n\n/**\n * Combine MUI `sx` values into one prop.\n *\n * Nested arrays are flattened (`[base, [a, b]]` → `[base, a, b]`).\n * `null` / `undefined` / `false` entries are dropped. Later parts win,\n * same as MUI's `sx` array merge.\n */\nexport function mergeSx(...parts: SxMergePart[]): SxProps<Theme> | undefined {\n const list = parts.flatMap(flattenSx)\n if (list.length === 0) {\n return undefined\n }\n if (list.length === 1) {\n return list[0] as SxProps<Theme>\n }\n return list as SxProps<Theme>\n}\n","export * from './BorderBox'\nexport {default as Box} from '@mui/material/Box'\nexport {default as Stack} from '@mui/material/Stack'\nexport {default as Grid} from '@mui/material/Grid'\n","import type { SxProps, Theme } from '@mui/material/styles'\n\n/**\n * Root-level CSS variable aliases for Cropper.\n * Children consume these vars; palette refs are declared only here.\n *\n * Also overrides react-image-crop public CSS vars (--rc-*) via cascade:\n * https://github.com/DominicTobias/react-image-crop#css-variables\n */\nexport const cropperRootSx: SxProps<Theme> = {\n '--image-border-radius': 'var(--mui-shape-borderRadius)',\n '--image-border': '2px solid var(--mui-palette-secondary-main)',\n // react-image-crop selection theming\n '--rc-border-color': 'var(--mui-palette-border-1)',\n '--rc-focus-color': 'var(--mui-palette-primary-main)',\n '--rc-drag-handle-bg-colour': 'var(--mui-palette-focus-1)',\n \"& .ReactCrop__crop-selection:not(.ReactCrop--no-animate .ReactCrop__crop-selection)\": {\n '--animated-dash-light-color': 'var(--mui-palette-border-1)',\n '--animated-dash-dark-color': 'var(--mui-palette-grey-300)',\n backgroundImage: `\n linear-gradient(to right,var(--animated-dash-light-color) 50%,var(--animated-dash-dark-color) 50%),\n linear-gradient(to right,var(--animated-dash-light-color) 50%,var(--animated-dash-dark-color) 50%),\n linear-gradient(to bottom,var(--animated-dash-light-color) 50%,var(--animated-dash-dark-color) 50%),\n linear-gradient(to bottom,var(--animated-dash-light-color) 50%,var(--animated-dash-dark-color) 50%)`,\n },\n [`& .ReactCrop__rule-of-thirds-vt:before, \n .ReactCrop__rule-of-thirds-vt:after, \n .ReactCrop__rule-of-thirds-hz:before, \n .ReactCrop__rule-of-thirds-hz:after`]: {\n background:\"#fff6\",\n },\n}\n","import { Box } from '@/ele/Box';\nimport { cropperRootSx } from '../theme';\nimport { mergeSx } from '@/_utils/_func';\n\ninterface CropperLayoutProps {\n left: React.ReactNode;\n right: React.ReactNode;\n leftFooter?: React.ReactNode; // content shown at bottom of the left column (e.g. file selector)\n footer?: React.ReactNode; // bottom action/footer bar\n}\n\nexport default function CropperLayout({\n left,\n right,\n leftFooter,\n footer,\n}: CropperLayoutProps) {\n return (\n <Box sx={mergeSx({ display: 'flex', flexDirection: 'column', gap: 2, height: '100%' }, cropperRootSx)}>\n <Box\n sx={{\n // stack children vertically on small screens, switch to two‑column grid at md\n display: { xs: 'table-row-group', md: 'grid' },\n flexDirection: { xs: 'column', md: undefined },\n gridTemplateColumns: { xs: '1fr', md: '1fr 280px' },\n gap: 2,\n alignItems: 'start',\n minHeight: 0,\n flex: '1 1 auto',\n overflow: 'auto',\n }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n minHeight: 0,\n height: '100%',\n alignItems: 'center',\n width: '-webkit-fill-available',\n }}\n >\n {left}\n {leftFooter ? (\n <Box\n data-testid=\"cropper-left-footer\"\n sx={{\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n pt: 1,\n }}\n >\n {leftFooter}\n </Box>\n ) : null}\n </Box>\n\n <Box sx={{ display: 'flex', flexDirection: 'column', justifyContent: 'space-between', minHeight: 0, height: '100%', }}>\n {right}\n {footer}\n </Box>\n </Box>\n </Box>\n );\n}\n","import React from 'react'\nimport ReactCrop, { type Crop, type PixelCrop } from 'react-image-crop';\nimport { Box } from '@/ele/Box';\n\ninterface CropperSourceSectionProps {\n activeBlobUrl: string;\n crop: Crop;\n setCrop: (crop: Crop) => void;\n setCompletedCrop: (crop: PixelCrop) => void;\n circularCrop: boolean;\n defaultRatio?: number;\n resizeCropEnabled: boolean;\n rotate: number;\n scale: number;\n imageRef: React.RefObject<HTMLImageElement | null>;\n onImageLoad: (e: React.SyntheticEvent<HTMLImageElement>) => void;\n}\n\nexport default function CropperSourceSection({\n activeBlobUrl,\n crop,\n setCrop,\n setCompletedCrop,\n circularCrop,\n defaultRatio,\n resizeCropEnabled,\n rotate,\n scale,\n imageRef,\n onImageLoad,\n}: CropperSourceSectionProps) {\n return (\n <Box\n sx={{\n minHeight: 0,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n\n \"& .ReactCrop\": {\n borderRadius: 'var(--image-border-radius)',\n border: 'var(--image-border)',\n\n },\n }}\n >\n {!!activeBlobUrl && (\n <ReactCrop\n crop={crop}\n onChange={(nextCrop) => setCrop(nextCrop)}\n onComplete={(nextCrop) => setCompletedCrop(nextCrop)}\n circularCrop={circularCrop}\n aspect={defaultRatio}\n keepSelection\n ruleOfThirds\n disabled={!resizeCropEnabled}\n style={{ maxWidth: '100%', maxHeight: 420, overflow: 'hidden' }}\n >\n <img\n ref={imageRef}\n alt=\"Crop source\"\n src={activeBlobUrl}\n style={{\n display: 'block',\n width: '100%',\n maxWidth: '100%',\n maxHeight: 420,\n objectFit: 'contain',\n transform: `rotate(${rotate}deg) scale(${scale})`,\n transformOrigin: 'center center',\n }}\n onLoad={onImageLoad}\n />\n </ReactCrop>\n )}\n </Box>\n );\n}\n","export {default as Slider} from '@mui/material/Slider'\nexport * from './theme'\n","export { default } from '@mui/material/Typography'","import React from 'react'\nimport { Box, Stack } from '@/ele/Box';\nimport { Slider } from '@/ele/Slider';\nimport { Typography } from '@/ele/Typography';\n\nconst scaleMarks = [\n { value: 0.5, label: '0.5x' },\n { value: 1, label: '1x' },\n { value: 1.5, label: '1.5x' },\n { value: 2, label: '2x' },\n { value: 2.5, label: '2.5x' },\n { value: 3, label: '3x' },\n];\n\nconst rotationMarks = [\n { value: -180, label: '-180°' },\n { value: -90, label: '-90°' },\n { value: 0, label: '0°' },\n { value: 90, label: '90°' },\n { value: 180, label: '180°' },\n];\n\ninterface CropperControlsSectionProps {\n PreviewRenderer?: React.ForwardRefExoticComponent<React.RefAttributes<HTMLCanvasElement>>;\n canvasRef: React.RefObject<HTMLCanvasElement | null>;\n rotate: number;\n setRotate: (value: number) => void;\n scale: number;\n setScale: (value: number) => void;\n}\n\nexport default function CropperControlsSection({\n PreviewRenderer,\n canvasRef,\n rotate,\n setRotate,\n scale,\n setScale,\n}: CropperControlsSectionProps) {\n return (\n <Stack spacing={2} sx={{ minWidth: 0, px: 2 }}>\n <Box display=\"flex\" justifyContent=\"center\">\n {PreviewRenderer ? (\n <PreviewRenderer ref={canvasRef} />\n ) : (\n <canvas\n ref={canvasRef}\n style={{ width: '100%', maxWidth: 260,\n border: 'var(--image-border)',\n borderRadius: 'var(--image-border-radius)',\n }}\n />\n )}\n </Box>\n\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Rotation ({rotate}°)\n </Typography>\n <Slider\n min={-180}\n max={180}\n step={1}\n marks={rotationMarks}\n value={rotate}\n onChange={(_, value) => setRotate(Array.isArray(value) ? value[0] : value)}\n />\n </Box>\n\n <Box>\n <Typography variant=\"body2\" sx={{ mb: 1 }}>\n Resize scale ({scale.toFixed(2)}x)\n </Typography>\n <Slider\n min={0.5}\n max={3}\n step={0.05}\n marks={scaleMarks}\n value={scale}\n onChange={(_, value) => setScale(Array.isArray(value) ? value[0] : value)}\n />\n </Box>\n </Stack>\n );\n}\n","import React from 'react';\n\nimport MuiButton from '@mui/material/Button';\nimport { Box } from '@/ele/Box';\nimport { mergeSx } from '@/_utils/_func';\n\n/**\n * A modified MUI Button that truncates long text with ellipsis.\n * \n * [Doc](https://mui.com/material-ui/react-button/)\n * [API](https://mui.com/material-ui/api/button/)\n */\nexport default function Button(p:\n React.ComponentProps<typeof MuiButton> & {\n slotProps?: {\n innerBox?: React.ComponentProps<typeof Box>\n }\n }) {\n const {children, slotProps, ...rest} = p\n const {sx, ...boxRest} = slotProps?.innerBox ?? {}\n return <MuiButton {...rest}>\n <Box \n {...boxRest}\n sx={mergeSx(\n {\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'pre',\n },\n sx,\n )}>\n {children}\n </Box>\n </MuiButton>\n}","'use client'\nimport {forwardRef} from 'react'\nimport MuiIconButton from '@mui/material/IconButton'\nimport { Tooltip } from '@/ele/Tooltip'\nimport { type TooltipProps } from '@mui/material/Tooltip'\nimport { Box } from '@/ele/Box'\n\ntype IconButtonProps = React.ComponentProps<typeof MuiIconButton>\ntype Props = {\n /** The Icon to render */\n children: React.ReactNode;\n /** The title of the tooltip */\n title?: string;\n /** \n * The color theme of the entire component.\n * @default 'secondary' (from theme)\n */\n color?: IconButtonProps['color'];\n /**\n * The size of the component.\n * @default 'small' (from theme)\n */\n size?: IconButtonProps['size'];\n \n selected?: boolean;\n \n slotProps?: {\n tooltip?: Omit<TooltipProps, \"children\">\n };\n} & Omit<IconButtonProps, \"color\" | \"size\">;\n\n/**\n * A MuiIconButton wrapped in a MuiTooltip.\n * Default props like `size` and `color` are handled by the theme.\n */\nconst IconButton = forwardRef<HTMLButtonElement, Props>(({\n title = \"\",\n children,\n color,\n size,\n slotProps,\n selected,\n className,\n ...props\n}, ref) => {\n return (\n <Tooltip \n title={title} \n slotProps={{\n popper: {\n sx: {\n textTransform: \"capitalize\",\n }\n },\n ...slotProps?.tooltip\n }}\n >\n <Box component=\"span\" sx={{width: \"fit-content\"}}>\n <MuiIconButton\n ref={ref}\n color={color}\n size={size}\n className={[className, selected ? 'Mui-selected' : ''].filter(Boolean).join(' ')}\n {...props}\n >\n {children}\n </MuiIconButton>\n </Box>\n </Tooltip>\n )\n})\n\nexport default IconButton","export {default as Tooltip} from '@mui/material/Tooltip'\nexport * from './theme'\n","// display\nexport {default as ArrowIcon} from '@mui/icons-material/ArrowRightAlt'\nexport {default as FileIcon} from '@mui/icons-material/DescriptionOutlined'\nexport {default as DescriptionIcon} from '@mui/icons-material/Description'\nexport {default as PictureAsPdfIcon} from '@mui/icons-material/PictureAsPdf'\nexport {default as AudioFileIcon} from '@mui/icons-material/AudioFile'\nexport {default as VideoFileIcon} from '@mui/icons-material/VideoFile'\nexport {default as TableChartIcon} from '@mui/icons-material/TableChart'\nexport {default as FolderZipIcon} from '@mui/icons-material/FolderZip'\nexport {default as InsertDriveFileIcon} from '@mui/icons-material/InsertDriveFile'\nexport {default as ImageIcon} from '@mui/icons-material/ImageOutlined'\nexport {default as LayersIcon} from '@mui/icons-material/LayersOutlined'\nexport {default as TextIcon} from '@mui/icons-material/TextFormat'\nexport {default as RemoveIcon} from '@mui/icons-material/Remove'\nexport {default as AddFileIcon} from '@mui/icons-material/PostAdd'\nexport {default as ErrorIcon} from '@mui/icons-material/ErrorOutline'\nexport {default as QuestionIcon} from '@mui/icons-material/QuestionMarkOutlined'\nexport {default as RoomIcon} from '@mui/icons-material/MeetingRoomOutlined'\nexport {default as BlacklistIcon} from '@mui/icons-material/PlaylistRemove'\nexport {default as WhitelistIcon} from '@mui/icons-material/ChecklistRtl'\nexport {default as NoImageIcon} from '@mui/icons-material/HideImageOutlined'\nexport {default as EyeIcon} from '@mui/icons-material/RemoveRedEyeTwoTone'\nexport {default as CropSizeIcon} from '@mui/icons-material/PhotoSizeSelectLarge'\nexport {default as AdminIcon} from '@mui/icons-material/LockPersonOutlined'\nexport {default as UserIcon} from '@mui/icons-material/Person'\nexport {default as EmoticonIcon} from '@mui/icons-material/InsertEmoticon'\nexport {default as DisabledSelectionIcon} from '@mui/icons-material/RemoveDoneOutlined'\nexport {default as TagIcon} from '@mui/icons-material/Tag'\nexport {default as AudioIcon} from '@mui/icons-material/Audiotrack'\nexport {default as VideoIcon} from '@mui/icons-material/Videocam'\nexport {default as CodeIcon} from '@mui/icons-material/Code'\nexport {default as ChartIcon} from '@mui/icons-material/Equalizer'\nexport {default as TableIcon} from '@mui/icons-material/PivotTableChart'\nexport {default as SearchIcon} from '@mui/icons-material/Search'\nexport {default as DataObjectIcon} from '@mui/icons-material/DataObject'\nexport {default as A2ZIcon} from '@mui/icons-material/SortByAlpha'\nexport {default as ThumbUpIcon} from '@mui/icons-material/ThumbUp'\nexport {default as MoneyIcon} from '@mui/icons-material/AttachMoneyOutlined'\nexport {default as ServerIcon} from '@mui/icons-material/Storage'\nexport {default as CerticateIcon} from '@mui/icons-material/WorkspacePremium'\nexport {default as NumberIcon} from '@mui/icons-material/Numbers'\nexport {default as SumIcon} from '@mui/icons-material/Functions'\nexport {default as LightBulbIcon} from '@mui/icons-material/Lightbulb'\nexport {default as RotateIcon} from '@mui/icons-material/CropRotate'\nexport {default as ImageSzieScaleIcon} from '@mui/icons-material/PhotoSizeSelectLarge'\nexport {default as CollectionIcon} from '@mui/icons-material/CollectionsBookmark'\nexport {default as HistoryIcon} from '@mui/icons-material/Schedule'\nexport {default as StyleIcon} from '@mui/icons-material/Style'\nexport {default as ARHorizontalIcon} from '@mui/icons-material/Crop169'\nexport {default as ARSquareIcon} from '@mui/icons-material/CropSquare'\nexport {default as VoiceIcon} from '@mui/icons-material/GraphicEqRounded'\nexport {default as MemoryIcon} from '@mui/icons-material/MemoryRounded'\n\n// button\nexport {default as AddCircleIcon} from '@mui/icons-material/AddCircleOutlineRounded'\nexport {default as AddIcon} from '@mui/icons-material/Add'\nexport {default as CloseIcon} from '@mui/icons-material/Close'\nexport {default as ExpandMoreIcon} from '@mui/icons-material/ExpandMore'\nexport {default as AutorenewIcon} from '@mui/icons-material/Autorenew'\nexport {default as CheckCircleIcon} from '@mui/icons-material/CheckCircle'\nexport {default as MenuIcon} from '@mui/icons-material/Menu'\nexport {default as MoreIcon} from '@mui/icons-material/MoreVert'\nexport {default as MoreHorizIcon} from '@mui/icons-material/MoreHoriz'\nexport {default as CopyIcon} from '@mui/icons-material/ContentCopy'\nexport {default as PasteIcon} from '@mui/icons-material/ContentPaste'\nexport {default as CloudIcon} from '@mui/icons-material/Cloud'\nexport {default as DownloadIcon} from '@mui/icons-material/DownloadOutlined'\nexport {default as DownloadDoneIcon} from '@mui/icons-material/DownloadDoneOutlined'\nexport {default as StartIcon} from '@mui/icons-material/StarBorderOutlined'\nexport {default as DeleteIcon} from '@mui/icons-material/DeleteForever'\nexport {default as LayerClearIcon } from '@mui/icons-material/LayersClear'\nexport {default as CheckIcon } from '@mui/icons-material/Check'\nexport {default as CheckAllIcon } from '@mui/icons-material/DoneAll'\nexport {default as PowerIcon } from '@mui/icons-material/PowerSettingsNew'\nexport {default as SendIcon } from '@mui/icons-material/Send'\nexport {default as ZoomInIcon } from '@mui/icons-material/ZoomInMap'\nexport {default as ZoomOutIcon } from '@mui/icons-material/ZoomOutMap'\nexport {default as ToolIcon } from '@mui/icons-material/HomeRepairService'\nexport {default as ConstructionIcon } from '@mui/icons-material/Construction'\nexport {default as HelpIcon } from '@mui/icons-material/Help'\nexport {default as ReportIcon } from '@mui/icons-material/EmojiFlags'\nexport {default as EditIcon } from '@mui/icons-material/Edit'\nexport {default as ForkIcon } from '@mui/icons-material/ForkRight'\nexport {default as SettingIcon } from '@mui/icons-material/Settings'\nexport {default as RestoreIcon } from '@mui/icons-material/Restore'\nexport {default as EditListIcon } from '@mui/icons-material/EditNote'\nexport {default as HomeIcon } from '@mui/icons-material/HomeOutlined'\nexport {default as EnterRoomIcon } from '@mui/icons-material/ExitToAppOutlined'\nexport {default as SunIcon} from '@mui/icons-material/WbSunnyOutlined'\nexport {default as MoonIcon} from '@mui/icons-material/DarkModeOutlined'\nexport {default as AttachFileIcon} from '@mui/icons-material/AttachFileOutlined'\nexport {default as NoteAddIcon} from '@mui/icons-material/NoteAdd'\nexport {default as CloudUploadIcon} from '@mui/icons-material/CloudUpload'\nexport {default as DoubleRightArrowIcon} from '@mui/icons-material/KeyboardDoubleArrowRight'\nexport {default as DoubleLeftArrowIcon} from '@mui/icons-material/KeyboardDoubleArrowLeft'\nexport {default as DoubleArrowIcon} from '@mui/icons-material/KeyboardDoubleArrowRightRounded'\nexport {default as FitScreenIcon} from '@mui/icons-material/FitScreen'\nexport {default as FullscreenIcon} from '@mui/icons-material/Fullscreen'\nexport {default as TestIcon} from '@mui/icons-material/Biotech'\nexport {default as ShareIcon} from '@mui/icons-material/Share'\nexport {default as FilterIcon} from '@mui/icons-material/FilterAlt'\nexport {default as SyncIcon} from '@mui/icons-material/Sync'\nexport {default as PlayIcon} from '@mui/icons-material/PlayArrow'\nexport {default as PauseIcon} from '@mui/icons-material/PauseOutlined'\nexport {default as RandomIcon} from '@mui/icons-material/Casino'\nexport {default as CoinIcon} from '@mui/icons-material/Paid'\nexport {default as SaveChangesIcon} from '@mui/icons-material/Save'\nexport {default as StopIcon} from '@mui/icons-material/StopRounded'\nexport {default as ReplayIcon} from '@mui/icons-material/Replay'\nexport {default as TreeIcon} from '@mui/icons-material/AccountTree'\nexport {default as ClearIcon} from '@mui/icons-material/Close'\nexport {default as KeyboardArrowDownIcon} from '@mui/icons-material/KeyboardArrowDown'\nexport {default as KeyboardArrowRightIcon} from '@mui/icons-material/KeyboardArrowRight'\nexport {default as SearchRoundedIcon} from '@mui/icons-material/SearchRounded'\nexport {default as CloseRoundedIcon} from '@mui/icons-material/CloseRounded'\nexport {default as SortByAlphaRoundedIcon} from '@mui/icons-material/SortByAlphaRounded'\nexport {default as FilterAltOutlinedIcon} from '@mui/icons-material/FilterAltOutlined'\nexport {default as InboxOutlinedIcon} from '@mui/icons-material/InboxOutlined'\nexport {default as SearchOffIcon} from '@mui/icons-material/SearchOff'\nexport {default as ClearRoundedIcon} from '@mui/icons-material/ClearRounded'\nexport {default as ArrowDropDownRoundedIcon} from '@mui/icons-material/ArrowDropDownRounded'\n\n// login\nexport {default as AccountIcon} from '@mui/icons-material/AccountBox'\nexport {default as LogoutIcon} from '@mui/icons-material/Logout'\nexport {default as LoginIcon} from '@mui/icons-material/Login'\nexport {default as DashboardIcon} from '@mui/icons-material/Dashboard'\n\n//logo\nexport {default as WorkFlowIcon} from '@mui/icons-material/AccountTreeOutlined'\nexport {default as HelpOutlineIcon} from '@mui/icons-material/HelpOutline'\nexport {default as NavigateBeforeIcon} from '@mui/icons-material/NavigateBefore'\nexport {default as NavigateNextIcon} from '@mui/icons-material/NavigateNext'\nexport {default as PersonIcon} from '@mui/icons-material/Person'\nexport {default as CalendarTodayIcon} from '@mui/icons-material/CalendarToday'\nexport {default as ChatIcon} from '@mui/icons-material/QuestionAnswerOutlined'\nexport {default as TodayIcon} from '@mui/icons-material/Today'\nexport {default as DeleteForeverIcon} from '@mui/icons-material/DeleteForever'\n\nexport {default as AdsClickIcon} from '@mui/icons-material/AdsClick'\nexport {default as FingerprintIcon} from '@mui/icons-material/Fingerprint'\nexport {default as SportsEsportsOutlinedIcon} from '@mui/icons-material/SportsEsportsOutlined'\nexport {default as HelpOutlineRoundedIcon} from '@mui/icons-material/HelpOutlineRounded'\nexport {default as AccountTreeOutlinedIcon} from '@mui/icons-material/AccountTreeOutlined'\nexport {default as SmartToyOutlinedIcon} from '@mui/icons-material/SmartToyOutlined'\nexport {default as AcUnitIcon} from '@mui/icons-material/AcUnit'\nexport {default as LoopIcon} from '@mui/icons-material/Loop'\nexport {default as PendingIcon} from '@mui/icons-material/Pending'\nexport {default as AllInclusiveIcon} from '@mui/icons-material/AllInclusive'\nexport {default as WarningOutlinedIcon} from '@mui/icons-material/WarningOutlined'\nexport {default as InfoOutlinedIcon} from '@mui/icons-material/InfoOutlined'\nexport {default as AutoAwesomeRoundedIcon} from '@mui/icons-material/AutoAwesomeRounded'\nexport {default as ErrorOutlineOutlinedIcon} from '@mui/icons-material/ErrorOutlineOutlined'\nexport {default as DownloadFilledIcon} from '@mui/icons-material/Download'","import { Box } from '@/ele/Box';\nimport { IconButton } from '@/ele/Button';\nimport { CheckIcon } from '@/icons/MuiIcon';\nimport { ClearIcon } from '@/icons/MuiIcon';\nimport { ReplayIcon } from '@/icons/MuiIcon';\n\ninterface CropperActionSectionProps {\n onSave: () => void;\n onResetTransforms: () => void;\n onClear: () => void;\n saveDisabled?: boolean;\n}\n\nexport default function CropperActionSection({\n onSave,\n onResetTransforms,\n onClear,\n saveDisabled,\n}: CropperActionSectionProps) {\n return (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 1,\n flexWrap: 'wrap',\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' }}>\n <IconButton onClick={onResetTransforms} title=\"Reset Scale & Rotation\">\n <ReplayIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton onClick={onClear} color=\"error\" title=\"Remove image\">\n <ClearIcon fontSize=\"small\" />\n </IconButton>\n\n <IconButton onClick={onSave} color=\"success\" disabled={saveDisabled} title=\"Save\">\n <CheckIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n </Box>\n );\n}\n","import React from 'react'\nimport { Box } from '@/ele/Box'\nimport {\n FileUpload,\n type FileUploadItem,\n} from '@/ele/FileUpload'\n\n/** Mime → extensions map (legacy dropzone shape) or HTML accept string. */\ntype AcceptInput = string | Record<string, string[]>\n\ninterface Props {\n accept?: AcceptInput\n buttonLabel?: string\n /** `null` means the selection was cleared */\n onPick?: (file: File | null) => void\n}\n\nfunction acceptToString(accept: AcceptInput | undefined): string {\n if (!accept) return 'image/*'\n if (typeof accept === 'string') return accept\n const parts: string[] = []\n Object.entries(accept).forEach(([mime, exts]) => {\n parts.push(mime)\n if (Array.isArray(exts)) parts.push(...exts)\n })\n return parts.length ? parts.join(',') : 'image/*'\n}\n\n/**\n * Compact image picker for Cropper — elemental FileUpload button + tile.\n */\nexport default function CropperFileSelector({\n accept = 'image/*',\n buttonLabel = 'Select Image',\n onPick,\n}: Props) {\n const [value, setValue] = React.useState<FileUploadItem[]>([])\n const lastIdRef = React.useRef<string | null>(null)\n\n React.useEffect(() => {\n if (!value.length) {\n if (lastIdRef.current) {\n lastIdRef.current = null\n onPick?.(null)\n }\n return\n }\n const item = value[0]\n if (lastIdRef.current === item.id) return\n lastIdRef.current = item.id\n onPick?.(item.file)\n }, [value, onPick])\n\n return (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n pt: 0,\n }}\n >\n <FileUpload\n value={value}\n onChange={setValue}\n accept={acceptToString(accept)}\n maxFiles={1}\n multiple={false}\n variant=\"button\"\n buttonLabel={buttonLabel}\n itemVariant=\"tile\"\n // Shrink-wrap so parent can center this sector; override button alignSelf.\n sx={{\n width: 'fit-content',\n maxWidth: '100%',\n alignItems: 'center',\n '& .MuiButton-root': { alignSelf: 'center' },\n '& [data-testid$=\"-list\"]': { justifyContent: 'center' },\n }}\n />\n </Box>\n )\n}\n","'use client'\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { Box, Stack } from '@/ele/Box'\nimport { Typography } from '@/ele/Typography'\nimport { Button, IconButton } from '@/ele/Button'\nimport { FormHelperText, FormLabel } from '@/ele/Form'\nimport { LinearProgress } from '@/ele/Progress'\nimport { CloseIcon, CloudUploadIcon } from '@/icons/MuiIcon'\nimport { FileIcon, defaultStyles, type FileIconProps } from 'react-file-icon'\nimport {\n fileUploadButtonSx,\n fileUploadDropzoneSx,\n fileUploadIconWellSx,\n fileUploadItemSx,\n fileUploadLibIconSx,\n fileUploadRootSx,\n fileUploadThumbSx,\n fileUploadTileIconWellSx,\n fileUploadTileLibIconSx,\n fileUploadTileListSx,\n fileUploadTileMediaSx,\n fileUploadTileProgressSx,\n fileUploadTileRemoveSx,\n fileUploadTileSx,\n} from './theme'\nimport type { FileUploadItem, FileUploadProps } from './types'\nimport {\n createFileUploadItem,\n formatFileSize,\n isImageFile,\n resolveFileIconStyle,\n validateFiles,\n} from './utils'\n\nfunction mergeSx(\n ...parts: Array<FileUploadProps['sx'] | false | null | undefined>\n): FileUploadProps['sx'] {\n const out: unknown[] = []\n for (const p of parts) {\n if (!p) continue\n if (Array.isArray(p)) out.push(...p)\n else out.push(p)\n }\n return out as FileUploadProps['sx']\n}\n\n/**\n * Soft FileUpload dropzone + file list.\n *\n * **UseForm API:** controlled `value: FileUploadItem[]` / `onChange`.\n * Submit blobs with `value.map((i) => i.file)`. Drive progress from outside\n * by updating `progress` / `status` / `error` on the same items (stable `id`).\n *\n * Soft quiet 1px dashed border + elevated fill (EmptyState / Autocomplete glass).\n * `variant=\"button\"` = compact soft upload button (compound DropZoneButton parity).\n */\nexport const FileUpload = forwardRef<HTMLDivElement, FileUploadProps>(\n function FileUpload(props, ref) {\n const {\n value: valueProp,\n defaultValue,\n onChange,\n onRemove,\n onReject,\n multiple = true,\n accept,\n maxSize,\n maxFiles,\n disabled = false,\n hideDropzone = false,\n disableRemove = false,\n readOnly = false,\n label,\n name,\n helperText,\n error = false,\n required = false,\n variant = 'dropzone',\n itemVariant = 'row',\n buttonLabel = 'Upload file',\n dropzoneTitle = 'Drag & drop files here',\n dropzoneDescription = 'or click to browse',\n id: idProp,\n className,\n sx,\n 'data-testid': dataTestId = 'file-upload',\n } = props\n\n const reactId = useId()\n const inputId = idProp ?? `file-upload-${reactId}`\n const helperId = `${inputId}-helper`\n const inputRef = useRef<HTMLInputElement>(null)\n\n const isControlled = valueProp !== undefined\n const [uncontrolled, setUncontrolled] = useState<FileUploadItem[]>(\n () => defaultValue ?? [],\n )\n const items = useMemo(\n () => (isControlled ? (valueProp ?? []) : uncontrolled),\n [isControlled, valueProp, uncontrolled],\n )\n\n const [active, setActive] = useState(false)\n const dragDepth = useRef(0)\n\n const atCapacity = useMemo(() => {\n if (!multiple) return items.length >= 1\n if (maxFiles != null && maxFiles > 0) return items.length >= maxFiles\n return false\n }, [items.length, maxFiles, multiple])\n\n const commit = useCallback(\n (next: FileUploadItem[]) => {\n if (!isControlled) setUncontrolled(next)\n onChange?.(next)\n },\n [isControlled, onChange],\n )\n\n const ingest = useCallback(\n (fileList: FileList | File[]) => {\n if (disabled) return\n const incoming = Array.from(fileList)\n if (incoming.length === 0) return\n\n const { accepted, rejections } = validateFiles(incoming, {\n accept,\n maxSize,\n maxFiles,\n currentCount: items.length,\n multiple,\n })\n\n if (rejections.length > 0) {\n onReject?.(rejections)\n }\n\n if (accepted.length === 0) return\n\n const nextItems = accepted.map(createFileUploadItem)\n if (!multiple) {\n commit(nextItems.slice(0, 1))\n return\n }\n commit([...items, ...nextItems])\n },\n [\n accept,\n disabled,\n items,\n maxFiles,\n maxSize,\n multiple,\n onReject,\n commit,\n ],\n )\n\n const handleRemove = useCallback(\n (item: FileUploadItem) => {\n if (disabled) return\n const next = items.filter((i) => i.id !== item.id)\n commit(next)\n onRemove?.(item, next)\n if (inputRef.current) inputRef.current.value = ''\n },\n [commit, disabled, items, onRemove],\n )\n\n const openPicker = useCallback(() => {\n if (disabled || atCapacity) return\n inputRef.current?.click()\n }, [atCapacity, disabled])\n\n const onInputChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) ingest(e.target.files)\n // Allow re-selecting the same file name.\n e.target.value = ''\n },\n [ingest],\n )\n\n const onDragEnter = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (disabled || atCapacity) return\n dragDepth.current += 1\n setActive(true)\n },\n [atCapacity, disabled],\n )\n\n const onDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragDepth.current = Math.max(0, dragDepth.current - 1)\n if (dragDepth.current === 0) setActive(false)\n }, [])\n\n const onDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }, [])\n\n const onDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragDepth.current = 0\n setActive(false)\n if (disabled || atCapacity) return\n if (e.dataTransfer.files?.length) {\n ingest(e.dataTransfer.files)\n }\n },\n [atCapacity, disabled, ingest],\n )\n\n const queueOnly = readOnly || hideDropzone\n const removeDisabled = readOnly || disableRemove || disabled\n const showTrigger = !queueOnly && !atCapacity\n const isButton = variant === 'button'\n\n const fileInput = (\n <input\n ref={inputRef}\n id={inputId}\n name={name}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={onInputChange}\n style={{ display: 'none' }}\n aria-hidden\n tabIndex={-1}\n />\n )\n\n const dragHandlers = {\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n } as const\n\n return (\n <Box\n ref={ref}\n className={className}\n data-testid={dataTestId}\n data-variant={variant}\n data-readonly={readOnly || queueOnly ? 'true' : undefined}\n sx={mergeSx(fileUploadRootSx, sx) as never}\n >\n {label ? (\n <FormLabel\n htmlFor={showTrigger ? inputId : undefined}\n required={required}\n error={error}\n sx={{\n mb: 0.25,\n color: error ? 'error.main' : 'text.secondary',\n fontSize: '0.8rem',\n fontWeight: 600,\n }}\n >\n {label}\n </FormLabel>\n ) : null}\n\n {fileInput}\n\n {showTrigger ? (\n isButton ? (\n <Button\n type=\"button\"\n disableElevation\n disabled={disabled}\n aria-invalid={error || undefined}\n aria-describedby={helperText ? helperId : undefined}\n data-active={active ? 'true' : 'false'}\n data-error={error ? 'true' : 'false'}\n data-testid={`${dataTestId}-button`}\n startIcon={<CloudUploadIcon sx={{ fontSize: '1.15rem' }} />}\n onClick={openPicker}\n sx={fileUploadButtonSx}\n {...dragHandlers}\n >\n {buttonLabel}\n </Button>\n ) : (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled || undefined}\n aria-invalid={error || undefined}\n aria-describedby={helperText ? helperId : undefined}\n data-active={active ? 'true' : 'false'}\n data-error={error ? 'true' : 'false'}\n data-disabled={disabled ? 'true' : 'false'}\n data-testid={`${dataTestId}-dropzone`}\n sx={fileUploadDropzoneSx}\n onClick={openPicker}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n openPicker()\n }\n }}\n {...dragHandlers}\n >\n <CloudUploadIcon\n aria-hidden\n sx={{ fontSize: 36, color: 'var(--fu-icon)', opacity: 0.9 }}\n />\n {typeof dropzoneTitle === 'string' ? (\n <Typography\n variant=\"subtitle2\"\n sx={{ m: 0, color: 'var(--fu-text)', fontWeight: 600 }}\n >\n {dropzoneTitle}\n </Typography>\n ) : (\n dropzoneTitle\n )}\n {dropzoneDescription ? (\n typeof dropzoneDescription === 'string' ? (\n <Typography\n variant=\"caption\"\n sx={{ m: 0, color: 'var(--fu-text-secondary)' }}\n >\n {dropzoneDescription}\n </Typography>\n ) : (\n dropzoneDescription\n )\n ) : null}\n </Box>\n )\n ) : null}\n\n {items.length > 0 ? (\n itemVariant === 'tile' ? (\n <Box\n component=\"ul\"\n data-testid={`${dataTestId}-list`}\n data-item-variant=\"tile\"\n sx={fileUploadTileListSx}\n >\n {items.map((item) => (\n <FileUploadListItem\n key={item.id}\n item={item}\n disabled={disabled}\n disableRemove={removeDisabled}\n onRemove={handleRemove}\n testId={`${dataTestId}-item`}\n itemVariant=\"tile\"\n />\n ))}\n </Box>\n ) : (\n <Stack\n component=\"ul\"\n spacing={1}\n data-testid={`${dataTestId}-list`}\n data-item-variant=\"row\"\n sx={{ m: 0, p: 0, listStyle: 'none' }}\n >\n {items.map((item) => (\n <FileUploadListItem\n key={item.id}\n item={item}\n disabled={disabled}\n disableRemove={removeDisabled}\n onRemove={handleRemove}\n testId={`${dataTestId}-item`}\n itemVariant=\"row\"\n />\n ))}\n </Stack>\n )\n ) : null}\n\n {helperText ? (\n <FormHelperText\n id={helperId}\n error={error}\n sx={{ mx: 0.5, mt: 0 }}\n >\n {helperText}\n </FormHelperText>\n ) : null}\n </Box>\n )\n },\n)\n\nfunction FileUploadTypeIcon({\n file,\n tile = false,\n}: {\n file: File\n tile?: boolean\n}) {\n const resolved = resolveFileIconStyle(\n file,\n defaultStyles as Record<string, Partial<FileIconProps> | undefined>,\n )\n const { extension, styleKey } = resolved\n const iconStyle = resolved.style as Partial<FileIconProps>\n\n return (\n <Box\n aria-hidden\n data-testid=\"file-upload-icon\"\n data-ext={extension || undefined}\n data-style-key={styleKey || undefined}\n sx={tile ? fileUploadTileIconWellSx : fileUploadIconWellSx}\n >\n <Box sx={tile ? fileUploadTileLibIconSx : fileUploadLibIconSx}>\n <FileIcon\n fold\n radius={3}\n extension={extension}\n {...iconStyle}\n />\n </Box>\n </Box>\n )\n}\n\n/**\n * Image/* → soft object-URL thumbnail; onError falls back to react-file-icon.\n * Non-images use react-file-icon + defaultStyles (extension / mime).\n * Object URLs revoked on file change / unmount.\n */\nfunction FileUploadThumb({\n file,\n tile = false,\n}: {\n file: File\n tile?: boolean\n}) {\n const [url, setUrl] = useState<string | null>(null)\n const [previewFailed, setPreviewFailed] = useState(false)\n\n useEffect(() => {\n setPreviewFailed(false)\n if (!isImageFile(file)) {\n setUrl(null)\n return\n }\n const objectUrl = URL.createObjectURL(file)\n setUrl(objectUrl)\n return () => {\n URL.revokeObjectURL(objectUrl)\n }\n }, [file])\n\n if (url && !previewFailed) {\n return (\n <Box\n component=\"img\"\n src={url}\n alt=\"\"\n data-testid=\"file-upload-thumb\"\n sx={tile ? fileUploadTileMediaSx : fileUploadThumbSx}\n onError={() => setPreviewFailed(true)}\n />\n )\n }\n\n return <FileUploadTypeIcon file={file} tile={tile} />\n}\n\ntype ListItemProps = {\n item: FileUploadItem\n disabled: boolean\n disableRemove?: boolean\n onRemove: (item: FileUploadItem) => void\n testId: string\n itemVariant: 'row' | 'tile'\n}\n\nfunction FileUploadListItem({\n item,\n disabled,\n disableRemove = false,\n onRemove,\n testId,\n itemVariant,\n}: ListItemProps) {\n if (itemVariant === 'tile') {\n return (\n <FileUploadTileItem\n item={item}\n disabled={disabled}\n disableRemove={disableRemove}\n onRemove={onRemove}\n testId={testId}\n />\n )\n }\n\n const status = item.status ?? (item.error ? 'error' : 'idle')\n const showProgress =\n status === 'uploading' ||\n (typeof item.progress === 'number' &&\n item.progress > 0 &&\n item.progress < 100 &&\n status !== 'error' &&\n status !== 'success')\n\n return (\n <Box\n component=\"li\"\n data-testid={testId}\n data-status={status}\n data-item-variant=\"row\"\n sx={fileUploadItemSx}\n >\n <FileUploadThumb file={item.file} />\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography\n variant=\"body2\"\n noWrap\n title={item.file.name}\n sx={{ m: 0, fontWeight: 500, color: 'var(--fu-text)' }}\n >\n {item.file.name}\n </Typography>\n <Typography\n variant=\"caption\"\n sx={{ m: 0, color: 'var(--fu-text-secondary)' }}\n >\n {formatFileSize(item.file.size)}\n {item.error ? ` · ${item.error}` : null}\n {status === 'success' && !item.error ? ' · Done' : null}\n </Typography>\n {showProgress ? (\n <LinearProgress\n variant=\"determinate\"\n value={Math.max(0, Math.min(100, item.progress ?? 0))}\n aria-label={`Upload progress ${item.progress ?? 0}%`}\n sx={{ mt: 0.75, height: 4, borderRadius: 2 }}\n />\n ) : null}\n {status === 'uploading' && item.progress == null ? (\n <LinearProgress\n aria-label=\"Uploading\"\n sx={{ mt: 0.75, height: 4, borderRadius: 2 }}\n />\n ) : null}\n </Box>\n {disableRemove ? null : (\n <IconButton\n size=\"small\"\n aria-label={`Remove ${item.file.name}`}\n disabled={disabled}\n onClick={() => onRemove(item)}\n sx={{\n flexShrink: 0,\n color: 'var(--fu-text-secondary)',\n p: 0.35,\n }}\n >\n <CloseIcon sx={{ fontSize: '1rem' }} />\n </IconButton>\n )}\n </Box>\n )\n}\n\n/** Square preview tile — hover shows circular white X at top-right. */\nfunction FileUploadTileItem({\n item,\n disabled,\n disableRemove = false,\n onRemove,\n testId,\n}: Omit<ListItemProps, 'itemVariant'>) {\n const status = item.status ?? (item.error ? 'error' : 'idle')\n const showProgress =\n status === 'uploading' ||\n (typeof item.progress === 'number' &&\n item.progress > 0 &&\n item.progress < 100 &&\n status !== 'error' &&\n status !== 'success')\n const indeterminate = status === 'uploading' && item.progress == null\n\n return (\n <Box\n component=\"li\"\n data-testid={testId}\n data-status={status}\n data-item-variant=\"tile\"\n title={item.file.name}\n sx={fileUploadTileSx}\n >\n <FileUploadThumb file={item.file} tile />\n {showProgress ? (\n <LinearProgress\n variant=\"determinate\"\n value={Math.max(0, Math.min(100, item.progress ?? 0))}\n aria-label={`Upload progress ${item.progress ?? 0}%`}\n sx={fileUploadTileProgressSx}\n />\n ) : null}\n {indeterminate ? (\n <LinearProgress\n aria-label=\"Uploading\"\n sx={fileUploadTileProgressSx}\n />\n ) : null}\n {disableRemove ? null : (\n <IconButton\n className=\"fu-tile-remove\"\n size=\"small\"\n aria-label={`Remove ${item.file.name}`}\n disabled={disabled}\n onClick={(e) => {\n e.stopPropagation()\n onRemove(item)\n }}\n sx={fileUploadTileRemoveSx}\n >\n <CloseIcon sx={{ fontSize: '0.85rem' }} />\n </IconButton>\n )}\n </Box>\n )\n}\n\nexport default FileUpload\n","import FormLabel, { type FormLabelProps } from '@mui/material/FormLabel'\n\n/**\n * A wrapper for Mui FormLabel\n */\nexport default function MuiFormLabel(props: FormLabelProps) {\n return <FormLabel {...props} />\n}\n","export * from './FormLabel'\n\nexport * from './FormControlLabel'\n\nexport {default as FormControl} from '@mui/material/FormControl'\nexport {default as FormHelperText} from '@mui/material/FormHelperText'\nexport {default as InputAdornment} from '@mui/material/InputAdornment'\nexport {default as InputLabel} from '@mui/material/InputLabel'\nexport * from './themes'","import React from 'react';\nimport MuiLinearProgress, { LinearProgressProps as MuiLinearProgressProps } from '@mui/material/LinearProgress';\n\nexport type LinearProgressProps = MuiLinearProgressProps;\n\nexport const LinearProgress: React.FC<LinearProgressProps> = (props) => {\n return <MuiLinearProgress {...props} />;\n};\n","import type { SxProps, Theme } from '@mui/material/styles'\n\n/**\n * Soft / quiet FileUpload chrome — Google-style dark:\n * darker canvas, lighter elevated surfaces, 1px borders (not thick outlines).\n * Mirrors EmptyState dashed soft fill + Autocomplete glass vars language.\n */\nexport const fileUploadRootSx: SxProps<Theme> = {\n '--fu-border': 'var(--mui-palette-border-1)',\n '--fu-border-hover': 'var(--mui-palette-border-hover-1, var(--mui-palette-text-secondary))',\n '--fu-border-active': 'color-mix(in srgb, var(--mui-palette-text-secondary) 65%, transparent)',\n '--fu-border-error': 'var(--mui-palette-error-main)',\n '--fu-surface':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 78%, transparent)',\n '--fu-surface-hover':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 92%, transparent)',\n '--fu-surface-active':\n 'color-mix(in srgb, var(--mui-palette-primary-main) 8%, var(--mui-palette-background-paper))',\n '--fu-item-bg':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 88%, transparent)',\n '--fu-icon': 'var(--mui-palette-text-secondary)',\n '--fu-text': 'var(--mui-palette-text-primary)',\n '--fu-text-secondary': 'var(--mui-palette-text-secondary)',\n '--fu-shadow':\n 'inset 0 1px 0 color-mix(in srgb, var(--mui-palette-common-white) 6%, transparent)',\n '--fu-radius': '16px',\n '--fu-item-radius': '12px',\n\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n width: '100%',\n boxSizing: 'border-box',\n\n '[color-scheme=\"dark\"] &': {\n '--fu-surface':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 70%, transparent)',\n '--fu-surface-hover':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 88%, transparent)',\n '--fu-item-bg':\n 'color-mix(in srgb, var(--mui-palette-background-paper) 82%, transparent)',\n '--fu-shadow':\n 'inset 0 1px 0 color-mix(in srgb, var(--mui-palette-common-white) 8%, transparent), 0 1px 2px rgba(0,0,0,0.18)',\n },\n}\n\nexport const fileUploadDropzoneSx: SxProps<Theme> = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n gap: 0.75,\n px: 3,\n py: 3.5,\n minHeight: 140,\n borderRadius: 'var(--fu-radius)',\n border: '1px dashed var(--fu-drop-border, var(--fu-border))',\n backgroundColor: 'var(--fu-drop-bg, var(--fu-surface))',\n boxShadow: 'var(--fu-shadow)',\n color: 'var(--fu-text-secondary)',\n cursor: 'pointer',\n outline: 'none',\n boxSizing: 'border-box',\n transition: 'border-color 160ms ease, background-color 160ms ease, box-shadow 160ms ease',\n '&:hover': {\n borderColor: 'var(--fu-border-hover)',\n backgroundColor: 'var(--fu-surface-hover)',\n },\n '&:focus-visible': {\n borderColor: 'var(--fu-border-active)',\n borderStyle: 'solid',\n },\n '&[data-active=\"true\"]': {\n borderColor: 'var(--fu-border-active)',\n borderStyle: 'solid',\n backgroundColor: 'var(--fu-surface-active)',\n },\n '&[data-error=\"true\"]': {\n '--fu-drop-border': 'var(--fu-border-error)',\n },\n '&[data-disabled=\"true\"]': {\n opacity: 0.58,\n cursor: 'default',\n pointerEvents: 'none',\n },\n}\n\nexport const fileUploadItemSx: SxProps<Theme> = {\n display: 'flex',\n alignItems: 'center',\n gap: 1.25,\n px: 1.25,\n py: 1,\n borderRadius: 'var(--fu-item-radius)',\n border: '1px solid var(--fu-border)',\n backgroundColor: 'var(--fu-item-bg)',\n boxShadow: 'var(--fu-shadow)',\n boxSizing: 'border-box',\n minWidth: 0,\n '&[data-status=\"error\"]': {\n borderColor: 'color-mix(in srgb, var(--mui-palette-error-main) 55%, var(--fu-border))',\n backgroundColor:\n 'color-mix(in srgb, var(--mui-palette-error-main) 8%, var(--fu-item-bg))',\n },\n}\n\n\nexport const fileUploadThumbSx: SxProps<Theme> = {\n width: 36,\n height: 36,\n minWidth: 36,\n borderRadius: '8px',\n objectFit: 'cover',\n flexShrink: 0,\n border: '1px solid var(--fu-border)',\n backgroundColor: 'var(--fu-item-bg)',\n display: 'block',\n boxSizing: 'border-box',\n}\n\nexport const fileUploadIconWellSx: SxProps<Theme> = {\n width: 36,\n height: 36,\n minWidth: 36,\n borderRadius: '8px',\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: '1px solid var(--fu-border)',\n backgroundColor:\n 'color-mix(in srgb, var(--mui-palette-background-paper) 55%, transparent)',\n boxSizing: 'border-box',\n overflow: 'hidden',\n}\n\n/** Scale react-file-icon SVG into the soft well — do not gray/desaturate. */\nexport const fileUploadLibIconSx: SxProps<Theme> = {\n width: 24,\n height: 30,\n lineHeight: 0,\n flexShrink: 0,\n // Keep library colors vivid (no opacity / filter / color overrides).\n color: 'unset',\n filter: 'none',\n opacity: 1,\n '& svg': {\n width: '100%',\n height: '100%',\n display: 'block',\n // Prevent inherited MUI text color from washing glyph/label fills.\n color: 'unset',\n },\n}\n\n/** Compact soft upload button — quiet 1px border, elevated dark surface. */\nexport const fileUploadButtonSx: SxProps<Theme> = {\n alignSelf: 'flex-start',\n textTransform: 'none',\n fontWeight: 600,\n fontSize: '0.8125rem',\n lineHeight: 1.25,\n borderRadius: '10px',\n px: 1.5,\n py: 0.75,\n minHeight: 36,\n border: '1px solid var(--fu-border)',\n backgroundColor: 'var(--fu-surface)',\n color: 'var(--fu-text)',\n boxShadow: 'var(--fu-shadow)',\n transition: 'border-color 160ms ease, background-color 160ms ease, box-shadow 160ms ease',\n '&:hover': {\n borderColor: 'var(--fu-border-hover)',\n backgroundColor: 'var(--fu-surface-hover)',\n },\n '&:focus-visible': {\n borderColor: 'var(--fu-border-active)',\n outline: 'none',\n },\n '&[data-active=\"true\"]': {\n borderColor: 'var(--fu-border-active)',\n backgroundColor: 'var(--fu-surface-active)',\n },\n '&[data-error=\"true\"]': {\n borderColor: 'var(--fu-border-error)',\n color: 'var(--fu-border-error)',\n },\n '&.Mui-disabled': {\n opacity: 0.58,\n borderColor: 'var(--fu-border)',\n color: 'var(--fu-text-secondary)',\n },\n '& .MuiButton-startIcon': {\n marginRight: '8px',\n marginLeft: 0,\n color: 'var(--fu-icon)',\n },\n}\n\n/** Flex wrap grid for tile items. */\nexport const fileUploadTileListSx: SxProps<Theme> = {\n display: 'flex',\n flexWrap: 'wrap',\n gap: 1.25,\n m: 0,\n p: 0,\n listStyle: 'none',\n}\n\n/** Soft square preview tile (~80px). */\nexport const fileUploadTileSx: SxProps<Theme> = {\n '--fu-tile-size': '80px',\n position: 'relative',\n width: 'var(--fu-tile-size)',\n height: 'var(--fu-tile-size)',\n minWidth: 'var(--fu-tile-size)',\n borderRadius: '12px',\n border: '1px solid var(--fu-border)',\n backgroundColor: 'var(--fu-item-bg)',\n boxShadow: 'var(--fu-shadow)',\n boxSizing: 'border-box',\n overflow: 'hidden',\n flexShrink: 0,\n '&[data-status=\"error\"]': {\n borderColor: 'color-mix(in srgb, var(--mui-palette-error-main) 55%, var(--fu-border))',\n },\n '&:hover .fu-tile-remove, &:focus-within .fu-tile-remove': {\n opacity: 1,\n pointerEvents: 'auto',\n },\n}\n\n/** Fill tile with image cover. */\nexport const fileUploadTileMediaSx: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n display: 'block',\n borderRadius: 'inherit',\n}\n\n/** Centered type-icon well inside a tile (non-images). */\nexport const fileUploadTileIconWellSx: SxProps<Theme> = {\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor:\n 'color-mix(in srgb, var(--mui-palette-background-paper) 55%, transparent)',\n border: 'none',\n borderRadius: 0,\n boxSizing: 'border-box',\n overflow: 'hidden',\n}\n\nexport const fileUploadTileLibIconSx: SxProps<Theme> = {\n width: 36,\n height: 44,\n lineHeight: 0,\n flexShrink: 0,\n color: 'unset',\n filter: 'none',\n opacity: 1,\n '& svg': {\n width: '100%',\n height: '100%',\n display: 'block',\n color: 'unset',\n },\n}\n\n/** Circular white X — top-right overlap; visible on hover/focus. */\nexport const fileUploadTileRemoveSx: SxProps<Theme> = {\n position: 'absolute',\n top: 4,\n right: 4,\n zIndex: 2,\n width: 22,\n height: 22,\n p: 0,\n opacity: 0,\n pointerEvents: 'none',\n backgroundColor: '#fff',\n color: 'rgba(15, 23, 42, 0.72)',\n boxShadow: '0 1px 3px rgba(0,0,0,0.22)',\n border: '1px solid color-mix(in srgb, var(--mui-palette-common-black) 8%, transparent)',\n transition: 'opacity 140ms ease, background-color 140ms ease',\n '&:hover': {\n backgroundColor: '#fff',\n color: 'rgba(15, 23, 42, 0.92)',\n },\n '&.Mui-disabled': {\n opacity: 0,\n },\n}\n\n/** Thin progress strip along tile bottom. */\nexport const fileUploadTileProgressSx: SxProps<Theme> = {\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1,\n height: 3,\n borderRadius: 0,\n backgroundColor: 'color-mix(in srgb, var(--mui-palette-common-black) 25%, transparent)',\n '& .MuiLinearProgress-bar': {\n borderRadius: 0,\n },\n}\n","import type { FileRejectCode, FileRejection, FileUploadItem } from './types'\n\nlet idSeq = 0\n\n/** Stable id for a new upload item (browser crypto when available). */\nexport function createFileUploadId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n idSeq += 1\n return `fu-${Date.now()}-${idSeq}`\n}\n\nexport function createFileUploadItem(file: File): FileUploadItem {\n return {\n id: createFileUploadId(),\n file,\n status: 'idle',\n progress: 0,\n }\n}\n\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return '—'\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n if (bytes < 1024 * 1024 * 1024) {\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n }\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`\n}\n\ntype AcceptRule = { type: 'ext'; value: string } | { type: 'mime'; value: string }\n\nfunction parseAccept(accept?: string): AcceptRule[] {\n if (!accept || !accept.trim()) return []\n return accept\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean)\n .map((token) => {\n if (token.startsWith('.')) {\n return { type: 'ext' as const, value: token.toLowerCase() }\n }\n return { type: 'mime' as const, value: token.toLowerCase() }\n })\n}\n\nfunction matchesAccept(file: File, rules: AcceptRule[]): boolean {\n if (rules.length === 0) return true\n const name = file.name.toLowerCase()\n const mime = (file.type || '').toLowerCase()\n return rules.some((rule) => {\n if (rule.type === 'ext') {\n return name.endsWith(rule.value)\n }\n if (rule.value.endsWith('/*')) {\n const prefix = rule.value.slice(0, -1)\n return mime.startsWith(prefix)\n }\n return mime === rule.value\n })\n}\n\nexport type ValidateFilesOptions = {\n accept?: string\n maxSize?: number\n maxFiles?: number\n currentCount: number\n multiple: boolean\n}\n\n/**\n * Validate incoming FileList / File[] against accept, maxSize, maxFiles, multiple.\n * Accepted files are those that pass; capacity is applied in order.\n */\nexport function validateFiles(\n incoming: File[],\n opts: ValidateFilesOptions,\n): { accepted: File[]; rejections: FileRejection[] } {\n const rules = parseAccept(opts.accept)\n const accepted: File[] = []\n const rejections: FileRejection[] = []\n\n const hardCap = opts.multiple\n ? opts.maxFiles != null && opts.maxFiles > 0\n ? opts.maxFiles\n : Infinity\n : 1\n\n for (const file of incoming) {\n const errors: FileRejectCode[] = []\n\n if (!matchesAccept(file, rules)) {\n errors.push('file-invalid-type')\n }\n if (opts.maxSize != null && opts.maxSize > 0 && file.size > opts.maxSize) {\n errors.push('file-too-large')\n }\n if (opts.currentCount + accepted.length >= hardCap) {\n errors.push('too-many-files')\n }\n\n if (errors.length > 0) {\n rejections.push({ file, errors })\n } else {\n accepted.push(file)\n }\n }\n\n return { accepted, rejections }\n}\n\n\n/** Common mime → extension when File.name has no suffix. */\nconst MIME_TO_EXT: Record<string, string> = {\n 'application/pdf': 'pdf',\n 'application/zip': 'zip',\n 'application/x-zip-compressed': 'zip',\n 'application/gzip': 'gz',\n 'application/x-gzip': 'gz',\n 'application/x-rar-compressed': 'rar',\n 'application/vnd.rar': 'rar',\n 'application/x-7z-compressed': '7z',\n 'application/x-tar': 'tar',\n 'application/json': 'json',\n 'application/msword': 'doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'application/vnd.ms-powerpoint': 'ppt',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx',\n 'text/plain': 'txt',\n 'text/csv': 'csv',\n 'text/markdown': 'md',\n 'image/jpeg': 'jpg',\n 'image/png': 'png',\n 'image/gif': 'gif',\n 'image/webp': 'webp',\n 'image/svg+xml': 'svg',\n 'audio/mpeg': 'mp3',\n 'audio/wav': 'wav',\n 'video/mp4': 'mp4',\n 'video/webm': 'webm',\n}\n\n/**\n * Extension for react-file-icon / defaultStyles lookup.\n * Prefers File.name; falls back to a small mime map (not an icon map).\n */\nexport function getFileExtension(file: File): string {\n const name = file.name || ''\n const dot = name.lastIndexOf('.')\n if (dot > 0 && dot < name.length - 1) {\n return name.slice(dot + 1).toLowerCase()\n }\n const mime = (file.type || '').toLowerCase()\n return MIME_TO_EXT[mime] ?? ''\n}\n\nexport function isImageFile(file: File): boolean {\n return typeof file.type === 'string' && file.type.startsWith('image/')\n}\n\nexport type FileIconStyleBag = Record<string, unknown> & {\n type?: string\n labelColor?: string\n labelTextColor?: string\n labelUppercase?: boolean\n foldColor?: string\n color?: string\n glyphColor?: string\n gradientOpacity?: number\n}\n\n/** Alias odd archive suffixes onto react-file-icon defaultStyles keys. */\nconst EXT_ALIASES: Record<string, string> = {\n '7z': '7zip',\n tgz: 'gz',\n tbz: 'gz',\n tbz2: 'gz',\n}\n\n/**\n * defaultStyles.zip/rar/gz only set `type: \"compressed\"` — no labelColor.\n * Amber badge so archives read like pdf's red chip.\n */\nexport const ARCHIVE_FILE_ICON_STYLE = {\n type: 'compressed' as const,\n labelColor: '#E2A903',\n labelTextColor: '#1A1A1A',\n labelUppercase: true,\n foldColor: '#C48E02',\n color: '#F6E7A8',\n glyphColor: 'rgba(40, 30, 0, 0.35)',\n}\n\nconst ARCHIVE_EXTS = new Set([\n 'zip',\n 'zipx',\n 'rar',\n '7z',\n '7zip',\n 'gz',\n 'tar',\n 'tgz',\n 'sitx',\n 'bz2',\n])\n\n/**\n * Many defaultStyles entries are type-only (no labelColor/color) and render as\n * mono whitesmoke. Colorize by glyph `type` so every icon stays vivid.\n * Keys match react-file-icon `type` enum.\n */\nexport const TYPE_COLOR_FALLBACKS: Record<string, FileIconStyleBag> = {\n '3d': {\n type: '3d',\n labelColor: '#5FB9AD',\n foldColor: '#4A9E94',\n color: '#E5F6F4',\n },\n acrobat: {\n type: 'acrobat',\n labelColor: '#D93831',\n foldColor: '#B82E28',\n color: '#FCE8E7',\n },\n android: {\n type: 'android',\n labelColor: '#3DDC84',\n foldColor: '#2BB86A',\n color: '#E6FBF0',\n },\n audio: {\n type: 'audio',\n labelColor: '#9B59B6',\n foldColor: '#7E3F9A',\n color: '#F3E9F8',\n },\n binary: {\n type: 'binary',\n labelColor: '#E67E22',\n foldColor: '#C86A1A',\n color: '#FDF0E4',\n },\n code: {\n type: 'code',\n labelColor: '#3498DB',\n foldColor: '#2A7AB0',\n color: '#E7F3FB',\n },\n compressed: { ...ARCHIVE_FILE_ICON_STYLE },\n document: {\n type: 'document',\n labelColor: '#5B8DEF',\n labelUppercase: true,\n foldColor: '#4A75C9',\n color: '#E8EEF9',\n glyphColor: 'rgba(40, 60, 120, 0.35)',\n },\n drive: {\n type: 'drive',\n labelColor: '#27AE60',\n foldColor: '#1E8A4B',\n color: '#E5F7ED',\n },\n font: {\n type: 'font',\n labelColor: '#8E44AD',\n foldColor: '#71368A',\n color: '#F2E8F7',\n },\n image: {\n type: 'image',\n labelColor: '#1ABC9C',\n foldColor: '#14967C',\n color: '#E4F8F3',\n },\n presentation: {\n type: 'presentation',\n labelColor: '#D35400',\n labelUppercase: true,\n foldColor: '#A84300',\n color: '#FCEADE',\n glyphColor: 'rgba(120, 50, 0, 0.35)',\n },\n settings: {\n type: 'settings',\n labelColor: '#16A085',\n foldColor: '#117A65',\n color: '#E4F6F2',\n },\n spreadsheet: {\n type: 'spreadsheet',\n labelColor: '#2D7D46',\n labelUppercase: true,\n foldColor: '#246338',\n color: '#E5F2EA',\n glyphColor: 'rgba(20, 60, 30, 0.35)',\n },\n vector: {\n type: 'vector',\n labelColor: '#FF7F18',\n foldColor: '#D96A12',\n color: '#FFF0E4',\n },\n video: {\n type: 'video',\n labelColor: '#E74C3C',\n foldColor: '#C0392B',\n color: '#FCE9E7',\n },\n}\n\n/** Unknown / empty ext — never mono whitesmoke. */\nexport const UNKNOWN_FILE_ICON_STYLE: FileIconStyleBag = {\n type: 'document',\n labelColor: '#5B8DEF',\n labelTextColor: '#FFFFFF',\n labelUppercase: true,\n foldColor: '#4A75C9',\n color: '#E8EEF9',\n glyphColor: 'rgba(40, 60, 120, 0.35)',\n}\n\nexport type FileIconStyleProps = {\n /** Label text on the icon (original ext when possible). */\n extension?: string\n /** Key used for defaultStyles lookup (after aliases). */\n styleKey: string\n /** Props to spread onto <FileIcon /> (full defaultStyles + enrichments). */\n style: FileIconStyleBag\n}\n\nconst MONO_PAGE_COLORS = new Set([\n '',\n 'whitesmoke',\n '#fff',\n '#ffffff',\n 'white',\n '#f5f5f5',\n '#fafafa',\n])\n\nfunction hasVividColor(style: FileIconStyleBag): boolean {\n if (typeof style.labelColor === 'string' && style.labelColor.trim()) {\n return true\n }\n if (typeof style.color === 'string') {\n const c = style.color.trim().toLowerCase()\n if (c && !MONO_PAGE_COLORS.has(c)) return true\n }\n return false\n}\n\nfunction mergeColorEnrichment(\n lib: FileIconStyleBag,\n enrichment: FileIconStyleBag,\n): FileIconStyleBag {\n // Spread library defaults fully, then fill only missing color fields —\n // never clobber a rich defaultStyles entry (e.g. pdf/doc/ai).\n return {\n ...enrichment,\n ...lib,\n labelColor: lib.labelColor ?? enrichment.labelColor,\n labelTextColor: lib.labelTextColor ?? enrichment.labelTextColor,\n foldColor: lib.foldColor ?? enrichment.foldColor,\n color: lib.color ?? enrichment.color,\n glyphColor: lib.glyphColor ?? enrichment.glyphColor,\n labelUppercase: lib.labelUppercase ?? enrichment.labelUppercase,\n type: lib.type ?? enrichment.type,\n }\n}\n\n/**\n * Resolve extension + style for react-file-icon.\n * Always spreads `defaultStyles[key]` fully; enriches type-only / unknown\n * entries so icons are never forced grayscale.\n */\nexport function resolveFileIconStyle(\n file: File,\n defaultStyles: Record<string, FileIconStyleBag | undefined>,\n): FileIconStyleProps {\n const rawExt = getFileExtension(file)\n const styleKey = (EXT_ALIASES[rawExt] ?? rawExt).toLowerCase()\n const displayExt = rawExt || styleKey || undefined\n\n // Full library defaults (labelColor, glyphColor, foldColor, type, …).\n const lib: FileIconStyleBag = {\n ...((styleKey ? defaultStyles[styleKey] : undefined) ?? {}),\n }\n\n const isArchive =\n ARCHIVE_EXTS.has(rawExt) ||\n ARCHIVE_EXTS.has(styleKey) ||\n lib.type === 'compressed'\n\n let style: FileIconStyleBag\n if (isArchive) {\n style = { ...lib, ...ARCHIVE_FILE_ICON_STYLE }\n } else if (hasVividColor(lib)) {\n style = { ...lib }\n } else if (lib.type && TYPE_COLOR_FALLBACKS[lib.type]) {\n style = mergeColorEnrichment(lib, TYPE_COLOR_FALLBACKS[lib.type])\n } else {\n style = mergeColorEnrichment(lib, UNKNOWN_FILE_ICON_STYLE)\n }\n\n return {\n extension: displayExt,\n styleKey,\n style,\n }\n}\n","import React from 'react';\nimport {\n centerCrop,\n convertToPixelCrop,\n makeAspectCrop,\n type Crop,\n type PixelCrop,\n} from 'react-image-crop';\n\ninterface UseCropperStateParams {\n blobUrl: string;\n onSave: (url: string) => void | Promise<void>;\n setImgNull: () => void;\n circularCrop: boolean;\n defaultRatio?: number;\n cropConfig?: Partial<Crop>;\n}\n\nfunction toRad(degrees: number) {\n return (degrees * Math.PI) / 180;\n}\n\nfunction defaultCrop(): Crop {\n return {\n unit: '%',\n x: 10,\n y: 10,\n width: 80,\n height: 80,\n };\n}\n\nfunction makeCenteredAspectCrop(mediaWidth: number, mediaHeight: number, aspect: number): Crop {\n return centerCrop(\n makeAspectCrop(\n {\n unit: '%',\n width: 90,\n },\n aspect,\n mediaWidth,\n mediaHeight,\n ),\n mediaWidth,\n mediaHeight,\n );\n}\n\nfunction initialCrop(\n mediaWidth: number,\n mediaHeight: number,\n defaultRatio: number | undefined,\n cropConfig: Partial<Crop> | undefined,\n): Crop {\n if (defaultRatio) {\n return makeCenteredAspectCrop(mediaWidth, mediaHeight, defaultRatio);\n }\n return { ...defaultCrop(), ...cropConfig };\n}\n\nfunction drawPreviewToCanvas(\n image: HTMLImageElement,\n canvas: HTMLCanvasElement,\n crop: PixelCrop,\n scale: number,\n rotate: number,\n circularCrop?: boolean,\n) {\n const context = canvas.getContext('2d');\n if (!context) return;\n if (!crop.width || !crop.height) return;\n\n const scaleX = image.naturalWidth / image.width;\n const scaleY = image.naturalHeight / image.height;\n const pixelRatio = window.devicePixelRatio || 1;\n\n canvas.width = Math.floor(crop.width * scaleX * pixelRatio);\n canvas.height = Math.floor(crop.height * scaleY * pixelRatio);\n\n context.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n context.imageSmoothingQuality = 'high';\n context.clearRect(0, 0, canvas.width, canvas.height);\n\n const cropX = crop.x * scaleX;\n const cropY = crop.y * scaleY;\n const rotateRads = toRad(rotate);\n const centerX = image.naturalWidth / 2;\n const centerY = image.naturalHeight / 2;\n\n context.save();\n if (circularCrop) {\n const width = crop.width * scaleX;\n const height = crop.height * scaleY;\n const radius = Math.min(width, height) / 2;\n context.beginPath();\n context.arc(width / 2, height / 2, radius, 0, Math.PI * 2);\n context.closePath();\n context.clip();\n }\n\n context.translate(-cropX, -cropY);\n context.translate(centerX, centerY);\n context.rotate(rotateRads);\n context.scale(scale, scale);\n context.translate(-centerX, -centerY);\n\n context.drawImage(\n image,\n 0,\n 0,\n image.naturalWidth,\n image.naturalHeight,\n 0,\n 0,\n image.naturalWidth,\n image.naturalHeight,\n );\n context.restore();\n}\n\nexport function useCropperState({\n blobUrl,\n onSave,\n setImgNull,\n circularCrop,\n defaultRatio,\n cropConfig,\n}: UseCropperStateParams) {\n const imageRef = React.useRef<HTMLImageElement | null>(null);\n const canvasRef = React.useRef<HTMLCanvasElement | null>(null);\n const cropConfigRef = React.useRef(cropConfig);\n cropConfigRef.current = cropConfig;\n const scaleRef = React.useRef(1);\n const rotateRef = React.useRef(0);\n\n const [activeBlobUrl, setActiveBlobUrl] = React.useState(blobUrl);\n const [crop, setCrop] = React.useState<Crop>({ ...defaultCrop(), ...cropConfig });\n const [completedCrop, setCompletedCrop] = React.useState<PixelCrop>();\n const [scale, setScale] = React.useState(1);\n const [rotate, setRotate] = React.useState(0);\n scaleRef.current = scale;\n rotateRef.current = rotate;\n\n const applyCropFromImage = React.useCallback((image: HTMLImageElement) => {\n const { width, height } = image;\n if (!width || !height) return;\n\n const nextCrop = initialCrop(width, height, defaultRatio, cropConfigRef.current);\n const pixelCrop = convertToPixelCrop(nextCrop, width, height);\n if (!pixelCrop.width || !pixelCrop.height) return;\n\n setCrop(nextCrop);\n setCompletedCrop(pixelCrop);\n\n const canvas = canvasRef.current;\n if (canvas) {\n drawPreviewToCanvas(\n image,\n canvas,\n pixelCrop,\n scaleRef.current,\n rotateRef.current,\n circularCrop,\n );\n }\n }, [circularCrop, defaultRatio]);\n\n React.useEffect(() => {\n setActiveBlobUrl(blobUrl);\n }, [blobUrl]);\n\n React.useLayoutEffect(() => {\n if (!activeBlobUrl) {\n setCrop({ ...defaultCrop(), ...cropConfigRef.current });\n setCompletedCrop(undefined);\n setScale(1);\n setRotate(0);\n return;\n }\n\n setScale(1);\n setRotate(0);\n\n const tryApply = () => {\n const image = imageRef.current;\n if (image?.complete && image.width > 0 && image.height > 0) {\n applyCropFromImage(image);\n return true;\n }\n return false;\n };\n\n if (tryApply()) return;\n\n const frame = requestAnimationFrame(() => {\n tryApply();\n });\n return () => cancelAnimationFrame(frame);\n }, [activeBlobUrl, applyCropFromImage]);\n\n React.useEffect(() => {\n if (!completedCrop || !imageRef.current || !canvasRef.current) return;\n drawPreviewToCanvas(\n imageRef.current,\n canvasRef.current,\n completedCrop,\n scale,\n rotate,\n circularCrop,\n );\n }, [completedCrop, scale, rotate, circularCrop]);\n\n const onImageLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\n applyCropFromImage(e.currentTarget);\n };\n\n const handleCompletedCrop = (nextCrop: PixelCrop) => {\n if (!nextCrop.width || !nextCrop.height) return;\n setCompletedCrop(nextCrop);\n };\n\n const handleSave = async () => {\n if (!completedCrop || !imageRef.current) return;\n\n const previewCanvas = document.createElement('canvas');\n drawPreviewToCanvas(\n imageRef.current,\n previewCanvas,\n completedCrop,\n scale,\n rotate,\n circularCrop,\n );\n\n const blob = await new Promise<Blob | null>((resolve) => {\n previewCanvas.toBlob((nextBlob) => resolve(nextBlob), 'image/png');\n });\n\n if (!blob) return;\n const resultUrl = URL.createObjectURL(blob);\n await onSave(resultUrl);\n };\n\n const handleClear = () => {\n setActiveBlobUrl('');\n setImgNull();\n imageRef.current = null;\n const canvas = canvasRef.current;\n if (canvas) {\n const context = canvas.getContext('2d');\n if (context) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n }\n setCrop({ ...defaultCrop(), ...cropConfigRef.current });\n setScale(1);\n setRotate(0);\n setCompletedCrop(undefined);\n };\n\n const handleResetTransforms = () => {\n setScale(1);\n setRotate(0);\n };\n\n return {\n imageRef,\n canvasRef,\n activeBlobUrl,\n crop,\n setCrop,\n completedCrop,\n setCompletedCrop: handleCompletedCrop,\n scale,\n setScale,\n rotate,\n setRotate,\n onImageLoad,\n handleSave,\n handleClear,\n handleResetTransforms,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,uBAAsB;AACtB,2BAA0B;AAsBc;AAfxC,IAAM,eAAe,CAAC,EAAC,WAAU,OAAK,GAAE,YAAU,KAAI,QAAM,QAAO,SAAO,OAAM,MAU1E;AACE,SACQ,4CAAC,iBAAAA,SAAA,EAAU,IAAI,EAAE,OAAO,OAAO,GAAG,MAAY,WACrC,oBAAU,IAAI,CAAC,SACR,4CAAC,qBAAAC,SAAA,EACO;AAAA,IAAC;AAAA;AAAA,MACO,KAAK,GAAG,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,YAAY,CAAC;AAAA,MACtD,KAAK,KAAK,SAAO;AAAA,MACjB,SAAQ;AAAA,MACR,OAAO;AAAA,MAAW,QAAQ;AAAA,MAC1B,OAAO,EAAC,WAAW,QAAO;AAAA;AAAA,EAClC,KAPY,KAAK,EAQzB,CACP,GACT;AAEhB;AAEA,IAAO,uBAAQ;;;ACpCf,uBAAO;;;ACWP,SAAS,UAAU,MAA0B;AAC3C,MAAI,QAAQ,QAAQ,OAAO,SAAS,WAAW;AAC7C,WAAO,CAAC;AAAA,EACV;AACA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AACA,MAAI,OAAO,SAAS,cAAc,OAAO,SAAS,UAAU;AAC1D,WAAO,CAAC,IAAI;AAAA,EACd;AACA,SAAO,CAAC;AACV;AASO,SAAS,WAAW,OAAkD;AAC3E,QAAM,OAAO,MAAM,QAAQ,SAAS;AACpC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,KAAK,CAAC;AAAA,EACf;AACA,SAAO;AACT;;;ACvCA,iBAA6B;AAC7B,mBAA+B;AAC/B,kBAA8B;;;ACMvB,IAAM,gBAAgC;AAAA,EAC3C,yBAAyB;AAAA,EACzB,kBAAkB;AAAA;AAAA,EAElB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,8BAA8B;AAAA,EAC9B,uFAAuF;AAAA,IACrF,+BAA+B;AAAA,IAC/B,8BAA8B;AAAA,IAC9B,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnB;AAAA,EACA,CAAC;AAAA;AAAA;AAAA,wCAGqC,GAAG;AAAA,IACrC,YAAW;AAAA,EACb;AACJ;;;ACCQ,IAAAC,sBAAA;AArBO,SAAR,cAA+B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,SACE,6CAAC,sBAAI,IAAI,QAAQ,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,QAAQ,OAAO,GAAG,aAAa,GAClG;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA;AAAA,QAEF,SAAS,EAAE,IAAI,mBAAmB,IAAI,OAAO;AAAA,QAC7C,eAAe,EAAE,IAAI,UAAU,IAAI,OAAU;AAAA,QAC7C,qBAAqB,EAAE,IAAI,OAAO,IAAI,YAAY;AAAA,QAClD,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI;AAAA,cACF,SAAS;AAAA,cACT,eAAe;AAAA,cACf,gBAAgB;AAAA,cAChB,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,OAAO;AAAA,YACT;AAAA,YAEC;AAAA;AAAA,cACA,aACC;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,IAAI;AAAA,oBACF,OAAO;AAAA,oBACP,SAAS;AAAA,oBACT,gBAAgB;AAAA,oBAChB,YAAY;AAAA,oBACZ,IAAI;AAAA,kBACN;AAAA,kBAEC;AAAA;AAAA,cACH,IACE;AAAA;AAAA;AAAA,QACN;AAAA,QAEA,8CAAC,sBAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,gBAAgB,iBAAiB,WAAW,GAAG,QAAQ,OAAQ,GACjH;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;;;AClEA,8BAAqD;AA0D3C,IAAAC,sBAAA;AAzCK,SAAR,qBAAsC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAEhB,gBAAgB;AAAA,UACd,cAAc;AAAA,UACd,QAAQ;AAAA,QAEV;AAAA,MACF;AAAA,MAEC,WAAC,CAAC,iBACD;AAAA,QAAC,wBAAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,aAAa,QAAQ,QAAQ;AAAA,UACxC,YAAY,CAAC,aAAa,iBAAiB,QAAQ;AAAA,UACnD;AAAA,UACA,QAAQ;AAAA,UACR,eAAa;AAAA,UACb,cAAY;AAAA,UACZ,UAAU,CAAC;AAAA,UACX,OAAO,EAAE,UAAU,QAAQ,WAAW,KAAK,UAAU,SAAS;AAAA,UAE9D;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,KAAK;AAAA,cACL,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,WAAW,UAAU,MAAM,cAAc,KAAK;AAAA,gBAC9C,iBAAiB;AAAA,cACnB;AAAA,cACA,QAAQ;AAAA;AAAA,UACV;AAAA;AAAA,MACF;AAAA;AAAA,EAEJ;AAEJ;;;AC9EA,oBAAgC;;;ACAhC,wBAAwB;;;AC2Cd,IAAAC,sBAAA;AAtCV,IAAM,aAAa;AAAA,EACjB,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,EAC5B,EAAE,OAAO,GAAG,OAAO,KAAK;AAAA,EACxB,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,EAC5B,EAAE,OAAO,GAAG,OAAO,KAAK;AAAA,EACxB,EAAE,OAAO,KAAK,OAAO,OAAO;AAAA,EAC5B,EAAE,OAAO,GAAG,OAAO,KAAK;AAC1B;AAEA,IAAM,gBAAgB;AAAA,EACpB,EAAE,OAAO,MAAM,OAAO,WAAQ;AAAA,EAC9B,EAAE,OAAO,KAAK,OAAO,UAAO;AAAA,EAC5B,EAAE,OAAO,GAAG,OAAO,QAAK;AAAA,EACxB,EAAE,OAAO,IAAI,OAAO,SAAM;AAAA,EAC1B,EAAE,OAAO,KAAK,OAAO,UAAO;AAC9B;AAWe,SAAR,uBAAwC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgC;AAC9B,SACE,8CAAC,wBAAM,SAAS,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,GAC1C;AAAA,iDAAC,sBAAI,SAAQ,QAAO,gBAAe,UAChC,4BACC,6CAAC,mBAAgB,KAAK,WAAW,IAEjC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UAAE,OAAO;AAAA,UAAQ,UAAU;AAAA,UAChC,QAAQ;AAAA,UACR,cAAc;AAAA,QAChB;AAAA;AAAA,IACF,GAEJ;AAAA,IAEA,8CAAC,sBACC;AAAA,oDAAC,6BAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,EAAE,GAAG;AAAA;AAAA,QAC9B;AAAA,QAAO;AAAA,SACpB;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,UAAU,CAAC,GAAG,UAAU,UAAU,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK;AAAA;AAAA,MAC3E;AAAA,OACF;AAAA,IAEA,8CAAC,sBACC;AAAA,oDAAC,6BAAW,SAAQ,SAAQ,IAAI,EAAE,IAAI,EAAE,GAAG;AAAA;AAAA,QAC1B,MAAM,QAAQ,CAAC;AAAA,QAAE;AAAA,SAClC;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,UAAU,CAAC,GAAG,UAAU,SAAS,MAAM,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK;AAAA;AAAA,MAC1E;AAAA,OACF;AAAA,KACF;AAEJ;;;AClFA,oBAAsB;AAmBlB,IAAAC,sBAAA;AATW,SAAR,OAAwB,GAK1B;AACH,QAAM,EAAC,UAAU,WAAW,GAAG,KAAI,IAAI;AACvC,QAAM,EAAC,IAAI,GAAG,QAAO,IAAI,WAAW,YAAY,CAAC;AACjD,SAAO,6CAAC,cAAAC,SAAA,EAAW,GAAG,MACpB;AAAA,IAAC;AAAA;AAAA,MACA,GAAG;AAAA,MACJ,IAAI;AAAA,QACF;AAAA,UACE,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAAA,MACG;AAAA;AAAA,EACH,GACF;AACF;;;ACjCA,mBAAyB;AACzB,wBAA0B;;;ACF1B,qBAAiC;;;AD0DzB,IAAAC,sBAAA;AAvBR,IAAM,iBAAa,yBAAqC,CAAC;AAAA,EACvD,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAG,QAAQ;AACT,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT,QAAQ;AAAA,UACN,IAAI;AAAA,YACF,eAAe;AAAA,UACjB;AAAA,QACF;AAAA,QACA,GAAG,WAAW;AAAA,MAChB;AAAA,MAEA,uDAAC,sBAAI,WAAU,QAAO,IAAI,EAAC,OAAO,cAAa,GAC7C;AAAA,QAAC,kBAAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,CAAC,WAAW,WAAW,iBAAiB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UAC9E,GAAG;AAAA,UAEH;AAAA;AAAA,MACH,GACF;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,IAAO,qBAAQ;;;AEvEf,2BAAmC;AACnC,iCAAkC;AAClC,yBAAyC;AACzC,0BAA0C;AAC1C,uBAAuC;AACvC,uBAAuC;AACvC,wBAAwC;AACxC,uBAAuC;AACvC,6BAA6C;AAC7C,2BAAmC;AACnC,4BAAoC;AACpC,wBAAkC;AAClC,oBAAoC;AACpC,qBAAqC;AACrC,0BAAmC;AACnC,kCAAsC;AACtC,iCAAkC;AAClC,4BAAuC;AACvC,0BAAuC;AACvC,+BAAqC;AACrC,iCAAiC;AACjC,kCAAsC;AACtC,gCAAmC;AACnC,oBAAkC;AAClC,4BAAsC;AACtC,gCAA+C;AAC/C,iBAAiC;AACjC,wBAAmC;AACnC,sBAAmC;AACnC,kBAAkC;AAClC,uBAAmC;AACnC,6BAAmC;AACnC,oBAAoC;AACpC,wBAAwC;AACxC,yBAAiC;AACjC,qBAAqC;AACrC,iCAAmC;AACnC,qBAAoC;AACpC,8BAAuC;AACvC,qBAAoC;AACpC,uBAAiC;AACjC,uBAAuC;AACvC,wBAAoC;AACpC,IAAAC,+BAA4C;AAC5C,iCAAwC;AACxC,sBAAqC;AACrC,mBAAmC;AACnC,qBAA0C;AAC1C,wBAAsC;AACtC,8BAAmC;AACnC,2BAAoC;AAGpC,qCAAuC;AACvC,iBAAiC;AACjC,mBAAmC;AACnC,wBAAwC;AACxC,uBAAuC;AACvC,yBAAyC;AACzC,kBAAkC;AAClC,sBAAkC;AAClC,uBAAuC;AACvC,yBAAkC;AAClC,0BAAmC;AACnC,mBAAmC;AACnC,8BAAsC;AACtC,kCAA0C;AAC1C,gCAAmC;AACnC,2BAAoC;AACpC,yBAAyC;AACzC,mBAAoC;AACpC,qBAAuC;AACvC,8BAAoC;AACpC,kBAAmC;AACnC,uBAAqC;AACrC,wBAAsC;AACtC,+BAAmC;AACnC,0BAA2C;AAC3C,kBAAmC;AACnC,wBAAqC;AACrC,kBAAmC;AACnC,uBAAmC;AACnC,sBAAsC;AACtC,qBAAsC;AACtC,sBAAuC;AACvC,0BAAmC;AACnC,+BAAwC;AACxC,6BAAiC;AACjC,8BAAkC;AAClC,gCAAwC;AACxC,qBAAqC;AACrC,yBAAyC;AACzC,sCAA8C;AAC9C,qCAA6C;AAC7C,6CAAyC;AACzC,uBAAuC;AACvC,wBAAwC;AACxC,qBAAkC;AAClC,mBAAmC;AACnC,uBAAqC;AACrC,kBAAkC;AAClC,uBAAkC;AAClC,2BAAmC;AACnC,oBAAoC;AACpC,kBAAkC;AAClC,kBAAyC;AACzC,yBAAkC;AAClC,oBAAqC;AACrC,yBAAkC;AAClC,IAAAC,gBAAmC;AACnC,+BAA+C;AAC/C,gCAAgD;AAChD,2BAA2C;AAC3C,0BAA0C;AAC1C,gCAAgD;AAChD,+BAA+C;AAC/C,2BAA2C;AAC3C,uBAAuC;AACvC,0BAA0C;AAC1C,kCAAkD;AAGlD,wBAAqC;AACrC,oBAAoC;AACpC,mBAAmC;AACnC,uBAAuC;AAGvC,iCAAsC;AACtC,yBAAyC;AACzC,4BAA4C;AAC5C,0BAA0C;AAC1C,IAAAC,iBAAoC;AACpC,2BAA2C;AAC3C,oCAAkC;AAClC,mBAAmC;AACnC,IAAAC,wBAA2C;AAE3C,sBAAsC;AACtC,yBAAyC;AACzC,mCAAmD;AACnD,gCAAgD;AAChD,IAAAC,8BAAiD;AACjD,8BAA8C;AAC9C,oBAAoC;AACpC,kBAAkC;AAClC,qBAAqC;AACrC,0BAA0C;AAC1C,6BAA6C;AAC7C,0BAA0C;AAC1C,gCAAgD;AAChD,kCAAkD;AAClD,sBAA4C;;;AC5HtC,IAAAC,sBAAA;AAhBS,SAAR,qBAAsC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,KAAK;AAAA,QACL,UAAU;AAAA,MACZ;AAAA,MAEA,wDAAC,sBAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,UAAU,OAAO,GACzE;AAAA,qDAAC,sBAAW,SAAS,mBAAmB,OAAM,0BAC5C,uDAAC,yBAAW,UAAS,SAAQ,GAC/B;AAAA,QAEA,6CAAC,sBAAW,SAAS,SAAS,OAAM,SAAQ,OAAM,gBAChD,uDAAC,yBAAU,UAAS,SAAQ,GAC9B;AAAA,QAEA,6CAAC,sBAAW,SAAS,QAAQ,OAAM,WAAU,UAAU,cAAc,OAAM,QACzE,uDAAC,wBAAU,UAAS,SAAQ,GAC9B;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AC5CA,IAAAC,gBAAkB;;;ACClB,IAAAC,gBAQO;;;ACTP,uBAA+C;AAMtC,IAAAC,sBAAA;AADM,SAAR,aAA8B,OAAuB;AAC1D,SAAO,6CAAC,iBAAAC,SAAA,EAAW,GAAG,OAAO;AAC/B;;;ACHA,yBAAqC;AACrC,4BAAwC;AACxC,4BAAwC;AACxC,wBAAoC;;;ACNpC,4BAAiF;AAKtE,IAAAC,sBAAA;AADJ,IAAM,iBAAgD,CAAC,UAAU;AACpE,SAAO,6CAAC,sBAAAC,SAAA,EAAmB,GAAG,OAAO;AACzC;;;AHSA,6BAA4D;;;AITrD,IAAM,mBAAmC;AAAA,EAC9C,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,gBACE;AAAA,EACF,sBACE;AAAA,EACF,uBACE;AAAA,EACF,gBACE;AAAA,EACF,aAAa;AAAA,EACb,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,eACE;AAAA,EACF,eAAe;AAAA,EACf,oBAAoB;AAAA,EAEpB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,KAAK;AAAA,EACL,OAAO;AAAA,EACP,WAAW;AAAA,EAEX,2BAA2B;AAAA,IACzB,gBACE;AAAA,IACF,sBACE;AAAA,IACF,gBACE;AAAA,IACF,eACE;AAAA,EACJ;AACF;AAEO,IAAM,uBAAuC;AAAA,EAClD,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,mBAAmB;AAAA,IACjB,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAAA,EACA,yBAAyB;AAAA,IACvB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,wBAAwB;AAAA,IACtB,oBAAoB;AAAA,EACtB;AAAA,EACA,2BAA2B;AAAA,IACzB,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,eAAe;AAAA,EACjB;AACF;AAEO,IAAM,mBAAmC;AAAA,EAC9C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,0BAA0B;AAAA,IACxB,aAAa;AAAA,IACb,iBACE;AAAA,EACJ;AACF;AAGO,IAAM,oBAAoC;AAAA,EAC/C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,WAAW;AACb;AAEO,IAAM,uBAAuC;AAAA,EAClD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,iBACE;AAAA,EACF,WAAW;AAAA,EACX,UAAU;AACZ;AAGO,IAAM,sBAAsC;AAAA,EACjD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAEZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA;AAAA,IAET,OAAO;AAAA,EACT;AACF;AAGO,IAAM,qBAAqC;AAAA,EAChD,WAAW;AAAA,EACX,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,IACT,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,mBAAmB;AAAA,IACjB,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AAAA,EACA,yBAAyB;AAAA,IACvB,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,wBAAwB;AAAA,IACtB,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,IAChB,SAAS;AAAA,IACT,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,0BAA0B;AAAA,IACxB,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AACF;AAGO,IAAM,uBAAuC;AAAA,EAClD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,KAAK;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,WAAW;AACb;AAGO,IAAM,mBAAmC;AAAA,EAC9C,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,0BAA0B;AAAA,IACxB,aAAa;AAAA,EACf;AAAA,EACA,2DAA2D;AAAA,IACzD,SAAS;AAAA,IACT,eAAe;AAAA,EACjB;AACF;AAGO,IAAM,wBAAwC;AAAA,EACnD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAChB;AAGO,IAAM,2BAA2C;AAAA,EACtD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,iBACE;AAAA,EACF,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AACZ;AAEO,IAAM,0BAA0C;AAAA,EACrD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AACF;AAGO,IAAM,yBAAyC;AAAA,EACpD,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,GAAG;AAAA,EACH,SAAS;AAAA,EACT,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,IACT,iBAAiB;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,IAChB,SAAS;AAAA,EACX;AACF;AAGO,IAAM,2BAA2C;AAAA,EACtD,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,4BAA4B;AAAA,IAC1B,cAAc;AAAA,EAChB;AACF;;;ACrTA,IAAI,QAAQ;AAGL,SAAS,qBAA6B;AAC3C,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO,OAAO,WAAW;AAAA,EAC3B;AACA,WAAS;AACT,SAAO,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK;AAClC;AAEO,SAAS,qBAAqB,MAA4B;AAC/D,SAAO;AAAA,IACL,IAAI,mBAAmB;AAAA,IACvB;AAAA,IACA,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,eAAe,OAAuB;AACpD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,EAAG,QAAO;AACjD,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,MAAI,QAAQ,OAAO,OAAO,MAAM;AAC9B,WAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,EAC9C;AACA,SAAO,IAAI,SAAS,OAAO,OAAO,OAAO,QAAQ,CAAC,CAAC;AACrD;AAIA,SAAS,YAAY,QAA+B;AAClD,MAAI,CAAC,UAAU,CAAC,OAAO,KAAK,EAAG,QAAO,CAAC;AACvC,SAAO,OACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,EACd,IAAI,CAAC,UAAU;AACd,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB,aAAO,EAAE,MAAM,OAAgB,OAAO,MAAM,YAAY,EAAE;AAAA,IAC5D;AACA,WAAO,EAAE,MAAM,QAAiB,OAAO,MAAM,YAAY,EAAE;AAAA,EAC7D,CAAC;AACL;AAEA,SAAS,cAAc,MAAY,OAA8B;AAC/D,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,OAAO,KAAK,KAAK,YAAY;AACnC,QAAM,QAAQ,KAAK,QAAQ,IAAI,YAAY;AAC3C,SAAO,MAAM,KAAK,CAAC,SAAS;AAC1B,QAAI,KAAK,SAAS,OAAO;AACvB,aAAO,KAAK,SAAS,KAAK,KAAK;AAAA,IACjC;AACA,QAAI,KAAK,MAAM,SAAS,IAAI,GAAG;AAC7B,YAAM,SAAS,KAAK,MAAM,MAAM,GAAG,EAAE;AACrC,aAAO,KAAK,WAAW,MAAM;AAAA,IAC/B;AACA,WAAO,SAAS,KAAK;AAAA,EACvB,CAAC;AACH;AAcO,SAAS,cACd,UACA,MACmD;AACnD,QAAM,QAAQ,YAAY,KAAK,MAAM;AACrC,QAAM,WAAmB,CAAC;AAC1B,QAAM,aAA8B,CAAC;AAErC,QAAM,UAAU,KAAK,WACjB,KAAK,YAAY,QAAQ,KAAK,WAAW,IACvC,KAAK,WACL,WACF;AAEJ,aAAW,QAAQ,UAAU;AAC3B,UAAM,SAA2B,CAAC;AAElC,QAAI,CAAC,cAAc,MAAM,KAAK,GAAG;AAC/B,aAAO,KAAK,mBAAmB;AAAA,IACjC;AACA,QAAI,KAAK,WAAW,QAAQ,KAAK,UAAU,KAAK,KAAK,OAAO,KAAK,SAAS;AACxE,aAAO,KAAK,gBAAgB;AAAA,IAC9B;AACA,QAAI,KAAK,eAAe,SAAS,UAAU,SAAS;AAClD,aAAO,KAAK,gBAAgB;AAAA,IAC9B;AAEA,QAAI,OAAO,SAAS,GAAG;AACrB,iBAAW,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,IAClC,OAAO;AACL,eAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,WAAW;AAChC;AAIA,IAAM,cAAsC;AAAA,EAC1C,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,gCAAgC;AAAA,EAChC,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,gCAAgC;AAAA,EAChC,uBAAuB;AAAA,EACvB,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,2EAA2E;AAAA,EAC3E,4BAA4B;AAAA,EAC5B,qEAAqE;AAAA,EACrE,iCAAiC;AAAA,EACjC,6EAA6E;AAAA,EAC7E,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAChB;AAMO,SAAS,iBAAiB,MAAoB;AACnD,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,MAAM,KAAK,YAAY,GAAG;AAChC,MAAI,MAAM,KAAK,MAAM,KAAK,SAAS,GAAG;AACpC,WAAO,KAAK,MAAM,MAAM,CAAC,EAAE,YAAY;AAAA,EACzC;AACA,QAAM,QAAQ,KAAK,QAAQ,IAAI,YAAY;AAC3C,SAAO,YAAY,IAAI,KAAK;AAC9B;AAEO,SAAS,YAAY,MAAqB;AAC/C,SAAO,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,WAAW,QAAQ;AACvE;AAcA,IAAM,cAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AACR;AAMO,IAAM,0BAA0B;AAAA,EACrC,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,OAAO;AAAA,EACP,YAAY;AACd;AAEA,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,IAAM,uBAAyD;AAAA,EACpE,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,YAAY,EAAE,GAAG,wBAAwB;AAAA,EACzC,UAAU;AAAA,IACR,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AACF;AAGO,IAAM,0BAA4C;AAAA,EACvD,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,OAAO;AAAA,EACP,YAAY;AACd;AAWA,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,cAAc,OAAkC;AACvD,MAAI,OAAO,MAAM,eAAe,YAAY,MAAM,WAAW,KAAK,GAAG;AACnE,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,UAAU,UAAU;AACnC,UAAM,IAAI,MAAM,MAAM,KAAK,EAAE,YAAY;AACzC,QAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,EAAG,QAAO;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,qBACP,KACA,YACkB;AAGlB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,YAAY,IAAI,cAAc,WAAW;AAAA,IACzC,gBAAgB,IAAI,kBAAkB,WAAW;AAAA,IACjD,WAAW,IAAI,aAAa,WAAW;AAAA,IACvC,OAAO,IAAI,SAAS,WAAW;AAAA,IAC/B,YAAY,IAAI,cAAc,WAAW;AAAA,IACzC,gBAAgB,IAAI,kBAAkB,WAAW;AAAA,IACjD,MAAM,IAAI,QAAQ,WAAW;AAAA,EAC/B;AACF;AAOO,SAAS,qBACd,MACAC,gBACoB;AACpB,QAAM,SAAS,iBAAiB,IAAI;AACpC,QAAM,YAAY,YAAY,MAAM,KAAK,QAAQ,YAAY;AAC7D,QAAM,aAAa,UAAU,YAAY;AAGzC,QAAM,MAAwB;AAAA,IAC5B,IAAK,WAAWA,eAAc,QAAQ,IAAI,WAAc,CAAC;AAAA,EAC3D;AAEA,QAAM,YACJ,aAAa,IAAI,MAAM,KACvB,aAAa,IAAI,QAAQ,KACzB,IAAI,SAAS;AAEf,MAAI;AACJ,MAAI,WAAW;AACb,YAAQ,EAAE,GAAG,KAAK,GAAG,wBAAwB;AAAA,EAC/C,WAAW,cAAc,GAAG,GAAG;AAC7B,YAAQ,EAAE,GAAG,IAAI;AAAA,EACnB,WAAW,IAAI,QAAQ,qBAAqB,IAAI,IAAI,GAAG;AACrD,YAAQ,qBAAqB,KAAK,qBAAqB,IAAI,IAAI,CAAC;AAAA,EAClE,OAAO;AACL,YAAQ,qBAAqB,KAAK,uBAAuB;AAAA,EAC3D;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF;AACF;;;ALpLM,IAAAC,uBAAA;AAhMN,SAASC,YACJ,OACoB;AACvB,QAAM,MAAiB,CAAC;AACxB,aAAW,KAAK,OAAO;AACrB,QAAI,CAAC,EAAG;AACR,QAAI,MAAM,QAAQ,CAAC,EAAG,KAAI,KAAK,GAAG,CAAC;AAAA,QAC9B,KAAI,KAAK,CAAC;AAAA,EACjB;AACA,SAAO;AACT;AAYO,IAAM,iBAAa;AAAA,EACxB,SAASC,YAAW,OAAO,KAAK;AAC9B,UAAM;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,MACV,cAAc;AAAA,MACd,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,MACtB,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,eAAe,aAAa;AAAA,IAC9B,IAAI;AAEJ,UAAM,cAAU,qBAAM;AACtB,UAAM,UAAU,UAAU,eAAe,OAAO;AAChD,UAAM,WAAW,GAAG,OAAO;AAC3B,UAAM,eAAW,sBAAyB,IAAI;AAE9C,UAAM,eAAe,cAAc;AACnC,UAAM,CAAC,cAAc,eAAe,QAAI;AAAA,MACtC,MAAM,gBAAgB,CAAC;AAAA,IACzB;AACA,UAAM,YAAQ;AAAA,MACZ,MAAO,eAAgB,aAAa,CAAC,IAAK;AAAA,MAC1C,CAAC,cAAc,WAAW,YAAY;AAAA,IACxC;AAEA,UAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAC1C,UAAM,gBAAY,sBAAO,CAAC;AAE1B,UAAM,iBAAa,uBAAQ,MAAM;AAC/B,UAAI,CAAC,SAAU,QAAO,MAAM,UAAU;AACtC,UAAI,YAAY,QAAQ,WAAW,EAAG,QAAO,MAAM,UAAU;AAC7D,aAAO;AAAA,IACT,GAAG,CAAC,MAAM,QAAQ,UAAU,QAAQ,CAAC;AAErC,UAAM,aAAS;AAAA,MACb,CAAC,SAA2B;AAC1B,YAAI,CAAC,aAAc,iBAAgB,IAAI;AACvC,mBAAW,IAAI;AAAA,MACjB;AAAA,MACA,CAAC,cAAc,QAAQ;AAAA,IACzB;AAEA,UAAM,aAAS;AAAA,MACb,CAAC,aAAgC;AAC/B,YAAI,SAAU;AACd,cAAM,WAAW,MAAM,KAAK,QAAQ;AACpC,YAAI,SAAS,WAAW,EAAG;AAE3B,cAAM,EAAE,UAAU,WAAW,IAAI,cAAc,UAAU;AAAA,UACvD;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc,MAAM;AAAA,UACpB;AAAA,QACF,CAAC;AAED,YAAI,WAAW,SAAS,GAAG;AACzB,qBAAW,UAAU;AAAA,QACvB;AAEA,YAAI,SAAS,WAAW,EAAG;AAE3B,cAAM,YAAY,SAAS,IAAI,oBAAoB;AACnD,YAAI,CAAC,UAAU;AACb,iBAAO,UAAU,MAAM,GAAG,CAAC,CAAC;AAC5B;AAAA,QACF;AACA,eAAO,CAAC,GAAG,OAAO,GAAG,SAAS,CAAC;AAAA,MACjC;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,mBAAe;AAAA,MACnB,CAAC,SAAyB;AACxB,YAAI,SAAU;AACd,cAAM,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE;AACjD,eAAO,IAAI;AACX,mBAAW,MAAM,IAAI;AACrB,YAAI,SAAS,QAAS,UAAS,QAAQ,QAAQ;AAAA,MACjD;AAAA,MACA,CAAC,QAAQ,UAAU,OAAO,QAAQ;AAAA,IACpC;AAEA,UAAM,iBAAa,2BAAY,MAAM;AACnC,UAAI,YAAY,WAAY;AAC5B,eAAS,SAAS,MAAM;AAAA,IAC1B,GAAG,CAAC,YAAY,QAAQ,CAAC;AAEzB,UAAM,oBAAgB;AAAA,MACpB,CAAC,MAA2C;AAC1C,YAAI,EAAE,OAAO,MAAO,QAAO,EAAE,OAAO,KAAK;AAEzC,UAAE,OAAO,QAAQ;AAAA,MACnB;AAAA,MACA,CAAC,MAAM;AAAA,IACT;AAEA,UAAM,kBAAc;AAAA,MAClB,CAAC,MAAuB;AACtB,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,YAAI,YAAY,WAAY;AAC5B,kBAAU,WAAW;AACrB,kBAAU,IAAI;AAAA,MAChB;AAAA,MACA,CAAC,YAAY,QAAQ;AAAA,IACvB;AAEA,UAAM,kBAAc,2BAAY,CAAC,MAAuB;AACtD,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,gBAAU,UAAU,KAAK,IAAI,GAAG,UAAU,UAAU,CAAC;AACrD,UAAI,UAAU,YAAY,EAAG,WAAU,KAAK;AAAA,IAC9C,GAAG,CAAC,CAAC;AAEL,UAAM,iBAAa,2BAAY,CAAC,MAAuB;AACrD,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAAA,IACpB,GAAG,CAAC,CAAC;AAEL,UAAM,aAAS;AAAA,MACb,CAAC,MAAuB;AACtB,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,kBAAU,UAAU;AACpB,kBAAU,KAAK;AACf,YAAI,YAAY,WAAY;AAC5B,YAAI,EAAE,aAAa,OAAO,QAAQ;AAChC,iBAAO,EAAE,aAAa,KAAK;AAAA,QAC7B;AAAA,MACF;AAAA,MACA,CAAC,YAAY,UAAU,MAAM;AAAA,IAC/B;AAEA,UAAM,YAAY,YAAY;AAC9B,UAAM,iBAAiB,YAAY,iBAAiB;AACpD,UAAM,cAAc,CAAC,aAAa,CAAC;AACnC,UAAM,WAAW,YAAY;AAE7B,UAAM,YACJ;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,OAAO,EAAE,SAAS,OAAO;AAAA,QACzB,eAAW;AAAA,QACX,UAAU;AAAA;AAAA,IACZ;AAGF,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,eAAa;AAAA,QACb,gBAAc;AAAA,QACd,iBAAe,YAAY,YAAY,SAAS;AAAA,QAChD,IAAID,SAAQ,kBAAkB,EAAE;AAAA,QAE/B;AAAA,kBACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,cAAc,UAAU;AAAA,cACjC;AAAA,cACA;AAAA,cACA,IAAI;AAAA,gBACF,IAAI;AAAA,gBACJ,OAAO,QAAQ,eAAe;AAAA,gBAC9B,UAAU;AAAA,gBACV,YAAY;AAAA,cACd;AAAA,cAEC;AAAA;AAAA,UACH,IACE;AAAA,UAEH;AAAA,UAEA,cACC,WACE;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,kBAAgB;AAAA,cAChB;AAAA,cACA,gBAAc,SAAS;AAAA,cACvB,oBAAkB,aAAa,WAAW;AAAA,cAC1C,eAAa,SAAS,SAAS;AAAA,cAC/B,cAAY,QAAQ,SAAS;AAAA,cAC7B,eAAa,GAAG,UAAU;AAAA,cAC1B,WAAW,8CAAC,8BAAgB,IAAI,EAAE,UAAU,UAAU,GAAG;AAAA,cACzD,SAAS;AAAA,cACT,IAAI;AAAA,cACH,GAAG;AAAA,cAEH;AAAA;AAAA,UACH,IAEA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,UAAU,WAAW,KAAK;AAAA,cAC1B,iBAAe,YAAY;AAAA,cAC3B,gBAAc,SAAS;AAAA,cACvB,oBAAkB,aAAa,WAAW;AAAA,cAC1C,eAAa,SAAS,SAAS;AAAA,cAC/B,cAAY,QAAQ,SAAS;AAAA,cAC7B,iBAAe,WAAW,SAAS;AAAA,cACnC,eAAa,GAAG,UAAU;AAAA,cAC1B,IAAI;AAAA,cACJ,SAAS;AAAA,cACT,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,oBAAE,eAAe;AACjB,6BAAW;AAAA,gBACb;AAAA,cACF;AAAA,cACC,GAAG;AAAA,cAEJ;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,eAAW;AAAA,oBACX,IAAI,EAAE,UAAU,IAAI,OAAO,kBAAkB,SAAS,IAAI;AAAA;AAAA,gBAC5D;AAAA,gBACC,OAAO,kBAAkB,WACxB;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,IAAI,EAAE,GAAG,GAAG,OAAO,kBAAkB,YAAY,IAAI;AAAA,oBAEpD;AAAA;AAAA,gBACH,IAEA;AAAA,gBAED,sBACC,OAAO,wBAAwB,WAC7B;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,IAAI,EAAE,GAAG,GAAG,OAAO,2BAA2B;AAAA,oBAE7C;AAAA;AAAA,gBACH,IAEA,sBAEA;AAAA;AAAA;AAAA,UACN,IAEA;AAAA,UAEH,MAAM,SAAS,IACd,gBAAgB,SACd;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAa,GAAG,UAAU;AAAA,cAC1B,qBAAkB;AAAA,cAClB,IAAI;AAAA,cAEH,gBAAM,IAAI,CAAC,SACV;AAAA,gBAAC;AAAA;AAAA,kBAEC;AAAA,kBACA;AAAA,kBACA,eAAe;AAAA,kBACf,UAAU;AAAA,kBACV,QAAQ,GAAG,UAAU;AAAA,kBACrB,aAAY;AAAA;AAAA,gBANP,KAAK;AAAA,cAOZ,CACD;AAAA;AAAA,UACH,IAEA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS;AAAA,cACT,eAAa,GAAG,UAAU;AAAA,cAC1B,qBAAkB;AAAA,cAClB,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,WAAW,OAAO;AAAA,cAEnC,gBAAM,IAAI,CAAC,SACV;AAAA,gBAAC;AAAA;AAAA,kBAEC;AAAA,kBACA;AAAA,kBACA,eAAe;AAAA,kBACf,UAAU;AAAA,kBACV,QAAQ,GAAG,UAAU;AAAA,kBACrB,aAAY;AAAA;AAAA,gBANP,KAAK;AAAA,cAOZ,CACD;AAAA;AAAA,UACH,IAEA;AAAA,UAEH,aACC;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ;AAAA,cACA,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,cAEpB;AAAA;AAAA,UACH,IACE;AAAA;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA,OAAO;AACT,GAGG;AACD,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACA,QAAM,EAAE,WAAW,SAAS,IAAI;AAChC,QAAM,YAAY,SAAS;AAE3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,MACX,eAAY;AAAA,MACZ,YAAU,aAAa;AAAA,MACvB,kBAAgB,YAAY;AAAA,MAC5B,IAAI,OAAO,2BAA2B;AAAA,MAEtC,wDAAC,sBAAI,IAAI,OAAO,0BAA0B,qBACxC;AAAA,QAAC;AAAA;AAAA,UACC,MAAI;AAAA,UACJ,QAAQ;AAAA,UACR;AAAA,UACC,GAAG;AAAA;AAAA,MACN,GACF;AAAA;AAAA,EACF;AAEJ;AAOA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA,OAAO;AACT,GAGG;AACD,QAAM,CAAC,KAAK,MAAM,QAAI,wBAAwB,IAAI;AAClD,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,KAAK;AAExD,+BAAU,MAAM;AACd,qBAAiB,KAAK;AACtB,QAAI,CAAC,YAAY,IAAI,GAAG;AACtB,aAAO,IAAI;AACX;AAAA,IACF;AACA,UAAM,YAAY,IAAI,gBAAgB,IAAI;AAC1C,WAAO,SAAS;AAChB,WAAO,MAAM;AACX,UAAI,gBAAgB,SAAS;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,OAAO,CAAC,eAAe;AACzB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,eAAY;AAAA,QACZ,IAAI,OAAO,wBAAwB;AAAA,QACnC,SAAS,MAAM,iBAAiB,IAAI;AAAA;AAAA,IACtC;AAAA,EAEJ;AAEA,SAAO,8CAAC,sBAAmB,MAAY,MAAY;AACrD;AAWA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,MAAI,gBAAgB,QAAQ;AAC1B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,SAAS,KAAK,WAAW,KAAK,QAAQ,UAAU;AACtD,QAAM,eACJ,WAAW,eACV,OAAO,KAAK,aAAa,YACxB,KAAK,WAAW,KAChB,KAAK,WAAW,OAChB,WAAW,WACX,WAAW;AAEf,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAa;AAAA,MACb,eAAa;AAAA,MACb,qBAAkB;AAAA,MAClB,IAAI;AAAA,MAEJ;AAAA,sDAAC,mBAAgB,MAAM,KAAK,MAAM;AAAA,QAClC,+CAAC,sBAAI,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,GAC9B;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,QAAM;AAAA,cACN,OAAO,KAAK,KAAK;AAAA,cACjB,IAAI,EAAE,GAAG,GAAG,YAAY,KAAK,OAAO,iBAAiB;AAAA,cAEpD,eAAK,KAAK;AAAA;AAAA,UACb;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI,EAAE,GAAG,GAAG,OAAO,2BAA2B;AAAA,cAE7C;AAAA,+BAAe,KAAK,KAAK,IAAI;AAAA,gBAC7B,KAAK,QAAQ,SAAM,KAAK,KAAK,KAAK;AAAA,gBAClC,WAAW,aAAa,CAAC,KAAK,QAAQ,eAAY;AAAA;AAAA;AAAA,UACrD;AAAA,UACC,eACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,YAAY,CAAC,CAAC;AAAA,cACpD,cAAY,mBAAmB,KAAK,YAAY,CAAC;AAAA,cACjD,IAAI,EAAE,IAAI,MAAM,QAAQ,GAAG,cAAc,EAAE;AAAA;AAAA,UAC7C,IACE;AAAA,UACH,WAAW,eAAe,KAAK,YAAY,OAC1C;AAAA,YAAC;AAAA;AAAA,cACC,cAAW;AAAA,cACX,IAAI,EAAE,IAAI,MAAM,QAAQ,GAAG,cAAc,EAAE;AAAA;AAAA,UAC7C,IACE;AAAA,WACN;AAAA,QACC,gBAAgB,OACf;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,UAAU,KAAK,KAAK,IAAI;AAAA,YACpC;AAAA,YACA,SAAS,MAAM,SAAS,IAAI;AAAA,YAC5B,IAAI;AAAA,cACF,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,GAAG;AAAA,YACL;AAAA,YAEA,wDAAC,wBAAU,IAAI,EAAE,UAAU,OAAO,GAAG;AAAA;AAAA,QACvC;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAGA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,SAAS,KAAK,WAAW,KAAK,QAAQ,UAAU;AACtD,QAAM,eACJ,WAAW,eACV,OAAO,KAAK,aAAa,YACxB,KAAK,WAAW,KAChB,KAAK,WAAW,OAChB,WAAW,WACX,WAAW;AACf,QAAM,gBAAgB,WAAW,eAAe,KAAK,YAAY;AAEjE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAa;AAAA,MACb,eAAa;AAAA,MACb,qBAAkB;AAAA,MAClB,OAAO,KAAK,KAAK;AAAA,MACjB,IAAI;AAAA,MAEJ;AAAA,sDAAC,mBAAgB,MAAM,KAAK,MAAM,MAAI,MAAC;AAAA,QACtC,eACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,YAAY,CAAC,CAAC;AAAA,YACpD,cAAY,mBAAmB,KAAK,YAAY,CAAC;AAAA,YACjD,IAAI;AAAA;AAAA,QACN,IACE;AAAA,QACH,gBACC;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,IAAI;AAAA;AAAA,QACN,IACE;AAAA,QACH,gBAAgB,OACf;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAY,UAAU,KAAK,KAAK,IAAI;AAAA,YACpC;AAAA,YACA,SAAS,CAAC,MAAM;AACd,gBAAE,gBAAgB;AAClB,uBAAS,IAAI;AAAA,YACf;AAAA,YACA,IAAI;AAAA,YAEJ,wDAAC,wBAAU,IAAI,EAAE,UAAU,UAAU,GAAG;AAAA;AAAA,QAC1C;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ADrkBM,IAAAE,uBAAA;AA9CN,SAAS,eAAe,QAAyC;AAC/D,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,QAAM,QAAkB,CAAC;AACzB,SAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,MAAM,IAAI,MAAM;AAC/C,UAAM,KAAK,IAAI;AACf,QAAI,MAAM,QAAQ,IAAI,EAAG,OAAM,KAAK,GAAG,IAAI;AAAA,EAC7C,CAAC;AACD,SAAO,MAAM,SAAS,MAAM,KAAK,GAAG,IAAI;AAC1C;AAKe,SAAR,oBAAqC;AAAA,EAC1C,SAAS;AAAA,EACT,cAAc;AAAA,EACd;AACF,GAAU;AACR,QAAM,CAAC,OAAO,QAAQ,IAAI,cAAAC,QAAM,SAA2B,CAAC,CAAC;AAC7D,QAAM,YAAY,cAAAA,QAAM,OAAsB,IAAI;AAElD,gBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,MAAM,QAAQ;AACjB,UAAI,UAAU,SAAS;AACrB,kBAAU,UAAU;AACpB,iBAAS,IAAI;AAAA,MACf;AACA;AAAA,IACF;AACA,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,UAAU,YAAY,KAAK,GAAI;AACnC,cAAU,UAAU,KAAK;AACzB,aAAS,KAAK,IAAI;AAAA,EACpB,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,OAAO;AAAA,QACP,IAAI;AAAA,MACN;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU;AAAA,UACV,QAAQ,eAAe,MAAM;AAAA,UAC7B,UAAU;AAAA,UACV,UAAU;AAAA,UACV,SAAQ;AAAA,UACR;AAAA,UACA,aAAY;AAAA,UAEZ,IAAI;AAAA,YACF,OAAO;AAAA,YACP,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,qBAAqB,EAAE,WAAW,SAAS;AAAA,YAC3C,4BAA4B,EAAE,gBAAgB,SAAS;AAAA,UACzD;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AOnFA,IAAAC,gBAAkB;AAClB,IAAAC,2BAMO;AAWP,SAAS,MAAM,SAAiB;AAC9B,SAAQ,UAAU,KAAK,KAAM;AAC/B;AAEA,SAAS,cAAoB;AAC3B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,uBAAuB,YAAoB,aAAqB,QAAsB;AAC7F,aAAO;AAAA,QACL;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,YACP,YACA,aACA,cACA,YACM;AACN,MAAI,cAAc;AAChB,WAAO,uBAAuB,YAAY,aAAa,YAAY;AAAA,EACrE;AACA,SAAO,EAAE,GAAG,YAAY,GAAG,GAAG,WAAW;AAC3C;AAEA,SAAS,oBACP,OACA,QACA,MACA,OACA,QACA,cACA;AACA,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,MAAI,CAAC,QAAS;AACd,MAAI,CAAC,KAAK,SAAS,CAAC,KAAK,OAAQ;AAEjC,QAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,QAAM,SAAS,MAAM,gBAAgB,MAAM;AAC3C,QAAM,aAAa,OAAO,oBAAoB;AAE9C,SAAO,QAAQ,KAAK,MAAM,KAAK,QAAQ,SAAS,UAAU;AAC1D,SAAO,SAAS,KAAK,MAAM,KAAK,SAAS,SAAS,UAAU;AAE5D,UAAQ,aAAa,YAAY,GAAG,GAAG,YAAY,GAAG,CAAC;AACvD,UAAQ,wBAAwB;AAChC,UAAQ,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAEnD,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,aAAa,MAAM,MAAM;AAC/B,QAAM,UAAU,MAAM,eAAe;AACrC,QAAM,UAAU,MAAM,gBAAgB;AAEtC,UAAQ,KAAK;AACb,MAAI,cAAc;AAChB,UAAM,QAAQ,KAAK,QAAQ;AAC3B,UAAM,SAAS,KAAK,SAAS;AAC7B,UAAM,SAAS,KAAK,IAAI,OAAO,MAAM,IAAI;AACzC,YAAQ,UAAU;AAClB,YAAQ,IAAI,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,KAAK,CAAC;AACzD,YAAQ,UAAU;AAClB,YAAQ,KAAK;AAAA,EACf;AAEA,UAAQ,UAAU,CAAC,OAAO,CAAC,KAAK;AAChC,UAAQ,UAAU,SAAS,OAAO;AAClC,UAAQ,OAAO,UAAU;AACzB,UAAQ,MAAM,OAAO,KAAK;AAC1B,UAAQ,UAAU,CAAC,SAAS,CAAC,OAAO;AAEpC,UAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,UAAQ,QAAQ;AAClB;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,WAAW,cAAAC,QAAM,OAAgC,IAAI;AAC3D,QAAM,YAAY,cAAAA,QAAM,OAAiC,IAAI;AAC7D,QAAM,gBAAgB,cAAAA,QAAM,OAAO,UAAU;AAC7C,gBAAc,UAAU;AACxB,QAAM,WAAW,cAAAA,QAAM,OAAO,CAAC;AAC/B,QAAM,YAAY,cAAAA,QAAM,OAAO,CAAC;AAEhC,QAAM,CAAC,eAAe,gBAAgB,IAAI,cAAAA,QAAM,SAAS,OAAO;AAChE,QAAM,CAAC,MAAM,OAAO,IAAI,cAAAA,QAAM,SAAe,EAAE,GAAG,YAAY,GAAG,GAAG,WAAW,CAAC;AAChF,QAAM,CAAC,eAAe,gBAAgB,IAAI,cAAAA,QAAM,SAAoB;AACpE,QAAM,CAAC,OAAO,QAAQ,IAAI,cAAAA,QAAM,SAAS,CAAC;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAI,cAAAA,QAAM,SAAS,CAAC;AAC5C,WAAS,UAAU;AACnB,YAAU,UAAU;AAEpB,QAAM,qBAAqB,cAAAA,QAAM,YAAY,CAAC,UAA4B;AACxE,UAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAI,CAAC,SAAS,CAAC,OAAQ;AAEvB,UAAM,WAAW,YAAY,OAAO,QAAQ,cAAc,cAAc,OAAO;AAC/E,UAAM,gBAAY,6CAAmB,UAAU,OAAO,MAAM;AAC5D,QAAI,CAAC,UAAU,SAAS,CAAC,UAAU,OAAQ;AAE3C,YAAQ,QAAQ;AAChB,qBAAiB,SAAS;AAE1B,UAAM,SAAS,UAAU;AACzB,QAAI,QAAQ;AACV;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,YAAY,CAAC;AAE/B,gBAAAA,QAAM,UAAU,MAAM;AACpB,qBAAiB,OAAO;AAAA,EAC1B,GAAG,CAAC,OAAO,CAAC;AAEZ,gBAAAA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAAC,eAAe;AAClB,cAAQ,EAAE,GAAG,YAAY,GAAG,GAAG,cAAc,QAAQ,CAAC;AACtD,uBAAiB,MAAS;AAC1B,eAAS,CAAC;AACV,gBAAU,CAAC;AACX;AAAA,IACF;AAEA,aAAS,CAAC;AACV,cAAU,CAAC;AAEX,UAAM,WAAW,MAAM;AACrB,YAAM,QAAQ,SAAS;AACvB,UAAI,OAAO,YAAY,MAAM,QAAQ,KAAK,MAAM,SAAS,GAAG;AAC1D,2BAAmB,KAAK;AACxB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,EAAG;AAEhB,UAAM,QAAQ,sBAAsB,MAAM;AACxC,eAAS;AAAA,IACX,CAAC;AACD,WAAO,MAAM,qBAAqB,KAAK;AAAA,EACzC,GAAG,CAAC,eAAe,kBAAkB,CAAC;AAEtC,gBAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,iBAAiB,CAAC,SAAS,WAAW,CAAC,UAAU,QAAS;AAC/D;AAAA,MACE,SAAS;AAAA,MACT,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,eAAe,OAAO,QAAQ,YAAY,CAAC;AAE/C,QAAM,cAAc,CAAC,MAA8C;AACjE,uBAAmB,EAAE,aAAa;AAAA,EACpC;AAEA,QAAM,sBAAsB,CAAC,aAAwB;AACnD,QAAI,CAAC,SAAS,SAAS,CAAC,SAAS,OAAQ;AACzC,qBAAiB,QAAQ;AAAA,EAC3B;AAEA,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,iBAAiB,CAAC,SAAS,QAAS;AAEzC,UAAM,gBAAgB,SAAS,cAAc,QAAQ;AACrD;AAAA,MACE,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,IAAI,QAAqB,CAAC,YAAY;AACvD,oBAAc,OAAO,CAAC,aAAa,QAAQ,QAAQ,GAAG,WAAW;AAAA,IACnE,CAAC;AAED,QAAI,CAAC,KAAM;AACX,UAAM,YAAY,IAAI,gBAAgB,IAAI;AAC1C,UAAM,OAAO,SAAS;AAAA,EACxB;AAEA,QAAM,cAAc,MAAM;AACxB,qBAAiB,EAAE;AACnB,eAAW;AACX,aAAS,UAAU;AACnB,UAAM,SAAS,UAAU;AACzB,QAAI,QAAQ;AACV,YAAM,UAAU,OAAO,WAAW,IAAI;AACtC,UAAI,SAAS;AACX,gBAAQ,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,MACrD;AAAA,IACF;AACA,YAAQ,EAAE,GAAG,YAAY,GAAG,GAAG,cAAc,QAAQ,CAAC;AACtD,aAAS,CAAC;AACV,cAAU,CAAC;AACX,qBAAiB,MAAS;AAAA,EAC5B;AAEA,QAAM,wBAAwB,MAAM;AAClC,aAAS,CAAC;AACV,cAAU,CAAC;AAAA,EACb;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ArBrOQ,IAAAC,uBAAA;AA5CR,IAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B;AACF,MAAM;AACJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAEF,OACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAEF,YACE,gFACG;AAAA;AAAA,QACA,oBACC;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,QAAQ,CAAC,MAAM,eAAe,CAAC;AAAA;AAAA,QACjC;AAAA,SAEJ;AAAA,MAEF,QACE;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,mBAAmB;AAAA,UACnB,SAAS,MAAM;AAEb,wBAAY;AACZ,sBAAU;AAAA,UACZ;AAAA,UACA,cAAc,CAAC,iBAAiB,CAAC;AAAA;AAAA,MACnC;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAO,kBAAQ;","names":["ImageList","ImageListItem","import_jsx_runtime","import_jsx_runtime","ReactCrop","import_jsx_runtime","import_jsx_runtime","MuiButton","import_jsx_runtime","MuiIconButton","import_PhotoSizeSelectLarge","import_Close","import_Person","import_DeleteForever","import_AccountTreeOutlined","import_jsx_runtime","import_react","import_react","import_jsx_runtime","FormLabel","import_jsx_runtime","MuiLinearProgress","defaultStyles","import_jsx_runtime","mergeSx","FileUpload","import_jsx_runtime","React","import_react","import_react_image_crop","React","import_jsx_runtime"]}
|
package/dist/image.mjs
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Cropper_default,
|
|
3
3
|
MuiImageList_default
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-USXGNKWJ.mjs";
|
|
5
|
+
import "./chunk-4SSJY32J.mjs";
|
|
5
6
|
import "./chunk-EW4DTFH3.mjs";
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-T4X375IG.mjs";
|
|
8
|
+
import "./chunk-WYYP3Y34.mjs";
|
|
9
|
+
import "./chunk-ZVFYOXDE.mjs";
|
|
10
|
+
import "./chunk-D4XPNSSI.mjs";
|
|
9
11
|
import "./chunk-4Q54P737.mjs";
|
|
10
12
|
import "./chunk-OP6LKXPA.mjs";
|
|
11
|
-
import "./chunk-ZVFYOXDE.mjs";
|
|
12
13
|
import "./chunk-4RPFRNXG.mjs";
|
|
13
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-PNSJC6PC.mjs";
|
|
15
|
+
import "./chunk-AFLEG5ZC.mjs";
|
|
14
16
|
import "./chunk-FJ6ZGZIA.mjs";
|
|
15
17
|
export {
|
|
16
18
|
Cropper_default as Cropper,
|
package/dist/index.d.ts
CHANGED
|
@@ -10,13 +10,17 @@ export * from './chart';
|
|
|
10
10
|
export * from './checkbox';
|
|
11
11
|
export * from './chip';
|
|
12
12
|
export * from './collapse';
|
|
13
|
+
export * from './confirm';
|
|
13
14
|
export * from './datePicker';
|
|
14
|
-
export * from './
|
|
15
|
+
export * from './dialog';
|
|
15
16
|
export * from './divider';
|
|
16
|
-
export * from './
|
|
17
|
+
export * from './emptyState';
|
|
18
|
+
export * from './errorState';
|
|
19
|
+
export * from './fileUpload';
|
|
17
20
|
export * from './form';
|
|
18
21
|
export * from './icons';
|
|
19
22
|
export * from './image';
|
|
23
|
+
export * from './inlineError';
|
|
20
24
|
export * from './input';
|
|
21
25
|
export * from './list';
|
|
22
26
|
export * from './loading';
|
|
@@ -38,6 +42,7 @@ export * from './tab';
|
|
|
38
42
|
export * from './table';
|
|
39
43
|
export * from './theme';
|
|
40
44
|
export * from './timeline';
|
|
45
|
+
export * from './toast';
|
|
41
46
|
export * from './toggleButtonGroup';
|
|
42
47
|
export * from './tooltip';
|
|
43
48
|
export * from './typography';
|