@mage-ui/components 1.0.131 → 1.0.133

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/components/controls/dropzone/Dropzone.d.mts +1 -1
  2. package/dist/components/controls/dropzone/Dropzone.d.mts.map +1 -1
  3. package/dist/components/controls/dropzone/Dropzone.mjs +1 -1
  4. package/dist/components/controls/dropzone/Dropzone.mjs.map +1 -1
  5. package/dist/components/controls/dropzone/DropzoneS3.d.mts +4 -81
  6. package/dist/components/controls/dropzone/DropzoneS3.d.mts.map +1 -1
  7. package/dist/components/controls/dropzone/DropzoneS3.mjs +1 -1
  8. package/dist/components/controls/dropzone/DropzoneS3.mjs.map +1 -1
  9. package/dist/components/controls/{avatar-dropzone → dropzone/avatar}/AvatarDropzone.d.mts +6 -10
  10. package/dist/components/controls/dropzone/avatar/AvatarDropzone.d.mts.map +1 -0
  11. package/dist/components/controls/dropzone/avatar/AvatarDropzone.mjs +2 -0
  12. package/dist/components/controls/dropzone/avatar/AvatarDropzone.mjs.map +1 -0
  13. package/dist/components/controls/dropzone/avatar/AvatarDropzoneBase.d.mts +17 -0
  14. package/dist/components/controls/dropzone/avatar/AvatarDropzoneBase.d.mts.map +1 -0
  15. package/dist/components/controls/dropzone/avatar/AvatarDropzoneBase.mjs +2 -0
  16. package/dist/components/controls/dropzone/avatar/AvatarDropzoneBase.mjs.map +1 -0
  17. package/dist/components/controls/dropzone/avatar/AvatarDropzoneS3.d.mts +37 -0
  18. package/dist/components/controls/dropzone/avatar/AvatarDropzoneS3.d.mts.map +1 -0
  19. package/dist/components/controls/dropzone/avatar/AvatarDropzoneS3.mjs +2 -0
  20. package/dist/components/controls/dropzone/avatar/AvatarDropzoneS3.mjs.map +1 -0
  21. package/dist/components/controls/dropzone/use-s3-upload.d.mts +70 -0
  22. package/dist/components/controls/dropzone/use-s3-upload.d.mts.map +1 -0
  23. package/dist/components/controls/dropzone/use-s3-upload.mjs +2 -0
  24. package/dist/components/controls/dropzone/use-s3-upload.mjs.map +1 -0
  25. package/dist/components/controls/index.d.mts +4 -2
  26. package/dist/components/data-display/resource-item/ResourceItem.mjs +1 -1
  27. package/dist/components/data-display/resource-item/ResourceItem.mjs.map +1 -1
  28. package/dist/components/forms/Form.d.mts +1 -1
  29. package/dist/components/forms/controls/FormDropzoneS3.d.mts +2 -1
  30. package/dist/components/forms/controls/FormDropzoneS3.d.mts.map +1 -1
  31. package/dist/components/index.d.mts +4 -2
  32. package/dist/index.d.mts +5 -3
  33. package/dist/index.mjs +1 -1
  34. package/package.json +2 -2
  35. package/dist/components/controls/avatar-dropzone/AvatarDropzone.d.mts.map +0 -1
  36. package/dist/components/controls/avatar-dropzone/AvatarDropzone.mjs +0 -2
  37. package/dist/components/controls/avatar-dropzone/AvatarDropzone.mjs.map +0 -1
@@ -5,7 +5,7 @@ import { ReactNode } from "react";
5
5
 
6
6
  //#region src/components/controls/dropzone/Dropzone.d.ts
