@mage-ui/components 1.0.126 → 1.0.128

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 +15 -2
  2. package/dist/components/controls/dropzone/Dropzone.d.mts.map +1 -1
  3. package/dist/components/controls/dropzone/Dropzone.mjs.map +1 -1
  4. package/dist/components/controls/dropzone/use-dropzone-state.mjs.map +1 -1
  5. package/dist/components/controls/dropzone-s3/DropzoneS3.d.mts +9 -5
  6. package/dist/components/controls/dropzone-s3/DropzoneS3.d.mts.map +1 -1
  7. package/dist/components/controls/dropzone-s3/DropzoneS3.mjs +1 -1
  8. package/dist/components/controls/dropzone-s3/DropzoneS3.mjs.map +1 -1
  9. package/dist/components/data-display/assigned-user/AssignedUser.mjs +1 -1
  10. package/dist/components/data-display/assigned-user/AssignedUser.mjs.map +1 -1
  11. package/dist/components/data-display/document-item/DocumentItem.d.mts +28 -0
  12. package/dist/components/data-display/document-item/DocumentItem.d.mts.map +1 -0
  13. package/dist/components/data-display/document-item/DocumentItem.mjs +2 -0
  14. package/dist/components/data-display/document-item/DocumentItem.mjs.map +1 -0
  15. package/dist/components/data-display/file-icon/FileIcon.d.mts +22 -0
  16. package/dist/components/data-display/file-icon/FileIcon.d.mts.map +1 -0
  17. package/dist/components/data-display/file-icon/FileIcon.mjs +2 -0
  18. package/dist/components/data-display/file-icon/FileIcon.mjs.map +1 -0
  19. package/dist/components/data-display/index.d.mts +3 -0
  20. package/dist/components/data-display/removable-item/RemovableItem.d.mts +1 -1
  21. package/dist/components/data-display/removable-item/RemovableItem.d.mts.map +1 -1
  22. package/dist/components/data-display/removable-item/RemovableItem.mjs +1 -1
  23. package/dist/components/data-display/removable-item/RemovableItem.mjs.map +1 -1
  24. package/dist/components/data-display/resource-item/ResourceItem.d.mts +24 -0
  25. package/dist/components/data-display/resource-item/ResourceItem.d.mts.map +1 -0
  26. package/dist/components/data-display/resource-item/ResourceItem.mjs +2 -0
  27. package/dist/components/data-display/resource-item/ResourceItem.mjs.map +1 -0
  28. package/dist/components/data-display/uploaded-file/UploadedFile.d.mts +2 -4
  29. package/dist/components/data-display/uploaded-file/UploadedFile.d.mts.map +1 -1
  30. package/dist/components/data-display/uploaded-file/UploadedFile.mjs +1 -1
  31. package/dist/components/data-display/uploaded-file/UploadedFile.mjs.map +1 -1
  32. package/dist/components/index.d.mts +3 -0
  33. package/dist/index.d.mts +4 -1
  34. package/dist/index.mjs +1 -1
  35. package/package.json +3 -3
  36. package/dist/components/data-display/uploaded-file/UploadedFileIcon.mjs +0 -2
  37. package/dist/components/data-display/uploaded-file/UploadedFileIcon.mjs.map +0 -1