7
7
  type DropzoneProps = Omit<DropzoneBaseProps, 'children' | 'classNames'> & {
8
- children?: ReactNode;
8
+ children?: ReactNode | DropzoneBaseProps['children'];
9
9
  label?: ReactNode;
10
10
  description?: ReactNode;
11
11
  error?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"Dropzone.d.mts","names":[],"sources":["../../../../src/components/controls/dropzone/Dropzone.tsx"],"mappings":";;;;;;KA0BY,aAAA,GAAgB,IAAA,CAC1B,iBAAA;EAGA,QAAA,GAAW,SAAA;EACX,KAAA,GAAQ,SAAA;EACR,WAAA,GAAc,SAAA;EACd,KAAA,GAAQ,SAAA;EACR,cAAA;EACA,UAAA;IACE,QAAA;IACA,IAAA;IACA,YAAA;IACA,KAAA;IACA,WAAA;IACA,KAAA;IACA,aAAA;IACA,iBAAA;IACA,qBAAA;IACA,YAAA,GAAe,iBAAA;IACf,gBAAA,GAAmB,iBAAA;EAAA;AAAA;AAAA,cAMV,QAAA;EAAY,QAAA;EAAA,KAAA;EAAA,WAAA;EAAA,KAAA;EAAA,cAAA,EAAA,eAAA;EAAA,UAAA;EAAA,OAAA;EAAA,SAAA;EAAA,GAAA;AAAA,GAUtB,aAAA,KAAa,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"Dropzone.d.mts","names":[],"sources":["../../../../src/components/controls/dropzone/Dropzone.tsx"],"mappings":";;;;;;KA0BY,aAAA,GAAgB,IAAA,CAC1B,iBAAA;EAGA,QAAA,GAAW,SAAA,GAAY,iBAAA;EACvB,KAAA,GAAQ,SAAA;EACR,WAAA,GAAc,SAAA;EACd,KAAA,GAAQ,SAAA;EACR,cAAA;EACA,UAAA;IACE,QAAA;IACA,IAAA;IACA,YAAA;IACA,KAAA;IACA,WAAA;IACA,KAAA;IACA,aAAA;IACA,iBAAA;IACA,qBAAA;IACA,YAAA,GAAe,iBAAA;IACf,gBAAA,GAAmB,iBAAA;EAAA;AAAA;AAAA,cAMV,QAAA;EAAY,QAAA;EAAA,KAAA;EAAA,WAAA;EAAA,KAAA;EAAA,cAAA,EAAA,eAAA;EAAA,UAAA;EAAA,OAAA;EAAA,SAAA;EAAA,GAAA;AAAA,GAUtB,aAAA,KAAa,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,2 +1,2 @@
1
- import{UploadedFiles as e}from"../../data-display/uploaded-files/UploadedFiles.mjs";import{DropzoneBase as t}from"./DropzoneBase.mjs";import{cx as n}from"@mage-ui/styled-system/css";import{dropzone as r,dropzoneDescription as i,dropzoneDropzone as a,dropzoneError as o,dropzoneLabel as s,dropzoneLabelWrapper as c,dropzoneRoot as l,dropzoneUploadedFile as u,dropzoneUploadedFiles as d,dropzoneUploadedFilesListItem as f}from"@mage-ui/styled-system/recipes";import{jsx as p,jsxs as m}from"react/jsx-runtime";import{useId as h}from"react";const g=({children:g,label:_,description:v,error:y,fileListHeight:b,classNames:x,inputId:S,direction:C=`default`,...w})=>{let T=h(),E=S??T;return m(`div`,{className:n(x?.dropzone??r(),x?.root??l()),children:[(_||v)&&m(`div`,{className:x?.labelWrapper??c(),children:[_&&p(`label`,{htmlFor:E,className:x?.label??s(),children:_}),v&&p(`p`,{className:x?.description??i(),children:v})]}),p(t,{...w,inputId:E,direction:C,classNames:{...x?.dropzoneDropzone??{},dropzoneBase:x?.dropzoneDropzone?.dropzoneBase??a()},children:({files:t,removeFile:n})=>g===void 0?Object.keys(t).length>0?p(e,{classNames:{uploadedFiles:x?.uploadedFiles??d(),root:x?.uploadedFilesRoot},children:Object.values(t).map(t=>p(e.Item,{fileName:t.name,fileType:t.type,fileSize:`${(t.size/1024).toFixed(1)} KB`,fileDate:t.date,url:t.url,onRemove:()=>n(t.name),classNames:{listItem:x?.uploadedFilesListItem??f(),uploadedFile:{...x?.uploadedFile,uploadedFile:x?.uploadedFile?.uploadedFile??u()}}},t.name))}):null:g}),y&&p(`p`,{className:x?.error??o(),children:y})]})};export{g as Dropzone};
1
+ import{UploadedFiles as e}from"../../data-display/uploaded-files/UploadedFiles.mjs";import{DropzoneBase as t}from"./DropzoneBase.mjs";import{cx as n}from"@mage-ui/styled-system/css";import{dropzone as r,dropzoneDescription as i,dropzoneDropzone as a,dropzoneError as o,dropzoneLabel as s,dropzoneLabelWrapper as c,dropzoneRoot as l,dropzoneUploadedFile as u,dropzoneUploadedFiles as d,dropzoneUploadedFilesListItem as f}from"@mage-ui/styled-system/recipes";import{jsx as p,jsxs as m}from"react/jsx-runtime";import{useId as h}from"react";const g=({children:g,label:_,description:v,error:y,fileListHeight:b,classNames:x,inputId:S,direction:C=`default`,...w})=>{let T=h(),E=S??T;return m(`div`,{className:n(x?.dropzone??r(),x?.root??l()),children:[(_||v)&&m(`div`,{className:x?.labelWrapper??c(),children:[_&&p(`label`,{htmlFor:E,className:x?.label??s(),children:_}),v&&p(`p`,{className:x?.description??i(),children:v})]}),p(t,{...w,inputId:E,direction:C,classNames:{...x?.dropzoneDropzone??{},dropzoneBase:x?.dropzoneDropzone?.dropzoneBase??a()},children:({files:t,isUploading:n,removeFile:r})=>g===void 0?Object.keys(t).length>0?p(e,{classNames:{uploadedFiles:x?.uploadedFiles??d(),root:x?.uploadedFilesRoot},children:Object.values(t).map(t=>p(e.Item,{fileName:t.name,fileType:t.type,fileSize:`${(t.size/1024).toFixed(1)} KB`,fileDate:t.date,url:t.url,onRemove:()=>r(t.name),classNames:{listItem:x?.uploadedFilesListItem??f(),uploadedFile:{...x?.uploadedFile,uploadedFile:x?.uploadedFile?.uploadedFile??u()}}},t.name))}):null:typeof g==`function`?g({files:t,isUploading:n,removeFile:r}):g}),y&&p(`p`,{className:x?.error??o(),children:y})]})};export{g as Dropzone};
2
2
  //# sourceMappingURL=Dropzone.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dropzone.mjs","names":[],"sources":["../../../../src/components/controls/dropzone/Dropzone.tsx"],"sourcesContent":["import { type ReactNode, useId } from 'react';\n\nimport { cx } from '@mage-ui/styled-system/css';\nimport {\n dropzone,\n dropzoneDescription,\n dropzoneDropzone,\n dropzoneError,\n dropzoneLabel,\n dropzoneLabelWrapper,\n dropzoneRoot,\n dropzoneUploadedFile,\n dropzoneUploadedFiles,\n dropzoneUploadedFilesListItem,\n} from '@mage-ui/styled-system/recipes';\nimport {\n type UploadedFileProps,\n UploadedFiles,\n} from '@/components/data-display';\n\nimport {\n DropzoneBase,\n type DropzoneBaseProps,\n type FileData,\n} from './DropzoneBase';\n\nexport type DropzoneProps = Omit<\n DropzoneBaseProps,\n 'children' | 'classNames'\n> & {\n children?: ReactNode;\n label?: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n fileListHeight?: number | string;\n classNames?: {\n dropzone?: string;\n root?: string;\n labelWrapper?: string;\n label?: string;\n description?: string;\n error?: string;\n uploadedFiles?: string;\n uploadedFilesRoot?: string;\n uploadedFilesListItem?: string;\n uploadedFile?: UploadedFileProps['classNames'];\n dropzoneDropzone?: DropzoneBaseProps['classNames'];\n };\n};\n\nexport type { FileData };\n\nexport const Dropzone = ({\n children,\n label,\n description,\n error,\n fileListHeight: _fileListHeight,\n classNames,\n inputId,\n direction = 'default',\n ...baseProps\n}: DropzoneProps) => {\n const generatedId = useId();\n const groupId = inputId ?? generatedId;\n\n return (\n <div\n className={cx(\n classNames?.dropzone ?? dropzone(),\n classNames?.root ?? dropzoneRoot(),\n )}\n >\n {(label || description) && (\n <div className={classNames?.labelWrapper ?? dropzoneLabelWrapper()}>\n {label && (\n <label\n htmlFor={groupId}\n className={classNames?.label ?? dropzoneLabel()}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={classNames?.description ?? dropzoneDescription()}>\n {description}\n </p>\n )}\n </div>\n )}\n <DropzoneBase\n {...baseProps}\n inputId={groupId}\n direction={direction}\n classNames={{\n ...(classNames?.dropzoneDropzone ?? {}),\n dropzoneBase:\n classNames?.dropzoneDropzone?.dropzoneBase ?? dropzoneDropzone(),\n }}\n >\n {({ files, removeFile }) => {\n if (children !== undefined) {\n return children;\n }\n return Object.keys(files).length > 0 ? (\n <UploadedFiles\n classNames={{\n uploadedFiles:\n classNames?.uploadedFiles ?? dropzoneUploadedFiles(),\n root: classNames?.uploadedFilesRoot,\n }}\n >\n {Object.values(files).map((file) => (\n <UploadedFiles.Item\n key={file.name}\n fileName={file.name}\n fileType={file.type}\n fileSize={`${(file.size / 1024).toFixed(1)} KB`}\n fileDate={file.date}\n url={file.url}\n onRemove={() => removeFile(file.name)}\n classNames={{\n listItem:\n classNames?.uploadedFilesListItem ??\n dropzoneUploadedFilesListItem(),\n uploadedFile: {\n ...classNames?.uploadedFile,\n uploadedFile:\n classNames?.uploadedFile?.uploadedFile ??\n dropzoneUploadedFile(),\n },\n }}\n />\n ))}\n </UploadedFiles>\n ) : null;\n }}\n </DropzoneBase>\n {error && <p className={classNames?.error ?? dropzoneError()}>{error}</p>}\n </div>\n );\n};\n"],"mappings":"yhBAoDA,MAAa,GAAY,CACvB,WACA,QACA,cACA,QACA,eAAgB,EAChB,aACA,UACA,YAAY,UACZ,GAAG,KACgB,CACnB,IAAM,EAAc,GAAO,CACrB,EAAU,GAAW,EAE3B,OACE,EAAC,MAAD,CACE,UAAW,EACT,GAAY,UAAY,GAAU,CAClC,GAAY,MAAQ,GAAc,CACnC,UAJH,EAMI,GAAS,IACT,EAAC,MAAD,CAAK,UAAW,GAAY,cAAgB,GAAsB,UAAlE,CACG,GACC,EAAC,QAAD,CACE,QAAS,EACT,UAAW,GAAY,OAAS,GAAe,UAE9C,EACK,CAAA,CAET,GACC,EAAC,IAAD,CAAG,UAAW,GAAY,aAAe,GAAqB,UAC3D,EACC,CAAA,CAEF,GAER,EAAC,EAAD,CACE,GAAI,EACJ,QAAS,EACE,YACX,WAAY,CACV,GAAI,GAAY,kBAAoB,EAAE,CACtC,aACE,GAAY,kBAAkB,cAAgB,GAAkB,CACnE,WAEC,CAAE,QAAO,gBACL,IAAa,IAAA,GAGV,OAAO,KAAK,EAAM,CAAC,OAAS,EACjC,EAAC,EAAD,CACE,WAAY,CACV,cACE,GAAY,eAAiB,GAAuB,CACtD,KAAM,GAAY,kBACnB,UAEA,OAAO,OAAO,EAAM,CAAC,IAAK,GACzB,EAAC,EAAc,KAAf,CAEE,SAAU,EAAK,KACf,SAAU,EAAK,KACf,SAAU,IAAI,EAAK,KAAO,MAAM,QAAQ,EAAE,CAAC,KAC3C,SAAU,EAAK,KACf,IAAK,EAAK,IACV,aAAgB,EAAW,EAAK,KAAK,CACrC,WAAY,CACV,SACE,GAAY,uBACZ,GAA+B,CACjC,aAAc,CACZ,GAAG,GAAY,aACf,aACE,GAAY,cAAc,cAC1B,GAAsB,CACzB,CACF,CACD,CAlBK,EAAK,KAkBV,CACF,CACY,CAAA,CACd,KAjCK,EAmCE,CAAA,CACd,GAAS,EAAC,IAAD,CAAG,UAAW,GAAY,OAAS,GAAe,UAAG,EAAU,CAAA,CACrE"}
1
+ {"version":3,"file":"Dropzone.mjs","names":[],"sources":["../../../../src/components/controls/dropzone/Dropzone.tsx"],"sourcesContent":["import { type ReactNode, useId } from 'react';\n\nimport { cx } from '@mage-ui/styled-system/css';\nimport {\n dropzone,\n dropzoneDescription,\n dropzoneDropzone,\n dropzoneError,\n dropzoneLabel,\n dropzoneLabelWrapper,\n dropzoneRoot,\n dropzoneUploadedFile,\n dropzoneUploadedFiles,\n dropzoneUploadedFilesListItem,\n} from '@mage-ui/styled-system/recipes';\nimport {\n type UploadedFileProps,\n UploadedFiles,\n} from '@/components/data-display';\n\nimport {\n DropzoneBase,\n type DropzoneBaseProps,\n type FileData,\n} from './DropzoneBase';\n\nexport type DropzoneProps = Omit<\n DropzoneBaseProps,\n 'children' | 'classNames'\n> & {\n children?: ReactNode | DropzoneBaseProps['children'];\n label?: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n fileListHeight?: number | string;\n classNames?: {\n dropzone?: string;\n root?: string;\n labelWrapper?: string;\n label?: string;\n description?: string;\n error?: string;\n uploadedFiles?: string;\n uploadedFilesRoot?: string;\n uploadedFilesListItem?: string;\n uploadedFile?: UploadedFileProps['classNames'];\n dropzoneDropzone?: DropzoneBaseProps['classNames'];\n };\n};\n\nexport type { FileData };\n\nexport const Dropzone = ({\n children,\n label,\n description,\n error,\n fileListHeight: _fileListHeight,\n classNames,\n inputId,\n direction = 'default',\n ...baseProps\n}: DropzoneProps) => {\n const generatedId = useId();\n const groupId = inputId ?? generatedId;\n\n return (\n <div\n className={cx(\n classNames?.dropzone ?? dropzone(),\n classNames?.root ?? dropzoneRoot(),\n )}\n >\n {(label || description) && (\n <div className={classNames?.labelWrapper ?? dropzoneLabelWrapper()}>\n {label && (\n <label\n htmlFor={groupId}\n className={classNames?.label ?? dropzoneLabel()}\n >\n {label}\n </label>\n )}\n {description && (\n <p className={classNames?.description ?? dropzoneDescription()}>\n {description}\n </p>\n )}\n </div>\n )}\n <DropzoneBase\n {...baseProps}\n inputId={groupId}\n direction={direction}\n classNames={{\n ...(classNames?.dropzoneDropzone ?? {}),\n dropzoneBase:\n classNames?.dropzoneDropzone?.dropzoneBase ?? dropzoneDropzone(),\n }}\n >\n {({ files, isUploading, removeFile }) => {\n if (children !== undefined) {\n return typeof children === 'function'\n ? children({ files, isUploading, removeFile })\n : children;\n }\n return Object.keys(files).length > 0 ? (\n <UploadedFiles\n classNames={{\n uploadedFiles:\n classNames?.uploadedFiles ?? dropzoneUploadedFiles(),\n root: classNames?.uploadedFilesRoot,\n }}\n >\n {Object.values(files).map((file) => (\n <UploadedFiles.Item\n key={file.name}\n fileName={file.name}\n fileType={file.type}\n fileSize={`${(file.size / 1024).toFixed(1)} KB`}\n fileDate={file.date}\n url={file.url}\n onRemove={() => removeFile(file.name)}\n classNames={{\n listItem:\n classNames?.uploadedFilesListItem ??\n dropzoneUploadedFilesListItem(),\n uploadedFile: {\n ...classNames?.uploadedFile,\n uploadedFile:\n classNames?.uploadedFile?.uploadedFile ??\n dropzoneUploadedFile(),\n },\n }}\n />\n ))}\n </UploadedFiles>\n ) : null;\n }}\n </DropzoneBase>\n {error && <p className={classNames?.error ?? dropzoneError()}>{error}</p>}\n </div>\n );\n};\n"],"mappings":"yhBAoDA,MAAa,GAAY,CACvB,WACA,QACA,cACA,QACA,eAAgB,EAChB,aACA,UACA,YAAY,UACZ,GAAG,KACgB,CACnB,IAAM,EAAc,GAAO,CACrB,EAAU,GAAW,EAE3B,OACE,EAAC,MAAD,CACE,UAAW,EACT,GAAY,UAAY,GAAU,CAClC,GAAY,MAAQ,GAAc,CACnC,UAJH,EAMI,GAAS,IACT,EAAC,MAAD,CAAK,UAAW,GAAY,cAAgB,GAAsB,UAAlE,CACG,GACC,EAAC,QAAD,CACE,QAAS,EACT,UAAW,GAAY,OAAS,GAAe,UAE9C,EACK,CAAA,CAET,GACC,EAAC,IAAD,CAAG,UAAW,GAAY,aAAe,GAAqB,UAC3D,EACC,CAAA,CAEF,GAER,EAAC,EAAD,CACE,GAAI,EACJ,QAAS,EACE,YACX,WAAY,CACV,GAAI,GAAY,kBAAoB,EAAE,CACtC,aACE,GAAY,kBAAkB,cAAgB,GAAkB,CACnE,WAEC,CAAE,QAAO,cAAa,gBAClB,IAAa,IAAA,GAKV,OAAO,KAAK,EAAM,CAAC,OAAS,EACjC,EAAC,EAAD,CACE,WAAY,CACV,cACE,GAAY,eAAiB,GAAuB,CACtD,KAAM,GAAY,kBACnB,UAEA,OAAO,OAAO,EAAM,CAAC,IAAK,GACzB,EAAC,EAAc,KAAf,CAEE,SAAU,EAAK,KACf,SAAU,EAAK,KACf,SAAU,IAAI,EAAK,KAAO,MAAM,QAAQ,EAAE,CAAC,KAC3C,SAAU,EAAK,KACf,IAAK,EAAK,IACV,aAAgB,EAAW,EAAK,KAAK,CACrC,WAAY,CACV,SACE,GAAY,uBACZ,GAA+B,CACjC,aAAc,CACZ,GAAG,GAAY,aACf,aACE,GAAY,cAAc,cAC1B,GAAsB,CACzB,CACF,CACD,CAlBK,EAAK,KAkBV,CACF,CACY,CAAA,CACd,KAnCK,OAAO,GAAa,WACvB,EAAS,CAAE,QAAO,cAAa,aAAY,CAAC,CAC5C,EAmCK,CAAA,CACd,GAAS,EAAC,IAAD,CAAG,UAAW,GAAY,OAAS,GAAe,UAAG,EAAU,CAAA,CACrE"}
@@ -1,57 +1,9 @@
1
+ import { DropzoneS3Texts, S3FileMeta, S3InitBody, S3InitResponse, S3UploadConfig, getFileExtension } from "./use-s3-upload.mjs";
1
2
  import { DropzoneProps } from "./Dropzone.mjs";
2
3
  import * as react_jsx_runtime0 from "react/jsx-runtime";
3
- import { ReactNode } from "react";
4
4
 
5
5
  //#region src/components/controls/dropzone/DropzoneS3.d.ts
6
- /**
7
- * Body of the response returned by the init endpoint. Must at least
8
- * expose a `url` to PUT the file to; may carry any number of extra
9
- * fields that the consumer forwards to the register step (e.g.
10
- * `document_id`, `key`).
11
- */
12
- type S3InitBody = {
13
- url: string;
14
- headers?: Record<string, string | string[]>;
15
- } & Record<string, unknown>;
16
- type S3InitResponse<TBody extends S3InitBody = S3InitBody> = {
17
- body: TBody;
18
- };
19
- /** Metadata derived from the file that body builders frequently need. */
20
- type S3FileMeta = {
21
- /**
22
- * Best-effort MIME type. When `acceptedTypes` is provided and the
23
- * browser-reported `file.type` is empty or unknown, this falls back to
24
- * the MIME mapped from the file extension.
25
- */
26
- mimeType: string; /** Lowercase file extension without the leading dot. */
27
- extension: string;
28
- };
29
- /** All replaceable UI and error strings surfaced by DropzoneS3. */
30
- type DropzoneS3Texts = {
31
- /** Main dropzone heading. */title?: ReactNode; /** Secondary dropzone text. */
32
- subtitle?: ReactNode; /** Small helper text below the subtitle. */
33
- hint?: ReactNode; /** Fallback shown when the init request fails without a parseable body. */
34
- initFailed?: (status: number) => string; /** Fallback shown when the register request fails without a parseable body. */
35
- registerFailed?: (status: number) => string; /** Error when the S3 PUT returns a non-2xx status. */
36
- uploadFailed?: (status: number, statusText: string) => string; /** Error when the network fails during the PUT. */
37
- networkError?: string; /** Error when the PUT is aborted. */
38
- uploadAborted?: string; /** Error when the PUT times out. */
39
- uploadTimedOut?: string;
40
- };
41
- type DropzoneS3Props<TInitBody extends S3InitBody = S3InitBody> = Omit<DropzoneProps, 'uploader' | 'url' | 'accept' | 'title' | 'subtitle' | 'hint'> & {
42
- /** All replaceable UI and error strings. Any field left unset falls back
43
- * to the English default. */
44
- texts?: DropzoneS3Texts;
45
- /**
46
- * Map of file extension → MIME type. When provided, DropzoneS3
47
- * automatically computes the `accept` map (MIME → ['.ext']) used by
48
- * the underlying Mantine / react-dropzone, and uses it to resolve
49
- * `meta.mimeType` per file (covering browsers that report an empty
50
- * `file.type` for some Office formats).
51
- *
52
- * Ignored when `accept` is passed explicitly.
53
- */
54
- acceptedTypes?: Record<string, string>;
6
+ type DropzoneS3Props<TInitBody extends S3InitBody = S3InitBody> = Omit<DropzoneProps, 'uploader' | 'url' | 'accept' | 'title' | 'subtitle' | 'hint'> & S3UploadConfig<TInitBody> & {
55
7
  /**
56
8
  * Explicit accept list forwarded to the underlying Mantine dropzone.
57
9
  * Takes precedence over `acceptedTypes`. Prefer the map shape
@@ -59,37 +11,8 @@ type DropzoneS3Props<TInitBody extends S3InitBody = S3InitBody> = Omit<DropzoneP
59
11
  * plain `string[]` triggers a "Skipped … not a valid MIME type"
60
12
  * warning in react-dropzone v15+.
61
13
  */
62
- accept?: string[] | Record<string, string[]>; /** POST endpoint that returns `{ body: { url, headers?, ...extras } }`. */
63
- initUrl: string; /** Build the init request JSON body from the file and resolved meta. */
64
- buildInitBody: (file: File, meta: S3FileMeta) => Record<string, unknown>;
65
- /**
66
- * Optional post-upload registration step. When set, a POST is sent to
67
- * `register.url` with the body produced by `register.buildBody`.
68
- */
69
- register?: {
70
- url: string;
71
- buildBody: (file: File, init: TInitBody, meta: S3FileMeta) => Record<string, unknown>;
72
- };
73
- /**
74
- * Called on every outbound request (init, register). Use it to supply
75
- * auth/CSRF headers that may rotate during the session.
76
- */
77
- getHeaders?: () => Record<string, string>;
78
- /**
79
- * Customize how an error response is turned into a human-readable
80
- * message. Defaults to common Laravel-style error shapes
81
- * (`errors`, `body.message`, `message`).
82
- */
83
- getErrorMessage?: (res: Response, fallback: string) => Promise<string>;
84
- /**
85
- * URL stored in `FileData.url` after a successful upload. Defaults to
86
- * `init.body.key` when present, falling back to the presigned URL
87
- * stripped of its query string.
88
- */
89
- resolveUploadedUrl?: (init: TInitBody, file: File) => string;
14
+ accept?: string[] | Record<string, string[]>;
90
15
  };
91
- /** Lowercase extension without leading dot, or empty string. */
92
- declare const getFileExtension: (filename: string) => string;
93
16
  declare const DropzoneS3: <TInitBody extends S3InitBody = S3InitBody>({
94
17
  texts,
95
18
  acceptedTypes,
@@ -103,5 +26,5 @@ declare const DropzoneS3: <TInitBody extends S3InitBody = S3InitBody>({
103
26
  ...dropzoneProps
104
27
  }: DropzoneS3Props<TInitBody>) => react_jsx_runtime0.JSX.Element;
105
28
  //#endregion
106
- export { DropzoneS3, DropzoneS3Props, DropzoneS3Texts, S3FileMeta, S3InitBody, S3InitResponse, getFileExtension };
29
+ export { DropzoneS3, DropzoneS3Props };
107
30
  //# sourceMappingURL=DropzoneS3.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropzoneS3.d.mts","names":[],"sources":["../../../../src/components/controls/dropzone/DropzoneS3.tsx"],"mappings":";;;;;;;;AAWA;;;KAAY,UAAA;EACV,GAAA;EACA,OAAA,GAAU,MAAA;AAAA,IACR,MAAA;AAAA,KAEQ,cAAA,eAA6B,UAAA,GAAa,UAAA;EACpD,IAAA,EAAM,KAAA;AAAA;AADR;AAAA,KAKY,UAAA;EALc;;;;;EAWxB,QAAA,UAXyB;EAazB,SAAA;AAAA;;KAIU,eAAA;EAhBC,6BAkBX,KAAA,GAAQ,SAAA,EAdE;EAgBV,QAAA,GAAW,SAAA;EAEX,IAAA,GAAO,SAAA,EAVE;EAYT,UAAA,IAAc,MAAA,qBARW;EAUzB,cAAA,IAAkB,MAAA,qBARV;EAUR,YAAA,IAAgB,MAAA,UAAgB,UAAA,qBANzB;EAQP,YAAA,WARgB;EAUhB,aAAA,WAdQ;EAgBR,cAAA;AAAA;AAAA,KAeU,eAAA,mBAAkC,UAAA,GAAa,UAAA,IAAc,IAAA,CACvE,aAAA;EA5BO;;EAiCP,KAAA,GAAQ,eAAA;EA7BR;;;;;;;;;EAuCA,aAAA,GAAgB,MAAA;EAhBN;;;;;;;EAwBV,MAAA,cAAoB,MAAA,oBARJ;EAUhB,OAAA,UAEsB;EAAtB,aAAA,GAAgB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,KAAe,MAAA;EAAA;;;;EAKjD,QAAA;IACE,GAAA;IACA,SAAA,GACE,IAAA,EAAM,IAAA,EACN,IAAA,EAAM,SAAA,EACN,IAAA,EAAM,UAAA,KACH,MAAA;EAAA;EAkBqB;;;;EAZ5B,UAAA,SAAmB,MAAA;EA7CyB;;;;;EAmD5C,eAAA,IAAmB,GAAA,EAAK,QAAA,EAAU,QAAA,aAAqB,OAAA;EAnCvD;;;;;EAyCA,kBAAA,IAAsB,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,IAAA;AAAA;;cA+ElC,gBAAA,GAAoB,QAAA;AAAA,cAiDpB,UAAA,qBAAgC,UAAA,GAAa,UAAA;EAAY,KAAA;EAAA,aAAA;EAAA,MAAA;EAAA,OAAA;EAAA,aAAA;EAAA,QAAA;EAAA,UAAA;EAAA,eAAA;EAAA,kBAAA;EAAA,GAAA;AAAA,GAWnE,eAAA,CAAgB,SAAA,MAAU,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"DropzoneS3.d.mts","names":[],"sources":["../../../../src/components/controls/dropzone/DropzoneS3.tsx"],"mappings":";;;;;KAiBY,eAAA,mBAAkC,UAAA,GAAa,UAAA,IAAc,IAAA,CACvE,aAAA,mEAGA,cAAA,CAAe,SAAA;EAJL;;;;;;;EAYR,MAAA,cAAoB,MAAA;AAAA;AAAA,cAGX,UAAA,qBAAgC,UAAA,GAAa,UAAA;EAAY,KAAA;EAAA,aAAA;EAAA,MAAA;EAAA,OAAA;EAAA,aAAA;EAAA,QAAA;EAAA,UAAA;EAAA,eAAA;EAAA,kBAAA;EAAA,GAAA;AAAA,GAWnE,eAAA,CAAgB,SAAA,MAAU,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,2 +1,2 @@
1
- import{Dropzone as e}from"./Dropzone.mjs";import{jsx as t}from"react/jsx-runtime";const n={initFailed:e=>`Failed to request upload URL (${e})`,registerFailed:e=>`Failed to register file (${e})`,uploadFailed:(e,t)=>`Upload failed (${e} ${t})`,networkError:`Network error during direct upload`,uploadAborted:`Upload aborted`,uploadTimedOut:`Upload timed out`},r=async(e,t)=>{try{let n=await e.clone().json();if(n.errors){let e=Object.values(n.errors)[0];if(e&&e.length>0)return e[0]}return n.body?.message??n.body?.text??n.message??t}catch{return t}},i=(e,t,n,r,i)=>new Promise((a,o)=>{let s=new XMLHttpRequest;s.upload.addEventListener(`progress`,e=>{e.lengthComputable&&r(Math.round(e.loaded/e.total*100))}),s.addEventListener(`load`,()=>{s.status>=200&&s.status<300?a():o(Error(i.uploadFailed(s.status,s.statusText)))}),s.addEventListener(`error`,()=>o(Error(i.networkError))),s.addEventListener(`abort`,()=>o(Error(i.uploadAborted))),s.addEventListener(`timeout`,()=>o(Error(i.uploadTimedOut))),s.open(`PUT`,e);for(let[e,n]of Object.entries(t)){let t=e.toLowerCase();if(!(t===`host`||t===`content-length`))try{s.setRequestHeader(e,n)}catch{}}s.send(n)}),a=e=>{let t={};if(!e)return t;for(let[n,r]of Object.entries(e))t[n]=Array.isArray(r)?r.join(`,`):String(r);return t},o=e=>{let t=e.lastIndexOf(`.`);return t>=0?e.slice(t+1).toLowerCase():``},s=e=>{if(!e)return;let t={};for(let[n,r]of Object.entries(e)){let e=`.${n}`,i=t[r];i?i.includes(e)||i.push(e):t[r]=[e]}return t},c=(e,t)=>{let n=o(e.name);if(!t)return{mimeType:e.type,extension:n};let r=Object.values(t);return e.type&&r.includes(e.type)?{mimeType:e.type,extension:n}:{mimeType:t[n]??e.type,extension:n}},l=({texts:o,acceptedTypes:l,accept:u,initUrl:d,buildInitBody:f,register:p,getHeaders:m,getErrorMessage:h=r,resolveUploadedUrl:g,..._})=>{let v=u??s(l),y={...n,...o},b=async(e,{onProgress:t})=>{let n=()=>({"Content-Type":`application/json`,Accept:`application/json`,...m?.()??{}}),r=c(e,l),o=await fetch(d,{method:`POST`,headers:n(),body:JSON.stringify(f(e,r))});if(!o.ok)throw Error(await h(o,y.initFailed(o.status)));let s=await o.json(),{url:u,headers:_}=s.body;if(await i(u,a(_),e,n=>t?.({loaded:0,total:e.size,percentage:n}),y),p){let t=await fetch(p.url,{method:`POST`,headers:n(),body:JSON.stringify(p.buildBody(e,s.body,r))});if(!t.ok)throw Error(await h(t,y.registerFailed(t.status)))}return{body:{url:g?.(s.body,e)??(typeof s.body.key==`string`?s.body.key:u.split(`?`)[0])}}};return t(e,{..._,title:o?.title,subtitle:o?.subtitle,hint:o?.hint,accept:v,uploader:b})};export{l as DropzoneS3,o as getFileExtension};
1
+ import{buildAcceptMap as e,defaultGetErrorMessage as t,useS3Upload as n}from"./use-s3-upload.mjs";import{Dropzone as r}from"./Dropzone.mjs";import{jsx as i}from"react/jsx-runtime";const a=({texts:a,acceptedTypes:o,accept:s,initUrl:c,buildInitBody:l,register:u,getHeaders:d,getErrorMessage:f=t,resolveUploadedUrl:p,...m})=>{let h=s??e(o),{upload:g}=n({initUrl:c,buildInitBody:l,register:u,getHeaders:d,getErrorMessage:f,resolveUploadedUrl:p,acceptedTypes:o,texts:a}),_=async(e,{onProgress:t})=>({body:{url:await g(e,n=>t?.({loaded:0,total:e.size,percentage:n}))}});return i(r,{...m,title:a?.title,subtitle:a?.subtitle,hint:a?.hint,accept:h,uploader:_})};export{a as DropzoneS3};
2
2
  //# sourceMappingURL=DropzoneS3.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropzoneS3.mjs","names":[],"sources":["../../../../src/components/controls/dropzone/DropzoneS3.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Dropzone, type DropzoneProps } from './Dropzone';\nimport type { Uploader } from './upload-service';\n\n/**\n * Body of the response returned by the init endpoint. Must at least\n * expose a `url` to PUT the file to; may carry any number of extra\n * fields that the consumer forwards to the register step (e.g.\n * `document_id`, `key`).\n */\nexport type S3InitBody = {\n url: string;\n headers?: Record<string, string | string[]>;\n} & Record<string, unknown>;\n\nexport type S3InitResponse<TBody extends S3InitBody = S3InitBody> = {\n body: TBody;\n};\n\n/** Metadata derived from the file that body builders frequently need. */\nexport type S3FileMeta = {\n /**\n * Best-effort MIME type. When `acceptedTypes` is provided and the\n * browser-reported `file.type` is empty or unknown, this falls back to\n * the MIME mapped from the file extension.\n */\n mimeType: string;\n /** Lowercase file extension without the leading dot. */\n extension: string;\n};\n\n/** All replaceable UI and error strings surfaced by DropzoneS3. */\nexport type DropzoneS3Texts = {\n /** Main dropzone heading. */\n title?: ReactNode;\n /** Secondary dropzone text. */\n subtitle?: ReactNode;\n /** Small helper text below the subtitle. */\n hint?: ReactNode;\n /** Fallback shown when the init request fails without a parseable body. */\n initFailed?: (status: number) => string;\n /** Fallback shown when the register request fails without a parseable body. */\n registerFailed?: (status: number) => string;\n /** Error when the S3 PUT returns a non-2xx status. */\n uploadFailed?: (status: number, statusText: string) => string;\n /** Error when the network fails during the PUT. */\n networkError?: string;\n /** Error when the PUT is aborted. */\n uploadAborted?: string;\n /** Error when the PUT times out. */\n uploadTimedOut?: string;\n};\n\nconst DEFAULT_TEXTS = {\n initFailed: (status: number): string =>\n `Failed to request upload URL (${status})`,\n registerFailed: (status: number): string =>\n `Failed to register file (${status})`,\n uploadFailed: (status: number, statusText: string): string =>\n `Upload failed (${status} ${statusText})`,\n networkError: 'Network error during direct upload',\n uploadAborted: 'Upload aborted',\n uploadTimedOut: 'Upload timed out',\n} as const;\n\nexport type DropzoneS3Props<TInitBody extends S3InitBody = S3InitBody> = Omit<\n DropzoneProps,\n 'uploader' | 'url' | 'accept' | 'title' | 'subtitle' | 'hint'\n> & {\n /** All replaceable UI and error strings. Any field left unset falls back\n * to the English default. */\n texts?: DropzoneS3Texts;\n /**\n * Map of file extension → MIME type. When provided, DropzoneS3\n * automatically computes the `accept` map (MIME → ['.ext']) used by\n * the underlying Mantine / react-dropzone, and uses it to resolve\n * `meta.mimeType` per file (covering browsers that report an empty\n * `file.type` for some Office formats).\n *\n * Ignored when `accept` is passed explicitly.\n */\n acceptedTypes?: Record<string, string>;\n /**\n * Explicit accept list forwarded to the underlying Mantine dropzone.\n * Takes precedence over `acceptedTypes`. Prefer the map shape\n * `{ [mimeType]: ['.ext', ...] }` — passing a `.ext` entry inside a\n * plain `string[]` triggers a \"Skipped … not a valid MIME type\"\n * warning in react-dropzone v15+.\n */\n accept?: string[] | Record<string, string[]>;\n /** POST endpoint that returns `{ body: { url, headers?, ...extras } }`. */\n initUrl: string;\n /** Build the init request JSON body from the file and resolved meta. */\n buildInitBody: (file: File, meta: S3FileMeta) => Record<string, unknown>;\n /**\n * Optional post-upload registration step. When set, a POST is sent to\n * `register.url` with the body produced by `register.buildBody`.\n */\n register?: {\n url: string;\n buildBody: (\n file: File,\n init: TInitBody,\n meta: S3FileMeta,\n ) => Record<string, unknown>;\n };\n /**\n * Called on every outbound request (init, register). Use it to supply\n * auth/CSRF headers that may rotate during the session.\n */\n getHeaders?: () => Record<string, string>;\n /**\n * Customize how an error response is turned into a human-readable\n * message. Defaults to common Laravel-style error shapes\n * (`errors`, `body.message`, `message`).\n */\n getErrorMessage?: (res: Response, fallback: string) => Promise<string>;\n /**\n * URL stored in `FileData.url` after a successful upload. Defaults to\n * `init.body.key` when present, falling back to the presigned URL\n * stripped of its query string.\n */\n resolveUploadedUrl?: (init: TInitBody, file: File) => string;\n};\n\nconst defaultGetErrorMessage = async (\n res: Response,\n fallback: string,\n): Promise<string> => {\n try {\n const data = (await res.clone().json()) as {\n message?: string;\n body?: { message?: string; text?: string };\n errors?: Record<string, string[]>;\n };\n if (data.errors) {\n const first = Object.values(data.errors)[0];\n if (first && first.length > 0) return first[0];\n }\n return data.body?.message ?? data.body?.text ?? data.message ?? fallback;\n } catch {\n return fallback;\n }\n};\n\ntype PutTexts = {\n uploadFailed: (status: number, statusText: string) => string;\n networkError: string;\n uploadAborted: string;\n uploadTimedOut: string;\n};\n\nconst putWithProgress = (\n url: string,\n headers: Record<string, string>,\n file: File,\n onProgress: (percentage: number) => void,\n texts: PutTexts,\n): Promise<void> => {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) {\n onProgress(Math.round((e.loaded / e.total) * 100));\n }\n });\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) resolve();\n else reject(new Error(texts.uploadFailed(xhr.status, xhr.statusText)));\n });\n xhr.addEventListener('error', () => reject(new Error(texts.networkError)));\n xhr.addEventListener('abort', () => reject(new Error(texts.uploadAborted)));\n xhr.addEventListener('timeout', () =>\n reject(new Error(texts.uploadTimedOut)),\n );\n xhr.open('PUT', url);\n for (const [k, v] of Object.entries(headers)) {\n const lk = k.toLowerCase();\n if (lk === 'host' || lk === 'content-length') continue;\n try {\n xhr.setRequestHeader(k, v);\n } catch {\n // Some headers are blocked by the browser — skip silently.\n }\n }\n xhr.send(file);\n });\n};\n\nconst flattenHeaders = (\n headers: Record<string, string | string[]> | undefined,\n): Record<string, string> => {\n const out: Record<string, string> = {};\n if (!headers) return out;\n for (const [k, v] of Object.entries(headers)) {\n out[k] = Array.isArray(v) ? v.join(',') : String(v);\n }\n return out;\n};\n\n/** Lowercase extension without leading dot, or empty string. */\nexport const getFileExtension = (filename: string): string => {\n const dot = filename.lastIndexOf('.');\n return dot >= 0 ? filename.slice(dot + 1).toLowerCase() : '';\n};\n\n/**\n * Build the `accept` map in the shape react-dropzone v15+ expects:\n * `{ [mimeType]: ['.ext', ...] }`. Multiple extensions that share a\n * MIME type (e.g. xls + xlsx in some legacy mappings) are grouped\n * under the same key.\n *\n * The previous flat-array shape (`[...mimes, ...'.exts']`) caused\n * react-dropzone to log `Skipped \".xlsx\" because it is not a valid\n * MIME type` and dropped the extension from the `<input accept>`\n * attribute, breaking selection on browsers that report an empty\n * `file.type` for Office formats.\n */\nconst buildAcceptMap = (\n acceptedTypes: Record<string, string> | undefined,\n): Record<string, string[]> | undefined => {\n if (!acceptedTypes) return undefined;\n const map: Record<string, string[]> = {};\n for (const [ext, mime] of Object.entries(acceptedTypes)) {\n const dotted = `.${ext}`;\n const list = map[mime];\n if (list) {\n if (!list.includes(dotted)) list.push(dotted);\n } else {\n map[mime] = [dotted];\n }\n }\n return map;\n};\n\nconst resolveMeta = (\n file: File,\n acceptedTypes: Record<string, string> | undefined,\n): S3FileMeta => {\n const extension = getFileExtension(file.name);\n if (!acceptedTypes) {\n return { mimeType: file.type, extension };\n }\n const mimeList = Object.values(acceptedTypes);\n if (file.type && mimeList.includes(file.type)) {\n return { mimeType: file.type, extension };\n }\n return { mimeType: acceptedTypes[extension] ?? file.type, extension };\n};\n\nexport const DropzoneS3 = <TInitBody extends S3InitBody = S3InitBody>({\n texts,\n acceptedTypes,\n accept,\n initUrl,\n buildInitBody,\n register,\n getHeaders,\n getErrorMessage = defaultGetErrorMessage,\n resolveUploadedUrl,\n ...dropzoneProps\n}: DropzoneS3Props<TInitBody>) => {\n const acceptList = accept ?? buildAcceptMap(acceptedTypes);\n const t = { ...DEFAULT_TEXTS, ...texts };\n\n const uploader: Uploader = async (file, { onProgress }) => {\n const jsonHeaders = (): Record<string, string> => ({\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(getHeaders?.() ?? {}),\n });\n const meta = resolveMeta(file, acceptedTypes);\n\n // 1. init — request a presigned URL.\n const initRes = await fetch(initUrl, {\n method: 'POST',\n headers: jsonHeaders(),\n body: JSON.stringify(buildInitBody(file, meta)),\n });\n if (!initRes.ok) {\n throw new Error(\n await getErrorMessage(initRes, t.initFailed(initRes.status)),\n );\n }\n const init = (await initRes.json()) as S3InitResponse<TInitBody>;\n const { url, headers: s3Headers } = init.body;\n\n // 2. direct upload to S3.\n await putWithProgress(\n url,\n flattenHeaders(s3Headers),\n file,\n (p) => onProgress?.({ loaded: 0, total: file.size, percentage: p }),\n t,\n );\n\n // 3. register (optional) — persist metadata on the app backend.\n if (register) {\n const regRes = await fetch(register.url, {\n method: 'POST',\n headers: jsonHeaders(),\n body: JSON.stringify(register.buildBody(file, init.body, meta)),\n });\n if (!regRes.ok) {\n throw new Error(\n await getErrorMessage(regRes, t.registerFailed(regRes.status)),\n );\n }\n }\n\n const storedUrl =\n resolveUploadedUrl?.(init.body, file) ??\n (typeof init.body.key === 'string' ? init.body.key : url.split('?')[0]);\n return { body: { url: storedUrl } };\n };\n\n return (\n <Dropzone\n {...dropzoneProps}\n title={texts?.title}\n subtitle={texts?.subtitle}\n hint={texts?.hint}\n accept={acceptList}\n uploader={uploader}\n />\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"DropzoneS3.mjs","names":[],"sources":["../../../../src/components/controls/dropzone/DropzoneS3.tsx"],"sourcesContent":["import { Dropzone, type DropzoneProps } from './Dropzone';\nimport type { Uploader } from './upload-service';\nimport {\n buildAcceptMap,\n type DropzoneS3Texts,\n defaultGetErrorMessage,\n getFileExtension,\n type S3FileMeta,\n type S3InitBody,\n type S3InitResponse,\n type S3UploadConfig,\n useS3Upload,\n} from './use-s3-upload';\n\nexport type { DropzoneS3Texts, S3FileMeta, S3InitBody, S3InitResponse };\nexport { getFileExtension };\n\nexport type DropzoneS3Props<TInitBody extends S3InitBody = S3InitBody> = Omit<\n DropzoneProps,\n 'uploader' | 'url' | 'accept' | 'title' | 'subtitle' | 'hint'\n> &\n S3UploadConfig<TInitBody> & {\n /**\n * Explicit accept list forwarded to the underlying Mantine dropzone.\n * Takes precedence over `acceptedTypes`. Prefer the map shape\n * `{ [mimeType]: ['.ext', ...] }` — passing a `.ext` entry inside a\n * plain `string[]` triggers a \"Skipped … not a valid MIME type\"\n * warning in react-dropzone v15+.\n */\n accept?: string[] | Record<string, string[]>;\n };\n\nexport const DropzoneS3 = <TInitBody extends S3InitBody = S3InitBody>({\n texts,\n acceptedTypes,\n accept,\n initUrl,\n buildInitBody,\n register,\n getHeaders,\n getErrorMessage = defaultGetErrorMessage,\n resolveUploadedUrl,\n ...dropzoneProps\n}: DropzoneS3Props<TInitBody>) => {\n const acceptList = accept ?? buildAcceptMap(acceptedTypes);\n const { upload } = useS3Upload<TInitBody>({\n initUrl,\n buildInitBody,\n register,\n getHeaders,\n getErrorMessage,\n resolveUploadedUrl,\n acceptedTypes,\n texts,\n });\n\n const uploader: Uploader = async (file, { onProgress }) => {\n const url = await upload(file, (p) =>\n onProgress?.({ loaded: 0, total: file.size, percentage: p }),\n );\n return { body: { url } };\n };\n\n return (\n <Dropzone\n {...dropzoneProps}\n title={texts?.title}\n subtitle={texts?.subtitle}\n hint={texts?.hint}\n accept={acceptList}\n uploader={uploader}\n />\n );\n};\n"],"mappings":"oLAgCA,MAAa,GAAyD,CACpE,QACA,gBACA,SACA,UACA,gBACA,WACA,aACA,kBAAkB,EAClB,qBACA,GAAG,KAC6B,CAChC,IAAM,EAAa,GAAU,EAAe,EAAc,CACpD,CAAE,UAAW,EAAuB,CACxC,UACA,gBACA,WACA,aACA,kBACA,qBACA,gBACA,QACD,CAAC,CAEI,EAAqB,MAAO,EAAM,CAAE,iBAIjC,CAAE,KAAM,CAAE,IAHL,MAAM,EAAO,EAAO,GAC9B,IAAa,CAAE,OAAQ,EAAG,MAAO,EAAK,KAAM,WAAY,EAAG,CAAC,CAC7D,CACqB,CAAE,EAG1B,OACE,EAAC,EAAD,CACE,GAAI,EACJ,MAAO,GAAO,MACd,SAAU,GAAO,SACjB,KAAM,GAAO,KACb,OAAQ,EACE,WACV,CAAA"}
@@ -1,19 +1,14 @@
1
- import { IconProps } from "../../data-display/icons/icon/Icon.mjs";
1
+ import { IconProps } from "../../../data-display/icons/icon/Icon.mjs";
2
+ import { AvatarDropzoneClassNames } from "./AvatarDropzoneBase.mjs";
2
3
  import * as react_jsx_runtime0 from "react/jsx-runtime";
3
4
 
4
- //#region src/components/controls/avatar-dropzone/AvatarDropzone.d.ts
5
+ //#region src/components/controls/dropzone/avatar/AvatarDropzone.d.ts
5
6
  type AvatarDropzoneProps = {
6
7
  value?: string;
7
8
  onChange?: (file: File) => void;
8
9
  maxSize?: number;
9
- classNames?: {
10
- dropzone?: string;
11
- root?: string;
12
- inner?: string;
13
- image?: string;
14
- overlay?: string;
15
- overlayIconSlot?: string;
16
- iconSlot?: string;
10
+ disabled?: boolean;
11
+ classNames?: Omit<AvatarDropzoneClassNames, 'loader'> & {
17
12
  icon?: IconProps['classNames'];
18
13
  };
19
14
  };
@@ -21,6 +16,7 @@ declare const AvatarDropzone: ({
21
16
  value,
22
17
  onChange,
23
18
  maxSize,
19
+ disabled,
24
20
  classNames
25
21
  }: AvatarDropzoneProps) => react_jsx_runtime0.JSX.Element;
26
22
  //#endregion
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarDropzone.d.mts","names":[],"sources":["../../../../../src/components/controls/dropzone/avatar/AvatarDropzone.tsx"],"mappings":";;;;;KASY,mBAAA;EACV,KAAA;EACA,QAAA,IAAY,IAAA,EAAM,IAAA;EAClB,OAAA;EACA,QAAA;EACA,UAAA,GAAa,IAAA,CAAK,wBAAA;IAChB,IAAA,GAAO,SAAA;EAAA;AAAA;AAAA,cAIE,cAAA;EAAkB,KAAA;EAAA,QAAA;EAAA,OAAA;EAAA,QAAA;EAAA;AAAA,GAM5B,mBAAA,KAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,2 @@
1
+ import{AvatarDropzoneBase as e}from"./AvatarDropzoneBase.mjs";import{jsx as t}from"react/jsx-runtime";import{useCallback as n,useState as r}from"react";const i=({value:i,onChange:a,maxSize:o,disabled:s=!1,classNames:c})=>{let[l,u]=r(i??null);return t(e,{onDrop:n(e=>{let t=e[0];t&&(u(URL.createObjectURL(t)),a?.(t))},[a]),value:l,maxSize:o,disabled:s,classNames:c})};export{i as AvatarDropzone};
2
+ //# sourceMappingURL=AvatarDropzone.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarDropzone.mjs","names":[],"sources":["../../../../../src/components/controls/dropzone/avatar/AvatarDropzone.tsx"],"sourcesContent":["import { useCallback, useState } from 'react';\n\nimport type { IconProps } from '@/components/data-display';\n\nimport {\n AvatarDropzoneBase,\n type AvatarDropzoneClassNames,\n} from './AvatarDropzoneBase';\n\nexport type AvatarDropzoneProps = {\n value?: string;\n onChange?: (file: File) => void;\n maxSize?: number;\n disabled?: boolean;\n classNames?: Omit<AvatarDropzoneClassNames, 'loader'> & {\n icon?: IconProps['classNames'];\n };\n};\n\nexport const AvatarDropzone = ({\n value,\n onChange,\n maxSize,\n disabled = false,\n classNames,\n}: AvatarDropzoneProps) => {\n const [preview, setPreview] = useState<string | null>(value ?? null);\n\n const handleDrop = useCallback(\n (files: File[]) => {\n const file = files[0];\n if (!file) return;\n const url = URL.createObjectURL(file);\n setPreview(url);\n onChange?.(file);\n },\n [onChange],\n );\n\n return (\n <AvatarDropzoneBase\n onDrop={handleDrop}\n value={preview}\n maxSize={maxSize}\n disabled={disabled}\n classNames={classNames}\n />\n );\n};\n"],"mappings":"wJAmBA,MAAa,GAAkB,CAC7B,QACA,WACA,UACA,WAAW,GACX,gBACyB,CACzB,GAAM,CAAC,EAAS,GAAc,EAAwB,GAAS,KAAK,CAapE,OACE,EAAC,EAAD,CACE,OAbe,EAChB,GAAkB,CACjB,IAAM,EAAO,EAAM,GACd,IAEL,EADY,IAAI,gBAAgB,EAAK,CACtB,CACf,IAAW,EAAK,GAElB,CAAC,EAAS,CACX,CAKG,MAAO,EACE,UACC,WACE,aACZ,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { IconProps } from "../../../data-display/icons/icon/Icon.mjs";
2
+ import { LoaderOvalProps } from "../../../data-display/loader-oval/LoaderOval.mjs";
3
+ //#region src/components/controls/dropzone/avatar/AvatarDropzoneBase.d.ts
4
+ type AvatarDropzoneClassNames = {
5
+ dropzone?: string;
6
+ root?: string;
7
+ inner?: string;
8
+ image?: string;
9
+ overlay?: string;
10
+ overlayIconSlot?: string;
11
+ iconSlot?: string;
12
+ icon?: IconProps['classNames'];
13
+ loader?: LoaderOvalProps['classNames'];
14
+ };
15
+ //#endregion
16
+ export { AvatarDropzoneClassNames };
17
+ //# sourceMappingURL=AvatarDropzoneBase.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarDropzoneBase.d.mts","names":[],"sources":["../../../../../src/components/controls/dropzone/avatar/AvatarDropzoneBase.tsx"],"mappings":";;;KAsBY,wBAAA;EACV,QAAA;EACA,IAAA;EACA,KAAA;EACA,KAAA;EACA,OAAA;EACA,eAAA;EACA,QAAA;EACA,IAAA,GAAO,SAAA;EACP,MAAA,GAAS,eAAA;AAAA"}
@@ -0,0 +1,2 @@
1
+ import{Icon as e}from"../../../data-display/icons/icon/Icon.mjs";import{LoaderOval as t}from"../../../data-display/loader-oval/LoaderOval.mjs";import{cx as n}from"@mage-ui/styled-system/css";import{avatarDropzone as r,avatarDropzoneIcon as i,avatarDropzoneIconSlot as a,avatarDropzoneImage as o,avatarDropzoneInner as s,avatarDropzoneOverlay as c,avatarDropzoneOverlayIconSlot as l,avatarDropzoneRoot as u}from"@mage-ui/styled-system/recipes";import{Fragment as d,jsx as f,jsxs as p}from"react/jsx-runtime";import{Dropzone as m,IMAGE_MIME_TYPE as h}from"@mantine/dropzone";const g=({value:g,maxSize:_,disabled:v=!1,isUploading:y=!1,onDrop:b,classNames:x})=>p(m,{onDrop:b,accept:h,maxFiles:1,maxSize:_,disabled:v||y,classNames:{root:n(x?.dropzone??r(),x?.root??u(),`group`),inner:x?.inner??s()},children:[f(m.Idle,{children:y?f(`div`,{className:x?.iconSlot??a(),children:f(t,{classNames:x?.loader})}):g?p(d,{children:[f(`img`,{src:g,alt:`Avatar`,className:x?.image??o()}),f(`div`,{className:x?.overlay??c()}),f(`div`,{className:x?.overlayIconSlot??l(),children:f(e,{name:`mage-avatar-dropzone-camera-plus`,path:`/icons/sprite-mage.svg`,classNames:{icon:x?.icon?.icon??i()}})})]}):f(`div`,{className:x?.iconSlot??a(),children:f(e,{name:`mage-avatar-dropzone-camera-plus`,path:`/icons/sprite-mage.svg`,classNames:{icon:x?.icon?.icon??i()}})})}),f(m.Accept,{children:f(`div`,{className:x?.iconSlot??a(),children:f(e,{name:`mage-dropzone-thumbs-up`,path:`/icons/sprite-mage.svg`,classNames:{icon:x?.icon?.icon??i()}})})}),f(m.Reject,{children:f(`div`,{className:x?.iconSlot??a(),children:f(e,{name:`mage-dropzone-thumbs-down`,path:`/icons/sprite-mage.svg`,classNames:{icon:x?.icon?.icon??i()}})})})]});export{g as AvatarDropzoneBase};
2
+ //# sourceMappingURL=AvatarDropzoneBase.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarDropzoneBase.mjs","names":["MantineDropzone"],"sources":["../../../../../src/components/controls/dropzone/avatar/AvatarDropzoneBase.tsx"],"sourcesContent":["import { cx } from '@mage-ui/styled-system/css';\nimport {\n avatarDropzone,\n avatarDropzoneIcon,\n avatarDropzoneIconSlot,\n avatarDropzoneImage,\n avatarDropzoneInner,\n avatarDropzoneOverlay,\n avatarDropzoneOverlayIconSlot,\n avatarDropzoneRoot,\n} from '@mage-ui/styled-system/recipes';\nimport {\n IMAGE_MIME_TYPE,\n Dropzone as MantineDropzone,\n} from '@mantine/dropzone';\nimport {\n Icon,\n type IconProps,\n LoaderOval,\n type LoaderOvalProps,\n} from '@/components/data-display';\n\nexport type AvatarDropzoneClassNames = {\n dropzone?: string;\n root?: string;\n inner?: string;\n image?: string;\n overlay?: string;\n overlayIconSlot?: string;\n iconSlot?: string;\n icon?: IconProps['classNames'];\n loader?: LoaderOvalProps['classNames'];\n};\n\ntype AvatarDropzoneBaseProps = {\n value?: string | null;\n maxSize?: number;\n disabled?: boolean;\n isUploading?: boolean;\n onDrop: (files: File[]) => void | Promise<void>;\n classNames?: AvatarDropzoneClassNames;\n};\n\nexport const AvatarDropzoneBase = ({\n value,\n maxSize,\n disabled = false,\n isUploading = false,\n onDrop,\n classNames,\n}: AvatarDropzoneBaseProps) => {\n return (\n <MantineDropzone\n onDrop={onDrop}\n accept={IMAGE_MIME_TYPE}\n maxFiles={1}\n maxSize={maxSize}\n disabled={disabled || isUploading}\n classNames={{\n root: cx(\n classNames?.dropzone ?? avatarDropzone(),\n classNames?.root ?? avatarDropzoneRoot(),\n 'group',\n ),\n inner: classNames?.inner ?? avatarDropzoneInner(),\n }}\n >\n <MantineDropzone.Idle>\n {isUploading ? (\n <div className={classNames?.iconSlot ?? avatarDropzoneIconSlot()}>\n <LoaderOval classNames={classNames?.loader} />\n </div>\n ) : value ? (\n <>\n <img\n src={value}\n alt='Avatar'\n className={classNames?.image ?? avatarDropzoneImage()}\n />\n <div className={classNames?.overlay ?? avatarDropzoneOverlay()} />\n <div\n className={\n classNames?.overlayIconSlot ?? avatarDropzoneOverlayIconSlot()\n }\n >\n <Icon\n name='mage-avatar-dropzone-camera-plus'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.icon?.icon ?? avatarDropzoneIcon(),\n }}\n />\n </div>\n </>\n ) : (\n <div className={classNames?.iconSlot ?? avatarDropzoneIconSlot()}>\n <Icon\n name='mage-avatar-dropzone-camera-plus'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.icon?.icon ?? avatarDropzoneIcon(),\n }}\n />\n </div>\n )}\n </MantineDropzone.Idle>\n <MantineDropzone.Accept>\n <div className={classNames?.iconSlot ?? avatarDropzoneIconSlot()}>\n <Icon\n name='mage-dropzone-thumbs-up'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.icon?.icon ?? avatarDropzoneIcon(),\n }}\n />\n </div>\n </MantineDropzone.Accept>\n <MantineDropzone.Reject>\n <div className={classNames?.iconSlot ?? avatarDropzoneIconSlot()}>\n <Icon\n name='mage-dropzone-thumbs-down'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.icon?.icon ?? avatarDropzoneIcon(),\n }}\n />\n </div>\n </MantineDropzone.Reject>\n </MantineDropzone>\n );\n};\n"],"mappings":"6jBA2CA,MAAa,GAAsB,CACjC,QACA,UACA,WAAW,GACX,cAAc,GACd,SACA,gBAGE,EAACA,EAAD,CACU,SACR,OAAQ,EACR,SAAU,EACD,UACT,SAAU,GAAY,EACtB,WAAY,CACV,KAAM,EACJ,GAAY,UAAY,GAAgB,CACxC,GAAY,MAAQ,GAAoB,CACxC,QACD,CACD,MAAO,GAAY,OAAS,GAAqB,CAClD,UAbH,CAeE,EAACA,EAAgB,KAAjB,CAAA,SACG,EACC,EAAC,MAAD,CAAK,UAAW,GAAY,UAAY,GAAwB,UAC9D,EAAC,EAAD,CAAY,WAAY,GAAY,OAAU,CAAA,CAC1C,CAAA,CACJ,EACF,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,MAAD,CACE,IAAK,EACL,IAAI,SACJ,UAAW,GAAY,OAAS,GAAqB,CACrD,CAAA,CACF,EAAC,MAAD,CAAK,UAAW,GAAY,SAAW,GAAuB,CAAI,CAAA,CAClE,EAAC,MAAD,CACE,UACE,GAAY,iBAAmB,GAA+B,UAGhE,EAAC,EAAD,CACE,KAAK,mCACL,KAAK,yBACL,WAAY,CACV,KAAM,GAAY,MAAM,MAAQ,GAAoB,CACrD,CACD,CAAA,CACE,CAAA,CACL,CAAA,CAAA,CAEH,EAAC,MAAD,CAAK,UAAW,GAAY,UAAY,GAAwB,UAC9D,EAAC,EAAD,CACE,KAAK,mCACL,KAAK,yBACL,WAAY,CACV,KAAM,GAAY,MAAM,MAAQ,GAAoB,CACrD,CACD,CAAA,CACE,CAAA,CAEa,CAAA,CACvB,EAACA,EAAgB,OAAjB,CAAA,SACE,EAAC,MAAD,CAAK,UAAW,GAAY,UAAY,GAAwB,UAC9D,EAAC,EAAD,CACE,KAAK,0BACL,KAAK,yBACL,WAAY,CACV,KAAM,GAAY,MAAM,MAAQ,GAAoB,CACrD,CACD,CAAA,CACE,CAAA,CACiB,CAAA,CACzB,EAACA,EAAgB,OAAjB,CAAA,SACE,EAAC,MAAD,CAAK,UAAW,GAAY,UAAY,GAAwB,UAC9D,EAAC,EAAD,CACE,KAAK,4BACL,KAAK,yBACL,WAAY,CACV,KAAM,GAAY,MAAM,MAAQ,GAAoB,CACrD,CACD,CAAA,CACE,CAAA,CACiB,CAAA,CACT"}
@@ -0,0 +1,37 @@
1
+ import { IconProps } from "../../../data-display/icons/icon/Icon.mjs";
2
+ import { LoaderOvalProps } from "../../../data-display/loader-oval/LoaderOval.mjs";
3
+ import { AvatarDropzoneClassNames } from "./AvatarDropzoneBase.mjs";
4
+ import { S3InitBody, S3UploadConfig } from "../use-s3-upload.mjs";
5
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
6
+
7
+ //#region src/components/controls/dropzone/avatar/AvatarDropzoneS3.d.ts
8
+ type AvatarDropzoneS3Props<TInitBody extends S3InitBody = S3InitBody> = S3UploadConfig<TInitBody> & {
9
+ value?: string;
10
+ onChange?: (url: string) => void;
11
+ onError?: (message: string) => void;
12
+ maxSize?: number;
13
+ disabled?: boolean;
14
+ classNames?: AvatarDropzoneClassNames & {
15
+ icon?: IconProps['classNames'];
16
+ loader?: LoaderOvalProps['classNames'];
17
+ };
18
+ };
19
+ declare const AvatarDropzoneS3: <TInitBody extends S3InitBody = S3InitBody>({
20
+ value,
21
+ onChange,
22
+ onError,
23
+ maxSize,
24
+ disabled,
25
+ classNames,
26
+ initUrl,
27
+ buildInitBody,
28
+ register,
29
+ getHeaders,
30
+ getErrorMessage,
31
+ resolveUploadedUrl,
32
+ acceptedTypes,
33
+ texts
34
+ }: AvatarDropzoneS3Props<TInitBody>) => react_jsx_runtime0.JSX.Element;
35
+ //#endregion
36
+ export { AvatarDropzoneS3, AvatarDropzoneS3Props };
37
+ //# sourceMappingURL=AvatarDropzoneS3.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarDropzoneS3.d.mts","names":[],"sources":["../../../../../src/components/controls/dropzone/avatar/AvatarDropzoneS3.tsx"],"mappings":";;;;;;;KAcY,qBAAA,mBAAwC,UAAA,GAAa,UAAA,IAC/D,cAAA,CAAe,SAAA;EACb,KAAA;EACA,QAAA,IAAY,GAAA;EACZ,OAAA,IAAW,OAAA;EACX,OAAA;EACA,QAAA;EACA,UAAA,GAAa,wBAAA;IACX,IAAA,GAAO,SAAA;IACP,MAAA,GAAS,eAAA;EAAA;AAAA;AAAA,cAIF,gBAAA,qBAAsC,UAAA,GAAa,UAAA;EAAY,KAAA;EAAA,QAAA;EAAA,OAAA;EAAA,OAAA;EAAA,QAAA;EAAA,UAAA;EAAA,OAAA;EAAA,aAAA;EAAA,QAAA;EAAA,UAAA;EAAA,eAAA;EAAA,kBAAA;EAAA,aAAA;EAAA;AAAA,GAezE,qBAAA,CAAsB,SAAA,MAAU,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,2 @@
1
+ import{AvatarDropzoneBase as e}from"./AvatarDropzoneBase.mjs";import{useS3Upload as t}from"../use-s3-upload.mjs";import{jsx as n}from"react/jsx-runtime";import{useCallback as r,useState as i}from"react";const a=({value:a,onChange:o,onError:s,maxSize:c,disabled:l=!1,classNames:u,initUrl:d,buildInitBody:f,register:p,getHeaders:m,getErrorMessage:h,resolveUploadedUrl:g,acceptedTypes:_,texts:v})=>{let[y,b]=i(a??null),{upload:x,isUploading:S}=t({initUrl:d,buildInitBody:f,register:p,getHeaders:m,getErrorMessage:h,resolveUploadedUrl:g,acceptedTypes:_,texts:v});return n(e,{onDrop:r(async e=>{let t=e[0];if(t){b(URL.createObjectURL(t));try{let e=await x(t);o?.(e)}catch(e){b(a??null),s?.(e.message)}}},[x,o,s,a]),value:y,maxSize:c,disabled:l,isUploading:S,classNames:u})};export{a as AvatarDropzoneS3};
2
+ //# sourceMappingURL=AvatarDropzoneS3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AvatarDropzoneS3.mjs","names":[],"sources":["../../../../../src/components/controls/dropzone/avatar/AvatarDropzoneS3.tsx"],"sourcesContent":["import { useCallback, useState } from 'react';\n\nimport type { IconProps, LoaderOvalProps } from '@/components/data-display';\n\nimport {\n type S3InitBody,\n type S3UploadConfig,\n useS3Upload,\n} from '../use-s3-upload';\nimport {\n AvatarDropzoneBase,\n type AvatarDropzoneClassNames,\n} from './AvatarDropzoneBase';\n\nexport type AvatarDropzoneS3Props<TInitBody extends S3InitBody = S3InitBody> =\n S3UploadConfig<TInitBody> & {\n value?: string;\n onChange?: (url: string) => void;\n onError?: (message: string) => void;\n maxSize?: number;\n disabled?: boolean;\n classNames?: AvatarDropzoneClassNames & {\n icon?: IconProps['classNames'];\n loader?: LoaderOvalProps['classNames'];\n };\n };\n\nexport const AvatarDropzoneS3 = <TInitBody extends S3InitBody = S3InitBody>({\n value,\n onChange,\n onError,\n maxSize,\n disabled = false,\n classNames,\n initUrl,\n buildInitBody,\n register,\n getHeaders,\n getErrorMessage,\n resolveUploadedUrl,\n acceptedTypes,\n texts,\n}: AvatarDropzoneS3Props<TInitBody>) => {\n const [preview, setPreview] = useState<string | null>(value ?? null);\n const { upload, isUploading } = useS3Upload<TInitBody>({\n initUrl,\n buildInitBody,\n register,\n getHeaders,\n getErrorMessage,\n resolveUploadedUrl,\n acceptedTypes,\n texts,\n });\n\n const handleDrop = useCallback(\n async (files: File[]) => {\n const file = files[0];\n if (!file) return;\n setPreview(URL.createObjectURL(file));\n try {\n const url = await upload(file);\n onChange?.(url);\n } catch (err) {\n setPreview(value ?? null);\n onError?.((err as Error).message);\n }\n },\n [upload, onChange, onError, value],\n );\n\n return (\n <AvatarDropzoneBase\n onDrop={handleDrop}\n value={preview}\n maxSize={maxSize}\n disabled={disabled}\n isUploading={isUploading}\n classNames={classNames}\n />\n );\n};\n"],"mappings":"2MA2BA,MAAa,GAA+D,CAC1E,QACA,WACA,UACA,UACA,WAAW,GACX,aACA,UACA,gBACA,WACA,aACA,kBACA,qBACA,gBACA,WACsC,CACtC,GAAM,CAAC,EAAS,GAAc,EAAwB,GAAS,KAAK,CAC9D,CAAE,SAAQ,eAAgB,EAAuB,CACrD,UACA,gBACA,WACA,aACA,kBACA,qBACA,gBACA,QACD,CAAC,CAkBF,OACE,EAAC,EAAD,CACE,OAlBe,EACjB,KAAO,IAAkB,CACvB,IAAM,EAAO,EAAM,GACd,KACL,GAAW,IAAI,gBAAgB,EAAK,CAAC,CACrC,GAAI,CACF,IAAM,EAAM,MAAM,EAAO,EAAK,CAC9B,IAAW,EAAI,OACR,EAAK,CACZ,EAAW,GAAS,KAAK,CACzB,IAAW,EAAc,QAAQ,IAGrC,CAAC,EAAQ,EAAU,EAAS,EAAM,CACnC,CAKG,MAAO,EACE,UACC,WACG,cACD,aACZ,CAAA"}
@@ -0,0 +1,70 @@
1
+ import { ReactNode } from "react";
2
+
3
+ //#region src/components/controls/dropzone/use-s3-upload.d.ts
4
+ type S3InitBody = {
5
+ url: string;
6
+ headers?: Record<string, string | string[]>;
7
+ } & Record<string, unknown>;
8
+ type S3InitResponse<TBody extends S3InitBody = S3InitBody> = {
9
+ body: TBody;
10
+ };
11
+ /** Metadata derived from the file that body builders frequently need. */
12
+ type S3FileMeta = {
13
+ /**
14
+ * Best-effort MIME type. When `acceptedTypes` is provided and the
15
+ * browser-reported `file.type` is empty or unknown, this falls back to
16
+ * the MIME mapped from the file extension.
17
+ */
18
+ mimeType: string; /** Lowercase file extension without the leading dot. */
19
+ extension: string;
20
+ };
21
+ /** All replaceable UI and error strings surfaced by S3 upload components. */
22
+ type DropzoneS3Texts = {
23
+ /** Main dropzone heading. */title?: ReactNode; /** Secondary dropzone text. */
24
+ subtitle?: ReactNode; /** Small helper text below the subtitle. */
25
+ hint?: ReactNode; /** Fallback shown when the init request fails without a parseable body. */
26
+ initFailed?: (status: number) => string; /** Fallback shown when the register request fails without a parseable body. */
27
+ registerFailed?: (status: number) => string; /** Error when the S3 PUT returns a non-2xx status. */
28
+ uploadFailed?: (status: number, statusText: string) => string; /** Error when the network fails during the PUT. */
29
+ networkError?: string; /** Error when the PUT is aborted. */
30
+ uploadAborted?: string; /** Error when the PUT times out. */
31
+ uploadTimedOut?: string;
32
+ };
33
+ /** Lowercase extension without leading dot, or empty string. */
34
+ declare const getFileExtension: (filename: string) => string;
35
+ type S3UploadConfig<TInitBody extends S3InitBody = S3InitBody> = {
36
+ /** POST endpoint that returns `{ body: { url, headers?, ...extras } }`. */initUrl: string; /** Build the init request JSON body from the file and resolved meta. */
37
+ buildInitBody: (file: File, meta: S3FileMeta) => Record<string, unknown>;
38
+ /**
39
+ * Optional post-upload registration step. When set, a POST is sent to
40
+ * `register.url` with the body produced by `register.buildBody`.
41
+ */
42
+ register?: {
43
+ url: string;
44
+ buildBody: (file: File, init: TInitBody, meta: S3FileMeta) => Record<string, unknown>;
45
+ };
46
+ /**
47
+ * Called on every outbound request (init, register). Use it to supply
48
+ * auth/CSRF headers that may rotate during the session.
49
+ */
50
+ getHeaders?: () => Record<string, string>;
51
+ /**
52
+ * Customize how an error response is turned into a human-readable
53
+ * message. Defaults to common Laravel-style error shapes.
54
+ */
55
+ getErrorMessage?: (res: Response, fallback: string) => Promise<string>;
56
+ /**
57
+ * URL stored after a successful upload. Defaults to `init.body.key`
58
+ * when present, falling back to the presigned URL stripped of its query string.
59
+ */
60
+ resolveUploadedUrl?: (init: TInitBody, file: File) => string;
61
+ /**
62
+ * Map of file extension → MIME type used to resolve `meta.mimeType`
63
+ * and build the `accept` map for the dropzone.
64
+ */
65
+ acceptedTypes?: Record<string, string>; /** All replaceable UI and error strings. */
66
+ texts?: DropzoneS3Texts;
67
+ };
68
+ //#endregion
69
+ export { DropzoneS3Texts, S3FileMeta, S3InitBody, S3InitResponse, S3UploadConfig, getFileExtension };
70
+ //# sourceMappingURL=use-s3-upload.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-s3-upload.d.mts","names":[],"sources":["../../../../src/components/controls/dropzone/use-s3-upload.ts"],"mappings":";;;KAGY,UAAA;EACV,GAAA;EACA,OAAA,GAAU,MAAA;AAAA,IACR,MAAA;AAAA,KAEQ,cAAA,eAA6B,UAAA,GAAa,UAAA;EACpD,IAAA,EAAM,KAAA;AAAA;;KAII,UAAA;EAPR;;;AAEJ;;EAWE,QAAA,UAXuC;EAavC,SAAA;AAAA;;KAIU,eAAA;EAjBe,6BAmBzB,KAAA,GAAQ,SAAA,EAnB4C;EAqBpD,QAAA,GAAW,SAAA,EApBL;EAsBN,IAAA,GAAO,SAAA,EAtBI;EAwBX,UAAA,IAAc,MAAA,qBApBM;EAsBpB,cAAA,IAAkB,MAAA,qBAhBlB;EAkBA,YAAA,IAAgB,MAAA,UAAgB,UAAA,qBAZtB;EAcV,YAAA;EAEA,aAAA,WAZW;EAcX,cAAA;AAAA;;cAuEW,gBAAA,GAAoB,QAAA;AAAA,KA8DrB,cAAA,mBAAiC,UAAA,GAAa,UAAA;EA3IxD,2EA6IA,OAAA,UA7IgC;EA+IhC,aAAA,GAAgB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,KAAe,MAAA;EA3IjD;;;;EAgJA,QAAA;IACE,GAAA;IACA,SAAA,GACE,IAAA,EAAM,IAAA,EACN,IAAA,EAAM,SAAA,EACN,IAAA,EAAM,UAAA,KACH,MAAA;EAAA;EA7EwC;AA8DjD;;;EAqBE,UAAA,SAAmB,MAAA;EArBqC;;;;EA0BxD,eAAA,IAAmB,GAAA,EAAK,QAAA,EAAU,QAAA,aAAqB,OAAA;EAb7C;;;;EAkBV,kBAAA,IAAsB,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,IAAA;EALU;;;;EAUvD,aAAA,GAAgB,MAAA,kBAEO;EAAvB,KAAA,GAAQ,eAAA;AAAA"}
@@ -0,0 +1,2 @@
1
+ import{useState as e}from"react";const t={initFailed:e=>`Failed to request upload URL (${e})`,registerFailed:e=>`Failed to register file (${e})`,uploadFailed:(e,t)=>`Upload failed (${e} ${t})`,networkError:`Network error during direct upload`,uploadAborted:`Upload aborted`,uploadTimedOut:`Upload timed out`},n=(e,t,n,r,i)=>new Promise((a,o)=>{let s=new XMLHttpRequest;s.upload.addEventListener(`progress`,e=>{e.lengthComputable&&r(Math.round(e.loaded/e.total*100))}),s.addEventListener(`load`,()=>{s.status>=200&&s.status<300?a():o(Error(i.uploadFailed(s.status,s.statusText)))}),s.addEventListener(`error`,()=>o(Error(i.networkError))),s.addEventListener(`abort`,()=>o(Error(i.uploadAborted))),s.addEventListener(`timeout`,()=>o(Error(i.uploadTimedOut))),s.open(`PUT`,e);for(let[e,n]of Object.entries(t)){let t=e.toLowerCase();if(!(t===`host`||t===`content-length`))try{s.setRequestHeader(e,n)}catch{}}s.send(n)}),r=e=>{let t={};if(!e)return t;for(let[n,r]of Object.entries(e))t[n]=Array.isArray(r)?r.join(`,`):String(r);return t},i=e=>{let t=e.lastIndexOf(`.`);return t>=0?e.slice(t+1).toLowerCase():``},a=e=>{if(!e)return;let t={};for(let[n,r]of Object.entries(e)){let e=`.${n}`,i=t[r];i?i.includes(e)||i.push(e):t[r]=[e]}return t},o=(e,t)=>{let n=i(e.name);if(!t)return{mimeType:e.type,extension:n};let r=Object.values(t);return e.type&&r.includes(e.type)?{mimeType:e.type,extension:n}:{mimeType:t[n]??e.type,extension:n}},s=async(e,t)=>{try{let n=await e.clone().json();if(n.errors){let e=Object.values(n.errors)[0];if(e&&e.length>0)return e[0]}return n.body?.message??n.body?.text??n.message??t}catch{return t}},c=({initUrl:i,buildInitBody:a,register:c,getHeaders:l,getErrorMessage:u=s,resolveUploadedUrl:d,acceptedTypes:f,texts:p})=>{let[m,h]=e(!1);return{upload:async(e,s)=>{let m={...t,...p};h(!0);try{let t=()=>({"Content-Type":`application/json`,Accept:`application/json`,...l?.()??{}}),p=o(e,f),h=await fetch(i,{method:`POST`,headers:t(),body:JSON.stringify(a(e,p))});if(!h.ok)throw Error(await u(h,m.initFailed(h.status)));let g=await h.json(),{url:_,headers:v}=g.body;if(await n(_,r(v),e,e=>s?.(e),m),c){let n=await fetch(c.url,{method:`POST`,headers:t(),body:JSON.stringify(c.buildBody(e,g.body,p))});if(!n.ok)throw Error(await u(n,m.registerFailed(n.status)))}return d?.(g.body,e)??(typeof g.body.key==`string`?g.body.key:_.split(`?`)[0])}finally{h(!1)}},isUploading:m}};export{a as buildAcceptMap,s as defaultGetErrorMessage,i as getFileExtension,c as useS3Upload};
2
+ //# sourceMappingURL=use-s3-upload.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-s3-upload.mjs","names":[],"sources":["../../../../src/components/controls/dropzone/use-s3-upload.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { useState } from 'react';\n\nexport type S3InitBody = {\n url: string;\n headers?: Record<string, string | string[]>;\n} & Record<string, unknown>;\n\nexport type S3InitResponse<TBody extends S3InitBody = S3InitBody> = {\n body: TBody;\n};\n\n/** Metadata derived from the file that body builders frequently need. */\nexport type S3FileMeta = {\n /**\n * Best-effort MIME type. When `acceptedTypes` is provided and the\n * browser-reported `file.type` is empty or unknown, this falls back to\n * the MIME mapped from the file extension.\n */\n mimeType: string;\n /** Lowercase file extension without the leading dot. */\n extension: string;\n};\n\n/** All replaceable UI and error strings surfaced by S3 upload components. */\nexport type DropzoneS3Texts = {\n /** Main dropzone heading. */\n title?: ReactNode;\n /** Secondary dropzone text. */\n subtitle?: ReactNode;\n /** Small helper text below the subtitle. */\n hint?: ReactNode;\n /** Fallback shown when the init request fails without a parseable body. */\n initFailed?: (status: number) => string;\n /** Fallback shown when the register request fails without a parseable body. */\n registerFailed?: (status: number) => string;\n /** Error when the S3 PUT returns a non-2xx status. */\n uploadFailed?: (status: number, statusText: string) => string;\n /** Error when the network fails during the PUT. */\n networkError?: string;\n /** Error when the PUT is aborted. */\n uploadAborted?: string;\n /** Error when the PUT times out. */\n uploadTimedOut?: string;\n};\n\nconst DEFAULT_TEXTS = {\n initFailed: (status: number): string =>\n `Failed to request upload URL (${status})`,\n registerFailed: (status: number): string =>\n `Failed to register file (${status})`,\n uploadFailed: (status: number, statusText: string): string =>\n `Upload failed (${status} ${statusText})`,\n networkError: 'Network error during direct upload',\n uploadAborted: 'Upload aborted',\n uploadTimedOut: 'Upload timed out',\n} as const;\n\ntype PutTexts = {\n uploadFailed: (status: number, statusText: string) => string;\n networkError: string;\n uploadAborted: string;\n uploadTimedOut: string;\n};\n\nconst putWithProgress = (\n url: string,\n headers: Record<string, string>,\n file: File,\n onProgress: (percentage: number) => void,\n texts: PutTexts,\n): Promise<void> => {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) {\n onProgress(Math.round((e.loaded / e.total) * 100));\n }\n });\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) resolve();\n else reject(new Error(texts.uploadFailed(xhr.status, xhr.statusText)));\n });\n xhr.addEventListener('error', () => reject(new Error(texts.networkError)));\n xhr.addEventListener('abort', () => reject(new Error(texts.uploadAborted)));\n xhr.addEventListener('timeout', () =>\n reject(new Error(texts.uploadTimedOut)),\n );\n xhr.open('PUT', url);\n for (const [k, v] of Object.entries(headers)) {\n const lk = k.toLowerCase();\n if (lk === 'host' || lk === 'content-length') continue;\n try {\n xhr.setRequestHeader(k, v);\n } catch {\n // Some headers are blocked by the browser — skip silently.\n }\n }\n xhr.send(file);\n });\n};\n\nconst flattenHeaders = (\n headers: Record<string, string | string[]> | undefined,\n): Record<string, string> => {\n const out: Record<string, string> = {};\n if (!headers) return out;\n for (const [k, v] of Object.entries(headers)) {\n out[k] = Array.isArray(v) ? v.join(',') : String(v);\n }\n return out;\n};\n\n/** Lowercase extension without leading dot, or empty string. */\nexport const getFileExtension = (filename: string): string => {\n const dot = filename.lastIndexOf('.');\n return dot >= 0 ? filename.slice(dot + 1).toLowerCase() : '';\n};\n\n/**\n * Build the `accept` map in the shape react-dropzone v15+ expects:\n * `{ [mimeType]: ['.ext', ...] }`. Multiple extensions that share a\n * MIME type are grouped under the same key.\n */\nexport const buildAcceptMap = (\n acceptedTypes: Record<string, string> | undefined,\n): Record<string, string[]> | undefined => {\n if (!acceptedTypes) return undefined;\n const map: Record<string, string[]> = {};\n for (const [ext, mime] of Object.entries(acceptedTypes)) {\n const dotted = `.${ext}`;\n const list = map[mime];\n if (list) {\n if (!list.includes(dotted)) list.push(dotted);\n } else {\n map[mime] = [dotted];\n }\n }\n return map;\n};\n\nexport const resolveMeta = (\n file: File,\n acceptedTypes: Record<string, string> | undefined,\n): S3FileMeta => {\n const extension = getFileExtension(file.name);\n if (!acceptedTypes) {\n return { mimeType: file.type, extension };\n }\n const mimeList = Object.values(acceptedTypes);\n if (file.type && mimeList.includes(file.type)) {\n return { mimeType: file.type, extension };\n }\n return { mimeType: acceptedTypes[extension] ?? file.type, extension };\n};\n\nexport const defaultGetErrorMessage = async (\n res: Response,\n fallback: string,\n): Promise<string> => {\n try {\n const data = (await res.clone().json()) as {\n message?: string;\n body?: { message?: string; text?: string };\n errors?: Record<string, string[]>;\n };\n if (data.errors) {\n const first = Object.values(data.errors)[0];\n if (first && first.length > 0) return first[0];\n }\n return data.body?.message ?? data.body?.text ?? data.message ?? fallback;\n } catch {\n return fallback;\n }\n};\n\nexport type S3UploadConfig<TInitBody extends S3InitBody = S3InitBody> = {\n /** POST endpoint that returns `{ body: { url, headers?, ...extras } }`. */\n initUrl: string;\n /** Build the init request JSON body from the file and resolved meta. */\n buildInitBody: (file: File, meta: S3FileMeta) => Record<string, unknown>;\n /**\n * Optional post-upload registration step. When set, a POST is sent to\n * `register.url` with the body produced by `register.buildBody`.\n */\n register?: {\n url: string;\n buildBody: (\n file: File,\n init: TInitBody,\n meta: S3FileMeta,\n ) => Record<string, unknown>;\n };\n /**\n * Called on every outbound request (init, register). Use it to supply\n * auth/CSRF headers that may rotate during the session.\n */\n getHeaders?: () => Record<string, string>;\n /**\n * Customize how an error response is turned into a human-readable\n * message. Defaults to common Laravel-style error shapes.\n */\n getErrorMessage?: (res: Response, fallback: string) => Promise<string>;\n /**\n * URL stored after a successful upload. Defaults to `init.body.key`\n * when present, falling back to the presigned URL stripped of its query string.\n */\n resolveUploadedUrl?: (init: TInitBody, file: File) => string;\n /**\n * Map of file extension → MIME type used to resolve `meta.mimeType`\n * and build the `accept` map for the dropzone.\n */\n acceptedTypes?: Record<string, string>;\n /** All replaceable UI and error strings. */\n texts?: DropzoneS3Texts;\n};\n\n/**\n * Encapsulates the three-step S3 upload flow: init POST → S3 PUT → register POST.\n * Returns an `upload(file, onProgress?)` function and an `isUploading` flag.\n * Consumed by `DropzoneS3` and `AvatarDropzoneS3`.\n */\nexport const useS3Upload = <TInitBody extends S3InitBody = S3InitBody>({\n initUrl,\n buildInitBody,\n register,\n getHeaders,\n getErrorMessage = defaultGetErrorMessage,\n resolveUploadedUrl,\n acceptedTypes,\n texts,\n}: S3UploadConfig<TInitBody>) => {\n const [isUploading, setIsUploading] = useState(false);\n\n const upload = async (\n file: File,\n onProgress?: (percentage: number) => void,\n ): Promise<string> => {\n const t = { ...DEFAULT_TEXTS, ...texts };\n\n setIsUploading(true);\n try {\n const jsonHeaders = (): Record<string, string> => ({\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(getHeaders?.() ?? {}),\n });\n const meta = resolveMeta(file, acceptedTypes);\n\n // 1. init — request a presigned URL.\n const initRes = await fetch(initUrl, {\n method: 'POST',\n headers: jsonHeaders(),\n body: JSON.stringify(buildInitBody(file, meta)),\n });\n if (!initRes.ok) {\n throw new Error(\n await getErrorMessage(initRes, t.initFailed(initRes.status)),\n );\n }\n const init = (await initRes.json()) as S3InitResponse<TInitBody>;\n const { url, headers: s3Headers } = init.body;\n\n // 2. direct upload to S3.\n await putWithProgress(\n url,\n flattenHeaders(s3Headers),\n file,\n (p) => onProgress?.(p),\n t,\n );\n\n // 3. register (optional) — persist metadata on the app backend.\n if (register) {\n const regRes = await fetch(register.url, {\n method: 'POST',\n headers: jsonHeaders(),\n body: JSON.stringify(register.buildBody(file, init.body, meta)),\n });\n if (!regRes.ok) {\n throw new Error(\n await getErrorMessage(regRes, t.registerFailed(regRes.status)),\n );\n }\n }\n\n const storedUrl =\n resolveUploadedUrl?.(init.body, file) ??\n (typeof init.body.key === 'string' ? init.body.key : url.split('?')[0]);\n return storedUrl;\n } finally {\n setIsUploading(false);\n }\n };\n\n return { upload, isUploading };\n};\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { AvatarDropzone, AvatarDropzoneProps } from "./avatar-dropzone/AvatarDropzone.mjs";
2
1
  import { AvatarUpload, AvatarUploadProps } from "./avatar-upload/AvatarUpload.mjs";
3
2
  import { Checkbox, CheckboxProps } from "./checkbox/Checkbox.mjs";
4
3
  import { DatePicker, DatePickerProps } from "./date-picker/DatePicker.mjs";
@@ -6,9 +5,12 @@ import { TextInput, TextInputProps } from "./text-input/TextInput.mjs";
6
5
  import { Combobox, ComboboxProps } from "./dropdown/combobox/Combobox.mjs";
7
6
  import { Autocomplete, AutocompleteProps } from "./dropdown/autocomplete/Autocomplete.mjs";
8
7
  import { Select, SelectProps } from "./dropdown/select/Select.mjs";
8
+ import { AvatarDropzone, AvatarDropzoneProps } from "./dropzone/avatar/AvatarDropzone.mjs";
9
+ import { DropzoneS3Texts, S3FileMeta, S3InitBody, S3InitResponse, getFileExtension } from "./dropzone/use-s3-upload.mjs";
10
+ import { AvatarDropzoneS3, AvatarDropzoneS3Props } from "./dropzone/avatar/AvatarDropzoneS3.mjs";
9
11
  import { FileData } from "./dropzone/DropzoneBase.mjs";
10
12
  import { Dropzone, DropzoneProps } from "./dropzone/Dropzone.mjs";
11
- import { DropzoneS3, DropzoneS3Props, DropzoneS3Texts, S3FileMeta, S3InitBody, S3InitResponse, getFileExtension } from "./dropzone/DropzoneS3.mjs";
13
+ import { DropzoneS3, DropzoneS3Props } from "./dropzone/DropzoneS3.mjs";
12
14
  import { FileInput, FileInputProps } from "./file-input/FileInput.mjs";
13
15
  import { FileInputMultiple, FileInputMultipleProps } from "./file-input/FileInputMultiple.mjs";
14
16
  import { PasswordInput, PasswordInputProps } from "./password-input/PasswordInput.mjs";
@@ -1,2 +1,2 @@
1
- import{cx as e}from"@mage-ui/styled-system/css";import{resourceItem as t,resourceItemContent as n,resourceItemRoot as r,resourceItemSection as i}from"@mage-ui/styled-system/recipes";import{jsx as a,jsxs as o}from"react/jsx-runtime";const s=({startSlot:s,children:c,endSlot:l,classNames:u})=>o(`div`,{className:e(u?.resourceItem??t(),u?.root??r()),children:[s&&a(`div`,{className:u?.section??i(),children:s}),a(`div`,{className:u?.content??n(),children:c}),l&&a(`div`,{className:u?.section??i(),children:l})]});export{s as ResourceItem};
1
+ import{cx as e}from"@mage-ui/styled-system/css";import{resourceItem as t,resourceItemContent as n,resourceItemRoot as r,resourceItemSection as i}from"@mage-ui/styled-system/recipes";import{jsx as a,jsxs as o}from"react/jsx-runtime";const s=({startSlot:s,children:c,endSlot:l,classNames:u})=>o(`div`,{className:e(u?.resourceItem??t(),u?.root??r()),children:[s&&a(`div`,{className:u?.section??i(),"data-section":`start`,children:s}),a(`div`,{className:u?.content??n(),children:c}),l&&a(`div`,{className:u?.section??i(),"data-section":`end`,children:l})]});export{s as ResourceItem};
2
2
  //# sourceMappingURL=ResourceItem.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceItem.mjs","names":[],"sources":["../../../../src/components/data-display/resource-item/ResourceItem.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { cx } from '@mage-ui/styled-system/css';\nimport {\n resourceItem,\n resourceItemContent,\n resourceItemRoot,\n resourceItemSection,\n} from '@mage-ui/styled-system/recipes';\n\nexport type ResourceItemProps = {\n startSlot?: ReactNode;\n children: ReactNode;\n endSlot?: ReactNode;\n classNames?: {\n resourceItem?: string;\n root?: string;\n section?: string;\n content?: string;\n };\n};\n\nexport const ResourceItem = ({\n startSlot,\n children,\n endSlot,\n classNames,\n}: ResourceItemProps) => {\n return (\n <div\n className={cx(\n classNames?.resourceItem ?? resourceItem(),\n classNames?.root ?? resourceItemRoot(),\n )}\n >\n {startSlot && (\n <div className={classNames?.section ?? resourceItemSection()}>\n {startSlot}\n </div>\n )}\n\n <div className={classNames?.content ?? resourceItemContent()}>\n {children}\n </div>\n\n {endSlot && (\n <div className={classNames?.section ?? resourceItemSection()}>\n {endSlot}\n </div>\n )}\n </div>\n );\n};\n"],"mappings":"wOAsBA,MAAa,GAAgB,CAC3B,YACA,WACA,UACA,gBAGE,EAAC,MAAD,CACE,UAAW,EACT,GAAY,cAAgB,GAAc,CAC1C,GAAY,MAAQ,GAAkB,CACvC,UAJH,CAMG,GACC,EAAC,MAAD,CAAK,UAAW,GAAY,SAAW,GAAqB,UACzD,EACG,CAAA,CAGR,EAAC,MAAD,CAAK,UAAW,GAAY,SAAW,GAAqB,CACzD,WACG,CAAA,CAEL,GACC,EAAC,MAAD,CAAK,UAAW,GAAY,SAAW,GAAqB,UACzD,EACG,CAAA,CAEJ"}
1
+ {"version":3,"file":"ResourceItem.mjs","names":[],"sources":["../../../../src/components/data-display/resource-item/ResourceItem.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { cx } from '@mage-ui/styled-system/css';\nimport {\n resourceItem,\n resourceItemContent,\n resourceItemRoot,\n resourceItemSection,\n} from '@mage-ui/styled-system/recipes';\n\nexport type ResourceItemProps = {\n startSlot?: ReactNode;\n children: ReactNode;\n endSlot?: ReactNode;\n classNames?: {\n resourceItem?: string;\n root?: string;\n section?: string;\n content?: string;\n };\n};\n\nexport const ResourceItem = ({\n startSlot,\n children,\n endSlot,\n classNames,\n}: ResourceItemProps) => {\n return (\n <div\n className={cx(\n classNames?.resourceItem ?? resourceItem(),\n classNames?.root ?? resourceItemRoot(),\n )}\n >\n {startSlot && (\n <div\n className={classNames?.section ?? resourceItemSection()}\n data-section='start'\n >\n {startSlot}\n </div>\n )}\n\n <div className={classNames?.content ?? resourceItemContent()}>\n {children}\n </div>\n\n {endSlot && (\n <div\n className={classNames?.section ?? resourceItemSection()}\n data-section='end'\n >\n {endSlot}\n </div>\n )}\n </div>\n );\n};\n"],"mappings":"wOAsBA,MAAa,GAAgB,CAC3B,YACA,WACA,UACA,gBAGE,EAAC,MAAD,CACE,UAAW,EACT,GAAY,cAAgB,GAAc,CAC1C,GAAY,MAAQ,GAAkB,CACvC,UAJH,CAMG,GACC,EAAC,MAAD,CACE,UAAW,GAAY,SAAW,GAAqB,CACvD,eAAa,iBAEZ,EACG,CAAA,CAGR,EAAC,MAAD,CAAK,UAAW,GAAY,SAAW,GAAqB,CACzD,WACG,CAAA,CAEL,GACC,EAAC,MAAD,CACE,UAAW,GAAY,SAAW,GAAqB,CACvD,eAAa,eAEZ,EACG,CAAA,CAEJ"}
@@ -1,5 +1,5 @@
1
1
  import { TextInputProps } from "../controls/text-input/TextInput.mjs";
2
- import { S3InitBody } from "../controls/dropzone/DropzoneS3.mjs";
2
+ import { S3InitBody } from "../controls/dropzone/use-s3-upload.mjs";
3
3
  import { TextareaProps } from "../controls/textarea/Textarea.mjs";
4
4
  import { FormSubmitProps } from "./controls/FormSubmit.mjs";
5
5
  import { FormCheckboxProps } from "./controls/FormCheckbox.mjs";
@@ -1,4 +1,5 @@
1
- import { DropzoneS3Props, S3InitBody } from "../../controls/dropzone/DropzoneS3.mjs";
1
+ import { S3InitBody } from "../../controls/dropzone/use-s3-upload.mjs";
2
+ import { DropzoneS3Props } from "../../controls/dropzone/DropzoneS3.mjs";
2
3
  //#region src/components/forms/controls/FormDropzoneS3.d.ts
3
4
  type FormDropzoneS3Props<TInitBody extends S3InitBody = S3InitBody> = Omit<DropzoneS3Props<TInitBody>, 'autoSend' | 'onChange'> & {
4
5
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"FormDropzoneS3.d.mts","names":[],"sources":["../../../../src/components/forms/controls/FormDropzoneS3.tsx"],"mappings":";;KAQY,mBAAA,mBAAsC,UAAA,GAAa,UAAA,IAC7D,IAAA,CAAK,eAAA,CAAgB,SAAA;EACnB,IAAA;EACA,KAAA;EACA,YAAA;EACA,QAAA,IAAY,KAAA,EAAO,IAAA;AAAA"}
1
+ {"version":3,"file":"FormDropzoneS3.d.mts","names":[],"sources":["../../../../src/components/forms/controls/FormDropzoneS3.tsx"],"mappings":";;;KAQY,mBAAA,mBAAsC,UAAA,GAAa,UAAA,IAC7D,IAAA,CAAK,eAAA,CAAgB,SAAA;EACnB,IAAA;EACA,KAAA;EACA,YAAA;EACA,QAAA,IAAY,KAAA,EAAO,IAAA;AAAA"}
@@ -48,7 +48,6 @@ import { UploadedFile, UploadedFileProps } from "./data-display/uploaded-file/Up
48
48
  import { UploadedFileDetails, UploadedFileDetailsProps } from "./data-display/uploaded-file/UploadedFileDetails.mjs";
49
49
  import { UploadedFiles, UploadedFilesClassNames, UploadedFilesItemClassNames, UploadedFilesItemProps, UploadedFilesProps } from "./data-display/uploaded-files/UploadedFiles.mjs";
50
50
  import { UploadingFiles, UploadingFilesClassNames, UploadingFilesItemClassNames, UploadingFilesItemErrorClassNames, UploadingFilesItemErrorProps, UploadingFilesItemProps, UploadingFilesProps } from "./data-display/uploading-files/UploadingFiles.mjs";
51
- import { AvatarDropzone, AvatarDropzoneProps } from "./controls/avatar-dropzone/AvatarDropzone.mjs";
52
51
  import { AvatarUpload, AvatarUploadProps } from "./controls/avatar-upload/AvatarUpload.mjs";
53
52
  import { Checkbox, CheckboxProps } from "./controls/checkbox/Checkbox.mjs";
54
53
  import { DatePicker, DatePickerProps } from "./controls/date-picker/DatePicker.mjs";
@@ -60,9 +59,12 @@ import { TextInput, TextInputProps } from "./controls/text-input/TextInput.mjs";
60
59
  import { Combobox, ComboboxProps } from "./controls/dropdown/combobox/Combobox.mjs";
61
60
  import { Autocomplete, AutocompleteProps } from "./controls/dropdown/autocomplete/Autocomplete.mjs";
62
61
  import { Select, SelectProps } from "./controls/dropdown/select/Select.mjs";
62
+ import { AvatarDropzone, AvatarDropzoneProps } from "./controls/dropzone/avatar/AvatarDropzone.mjs";
63
+ import { DropzoneS3Texts, S3FileMeta, S3InitBody, S3InitResponse, getFileExtension } from "./controls/dropzone/use-s3-upload.mjs";
64
+ import { AvatarDropzoneS3, AvatarDropzoneS3Props } from "./controls/dropzone/avatar/AvatarDropzoneS3.mjs";
63
65
  import { FileData } from "./controls/dropzone/DropzoneBase.mjs";
64
66
  import { Dropzone, DropzoneProps } from "./controls/dropzone/Dropzone.mjs";
65
- import { DropzoneS3, DropzoneS3Props, DropzoneS3Texts, S3FileMeta, S3InitBody, S3InitResponse, getFileExtension } from "./controls/dropzone/DropzoneS3.mjs";
67
+ import { DropzoneS3, DropzoneS3Props } from "./controls/dropzone/DropzoneS3.mjs";
66
68
  import { FileInput, FileInputProps } from "./controls/file-input/FileInput.mjs";
67
69
  import { FileInputMultiple, FileInputMultipleProps } from "./controls/file-input/FileInputMultiple.mjs";
68
70
  import { PasswordInput, PasswordInputProps } from "./controls/password-input/PasswordInput.mjs";
package/dist/index.d.mts CHANGED
@@ -48,7 +48,6 @@ import { UploadedFile, UploadedFileProps } from "./components/data-display/uploa
48
48
  import { UploadedFileDetails, UploadedFileDetailsProps } from "./components/data-display/uploaded-file/UploadedFileDetails.mjs";
49
49
  import { UploadedFiles, UploadedFilesClassNames, UploadedFilesItemClassNames, UploadedFilesItemProps, UploadedFilesProps } from "./components/data-display/uploaded-files/UploadedFiles.mjs";
50
50
  import { UploadingFiles, UploadingFilesClassNames, UploadingFilesItemClassNames, UploadingFilesItemErrorClassNames, UploadingFilesItemErrorProps, UploadingFilesItemProps, UploadingFilesProps } from "./components/data-display/uploading-files/UploadingFiles.mjs";
51
- import { AvatarDropzone, AvatarDropzoneProps } from "./components/controls/avatar-dropzone/AvatarDropzone.mjs";
52
51
  import { AvatarUpload, AvatarUploadProps } from "./components/controls/avatar-upload/AvatarUpload.mjs";
53
52
  import { Checkbox, CheckboxProps } from "./components/controls/checkbox/Checkbox.mjs";
54
53
  import { DatePicker, DatePickerProps } from "./components/controls/date-picker/DatePicker.mjs";
@@ -60,9 +59,12 @@ import { TextInput, TextInputProps } from "./components/controls/text-input/Text
60
59
  import { Combobox, ComboboxProps } from "./components/controls/dropdown/combobox/Combobox.mjs";
61
60
  import { Autocomplete, AutocompleteProps } from "./components/controls/dropdown/autocomplete/Autocomplete.mjs";
62
61
  import { Select, SelectProps } from "./components/controls/dropdown/select/Select.mjs";
62
+ import { AvatarDropzone, AvatarDropzoneProps } from "./components/controls/dropzone/avatar/AvatarDropzone.mjs";
63
+ import { DropzoneS3Texts, S3FileMeta, S3InitBody, S3InitResponse, getFileExtension } from "./components/controls/dropzone/use-s3-upload.mjs";
64
+ import { AvatarDropzoneS3, AvatarDropzoneS3Props } from "./components/controls/dropzone/avatar/AvatarDropzoneS3.mjs";
63
65
  import { FileData } from "./components/controls/dropzone/DropzoneBase.mjs";
64
66
  import { Dropzone, DropzoneProps } from "./components/controls/dropzone/Dropzone.mjs";
65
- import { DropzoneS3, DropzoneS3Props, DropzoneS3Texts, S3FileMeta, S3InitBody, S3InitResponse, getFileExtension } from "./components/controls/dropzone/DropzoneS3.mjs";
67
+ import { DropzoneS3, DropzoneS3Props } from "./components/controls/dropzone/DropzoneS3.mjs";
66
68
  import { FileInput, FileInputProps } from "./components/controls/file-input/FileInput.mjs";
67
69
  import { FileInputMultiple, FileInputMultipleProps } from "./components/controls/file-input/FileInputMultiple.mjs";
68
70
  import { PasswordInput, PasswordInputProps } from "./components/controls/password-input/PasswordInput.mjs";
@@ -90,4 +92,4 @@ import { Modals } from "./components/overlays/modal/index.mjs";
90
92
  import { Toast, ToastIntent, ToastOptions, ToastProviderProps } from "./components/overlays/toast/Toast.mjs";
91
93
  import { Tooltip, TooltipProps } from "./components/overlays/tooltip/Tooltip.mjs";
92
94
  import { MageUiProvider, MageUiProviderProps } from "./providers/MageUiProvider.mjs";
93
- export { AssignedUser, AssignedUserProps, Autocomplete, AutocompleteProps, Avatar, AvatarDropzone, AvatarDropzoneProps, AvatarProps, AvatarUpload, AvatarUploadProps, Badge, BadgeProps, Breadcrumbs, BreadcrumbsBarProps, BreadcrumbsProps, Button, ButtonAction, ButtonActionProps, ButtonIcon, ButtonIconProps, ButtonIconVisual, ButtonIconVisualProps, ButtonLoader, ButtonProps, ButtonVisual, ButtonVisualProps, Calendar, CalendarEvent, CalendarProps, CalendarView, Card, CardBase, CardBody, CardClassNames, CardFooter, CardHeader, CardProps, CardRoot, Checkbox, CheckboxProps, ColumnDef, Combobox, ComboboxProps, DEFAULT_DATA_TABLE_LABELS, DataTable, DataTableBottomSlot, DataTableBottomSlotProps, DataTableClassNames, DataTableColumnMeta, DataTableContextProvider, DataTableContextValue, DataTableExpansionConfig, DataTableExtraColumnConfig, DataTableFeedback, DataTableFiltersConfig, DataTableLabels, DataTablePageSize, DataTablePageSizeProps, DataTablePagination, DataTablePaginationConfig, DataTablePaginationProps, DataTableProps, DataTableRecord, DataTableSearchConfig, DataTableSelectionConfig, DataTableSortingConfig, DataTableTableConfig, DataTableTopSlot, DataTableTopSlotProps, DateLocalizer, DatePicker, DatePickerProps, DescriptionList, DescriptionListClassNames, DescriptionListItemProps, DescriptionListProps, DocumentItem, DocumentItemProps, Dropzone, DropzoneProps, DropzoneS3, DropzoneS3Props, DropzoneS3Texts, ExpandedState, FileData, FileIcon, FileIconProps, FileInput, FileInputMultiple, FileInputMultipleProps, FileInputProps, FluidGrid, FluidGridProps, Form, FormProps, Grid, GridClassNames, HorizontalDivider, HorizontalDividerProps, Icon, IconProps, IconRaw, IconRawProps, IconSvg, IconSvgProps, IconWrapped, IconWrappedProps, Indicator, IndicatorProps, LoaderDot, LoaderDotProps, LoaderOval, LoaderOvalProps, LogoImage, LogoImageProps, LogoSvg, LogoSvgProps, MageUiProvider, MageUiProviderProps, Menu, MenuProps, Modal, ModalClassNames, ModalIntent, ModalProps, ModalRegistry, ModalRegistryEntry, ModalRootProps, Modals, NavigationMenu, NavigationMenuProps, NotificationBanner, NotificationBannerIntent, NotificationBannerProps, PASSWORD_RULES, Pagination, PaginationClassNames, PaginationRootProps, PaginationState, PasswordInput, PasswordInputProps, PasswordRule, PasswordRuleDefinition, PasswordSegment, PasswordStrengthInput, PasswordStrengthInputProps, Radio, RadioProps, RemovableItem, RemovableItemProps, ResourceItem, ResourceItemProps, RowSelectionState, S3FileMeta, S3InitBody, S3InitResponse, ScrollArea, ScrollAreaAutosize, ScrollAreaAutosizeProps, ScrollAreaClassNames, ScrollAreaProps, Select, SelectProps, Sidebar, SidebarClassNames, SidebarProps, SortingState, Switch, SwitchGroup, SwitchGroupProps, SwitchProps, Table, TableBodyProps, TableCaptionProps, TableCellProps, TableClassNames, TableFootProps, TableHeadProps, TableHeaderCellProps, TableProps, TableRowProps, Tag, TagGroup, TagGroupProps, TagProps, TextInput, TextInputProps, Textarea, TextareaProps, Toast, ToastIntent, ToastOptions, ToastProviderProps, Tooltip, TooltipProps, UploadedFile, UploadedFileDetails, UploadedFileDetailsProps, UploadedFileProps, UploadedFiles, UploadedFilesClassNames, UploadedFilesItemClassNames, UploadedFilesItemProps, UploadedFilesProps, UploadingFiles, UploadingFilesClassNames, UploadingFilesItemClassNames, UploadingFilesItemErrorClassNames, UploadingFilesItemErrorProps, UploadingFilesItemProps, UploadingFilesProps, Virtual, VirtualItem, VirtualPadding, VirtualProps, VisuallyHidden, VisuallyHiddenProps, getFileExtension, useDataTableContext, usePasswordRules, z };
95
+ export { AssignedUser, AssignedUserProps, Autocomplete, AutocompleteProps, Avatar, AvatarDropzone, AvatarDropzoneProps, AvatarDropzoneS3, AvatarDropzoneS3Props, AvatarProps, AvatarUpload, AvatarUploadProps, Badge, BadgeProps, Breadcrumbs, BreadcrumbsBarProps, BreadcrumbsProps, Button, ButtonAction, ButtonActionProps, ButtonIcon, ButtonIconProps, ButtonIconVisual, ButtonIconVisualProps, ButtonLoader, ButtonProps, ButtonVisual, ButtonVisualProps, Calendar, CalendarEvent, CalendarProps, CalendarView, Card, CardBase, CardBody, CardClassNames, CardFooter, CardHeader, CardProps, CardRoot, Checkbox, CheckboxProps, ColumnDef, Combobox, ComboboxProps, DEFAULT_DATA_TABLE_LABELS, DataTable, DataTableBottomSlot, DataTableBottomSlotProps, DataTableClassNames, DataTableColumnMeta, DataTableContextProvider, DataTableContextValue, DataTableExpansionConfig, DataTableExtraColumnConfig, DataTableFeedback, DataTableFiltersConfig, DataTableLabels, DataTablePageSize, DataTablePageSizeProps, DataTablePagination, DataTablePaginationConfig, DataTablePaginationProps, DataTableProps, DataTableRecord, DataTableSearchConfig, DataTableSelectionConfig, DataTableSortingConfig, DataTableTableConfig, DataTableTopSlot, DataTableTopSlotProps, DateLocalizer, DatePicker, DatePickerProps, DescriptionList, DescriptionListClassNames, DescriptionListItemProps, DescriptionListProps, DocumentItem, DocumentItemProps, Dropzone, DropzoneProps, DropzoneS3, DropzoneS3Props, DropzoneS3Texts, ExpandedState, FileData, FileIcon, FileIconProps, FileInput, FileInputMultiple, FileInputMultipleProps, FileInputProps, FluidGrid, FluidGridProps, Form, FormProps, Grid, GridClassNames, HorizontalDivider, HorizontalDividerProps, Icon, IconProps, IconRaw, IconRawProps, IconSvg, IconSvgProps, IconWrapped, IconWrappedProps, Indicator, IndicatorProps, LoaderDot, LoaderDotProps, LoaderOval, LoaderOvalProps, LogoImage, LogoImageProps, LogoSvg, LogoSvgProps, MageUiProvider, MageUiProviderProps, Menu, MenuProps, Modal, ModalClassNames, ModalIntent, ModalProps, ModalRegistry, ModalRegistryEntry, ModalRootProps, Modals, NavigationMenu, NavigationMenuProps, NotificationBanner, NotificationBannerIntent, NotificationBannerProps, PASSWORD_RULES, Pagination, PaginationClassNames, PaginationRootProps, PaginationState, PasswordInput, PasswordInputProps, PasswordRule, PasswordRuleDefinition, PasswordSegment, PasswordStrengthInput, PasswordStrengthInputProps, Radio, RadioProps, RemovableItem, RemovableItemProps, ResourceItem, ResourceItemProps, RowSelectionState, S3FileMeta, S3InitBody, S3InitResponse, ScrollArea, ScrollAreaAutosize, ScrollAreaAutosizeProps, ScrollAreaClassNames, ScrollAreaProps, Select, SelectProps, Sidebar, SidebarClassNames, SidebarProps, SortingState, Switch, SwitchGroup, SwitchGroupProps, SwitchProps, Table, TableBodyProps, TableCaptionProps, TableCellProps, TableClassNames, TableFootProps, TableHeadProps, TableHeaderCellProps, TableProps, TableRowProps, Tag, TagGroup, TagGroupProps, TagProps, TextInput, TextInputProps, Textarea, TextareaProps, Toast, ToastIntent, ToastOptions, ToastProviderProps, Tooltip, TooltipProps, UploadedFile, UploadedFileDetails, UploadedFileDetailsProps, UploadedFileProps, UploadedFiles, UploadedFilesClassNames, UploadedFilesItemClassNames, UploadedFilesItemProps, UploadedFilesProps, UploadingFiles, UploadingFilesClassNames, UploadingFilesItemClassNames, UploadingFilesItemErrorClassNames, UploadingFilesItemErrorProps, UploadingFilesItemProps, UploadingFilesProps, Virtual, VirtualItem, VirtualPadding, VirtualProps, VisuallyHidden, VisuallyHiddenProps, getFileExtension, useDataTableContext, usePasswordRules, z };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{Button as e}from"./components/buttons/button/Button.mjs";import{VisuallyHidden as t}from"./components/misc/visually-hidden/VisuallyHidden.mjs";import{ButtonAction as n}from"./components/buttons/button-action/ButtonAction.mjs";import{ButtonLoader as r}from"./components/buttons/button-action/ButtonLoader.mjs";import{AssignedUser as i}from"./components/data-display/assigned-user/AssignedUser.mjs";import{Avatar as a}from"./components/data-display/avatar/Avatar.mjs";import{Badge as o}from"./components/data-display/badge/Badge.mjs";import{Tooltip as s}from"./components/overlays/tooltip/Tooltip.mjs";import{Calendar as c}from"./components/data-display/calendar/Calendar.mjs";import{Virtual as l}from"./components/misc/virtual/Virtual.mjs";import{ScrollArea as u}from"./components/misc/scroll-area/ScrollArea.mjs";import{Table as d}from"./components/data-display/table/Table.mjs";import{IconRaw as f}from"./components/data-display/icons/icon-raw/IconRaw.mjs";import{Icon as p}from"./components/data-display/icons/icon/Icon.mjs";import{DEFAULT_DATA_TABLE_LABELS as m,DataTableContextProvider as h,useDataTableContext as g}from"./components/data-display/datatables/useDataTableContext.mjs";import{Checkbox as _}from"./components/controls/checkbox/Checkbox.mjs";import{DataTable as v}from"./components/data-display/datatables/DataTable.mjs";import{HorizontalDivider as y}from"./components/misc/horizontal-divider/HorizontalDivider.mjs";import{ScrollAreaAutosize as b}from"./components/misc/scroll-area-autosize/ScrollAreaAutosize.mjs";import{TextInput as x}from"./components/controls/text-input/TextInput.mjs";import{IconWrapped as S}from"./components/data-display/icons/icon-wrapped/IconWrapped.mjs";import{Select as C}from"./components/controls/dropdown/select/Select.mjs";import{DataTablePageSize as w}from"./components/data-display/datatables/DataTablePageSize.mjs";import{Pagination as T}from"./components/navigations/pagination/Pagination.mjs";import{DataTablePagination as E}from"./components/data-display/datatables/DataTablePagination.mjs";import{DataTableBottomSlot as D}from"./components/data-display/datatables/DataTableBottomSlot.mjs";import{DataTableFeedback as O}from"./components/data-display/datatables/DataTableFeedback.mjs";import{DataTableTopSlot as k}from"./components/data-display/datatables/DataTableTopSlot.mjs";import{DescriptionList as A}from"./components/data-display/description-list/DescriptionList.mjs";import{FileIcon as j}from"./components/data-display/file-icon/FileIcon.mjs";import{ResourceItem as M}from"./components/data-display/resource-item/ResourceItem.mjs";import{DocumentItem as N}from"./components/data-display/document-item/DocumentItem.mjs";import{IconSvg as P}from"./components/data-display/icons/icon-svg/IconSvg.mjs";import{Indicator as F}from"./components/data-display/indicator/Indicator.mjs";import{LoaderDot as I}from"./components/data-display/loader-dot/LoaderDot.mjs";import{LoaderOval as L}from"./components/data-display/loader-oval/LoaderOval.mjs";import{LogoImage as R}from"./components/data-display/logos/logo-image/LogoImage.mjs";import{LogoSvg as z}from"./components/data-display/logos/logo-svg/LogoSvg.mjs";import{NotificationBanner as B}from"./components/data-display/notification-banner/NotificationBanner.mjs";import{RemovableItem as V}from"./components/data-display/removable-item/RemovableItem.mjs";import{TagGroup as H}from"./components/data-display/tag-group/TagGroup.mjs";import{Tag as U}from"./components/data-display/tag/Tag.mjs";import{UploadedFile as W}from"./components/data-display/uploaded-file/UploadedFile.mjs";import{UploadedFileDetails as G}from"./components/data-display/uploaded-file/UploadedFileDetails.mjs";import{UploadedFiles as K}from"./components/data-display/uploaded-files/UploadedFiles.mjs";import{UploadingFiles as q}from"./components/data-display/uploading-files/UploadingFiles.mjs";import{ButtonIcon as J}from"./components/buttons/button-icon/ButtonIcon.mjs";import{ButtonIconVisual as Y}from"./components/buttons/button-icon-visual/ButtonIconVisual.mjs";import{ButtonVisual as X}from"./components/buttons/button-visual/ButtonVisual.mjs";import{AvatarDropzone as Z}from"./components/controls/avatar-dropzone/AvatarDropzone.mjs";import{Modal as Q}from"./components/overlays/modal/Modal.mjs";import{Modals as $}from"./components/overlays/modal/index.mjs";import{Toast as ee}from"./components/overlays/toast/Toast.mjs";import{AvatarUpload as te}from"./components/controls/avatar-upload/AvatarUpload.mjs";import{DatePicker as ne}from"./components/controls/date-picker/DatePicker.mjs";import{Autocomplete as re}from"./components/controls/dropdown/autocomplete/Autocomplete.mjs";import{Combobox as ie}from"./components/controls/dropdown/combobox/Combobox.mjs";import{Dropzone as ae}from"./components/controls/dropzone/Dropzone.mjs";import{DropzoneS3 as oe,getFileExtension as se}from"./components/controls/dropzone/DropzoneS3.mjs";import{FileInput as ce}from"./components/controls/file-input/FileInput.mjs";import{FileInputMultiple as le}from"./components/controls/file-input/FileInputMultiple.mjs";import{PasswordInput as ue}from"./components/controls/password-input/PasswordInput.mjs";import{PasswordStrengthInput as de}from"./components/controls/password-input/PasswordStrengthInput.mjs";import{usePasswordRules as fe}from"./components/controls/password-input/usePasswordRules.mjs";import{Radio as pe}from"./components/controls/radio/Radio.mjs";import{SwitchGroup as me}from"./components/controls/switch-group/SwitchGroup.mjs";import{Switch as he}from"./components/controls/switch/Switch.mjs";import{Textarea as ge}from"./components/controls/textarea/Textarea.mjs";import{PASSWORD_RULES as _e}from"./components/forms/rules/password-rules.mjs";import{z as ve}from"./components/forms/rules/zod.mjs";import{Form as ye}from"./components/forms/Form.mjs";import{Card as be,CardBase as xe,CardBody as Se,CardFooter as Ce,CardHeader as we,CardRoot as Te}from"./components/layouts/card/Card.mjs";import{FluidGrid as Ee}from"./components/layouts/fluid-grid/FluidGrid.mjs";import{Grid as De}from"./components/layouts/grid/Grid.mjs";import{Breadcrumbs as Oe}from"./components/navigations/breadcrumbs/Breadcrumbs.mjs";import{Menu as ke}from"./components/navigations/menu/Menu.mjs";import{NavigationMenu as Ae}from"./components/navigations/navigation-menu/NavigationMenu.mjs";import{Sidebar as je}from"./components/navigations/sidebars/sidebar/Sidebar.mjs";import{MageUiProvider as Me}from"./providers/MageUiProvider.mjs";export{i as AssignedUser,re as Autocomplete,a as Avatar,Z as AvatarDropzone,te as AvatarUpload,o as Badge,Oe as Breadcrumbs,e as Button,n as ButtonAction,J as ButtonIcon,Y as ButtonIconVisual,r as ButtonLoader,X as ButtonVisual,c as Calendar,be as Card,xe as CardBase,Se as CardBody,Ce as CardFooter,we as CardHeader,Te as CardRoot,_ as Checkbox,ie as Combobox,m as DEFAULT_DATA_TABLE_LABELS,v as DataTable,D as DataTableBottomSlot,h as DataTableContextProvider,O as DataTableFeedback,w as DataTablePageSize,E as DataTablePagination,k as DataTableTopSlot,ne as DatePicker,A as DescriptionList,N as DocumentItem,ae as Dropzone,oe as DropzoneS3,j as FileIcon,ce as FileInput,le as FileInputMultiple,Ee as FluidGrid,ye as Form,De as Grid,y as HorizontalDivider,p as Icon,f as IconRaw,P as IconSvg,S as IconWrapped,F as Indicator,I as LoaderDot,L as LoaderOval,R as LogoImage,z as LogoSvg,Me as MageUiProvider,ke as Menu,Q as Modal,$ as Modals,Ae as NavigationMenu,B as NotificationBanner,_e as PASSWORD_RULES,T as Pagination,ue as PasswordInput,de as PasswordStrengthInput,pe as Radio,V as RemovableItem,M as ResourceItem,u as ScrollArea,b as ScrollAreaAutosize,C as Select,je as Sidebar,he as Switch,me as SwitchGroup,d as Table,U as Tag,H as TagGroup,x as TextInput,ge as Textarea,ee as Toast,s as Tooltip,W as UploadedFile,G as UploadedFileDetails,K as UploadedFiles,q as UploadingFiles,l as Virtual,t as VisuallyHidden,se as getFileExtension,g as useDataTableContext,fe as usePasswordRules,ve as z};
1
+ import{Button as e}from"./components/buttons/button/Button.mjs";import{VisuallyHidden as t}from"./components/misc/visually-hidden/VisuallyHidden.mjs";import{ButtonAction as n}from"./components/buttons/button-action/ButtonAction.mjs";import{ButtonLoader as r}from"./components/buttons/button-action/ButtonLoader.mjs";import{AssignedUser as i}from"./components/data-display/assigned-user/AssignedUser.mjs";import{Avatar as a}from"./components/data-display/avatar/Avatar.mjs";import{Badge as o}from"./components/data-display/badge/Badge.mjs";import{Tooltip as s}from"./components/overlays/tooltip/Tooltip.mjs";import{Calendar as c}from"./components/data-display/calendar/Calendar.mjs";import{Virtual as l}from"./components/misc/virtual/Virtual.mjs";import{ScrollArea as u}from"./components/misc/scroll-area/ScrollArea.mjs";import{Table as d}from"./components/data-display/table/Table.mjs";import{IconRaw as f}from"./components/data-display/icons/icon-raw/IconRaw.mjs";import{Icon as p}from"./components/data-display/icons/icon/Icon.mjs";import{DEFAULT_DATA_TABLE_LABELS as m,DataTableContextProvider as h,useDataTableContext as g}from"./components/data-display/datatables/useDataTableContext.mjs";import{Checkbox as _}from"./components/controls/checkbox/Checkbox.mjs";import{DataTable as v}from"./components/data-display/datatables/DataTable.mjs";import{HorizontalDivider as y}from"./components/misc/horizontal-divider/HorizontalDivider.mjs";import{ScrollAreaAutosize as b}from"./components/misc/scroll-area-autosize/ScrollAreaAutosize.mjs";import{TextInput as x}from"./components/controls/text-input/TextInput.mjs";import{IconWrapped as S}from"./components/data-display/icons/icon-wrapped/IconWrapped.mjs";import{Select as C}from"./components/controls/dropdown/select/Select.mjs";import{DataTablePageSize as w}from"./components/data-display/datatables/DataTablePageSize.mjs";import{Pagination as T}from"./components/navigations/pagination/Pagination.mjs";import{DataTablePagination as E}from"./components/data-display/datatables/DataTablePagination.mjs";import{DataTableBottomSlot as D}from"./components/data-display/datatables/DataTableBottomSlot.mjs";import{DataTableFeedback as O}from"./components/data-display/datatables/DataTableFeedback.mjs";import{DataTableTopSlot as k}from"./components/data-display/datatables/DataTableTopSlot.mjs";import{DescriptionList as A}from"./components/data-display/description-list/DescriptionList.mjs";import{FileIcon as j}from"./components/data-display/file-icon/FileIcon.mjs";import{ResourceItem as M}from"./components/data-display/resource-item/ResourceItem.mjs";import{DocumentItem as N}from"./components/data-display/document-item/DocumentItem.mjs";import{IconSvg as P}from"./components/data-display/icons/icon-svg/IconSvg.mjs";import{Indicator as F}from"./components/data-display/indicator/Indicator.mjs";import{LoaderDot as I}from"./components/data-display/loader-dot/LoaderDot.mjs";import{LoaderOval as L}from"./components/data-display/loader-oval/LoaderOval.mjs";import{LogoImage as R}from"./components/data-display/logos/logo-image/LogoImage.mjs";import{LogoSvg as z}from"./components/data-display/logos/logo-svg/LogoSvg.mjs";import{NotificationBanner as B}from"./components/data-display/notification-banner/NotificationBanner.mjs";import{RemovableItem as V}from"./components/data-display/removable-item/RemovableItem.mjs";import{TagGroup as H}from"./components/data-display/tag-group/TagGroup.mjs";import{Tag as U}from"./components/data-display/tag/Tag.mjs";import{UploadedFile as W}from"./components/data-display/uploaded-file/UploadedFile.mjs";import{UploadedFileDetails as G}from"./components/data-display/uploaded-file/UploadedFileDetails.mjs";import{UploadedFiles as K}from"./components/data-display/uploaded-files/UploadedFiles.mjs";import{UploadingFiles as q}from"./components/data-display/uploading-files/UploadingFiles.mjs";import{ButtonIcon as J}from"./components/buttons/button-icon/ButtonIcon.mjs";import{ButtonIconVisual as Y}from"./components/buttons/button-icon-visual/ButtonIconVisual.mjs";import{ButtonVisual as X}from"./components/buttons/button-visual/ButtonVisual.mjs";import{Modal as Z}from"./components/overlays/modal/Modal.mjs";import{Modals as Q}from"./components/overlays/modal/index.mjs";import{Toast as $}from"./components/overlays/toast/Toast.mjs";import{AvatarUpload as ee}from"./components/controls/avatar-upload/AvatarUpload.mjs";import{DatePicker as te}from"./components/controls/date-picker/DatePicker.mjs";import{Autocomplete as ne}from"./components/controls/dropdown/autocomplete/Autocomplete.mjs";import{Combobox as re}from"./components/controls/dropdown/combobox/Combobox.mjs";import{AvatarDropzone as ie}from"./components/controls/dropzone/avatar/AvatarDropzone.mjs";import{getFileExtension as ae}from"./components/controls/dropzone/use-s3-upload.mjs";import{AvatarDropzoneS3 as oe}from"./components/controls/dropzone/avatar/AvatarDropzoneS3.mjs";import{Dropzone as se}from"./components/controls/dropzone/Dropzone.mjs";import{DropzoneS3 as ce}from"./components/controls/dropzone/DropzoneS3.mjs";import{FileInput as le}from"./components/controls/file-input/FileInput.mjs";import{FileInputMultiple as ue}from"./components/controls/file-input/FileInputMultiple.mjs";import{PasswordInput as de}from"./components/controls/password-input/PasswordInput.mjs";import{PasswordStrengthInput as fe}from"./components/controls/password-input/PasswordStrengthInput.mjs";import{usePasswordRules as pe}from"./components/controls/password-input/usePasswordRules.mjs";import{Radio as me}from"./components/controls/radio/Radio.mjs";import{SwitchGroup as he}from"./components/controls/switch-group/SwitchGroup.mjs";import{Switch as ge}from"./components/controls/switch/Switch.mjs";import{Textarea as _e}from"./components/controls/textarea/Textarea.mjs";import{PASSWORD_RULES as ve}from"./components/forms/rules/password-rules.mjs";import{z as ye}from"./components/forms/rules/zod.mjs";import{Form as be}from"./components/forms/Form.mjs";import{Card as xe,CardBase as Se,CardBody as Ce,CardFooter as we,CardHeader as Te,CardRoot as Ee}from"./components/layouts/card/Card.mjs";import{FluidGrid as De}from"./components/layouts/fluid-grid/FluidGrid.mjs";import{Grid as Oe}from"./components/layouts/grid/Grid.mjs";import{Breadcrumbs as ke}from"./components/navigations/breadcrumbs/Breadcrumbs.mjs";import{Menu as Ae}from"./components/navigations/menu/Menu.mjs";import{NavigationMenu as je}from"./components/navigations/navigation-menu/NavigationMenu.mjs";import{Sidebar as Me}from"./components/navigations/sidebars/sidebar/Sidebar.mjs";import{MageUiProvider as Ne}from"./providers/MageUiProvider.mjs";export{i as AssignedUser,ne as Autocomplete,a as Avatar,ie as AvatarDropzone,oe as AvatarDropzoneS3,ee as AvatarUpload,o as Badge,ke as Breadcrumbs,e as Button,n as ButtonAction,J as ButtonIcon,Y as ButtonIconVisual,r as ButtonLoader,X as ButtonVisual,c as Calendar,xe as Card,Se as CardBase,Ce as CardBody,we as CardFooter,Te as CardHeader,Ee as CardRoot,_ as Checkbox,re as Combobox,m as DEFAULT_DATA_TABLE_LABELS,v as DataTable,D as DataTableBottomSlot,h as DataTableContextProvider,O as DataTableFeedback,w as DataTablePageSize,E as DataTablePagination,k as DataTableTopSlot,te as DatePicker,A as DescriptionList,N as DocumentItem,se as Dropzone,ce as DropzoneS3,j as FileIcon,le as FileInput,ue as FileInputMultiple,De as FluidGrid,be as Form,Oe as Grid,y as HorizontalDivider,p as Icon,f as IconRaw,P as IconSvg,S as IconWrapped,F as Indicator,I as LoaderDot,L as LoaderOval,R as LogoImage,z as LogoSvg,Ne as MageUiProvider,Ae as Menu,Z as Modal,Q as Modals,je as NavigationMenu,B as NotificationBanner,ve as PASSWORD_RULES,T as Pagination,de as PasswordInput,fe as PasswordStrengthInput,me as Radio,V as RemovableItem,M as ResourceItem,u as ScrollArea,b as ScrollAreaAutosize,C as Select,Me as Sidebar,ge as Switch,he as SwitchGroup,d as Table,U as Tag,H as TagGroup,x as TextInput,_e as Textarea,$ as Toast,s as Tooltip,W as UploadedFile,G as UploadedFileDetails,K as UploadedFiles,q as UploadingFiles,l as Virtual,t as VisuallyHidden,ae as getFileExtension,g as useDataTableContext,pe as usePasswordRules,ye as z};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mage-ui/components",
3
- "version": "1.0.131",
3
+ "version": "1.0.133",
4
4
  "private": false,
5
5
  "description": "",
6
6
  "keywords": [],
@@ -25,7 +25,7 @@
25
25
  "rimraf": "^6.1.3",
26
26
  "tsdown": "^0.21.4",
27
27
  "typescript": "^5.9.3",
28
- "@mage-ui/preset": "1.0.131",
28
+ "@mage-ui/preset": "1.0.133",
29
29
  "@mage-ui/styled-system": "1.0.8"
30
30
  },
31
31
  "peerDependencies": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"AvatarDropzone.d.mts","names":[],"sources":["../../../../src/components/controls/avatar-dropzone/AvatarDropzone.tsx"],"mappings":";;;;KAmBY,mBAAA;EACV,KAAA;EACA,QAAA,IAAY,IAAA,EAAM,IAAA;EAClB,OAAA;EACA,UAAA;IACE,QAAA;IACA,IAAA;IACA,KAAA;IACA,KAAA;IACA,OAAA;IACA,eAAA;IACA,QAAA;IACA,IAAA,GAAO,SAAA;EAAA;AAAA;AAAA,cAIE,cAAA;EAAkB,KAAA;EAAA,QAAA;EAAA,OAAA;EAAA;AAAA,GAK5B,mBAAA,KAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,2 +0,0 @@
1
- import{Icon as e}from"../../data-display/icons/icon/Icon.mjs";import{cx as t}from"@mage-ui/styled-system/css";import{avatarDropzone as n,avatarDropzoneIcon as r,avatarDropzoneIconSlot as i,avatarDropzoneImage as a,avatarDropzoneInner as o,avatarDropzoneOverlay as s,avatarDropzoneOverlayIconSlot as c,avatarDropzoneRoot as l}from"@mage-ui/styled-system/recipes";import{Fragment as u,jsx as d,jsxs as f}from"react/jsx-runtime";import{useCallback as p,useState as m}from"react";import{Dropzone as h,IMAGE_MIME_TYPE as g}from"@mantine/dropzone";const _=({value:_,onChange:v,maxSize:y,classNames:b})=>{let[x,S]=m(_??null);return f(h,{onDrop:p(e=>{let t=e[0];t&&(S(URL.createObjectURL(t)),v?.(t))},[v]),accept:g,maxFiles:1,maxSize:y,classNames:{root:t(b?.dropzone??n(),b?.root??l(),`group`),inner:b?.inner??o()},children:[d(h.Idle,{children:x?f(u,{children:[d(`img`,{src:x,alt:`Avatar`,className:b?.image??a()}),d(`div`,{className:b?.overlay??s()}),d(`div`,{className:b?.overlayIconSlot??c(),children:d(e,{name:`mage-avatar-dropzone-camera-plus`,path:`/icons/sprite-mage.svg`,classNames:{icon:b?.icon?.icon??r()}})})]}):d(`div`,{className:b?.iconSlot??i(),children:d(e,{name:`mage-avatar-dropzone-camera-plus`,path:`/icons/sprite-mage.svg`,classNames:{icon:b?.icon?.icon??r()}})})}),d(h.Accept,{children:d(`div`,{className:b?.iconSlot??i(),children:d(e,{name:`mage-dropzone-thumbs-up`,path:`/icons/sprite-mage.svg`,classNames:{icon:b?.icon?.icon??r()}})})}),d(h.Reject,{children:d(`div`,{className:b?.iconSlot??i(),children:d(e,{name:`mage-dropzone-thumbs-down`,path:`/icons/sprite-mage.svg`,classNames:{icon:b?.icon?.icon??r()}})})})]})};export{_ as AvatarDropzone};
2
- //# sourceMappingURL=AvatarDropzone.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AvatarDropzone.mjs","names":["MantineDropzone"],"sources":["../../../../src/components/controls/avatar-dropzone/AvatarDropzone.tsx"],"sourcesContent":["import { useCallback, useState } from 'react';\n\nimport { cx } from '@mage-ui/styled-system/css';\nimport {\n avatarDropzone,\n avatarDropzoneIcon,\n avatarDropzoneIconSlot,\n avatarDropzoneImage,\n avatarDropzoneInner,\n avatarDropzoneOverlay,\n avatarDropzoneOverlayIconSlot,\n avatarDropzoneRoot,\n} from '@mage-ui/styled-system/recipes';\nimport {\n IMAGE_MIME_TYPE,\n Dropzone as MantineDropzone,\n} from '@mantine/dropzone';\nimport { Icon, type IconProps } from '@/components/data-display';\n\nexport type AvatarDropzoneProps = {\n value?: string;\n onChange?: (file: File) => void;\n maxSize?: number;\n classNames?: {\n dropzone?: string;\n root?: string;\n inner?: string;\n image?: string;\n overlay?: string;\n overlayIconSlot?: string;\n iconSlot?: string;\n icon?: IconProps['classNames'];\n };\n};\n\nexport const AvatarDropzone = ({\n value,\n onChange,\n maxSize,\n classNames,\n}: AvatarDropzoneProps) => {\n const [preview, setPreview] = useState<string | null>(value ?? null);\n\n const handleDrop = useCallback(\n (files: File[]) => {\n const file = files[0];\n if (!file) return;\n const url = URL.createObjectURL(file);\n setPreview(url);\n onChange?.(file);\n },\n [onChange],\n );\n\n return (\n <MantineDropzone\n onDrop={handleDrop}\n accept={IMAGE_MIME_TYPE}\n maxFiles={1}\n maxSize={maxSize}\n classNames={{\n root: cx(\n classNames?.dropzone ?? avatarDropzone(),\n classNames?.root ?? avatarDropzoneRoot(),\n 'group',\n ),\n inner: classNames?.inner ?? avatarDropzoneInner(),\n }}\n >\n <MantineDropzone.Idle>\n {preview ? (\n <>\n <img\n src={preview}\n alt='Avatar'\n className={classNames?.image ?? avatarDropzoneImage()}\n />\n <div className={classNames?.overlay ?? avatarDropzoneOverlay()} />\n <div\n className={\n classNames?.overlayIconSlot ?? avatarDropzoneOverlayIconSlot()\n }\n >\n <Icon\n name='mage-avatar-dropzone-camera-plus'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.icon?.icon ?? avatarDropzoneIcon(),\n }}\n />\n </div>\n </>\n ) : (\n <div className={classNames?.iconSlot ?? avatarDropzoneIconSlot()}>\n <Icon\n name='mage-avatar-dropzone-camera-plus'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.icon?.icon ?? avatarDropzoneIcon(),\n }}\n />\n </div>\n )}\n </MantineDropzone.Idle>\n <MantineDropzone.Accept>\n <div className={classNames?.iconSlot ?? avatarDropzoneIconSlot()}>\n <Icon\n name='mage-dropzone-thumbs-up'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.icon?.icon ?? avatarDropzoneIcon(),\n }}\n />\n </div>\n </MantineDropzone.Accept>\n <MantineDropzone.Reject>\n <div className={classNames?.iconSlot ?? avatarDropzoneIconSlot()}>\n <Icon\n name='mage-dropzone-thumbs-down'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.icon?.icon ?? avatarDropzoneIcon(),\n }}\n />\n </div>\n </MantineDropzone.Reject>\n </MantineDropzone>\n );\n};\n"],"mappings":"8hBAmCA,MAAa,GAAkB,CAC7B,QACA,WACA,UACA,gBACyB,CACzB,GAAM,CAAC,EAAS,GAAc,EAAwB,GAAS,KAAK,CAapE,OACE,EAACA,EAAD,CACE,OAbe,EAChB,GAAkB,CACjB,IAAM,EAAO,EAAM,GACd,IAEL,EADY,IAAI,gBAAgB,EAAK,CACtB,CACf,IAAW,EAAK,GAElB,CAAC,EAAS,CACX,CAKG,OAAQ,EACR,SAAU,EACD,UACT,WAAY,CACV,KAAM,EACJ,GAAY,UAAY,GAAgB,CACxC,GAAY,MAAQ,GAAoB,CACxC,QACD,CACD,MAAO,GAAY,OAAS,GAAqB,CAClD,UAZH,CAcE,EAACA,EAAgB,KAAjB,CAAA,SACG,EACC,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,MAAD,CACE,IAAK,EACL,IAAI,SACJ,UAAW,GAAY,OAAS,GAAqB,CACrD,CAAA,CACF,EAAC,MAAD,CAAK,UAAW,GAAY,SAAW,GAAuB,CAAI,CAAA,CAClE,EAAC,MAAD,CACE,UACE,GAAY,iBAAmB,GAA+B,UAGhE,EAAC,EAAD,CACE,KAAK,mCACL,KAAK,yBACL,WAAY,CACV,KAAM,GAAY,MAAM,MAAQ,GAAoB,CACrD,CACD,CAAA,CACE,CAAA,CACL,CAAA,CAAA,CAEH,EAAC,MAAD,CAAK,UAAW,GAAY,UAAY,GAAwB,UAC9D,EAAC,EAAD,CACE,KAAK,mCACL,KAAK,yBACL,WAAY,CACV,KAAM,GAAY,MAAM,MAAQ,GAAoB,CACrD,CACD,CAAA,CACE,CAAA,CAEa,CAAA,CACvB,EAACA,EAAgB,OAAjB,CAAA,SACE,EAAC,MAAD,CAAK,UAAW,GAAY,UAAY,GAAwB,UAC9D,EAAC,EAAD,CACE,KAAK,0BACL,KAAK,yBACL,WAAY,CACV,KAAM,GAAY,MAAM,MAAQ,GAAoB,CACrD,CACD,CAAA,CACE,CAAA,CACiB,CAAA,CACzB,EAACA,EAAgB,OAAjB,CAAA,SACE,EAAC,MAAD,CAAK,UAAW,GAAY,UAAY,GAAwB,UAC9D,EAAC,EAAD,CACE,KAAK,4BACL,KAAK,yBACL,WAAY,CACV,KAAM,GAAY,MAAM,MAAQ,GAAoB,CACrD,CACD,CAAA,CACE,CAAA,CACiB,CAAA,CACT"}