@@ -45,8 +45,21 @@ type DropzoneProps = {
45
45
  onChange?: (files: File[]) => void;
46
46
  data?: Record<string, unknown>;
47
47
  headers?: Record<string, string>;
48
- accept?: string[];
49
- preventDropOnDocument?: boolean;
48
+ /**
49
+ * Files the dropzone accepts. Forwarded directly to Mantine's
50
+ * `<Dropzone accept>`.
51
+ *
52
+ * Two formats are supported:
53
+ * - **Map (preferred)**: `{ [mimeType]: ['.ext', ...] }` — matches
54
+ * the native `react-dropzone` shape and produces a correct
55
+ * `<input accept>` with MIME + extension pairs. Required when any
56
+ * key would otherwise be a bare extension string.
57
+ * - **Array**: `string[]` of MIME types (no `.ext` entries) — kept
58
+ * for backward compatibility. Mixing `.ext` strings into the
59
+ * array triggers a `Skipped "..." because it is not a valid MIME
60
+ * type` warning from `react-dropzone` v15+.
61
+ */
62
+ accept?: string[] | Record<string, string[]>;
50
63
  title?: ReactNode;
51
64
  subtitle?: ReactNode;
52
65
  hint?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"Dropzone.d.mts","names":[],"sources":["../../../../src/components/controls/dropzone/Dropzone.tsx"],"mappings":";;;;;;;KAkCY,QAAA;EACV,IAAA;EACA,IAAA;EACA,IAAA;EACA,IAAA;EACA,QAAA;EACA,OAAA;EACA,GAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,KAGU,aAAA;EACV,QAAA;IACE,KAAA;IACA,WAAA;IACA;EAAA;IAEA,KAAA,EAAO,MAAA,SAAe,QAAA;IACtB,WAAA;IACA,UAAA,GAAa,QAAA;EAAA,MACT,SAAA;EACN,YAAA,GAAe,MAAA,SAAe,QAAA;EAC9B,QAAA;EAXU;;;;;EAiBV,GAAA;EAXwB;;;;;EAiBxB,QAAA,GAAW,QAAA,EAMQ;EAJnB,QAAA,YAMU;EAJV,OAAA,WAQW;EANX,QAAA,IAAY,KAAA,EAAO,IAAA;EACnB,IAAA,GAAO,MAAA;EACP,OAAA,GAAU,MAAA;EACV,MAAA;EACA,qBAAA;EACA,KAAA,GAAQ,SAAA;EACR,QAAA,GAAW,SAAA;EACX,IAAA,GAAO,SAAA;EACP,OAAA;EACA,cAAA,IAAkB,IAAA,EAAM,QAAA;EACxB,YAAA;EACA,UAAA;IACE,QAAA;IACA,IAAA;IACA,gBAAA;MACE,IAAA;MACA,KAAA;IAAA;IAEF,QAAA;IACA,YAAA,GAAe,SAAA;IACf,MAAA,GAAS,eAAA;IACT,QAAA;IACA,KAAA;IACA,QAAA;IACA,IAAA;EAAA;EAEF,SAAA;AAAA;AAAA,cAGW,QAAA;EAAY,IAAA;EAAA,OAAA;EAAA,QAAA;EAAA,YAAA;EAAA,QAAA;EAAA,GAAA;EAAA,QAAA;EAAA,QAAA;EAAA,OAAA;EAAA,QAAA;EAAA,MAAA;EAAA,KAAA;EAAA,QAAA;EAAA,IAAA;EAAA,OAAA;EAAA,cAAA;EAAA,UAAA;EAAA,SAAA;EAAA;AAAA,GAoBtB,aAAA,KAAa,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"Dropzone.d.mts","names":[],"sources":["../../../../src/components/controls/dropzone/Dropzone.tsx"],"mappings":";;;;;;;KAkCY,QAAA;EACV,IAAA;EACA,IAAA;EACA,IAAA;EACA,IAAA;EACA,QAAA;EACA,OAAA;EACA,GAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,KAGU,aAAA;EACV,QAAA;IACE,KAAA;IACA,WAAA;IACA;EAAA;IAEA,KAAA,EAAO,MAAA,SAAe,QAAA;IACtB,WAAA;IACA,UAAA,GAAa,QAAA;EAAA,MACT,SAAA;EACN,YAAA,GAAe,MAAA,SAAe,QAAA;EAC9B,QAAA;EAXU;;;;;EAiBV,GAAA;EAXwB;;;;;EAiBxB,QAAA,GAAW,QAAA,EAMQ;EAJnB,QAAA,YAMU;EAJV,OAAA,WAoBQ;EAlBR,QAAA,IAAY,KAAA,EAAO,IAAA;EACnB,IAAA,GAAO,MAAA;EACP,OAAA,GAAU,MAAA;EA8BO;;;;;;;;;;;;;;EAfjB,MAAA,cAAoB,MAAA;EACpB,KAAA,GAAQ,SAAA;EACR,QAAA,GAAW,SAAA;EACX,IAAA,GAAO,SAAA;EACP,OAAA;EACA,cAAA,IAAkB,IAAA,EAAM,QAAA;EACxB,YAAA;EACA,UAAA;IACE,QAAA;IACA,IAAA;IACA,gBAAA;MACE,IAAA;MACA,KAAA;IAAA;IAEF,QAAA;IACA,YAAA,GAAe,SAAA;IACf,MAAA,GAAS,eAAA;IACT,QAAA;IACA,KAAA;IACA,QAAA;IACA,IAAA;EAAA;EAEF,SAAA;AAAA;AAAA,cAGW,QAAA;EAAY,IAAA;EAAA,OAAA;EAAA,QAAA;EAAA,YAAA;EAAA,QAAA;EAAA,GAAA;EAAA,QAAA;EAAA,QAAA;EAAA,OAAA;EAAA,QAAA;EAAA,MAAA;EAAA,KAAA;EAAA,QAAA;EAAA,IAAA;EAAA,OAAA;EAAA,cAAA;EAAA,UAAA;EAAA,SAAA;EAAA;AAAA,GAoBtB,aAAA,KAAa,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Dropzone.mjs","names":["Dropzone","MantineDropzone"],"sources":["../../../../src/components/controls/dropzone/Dropzone.tsx"],"sourcesContent":["import { type ReactNode, useCallback, useRef } from 'react';\n\nimport { cx } from '@mage-ui/styled-system/css';\nimport {\n dropzone,\n dropzoneDropzoneInner,\n dropzoneDropzoneRoot,\n dropzoneHint,\n dropzoneIcon,\n dropzoneIconSlot,\n dropzoneLoader,\n dropzoneLoaderRoot,\n dropzoneRoot,\n dropzoneSubtitle,\n dropzoneTextSlot,\n dropzoneTitle,\n} from '@mage-ui/styled-system/recipes';\nimport { Dropzone as MantineDropzone } from '@mantine/dropzone';\nimport {\n Icon,\n type IconProps,\n LoaderOval,\n type LoaderOvalProps,\n} from '@/components/data-display';\n\nimport {\n type UploadProgress,\n type UploadResponse,\n type Uploader,\n} from './upload-service';\nimport { useDropzoneState } from './use-dropzone-state';\n\nexport type { UploadProgress, UploadResponse, Uploader };\n\nexport type FileData = {\n name: string;\n size: number;\n type: string;\n date: string;\n uploaded: boolean;\n loading: boolean;\n url: string;\n error?: string;\n progress?: number; // (0-100)\n};\n\nexport type DropzoneProps = {\n children: ({\n files,\n isUploading,\n removeFile,\n }: {\n files: Record<string, FileData>;\n isUploading: boolean;\n removeFile: (fileName: string) => void;\n }) => ReactNode;\n initialFiles?: Record<string, FileData>;\n maxFiles?: number;\n /**\n * Endpoint used by the built-in FormData uploader. Required when\n * `autoSend=true` (default) AND no custom `uploader` is provided.\n * Ignored if `uploader` is provided.\n */\n url?: string;\n /**\n * Custom upload function that replaces the built-in FormData POST.\n * Use it for multi-step flows (e.g. presigned S3) or any non-standard\n * transport. When set, the `url` prop is ignored.\n */\n uploader?: Uploader;\n /** When false, files are added to state but not uploaded automatically. Default: true. */\n autoSend?: boolean;\n /** Maximum file size in bytes. Files exceeding this will be rejected. */\n maxSize?: number;\n /** Called when the file list changes (added or removed). Useful when autoSend=false. */\n onChange?: (files: File[]) => void;\n data?: Record<string, unknown>;\n headers?: Record<string, string>;\n accept?: string[];\n preventDropOnDocument?: boolean;\n title?: ReactNode;\n subtitle?: ReactNode;\n hint?: ReactNode;\n inputId?: string;\n onFileUploaded?: (file: FileData) => void;\n hideWhenFull?: boolean;\n classNames?: {\n dropzone?: string;\n root?: string;\n dropzoneDropzone?: {\n root?: string;\n inner?: string;\n };\n iconSlot?: string;\n dropzoneIcon?: IconProps['classNames'];\n loader?: LoaderOvalProps['classNames'];\n textSlot?: string;\n title?: string;\n subtitle?: string;\n hint?: string;\n };\n direction?: 'default' | 'reverse';\n};\n\nexport const Dropzone = ({\n data,\n headers,\n children,\n initialFiles = {},\n maxFiles,\n url,\n uploader,\n autoSend = true,\n maxSize,\n onChange,\n accept,\n title,\n subtitle,\n hint,\n inputId,\n onFileUploaded,\n classNames,\n direction = 'default',\n hideWhenFull = false,\n}: DropzoneProps) => {\n const dropzoneRef = useRef<HTMLDivElement>(null);\n const rawFilesRef = useRef<Map<string, File>>(new Map());\n const {\n files,\n isUploading,\n uploadMultipleFiles,\n addFile,\n removeFile: hookRemoveFile,\n } = useDropzoneState(url, initialFiles, onFileUploaded, headers, uploader);\n\n const removeFile = useCallback(\n (fileName: string) => {\n hookRemoveFile(fileName);\n rawFilesRef.current.delete(fileName);\n if (!autoSend && onChange) {\n onChange(Array.from(rawFilesRef.current.values()));\n }\n },\n [hookRemoveFile, autoSend, onChange],\n );\n\n const handleDrop = useCallback(\n async (acceptedFiles: File[]) => {\n const currentCount = Object.keys(files).length;\n const max = maxFiles ?? Number.POSITIVE_INFINITY;\n const remainingSlots = max - currentCount;\n if (remainingSlots <= 0) {\n return;\n }\n const filesToProcess = acceptedFiles.slice(0, remainingSlots);\n if (autoSend) {\n await uploadMultipleFiles(filesToProcess, data);\n } else {\n for (const file of filesToProcess) {\n addFile(file);\n rawFilesRef.current.set(file.name, file);\n }\n onChange?.(Array.from(rawFilesRef.current.values()));\n }\n },\n [autoSend, uploadMultipleFiles, addFile, data, files, maxFiles, onChange],\n );\n\n const isFull =\n maxFiles !== undefined && Object.keys(files).length >= maxFiles;\n\n return (\n <div\n className={cx(\n classNames?.dropzone ?? dropzone(),\n classNames?.root ?? dropzoneRoot(),\n )}\n data-direction={direction}\n >\n {(!hideWhenFull || !isFull) && (\n <MantineDropzone\n ref={dropzoneRef}\n onDrop={handleDrop}\n disabled={isFull}\n loading={isUploading}\n accept={accept}\n maxSize={maxSize}\n preventDropOnDocument\n inputProps={{ id: inputId }}\n classNames={{\n root:\n classNames?.dropzoneDropzone?.root ??\n cx(dropzoneDropzoneRoot(), 'group'),\n inner:\n classNames?.dropzoneDropzone?.inner ?? dropzoneDropzoneInner(),\n }}\n >\n <div className={classNames?.iconSlot ?? dropzoneIconSlot()}>\n {isUploading ? (\n <LoaderOval\n classNames={{\n loader: classNames?.loader?.loader ?? dropzoneLoader(),\n root: classNames?.loader?.root ?? dropzoneLoaderRoot(),\n }}\n />\n ) : (\n <>\n <MantineDropzone.Idle>\n <Icon\n name='mage-dropzone-upload-01'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.dropzoneIcon?.icon ?? dropzoneIcon(),\n }}\n />\n </MantineDropzone.Idle>\n <MantineDropzone.Accept>\n <Icon\n name='mage-dropzone-thumbs-up'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.dropzoneIcon?.icon ?? dropzoneIcon(),\n }}\n />\n </MantineDropzone.Accept>\n <MantineDropzone.Reject>\n <Icon\n name='mage-dropzone-thumbs-down'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.dropzoneIcon?.icon ?? dropzoneIcon(),\n }}\n />\n </MantineDropzone.Reject>\n </>\n )}\n </div>\n <div className={classNames?.textSlot ?? dropzoneTextSlot()}>\n <span className={classNames?.title ?? dropzoneTitle()}>\n {title || 'Upload files'}\n </span>\n <span className={classNames?.subtitle ?? dropzoneSubtitle()}>\n {subtitle || 'Drag images here or click to select files'}\n </span>\n <span className={classNames?.hint ?? dropzoneHint()}>\n {hint ||\n 'Attach as many files as you like, each file should not exceed 5mb'}\n </span>\n </div>\n </MantineDropzone>\n )}\n {children({ files, isUploading, removeFile })}\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"Dropzone.mjs","names":["Dropzone","MantineDropzone"],"sources":["../../../../src/components/controls/dropzone/Dropzone.tsx"],"sourcesContent":["import { type ReactNode, useCallback, useRef } from 'react';\n\nimport { cx } from '@mage-ui/styled-system/css';\nimport {\n dropzone,\n dropzoneDropzoneInner,\n dropzoneDropzoneRoot,\n dropzoneHint,\n dropzoneIcon,\n dropzoneIconSlot,\n dropzoneLoader,\n dropzoneLoaderRoot,\n dropzoneRoot,\n dropzoneSubtitle,\n dropzoneTextSlot,\n dropzoneTitle,\n} from '@mage-ui/styled-system/recipes';\nimport { Dropzone as MantineDropzone } from '@mantine/dropzone';\nimport {\n Icon,\n type IconProps,\n LoaderOval,\n type LoaderOvalProps,\n} from '@/components/data-display';\n\nimport type {\n Uploader,\n UploadProgress,\n UploadResponse,\n} from './upload-service';\nimport { useDropzoneState } from './use-dropzone-state';\n\nexport type { Uploader, UploadProgress, UploadResponse };\n\nexport type FileData = {\n name: string;\n size: number;\n type: string;\n date: string;\n uploaded: boolean;\n loading: boolean;\n url: string;\n error?: string;\n progress?: number; // (0-100)\n};\n\nexport type DropzoneProps = {\n children: ({\n files,\n isUploading,\n removeFile,\n }: {\n files: Record<string, FileData>;\n isUploading: boolean;\n removeFile: (fileName: string) => void;\n }) => ReactNode;\n initialFiles?: Record<string, FileData>;\n maxFiles?: number;\n /**\n * Endpoint used by the built-in FormData uploader. Required when\n * `autoSend=true` (default) AND no custom `uploader` is provided.\n * Ignored if `uploader` is provided.\n */\n url?: string;\n /**\n * Custom upload function that replaces the built-in FormData POST.\n * Use it for multi-step flows (e.g. presigned S3) or any non-standard\n * transport. When set, the `url` prop is ignored.\n */\n uploader?: Uploader;\n /** When false, files are added to state but not uploaded automatically. Default: true. */\n autoSend?: boolean;\n /** Maximum file size in bytes. Files exceeding this will be rejected. */\n maxSize?: number;\n /** Called when the file list changes (added or removed). Useful when autoSend=false. */\n onChange?: (files: File[]) => void;\n data?: Record<string, unknown>;\n headers?: Record<string, string>;\n /**\n * Files the dropzone accepts. Forwarded directly to Mantine's\n * `<Dropzone accept>`.\n *\n * Two formats are supported:\n * - **Map (preferred)**: `{ [mimeType]: ['.ext', ...] }` — matches\n * the native `react-dropzone` shape and produces a correct\n * `<input accept>` with MIME + extension pairs. Required when any\n * key would otherwise be a bare extension string.\n * - **Array**: `string[]` of MIME types (no `.ext` entries) — kept\n * for backward compatibility. Mixing `.ext` strings into the\n * array triggers a `Skipped \"...\" because it is not a valid MIME\n * type` warning from `react-dropzone` v15+.\n */\n accept?: string[] | Record<string, string[]>;\n title?: ReactNode;\n subtitle?: ReactNode;\n hint?: ReactNode;\n inputId?: string;\n onFileUploaded?: (file: FileData) => void;\n hideWhenFull?: boolean;\n classNames?: {\n dropzone?: string;\n root?: string;\n dropzoneDropzone?: {\n root?: string;\n inner?: string;\n };\n iconSlot?: string;\n dropzoneIcon?: IconProps['classNames'];\n loader?: LoaderOvalProps['classNames'];\n textSlot?: string;\n title?: string;\n subtitle?: string;\n hint?: string;\n };\n direction?: 'default' | 'reverse';\n};\n\nexport const Dropzone = ({\n data,\n headers,\n children,\n initialFiles = {},\n maxFiles,\n url,\n uploader,\n autoSend = true,\n maxSize,\n onChange,\n accept,\n title,\n subtitle,\n hint,\n inputId,\n onFileUploaded,\n classNames,\n direction = 'default',\n hideWhenFull = false,\n}: DropzoneProps) => {\n const dropzoneRef = useRef<HTMLDivElement>(null);\n const rawFilesRef = useRef<Map<string, File>>(new Map());\n const {\n files,\n isUploading,\n uploadMultipleFiles,\n addFile,\n removeFile: hookRemoveFile,\n } = useDropzoneState(url, initialFiles, onFileUploaded, headers, uploader);\n\n const removeFile = useCallback(\n (fileName: string) => {\n hookRemoveFile(fileName);\n rawFilesRef.current.delete(fileName);\n if (!autoSend && onChange) {\n onChange(Array.from(rawFilesRef.current.values()));\n }\n },\n [hookRemoveFile, autoSend, onChange],\n );\n\n const handleDrop = useCallback(\n async (acceptedFiles: File[]) => {\n const currentCount = Object.keys(files).length;\n const max = maxFiles ?? Number.POSITIVE_INFINITY;\n const remainingSlots = max - currentCount;\n if (remainingSlots <= 0) {\n return;\n }\n const filesToProcess = acceptedFiles.slice(0, remainingSlots);\n if (autoSend) {\n await uploadMultipleFiles(filesToProcess, data);\n } else {\n for (const file of filesToProcess) {\n addFile(file);\n rawFilesRef.current.set(file.name, file);\n }\n onChange?.(Array.from(rawFilesRef.current.values()));\n }\n },\n [autoSend, uploadMultipleFiles, addFile, data, files, maxFiles, onChange],\n );\n\n const isFull =\n maxFiles !== undefined && Object.keys(files).length >= maxFiles;\n\n return (\n <div\n className={cx(\n classNames?.dropzone ?? dropzone(),\n classNames?.root ?? dropzoneRoot(),\n )}\n data-direction={direction}\n >\n {(!hideWhenFull || !isFull) && (\n <MantineDropzone\n ref={dropzoneRef}\n onDrop={handleDrop}\n disabled={isFull}\n loading={isUploading}\n accept={accept}\n maxSize={maxSize}\n preventDropOnDocument\n inputProps={{ id: inputId }}\n classNames={{\n root:\n classNames?.dropzoneDropzone?.root ??\n cx(dropzoneDropzoneRoot(), 'group'),\n inner:\n classNames?.dropzoneDropzone?.inner ?? dropzoneDropzoneInner(),\n }}\n >\n <div className={classNames?.iconSlot ?? dropzoneIconSlot()}>\n {isUploading ? (\n <LoaderOval\n classNames={{\n loader: classNames?.loader?.loader ?? dropzoneLoader(),\n root: classNames?.loader?.root ?? dropzoneLoaderRoot(),\n }}\n />\n ) : (\n <>\n <MantineDropzone.Idle>\n <Icon\n name='mage-dropzone-upload-01'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.dropzoneIcon?.icon ?? dropzoneIcon(),\n }}\n />\n </MantineDropzone.Idle>\n <MantineDropzone.Accept>\n <Icon\n name='mage-dropzone-thumbs-up'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.dropzoneIcon?.icon ?? dropzoneIcon(),\n }}\n />\n </MantineDropzone.Accept>\n <MantineDropzone.Reject>\n <Icon\n name='mage-dropzone-thumbs-down'\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.dropzoneIcon?.icon ?? dropzoneIcon(),\n }}\n />\n </MantineDropzone.Reject>\n </>\n )}\n </div>\n <div className={classNames?.textSlot ?? dropzoneTextSlot()}>\n <span className={classNames?.title ?? dropzoneTitle()}>\n {title || 'Upload files'}\n </span>\n <span className={classNames?.subtitle ?? dropzoneSubtitle()}>\n {subtitle || 'Drag images here or click to select files'}\n </span>\n <span className={classNames?.hint ?? dropzoneHint()}>\n {hint ||\n 'Attach as many files as you like, each file should not exceed 5mb'}\n </span>\n </div>\n </MantineDropzone>\n )}\n {children({ files, isUploading, removeFile })}\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-dropzone-state.mjs","names":[],"sources":["../../../../src/components/controls/dropzone/use-dropzone-state.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nimport type { FileData } from './Dropzone';\nimport {\n type UploadProgress,\n type Uploader,\n uploadFile,\n} from './upload-service';\n\nexport const useDropzoneState = (\n url: string | undefined,\n initialFiles: Record<string, FileData> | FileData | null | undefined = {},\n onFileUploaded?: (file: FileData) => void,\n headers?: Record<string, string>,\n uploader?: Uploader,\n) => {\n const normalizeInitialFiles = (): Record<string, FileData> => {\n if (!initialFiles) return {};\n\n if (typeof initialFiles === 'object' && !('name' in initialFiles)) {\n return initialFiles as Record<string, FileData>;\n }\n\n if (typeof initialFiles === 'object' && 'name' in initialFiles) {\n const fileData = initialFiles as FileData;\n return {\n [fileData.name]: {\n name: fileData.name,\n size: fileData.size,\n type: fileData.type,\n date: fileData.date,\n uploaded: fileData.uploaded ?? true,\n loading: fileData.loading ?? false,\n url: fileData.url,\n error: fileData.error,\n progress: fileData.progress,\n },\n };\n }\n\n return {};\n };\n\n const [files, setFiles] = useState<Record<string, FileData>>(\n normalizeInitialFiles(),\n );\n const [isUploading, setIsUploading] = useState(false);\n const uploadQueue = useRef<Set<string>>(new Set());\n\n const addFile = useCallback((file: File, date?: string) => {\n const fileData: FileData = {\n name: file.name,\n size: file.size,\n type: file.type,\n url: '',\n uploaded: false,\n loading: false,\n progress: 0,\n date:\n date ??\n new Date().toLocaleString('es-ES', {\n timeZone: 'Europe/Madrid',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n }),\n };\n\n setFiles((prev) => ({\n ...prev,\n [file.name]: fileData,\n }));\n\n return file.name;\n }, []);\n\n const updateFileProgress = useCallback(\n (fileName: string, progress: number) => {\n setFiles((prev) => ({\n ...prev,\n [fileName]: {\n ...prev[fileName],\n progress,\n loading: progress < 100,\n },\n }));\n },\n [],\n );\n\n const markFileAsUploaded = useCallback((fileName: string, url: string) => {\n setFiles((prev) => ({\n ...prev,\n [fileName]: {\n ...prev[fileName],\n uploaded: true,\n loading: false,\n progress: 100,\n url,\n },\n }));\n }, []);\n\n const markFileAsError = useCallback((fileName: string, error: string) => {\n setFiles((prev) => ({\n ...prev,\n [fileName]: {\n ...prev[fileName],\n uploaded: false,\n loading: false,\n progress: 0,\n error,\n },\n }));\n }, []);\n\n const removeFile = useCallback((fileName: string) => {\n setFiles((prev) => {\n const newFiles = { ...prev };\n delete newFiles[fileName];\n return newFiles;\n });\n uploadQueue.current.delete(fileName);\n }, []);\n\n const clearFiles = useCallback(() => {\n setFiles({});\n uploadQueue.current.clear();\n }, []);\n\n const isFileUploading = useCallback((fileName: string) => {\n return uploadQueue.current.has(fileName);\n }, []);\n\n const addToUploadQueue = useCallback((fileName: string) => {\n uploadQueue.current.add(fileName);\n }, []);\n\n const removeFromUploadQueue = useCallback((fileName: string) => {\n uploadQueue.current.delete(fileName);\n }, []);\n\n const uploadFileToServer = useCallback(\n async (file: File, data?: Record<string, unknown>) => {\n const date = new Date().toLocaleString('es-ES', {\n timeZone: 'Europe/Madrid',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n const fileName = addFile(file, date);\n addToUploadQueue(fileName);\n\n try {\n const onProgress = (progress: UploadProgress) => {\n updateFileProgress(fileName, progress.percentage);\n };\n const { body } = uploader\n ? await uploader(file, { data, onProgress, headers })\n : await uploadFile(url ?? '', file, data, onProgress, headers);\n\n markFileAsUploaded(fileName, body.url);\n onFileUploaded?.({\n name: file.name,\n size: file.size,\n type: file.type,\n date,\n uploaded: true,\n loading: false,\n progress: 100,\n url: body.url,\n });\n } catch (error) {\n console.error('Error al subir archivo:', error);\n markFileAsError(\n fileName,\n error instanceof Error ? error.message : 'Error desconocido',\n );\n } finally {\n removeFromUploadQueue(fileName);\n }\n },\n [\n addFile,\n addToUploadQueue,\n updateFileProgress,\n markFileAsUploaded,\n markFileAsError,\n removeFromUploadQueue,\n onFileUploaded,\n url,\n headers,\n uploader,\n ],\n );\n\n const uploadMultipleFiles = useCallback(\n async (acceptedFiles: File[], data?: Record<string, unknown>) => {\n if (isUploading) {\n console.warn('Ya hay una subida en progreso');\n return;\n }\n\n setIsUploading(true);\n\n try {\n for (const file of acceptedFiles) {\n await uploadFileToServer(file, data);\n }\n } finally {\n setIsUploading(false);\n }\n },\n [isUploading, setIsUploading, uploadFileToServer],\n );\n\n return {\n files,\n isUploading,\n setIsUploading,\n addFile,\n updateFileProgress,\n markFileAsUploaded,\n markFileAsError,\n removeFile,\n clearFiles,\n isFileUploading,\n addToUploadQueue,\n removeFromUploadQueue,\n uploadFileToServer,\n uploadMultipleFiles,\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-dropzone-state.mjs","names":[],"sources":["../../../../src/components/controls/dropzone/use-dropzone-state.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\n\nimport type { FileData } from './Dropzone';\nimport {\n type Uploader,\n type UploadProgress,\n uploadFile,\n} from './upload-service';\n\nexport const useDropzoneState = (\n url: string | undefined,\n initialFiles: Record<string, FileData> | FileData | null | undefined = {},\n onFileUploaded?: (file: FileData) => void,\n headers?: Record<string, string>,\n uploader?: Uploader,\n) => {\n const normalizeInitialFiles = (): Record<string, FileData> => {\n if (!initialFiles) return {};\n\n if (typeof initialFiles === 'object' && !('name' in initialFiles)) {\n return initialFiles;\n }\n\n if (typeof initialFiles === 'object' && 'name' in initialFiles) {\n const fileData = initialFiles as FileData;\n return {\n [fileData.name]: {\n name: fileData.name,\n size: fileData.size,\n type: fileData.type,\n date: fileData.date,\n uploaded: fileData.uploaded ?? true,\n loading: fileData.loading ?? false,\n url: fileData.url,\n error: fileData.error,\n progress: fileData.progress,\n },\n };\n }\n\n return {};\n };\n\n const [files, setFiles] = useState<Record<string, FileData>>(\n normalizeInitialFiles(),\n );\n const [isUploading, setIsUploading] = useState(false);\n const uploadQueue = useRef<Set<string>>(new Set());\n\n const addFile = useCallback((file: File, date?: string) => {\n const fileData: FileData = {\n name: file.name,\n size: file.size,\n type: file.type,\n url: '',\n uploaded: false,\n loading: false,\n progress: 0,\n date:\n date ??\n new Date().toLocaleString('es-ES', {\n timeZone: 'Europe/Madrid',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n }),\n };\n\n setFiles((prev) => ({\n ...prev,\n [file.name]: fileData,\n }));\n\n return file.name;\n }, []);\n\n const updateFileProgress = useCallback(\n (fileName: string, progress: number) => {\n setFiles((prev) => ({\n ...prev,\n [fileName]: {\n ...prev[fileName],\n progress,\n loading: progress < 100,\n },\n }));\n },\n [],\n );\n\n const markFileAsUploaded = useCallback((fileName: string, url: string) => {\n setFiles((prev) => ({\n ...prev,\n [fileName]: {\n ...prev[fileName],\n uploaded: true,\n loading: false,\n progress: 100,\n url,\n },\n }));\n }, []);\n\n const markFileAsError = useCallback((fileName: string, error: string) => {\n setFiles((prev) => ({\n ...prev,\n [fileName]: {\n ...prev[fileName],\n uploaded: false,\n loading: false,\n progress: 0,\n error,\n },\n }));\n }, []);\n\n const removeFile = useCallback((fileName: string) => {\n setFiles((prev) => {\n const newFiles = { ...prev };\n delete newFiles[fileName];\n return newFiles;\n });\n uploadQueue.current.delete(fileName);\n }, []);\n\n const clearFiles = useCallback(() => {\n setFiles({});\n uploadQueue.current.clear();\n }, []);\n\n const isFileUploading = useCallback((fileName: string) => {\n return uploadQueue.current.has(fileName);\n }, []);\n\n const addToUploadQueue = useCallback((fileName: string) => {\n uploadQueue.current.add(fileName);\n }, []);\n\n const removeFromUploadQueue = useCallback((fileName: string) => {\n uploadQueue.current.delete(fileName);\n }, []);\n\n const uploadFileToServer = useCallback(\n async (file: File, data?: Record<string, unknown>) => {\n const date = new Date().toLocaleString('es-ES', {\n timeZone: 'Europe/Madrid',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n const fileName = addFile(file, date);\n addToUploadQueue(fileName);\n\n try {\n const onProgress = (progress: UploadProgress) => {\n updateFileProgress(fileName, progress.percentage);\n };\n const { body } = uploader\n ? await uploader(file, { data, onProgress, headers })\n : await uploadFile(url ?? '', file, data, onProgress, headers);\n\n markFileAsUploaded(fileName, body.url);\n onFileUploaded?.({\n name: file.name,\n size: file.size,\n type: file.type,\n date,\n uploaded: true,\n loading: false,\n progress: 100,\n url: body.url,\n });\n } catch (error) {\n console.error('Error al subir archivo:', error);\n markFileAsError(\n fileName,\n error instanceof Error ? error.message : 'Error desconocido',\n );\n } finally {\n removeFromUploadQueue(fileName);\n }\n },\n [\n addFile,\n addToUploadQueue,\n updateFileProgress,\n markFileAsUploaded,\n markFileAsError,\n removeFromUploadQueue,\n onFileUploaded,\n url,\n headers,\n uploader,\n ],\n );\n\n const uploadMultipleFiles = useCallback(\n async (acceptedFiles: File[], data?: Record<string, unknown>) => {\n if (isUploading) {\n console.warn('Ya hay una subida en progreso');\n return;\n }\n\n setIsUploading(true);\n\n try {\n for (const file of acceptedFiles) {\n await uploadFileToServer(file, data);\n }\n } finally {\n setIsUploading(false);\n }\n },\n [isUploading, setIsUploading, uploadFileToServer],\n );\n\n return {\n files,\n isUploading,\n setIsUploading,\n addFile,\n updateFileProgress,\n markFileAsUploaded,\n markFileAsError,\n removeFile,\n clearFiles,\n isFileUploading,\n addToUploadQueue,\n removeFromUploadQueue,\n uploadFileToServer,\n uploadMultipleFiles,\n };\n};\n"],"mappings":"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"}
@@ -44,18 +44,22 @@ type DropzoneS3Props<TInitBody extends S3InitBody = S3InitBody> = Omit<DropzoneP
44
44
  texts?: DropzoneS3Texts;
45
45
  /**
46
46
  * Map of file extension → MIME type. When provided, DropzoneS3
47
- * automatically computes the `accept` array (MIMEs plus `.ext` entries
48
- * to cover browsers that report an empty `file.type` for some Office
49
- * formats) and uses it to resolve `meta.mimeType` per file.
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).
50
51
  *
51
52
  * Ignored when `accept` is passed explicitly.
52
53
  */
53
54
  acceptedTypes?: Record<string, string>;
54
55
  /**
55
56
  * Explicit accept list forwarded to the underlying Mantine dropzone.
56
- * Takes precedence over `acceptedTypes`.
57
+ * Takes precedence over `acceptedTypes`. Prefer the map shape
58
+ * `{ [mimeType]: ['.ext', ...] }` — passing a `.ext` entry inside a
59
+ * plain `string[]` triggers a "Skipped … not a valid MIME type"
60
+ * warning in react-dropzone v15+.
57
61
  */
58
- accept?: string[]; /** POST endpoint that returns `{ body: { url, headers?, ...extras } }`. */
62
+ accept?: string[] | Record<string, string[]>; /** POST endpoint that returns `{ body: { url, headers?, ...extras } }`. */
59
63
  initUrl: string; /** Build the init request JSON body from the file and resolved meta. */
60
64
  buildInitBody: (file: File, meta: S3FileMeta) => Record<string, unknown>;
61
65
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"DropzoneS3.d.mts","names":[],"sources":["../../../../src/components/controls/dropzone-s3/DropzoneS3.tsx"],"mappings":";;;;;;;;AAgBA;;;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;;EAuCP,KAAA,GAAQ,eAAA;EAnCR;;;;;;;;EA4CA,aAAA,GAAgB,MAAA;EApCF;AAehB;;;EA0BE,MAAA,aA1ByD;EA4BzD,OAAA,UA5BuE;EA8BvE,aAAA,GAAgB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,KAAe,MAAA;EATjC;;;;EAchB,QAAA;IACE,GAAA;IACA,SAAA,GACE,IAAA,EAAM,IAAA,EACN,IAAA,EAAM,SAAA,EACN,IAAA,EAAM,UAAA,KACH,MAAA;EAAA;EAMY;;;;EAAnB,UAAA,SAAmB,MAAA;EAkBR;;;;;EAZX,eAAA,IAAmB,GAAA,EAAK,QAAA,EAAU,QAAA,aAAqB,OAAA;EArDgB;;;;;EA2DvE,kBAAA,IAAsB,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,IAAA;EAjC7C;;;;;EAuCA,QAAA,GAAW,aAAA;AAAA;;cA+EA,gBAAA,GAAoB,QAAA;AAAA,cAwDpB,UAAA,qBAAgC,UAAA,GAAa,UAAA;EAAY,KAAA;EAAA,aAAA;EAAA,MAAA;EAAA,OAAA;EAAA,aAAA;EAAA,QAAA;EAAA,UAAA;EAAA,eAAA;EAAA,kBAAA;EAAA,QAAA;EAAA,GAAA;AAAA,GAYnE,eAAA,CAAgB,SAAA,MAAU,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"DropzoneS3.d.mts","names":[],"sources":["../../../../src/components/controls/dropzone-s3/DropzoneS3.tsx"],"mappings":";;;;;;;;AAgBA;;;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;EA7CO;;;;;EAmD1B,eAAA,IAAmB,GAAA,EAAK,QAAA,EAAU,QAAA,aAAqB,OAAA;EA7C/C;;;;;EAmDR,kBAAA,IAAsB,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,IAAA;EA7B7C;;;;;EAmCA,QAAA,GAAW,aAAA;AAAA;;cA+EA,gBAAA,GAAoB,QAAA;AAAA,cAyEpB,UAAA,qBAAgC,UAAA,GAAa,UAAA;EAAY,KAAA;EAAA,aAAA;EAAA,MAAA;EAAA,OAAA;EAAA,aAAA;EAAA,QAAA;EAAA,UAAA;EAAA,eAAA;EAAA,kBAAA;EAAA,QAAA;EAAA,GAAA;AAAA,GAYnE,eAAA,CAAgB,SAAA,MAAU,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,2 +1,2 @@
1
- import{UploadingFiles as e}from"../../data-display/uploading-files/UploadingFiles.mjs";import{Dropzone as t}from"../dropzone/Dropzone.mjs";import{jsx as n}from"react/jsx-runtime";const r={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`},i=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}},a=(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)}),o=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},s=e=>{let t=e.lastIndexOf(`.`);return t>=0?e.slice(t+1).toLowerCase():``},c=e=>{if(e)return[...Object.values(e),...Object.keys(e).map(e=>`.${e}`)]},l=(e,t)=>{let n=s(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}},u=({files:t})=>{let r=Object.values(t).filter(e=>e.loading||!!e.error);return r.length===0?null:n(e,{children:r.map(t=>t.error?n(e.ItemError,{name:t.name,message:t.error},t.name):n(e.Item,{name:t.name,progress:t.progress??0},t.name))})},d=({texts:e,acceptedTypes:s,accept:d,initUrl:f,buildInitBody:p,register:m,getHeaders:h,getErrorMessage:g=i,resolveUploadedUrl:_,children:v,...y})=>{let b=d??c(s),x={...r,...e},S=async(e,{onProgress:t})=>{let n=()=>({"Content-Type":`application/json`,Accept:`application/json`,...h?.()??{}}),r=l(e,s),i=await fetch(f,{method:`POST`,headers:n(),body:JSON.stringify(p(e,r))});if(!i.ok)throw Error(await g(i,x.initFailed(i.status)));let c=await i.json(),{url:u,headers:d}=c.body;if(await a(u,o(d),e,n=>t?.({loaded:0,total:e.size,percentage:n}),x),m){let t=await fetch(m.url,{method:`POST`,headers:n(),body:JSON.stringify(m.buildBody(e,c.body,r))});if(!t.ok)throw Error(await g(t,x.registerFailed(t.status)))}return{body:{url:_?.(c.body,e)??(typeof c.body.key==`string`?c.body.key:u.split(`?`)[0])}}};return n(t,{...y,title:e?.title,subtitle:e?.subtitle,hint:e?.hint,accept:b,uploader:S,children:v??u})};export{d as DropzoneS3,s as getFileExtension};
1
+ import{UploadingFiles as e}from"../../data-display/uploading-files/UploadingFiles.mjs";import{Dropzone as t}from"../dropzone/Dropzone.mjs";import{jsx as n}from"react/jsx-runtime";const r={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`},i=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}},a=(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)}),o=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},s=e=>{let t=e.lastIndexOf(`.`);return t>=0?e.slice(t+1).toLowerCase():``},c=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},l=(e,t)=>{let n=s(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}},u=({files:t})=>{let r=Object.values(t).filter(e=>e.loading||!!e.error);return r.length===0?null:n(e,{children:r.map(t=>t.error?n(e.ItemError,{name:t.name,message:t.error},t.name):n(e.Item,{name:t.name,progress:t.progress??0},t.name))})},d=({texts:e,acceptedTypes:s,accept:d,initUrl:f,buildInitBody:p,register:m,getHeaders:h,getErrorMessage:g=i,resolveUploadedUrl:_,children:v,...y})=>{let b=d??c(s),x={...r,...e},S=async(e,{onProgress:t})=>{let n=()=>({"Content-Type":`application/json`,Accept:`application/json`,...h?.()??{}}),r=l(e,s),i=await fetch(f,{method:`POST`,headers:n(),body:JSON.stringify(p(e,r))});if(!i.ok)throw Error(await g(i,x.initFailed(i.status)));let c=await i.json(),{url:u,headers:d}=c.body;if(await a(u,o(d),e,n=>t?.({loaded:0,total:e.size,percentage:n}),x),m){let t=await fetch(m.url,{method:`POST`,headers:n(),body:JSON.stringify(m.buildBody(e,c.body,r))});if(!t.ok)throw Error(await g(t,x.registerFailed(t.status)))}return{body:{url:_?.(c.body,e)??(typeof c.body.key==`string`?c.body.key:u.split(`?`)[0])}}};return n(t,{...y,title:e?.title,subtitle:e?.subtitle,hint:e?.hint,accept:b,uploader:S,children:v??u})};export{d as DropzoneS3,s as getFileExtension};
2
2
  //# sourceMappingURL=DropzoneS3.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropzoneS3.mjs","names":[],"sources":["../../../../src/components/controls/dropzone-s3/DropzoneS3.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { UploadingFiles } from '@/components/data-display';\n\nimport {\n Dropzone,\n type DropzoneProps,\n type Uploader,\n} from '../dropzone/Dropzone';\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'\n | 'url'\n | 'children'\n | 'accept'\n | 'title'\n | 'subtitle'\n | '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` array (MIMEs plus `.ext` entries\n * to cover browsers that report an empty `file.type` for some Office\n * formats) and uses it to resolve `meta.mimeType` per file.\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`.\n */\n accept?: 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 * Override the default children (a list of in-flight / errored files).\n * Use it when you need to render the progress list elsewhere in the\n * layout or when you want a completely custom UI.\n */\n children?: DropzoneProps['children'];\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\nconst buildAcceptList = (\n acceptedTypes: Record<string, string> | undefined,\n): string[] | undefined => {\n if (!acceptedTypes) return undefined;\n return [\n ...Object.values(acceptedTypes),\n ...Object.keys(acceptedTypes).map((ext) => `.${ext}`),\n ];\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\nconst defaultChildren: DropzoneProps['children'] = ({ files }) => {\n const uploading = Object.values(files).filter(\n (f) => f.loading || !!f.error,\n );\n if (uploading.length === 0) return null;\n return (\n <UploadingFiles>\n {uploading.map((file) =>\n file.error ? (\n <UploadingFiles.ItemError\n key={file.name}\n name={file.name}\n message={file.error}\n />\n ) : (\n <UploadingFiles.Item\n key={file.name}\n name={file.name}\n progress={file.progress ?? 0}\n />\n ),\n )}\n </UploadingFiles>\n );\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 children,\n ...dropzoneProps\n}: DropzoneS3Props<TInitBody>) => {\n const acceptList = accept ?? buildAcceptList(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 {children ?? defaultChildren}\n </Dropzone>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"DropzoneS3.mjs","names":[],"sources":["../../../../src/components/controls/dropzone-s3/DropzoneS3.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { UploadingFiles } from '@/components/data-display';\n\nimport {\n Dropzone,\n type DropzoneProps,\n type Uploader,\n} from '../dropzone/Dropzone';\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' | 'children' | '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 * Override the default children (a list of in-flight / errored files).\n * Use it when you need to render the progress list elsewhere in the\n * layout or when you want a completely custom UI.\n */\n children?: DropzoneProps['children'];\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\nconst defaultChildren: DropzoneProps['children'] = ({ files }) => {\n const uploading = Object.values(files).filter((f) => f.loading || !!f.error);\n if (uploading.length === 0) return null;\n return (\n <UploadingFiles>\n {uploading.map((file) =>\n file.error ? (\n <UploadingFiles.ItemError\n key={file.name}\n name={file.name}\n message={file.error}\n />\n ) : (\n <UploadingFiles.Item\n key={file.name}\n name={file.name}\n progress={file.progress ?? 0}\n />\n ),\n )}\n </UploadingFiles>\n );\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 children,\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 {children ?? defaultChildren}\n </Dropzone>\n );\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{Avatar as e}from"../avatar/Avatar.mjs";import{RemovableItem as t}from"../removable-item/RemovableItem.mjs";import{assignedUser as n,assignedUserAvatar as r,assignedUserAvatarImage as i,assignedUserAvatarPlaceholder as a,assignedUserAvatarRoot as o,assignedUserButtonIcon as s,assignedUserButtonIconIcon as c,assignedUserButtonIconIconRaw as l,assignedUserButtonIconIconRawRoot as u,assignedUserButtonIconRoot as d,assignedUserContent as f,assignedUserName as p,assignedUserRoot as m,assignedUserSection as h}from"@mage-ui/styled-system/recipes";import{jsx as g}from"react/jsx-runtime";const _=({name:_,avatarSrc:v,avatarAlt:y,onRemove:b,removeButtonLabel:x=`Remove user`,children:S,classNames:C})=>g(t,{startSlot:g(e,{name:_,src:v,alt:y,classNames:{avatar:C?.avatar?.avatar??r(),root:C?.avatar?.root??o(),image:C?.avatar?.image??i(),placeholder:C?.avatar?.placeholder??a()}}),onRemove:b,removeButtonLabel:x,classNames:{container:C?.removableItem?.container??C?.assignedUser??n(),root:C?.removableItem?.root??C?.root??m(),section:C?.removableItem?.section??C?.section??h(),content:C?.removableItem?.content??C?.content??f(),buttonIcon:{buttonIcon:C?.buttonIcon?.buttonIcon??C?.removableItem?.buttonIcon?.buttonIcon??s(),root:C?.buttonIcon?.root??C?.removableItem?.buttonIcon?.root??d(),icon:C?.buttonIcon?.icon??C?.removableItem?.buttonIcon?.icon??c(),iconRaw:{iconRaw:C?.buttonIcon?.iconRaw?.iconRaw??C?.removableItem?.buttonIcon?.iconRaw?.iconRaw??l(),root:C?.buttonIcon?.iconRaw?.root??C?.removableItem?.buttonIcon?.iconRaw?.root??u()}}},children:g(`span`,{className:C?.name??p(),children:S})});export{_ as AssignedUser};
1
+ import{Avatar as e}from"../avatar/Avatar.mjs";import{RemovableItem as t}from"../removable-item/RemovableItem.mjs";import{assignedUser as n,assignedUserAvatar as r,assignedUserAvatarImage as i,assignedUserAvatarPlaceholder as a,assignedUserAvatarRoot as o,assignedUserButtonIcon as s,assignedUserButtonIconIcon as c,assignedUserButtonIconIconRaw as l,assignedUserButtonIconIconRawRoot as u,assignedUserButtonIconRoot as d,assignedUserContent as f,assignedUserName as p,assignedUserRoot as m,assignedUserSection as h}from"@mage-ui/styled-system/recipes";import{jsx as g}from"react/jsx-runtime";const _=({name:_,avatarSrc:v,avatarAlt:y,onRemove:b,removeButtonLabel:x=`Remove user`,children:S,classNames:C})=>g(t,{startSlot:g(e,{name:_,src:v,alt:y,classNames:{avatar:C?.avatar?.avatar??r(),root:C?.avatar?.root??o(),image:C?.avatar?.image??i(),placeholder:C?.avatar?.placeholder??a()}}),onRemove:b,removeButtonLabel:x,classNames:{removableItem:C?.assignedUser??n(),root:C?.root??m(),section:C?.section??h(),content:C?.content??f(),buttonIcon:{buttonIcon:C?.buttonIcon?.buttonIcon??s(),root:C?.buttonIcon?.root??d(),icon:C?.buttonIcon?.icon??c(),iconRaw:{iconRaw:C?.buttonIcon?.iconRaw?.iconRaw??l(),root:C?.buttonIcon?.iconRaw?.root??u()}}},children:g(`span`,{className:C?.name??p(),children:S})});export{_ as AssignedUser};
2
2
  //# sourceMappingURL=AssignedUser.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssignedUser.mjs","names":[],"sources":["../../../../src/components/data-display/assigned-user/AssignedUser.tsx"],"sourcesContent":["// TODO: crear stories\n\nimport type { ReactNode } from 'react';\n\nimport {\n assignedUser,\n assignedUserAvatar,\n assignedUserAvatarImage,\n assignedUserAvatarPlaceholder,\n assignedUserAvatarRoot,\n assignedUserButtonIcon,\n assignedUserButtonIconIcon,\n assignedUserButtonIconIconRaw,\n assignedUserButtonIconIconRawRoot,\n assignedUserButtonIconRoot,\n assignedUserContent,\n assignedUserName,\n assignedUserRoot,\n assignedUserSection,\n} from '@mage-ui/styled-system/recipes';\nimport {\n Avatar,\n type AvatarProps,\n RemovableItem,\n type RemovableItemProps,\n} from '@/components/data-display';\n\nexport type AssignedUserProps = {\n name: string;\n avatarSrc?: string;\n avatarAlt?: string;\n onRemove: () => void;\n children?: ReactNode;\n removeButtonLabel?: string;\n classNames?: {\n assignedUser?: string;\n root?: string;\n section?: string;\n content?: string;\n name?: string;\n avatar?: AvatarProps['classNames'];\n removableItem?: RemovableItemProps['classNames'];\n buttonIcon?: NonNullable<RemovableItemProps['classNames']>['buttonIcon'];\n };\n};\n\nexport const AssignedUser = ({\n name,\n avatarSrc,\n avatarAlt,\n onRemove,\n removeButtonLabel = 'Remove user',\n children,\n classNames,\n}: AssignedUserProps) => {\n return (\n <RemovableItem\n startSlot={\n <Avatar\n name={name}\n src={avatarSrc}\n alt={avatarAlt}\n classNames={{\n avatar: classNames?.avatar?.avatar ?? assignedUserAvatar(),\n root: classNames?.avatar?.root ?? assignedUserAvatarRoot(),\n image: classNames?.avatar?.image ?? assignedUserAvatarImage(),\n placeholder:\n classNames?.avatar?.placeholder ??\n assignedUserAvatarPlaceholder(),\n }}\n />\n }\n onRemove={onRemove}\n removeButtonLabel={removeButtonLabel}\n classNames={{\n container:\n classNames?.removableItem?.container ??\n classNames?.assignedUser ??\n assignedUser(),\n root:\n classNames?.removableItem?.root ??\n classNames?.root ??\n assignedUserRoot(),\n section:\n classNames?.removableItem?.section ??\n classNames?.section ??\n assignedUserSection(),\n content:\n classNames?.removableItem?.content ??\n classNames?.content ??\n assignedUserContent(),\n buttonIcon: {\n buttonIcon:\n classNames?.buttonIcon?.buttonIcon ??\n classNames?.removableItem?.buttonIcon?.buttonIcon ??\n assignedUserButtonIcon(),\n root:\n classNames?.buttonIcon?.root ??\n classNames?.removableItem?.buttonIcon?.root ??\n assignedUserButtonIconRoot(),\n icon:\n classNames?.buttonIcon?.icon ??\n classNames?.removableItem?.buttonIcon?.icon ??\n assignedUserButtonIconIcon(),\n iconRaw: {\n iconRaw:\n classNames?.buttonIcon?.iconRaw?.iconRaw ??\n classNames?.removableItem?.buttonIcon?.iconRaw?.iconRaw ??\n assignedUserButtonIconIconRaw(),\n root:\n classNames?.buttonIcon?.iconRaw?.root ??\n classNames?.removableItem?.buttonIcon?.iconRaw?.root ??\n assignedUserButtonIconIconRawRoot(),\n },\n },\n }}\n >\n <span className={classNames?.name ?? assignedUserName()}>{children}</span>\n </RemovableItem>\n );\n};\n"],"mappings":"glBA8CA,MAAa,GAAgB,CAC3B,OACA,YACA,YACA,WACA,oBAAoB,cACpB,WACA,gBAGE,EAAC,EAAD,CACE,UACE,EAAC,EAAD,CACQ,OACN,IAAK,EACL,IAAK,EACL,WAAY,CACV,OAAQ,GAAY,QAAQ,QAAU,GAAoB,CAC1D,KAAM,GAAY,QAAQ,MAAQ,GAAwB,CAC1D,MAAO,GAAY,QAAQ,OAAS,GAAyB,CAC7D,YACE,GAAY,QAAQ,aACpB,GAA+B,CAClC,CACD,CAAA,CAEM,WACS,oBACnB,WAAY,CACV,UACE,GAAY,eAAe,WAC3B,GAAY,cACZ,GAAc,CAChB,KACE,GAAY,eAAe,MAC3B,GAAY,MACZ,GAAkB,CACpB,QACE,GAAY,eAAe,SAC3B,GAAY,SACZ,GAAqB,CACvB,QACE,GAAY,eAAe,SAC3B,GAAY,SACZ,GAAqB,CACvB,WAAY,CACV,WACE,GAAY,YAAY,YACxB,GAAY,eAAe,YAAY,YACvC,GAAwB,CAC1B,KACE,GAAY,YAAY,MACxB,GAAY,eAAe,YAAY,MACvC,GAA4B,CAC9B,KACE,GAAY,YAAY,MACxB,GAAY,eAAe,YAAY,MACvC,GAA4B,CAC9B,QAAS,CACP,QACE,GAAY,YAAY,SAAS,SACjC,GAAY,eAAe,YAAY,SAAS,SAChD,GAA+B,CACjC,KACE,GAAY,YAAY,SAAS,MACjC,GAAY,eAAe,YAAY,SAAS,MAChD,GAAmC,CACtC,CACF,CACF,UAED,EAAC,OAAD,CAAM,UAAW,GAAY,MAAQ,GAAkB,CAAG,WAAgB,CAAA,CAC5D,CAAA"}
1
+ {"version":3,"file":"AssignedUser.mjs","names":[],"sources":["../../../../src/components/data-display/assigned-user/AssignedUser.tsx"],"sourcesContent":["// TODO: crear stories\n\nimport type { ReactNode } from 'react';\n\nimport {\n assignedUser,\n assignedUserAvatar,\n assignedUserAvatarImage,\n assignedUserAvatarPlaceholder,\n assignedUserAvatarRoot,\n assignedUserButtonIcon,\n assignedUserButtonIconIcon,\n assignedUserButtonIconIconRaw,\n assignedUserButtonIconIconRawRoot,\n assignedUserButtonIconRoot,\n assignedUserContent,\n assignedUserName,\n assignedUserRoot,\n assignedUserSection,\n} from '@mage-ui/styled-system/recipes';\nimport {\n Avatar,\n type AvatarProps,\n RemovableItem,\n type RemovableItemProps,\n} from '@/components/data-display';\n\nexport type AssignedUserProps = {\n name: string;\n avatarSrc?: string;\n avatarAlt?: string;\n onRemove: () => void;\n children?: ReactNode;\n removeButtonLabel?: string;\n classNames?: {\n assignedUser?: string;\n root?: string;\n section?: string;\n content?: string;\n name?: string;\n avatar?: AvatarProps['classNames'];\n removableItem?: RemovableItemProps['classNames'];\n buttonIcon?: NonNullable<RemovableItemProps['classNames']>['buttonIcon'];\n };\n};\n\nexport const AssignedUser = ({\n name,\n avatarSrc,\n avatarAlt,\n onRemove,\n removeButtonLabel = 'Remove user',\n children,\n classNames,\n}: AssignedUserProps) => {\n return (\n <RemovableItem\n startSlot={\n <Avatar\n name={name}\n src={avatarSrc}\n alt={avatarAlt}\n classNames={{\n avatar: classNames?.avatar?.avatar ?? assignedUserAvatar(),\n root: classNames?.avatar?.root ?? assignedUserAvatarRoot(),\n image: classNames?.avatar?.image ?? assignedUserAvatarImage(),\n placeholder:\n classNames?.avatar?.placeholder ??\n assignedUserAvatarPlaceholder(),\n }}\n />\n }\n onRemove={onRemove}\n removeButtonLabel={removeButtonLabel}\n classNames={{\n removableItem: classNames?.assignedUser ?? assignedUser(),\n root: classNames?.root ?? assignedUserRoot(),\n section: classNames?.section ?? assignedUserSection(),\n content: classNames?.content ?? assignedUserContent(),\n buttonIcon: {\n buttonIcon:\n classNames?.buttonIcon?.buttonIcon ?? assignedUserButtonIcon(),\n root: classNames?.buttonIcon?.root ?? assignedUserButtonIconRoot(),\n icon: classNames?.buttonIcon?.icon ?? assignedUserButtonIconIcon(),\n iconRaw: {\n iconRaw:\n classNames?.buttonIcon?.iconRaw?.iconRaw ??\n assignedUserButtonIconIconRaw(),\n root:\n classNames?.buttonIcon?.iconRaw?.root ??\n assignedUserButtonIconIconRawRoot(),\n },\n },\n }}\n >\n <span className={classNames?.name ?? assignedUserName()}>{children}</span>\n </RemovableItem>\n );\n};\n"],"mappings":"glBA8CA,MAAa,GAAgB,CAC3B,OACA,YACA,YACA,WACA,oBAAoB,cACpB,WACA,gBAGE,EAAC,EAAD,CACE,UACE,EAAC,EAAD,CACQ,OACN,IAAK,EACL,IAAK,EACL,WAAY,CACV,OAAQ,GAAY,QAAQ,QAAU,GAAoB,CAC1D,KAAM,GAAY,QAAQ,MAAQ,GAAwB,CAC1D,MAAO,GAAY,QAAQ,OAAS,GAAyB,CAC7D,YACE,GAAY,QAAQ,aACpB,GAA+B,CAClC,CACD,CAAA,CAEM,WACS,oBACnB,WAAY,CACV,cAAe,GAAY,cAAgB,GAAc,CACzD,KAAM,GAAY,MAAQ,GAAkB,CAC5C,QAAS,GAAY,SAAW,GAAqB,CACrD,QAAS,GAAY,SAAW,GAAqB,CACrD,WAAY,CACV,WACE,GAAY,YAAY,YAAc,GAAwB,CAChE,KAAM,GAAY,YAAY,MAAQ,GAA4B,CAClE,KAAM,GAAY,YAAY,MAAQ,GAA4B,CAClE,QAAS,CACP,QACE,GAAY,YAAY,SAAS,SACjC,GAA+B,CACjC,KACE,GAAY,YAAY,SAAS,MACjC,GAAmC,CACtC,CACF,CACF,UAED,EAAC,OAAD,CAAM,UAAW,GAAY,MAAQ,GAAkB,CAAG,WAAgB,CAAA,CAC5D,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { FileIconProps } from "../file-icon/FileIcon.mjs";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import { ReactNode } from "react";
4
+
5
+ //#region src/components/data-display/document-item/DocumentItem.d.ts
6
+ type DocumentItemProps = {
7
+ fileType?: string;
8
+ fileName?: string;
9
+ endSlot?: ReactNode;
10
+ children: ReactNode;
11
+ classNames?: {
12
+ documentItem?: string;
13
+ root?: string;
14
+ section?: string;
15
+ content?: string;
16
+ fileIcon?: FileIconProps['classNames'];
17
+ };
18
+ };
19
+ declare const DocumentItem: ({
20
+ fileType,
21
+ fileName,
22
+ endSlot,
23
+ children,
24
+ classNames
25
+ }: DocumentItemProps) => react_jsx_runtime0.JSX.Element;
26
+ //#endregion
27
+ export { DocumentItem, DocumentItemProps };
28
+ //# sourceMappingURL=DocumentItem.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentItem.d.mts","names":[],"sources":["../../../../src/components/data-display/document-item/DocumentItem.tsx"],"mappings":";;;;;KAmBY,iBAAA;EACV,QAAA;EACA,QAAA;EACA,OAAA,GAAU,SAAA;EACV,QAAA,EAAU,SAAA;EACV,UAAA;IACE,YAAA;IACA,IAAA;IACA,OAAA;IACA,OAAA;IACA,QAAA,GAAW,aAAA;EAAA;AAAA;AAAA,cAIF,YAAA;EAAgB,QAAA;EAAA,QAAA;EAAA,OAAA;EAAA,QAAA;EAAA;AAAA,GAM1B,iBAAA,KAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,2 @@
1
+ import{FileIcon as e}from"../file-icon/FileIcon.mjs";import{ResourceItem as t}from"../resource-item/ResourceItem.mjs";import{documentItem as n,documentItemContent as r,documentItemFileIcon as i,documentItemFileIconIcon as a,documentItemFileIconIconIconRaw as o,documentItemFileIconIconIconRawRoot as s,documentItemFileIconIconRoot as c,documentItemFileIconIconWrapped as l,documentItemFileIconIconWrappedRoot as u,documentItemRoot as d,documentItemSection as f}from"@mage-ui/styled-system/recipes";import{jsx as p}from"react/jsx-runtime";const m=({fileType:m,fileName:h,endSlot:g,children:_,classNames:v})=>p(t,{startSlot:p(e,{fileType:m,fileName:h,classNames:{fileIcon:v?.fileIcon?.fileIcon??i(),iconWrapped:{iconWrapped:v?.fileIcon?.iconWrapped?.iconWrapped??l(),root:v?.fileIcon?.iconWrapped?.root??u()},icon:{icon:v?.fileIcon?.icon?.icon??a(),root:v?.fileIcon?.icon?.root??c(),iconRaw:{iconRaw:v?.fileIcon?.icon?.iconRaw?.iconRaw??o(),root:v?.fileIcon?.icon?.iconRaw?.root??s()}}}}),endSlot:g,classNames:{resourceItem:v?.documentItem??n(),root:v?.root??d(),section:v?.section??f(),content:v?.content??r()},children:_});export{m as DocumentItem};
2
+ //# sourceMappingURL=DocumentItem.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentItem.mjs","names":[],"sources":["../../../../src/components/data-display/document-item/DocumentItem.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport {\n documentItem,\n documentItemContent,\n documentItemFileIcon,\n documentItemFileIconIcon,\n documentItemFileIconIconIconRaw,\n documentItemFileIconIconIconRawRoot,\n documentItemFileIconIconRoot,\n documentItemFileIconIconWrapped,\n documentItemFileIconIconWrappedRoot,\n documentItemRoot,\n documentItemSection,\n} from '@mage-ui/styled-system/recipes';\n\nimport { FileIcon, type FileIconProps } from '../file-icon/FileIcon';\nimport { ResourceItem } from '../resource-item/ResourceItem';\n\nexport type DocumentItemProps = {\n fileType?: string;\n fileName?: string;\n endSlot?: ReactNode;\n children: ReactNode;\n classNames?: {\n documentItem?: string;\n root?: string;\n section?: string;\n content?: string;\n fileIcon?: FileIconProps['classNames'];\n };\n};\n\nexport const DocumentItem = ({\n fileType,\n fileName,\n endSlot,\n children,\n classNames,\n}: DocumentItemProps) => {\n return (\n <ResourceItem\n startSlot={\n <FileIcon\n fileType={fileType}\n fileName={fileName}\n classNames={{\n fileIcon: classNames?.fileIcon?.fileIcon ?? documentItemFileIcon(),\n iconWrapped: {\n iconWrapped:\n classNames?.fileIcon?.iconWrapped?.iconWrapped ??\n documentItemFileIconIconWrapped(),\n root:\n classNames?.fileIcon?.iconWrapped?.root ??\n documentItemFileIconIconWrappedRoot(),\n },\n icon: {\n icon:\n classNames?.fileIcon?.icon?.icon ?? documentItemFileIconIcon(),\n root:\n classNames?.fileIcon?.icon?.root ??\n documentItemFileIconIconRoot(),\n iconRaw: {\n iconRaw:\n classNames?.fileIcon?.icon?.iconRaw?.iconRaw ??\n documentItemFileIconIconIconRaw(),\n root:\n classNames?.fileIcon?.icon?.iconRaw?.root ??\n documentItemFileIconIconIconRawRoot(),\n },\n },\n }}\n />\n }\n endSlot={endSlot}\n classNames={{\n resourceItem: classNames?.documentItem ?? documentItem(),\n root: classNames?.root ?? documentItemRoot(),\n section: classNames?.section ?? documentItemSection(),\n content: classNames?.content ?? documentItemContent(),\n }}\n >\n {children}\n </ResourceItem>\n );\n};\n"],"mappings":"0hBAiCA,MAAa,GAAgB,CAC3B,WACA,WACA,UACA,WACA,gBAGE,EAAC,EAAD,CACE,UACE,EAAC,EAAD,CACY,WACA,WACV,WAAY,CACV,SAAU,GAAY,UAAU,UAAY,GAAsB,CAClE,YAAa,CACX,YACE,GAAY,UAAU,aAAa,aACnC,GAAiC,CACnC,KACE,GAAY,UAAU,aAAa,MACnC,GAAqC,CACxC,CACD,KAAM,CACJ,KACE,GAAY,UAAU,MAAM,MAAQ,GAA0B,CAChE,KACE,GAAY,UAAU,MAAM,MAC5B,GAA8B,CAChC,QAAS,CACP,QACE,GAAY,UAAU,MAAM,SAAS,SACrC,GAAiC,CACnC,KACE,GAAY,UAAU,MAAM,SAAS,MACrC,GAAqC,CACxC,CACF,CACF,CACD,CAAA,CAEK,UACT,WAAY,CACV,aAAc,GAAY,cAAgB,GAAc,CACxD,KAAM,GAAY,MAAQ,GAAkB,CAC5C,QAAS,GAAY,SAAW,GAAqB,CACrD,QAAS,GAAY,SAAW,GAAqB,CACtD,CAEA,WACY,CAAA"}
@@ -0,0 +1,22 @@
1
+ import { IconProps } from "../icons/icon/Icon.mjs";
2
+ import { IconWrappedProps } from "../icons/icon-wrapped/IconWrapped.mjs";
3
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
4
+
5
+ //#region src/components/data-display/file-icon/FileIcon.d.ts
6
+ type FileIconProps = {
7
+ fileType?: string;
8
+ fileName?: string;
9
+ classNames?: {
10
+ fileIcon?: string;
11
+ iconWrapped?: IconWrappedProps['classNames'];
12
+ icon?: IconProps['classNames'];
13
+ };
14
+ };
15
+ declare const FileIcon: ({
16
+ fileType,
17
+ fileName,
18
+ classNames
19
+ }: FileIconProps) => react_jsx_runtime0.JSX.Element;
20
+ //#endregion
21
+ export { FileIcon, FileIconProps };
22
+ //# sourceMappingURL=FileIcon.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileIcon.d.mts","names":[],"sources":["../../../../src/components/data-display/file-icon/FileIcon.tsx"],"mappings":";;;;;KA6FY,aAAA;EACV,QAAA;EACA,QAAA;EACA,UAAA;IACE,QAAA;IACA,WAAA,GAAc,gBAAA;IACd,IAAA,GAAO,SAAA;EAAA;AAAA;AAAA,cAIE,QAAA;EAAY,QAAA;EAAA,QAAA;EAAA;AAAA,GAAoC,aAAA,KAAa,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,2 @@
1
+ import{Icon as e}from"../icons/icon/Icon.mjs";import{IconWrapped as t}from"../icons/icon-wrapped/IconWrapped.mjs";import{cx as n}from"@mage-ui/styled-system/css";import{fileIcon as r,fileIconIcon as i,fileIconIconIconRaw as a,fileIconIconIconRawRoot as o,fileIconIconRoot as s,fileIconIconWrapped as c,fileIconIconWrappedRoot as l}from"@mage-ui/styled-system/recipes";import{jsx as u}from"react/jsx-runtime";const d=[{match:e=>e.startsWith(`image/`),type:`image`},{match:e=>e.startsWith(`video/`),type:`video`},{match:e=>e.startsWith(`audio/`),type:`audio`},{match:e=>e===`application/pdf`,type:`pdf`},{match:e=>e.startsWith(`text/`),type:`text`},{match:e=>[`application/zip`,`application/x-zip-compressed`,`application/x-rar-compressed`,`application/x-7z-compressed`].includes(e),type:`archive`}],f={png:`image`,jpg:`image`,jpeg:`image`,webp:`image`,gif:`image`,mp4:`video`,mov:`video`,webm:`video`,mp3:`audio`,wav:`audio`,txt:`text`,md:`text`,csv:`text`,pdf:`pdf`,zip:`archive`,rar:`archive`,"7z":`archive`},p={image:`mage-file-icon-image`,video:`mage-file-icon-video`,audio:`mage-file-icon-audio`,text:`mage-file-icon-text`,pdf:`mage-file-icon-pdf`,archive:`mage-file-icon-archive`,default:`mage-file-icon-attachment`},m=(e,t)=>{if(e){let t=d.find(({match:t})=>t(e));if(t)return p[t.type]}if(t){let e=t.split(`.`).pop()?.toLowerCase();if(e&&f[e])return p[f[e]]}return p.default},h=({fileType:d,fileName:f,classNames:p})=>{let h=m(d,f);return u(t,{classNames:{iconWrapped:n(p?.fileIcon??r(),p?.iconWrapped?.iconWrapped??c()),root:n(p?.iconWrapped?.root??l())},children:u(e,{name:h,path:`/icons/sprite-mage.svg`,classNames:{icon:p?.icon?.icon??i(),root:p?.icon?.root??s(),iconRaw:{iconRaw:p?.icon?.iconRaw?.iconRaw??a(),root:p?.icon?.iconRaw?.root??o()}}})})};export{h as FileIcon};
2
+ //# sourceMappingURL=FileIcon.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileIcon.mjs","names":[],"sources":["../../../../src/components/data-display/file-icon/FileIcon.tsx"],"sourcesContent":["import { cx } from '@mage-ui/styled-system/css';\nimport {\n fileIcon,\n fileIconIcon,\n fileIconIconIconRaw,\n fileIconIconIconRawRoot,\n fileIconIconRoot,\n fileIconIconWrapped,\n fileIconIconWrappedRoot,\n} from '@mage-ui/styled-system/recipes';\nimport {\n Icon,\n type IconProps,\n IconWrapped,\n type IconWrappedProps,\n} from '@/components/data-display';\n\ntype FileIconType =\n | 'image'\n | 'video'\n | 'audio'\n | 'text'\n | 'pdf'\n | 'archive'\n | 'default';\n\nconst MIME_ICON_MAP: Array<{\n match: (mime: string) => boolean;\n type: FileIconType;\n}> = [\n { match: (m) => m.startsWith('image/'), type: 'image' },\n { match: (m) => m.startsWith('video/'), type: 'video' },\n { match: (m) => m.startsWith('audio/'), type: 'audio' },\n { match: (m) => m === 'application/pdf', type: 'pdf' },\n { match: (m) => m.startsWith('text/'), type: 'text' },\n {\n match: (m) =>\n [\n 'application/zip',\n 'application/x-zip-compressed',\n 'application/x-rar-compressed',\n 'application/x-7z-compressed',\n ].includes(m),\n type: 'archive',\n },\n];\n\nconst EXTENSION_ICON_MAP: Record<string, FileIconType> = {\n png: 'image',\n jpg: 'image',\n jpeg: 'image',\n webp: 'image',\n gif: 'image',\n mp4: 'video',\n mov: 'video',\n webm: 'video',\n mp3: 'audio',\n wav: 'audio',\n txt: 'text',\n md: 'text',\n csv: 'text',\n pdf: 'pdf',\n zip: 'archive',\n rar: 'archive',\n '7z': 'archive',\n};\n\nconst ICON_NAME_MAP: Record<FileIconType, string> = {\n image: 'mage-file-icon-image',\n video: 'mage-file-icon-video',\n audio: 'mage-file-icon-audio',\n text: 'mage-file-icon-text',\n pdf: 'mage-file-icon-pdf',\n archive: 'mage-file-icon-archive',\n default: 'mage-file-icon-attachment',\n};\n\nconst resolveIconName = (fileType?: string, fileName?: string): string => {\n if (fileType) {\n const match = MIME_ICON_MAP.find(({ match }) => match(fileType));\n if (match) return ICON_NAME_MAP[match.type];\n }\n\n if (fileName) {\n const ext = fileName.split('.').pop()?.toLowerCase();\n if (ext && EXTENSION_ICON_MAP[ext]) {\n return ICON_NAME_MAP[EXTENSION_ICON_MAP[ext]];\n }\n }\n\n return ICON_NAME_MAP.default;\n};\n\nexport type FileIconProps = {\n fileType?: string;\n fileName?: string;\n classNames?: {\n fileIcon?: string;\n iconWrapped?: IconWrappedProps['classNames'];\n icon?: IconProps['classNames'];\n };\n};\n\nexport const FileIcon = ({ fileType, fileName, classNames }: FileIconProps) => {\n const iconName = resolveIconName(fileType, fileName);\n\n return (\n <IconWrapped\n classNames={{\n iconWrapped: cx(\n classNames?.fileIcon ?? fileIcon(),\n classNames?.iconWrapped?.iconWrapped ?? fileIconIconWrapped(),\n ),\n root: cx(classNames?.iconWrapped?.root ?? fileIconIconWrappedRoot()),\n }}\n >\n <Icon\n name={iconName}\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.icon?.icon ?? fileIconIcon(),\n root: classNames?.icon?.root ?? fileIconIconRoot(),\n iconRaw: {\n iconRaw:\n classNames?.icon?.iconRaw?.iconRaw ?? fileIconIconIconRaw(),\n root: classNames?.icon?.iconRaw?.root ?? fileIconIconIconRawRoot(),\n },\n }}\n />\n </IconWrapped>\n );\n};\n"],"mappings":"wZA0BA,MAAM,EAGD,CACH,CAAE,MAAQ,GAAM,EAAE,WAAW,SAAS,CAAE,KAAM,QAAS,CACvD,CAAE,MAAQ,GAAM,EAAE,WAAW,SAAS,CAAE,KAAM,QAAS,CACvD,CAAE,MAAQ,GAAM,EAAE,WAAW,SAAS,CAAE,KAAM,QAAS,CACvD,CAAE,MAAQ,GAAM,IAAM,kBAAmB,KAAM,MAAO,CACtD,CAAE,MAAQ,GAAM,EAAE,WAAW,QAAQ,CAAE,KAAM,OAAQ,CACrD,CACE,MAAQ,GACN,CACE,kBACA,+BACA,+BACA,8BACD,CAAC,SAAS,EAAE,CACf,KAAM,UACP,CACF,CAEK,EAAmD,CACvD,IAAK,QACL,IAAK,QACL,KAAM,QACN,KAAM,QACN,IAAK,QACL,IAAK,QACL,IAAK,QACL,KAAM,QACN,IAAK,QACL,IAAK,QACL,IAAK,OACL,GAAI,OACJ,IAAK,OACL,IAAK,MACL,IAAK,UACL,IAAK,UACL,KAAM,UACP,CAEK,EAA8C,CAClD,MAAO,uBACP,MAAO,uBACP,MAAO,uBACP,KAAM,sBACN,IAAK,qBACL,QAAS,yBACT,QAAS,4BACV,CAEK,GAAmB,EAAmB,IAA8B,CACxE,GAAI,EAAU,CACZ,IAAM,EAAQ,EAAc,MAAM,CAAE,WAAY,EAAM,EAAS,CAAC,CAChE,GAAI,EAAO,OAAO,EAAc,EAAM,MAGxC,GAAI,EAAU,CACZ,IAAM,EAAM,EAAS,MAAM,IAAI,CAAC,KAAK,EAAE,aAAa,CACpD,GAAI,GAAO,EAAmB,GAC5B,OAAO,EAAc,EAAmB,IAI5C,OAAO,EAAc,SAaV,GAAY,CAAE,WAAU,WAAU,gBAAgC,CAC7E,IAAM,EAAW,EAAgB,EAAU,EAAS,CAEpD,OACE,EAAC,EAAD,CACE,WAAY,CACV,YAAa,EACX,GAAY,UAAY,GAAU,CAClC,GAAY,aAAa,aAAe,GAAqB,CAC9D,CACD,KAAM,EAAG,GAAY,aAAa,MAAQ,GAAyB,CAAC,CACrE,UAED,EAAC,EAAD,CACE,KAAM,EACN,KAAK,yBACL,WAAY,CACV,KAAM,GAAY,MAAM,MAAQ,GAAc,CAC9C,KAAM,GAAY,MAAM,MAAQ,GAAkB,CAClD,QAAS,CACP,QACE,GAAY,MAAM,SAAS,SAAW,GAAqB,CAC7D,KAAM,GAAY,MAAM,SAAS,MAAQ,GAAyB,CACnE,CACF,CACD,CAAA,CACU,CAAA"}
@@ -20,6 +20,8 @@ import { DataTableFeedback } from "./datatables/DataTableFeedback.mjs";
20
20
  import { DataTableTopSlot, DataTableTopSlotProps } from "./datatables/DataTableTopSlot.mjs";
21
21
  import { ColumnDef, ExpandedState, PaginationState, RowSelectionState, SortingState } from "./datatables/index.mjs";
22
22
  import { DescriptionList, DescriptionListClassNames, DescriptionListItemProps, DescriptionListProps } from "./description-list/DescriptionList.mjs";
23
+ import { FileIcon, FileIconProps } from "./file-icon/FileIcon.mjs";
24
+ import { DocumentItem, DocumentItemProps } from "./document-item/DocumentItem.mjs";
23
25
  import { Icon, IconProps } from "./icons/icon/Icon.mjs";
24
26
  import { IconRaw, IconRawProps } from "./icons/icon-raw/IconRaw.mjs";
25
27
  import { IconSvg, IconSvgProps } from "./icons/icon-svg/IconSvg.mjs";
@@ -31,6 +33,7 @@ import { LogoImage, LogoImageProps } from "./logos/logo-image/LogoImage.mjs";
31
33
  import { LogoSvg, LogoSvgProps } from "./logos/logo-svg/LogoSvg.mjs";
32
34
  import { NotificationBanner, NotificationBannerIntent, NotificationBannerProps } from "./notification-banner/NotificationBanner.mjs";
33
35
  import { RemovableItem, RemovableItemProps } from "./removable-item/RemovableItem.mjs";
36
+ import { ResourceItem, ResourceItemProps } from "./resource-item/ResourceItem.mjs";
34
37
  import { Tag, TagProps } from "./tag/Tag.mjs";
35
38
  import { TagGroup, TagGroupProps } from "./tag-group/TagGroup.mjs";
36
39
  import { UploadedFile, UploadedFileProps } from "./uploaded-file/UploadedFile.mjs";
@@ -9,7 +9,7 @@ type RemovableItemProps = {
9
9
  onRemove: () => void;
10
10
  removeButtonLabel?: string;
11
11
  classNames?: {
12
- container?: string;
12
+ removableItem?: string;
13
13
  root?: string;
14
14
  section?: string;
15
15
  content?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"RemovableItem.d.mts","names":[],"sources":["../../../../src/components/data-display/removable-item/RemovableItem.tsx"],"mappings":";;;;;KAgBY,kBAAA;EACV,SAAA,GAAY,SAAA;EACZ,QAAA,EAAU,SAAA;EACV,QAAA;EACA,iBAAA;EACA,UAAA;IACE,SAAA;IACA,IAAA;IACA,OAAA;IACA,OAAA;IACA,UAAA,GAAa,eAAA;EAAA;AAAA;AAAA,cAIJ,aAAA;EAAiB,SAAA;EAAA,QAAA;EAAA,QAAA;EAAA,iBAAA;EAAA;AAAA,GAM3B,kBAAA,KAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"RemovableItem.d.mts","names":[],"sources":["../../../../src/components/data-display/removable-item/RemovableItem.tsx"],"mappings":";;;;;KAiBY,kBAAA;EACV,SAAA,GAAY,SAAA;EACZ,QAAA,EAAU,SAAA;EACV,QAAA;EACA,iBAAA;EACA,UAAA;IACE,aAAA;IACA,IAAA;IACA,OAAA;IACA,OAAA;IACA,UAAA,GAAa,eAAA;EAAA;AAAA;AAAA,cAIJ,aAAA;EAAiB,SAAA;EAAA,QAAA;EAAA,QAAA;EAAA,iBAAA;EAAA;AAAA,GAM3B,kBAAA,KAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,2 +1,2 @@
1
- import{ButtonIcon as e}from"../../buttons/button-icon/ButtonIcon.mjs";import{cx as t}from"@mage-ui/styled-system/css";import{removableItem as n,removableItemButtonIcon as r,removableItemButtonIconIcon as i,removableItemButtonIconIconRaw as a,removableItemButtonIconIconRawRoot as o,removableItemButtonIconRoot as s,removableItemContent as c,removableItemRoot as l,removableItemSection as u}from"@mage-ui/styled-system/recipes";import{jsx as d,jsxs as f}from"react/jsx-runtime";const p=({startSlot:p,children:m,onRemove:h,removeButtonLabel:g=`Remove`,classNames:_})=>f(`div`,{className:t(_?.container??n(),_?.root??l()),children:[p&&d(`div`,{className:_?.section??u(),children:p}),d(`div`,{className:_?.content??c(),children:m}),d(e,{label:g,onClick:h,path:`/icons/sprite-mage.svg`,name:`mage-removable-item-button-x`,classNames:{buttonIcon:_?.buttonIcon?.buttonIcon??r(),root:_?.buttonIcon?.root??s(),icon:_?.buttonIcon?.icon??i(),iconRaw:{iconRaw:_?.buttonIcon?.iconRaw?.iconRaw??a(),root:_?.buttonIcon?.iconRaw?.root??o()}}})]});export{p as RemovableItem};
1
+ import{ResourceItem as e}from"../resource-item/ResourceItem.mjs";import{ButtonIcon as t}from"../../buttons/button-icon/ButtonIcon.mjs";import{removableItem as n,removableItemButtonIcon as r,removableItemButtonIconIcon as i,removableItemButtonIconIconRaw as a,removableItemButtonIconIconRawRoot as o,removableItemButtonIconRoot as s,removableItemContent as c,removableItemRoot as l,removableItemSection as u}from"@mage-ui/styled-system/recipes";import{jsx as d}from"react/jsx-runtime";const f=({startSlot:f,children:p,onRemove:m,removeButtonLabel:h=`Remove`,classNames:g})=>d(e,{startSlot:f,endSlot:d(t,{label:h,onClick:m,path:`/icons/sprite-mage.svg`,name:`mage-removable-item-button-x`,classNames:{buttonIcon:g?.buttonIcon?.buttonIcon??r(),root:g?.buttonIcon?.root??s(),icon:g?.buttonIcon?.icon??i(),iconRaw:{iconRaw:g?.buttonIcon?.iconRaw?.iconRaw??a(),root:g?.buttonIcon?.iconRaw?.root??o()}}}),classNames:{resourceItem:g?.removableItem??n(),root:g?.root??l(),section:g?.section??u(),content:g?.content??c()},children:p});export{f as RemovableItem};
2
2
  //# sourceMappingURL=RemovableItem.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RemovableItem.mjs","names":[],"sources":["../../../../src/components/data-display/removable-item/RemovableItem.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { cx } from '@mage-ui/styled-system/css';\nimport {\n removableItem,\n removableItemButtonIcon,\n removableItemButtonIconIcon,\n removableItemButtonIconIconRaw,\n removableItemButtonIconIconRawRoot,\n removableItemButtonIconRoot,\n removableItemContent,\n removableItemRoot,\n removableItemSection,\n} from '@mage-ui/styled-system/recipes';\nimport { ButtonIcon, type ButtonIconProps } from '@/components/buttons';\n\nexport type RemovableItemProps = {\n startSlot?: ReactNode;\n children: ReactNode;\n onRemove: () => void;\n removeButtonLabel?: string;\n classNames?: {\n container?: string;\n root?: string;\n section?: string;\n content?: string;\n buttonIcon?: ButtonIconProps['classNames'];\n };\n};\n\nexport const RemovableItem = ({\n startSlot,\n children,\n onRemove,\n removeButtonLabel = 'Remove',\n classNames,\n}: RemovableItemProps) => {\n return (\n <div\n className={cx(\n classNames?.container ?? removableItem(),\n classNames?.root ?? removableItemRoot(),\n )}\n >\n {startSlot && (\n <div className={classNames?.section ?? removableItemSection()}>\n {startSlot}\n </div>\n )}\n\n <div className={classNames?.content ?? removableItemContent()}>\n {children}\n </div>\n\n <ButtonIcon\n label={removeButtonLabel}\n onClick={onRemove}\n path='/icons/sprite-mage.svg'\n name='mage-removable-item-button-x'\n classNames={{\n buttonIcon:\n classNames?.buttonIcon?.buttonIcon ?? removableItemButtonIcon(),\n root: classNames?.buttonIcon?.root ?? removableItemButtonIconRoot(),\n icon: classNames?.buttonIcon?.icon ?? removableItemButtonIconIcon(),\n iconRaw: {\n iconRaw:\n classNames?.buttonIcon?.iconRaw?.iconRaw ??\n removableItemButtonIconIconRaw(),\n root:\n classNames?.buttonIcon?.iconRaw?.root ??\n removableItemButtonIconIconRawRoot(),\n },\n }}\n />\n </div>\n );\n};\n"],"mappings":"6dA8BA,MAAa,GAAiB,CAC5B,YACA,WACA,WACA,oBAAoB,SACpB,gBAGE,EAAC,MAAD,CACE,UAAW,EACT,GAAY,WAAa,GAAe,CACxC,GAAY,MAAQ,GAAmB,CACxC,UAJH,CAMG,GACC,EAAC,MAAD,CAAK,UAAW,GAAY,SAAW,GAAsB,UAC1D,EACG,CAAA,CAGR,EAAC,MAAD,CAAK,UAAW,GAAY,SAAW,GAAsB,CAC1D,WACG,CAAA,CAEN,EAAC,EAAD,CACE,MAAO,EACP,QAAS,EACT,KAAK,yBACL,KAAK,+BACL,WAAY,CACV,WACE,GAAY,YAAY,YAAc,GAAyB,CACjE,KAAM,GAAY,YAAY,MAAQ,GAA6B,CACnE,KAAM,GAAY,YAAY,MAAQ,GAA6B,CACnE,QAAS,CACP,QACE,GAAY,YAAY,SAAS,SACjC,GAAgC,CAClC,KACE,GAAY,YAAY,SAAS,MACjC,GAAoC,CACvC,CACF,CACD,CAAA,CACE"}
1
+ {"version":3,"file":"RemovableItem.mjs","names":[],"sources":["../../../../src/components/data-display/removable-item/RemovableItem.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport {\n removableItem,\n removableItemButtonIcon,\n removableItemButtonIconIcon,\n removableItemButtonIconIconRaw,\n removableItemButtonIconIconRawRoot,\n removableItemButtonIconRoot,\n removableItemContent,\n removableItemRoot,\n removableItemSection,\n} from '@mage-ui/styled-system/recipes';\nimport { ButtonIcon, type ButtonIconProps } from '@/components/buttons';\n\nimport { ResourceItem } from '../resource-item/ResourceItem';\n\nexport type RemovableItemProps = {\n startSlot?: ReactNode;\n children: ReactNode;\n onRemove: () => void;\n removeButtonLabel?: string;\n classNames?: {\n removableItem?: string;\n root?: string;\n section?: string;\n content?: string;\n buttonIcon?: ButtonIconProps['classNames'];\n };\n};\n\nexport const RemovableItem = ({\n startSlot,\n children,\n onRemove,\n removeButtonLabel = 'Remove',\n classNames,\n}: RemovableItemProps) => {\n return (\n <ResourceItem\n startSlot={startSlot}\n endSlot={\n <ButtonIcon\n label={removeButtonLabel}\n onClick={onRemove}\n path='/icons/sprite-mage.svg'\n name='mage-removable-item-button-x'\n classNames={{\n buttonIcon:\n classNames?.buttonIcon?.buttonIcon ?? removableItemButtonIcon(),\n root: classNames?.buttonIcon?.root ?? removableItemButtonIconRoot(),\n icon: classNames?.buttonIcon?.icon ?? removableItemButtonIconIcon(),\n iconRaw: {\n iconRaw:\n classNames?.buttonIcon?.iconRaw?.iconRaw ??\n removableItemButtonIconIconRaw(),\n root:\n classNames?.buttonIcon?.iconRaw?.root ??\n removableItemButtonIconIconRawRoot(),\n },\n }}\n />\n }\n classNames={{\n resourceItem: classNames?.removableItem ?? removableItem(),\n root: classNames?.root ?? removableItemRoot(),\n section: classNames?.section ?? removableItemSection(),\n content: classNames?.content ?? removableItemContent(),\n }}\n >\n {children}\n </ResourceItem>\n );\n};\n"],"mappings":"oeA+BA,MAAa,GAAiB,CAC5B,YACA,WACA,WACA,oBAAoB,SACpB,gBAGE,EAAC,EAAD,CACa,YACX,QACE,EAAC,EAAD,CACE,MAAO,EACP,QAAS,EACT,KAAK,yBACL,KAAK,+BACL,WAAY,CACV,WACE,GAAY,YAAY,YAAc,GAAyB,CACjE,KAAM,GAAY,YAAY,MAAQ,GAA6B,CACnE,KAAM,GAAY,YAAY,MAAQ,GAA6B,CACnE,QAAS,CACP,QACE,GAAY,YAAY,SAAS,SACjC,GAAgC,CAClC,KACE,GAAY,YAAY,SAAS,MACjC,GAAoC,CACvC,CACF,CACD,CAAA,CAEJ,WAAY,CACV,aAAc,GAAY,eAAiB,GAAe,CAC1D,KAAM,GAAY,MAAQ,GAAmB,CAC7C,QAAS,GAAY,SAAW,GAAsB,CACtD,QAAS,GAAY,SAAW,GAAsB,CACvD,CAEA,WACY,CAAA"}
@@ -0,0 +1,24 @@
1
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+ import { ReactNode } from "react";
3
+
4
+ //#region src/components/data-display/resource-item/ResourceItem.d.ts
5
+ type ResourceItemProps = {
6
+ startSlot?: ReactNode;
7
+ children: ReactNode;
8
+ endSlot?: ReactNode;
9
+ classNames?: {
10
+ resourceItem?: string;
11
+ root?: string;
12
+ section?: string;
13
+ content?: string;
14
+ };
15
+ };
16
+ declare const ResourceItem: ({
17
+ startSlot,
18
+ children,
19
+ endSlot,
20
+ classNames
21
+ }: ResourceItemProps) => react_jsx_runtime0.JSX.Element;
22
+ //#endregion
23
+ export { ResourceItem, ResourceItemProps };
24
+ //# sourceMappingURL=ResourceItem.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceItem.d.mts","names":[],"sources":["../../../../src/components/data-display/resource-item/ResourceItem.tsx"],"mappings":";;;;KAUY,iBAAA;EACV,SAAA,GAAY,SAAA;EACZ,QAAA,EAAU,SAAA;EACV,OAAA,GAAU,SAAA;EACV,UAAA;IACE,YAAA;IACA,IAAA;IACA,OAAA;IACA,OAAA;EAAA;AAAA;AAAA,cAIS,YAAA;EAAgB,SAAA;EAAA,QAAA;EAAA,OAAA;EAAA;AAAA,GAK1B,iBAAA,KAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +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};
2
+ //# sourceMappingURL=ResourceItem.mjs.map
@@ -0,0 +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,5 +1,4 @@
1
- import { IconProps } from "../icons/icon/Icon.mjs";
2
- import { IconWrappedProps } from "../icons/icon-wrapped/IconWrapped.mjs";
1
+ import { FileIconProps } from "../file-icon/FileIcon.mjs";
3
2
  import { RemovableItemProps } from "../removable-item/RemovableItem.mjs";
4
3
  import * as react_jsx_runtime0 from "react/jsx-runtime";
5
4
  import { ReactNode } from "react";
@@ -20,8 +19,7 @@ type UploadedFileProps = {
20
19
  details?: string;
21
20
  fileLink?: string;
22
21
  fileName?: string;
23
- startIconWrapped?: IconWrappedProps['classNames'];
24
- startIcon?: IconProps['classNames'];
22
+ fileIcon?: FileIconProps['classNames'];
25
23
  removableItem?: RemovableItemProps['classNames'];
26
24
  buttonIcon?: NonNullable<RemovableItemProps['classNames']>['buttonIcon'];
27
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"UploadedFile.d.mts","names":[],"sources":["../../../../src/components/data-display/uploaded-file/UploadedFile.tsx"],"mappings":";;;;;;;KAyBY,iBAAA;EACV,gBAAA;EACA,QAAA,GAAW,SAAA;EACX,QAAA;EACA,GAAA;EACA,QAAA,EAAU,SAAA;EACV,QAAA;EACA,UAAA;IACE,YAAA;IACA,IAAA;IACA,OAAA;IACA,OAAA;IACA,OAAA;IACA,QAAA;IACA,QAAA;IACA,gBAAA,GAAmB,gBAAA;IACnB,SAAA,GAAY,SAAA;IACZ,aAAA,GAAgB,kBAAA;IAChB,UAAA,GAAa,WAAA,CAAY,kBAAA;EAAA;AAAA;AAAA,cAIhB,YAAA;EAAgB,gBAAA;EAAA,QAAA;EAAA,QAAA;EAAA,GAAA;EAAA,QAAA;EAAA,QAAA;EAAA;AAAA,GAQ1B,iBAAA,KAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"UploadedFile.d.mts","names":[],"sources":["../../../../src/components/data-display/uploaded-file/UploadedFile.tsx"],"mappings":";;;;;;KA8BY,iBAAA;EACV,gBAAA;EACA,QAAA,GAAW,SAAA;EACX,QAAA;EACA,GAAA;EACA,QAAA,EAAU,SAAA;EACV,QAAA;EACA,UAAA;IACE,YAAA;IACA,IAAA;IACA,OAAA;IACA,OAAA;IACA,OAAA;IACA,QAAA;IACA,QAAA;IACA,QAAA,GAAW,aAAA;IACX,aAAA,GAAgB,kBAAA;IAChB,UAAA,GAAa,WAAA,CAAY,kBAAA;EAAA;AAAA;AAAA,cAIhB,YAAA;EAAgB,gBAAA;EAAA,QAAA;EAAA,QAAA;EAAA,GAAA;EAAA,QAAA;EAAA,QAAA;EAAA;AAAA,GAQ1B,iBAAA,KAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,2 +1,2 @@
1
- import{RemovableItem as e}from"../removable-item/RemovableItem.mjs";import{UploadedFileIcon as t}from"./UploadedFileIcon.mjs";import{uploadedFile as n,uploadedFileButtonIcon as r,uploadedFileButtonIconIcon as i,uploadedFileButtonIconIconRaw as a,uploadedFileButtonIconIconRawRoot as o,uploadedFileButtonIconRoot as s,uploadedFileContent as c,uploadedFileDetails as l,uploadedFileLink as u,uploadedFileName as d,uploadedFileRoot as f,uploadedFileSection as p}from"@mage-ui/styled-system/recipes";import{jsx as m,jsxs as h}from"react/jsx-runtime";const g=({clearButtonLabel:g=`Remove file`,fileName:_,fileType:v,url:y,children:b,onRemove:x,classNames:S})=>h(e,{startSlot:m(t,{fileType:v,fileName:typeof _==`string`?_:void 0,classNames:{startIconWrapped:S?.startIconWrapped,startIcon:S?.startIcon}}),onRemove:x,removeButtonLabel:g,classNames:{container:S?.removableItem?.container??S?.uploadedFile??n(),root:S?.removableItem?.root??S?.root??f(),section:S?.removableItem?.section??S?.section??p(),content:S?.removableItem?.content??S?.content??c(),buttonIcon:{buttonIcon:S?.buttonIcon?.buttonIcon??S?.removableItem?.buttonIcon?.buttonIcon??r(),root:S?.buttonIcon?.root??S?.removableItem?.buttonIcon?.root??s(),icon:S?.buttonIcon?.icon??S?.removableItem?.buttonIcon?.icon??i(),iconRaw:{iconRaw:S?.buttonIcon?.iconRaw?.iconRaw??S?.removableItem?.buttonIcon?.iconRaw?.iconRaw??a(),root:S?.buttonIcon?.iconRaw?.root??S?.removableItem?.buttonIcon?.iconRaw?.root??o()}}},children:[y?m(`a`,{href:y,target:`_blank`,rel:`noopener noreferrer`,download:!0,className:S?.fileLink??u(),children:_}):m(`span`,{className:S?.fileName??d(),children:_}),m(`div`,{className:S?.details??l(),children:b})]});export{g as UploadedFile};
1
+ import{FileIcon as e}from"../file-icon/FileIcon.mjs";import{RemovableItem as t}from"../removable-item/RemovableItem.mjs";import{uploadedFile as n,uploadedFileButtonIcon as r,uploadedFileButtonIconIcon as i,uploadedFileButtonIconIconRaw as a,uploadedFileButtonIconIconRawRoot as o,uploadedFileButtonIconRoot as s,uploadedFileContent as c,uploadedFileDetails as l,uploadedFileFileIcon as u,uploadedFileLink as d,uploadedFileName as f,uploadedFileRoot as p,uploadedFileSection as m,uploadedFileStartIcon as h,uploadedFileStartIconIconRaw as g,uploadedFileStartIconIconRawRoot as _,uploadedFileStartIconRoot as v,uploadedFileStartIconWrapped as y,uploadedFileStartIconWrappedRoot as b}from"@mage-ui/styled-system/recipes";import{jsx as x,jsxs as S}from"react/jsx-runtime";const C=({clearButtonLabel:C=`Remove file`,fileName:w,fileType:T,url:E,children:D,onRemove:O,classNames:k})=>S(t,{startSlot:x(e,{fileType:T,fileName:typeof w==`string`?w:void 0,classNames:{fileIcon:k?.fileIcon?.fileIcon??u(),iconWrapped:{iconWrapped:k?.fileIcon?.iconWrapped?.iconWrapped??y(),root:k?.fileIcon?.iconWrapped?.root??b()},icon:{icon:k?.fileIcon?.icon?.icon??h(),root:k?.fileIcon?.icon?.root??v(),iconRaw:{iconRaw:k?.fileIcon?.icon?.iconRaw?.iconRaw??g(),root:k?.fileIcon?.icon?.iconRaw?.root??_()}}}}),onRemove:O,removeButtonLabel:C,classNames:{removableItem:k?.uploadedFile??n(),root:k?.root??p(),section:k?.section??m(),content:k?.content??c(),buttonIcon:{buttonIcon:k?.buttonIcon?.buttonIcon??r(),root:k?.buttonIcon?.root??s(),icon:k?.buttonIcon?.icon??i(),iconRaw:{iconRaw:k?.buttonIcon?.iconRaw?.iconRaw??a(),root:k?.buttonIcon?.iconRaw?.root??o()}}},children:[E?x(`a`,{href:E,target:`_blank`,rel:`noopener noreferrer`,download:!0,className:k?.fileLink??d(),children:w}):x(`span`,{className:k?.fileName??f(),children:w}),x(`div`,{className:k?.details??l(),children:D})]});export{C as UploadedFile};
2
2
  //# sourceMappingURL=UploadedFile.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"UploadedFile.mjs","names":[],"sources":["../../../../src/components/data-display/uploaded-file/UploadedFile.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport {\n uploadedFile,\n uploadedFileButtonIcon,\n uploadedFileButtonIconIcon,\n uploadedFileButtonIconIconRaw,\n uploadedFileButtonIconIconRawRoot,\n uploadedFileButtonIconRoot,\n uploadedFileContent,\n uploadedFileDetails,\n uploadedFileLink,\n uploadedFileName,\n uploadedFileRoot,\n uploadedFileSection,\n} from '@mage-ui/styled-system/recipes';\nimport {\n type IconProps,\n type IconWrappedProps,\n RemovableItem,\n type RemovableItemProps,\n} from '@/components/data-display';\n\nimport { UploadedFileIcon } from './UploadedFileIcon';\n\nexport type UploadedFileProps = {\n clearButtonLabel?: string;\n fileName?: ReactNode;\n fileType?: string;\n url?: string;\n children: ReactNode;\n onRemove: () => void;\n classNames?: {\n uploadedFile?: string;\n root?: string;\n section?: string;\n content?: string;\n details?: string;\n fileLink?: string;\n fileName?: string;\n startIconWrapped?: IconWrappedProps['classNames'];\n startIcon?: IconProps['classNames'];\n removableItem?: RemovableItemProps['classNames'];\n buttonIcon?: NonNullable<RemovableItemProps['classNames']>['buttonIcon'];\n };\n};\n\nexport const UploadedFile = ({\n clearButtonLabel = 'Remove file',\n fileName,\n fileType,\n url,\n children,\n onRemove,\n classNames,\n}: UploadedFileProps) => {\n return (\n <RemovableItem\n startSlot={\n <UploadedFileIcon\n fileType={fileType}\n fileName={typeof fileName === 'string' ? fileName : undefined}\n classNames={{\n startIconWrapped: classNames?.startIconWrapped,\n startIcon: classNames?.startIcon,\n }}\n />\n }\n onRemove={onRemove}\n removeButtonLabel={clearButtonLabel}\n classNames={{\n container:\n classNames?.removableItem?.container ??\n classNames?.uploadedFile ??\n uploadedFile(),\n root:\n classNames?.removableItem?.root ??\n classNames?.root ??\n uploadedFileRoot(),\n section:\n classNames?.removableItem?.section ??\n classNames?.section ??\n uploadedFileSection(),\n content:\n classNames?.removableItem?.content ??\n classNames?.content ??\n uploadedFileContent(),\n buttonIcon: {\n buttonIcon:\n classNames?.buttonIcon?.buttonIcon ??\n classNames?.removableItem?.buttonIcon?.buttonIcon ??\n uploadedFileButtonIcon(),\n root:\n classNames?.buttonIcon?.root ??\n classNames?.removableItem?.buttonIcon?.root ??\n uploadedFileButtonIconRoot(),\n icon:\n classNames?.buttonIcon?.icon ??\n classNames?.removableItem?.buttonIcon?.icon ??\n uploadedFileButtonIconIcon(),\n iconRaw: {\n iconRaw:\n classNames?.buttonIcon?.iconRaw?.iconRaw ??\n classNames?.removableItem?.buttonIcon?.iconRaw?.iconRaw ??\n uploadedFileButtonIconIconRaw(),\n root:\n classNames?.buttonIcon?.iconRaw?.root ??\n classNames?.removableItem?.buttonIcon?.iconRaw?.root ??\n uploadedFileButtonIconIconRawRoot(),\n },\n },\n }}\n >\n {/* TODO: comentar link */}\n {url ? (\n <a\n href={url}\n target='_blank'\n rel='noopener noreferrer'\n download\n className={classNames?.fileLink ?? uploadedFileLink()}\n >\n {fileName}\n </a>\n ) : (\n <span className={classNames?.fileName ?? uploadedFileName()}>\n {fileName}\n </span>\n )}\n\n <div className={classNames?.details ?? uploadedFileDetails()}>\n {children}\n </div>\n </RemovableItem>\n );\n};\n"],"mappings":"iiBA+CA,MAAa,GAAgB,CAC3B,mBAAmB,cACnB,WACA,WACA,MACA,WACA,WACA,gBAGE,EAAC,EAAD,CACE,UACE,EAAC,EAAD,CACY,WACV,SAAU,OAAO,GAAa,SAAW,EAAW,IAAA,GACpD,WAAY,CACV,iBAAkB,GAAY,iBAC9B,UAAW,GAAY,UACxB,CACD,CAAA,CAEM,WACV,kBAAmB,EACnB,WAAY,CACV,UACE,GAAY,eAAe,WAC3B,GAAY,cACZ,GAAc,CAChB,KACE,GAAY,eAAe,MAC3B,GAAY,MACZ,GAAkB,CACpB,QACE,GAAY,eAAe,SAC3B,GAAY,SACZ,GAAqB,CACvB,QACE,GAAY,eAAe,SAC3B,GAAY,SACZ,GAAqB,CACvB,WAAY,CACV,WACE,GAAY,YAAY,YACxB,GAAY,eAAe,YAAY,YACvC,GAAwB,CAC1B,KACE,GAAY,YAAY,MACxB,GAAY,eAAe,YAAY,MACvC,GAA4B,CAC9B,KACE,GAAY,YAAY,MACxB,GAAY,eAAe,YAAY,MACvC,GAA4B,CAC9B,QAAS,CACP,QACE,GAAY,YAAY,SAAS,SACjC,GAAY,eAAe,YAAY,SAAS,SAChD,GAA+B,CACjC,KACE,GAAY,YAAY,SAAS,MACjC,GAAY,eAAe,YAAY,SAAS,MAChD,GAAmC,CACtC,CACF,CACF,UAtDH,CAyDG,EACC,EAAC,IAAD,CACE,KAAM,EACN,OAAO,SACP,IAAI,sBACJ,SAAA,GACA,UAAW,GAAY,UAAY,GAAkB,UAEpD,EACC,CAAA,CAEJ,EAAC,OAAD,CAAM,UAAW,GAAY,UAAY,GAAkB,UACxD,EACI,CAAA,CAGT,EAAC,MAAD,CAAK,UAAW,GAAY,SAAW,GAAqB,CACzD,WACG,CAAA,CACQ"}
1
+ {"version":3,"file":"UploadedFile.mjs","names":[],"sources":["../../../../src/components/data-display/uploaded-file/UploadedFile.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport {\n uploadedFile,\n uploadedFileButtonIcon,\n uploadedFileButtonIconIcon,\n uploadedFileButtonIconIconRaw,\n uploadedFileButtonIconIconRawRoot,\n uploadedFileButtonIconRoot,\n uploadedFileContent,\n uploadedFileDetails,\n uploadedFileFileIcon,\n uploadedFileLink,\n uploadedFileName,\n uploadedFileRoot,\n uploadedFileSection,\n uploadedFileStartIcon,\n uploadedFileStartIconIconRaw,\n uploadedFileStartIconIconRawRoot,\n uploadedFileStartIconRoot,\n uploadedFileStartIconWrapped,\n uploadedFileStartIconWrappedRoot,\n} from '@mage-ui/styled-system/recipes';\nimport {\n RemovableItem,\n type RemovableItemProps,\n} from '@/components/data-display';\n\nimport { FileIcon, type FileIconProps } from '../file-icon/FileIcon';\n\nexport type UploadedFileProps = {\n clearButtonLabel?: string;\n fileName?: ReactNode;\n fileType?: string;\n url?: string;\n children: ReactNode;\n onRemove: () => void;\n classNames?: {\n uploadedFile?: string;\n root?: string;\n section?: string;\n content?: string;\n details?: string;\n fileLink?: string;\n fileName?: string;\n fileIcon?: FileIconProps['classNames'];\n removableItem?: RemovableItemProps['classNames'];\n buttonIcon?: NonNullable<RemovableItemProps['classNames']>['buttonIcon'];\n };\n};\n\nexport const UploadedFile = ({\n clearButtonLabel = 'Remove file',\n fileName,\n fileType,\n url,\n children,\n onRemove,\n classNames,\n}: UploadedFileProps) => {\n return (\n <RemovableItem\n startSlot={\n <FileIcon\n fileType={fileType}\n fileName={typeof fileName === 'string' ? fileName : undefined}\n classNames={{\n fileIcon: classNames?.fileIcon?.fileIcon ?? uploadedFileFileIcon(),\n iconWrapped: {\n iconWrapped:\n classNames?.fileIcon?.iconWrapped?.iconWrapped ??\n uploadedFileStartIconWrapped(),\n root:\n classNames?.fileIcon?.iconWrapped?.root ??\n uploadedFileStartIconWrappedRoot(),\n },\n icon: {\n icon: classNames?.fileIcon?.icon?.icon ?? uploadedFileStartIcon(),\n root:\n classNames?.fileIcon?.icon?.root ?? uploadedFileStartIconRoot(),\n iconRaw: {\n iconRaw:\n classNames?.fileIcon?.icon?.iconRaw?.iconRaw ??\n uploadedFileStartIconIconRaw(),\n root:\n classNames?.fileIcon?.icon?.iconRaw?.root ??\n uploadedFileStartIconIconRawRoot(),\n },\n },\n }}\n />\n }\n onRemove={onRemove}\n removeButtonLabel={clearButtonLabel}\n classNames={{\n removableItem: classNames?.uploadedFile ?? uploadedFile(),\n root: classNames?.root ?? uploadedFileRoot(),\n section: classNames?.section ?? uploadedFileSection(),\n content: classNames?.content ?? uploadedFileContent(),\n buttonIcon: {\n buttonIcon:\n classNames?.buttonIcon?.buttonIcon ?? uploadedFileButtonIcon(),\n root: classNames?.buttonIcon?.root ?? uploadedFileButtonIconRoot(),\n icon: classNames?.buttonIcon?.icon ?? uploadedFileButtonIconIcon(),\n iconRaw: {\n iconRaw:\n classNames?.buttonIcon?.iconRaw?.iconRaw ??\n uploadedFileButtonIconIconRaw(),\n root:\n classNames?.buttonIcon?.iconRaw?.root ??\n uploadedFileButtonIconIconRawRoot(),\n },\n },\n }}\n >\n {/* TODO: comentar link */}\n {url ? (\n <a\n href={url}\n target='_blank'\n rel='noopener noreferrer'\n download\n className={classNames?.fileLink ?? uploadedFileLink()}\n >\n {fileName}\n </a>\n ) : (\n <span className={classNames?.fileName ?? uploadedFileName()}>\n {fileName}\n </span>\n )}\n\n <div className={classNames?.details ?? uploadedFileDetails()}>\n {children}\n </div>\n </RemovableItem>\n );\n};\n"],"mappings":"gwBAmDA,MAAa,GAAgB,CAC3B,mBAAmB,cACnB,WACA,WACA,MACA,WACA,WACA,gBAGE,EAAC,EAAD,CACE,UACE,EAAC,EAAD,CACY,WACV,SAAU,OAAO,GAAa,SAAW,EAAW,IAAA,GACpD,WAAY,CACV,SAAU,GAAY,UAAU,UAAY,GAAsB,CAClE,YAAa,CACX,YACE,GAAY,UAAU,aAAa,aACnC,GAA8B,CAChC,KACE,GAAY,UAAU,aAAa,MACnC,GAAkC,CACrC,CACD,KAAM,CACJ,KAAM,GAAY,UAAU,MAAM,MAAQ,GAAuB,CACjE,KACE,GAAY,UAAU,MAAM,MAAQ,GAA2B,CACjE,QAAS,CACP,QACE,GAAY,UAAU,MAAM,SAAS,SACrC,GAA8B,CAChC,KACE,GAAY,UAAU,MAAM,SAAS,MACrC,GAAkC,CACrC,CACF,CACF,CACD,CAAA,CAEM,WACV,kBAAmB,EACnB,WAAY,CACV,cAAe,GAAY,cAAgB,GAAc,CACzD,KAAM,GAAY,MAAQ,GAAkB,CAC5C,QAAS,GAAY,SAAW,GAAqB,CACrD,QAAS,GAAY,SAAW,GAAqB,CACrD,WAAY,CACV,WACE,GAAY,YAAY,YAAc,GAAwB,CAChE,KAAM,GAAY,YAAY,MAAQ,GAA4B,CAClE,KAAM,GAAY,YAAY,MAAQ,GAA4B,CAClE,QAAS,CACP,QACE,GAAY,YAAY,SAAS,SACjC,GAA+B,CACjC,KACE,GAAY,YAAY,SAAS,MACjC,GAAmC,CACtC,CACF,CACF,UApDH,CAuDG,EACC,EAAC,IAAD,CACE,KAAM,EACN,OAAO,SACP,IAAI,sBACJ,SAAA,GACA,UAAW,GAAY,UAAY,GAAkB,UAEpD,EACC,CAAA,CAEJ,EAAC,OAAD,CAAM,UAAW,GAAY,UAAY,GAAkB,UACxD,EACI,CAAA,CAGT,EAAC,MAAD,CAAK,UAAW,GAAY,SAAW,GAAqB,CACzD,WACG,CAAA,CACQ"}
@@ -28,6 +28,8 @@ import { DataTableFeedback } from "./data-display/datatables/DataTableFeedback.m
28
28
  import { DataTableTopSlot, DataTableTopSlotProps } from "./data-display/datatables/DataTableTopSlot.mjs";
29
29
  import { ColumnDef, ExpandedState, PaginationState, RowSelectionState, SortingState } from "./data-display/datatables/index.mjs";
30
30
  import { DescriptionList, DescriptionListClassNames, DescriptionListItemProps, DescriptionListProps } from "./data-display/description-list/DescriptionList.mjs";
31
+ import { FileIcon, FileIconProps } from "./data-display/file-icon/FileIcon.mjs";
32
+ import { DocumentItem, DocumentItemProps } from "./data-display/document-item/DocumentItem.mjs";
31
33
  import { Icon, IconProps } from "./data-display/icons/icon/Icon.mjs";
32
34
  import { IconRaw, IconRawProps } from "./data-display/icons/icon-raw/IconRaw.mjs";
33
35
  import { IconSvg, IconSvgProps } from "./data-display/icons/icon-svg/IconSvg.mjs";
@@ -39,6 +41,7 @@ import { LogoImage, LogoImageProps } from "./data-display/logos/logo-image/LogoI
39
41
  import { LogoSvg, LogoSvgProps } from "./data-display/logos/logo-svg/LogoSvg.mjs";
40
42
  import { NotificationBanner, NotificationBannerIntent, NotificationBannerProps } from "./data-display/notification-banner/NotificationBanner.mjs";
41
43
  import { RemovableItem, RemovableItemProps } from "./data-display/removable-item/RemovableItem.mjs";
44
+ import { ResourceItem, ResourceItemProps } from "./data-display/resource-item/ResourceItem.mjs";
42
45
  import { Tag, TagProps } from "./data-display/tag/Tag.mjs";
43
46
  import { TagGroup, TagGroupProps } from "./data-display/tag-group/TagGroup.mjs";
44
47
  import { UploadedFile, UploadedFileProps } from "./data-display/uploaded-file/UploadedFile.mjs";
package/dist/index.d.mts CHANGED
@@ -28,6 +28,8 @@ import { DataTableFeedback } from "./components/data-display/datatables/DataTabl
28
28
  import { DataTableTopSlot, DataTableTopSlotProps } from "./components/data-display/datatables/DataTableTopSlot.mjs";
29
29
  import { ColumnDef, ExpandedState, PaginationState, RowSelectionState, SortingState } from "./components/data-display/datatables/index.mjs";
30
30
  import { DescriptionList, DescriptionListClassNames, DescriptionListItemProps, DescriptionListProps } from "./components/data-display/description-list/DescriptionList.mjs";
31
+ import { FileIcon, FileIconProps } from "./components/data-display/file-icon/FileIcon.mjs";
32
+ import { DocumentItem, DocumentItemProps } from "./components/data-display/document-item/DocumentItem.mjs";
31
33
  import { Icon, IconProps } from "./components/data-display/icons/icon/Icon.mjs";
32
34
  import { IconRaw, IconRawProps } from "./components/data-display/icons/icon-raw/IconRaw.mjs";
33
35
  import { IconSvg, IconSvgProps } from "./components/data-display/icons/icon-svg/IconSvg.mjs";
@@ -39,6 +41,7 @@ import { LogoImage, LogoImageProps } from "./components/data-display/logos/logo-
39
41
  import { LogoSvg, LogoSvgProps } from "./components/data-display/logos/logo-svg/LogoSvg.mjs";
40
42
  import { NotificationBanner, NotificationBannerIntent, NotificationBannerProps } from "./components/data-display/notification-banner/NotificationBanner.mjs";
41
43
  import { RemovableItem, RemovableItemProps } from "./components/data-display/removable-item/RemovableItem.mjs";
44
+ import { ResourceItem, ResourceItemProps } from "./components/data-display/resource-item/ResourceItem.mjs";
42
45
  import { Tag, TagProps } from "./components/data-display/tag/Tag.mjs";
43
46
  import { TagGroup, TagGroupProps } from "./components/data-display/tag-group/TagGroup.mjs";
44
47
  import { UploadedFile, UploadedFileProps } from "./components/data-display/uploaded-file/UploadedFile.mjs";
@@ -87,4 +90,4 @@ import { Modals } from "./components/overlays/modal/index.mjs";
87
90
  import { Toast, ToastIntent, ToastOptions, ToastProviderProps } from "./components/overlays/toast/Toast.mjs";
88
91
  import { Tooltip, TooltipProps } from "./components/overlays/tooltip/Tooltip.mjs";
89
92
  import { MageUiProvider, MageUiProviderProps } from "./providers/MageUiProvider.mjs";
90
- 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, Dropzone, DropzoneFiles, DropzoneFilesProps, DropzoneProps, DropzoneS3, DropzoneS3Props, DropzoneS3Texts, ExpandedState, FileData, 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, 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, UploadProgress, UploadResponse, UploadedFile, UploadedFileDetails, UploadedFileDetailsProps, UploadedFileProps, Uploader, UploadingFiles, UploadingFilesClassNames, UploadingFilesItemClassNames, UploadingFilesItemErrorClassNames, UploadingFilesItemErrorProps, UploadingFilesItemProps, UploadingFilesProps, Virtual, VirtualItem, VirtualPadding, VirtualProps, VisuallyHidden, VisuallyHiddenProps, getFileExtension, useDataTableContext, usePasswordRules, z };
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, DropzoneFiles, DropzoneFilesProps, 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, UploadProgress, UploadResponse, UploadedFile, UploadedFileDetails, UploadedFileDetailsProps, UploadedFileProps, Uploader, 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{IconSvg as j}from"./components/data-display/icons/icon-svg/IconSvg.mjs";import{Indicator as M}from"./components/data-display/indicator/Indicator.mjs";import{LoaderDot as N}from"./components/data-display/loader-dot/LoaderDot.mjs";import{LoaderOval as P}from"./components/data-display/loader-oval/LoaderOval.mjs";import{LogoImage as F}from"./components/data-display/logos/logo-image/LogoImage.mjs";import{LogoSvg as I}from"./components/data-display/logos/logo-svg/LogoSvg.mjs";import{NotificationBanner as L}from"./components/data-display/notification-banner/NotificationBanner.mjs";import{RemovableItem as R}from"./components/data-display/removable-item/RemovableItem.mjs";import{TagGroup as z}from"./components/data-display/tag-group/TagGroup.mjs";import{Tag as B}from"./components/data-display/tag/Tag.mjs";import{UploadedFile as V}from"./components/data-display/uploaded-file/UploadedFile.mjs";import{UploadedFileDetails as H}from"./components/data-display/uploaded-file/UploadedFileDetails.mjs";import{UploadingFiles as U}from"./components/data-display/uploading-files/UploadingFiles.mjs";import{ButtonIcon as W}from"./components/buttons/button-icon/ButtonIcon.mjs";import{ButtonIconVisual as G}from"./components/buttons/button-icon-visual/ButtonIconVisual.mjs";import{ButtonVisual as K}from"./components/buttons/button-visual/ButtonVisual.mjs";import{AvatarDropzone as q}from"./components/controls/avatar-dropzone/AvatarDropzone.mjs";import{Modal as J}from"./components/overlays/modal/Modal.mjs";import{Modals as Y}from"./components/overlays/modal/index.mjs";import{Toast as X}from"./components/overlays/toast/Toast.mjs";import{AvatarUpload as Z}from"./components/controls/avatar-upload/AvatarUpload.mjs";import{DatePicker as Q}from"./components/controls/date-picker/DatePicker.mjs";import{Autocomplete as $}from"./components/controls/dropdown/autocomplete/Autocomplete.mjs";import{Combobox as ee}from"./components/controls/dropdown/combobox/Combobox.mjs";import{Dropzone as te}from"./components/controls/dropzone/Dropzone.mjs";import{DropzoneS3 as ne,getFileExtension as re}from"./components/controls/dropzone-s3/DropzoneS3.mjs";import{DropzoneFiles as ie}from"./components/controls/dropzone-files/DropzoneFiles.mjs";import{FileInput as ae}from"./components/controls/file-input/FileInput.mjs";import{FileInputMultiple as oe}from"./components/controls/file-input/FileInputMultiple.mjs";import{PasswordInput as se}from"./components/controls/password-input/PasswordInput.mjs";import{PasswordStrengthInput as ce}from"./components/controls/password-input/PasswordStrengthInput.mjs";import{usePasswordRules as le}from"./components/controls/password-input/usePasswordRules.mjs";import{Radio as ue}from"./components/controls/radio/Radio.mjs";import{SwitchGroup as de}from"./components/controls/switch-group/SwitchGroup.mjs";import{Switch as fe}from"./components/controls/switch/Switch.mjs";import{Textarea as pe}from"./components/controls/textarea/Textarea.mjs";import{PASSWORD_RULES as me}from"./components/forms/rules/password-rules.mjs";import{z as he}from"./components/forms/rules/zod.mjs";import{Form as ge}from"./components/forms/Form.mjs";import{Card as _e,CardBase as ve,CardBody as ye,CardFooter as be,CardHeader as xe,CardRoot as Se}from"./components/layouts/card/Card.mjs";import{FluidGrid as Ce}from"./components/layouts/fluid-grid/FluidGrid.mjs";import{Grid as we}from"./components/layouts/grid/Grid.mjs";import{Breadcrumbs as Te}from"./components/navigations/breadcrumbs/Breadcrumbs.mjs";import{Menu as Ee}from"./components/navigations/menu/Menu.mjs";import{NavigationMenu as De}from"./components/navigations/navigation-menu/NavigationMenu.mjs";import{Sidebar as Oe}from"./components/navigations/sidebars/sidebar/Sidebar.mjs";import{MageUiProvider as ke}from"./providers/MageUiProvider.mjs";export{i as AssignedUser,$ as Autocomplete,a as Avatar,q as AvatarDropzone,Z as AvatarUpload,o as Badge,Te as Breadcrumbs,e as Button,n as ButtonAction,W as ButtonIcon,G as ButtonIconVisual,r as ButtonLoader,K as ButtonVisual,c as Calendar,_e as Card,ve as CardBase,ye as CardBody,be as CardFooter,xe as CardHeader,Se as CardRoot,_ as Checkbox,ee 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,Q as DatePicker,A as DescriptionList,te as Dropzone,ie as DropzoneFiles,ne as DropzoneS3,ae as FileInput,oe as FileInputMultiple,Ce as FluidGrid,ge as Form,we as Grid,y as HorizontalDivider,p as Icon,f as IconRaw,j as IconSvg,S as IconWrapped,M as Indicator,N as LoaderDot,P as LoaderOval,F as LogoImage,I as LogoSvg,ke as MageUiProvider,Ee as Menu,J as Modal,Y as Modals,De as NavigationMenu,L as NotificationBanner,me as PASSWORD_RULES,T as Pagination,se as PasswordInput,ce as PasswordStrengthInput,ue as Radio,R as RemovableItem,u as ScrollArea,b as ScrollAreaAutosize,C as Select,Oe as Sidebar,fe as Switch,de as SwitchGroup,d as Table,B as Tag,z as TagGroup,x as TextInput,pe as Textarea,X as Toast,s as Tooltip,V as UploadedFile,H as UploadedFileDetails,U as UploadingFiles,l as Virtual,t as VisuallyHidden,re as getFileExtension,g as useDataTableContext,le as usePasswordRules,he 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{UploadingFiles as K}from"./components/data-display/uploading-files/UploadingFiles.mjs";import{ButtonIcon as q}from"./components/buttons/button-icon/ButtonIcon.mjs";import{ButtonIconVisual as J}from"./components/buttons/button-icon-visual/ButtonIconVisual.mjs";import{ButtonVisual as Y}from"./components/buttons/button-visual/ButtonVisual.mjs";import{AvatarDropzone as X}from"./components/controls/avatar-dropzone/AvatarDropzone.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{Dropzone as ie}from"./components/controls/dropzone/Dropzone.mjs";import{DropzoneS3 as ae,getFileExtension as oe}from"./components/controls/dropzone-s3/DropzoneS3.mjs";import{DropzoneFiles as se}from"./components/controls/dropzone-files/DropzoneFiles.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,ne as Autocomplete,a as Avatar,X as AvatarDropzone,ee as AvatarUpload,o as Badge,Oe as Breadcrumbs,e as Button,n as ButtonAction,q as ButtonIcon,J as ButtonIconVisual,r as ButtonLoader,Y 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,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,ie as Dropzone,se as DropzoneFiles,ae 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,Z as Modal,Q 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,$ as Toast,s as Tooltip,W as UploadedFile,G as UploadedFileDetails,K as UploadingFiles,l as Virtual,t as VisuallyHidden,oe as getFileExtension,g as useDataTableContext,fe as usePasswordRules,ve as z};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mage-ui/components",
3
- "version": "1.0.126",
3
+ "version": "1.0.128",
4
4
  "private": false,
5
5
  "description": "",
6
6
  "keywords": [],
@@ -25,8 +25,8 @@
25
25
  "rimraf": "^6.1.3",
26
26
  "tsdown": "^0.21.4",
27
27
  "typescript": "^5.9.3",
28
- "@mage-ui/preset": "1.0.126",
29
- "@mage-ui/styled-system": "1.0.8"
28
+ "@mage-ui/styled-system": "1.0.8",
29
+ "@mage-ui/preset": "1.0.128"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "@dnd-kit/core": "^6.3.1",
@@ -1,2 +0,0 @@
1
- import{Icon as e}from"../icons/icon/Icon.mjs";import{IconWrapped as t}from"../icons/icon-wrapped/IconWrapped.mjs";import{uploadedFileStartIcon as n,uploadedFileStartIconIconRaw as r,uploadedFileStartIconIconRawRoot as i,uploadedFileStartIconRoot as a,uploadedFileStartIconWrapped as o,uploadedFileStartIconWrappedRoot as s}from"@mage-ui/styled-system/recipes";import{jsx as c}from"react/jsx-runtime";const l=[{match:e=>e.startsWith(`image/`),type:`image`},{match:e=>e.startsWith(`video/`),type:`video`},{match:e=>e.startsWith(`audio/`),type:`audio`},{match:e=>e===`application/pdf`,type:`pdf`},{match:e=>e.startsWith(`text/`),type:`text`},{match:e=>[`application/zip`,`application/x-zip-compressed`,`application/x-rar-compressed`,`application/x-7z-compressed`].includes(e),type:`archive`}],u={png:`image`,jpg:`image`,jpeg:`image`,webp:`image`,gif:`image`,mp4:`video`,mov:`video`,webm:`video`,mp3:`audio`,wav:`audio`,txt:`text`,md:`text`,csv:`text`,pdf:`pdf`,zip:`archive`,rar:`archive`,"7z":`archive`},d={image:`mage-uploaded-file-image`,video:`mage-uploaded-file-video`,audio:`mage-uploaded-file-audio`,text:`mage-uploaded-file-text`,pdf:`mage-uploaded-file-pdf`,archive:`mage-uploaded-file-archive`,default:`mage-uploaded-file-attachment`},f=(e,t)=>{if(e){let t=l.find(({match:t})=>t(e));if(t)return d[t.type]}if(t){let e=t.split(`.`).pop()?.toLowerCase();if(e&&u[e])return d[u[e]]}return d.default},p=({fileType:l,fileName:u,classNames:d})=>{let p=f(l,u);return c(t,{classNames:{iconWrapped:d?.startIconWrapped?.iconWrapped??o(),root:d?.startIconWrapped?.root??s()},children:c(e,{name:p,path:`/icons/sprite-mage.svg`,classNames:{icon:d?.startIcon?.icon??n(),root:d?.startIcon?.root??a(),iconRaw:{iconRaw:d?.startIcon?.iconRaw?.iconRaw??r(),root:d?.startIcon?.iconRaw?.root??i()}}})})};export{p as UploadedFileIcon};
2
- //# sourceMappingURL=UploadedFileIcon.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"UploadedFileIcon.mjs","names":[],"sources":["../../../../src/components/data-display/uploaded-file/UploadedFileIcon.tsx"],"sourcesContent":["import {\n uploadedFileStartIcon,\n uploadedFileStartIconIconRaw,\n uploadedFileStartIconIconRawRoot,\n uploadedFileStartIconRoot,\n uploadedFileStartIconWrapped,\n uploadedFileStartIconWrappedRoot,\n} from '@mage-ui/styled-system/recipes';\nimport {\n Icon,\n type IconProps,\n IconWrapped,\n type IconWrappedProps,\n} from '@/components/data-display';\n\ntype FileIconType =\n | 'image'\n | 'video'\n | 'audio'\n | 'text'\n | 'pdf'\n | 'archive'\n | 'default';\n\nconst MIME_ICON_MAP: Array<{\n match: (mime: string) => boolean;\n type: FileIconType;\n}> = [\n { match: (m) => m.startsWith('image/'), type: 'image' },\n { match: (m) => m.startsWith('video/'), type: 'video' },\n { match: (m) => m.startsWith('audio/'), type: 'audio' },\n { match: (m) => m === 'application/pdf', type: 'pdf' },\n { match: (m) => m.startsWith('text/'), type: 'text' },\n {\n match: (m) =>\n [\n 'application/zip',\n 'application/x-zip-compressed',\n 'application/x-rar-compressed',\n 'application/x-7z-compressed',\n ].includes(m),\n type: 'archive',\n },\n];\n\nconst EXTENSION_ICON_MAP: Record<string, FileIconType> = {\n png: 'image',\n jpg: 'image',\n jpeg: 'image',\n webp: 'image',\n gif: 'image',\n mp4: 'video',\n mov: 'video',\n webm: 'video',\n mp3: 'audio',\n wav: 'audio',\n txt: 'text',\n md: 'text',\n csv: 'text',\n pdf: 'pdf',\n zip: 'archive',\n rar: 'archive',\n '7z': 'archive',\n};\n\nconst ICON_NAME_MAP: Record<FileIconType, string> = {\n image: 'mage-uploaded-file-image',\n video: 'mage-uploaded-file-video',\n audio: 'mage-uploaded-file-audio',\n text: 'mage-uploaded-file-text',\n pdf: 'mage-uploaded-file-pdf',\n archive: 'mage-uploaded-file-archive',\n default: 'mage-uploaded-file-attachment',\n};\n\nconst resolveIconName = (fileType?: string, fileName?: string): string => {\n if (fileType) {\n const match = MIME_ICON_MAP.find(({ match }) => match(fileType));\n if (match) return ICON_NAME_MAP[match.type];\n }\n\n if (fileName) {\n const ext = fileName.split('.').pop()?.toLowerCase();\n if (ext && EXTENSION_ICON_MAP[ext]) {\n return ICON_NAME_MAP[EXTENSION_ICON_MAP[ext]];\n }\n }\n\n return ICON_NAME_MAP.default;\n};\n\nexport type UploadedFileIconProps = {\n fileType?: string;\n fileName?: string;\n classNames?: {\n startIconWrapped?: IconWrappedProps['classNames'];\n startIcon?: IconProps['classNames'];\n };\n};\n\nexport const UploadedFileIcon = ({\n fileType,\n fileName,\n classNames,\n}: UploadedFileIconProps) => {\n const iconName = resolveIconName(fileType, fileName);\n\n return (\n <IconWrapped\n classNames={{\n iconWrapped:\n classNames?.startIconWrapped?.iconWrapped ??\n uploadedFileStartIconWrapped(),\n root:\n classNames?.startIconWrapped?.root ??\n uploadedFileStartIconWrappedRoot(),\n }}\n >\n <Icon\n name={iconName}\n path='/icons/sprite-mage.svg'\n classNames={{\n icon: classNames?.startIcon?.icon ?? uploadedFileStartIcon(),\n root: classNames?.startIcon?.root ?? uploadedFileStartIconRoot(),\n iconRaw: {\n iconRaw:\n classNames?.startIcon?.iconRaw?.iconRaw ??\n uploadedFileStartIconIconRaw(),\n root:\n classNames?.startIcon?.iconRaw?.root ??\n uploadedFileStartIconIconRawRoot(),\n },\n }}\n />\n </IconWrapped>\n );\n};\n"],"mappings":"gZAwBA,MAAM,EAGD,CACH,CAAE,MAAQ,GAAM,EAAE,WAAW,SAAS,CAAE,KAAM,QAAS,CACvD,CAAE,MAAQ,GAAM,EAAE,WAAW,SAAS,CAAE,KAAM,QAAS,CACvD,CAAE,MAAQ,GAAM,EAAE,WAAW,SAAS,CAAE,KAAM,QAAS,CACvD,CAAE,MAAQ,GAAM,IAAM,kBAAmB,KAAM,MAAO,CACtD,CAAE,MAAQ,GAAM,EAAE,WAAW,QAAQ,CAAE,KAAM,OAAQ,CACrD,CACE,MAAQ,GACN,CACE,kBACA,+BACA,+BACA,8BACD,CAAC,SAAS,EAAE,CACf,KAAM,UACP,CACF,CAEK,EAAmD,CACvD,IAAK,QACL,IAAK,QACL,KAAM,QACN,KAAM,QACN,IAAK,QACL,IAAK,QACL,IAAK,QACL,KAAM,QACN,IAAK,QACL,IAAK,QACL,IAAK,OACL,GAAI,OACJ,IAAK,OACL,IAAK,MACL,IAAK,UACL,IAAK,UACL,KAAM,UACP,CAEK,EAA8C,CAClD,MAAO,2BACP,MAAO,2BACP,MAAO,2BACP,KAAM,0BACN,IAAK,yBACL,QAAS,6BACT,QAAS,gCACV,CAEK,GAAmB,EAAmB,IAA8B,CACxE,GAAI,EAAU,CACZ,IAAM,EAAQ,EAAc,MAAM,CAAE,WAAY,EAAM,EAAS,CAAC,CAChE,GAAI,EAAO,OAAO,EAAc,EAAM,MAGxC,GAAI,EAAU,CACZ,IAAM,EAAM,EAAS,MAAM,IAAI,CAAC,KAAK,EAAE,aAAa,CACpD,GAAI,GAAO,EAAmB,GAC5B,OAAO,EAAc,EAAmB,IAI5C,OAAO,EAAc,SAYV,GAAoB,CAC/B,WACA,WACA,gBAC2B,CAC3B,IAAM,EAAW,EAAgB,EAAU,EAAS,CAEpD,OACE,EAAC,EAAD,CACE,WAAY,CACV,YACE,GAAY,kBAAkB,aAC9B,GAA8B,CAChC,KACE,GAAY,kBAAkB,MAC9B,GAAkC,CACrC,UAED,EAAC,EAAD,CACE,KAAM,EACN,KAAK,yBACL,WAAY,CACV,KAAM,GAAY,WAAW,MAAQ,GAAuB,CAC5D,KAAM,GAAY,WAAW,MAAQ,GAA2B,CAChE,QAAS,CACP,QACE,GAAY,WAAW,SAAS,SAChC,GAA8B,CAChC,KACE,GAAY,WAAW,SAAS,MAChC,GAAkC,CACrC,CACF,CACD,CAAA,CACU,CAAA"}