@zayne-labs/ui-react 0.11.0 → 0.11.2

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.
@@ -2,8 +2,9 @@
2
2
  import { t as __exportAll } from "../../chunk-pbuEa-1d.js";
3
3
  import { n as SlotRoot } from "../../slot-DuwoiC2C.js";
4
4
  import { n as For } from "../../for-DGTMIS0w.js";
5
- import { t as Presence } from "../../presence-CWOGx-be.js";
6
- import { t as cnMerge } from "../../cn-Bbh2G587.js";
5
+ import { t as Presence } from "../../presence-CHd9s3IS.js";
6
+ import { i as SwitchRoot, r as SwitchMatch } from "../../switch-Dwy5Gzsb.js";
7
+ import { t as cnMerge } from "../../cn-jNZfGhrk.js";
7
8
  import { composeRefs, composeTwoEventHandlers } from "@zayne-labs/toolkit-react/utils";
8
9
  import { isBoolean, isFile, isFunction, isNumber, isObject, isString } from "@zayne-labs/toolkit-type-helpers";
9
10
  import { useCallback, useMemo, useRef } from "react";
@@ -592,7 +593,7 @@ const useDropZone = (props) => {
592
593
  ...getDropZoneScopeAttrs("file-item-progress"),
593
594
  role: "progressbar",
594
595
  ...restOfInnerProps,
595
- ...!unstyled && { className: cnMerge("inline-flex", variant === "circular" && "absolute top-1/2 left-1/2 -translate-1/2", variant === "fill" && `absolute inset-0 bg-zu-primary/50 transition-[clip-path] duration-300 ease-linear [clip-path:var(--clip-path)]`, variant === "linear" && "relative h-1.5 w-full overflow-hidden rounded-full bg-zu-primary/20", restOfInnerProps.className) }
596
+ ...!unstyled && { className: cnMerge("inline-flex", variant === "circular" && "absolute top-1/2 left-1/2 -translate-1/2", variant === "fill" && `absolute inset-0`, variant === "linear" && "relative h-1.5 w-full overflow-hidden rounded-full bg-zu-primary/20", restOfInnerProps.className) }
596
597
  };
597
598
  }, [globalUnstyled]);
598
599
  const getFileItemDeleteProps = useCallback((innerProps) => {
@@ -803,72 +804,74 @@ function DropZoneFileItemDelete(props) {
803
804
  }) });
804
805
  }
805
806
  function DropZoneFileItemProgress(props) {
806
- const { as: Element = "span", asChild, className, classNames, forceMount = false, size = 40, variant = "linear", ...restOfProps } = props;
807
+ const { as: Element = "span", asChild, className, classNames: classNamesProp, forceMount = false, size = 40, variant = "linear", ...restOfProps } = props;
808
+ const classNames = classNamesProp;
807
809
  const fileState = useFileItemContext()?.fileState;
808
810
  const { propGetters } = useDropZoneRootContext();
809
811
  if (!fileState) return null;
810
- const currentProgress = fileState.progress;
811
- if (!(forceMount || fileState.progress !== 100)) return null;
812
812
  const Component = asChild ? SlotRoot : Element;
813
813
  const componentProps = propGetters.getFileItemProgressProps({
814
814
  variant,
815
815
  ...restOfProps
816
816
  });
817
- switch (variant) {
818
- case "circular": {
819
- const circumference = 2 * Math.PI * ((size - 4) / 2);
820
- const strokeDashoffset = circumference - currentProgress / 100 * circumference;
821
- return /* @__PURE__ */ jsx(Component, {
822
- className: cnMerge(className, classNames?.circular?.root),
823
- ...componentProps,
824
- children: /* @__PURE__ */ jsxs("svg", {
825
- className: cnMerge("-rotate-90", classNames?.circular?.svgRoot),
826
- width: size,
827
- height: size,
828
- viewBox: `0 0 ${size} ${size}`,
829
- fill: "none",
830
- stroke: "currentColor",
831
- children: [/* @__PURE__ */ jsx("circle", {
832
- className: cnMerge("text-zu-primary/20", classNames?.circular?.svgCircleOne),
833
- strokeWidth: "2",
834
- cx: size / 2,
835
- cy: size / 2,
836
- r: (size - 4) / 2
837
- }), /* @__PURE__ */ jsx("circle", {
838
- className: cnMerge("text-zu-primary transition-[stroke-dashoffset] duration-300 ease-linear", classNames?.circular?.svgCircleTwo),
839
- strokeWidth: "2",
840
- strokeLinecap: "round",
841
- strokeDasharray: circumference,
842
- strokeDashoffset,
843
- cx: size / 2,
844
- cy: size / 2,
845
- r: (size - 4) / 2
846
- })]
847
- })
848
- });
849
- }
850
- case "fill": {
851
- const topInset = 100 - currentProgress;
852
- return /* @__PURE__ */ jsx(Component, {
853
- className,
854
- ...componentProps,
855
- style: {
856
- "--clip-path": `inset(${topInset}% 0% 0% 0%)`,
857
- ...componentProps.style
858
- }
859
- });
860
- }
861
- case "linear": return /* @__PURE__ */ jsx(Component, {
862
- className: cnMerge("inline-block size-full grow translate-x-(--translate-distance) bg-zu-primary transition-transform duration-300 ease-linear", className),
817
+ return /* @__PURE__ */ jsx(Presence, {
818
+ present: fileState.progress !== 100,
819
+ forceMount,
820
+ className: "data-[animation-phase=exit]:animate-progress-out",
821
+ children: /* @__PURE__ */ jsx(Component, {
822
+ className: cnMerge("inline-block", className),
863
823
  ...componentProps,
864
- style: {
865
- "--translate-distance": `-${100 - currentProgress}%`,
866
- ...componentProps.style
867
- },
868
- children: /* @__PURE__ */ jsx("span", {})
869
- });
870
- default: return null;
871
- }
824
+ children: /* @__PURE__ */ jsxs(SwitchRoot, { children: [
825
+ /* @__PURE__ */ jsx(SwitchMatch, {
826
+ when: variant === "circular",
827
+ children: () => {
828
+ const circumference = 2 * Math.PI * ((size - 4) / 2);
829
+ const strokeDashoffset = circumference - fileState.progress / 100 * circumference;
830
+ return /* @__PURE__ */ jsxs("svg", {
831
+ className: cnMerge("-rotate-90", classNames?.svgRoot),
832
+ width: size,
833
+ height: size,
834
+ viewBox: `0 0 ${size} ${size}`,
835
+ fill: "none",
836
+ stroke: "currentColor",
837
+ children: [/* @__PURE__ */ jsx("circle", {
838
+ className: cnMerge("text-zu-primary/20", classNames?.svgCircleOne),
839
+ strokeWidth: "2",
840
+ cx: size / 2,
841
+ cy: size / 2,
842
+ r: (size - 4) / 2
843
+ }), /* @__PURE__ */ jsx("circle", {
844
+ className: cnMerge("text-zu-primary transition-[stroke-dashoffset] duration-300 ease-linear", classNames?.svgCircleTwo),
845
+ strokeWidth: "2",
846
+ strokeLinecap: "round",
847
+ strokeDasharray: 2 * Math.PI * ((size - 4) / 2),
848
+ strokeDashoffset,
849
+ cx: size / 2,
850
+ cy: size / 2,
851
+ r: (size - 4) / 2
852
+ })]
853
+ });
854
+ }
855
+ }),
856
+ /* @__PURE__ */ jsx(SwitchMatch, {
857
+ when: variant === "fill",
858
+ children: /* @__PURE__ */ jsx("span", {
859
+ className: cnMerge(`size-full bg-zu-primary/50 transition-[clip-path] duration-300 ease-linear
860
+ [clip-path:var(--clip-path)]`, classNames?.track),
861
+ style: { "--clip-path": `inset(${100 - fileState.progress}% 0% 0% 0%)` }
862
+ })
863
+ }),
864
+ /* @__PURE__ */ jsx(SwitchMatch, {
865
+ when: variant === "linear",
866
+ children: /* @__PURE__ */ jsx("span", {
867
+ className: cnMerge(`inline-block size-full grow translate-x-(--translate-distance) bg-zu-primary
868
+ transition-transform duration-300 ease-linear`, classNames?.track),
869
+ style: { "--translate-distance": `-${100 - fileState.progress}%` }
870
+ })
871
+ })
872
+ ] })
873
+ })
874
+ });
872
875
  }
873
876
  function DropZoneFileItemPreview(props) {
874
877
  const { as: Element = "span", asChild, children, fileState: fileStateProp, renderPreview = true, ...restOfProps } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["generateFileID","generateFileIDPrimitive","generateFileID","Slot.Root"],"sources":["../../../../src/components/ui/drop-zone/drop-zone-context.ts","../../../../src/components/ui/drop-zone/icons.tsx","../../../../src/components/ui/drop-zone/utils.ts","../../../../src/components/ui/drop-zone/drop-zone-store.ts","../../../../src/components/ui/drop-zone/use-drop-zone.ts","../../../../src/components/ui/drop-zone/drop-zone.tsx","../../../../src/components/ui/drop-zone/drop-zone-parts.ts"],"sourcesContent":["import { createCustomContext } from \"@zayne-labs/toolkit-react\";\nimport { createReactStoreContext } from \"@zayne-labs/toolkit-react/zustand\";\nimport type { DropZoneStore, FileState, UseDropZoneResult } from \"./types\";\n\nconst [DropZoneStoreContextProvider, useDropZoneStoreContext] = createReactStoreContext<DropZoneStore>({\n\thookName: \"useDropZoneStoreContext\",\n\tname: \"DropZoneStoreContext\",\n\tproviderName: \"DropZoneRoot\",\n});\n\nexport type DropZoneRootContextType = Pick<\n\tUseDropZoneResult,\n\t\"disabled\" | \"disableInternalStateSubscription\" | \"inputRef\" | \"propGetters\"\n>;\n\nconst [DropZoneRootContextProvider, useDropZoneRootContext] = createCustomContext<DropZoneRootContextType>(\n\t{\n\t\thookName: \"useDropZoneRootContext\",\n\t\tname: \"DropZoneRootContext\",\n\t\tproviderName: \"DropZoneRoot\",\n\t}\n);\n\nexport type FileItemContextType = {\n\tfileState: FileState;\n};\n\nconst [FileItemContextProvider, useFileItemContext] = createCustomContext({\n\tdefaultValue: null as unknown as FileItemContextType,\n\thookName: \"useFileItemContext\",\n\tname: \"FileItemContext\",\n\tproviderName: \"FileItem\",\n\tstrict: false,\n});\n\nexport {\n\tDropZoneRootContextProvider,\n\tDropZoneStoreContextProvider,\n\tFileItemContextProvider,\n\tuseDropZoneRootContext,\n\tuseDropZoneStoreContext,\n\tuseFileItemContext,\n};\n","export const FileVideoIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n\t\t\t<path d=\"M14 2v4a2 2 0 0 0 2 2h4m-10 3l5 3l-5 3z\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileAudioIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M17.5 22h.5a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3\" />\n\t\t\t<path d=\"M14 2v4a2 2 0 0 0 2 2h4M2 19a2 2 0 1 1 4 0v1a2 2 0 1 1-4 0v-4a6 6 0 0 1 12 0v4a2 2 0 1 1-4 0v-1a2 2 0 1 1 4 0\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileTextIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n\t\t\t<path d=\"M14 2v4a2 2 0 0 0 2 2h4M10 9H8m8 4H8m8 4H8\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileCodeIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M10 12.5L8 15l2 2.5m4-5l2 2.5l-2 2.5M14 2v4a2 2 0 0 0 2 2h4\" />\n\t\t\t<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileArchiveIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M10 12v-1m0 7v-2m0-9V6m4-4v4a2 2 0 0 0 2 2h4\" />\n\t\t\t<path d=\"M15.5 22H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v16a2 2 0 0 0 .274 1.01\" />\n\t\t\t<circle cx=\"10\" cy=\"20\" r=\"2\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileCogIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M14 2v4a2 2 0 0 0 2 2h4M3.2 12.9l-.9-.4m.9 2.6l-.9.4\" />\n\t\t\t<path d=\"M4.677 21.5a2 2 0 0 0 1.313.5H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v2.5m.9 4.7l-.4-.9m.4 6.5l-.4.9m3-7.4l-.4.9m.4 6.5l-.4-.9m2.6-4.3l-.9.4m.9 2.6l-.9-.4\" />\n\t\t\t<circle cx=\"6\" cy=\"14\" r=\"3\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n\t\t\t<path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n\t\t</g>\n\t</svg>\n);\n","import {\n\tcreateFileURL,\n\tgenerateFileID as generateFileIDPrimitive,\n\ttype FileOrFileMeta,\n\ttype FileValidationErrorContextEach,\n} from \"@zayne-labs/toolkit-core\";\nimport { isFile, isObject, isString } from \"@zayne-labs/toolkit-type-helpers\";\nimport type { FileState, FileStateOrIDProp, PartProps } from \"./types\";\n\nexport const generateFileID = generateFileIDPrimitive;\n\nexport const createObjectURL = (\n\tfile: FileOrFileMeta,\n\tdisallowPreviewForNonImageFiles: boolean | undefined\n) => {\n\tif (disallowPreviewForNonImageFiles && !file.type?.startsWith(\"image/\")) return;\n\n\treturn createFileURL(file);\n};\n\nexport const clearObjectURL = (\n\tfileState: FileState | undefined,\n\tdisallowPreviewForNonImageFiles: boolean | undefined\n) => {\n\tif (!isFile(fileState?.file)) return;\n\n\tif (disallowPreviewForNonImageFiles && !fileState.file.type.startsWith(\"image/\")) return;\n\n\tif (!fileState.preview) return;\n\n\tURL.revokeObjectURL(fileState.preview);\n};\n\nexport const isMatchingFile = (\n\toptions: FileStateOrIDProp & {\n\t\tfileState: FileOrFileMeta | FileState;\n\t}\n) => {\n\tconst { fileState, fileStateOrID } = options;\n\n\tconst fileID = isFile(fileState) ? generateFileID(fileState) : fileState.id;\n\n\tif (isString(fileStateOrID)) {\n\t\treturn fileID === fileStateOrID;\n\t}\n\n\tif (isFile(fileStateOrID)) {\n\t\tconst generatedFileID = generateFileID(fileStateOrID);\n\t\treturn fileID === generatedFileID;\n\t}\n\n\treturn fileID === fileStateOrID.id;\n};\n\ntype FromCamelToKebabCase<TString extends string> =\n\tTString extends `${infer First}${infer Rest}` ?\n\t\tFirst extends Uppercase<First> ?\n\t\t\t`-${Lowercase<First>}${FromCamelToKebabCase<Rest>}`\n\t\t:\t`${First}${FromCamelToKebabCase<Rest>}`\n\t:\t\"\";\n\nexport const getDropZoneScopeAttrs = (part: FromCamelToKebabCase<keyof PartProps>) => {\n\treturn {\n\t\t/* eslint-disable perfectionist/sort-objects -- I need this order to be maintained */\n\t\t\"data-slot\": `dropzone-${part}`,\n\t\t\"data-scope\": \"dropzone\",\n\t\t\"data-part\": part,\n\t\t/* eslint-enable perfectionist/sort-objects -- I need this order to be maintained */\n\t} as const;\n};\n\nconst dropZoneErrorSymbol = Symbol(\"DropZoneError\");\n\nexport class DropZoneError extends Error {\n\treadonly dropZoneErrorSymbol = dropZoneErrorSymbol;\n\tfile?: FileValidationErrorContextEach[\"file\"];\n\toverride name = \"DropZoneError\" as const;\n\n\tconstructor(\n\t\tctx: Pick<FileValidationErrorContextEach, \"message\"> & {\n\t\t\tfile?: FileValidationErrorContextEach[\"file\"];\n\t\t},\n\t\terrorOptions?: ErrorOptions\n\t) {\n\t\tconst { file, message } = ctx;\n\n\t\tsuper(message, errorOptions);\n\n\t\tthis.file = file;\n\t}\n\n\tstatic override isError(error: unknown): error is DropZoneError {\n\t\tif (!isObject<DropZoneError>(error)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (error instanceof DropZoneError) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst actualError = error as DropZoneError;\n\n\t\treturn (\n\t\t\tactualError.dropZoneErrorSymbol === dropZoneErrorSymbol\n\t\t\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Allow\n\t\t\t&& actualError.name === \"DropZoneError\"\n\t\t);\n\t}\n}\n\nexport const getErrorContext = (error: DropZoneError | Error): NonNullable<FileState[\"error\"]> => {\n\tif (DropZoneError.isError(error)) {\n\t\treturn {\n\t\t\tcause: \"custom-error\",\n\t\t\tcode: \"upload-error\",\n\t\t\tfile: error.file ?? ({} as never),\n\t\t\tmessage: error.message,\n\t\t\toriginalError: error.cause ?? error,\n\t\t};\n\t}\n\n\tconst actualError = Error.isError(error) ? error : new Error(\"File upload failed\", { cause: error });\n\n\treturn {\n\t\tcause: \"custom-error\",\n\t\tcode: \"upload-error\",\n\t\tfile: isFile(actualError.cause) ? actualError.cause : ({} as never),\n\t\tmessage: Error.isError(error) ? actualError.message : String(actualError),\n\t\toriginalError: actualError,\n\t};\n};\n","import { createStore, handleFileValidationAsync, toArray } from \"@zayne-labs/toolkit-core\";\nimport type { DropZoneState, DropZoneStore, UseDropZoneProps } from \"./types\";\nimport { clearObjectURL, createObjectURL, generateFileID, getErrorContext, isMatchingFile } from \"./utils\";\n\ntype RequiredUseDropZoneProps = {\n\t[Key in keyof Required<UseDropZoneProps>]: UseDropZoneProps[Key] | undefined;\n};\n\ntype StoreContext = Pick<\n\tRequiredUseDropZoneProps,\n\t| \"allowedFileTypes\"\n\t| \"disablePreviewGenForNonImageFiles\"\n\t| \"initialFiles\"\n\t| \"maxFileCount\"\n\t| \"maxFileSize\"\n\t| \"multiple\"\n\t| \"onFilesChange\"\n\t| \"onUpload\"\n\t| \"onValidationError\"\n\t| \"onValidationSuccess\"\n\t| \"rejectDuplicateFiles\"\n\t| \"validator\"\n>;\n\nexport const createDropZoneStore = (storeContext: StoreContext) => {\n\tconst {\n\t\tallowedFileTypes,\n\t\tdisablePreviewGenForNonImageFiles,\n\t\tinitialFiles,\n\t\tmaxFileCount,\n\t\tmaxFileSize,\n\t\tmultiple,\n\t\tonFilesChange,\n\t\tonUpload,\n\t\tonValidationError,\n\t\tonValidationSuccess,\n\t\trejectDuplicateFiles,\n\t\tvalidator,\n\t} = storeContext;\n\n\tconst inputRef: React.RefObject<HTMLInputElement | null> = { current: null };\n\n\tconst initialFileArray = toArray(initialFiles).filter(Boolean);\n\n\tconst clearInputValue = () => {\n\t\tif (!inputRef.current) return;\n\n\t\tinputRef.current.value = \"\";\n\t};\n\n\tconst initFileStateArray: DropZoneState[\"fileStateArray\"] = initialFileArray.map((fileMeta) => ({\n\t\tfile: fileMeta,\n\t\tid: fileMeta.id,\n\t\tpreview: fileMeta.url,\n\t\tprogress: 0,\n\t\tstatus: \"idle\",\n\t}));\n\n\tconst store = createStore<DropZoneStore>((set, get) => ({\n\t\tdisabled: false,\n\t\terrors: [],\n\t\tfileStateArray: initFileStateArray,\n\t\tisDraggingOver: false,\n\t\tisInvalid: false,\n\n\t\t// eslint-disable-next-line perfectionist/sort-objects -- ignore\n\t\tactions: {\n\t\t\taddFiles: async (files) => {\n\t\t\t\tif (!files || files.length === 0) {\n\t\t\t\t\tconsole.warn(\"No file selected!\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst { actions, fileStateArray: existingFileStateArray } = get();\n\n\t\t\t\t// == In single file mode, only use the first file\n\t\t\t\tconst resolvedNewFiles = !multiple ? [files[0]] : files;\n\n\t\t\t\tconst { errors, validFiles } = await handleFileValidationAsync({\n\t\t\t\t\texistingFiles: existingFileStateArray.map((fileWithPreview) => fileWithPreview.file),\n\t\t\t\t\thooks: {\n\t\t\t\t\t\tonErrorEach: onValidationError,\n\t\t\t\t\t\tonSuccessBatch: onValidationSuccess,\n\t\t\t\t\t},\n\t\t\t\t\tnewFiles: resolvedNewFiles,\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\tallowedFileTypes,\n\t\t\t\t\t\tmaxFileCount,\n\t\t\t\t\t\tmaxFileSize,\n\t\t\t\t\t\trejectDuplicateFiles,\n\t\t\t\t\t\tvalidator,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tif (validFiles.length === 0) {\n\t\t\t\t\tset({ errors, isDraggingOver: false });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst newFileStateArray: DropZoneState[\"fileStateArray\"] = validFiles.map((file) => ({\n\t\t\t\t\tfile,\n\t\t\t\t\tid: generateFileID(file),\n\t\t\t\t\tpreview: createObjectURL(file, disablePreviewGenForNonImageFiles),\n\t\t\t\t\tprogress: 0,\n\t\t\t\t\tstatus: \"idle\",\n\t\t\t\t}));\n\n\t\t\t\tconst resolvedFileStateArray =\n\t\t\t\t\t!multiple ? newFileStateArray : [...existingFileStateArray, ...newFileStateArray];\n\n\t\t\t\tset(\n\t\t\t\t\t{\n\t\t\t\t\t\terrors,\n\t\t\t\t\t\tfileStateArray: resolvedFileStateArray,\n\t\t\t\t\t\tisDraggingOver: false,\n\t\t\t\t\t},\n\t\t\t\t\t{ shouldNotifySync: true }\n\t\t\t\t);\n\n\t\t\t\tawait actions.handleFileUpload({ newFileStateArray });\n\t\t\t},\n\t\t\tclearErrors: () => {\n\t\t\t\tset({ errors: [], isInvalid: false });\n\t\t\t},\n\n\t\t\tclearFiles: () => {\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tactions.clearObjectURLs();\n\n\t\t\t\tset({ errors: [], fileStateArray: [], isInvalid: false });\n\t\t\t},\n\n\t\t\tclearObjectURLs: () => {\n\t\t\t\tconst { fileStateArray } = get();\n\n\t\t\t\tfor (const fileState of fileStateArray) {\n\t\t\t\t\tclearObjectURL(fileState, disablePreviewGenForNonImageFiles);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\thandleChange: async (event) => {\n\t\t\t\tconst fileList = event.target.files;\n\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tawait actions.addFiles(fileList);\n\n\t\t\t\tclearInputValue();\n\t\t\t},\n\n\t\t\thandleDragEnter: (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tset({ isDraggingOver: true });\n\t\t\t},\n\n\t\t\thandleDragLeave: (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tset({ isDraggingOver: false });\n\t\t\t},\n\n\t\t\thandleDragOver: (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t},\n\n\t\t\thandleDrop: async (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tconst fileList = event.dataTransfer.files;\n\n\t\t\t\tawait actions.addFiles(fileList);\n\t\t\t},\n\n\t\t\thandleFileUpload: async (context) => {\n\t\t\t\tconst { newFileStateArray } = context;\n\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tif (!onUpload) {\n\t\t\t\t\tfor (const fileState of newFileStateArray) {\n\t\t\t\t\t\tactions.updateFileState({ fileStateOrID: fileState, progress: 100, status: \"success\" });\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait onUpload({\n\t\t\t\t\t\tfileStateArray: newFileStateArray,\n\t\t\t\t\t\tonError: (ctx) => {\n\t\t\t\t\t\t\tconst { error, fileStateOrID } = ctx;\n\n\t\t\t\t\t\t\tconst errorContext = getErrorContext(error);\n\n\t\t\t\t\t\t\tactions.updateFileState({ error: errorContext, fileStateOrID, status: \"error\" });\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonProgress: (ctx) => {\n\t\t\t\t\t\t\tconst { fileStateOrID, progress } = ctx;\n\n\t\t\t\t\t\t\tactions.updateFileState({ fileStateOrID, progress });\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonSuccess: (ctx) => {\n\t\t\t\t\t\t\tconst { fileStateOrID } = ctx;\n\n\t\t\t\t\t\t\tactions.updateFileState({ fileStateOrID, progress: 100, status: \"success\" });\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\t// == Handle Errors ==\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst errorContext = getErrorContext(error as Error);\n\n\t\t\t\t\tfor (const fileState of newFileStateArray) {\n\t\t\t\t\t\tactions.updateFileState({\n\t\t\t\t\t\t\terror: errorContext,\n\t\t\t\t\t\t\tfileStateOrID: fileState,\n\t\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\thandleKeyDown: (event) => {\n\t\t\t\tconst isEnterKey = event.key === \"Enter\";\n\t\t\t\tconst isSpaceKey = event.key === \" \";\n\n\t\t\t\tconst isAllowedKey = isEnterKey || isSpaceKey;\n\n\t\t\t\tif (!isAllowedKey) return;\n\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tactions.openFilePicker();\n\t\t\t},\n\n\t\t\thandlePaste: async (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tconst fileList = event.clipboardData.files;\n\n\t\t\t\tawait actions.addFiles(fileList);\n\t\t\t},\n\n\t\t\topenFilePicker: () => {\n\t\t\t\tinputRef.current?.click();\n\t\t\t},\n\n\t\t\tremoveFile: (ctx) => {\n\t\t\t\tconst { fileStateOrID } = ctx;\n\n\t\t\t\tconst { fileStateArray } = get();\n\n\t\t\t\tconst updatedFileStateArray = fileStateArray.filter((fileState) => {\n\t\t\t\t\tif (!isMatchingFile({ fileState, fileStateOrID })) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tclearObjectURL(fileState, disablePreviewGenForNonImageFiles);\n\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\n\t\t\t\tset({ errors: [], fileStateArray: updatedFileStateArray });\n\t\t\t},\n\n\t\t\tsetInputRef: (element) => {\n\t\t\t\tinputRef.current = element;\n\t\t\t},\n\n\t\t\tupdateFileState: (ctx) => {\n\t\t\t\tconst { fileStateOrID, ...updatedFileState } = ctx;\n\n\t\t\t\tconst { fileStateArray } = get();\n\n\t\t\t\tconst updatedFileStateArray: DropZoneState[\"fileStateArray\"] = fileStateArray.map(\n\t\t\t\t\t(fileState) => {\n\t\t\t\t\t\tif (!isMatchingFile({ fileState, fileStateOrID })) {\n\t\t\t\t\t\t\treturn fileState;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...fileState,\n\t\t\t\t\t\t\t...updatedFileState,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tset({ fileStateArray: updatedFileStateArray }, { shouldNotifySync: true });\n\t\t\t},\n\t\t},\n\t}));\n\n\t// == File change subscription\n\tstore.subscribe.withSelector(\n\t\t(state) => state.fileStateArray,\n\t\t(fileStateArray) => {\n\t\t\tonFilesChange?.({ fileStateArray });\n\t\t}\n\t);\n\n\t// == Set `isInvalid` to true if there are errors\n\tstore.subscribe.withSelector(\n\t\t(state) => state.errors,\n\t\t(errors) => {\n\t\t\tif (errors.length === 0) return;\n\n\t\t\tstore.setState({ isInvalid: true });\n\n\t\t\t// == Reset to false after 1.5 seconds\n\t\t\tsetTimeout(() => store.setState({ isInvalid: false }), 1500);\n\t\t}\n\t);\n\n\treturn store;\n};\n","import { dataAttr } from \"@zayne-labs/toolkit-core\";\nimport { useCallbackRef, useCompareValue, useStore, useUnmountEffect } from \"@zayne-labs/toolkit-react\";\nimport { composeRefs, composeTwoEventHandlers } from \"@zayne-labs/toolkit-react/utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport { createDropZoneStore } from \"./drop-zone-store\";\nimport type { DropZonePropGetters, UseDropZoneProps, UseDropZoneResult } from \"./types\";\nimport { getDropZoneScopeAttrs } from \"./utils\";\n\nexport const useDropZone = (props?: UseDropZoneProps): UseDropZoneResult => {\n\tconst {\n\t\tallowedFileTypes,\n\t\tdisabled = false,\n\t\tdisableFilePickerOpenOnAreaClick = false,\n\t\tdisableInternalStateSubscription = false,\n\t\tdisablePreviewGenForNonImageFiles = true,\n\t\tinitialFiles,\n\t\tmaxFileCount,\n\t\tmaxFileSize,\n\t\tmultiple,\n\t\tonFilesChange,\n\t\tonUpload,\n\t\tonValidationError,\n\t\tonValidationSuccess,\n\t\trejectDuplicateFiles = true,\n\t\tunstyled: globalUnstyled = false,\n\t\tvalidator,\n\t} = props ?? {};\n\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\n\tconst stableOnFilesChange = useCallbackRef(onFilesChange);\n\tconst stableOnUpload = useCallbackRef(onUpload);\n\tconst stableOnUploadError = useCallbackRef(onValidationError);\n\tconst stableOnUploadSuccess = useCallbackRef(onValidationSuccess);\n\tconst stableValidator = useCallbackRef(validator);\n\n\tconst shallowComparedInitialFiles = useCompareValue(initialFiles);\n\tconst shallowComparedMaxFileSize = useCompareValue(maxFileSize);\n\tconst shallowComparedAllowedFileTypes = useCompareValue(allowedFileTypes);\n\n\tconst storeApi = useMemo(() => {\n\t\treturn createDropZoneStore({\n\t\t\tallowedFileTypes: shallowComparedAllowedFileTypes,\n\t\t\tdisablePreviewGenForNonImageFiles,\n\t\t\tinitialFiles: shallowComparedInitialFiles,\n\t\t\tmaxFileCount,\n\t\t\tmaxFileSize: shallowComparedMaxFileSize,\n\t\t\tmultiple,\n\t\t\tonFilesChange: stableOnFilesChange,\n\t\t\tonUpload: stableOnUpload,\n\t\t\tonValidationError: stableOnUploadError,\n\t\t\tonValidationSuccess: stableOnUploadSuccess,\n\t\t\trejectDuplicateFiles,\n\t\t\tvalidator: stableValidator,\n\t\t});\n\t}, [\n\t\tshallowComparedAllowedFileTypes,\n\t\tdisablePreviewGenForNonImageFiles,\n\t\tshallowComparedInitialFiles,\n\t\tmaxFileCount,\n\t\tshallowComparedMaxFileSize,\n\t\tmultiple,\n\t\tstableOnFilesChange,\n\t\tstableOnUpload,\n\t\tstableOnUploadError,\n\t\tstableOnUploadSuccess,\n\t\trejectDuplicateFiles,\n\t\tstableValidator,\n\t]);\n\n\tconst actions = storeApi.getState().actions;\n\n\tuseUnmountEffect(() => {\n\t\tactions.clearObjectURLs();\n\t});\n\n\t/* eslint-disable react-hooks/hooks -- ignore */\n\t// eslint-disable-next-line react-x/component-hook-factories -- ignore\n\tconst useDropZoneStore: UseDropZoneResult[\"useDropZoneStore\"] = (selector) => {\n\t\treturn useStore(storeApi as never, selector);\n\t};\n\n\tconst isDraggingOver = useDropZoneStore((state) =>\n\t\t!disableInternalStateSubscription ? state.isDraggingOver : null\n\t);\n\n\tconst isInvalid = useDropZoneStore((state) =>\n\t\t!disableInternalStateSubscription ? state.isInvalid : null\n\t);\n\t/* eslint-enable react-hooks/hooks -- ignore */\n\n\tconst getContainerProps: DropZonePropGetters[\"getContainerProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { unstyled = globalUnstyled, ...restOfInnerProps } = innerProps;\n\n\t\t\tconst isDisabled = disabled;\n\t\t\tconst onFileDrop = !isDisabled ? actions.handleDrop : undefined;\n\t\t\tconst onFilePaste = !isDisabled ? actions.handlePaste : undefined;\n\t\t\tconst tabIndex = !isDisabled ? 0 : undefined;\n\t\t\tconst onAreaClick =\n\t\t\t\t!isDisabled && !disableFilePickerOpenOnAreaClick ? actions.openFilePicker : undefined;\n\t\t\tconst onKeyDown =\n\t\t\t\t!isDisabled && !disableFilePickerOpenOnAreaClick ? actions.handleKeyDown : undefined;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"container\"),\n\t\t\t\trole: \"region\",\n\t\t\t\t...(!disableInternalStateSubscription && {\n\t\t\t\t\t\"data-drag-over\": dataAttr(isDraggingOver),\n\t\t\t\t\t\"data-invalid\": dataAttr(isInvalid),\n\t\t\t\t}),\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\n\t\t\t\t\t\t`relative flex flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-6 transition-colors duration-250 ease-out outline-none select-none focus-visible:border-zu-ring/50`,\n\t\t\t\t\t\t`data-disabled:pointer-events-none data-drag-over:opacity-60 data-invalid:border-zu-destructive data-invalid:ring-zu-destructive/20`,\n\t\t\t\t\t\tinnerProps.className\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\t\tonClick: composeTwoEventHandlers(onAreaClick, innerProps.onClick),\n\t\t\t\tonDragEnter: composeTwoEventHandlers(actions.handleDragEnter, innerProps.onDragEnter),\n\t\t\t\tonDragLeave: composeTwoEventHandlers(actions.handleDragLeave, innerProps.onDragLeave),\n\t\t\t\tonDragOver: composeTwoEventHandlers(actions.handleDragOver, innerProps.onDragOver),\n\t\t\t\tonDrop: composeTwoEventHandlers(onFileDrop, innerProps.onDrop),\n\t\t\t\tonKeyDown: composeTwoEventHandlers(onKeyDown, innerProps.onKeyDown),\n\t\t\t\tonPaste: composeTwoEventHandlers(onFilePaste, innerProps.onPaste),\n\t\t\t\ttabIndex,\n\t\t\t};\n\t\t},\n\t\t[\n\t\t\tglobalUnstyled,\n\t\t\tdisabled,\n\t\t\tactions.handleDrop,\n\t\t\tactions.handlePaste,\n\t\t\tactions.openFilePicker,\n\t\t\tactions.handleKeyDown,\n\t\t\tactions.handleDragEnter,\n\t\t\tactions.handleDragLeave,\n\t\t\tactions.handleDragOver,\n\t\t\tdisableFilePickerOpenOnAreaClick,\n\t\t\tdisableInternalStateSubscription,\n\t\t\tisDraggingOver,\n\t\t\tisInvalid,\n\t\t]\n\t);\n\n\tconst refCallback: React.RefCallback<HTMLInputElement> = useCallbackRef((node) => {\n\t\tinputRef.current = node;\n\t\tactions.setInputRef(node);\n\t});\n\n\tconst getInputProps: DropZonePropGetters[\"getInputProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst isDisabled = innerProps.disabled ?? disabled;\n\n\t\t\tconst onFileChange = !isDisabled ? actions.handleChange : undefined;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"input\"),\n\t\t\t\t...(!disableInternalStateSubscription && { \"data-drag-over\": dataAttr(isDraggingOver) }),\n\t\t\t\t...innerProps,\n\t\t\t\taccept: allowedFileTypes ? allowedFileTypes.join(\", \") : innerProps.accept,\n\t\t\t\tclassName: cnMerge(\"hidden\", innerProps.className),\n\t\t\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\t\tdisabled: isDisabled,\n\t\t\t\tmultiple: multiple ?? innerProps.multiple,\n\t\t\t\tonChange: composeTwoEventHandlers(onFileChange, innerProps.onChange),\n\t\t\t\tref: composeRefs(refCallback, innerProps.ref),\n\t\t\t\ttype: \"file\",\n\t\t\t};\n\t\t},\n\t\t[\n\t\t\tactions.handleChange,\n\t\t\tallowedFileTypes,\n\t\t\tdisableInternalStateSubscription,\n\t\t\tdisabled,\n\t\t\tisDraggingOver,\n\t\t\tmultiple,\n\t\t\trefCallback,\n\t\t]\n\t);\n\n\tconst getTriggerProps: DropZonePropGetters[\"getTriggerProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst isDisabled = innerProps.disabled ?? disabled;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"trigger\"),\n\t\t\t\ttype: \"button\",\n\t\t\t\t...innerProps,\n\t\t\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\t\tdisabled: isDisabled,\n\t\t\t\tonClick: composeTwoEventHandlers(actions.openFilePicker, innerProps.onClick),\n\t\t\t};\n\t\t},\n\t\t[actions.openFilePicker, disabled]\n\t);\n\n\tconst getFileListProps: DropZonePropGetters[\"getFileListProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { orientation = \"vertical\", unstyled = globalUnstyled, ...restOfInnerProps } = innerProps;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-list\"),\n\t\t\t\t\"data-orientation\": orientation,\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\n\t\t\t\t\t\t\"flex flex-col gap-2\",\n\t\t\t\t\t\torientation === \"horizontal\" && \"flex-row overflow-x-auto p-1.5\",\n\t\t\t\t\t\tinnerProps.className\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\t[globalUnstyled]\n\t);\n\n\tconst getFileItemProps: DropZonePropGetters[\"getFileItemProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { unstyled = globalUnstyled, ...restOfInnerProps } = innerProps;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item\"),\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\n\t\t\t\t\t\t\"relative flex animate-files-in items-center gap-2.5 rounded-md border p-2\",\n\t\t\t\t\t\tinnerProps.className\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\t[globalUnstyled]\n\t);\n\n\tconst getFileItemProgressProps: DropZonePropGetters[\"getFileItemProgressProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { unstyled = globalUnstyled, variant = \"linear\", ...restOfInnerProps } = innerProps;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item-progress\"),\n\t\t\t\trole: \"progressbar\",\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\n\t\t\t\t\t\t\"inline-flex\",\n\t\t\t\t\t\tvariant === \"circular\" && \"absolute top-1/2 left-1/2 -translate-1/2\",\n\t\t\t\t\t\tvariant === \"fill\"\n\t\t\t\t\t\t\t&& `absolute inset-0 bg-zu-primary/50 transition-[clip-path] duration-300 ease-linear [clip-path:var(--clip-path)]`,\n\t\t\t\t\t\tvariant === \"linear\"\n\t\t\t\t\t\t\t&& \"relative h-1.5 w-full overflow-hidden rounded-full bg-zu-primary/20\",\n\t\t\t\t\t\trestOfInnerProps.className\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\t[globalUnstyled]\n\t);\n\n\tconst getFileItemDeleteProps: DropZonePropGetters[\"getFileItemDeleteProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { fileStateOrID, ...restOfInnerProps } = innerProps;\n\n\t\t\tconst isDisabled = innerProps.disabled ?? disabled;\n\n\t\t\tconst onRemoveFile = () => fileStateOrID && actions.removeFile({ fileStateOrID });\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item-delete\"),\n\t\t\t\ttype: \"button\",\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\t\tdisabled: isDisabled,\n\t\t\t\tonClick: composeTwoEventHandlers(onRemoveFile, restOfInnerProps.onClick),\n\t\t\t};\n\t\t},\n\t\t[actions, disabled]\n\t);\n\n\tconst getFileItemPreviewProps: DropZonePropGetters[\"getFileItemPreviewProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { unstyled = globalUnstyled, ...restOfInnerProps } = innerProps;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item-preview\"),\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\n\t\t\t\t\t\t`relative flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-md bg-zu-accent/50 [&>svg]:size-10`,\n\t\t\t\t\t\tinnerProps.className\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\t[globalUnstyled]\n\t);\n\n\tconst getFileItemMetadataProps: DropZonePropGetters[\"getFileItemMetadataProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { unstyled = globalUnstyled, ...restOfInnerProps } = innerProps;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item-metadata\"),\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\"flex min-w-0 grow flex-col\", innerProps.className),\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\t[globalUnstyled]\n\t);\n\n\tconst getFileItemClearProps: DropZonePropGetters[\"getFileItemClearProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst isDisabled = innerProps.disabled ?? disabled;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item-clear\"),\n\t\t\t\ttype: \"button\",\n\t\t\t\t...innerProps,\n\t\t\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\t\tdisabled: isDisabled,\n\t\t\t\tonClick: composeTwoEventHandlers(actions.clearFiles, innerProps.onClick),\n\t\t\t};\n\t\t},\n\t\t[actions.clearFiles, disabled]\n\t);\n\n\tconst propGetters = useMemo<DropZonePropGetters>(\n\t\t() =>\n\t\t\t({\n\t\t\t\tgetContainerProps,\n\t\t\t\tgetFileItemClearProps,\n\t\t\t\tgetFileItemDeleteProps,\n\t\t\t\tgetFileItemMetadataProps,\n\t\t\t\tgetFileItemPreviewProps,\n\t\t\t\tgetFileItemProgressProps,\n\t\t\t\tgetFileItemProps,\n\t\t\t\tgetFileListProps,\n\t\t\t\tgetInputProps,\n\t\t\t\tgetTriggerProps,\n\t\t\t}) satisfies DropZonePropGetters,\n\t\t[\n\t\t\tgetContainerProps,\n\t\t\tgetFileListProps,\n\t\t\tgetFileItemClearProps,\n\t\t\tgetFileItemDeleteProps,\n\t\t\tgetFileItemMetadataProps,\n\t\t\tgetFileItemPreviewProps,\n\t\t\tgetFileItemProgressProps,\n\t\t\tgetFileItemProps,\n\t\t\tgetInputProps,\n\t\t\tgetTriggerProps,\n\t\t]\n\t);\n\n\tconst stableUseDropZoneStore = useCallbackRef(useDropZoneStore);\n\n\tconst result = useMemo<UseDropZoneResult>(\n\t\t() =>\n\t\t\t({\n\t\t\t\tdisabled,\n\t\t\t\tdisableInternalStateSubscription,\n\t\t\t\tinputRef,\n\t\t\t\tpropGetters,\n\t\t\t\tstoreApi,\n\t\t\t\tuseDropZoneStore: stableUseDropZoneStore,\n\t\t\t}) satisfies UseDropZoneResult,\n\t\t[disabled, disableInternalStateSubscription, propGetters, storeApi, stableUseDropZoneStore]\n\t);\n\n\treturn result;\n};\n","\"use client\";\n\nimport { dataAttr, formatBytes } from \"@zayne-labs/toolkit-core\";\nimport { useCompareSelector } from \"@zayne-labs/toolkit-react\";\nimport type {\n\tCssWithCustomProperties,\n\tInferProps,\n\tPolymorphicPropsStrict,\n} from \"@zayne-labs/toolkit-react/utils\";\nimport {\n\tisBoolean,\n\tisFunction,\n\tisNumber,\n\ttype AnyFunction,\n\ttype SelectorFn,\n\ttype UnionDiscriminator,\n} from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo } from \"react\";\nimport { For } from \"@/components/common/for\";\nimport { Presence } from \"@/components/common/presence\";\nimport { Slot } from \"@/components/common/slot\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport {\n\tDropZoneRootContextProvider,\n\tDropZoneStoreContextProvider,\n\tFileItemContextProvider,\n\tuseDropZoneRootContext,\n\tuseDropZoneStoreContext,\n\tuseFileItemContext,\n\ttype DropZoneRootContextType,\n\ttype FileItemContextType,\n} from \"./drop-zone-context\";\nimport {\n\tFileArchiveIcon,\n\tFileAudioIcon,\n\tFileCodeIcon,\n\tFileCogIcon,\n\tFileIcon,\n\tFileTextIcon,\n\tFileVideoIcon,\n} from \"./icons\";\nimport type { DropZoneStore, PartInputProps, UseDropZoneProps } from \"./types\";\nimport { useDropZone } from \"./use-drop-zone\";\n\nexport type DropZoneRootProps = UseDropZoneProps & {\n\tchildren: React.ReactNode;\n};\n\nexport function DropZoneRoot(props: DropZoneRootProps) {\n\tconst { children, ...restOfProps } = props;\n\n\tconst { disabled, disableInternalStateSubscription, inputRef, propGetters, storeApi } =\n\t\tuseDropZone(restOfProps);\n\n\tconst rootContextValue = useMemo<DropZoneRootContextType>(\n\t\t() =>\n\t\t\t({\n\t\t\t\tdisabled,\n\t\t\t\tdisableInternalStateSubscription,\n\t\t\t\tinputRef,\n\t\t\t\tpropGetters,\n\t\t\t}) satisfies DropZoneRootContextType,\n\t\t[disableInternalStateSubscription, disabled, inputRef, propGetters]\n\t);\n\n\treturn (\n\t\t<DropZoneStoreContextProvider store={storeApi}>\n\t\t\t<DropZoneRootContextProvider value={rootContextValue}>{children}</DropZoneRootContextProvider>\n\t\t</DropZoneStoreContextProvider>\n\t);\n}\n\nexport type DropZoneContextProps<TSlice> = {\n\tchildren: React.ReactNode | ((context: TSlice) => React.ReactNode);\n\tselector?: SelectorFn<DropZoneStore, TSlice>;\n};\n\nexport function DropZoneContext<TSlice = DropZoneStore>(props: DropZoneContextProps<TSlice>) {\n\tconst { children, selector } = props;\n\n\tconst dropZoneCtx = useDropZoneStoreContext(useCompareSelector(selector));\n\n\tconst resolvedChildren = isFunction(children) ? children(dropZoneCtx) : children;\n\n\treturn resolvedChildren;\n}\n\n/* eslint-disable perfectionist/sort-intersection-types -- I need non-standard props to come first */\n\nexport type DropZoneContainerProps = {\n\tasChild?: boolean;\n} & PartInputProps[\"container\"];\n\nexport function DropZoneContainer<TElement extends React.ElementType = \"div\">(\n\tprops: PolymorphicPropsStrict<TElement, DropZoneContainerProps>\n) {\n\tconst { as: Element = \"div\", asChild, ...restOfProps } = props;\n\n\tconst { disableInternalStateSubscription, propGetters } = useDropZoneRootContext();\n\n\tconst isDraggingOver = useDropZoneStoreContext((store) =>\n\t\tdisableInternalStateSubscription ? store.isDraggingOver : null\n\t);\n\n\tconst isInvalid = useDropZoneStoreContext((store) =>\n\t\tdisableInternalStateSubscription ? store.isInvalid : null\n\t);\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\treturn (\n\t\t<Component\n\t\t\t{...propGetters.getContainerProps({\n\t\t\t\t...(disableInternalStateSubscription && {\n\t\t\t\t\t\"data-drag-over\": dataAttr(isDraggingOver),\n\t\t\t\t\t\"data-invalid\": dataAttr(isInvalid),\n\t\t\t\t}),\n\t\t\t\t...restOfProps,\n\t\t\t})}\n\t\t/>\n\t);\n}\n\nexport type DropZoneInputProps = {\n\tasChild?: boolean;\n} & PartInputProps[\"input\"];\n\nexport function DropZoneInput(props: DropZoneInputProps) {\n\tconst { asChild, ...restOfProps } = props;\n\n\tconst { disableInternalStateSubscription, propGetters } = useDropZoneRootContext();\n\n\tconst isDraggingOver = useDropZoneStoreContext((store) =>\n\t\tdisableInternalStateSubscription ? store.isDraggingOver : null\n\t);\n\n\tconst Component = asChild ? Slot.Root : \"input\";\n\n\treturn (\n\t\t<Component\n\t\t\t{...propGetters.getInputProps({\n\t\t\t\t...(disableInternalStateSubscription && { \"data-drag-over\": dataAttr(isDraggingOver) }),\n\t\t\t\t...restOfProps,\n\t\t\t})}\n\t\t/>\n\t);\n}\n\nexport type DropZoneAreaProps<TSlice = DropZoneStore> = DropZoneContextProps<TSlice> & {\n\tclassNames?: Partial<Record<Extract<keyof PartInputProps, \"container\" | \"input\">, string>>;\n\textraProps?: Partial<Pick<PartInputProps, \"container\" | \"input\">>;\n} & PartInputProps[\"container\"];\n\nexport function DropZoneArea<TSlice = DropZoneStore>(props: DropZoneAreaProps<TSlice>) {\n\tconst { children, className, classNames, extraProps, selector, ...restOfProps } = props;\n\n\treturn (\n\t\t<DropZoneContainer\n\t\t\t{...extraProps?.container}\n\t\t\t{...restOfProps}\n\t\t\tclassName={cnMerge(extraProps?.container?.className, className, classNames?.container)}\n\t\t>\n\t\t\t<DropZoneInput\n\t\t\t\t{...extraProps?.input}\n\t\t\t\tclassName={cnMerge(extraProps?.input?.className, classNames?.input)}\n\t\t\t/>\n\n\t\t\t<DropZoneContext selector={selector}>{children}</DropZoneContext>\n\t\t</DropZoneContainer>\n\t);\n}\n\nexport type DropZoneTriggerProps = {\n\tasChild?: boolean;\n} & PartInputProps[\"trigger\"];\n\nexport function DropZoneTrigger(props: DropZoneTriggerProps) {\n\tconst { asChild, ...restOfProps } = props;\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst Component = asChild ? Slot.Root : \"button\";\n\n\treturn <Component {...propGetters.getTriggerProps(restOfProps)} />;\n}\n\ntype ListPerItemContext = Pick<DropZoneStore, \"actions\"> & {\n\tarray: DropZoneStore[\"fileStateArray\"];\n\tfileState: DropZoneStore[\"fileStateArray\"][number];\n\tindex: number;\n};\n\ntype FileListPerItemVariant = {\n\tchildren: React.ReactNode | ((context: ListPerItemContext) => React.ReactNode);\n\trenderMode?: \"per-item\";\n};\n\ntype ListManualListContext = Pick<DropZoneStore, \"actions\" | \"fileStateArray\">;\n\ntype FileListManualListVariant = {\n\tchildren: React.ReactNode | ((context: ListManualListContext) => React.ReactNode);\n\trenderMode: \"manual-list\";\n};\n\nexport type DropZoneFileListProps = {\n\tasChild?: boolean;\n\tforceMount?: boolean;\n} & (FileListManualListVariant | FileListPerItemVariant)\n\t& Omit<PartInputProps[\"fileList\"], \"children\">;\n\nexport function DropZoneFileList<TElement extends React.ElementType = \"ul\">(\n\tprops: PolymorphicPropsStrict<TElement, DropZoneFileListProps>\n) {\n\tconst {\n\t\tas: Element = \"ul\",\n\t\tasChild,\n\t\tchildren,\n\t\tforceMount = false,\n\t\trenderMode = \"per-item\",\n\t\t...restOfProps\n\t} = props;\n\n\tconst fileStateArray = useDropZoneStoreContext((store) => store.fileStateArray);\n\tconst actions = useDropZoneStoreContext((store) => store.actions);\n\n\tconst { disableInternalStateSubscription, propGetters } = useDropZoneRootContext();\n\n\tconst childrenMap = {\n\t\t\"manual-list\": () => {\n\t\t\tconst childrenFn = children as Extract<FileListManualListVariant[\"children\"], AnyFunction>;\n\t\t\treturn childrenFn({ actions, fileStateArray });\n\t\t},\n\t\t\"per-item\": () => {\n\t\t\tconst childrenFn = children as Extract<FileListPerItemVariant[\"children\"], AnyFunction>;\n\n\t\t\treturn (\n\t\t\t\t<For\n\t\t\t\t\teach={fileStateArray}\n\t\t\t\t\trenderItem={(fileState, index, array) => childrenFn({ actions, array, fileState, index })}\n\t\t\t\t/>\n\t\t\t);\n\t\t},\n\t} satisfies Record<typeof renderMode, () => React.ReactNode>;\n\n\tconst hasFiles = fileStateArray.length > 0;\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\treturn (\n\t\t<Presence present={hasFiles} forceMount={forceMount}>\n\t\t\t<Component\n\t\t\t\t{...propGetters.getFileListProps({\n\t\t\t\t\t...(disableInternalStateSubscription && { \"data-state\": hasFiles ? \"active\" : \"inactive\" }),\n\t\t\t\t\t...restOfProps,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{isFunction(children) ? childrenMap[renderMode]() : children}\n\t\t\t</Component>\n\t\t</Presence>\n\t);\n}\n\nexport type DropZoneFileItemProps = FileItemContextType & {\n\tasChild?: boolean;\n} & PartInputProps[\"fileItem\"];\n\nexport function DropZoneFileItem<TElement extends React.ElementType = \"li\">(\n\tprops: PolymorphicPropsStrict<TElement, DropZoneFileItemProps>\n) {\n\tconst { as: Element = \"li\", asChild, fileState, ...restOfProps } = props;\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\tconst contextValue = useMemo<FileItemContextType>(\n\t\t() => ({ fileState }) satisfies FileItemContextType,\n\t\t[fileState]\n\t);\n\n\treturn (\n\t\t<FileItemContextProvider value={contextValue}>\n\t\t\t<Component {...propGetters.getFileItemProps(restOfProps)} />\n\t\t</FileItemContextProvider>\n\t);\n}\n\nexport type DropZoneFileItemDeleteProps = {\n\tasChild?: boolean;\n} & PartInputProps[\"fileItemDelete\"];\n\nexport function DropZoneFileItemDelete(props: DropZoneFileItemDeleteProps) {\n\tconst { asChild, fileStateOrID, ...restOfProps } = props;\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst fileItemContextValue = useFileItemContext();\n\n\tconst Component = asChild ? Slot.Root : \"button\";\n\n\tconst resolvedFileStateOrID = fileStateOrID ?? fileItemContextValue?.fileState;\n\n\treturn (\n\t\t<Component\n\t\t\t{...propGetters.getFileItemDeleteProps({ fileStateOrID: resolvedFileStateOrID, ...restOfProps })}\n\t\t/>\n\t);\n}\n\nexport type DropZoneFileItemProgressProps = {\n\tasChild?: boolean;\n\tclassNames?: {\n\t\tcircular?: { root?: string; svgCircleOne?: string; svgCircleTwo?: string; svgRoot?: string };\n\t};\n\tforceMount?: boolean;\n\tsize?: number;\n} & PartInputProps[\"fileItemProgress\"];\n\nexport function DropZoneFileItemProgress<TElement extends React.ElementType = \"span\">(\n\tprops: PolymorphicPropsStrict<TElement, DropZoneFileItemProgressProps>\n) {\n\tconst {\n\t\tas: Element = \"span\",\n\t\tasChild,\n\t\tclassName,\n\t\tclassNames,\n\t\tforceMount = false,\n\t\tsize = 40,\n\t\tvariant = \"linear\",\n\t\t...restOfProps\n\t} = props;\n\n\tconst fileItemContextValue = useFileItemContext();\n\n\tconst fileState = fileItemContextValue?.fileState;\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tif (!fileState) {\n\t\treturn null;\n\t}\n\n\tconst currentProgress = fileState.progress;\n\n\tconst shouldRender = forceMount || fileState.progress !== 100;\n\n\tif (!shouldRender) {\n\t\treturn null;\n\t}\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\tconst componentProps = propGetters.getFileItemProgressProps({ variant, ...restOfProps });\n\n\tswitch (variant) {\n\t\tcase \"circular\": {\n\t\t\tconst circumference = 2 * Math.PI * ((size - 4) / 2);\n\t\t\tconst strokeDashoffset = circumference - (currentProgress / 100) * circumference;\n\n\t\t\treturn (\n\t\t\t\t<Component className={cnMerge(className, classNames?.circular?.root)} {...componentProps}>\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclassName={cnMerge(\"-rotate-90\", classNames?.circular?.svgRoot)}\n\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\theight={size}\n\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\tclassName={cnMerge(\"text-zu-primary/20\", classNames?.circular?.svgCircleOne)}\n\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\tcx={size / 2}\n\t\t\t\t\t\t\tcy={size / 2}\n\t\t\t\t\t\t\tr={(size - 4) / 2}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\t\t\"text-zu-primary transition-[stroke-dashoffset] duration-300 ease-linear\",\n\t\t\t\t\t\t\t\tclassNames?.circular?.svgCircleTwo\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeDasharray={circumference}\n\t\t\t\t\t\t\tstrokeDashoffset={strokeDashoffset}\n\t\t\t\t\t\t\tcx={size / 2}\n\t\t\t\t\t\t\tcy={size / 2}\n\t\t\t\t\t\t\tr={(size - 4) / 2}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t</Component>\n\t\t\t);\n\t\t}\n\n\t\tcase \"fill\": {\n\t\t\tconst topInset = 100 - currentProgress;\n\n\t\t\treturn (\n\t\t\t\t<Component\n\t\t\t\t\tclassName={className}\n\t\t\t\t\t{...componentProps}\n\t\t\t\t\tstyle={\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"--clip-path\": `inset(${topInset}% 0% 0% 0%)`,\n\t\t\t\t\t\t\t...componentProps.style,\n\t\t\t\t\t\t} satisfies CssWithCustomProperties as CssWithCustomProperties\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tcase \"linear\": {\n\t\t\treturn (\n\t\t\t\t<Component\n\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\"inline-block size-full grow translate-x-(--translate-distance) bg-zu-primary transition-transform duration-300 ease-linear\",\n\t\t\t\t\t\tclassName\n\t\t\t\t\t)}\n\t\t\t\t\t{...componentProps}\n\t\t\t\t\tstyle={\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"--translate-distance\": `-${100 - currentProgress}%`,\n\t\t\t\t\t\t\t...componentProps.style,\n\t\t\t\t\t\t} satisfies CssWithCustomProperties as CssWithCustomProperties\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<span />\n\t\t\t\t</Component>\n\t\t\t);\n\t\t}\n\n\t\tdefault: {\n\t\t\tvariant satisfies never;\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\ntype NodeCtx<TElement extends React.ElementType> = {\n\tgetProps: (innerProps: Partial<InferProps<TElement>>) => InferProps<TElement>;\n};\n\ntype RenderPreviewDetails<TElement extends React.ElementType = \"svg\"> = UnionDiscriminator<\n\t[\n\t\t{ props: InferProps<TElement> },\n\t\t{ node: React.ReactNode | ((ctx: NodeCtx<TElement>) => React.ReactNode) },\n\t]\n>;\n\ntype RenderPropContext = Pick<FileItemContextType, \"fileState\"> & {\n\tfileExtension: string;\n\tfileType: string;\n};\n\ntype RenderPreviewObject = {\n\tarchive?: RenderPreviewDetails;\n\taudio?: RenderPreviewDetails;\n\tcode?: RenderPreviewDetails;\n\tdefault?: RenderPreviewDetails;\n\texecutable?: RenderPreviewDetails;\n\timage?: RenderPreviewDetails<\"img\">;\n\ttext?: RenderPreviewDetails;\n\tvideo?: RenderPreviewDetails;\n};\ntype RenderPreviewFn = (context: RenderPropContext) => RenderPreviewObject;\n\ntype RenderPreview = RenderPreviewFn | RenderPreviewObject;\n\nexport type DropZoneFileItemPreviewProps = Partial<Pick<FileItemContextType, \"fileState\">> & {\n\tasChild?: boolean;\n\tchildren?:\n\t\t| React.ReactNode\n\t\t| ((context: RenderPropContext & { fallbackPreview: () => React.ReactNode }) => React.ReactNode);\n\trenderPreview?: boolean | RenderPreview;\n} & Omit<PartInputProps[\"fileItemPreview\"], \"children\">;\n\nexport function DropZoneFileItemPreview<TElement extends React.ElementType>(\n\tprops: PolymorphicPropsStrict<TElement, DropZoneFileItemPreviewProps>\n) {\n\tconst {\n\t\tas: Element = \"span\",\n\t\tasChild,\n\t\tchildren,\n\t\tfileState: fileStateProp,\n\t\trenderPreview = true,\n\t\t...restOfProps\n\t} = props;\n\n\tconst fileItemContextValue = useFileItemContext();\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst fileState = fileStateProp ?? fileItemContextValue?.fileState;\n\n\tif (!fileState) {\n\t\treturn null;\n\t}\n\n\tconst fileType = fileState.file.type ?? \"\";\n\n\tconst fileExtension = fileState.file.name?.split(\".\").pop()?.toLowerCase() ?? \"\";\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\tconst fallbackPreview = () =>\n\t\tgetFilePreviewOrIcon({ fileExtension, fileState, fileType, renderPreview });\n\n\tconst resolvedChildren =\n\t\tisFunction(children) ? children({ fallbackPreview, fileExtension, fileState, fileType }) : children;\n\n\treturn (\n\t\t<Component {...propGetters.getFileItemPreviewProps(restOfProps)}>\n\t\t\t{renderPreview && fallbackPreview()}\n\t\t\t{resolvedChildren}\n\t\t</Component>\n\t);\n}\n\nconst resolvePreviewNode = <\n\tTPreviewDetail extends NonNullable<RenderPreviewObject[keyof RenderPreviewObject]>,\n\tTNodeFn extends Extract<TPreviewDetail[\"node\"], AnyFunction>,\n>(\n\tdetails: TPreviewDetail | undefined,\n\tgetProps: Parameters<TNodeFn>[0][\"getProps\"] = ((props: unknown) => props) as never\n) => {\n\tconst resolvedNode =\n\t\tisFunction(details?.node) ? details.node({ getProps: getProps as never }) : details?.node;\n\n\treturn resolvedNode;\n};\n\nconst getFilePreviewOrIcon = (\n\tcontext: Pick<Required<DropZoneFileItemPreviewProps>, \"renderPreview\"> & Required<RenderPropContext>\n): React.ReactNode => {\n\tconst { fileExtension, fileState, fileType, renderPreview } = context;\n\n\tconst renderPreviewValue = isBoolean(renderPreview) ? {} : renderPreview;\n\n\tconst resolvedRenderPreviewObject =\n\t\tisFunction(renderPreviewValue) ?\n\t\t\trenderPreviewValue({ fileExtension, fileState, fileType })\n\t\t:\trenderPreviewValue;\n\n\tswitch (true) {\n\t\tcase fileType.startsWith(\"image/\"): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.image, (innerProps) => ({\n\t\t\t\t...innerProps,\n\t\t\t\talt: innerProps.alt ?? fileState.file.name ?? \"\",\n\t\t\t\tclassName: cnMerge(\"size-full object-cover\", innerProps.className),\n\t\t\t\tsrc: innerProps.src ?? fileState.preview,\n\t\t\t}));\n\n\t\t\treturn (\n\t\t\t\tresolvedNode ?? (\n\t\t\t\t\t<img\n\t\t\t\t\t\t{...resolvedRenderPreviewObject.image?.props}\n\t\t\t\t\t\tsrc={fileState.preview}\n\t\t\t\t\t\talt={fileState.file.name ?? \"\"}\n\t\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\t\"size-full object-cover\",\n\t\t\t\t\t\t\tresolvedRenderPreviewObject.image?.props?.className\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tcase fileType.startsWith(\"video/\"): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.video, (innerProps) => ({\n\t\t\t\t...innerProps,\n\t\t\t\tclassName: cnMerge(\"size-full object-cover\", innerProps.className),\n\t\t\t}));\n\n\t\t\treturn (\n\t\t\t\tresolvedNode ?? (\n\t\t\t\t\t<FileVideoIcon\n\t\t\t\t\t\t{...resolvedRenderPreviewObject.video?.props}\n\t\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\t\"size-full object-cover\",\n\t\t\t\t\t\t\tresolvedRenderPreviewObject.video?.props?.className\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tcase fileType.startsWith(\"audio/\"): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.audio, (innerProps) => ({\n\t\t\t\t...innerProps,\n\t\t\t\tclassName: cnMerge(\"size-full object-cover\", innerProps.className),\n\t\t\t}));\n\n\t\t\treturn (\n\t\t\t\tresolvedNode ?? (\n\t\t\t\t\t<FileAudioIcon\n\t\t\t\t\t\t{...resolvedRenderPreviewObject.audio?.props}\n\t\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\t\"size-full object-cover\",\n\t\t\t\t\t\t\tresolvedRenderPreviewObject.audio?.props?.className\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tcase fileType.startsWith(\"text/\") || [\"md\", \"pdf\", \"rtf\", \"txt\"].includes(fileExtension): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.text);\n\n\t\t\treturn resolvedNode ?? <FileTextIcon {...resolvedRenderPreviewObject.text?.props} />;\n\t\t}\n\n\t\tcase [\n\t\t\t\"c\",\n\t\t\t\"cpp\",\n\t\t\t\"cs\",\n\t\t\t\"css\",\n\t\t\t\"html\",\n\t\t\t\"java\",\n\t\t\t\"js\",\n\t\t\t\"json\",\n\t\t\t\"jsx\",\n\t\t\t\"php\",\n\t\t\t\"py\",\n\t\t\t\"rb\",\n\t\t\t\"ts\",\n\t\t\t\"tsx\",\n\t\t\t\"xml\",\n\t\t].includes(fileExtension): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.code);\n\n\t\t\treturn resolvedNode ?? <FileCodeIcon {...resolvedRenderPreviewObject.code?.props} />;\n\t\t}\n\n\t\tcase [\"7z\", \"bz2\", \"gz\", \"rar\", \"tar\", \"zip\"].includes(fileExtension): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.archive);\n\n\t\t\treturn resolvedNode ?? <FileArchiveIcon {...resolvedRenderPreviewObject.archive?.props} />;\n\t\t}\n\n\t\tcase [\"apk\", \"app\", \"deb\", \"exe\", \"msi\", \"rpm\"].includes(fileExtension): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.executable);\n\n\t\t\treturn resolvedNode ?? <FileCogIcon {...resolvedRenderPreviewObject.executable?.props} />;\n\t\t}\n\n\t\tdefault: {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.default);\n\n\t\t\treturn resolvedNode ?? <FileIcon {...resolvedRenderPreviewObject.default?.props} />;\n\t\t}\n\t}\n};\n\nexport type DropZoneFileItemMetadataProps = Partial<Pick<FileItemContextType, \"fileState\">> & {\n\tasChild?: boolean;\n\tchildren?: React.ReactNode | ((context: Pick<FileItemContextType, \"fileState\">) => React.ReactNode);\n\tclassNames?: {\n\t\tname?: string;\n\t\tsize?: string;\n\t};\n\tsize?: \"default\" | \"sm\";\n} & Omit<PartInputProps[\"fileItemMetadata\"], \"children\">;\n\nexport function DropZoneFileItemMetadata(props: DropZoneFileItemMetadataProps) {\n\tconst {\n\t\tasChild,\n\t\tchildren,\n\t\tclassNames,\n\t\tfileState: fileStateProp,\n\t\tsize = \"default\",\n\t\t...restOfProps\n\t} = props;\n\n\tconst fileItemContextValue = useFileItemContext();\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst fileState = fileStateProp ?? fileItemContextValue?.fileState;\n\n\tif (!fileState) {\n\t\treturn null;\n\t}\n\n\tconst Component = asChild ? Slot.Root : \"div\";\n\n\tconst resolvedChildren = isFunction(children) ? children({ fileState }) : children;\n\n\tconst getDefaultMetadataChildren = () => {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<p\n\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\"truncate\",\n\t\t\t\t\t\tsize === \"default\" && \"text-[14px] font-medium\",\n\t\t\t\t\t\tsize === \"sm\" && \"text-[13px] leading-snug\",\n\t\t\t\t\t\tclassNames?.name\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{fileState.file.name}\n\t\t\t\t</p>\n\t\t\t\t<p\n\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\"truncate text-zu-muted-foreground\",\n\t\t\t\t\t\tsize === \"default\" && \"text-[12px]\",\n\t\t\t\t\t\tsize === \"sm\" && \"text-[11px] leading-snug\",\n\t\t\t\t\t\tclassNames?.size\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{isNumber(fileState.file.size) && formatBytes(fileState.file.size)}\n\t\t\t\t</p>\n\t\t\t\t{fileState.error && (\n\t\t\t\t\t<p className=\"text-[12px] text-zu-destructive\">{fileState.error.message}</p>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Component {...propGetters.getFileItemMetadataProps(restOfProps)}>\n\t\t\t{resolvedChildren ?? getDefaultMetadataChildren()}\n\t\t</Component>\n\t);\n}\n\nexport type DropZoneFileClearProps = {\n\tasChild?: boolean;\n\tforceMount?: boolean;\n} & PartInputProps[\"fileItemClear\"];\n\nexport function DropZoneFileClear(props: DropZoneFileClearProps) {\n\tconst { asChild, forceMount = false, ...restOfProps } = props;\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst fileCount = useDropZoneStoreContext((state) => state.fileStateArray.length);\n\n\tconst shouldRender = forceMount || fileCount > 0;\n\n\tif (!shouldRender) {\n\t\treturn null;\n\t}\n\n\tconst Component = asChild ? Slot.Root : \"button\";\n\n\treturn <Component {...propGetters.getFileItemClearProps(restOfProps)} />;\n}\n\n/* eslint-enable perfectionist/sort-intersection-types -- I need non-standard props to come first */\n","export {\n\tDropZoneArea as Area,\n\tDropZoneContainer as Container,\n\tDropZoneContext as Context,\n\tDropZoneFileClear as FileClear,\n\tDropZoneFileItem as FileItem,\n\tDropZoneFileItemDelete as FileItemDelete,\n\tDropZoneFileItemMetadata as FileItemMetadata,\n\tDropZoneFileItemPreview as FileItemPreview,\n\tDropZoneFileItemProgress as FileItemProgress,\n\tDropZoneFileList as FileList,\n\tDropZoneInput as Input,\n\tDropZoneRoot as Root,\n\tDropZoneTrigger as Trigger,\n} from \"./drop-zone\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["generateFileID","generateFileIDPrimitive","generateFileID","Slot.Root","Switch.Root","Switch.Match"],"sources":["../../../../src/components/ui/drop-zone/drop-zone-context.ts","../../../../src/components/ui/drop-zone/icons.tsx","../../../../src/components/ui/drop-zone/utils.ts","../../../../src/components/ui/drop-zone/drop-zone-store.ts","../../../../src/components/ui/drop-zone/use-drop-zone.ts","../../../../src/components/ui/drop-zone/drop-zone.tsx","../../../../src/components/ui/drop-zone/drop-zone-parts.ts"],"sourcesContent":["import { createCustomContext } from \"@zayne-labs/toolkit-react\";\nimport { createReactStoreContext } from \"@zayne-labs/toolkit-react/zustand\";\nimport type { DropZoneStore, FileState, UseDropZoneResult } from \"./types\";\n\nconst [DropZoneStoreContextProvider, useDropZoneStoreContext] = createReactStoreContext<DropZoneStore>({\n\thookName: \"useDropZoneStoreContext\",\n\tname: \"DropZoneStoreContext\",\n\tproviderName: \"DropZoneRoot\",\n});\n\nexport type DropZoneRootContextType = Pick<\n\tUseDropZoneResult,\n\t\"disabled\" | \"disableInternalStateSubscription\" | \"inputRef\" | \"propGetters\"\n>;\n\nconst [DropZoneRootContextProvider, useDropZoneRootContext] = createCustomContext<DropZoneRootContextType>(\n\t{\n\t\thookName: \"useDropZoneRootContext\",\n\t\tname: \"DropZoneRootContext\",\n\t\tproviderName: \"DropZoneRoot\",\n\t}\n);\n\nexport type FileItemContextType = {\n\tfileState: FileState;\n};\n\nconst [FileItemContextProvider, useFileItemContext] = createCustomContext({\n\tdefaultValue: null as unknown as FileItemContextType,\n\thookName: \"useFileItemContext\",\n\tname: \"FileItemContext\",\n\tproviderName: \"FileItem\",\n\tstrict: false,\n});\n\nexport {\n\tDropZoneRootContextProvider,\n\tDropZoneStoreContextProvider,\n\tFileItemContextProvider,\n\tuseDropZoneRootContext,\n\tuseDropZoneStoreContext,\n\tuseFileItemContext,\n};\n","export const FileVideoIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n\t\t\t<path d=\"M14 2v4a2 2 0 0 0 2 2h4m-10 3l5 3l-5 3z\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileAudioIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M17.5 22h.5a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3\" />\n\t\t\t<path d=\"M14 2v4a2 2 0 0 0 2 2h4M2 19a2 2 0 1 1 4 0v1a2 2 0 1 1-4 0v-4a6 6 0 0 1 12 0v4a2 2 0 1 1-4 0v-1a2 2 0 1 1 4 0\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileTextIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n\t\t\t<path d=\"M14 2v4a2 2 0 0 0 2 2h4M10 9H8m8 4H8m8 4H8\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileCodeIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M10 12.5L8 15l2 2.5m4-5l2 2.5l-2 2.5M14 2v4a2 2 0 0 0 2 2h4\" />\n\t\t\t<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileArchiveIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M10 12v-1m0 7v-2m0-9V6m4-4v4a2 2 0 0 0 2 2h4\" />\n\t\t\t<path d=\"M15.5 22H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v16a2 2 0 0 0 .274 1.01\" />\n\t\t\t<circle cx=\"10\" cy=\"20\" r=\"2\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileCogIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M14 2v4a2 2 0 0 0 2 2h4M3.2 12.9l-.9-.4m.9 2.6l-.9.4\" />\n\t\t\t<path d=\"M4.677 21.5a2 2 0 0 0 1.313.5H18a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v2.5m.9 4.7l-.4-.9m.4 6.5l-.4.9m3-7.4l-.4.9m.4 6.5l-.4-.9m2.6-4.3l-.9.4m.9 2.6l-.9-.4\" />\n\t\t\t<circle cx=\"6\" cy=\"14\" r=\"3\" />\n\t\t</g>\n\t</svg>\n);\n\nexport const FileIcon = (props: React.SVGProps<SVGSVGElement>) => (\n\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n\t\t{/* Icon from Lucide by Lucide Contributors - https://github.com/lucide-icons/lucide/blob/main/LICENSE */}\n\t\t<g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n\t\t\t<path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n\t\t\t<path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n\t\t</g>\n\t</svg>\n);\n","import {\n\tcreateFileURL,\n\tgenerateFileID as generateFileIDPrimitive,\n\ttype FileOrFileMeta,\n\ttype FileValidationErrorContextEach,\n} from \"@zayne-labs/toolkit-core\";\nimport { isFile, isObject, isString } from \"@zayne-labs/toolkit-type-helpers\";\nimport type { FileState, FileStateOrIDProp, PartProps } from \"./types\";\n\nexport const generateFileID = generateFileIDPrimitive;\n\nexport const createObjectURL = (\n\tfile: FileOrFileMeta,\n\tdisallowPreviewForNonImageFiles: boolean | undefined\n) => {\n\tif (disallowPreviewForNonImageFiles && !file.type?.startsWith(\"image/\")) return;\n\n\treturn createFileURL(file);\n};\n\nexport const clearObjectURL = (\n\tfileState: FileState | undefined,\n\tdisallowPreviewForNonImageFiles: boolean | undefined\n) => {\n\tif (!isFile(fileState?.file)) return;\n\n\tif (disallowPreviewForNonImageFiles && !fileState.file.type.startsWith(\"image/\")) return;\n\n\tif (!fileState.preview) return;\n\n\tURL.revokeObjectURL(fileState.preview);\n};\n\nexport const isMatchingFile = (\n\toptions: FileStateOrIDProp & {\n\t\tfileState: FileOrFileMeta | FileState;\n\t}\n) => {\n\tconst { fileState, fileStateOrID } = options;\n\n\tconst fileID = isFile(fileState) ? generateFileID(fileState) : fileState.id;\n\n\tif (isString(fileStateOrID)) {\n\t\treturn fileID === fileStateOrID;\n\t}\n\n\tif (isFile(fileStateOrID)) {\n\t\tconst generatedFileID = generateFileID(fileStateOrID);\n\t\treturn fileID === generatedFileID;\n\t}\n\n\treturn fileID === fileStateOrID.id;\n};\n\ntype FromCamelToKebabCase<TString extends string> =\n\tTString extends `${infer First}${infer Rest}` ?\n\t\tFirst extends Uppercase<First> ?\n\t\t\t`-${Lowercase<First>}${FromCamelToKebabCase<Rest>}`\n\t\t:\t`${First}${FromCamelToKebabCase<Rest>}`\n\t:\t\"\";\n\nexport const getDropZoneScopeAttrs = (part: FromCamelToKebabCase<keyof PartProps>) => {\n\treturn {\n\t\t/* eslint-disable perfectionist/sort-objects -- I need this order to be maintained */\n\t\t\"data-slot\": `dropzone-${part}`,\n\t\t\"data-scope\": \"dropzone\",\n\t\t\"data-part\": part,\n\t\t/* eslint-enable perfectionist/sort-objects -- I need this order to be maintained */\n\t} as const;\n};\n\nconst dropZoneErrorSymbol = Symbol(\"DropZoneError\");\n\nexport class DropZoneError extends Error {\n\treadonly dropZoneErrorSymbol = dropZoneErrorSymbol;\n\tfile?: FileValidationErrorContextEach[\"file\"];\n\toverride name = \"DropZoneError\" as const;\n\n\tconstructor(\n\t\tctx: Pick<FileValidationErrorContextEach, \"message\"> & {\n\t\t\tfile?: FileValidationErrorContextEach[\"file\"];\n\t\t},\n\t\terrorOptions?: ErrorOptions\n\t) {\n\t\tconst { file, message } = ctx;\n\n\t\tsuper(message, errorOptions);\n\n\t\tthis.file = file;\n\t}\n\n\tstatic override isError(error: unknown): error is DropZoneError {\n\t\tif (!isObject<DropZoneError>(error)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (error instanceof DropZoneError) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst actualError = error as DropZoneError;\n\n\t\treturn (\n\t\t\tactualError.dropZoneErrorSymbol === dropZoneErrorSymbol\n\t\t\t// eslint-disable-next-line ts-eslint/no-unnecessary-condition -- Allow\n\t\t\t&& actualError.name === \"DropZoneError\"\n\t\t);\n\t}\n}\n\nexport const getErrorContext = (error: DropZoneError | Error): NonNullable<FileState[\"error\"]> => {\n\tif (DropZoneError.isError(error)) {\n\t\treturn {\n\t\t\tcause: \"custom-error\",\n\t\t\tcode: \"upload-error\",\n\t\t\tfile: error.file ?? ({} as never),\n\t\t\tmessage: error.message,\n\t\t\toriginalError: error.cause ?? error,\n\t\t};\n\t}\n\n\tconst actualError = Error.isError(error) ? error : new Error(\"File upload failed\", { cause: error });\n\n\treturn {\n\t\tcause: \"custom-error\",\n\t\tcode: \"upload-error\",\n\t\tfile: isFile(actualError.cause) ? actualError.cause : ({} as never),\n\t\tmessage: Error.isError(error) ? actualError.message : String(actualError),\n\t\toriginalError: actualError,\n\t};\n};\n","import { createStore, handleFileValidationAsync, toArray } from \"@zayne-labs/toolkit-core\";\nimport type { DropZoneState, DropZoneStore, UseDropZoneProps } from \"./types\";\nimport { clearObjectURL, createObjectURL, generateFileID, getErrorContext, isMatchingFile } from \"./utils\";\n\ntype RequiredUseDropZoneProps = {\n\t[Key in keyof Required<UseDropZoneProps>]: UseDropZoneProps[Key] | undefined;\n};\n\ntype StoreContext = Pick<\n\tRequiredUseDropZoneProps,\n\t| \"allowedFileTypes\"\n\t| \"disablePreviewGenForNonImageFiles\"\n\t| \"initialFiles\"\n\t| \"maxFileCount\"\n\t| \"maxFileSize\"\n\t| \"multiple\"\n\t| \"onFilesChange\"\n\t| \"onUpload\"\n\t| \"onValidationError\"\n\t| \"onValidationSuccess\"\n\t| \"rejectDuplicateFiles\"\n\t| \"validator\"\n>;\n\nexport const createDropZoneStore = (storeContext: StoreContext) => {\n\tconst {\n\t\tallowedFileTypes,\n\t\tdisablePreviewGenForNonImageFiles,\n\t\tinitialFiles,\n\t\tmaxFileCount,\n\t\tmaxFileSize,\n\t\tmultiple,\n\t\tonFilesChange,\n\t\tonUpload,\n\t\tonValidationError,\n\t\tonValidationSuccess,\n\t\trejectDuplicateFiles,\n\t\tvalidator,\n\t} = storeContext;\n\n\tconst inputRef: React.RefObject<HTMLInputElement | null> = { current: null };\n\n\tconst initialFileArray = toArray(initialFiles).filter(Boolean);\n\n\tconst clearInputValue = () => {\n\t\tif (!inputRef.current) return;\n\n\t\tinputRef.current.value = \"\";\n\t};\n\n\tconst initFileStateArray: DropZoneState[\"fileStateArray\"] = initialFileArray.map((fileMeta) => ({\n\t\tfile: fileMeta,\n\t\tid: fileMeta.id,\n\t\tpreview: fileMeta.url,\n\t\tprogress: 0,\n\t\tstatus: \"idle\",\n\t}));\n\n\tconst store = createStore<DropZoneStore>((set, get) => ({\n\t\tdisabled: false,\n\t\terrors: [],\n\t\tfileStateArray: initFileStateArray,\n\t\tisDraggingOver: false,\n\t\tisInvalid: false,\n\n\t\t// eslint-disable-next-line perfectionist/sort-objects -- ignore\n\t\tactions: {\n\t\t\taddFiles: async (files) => {\n\t\t\t\tif (!files || files.length === 0) {\n\t\t\t\t\tconsole.warn(\"No file selected!\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst { actions, fileStateArray: existingFileStateArray } = get();\n\n\t\t\t\t// == In single file mode, only use the first file\n\t\t\t\tconst resolvedNewFiles = !multiple ? [files[0]] : files;\n\n\t\t\t\tconst { errors, validFiles } = await handleFileValidationAsync({\n\t\t\t\t\texistingFiles: existingFileStateArray.map((fileWithPreview) => fileWithPreview.file),\n\t\t\t\t\thooks: {\n\t\t\t\t\t\tonErrorEach: onValidationError,\n\t\t\t\t\t\tonSuccessBatch: onValidationSuccess,\n\t\t\t\t\t},\n\t\t\t\t\tnewFiles: resolvedNewFiles,\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\tallowedFileTypes,\n\t\t\t\t\t\tmaxFileCount,\n\t\t\t\t\t\tmaxFileSize,\n\t\t\t\t\t\trejectDuplicateFiles,\n\t\t\t\t\t\tvalidator,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tif (validFiles.length === 0) {\n\t\t\t\t\tset({ errors, isDraggingOver: false });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst newFileStateArray: DropZoneState[\"fileStateArray\"] = validFiles.map((file) => ({\n\t\t\t\t\tfile,\n\t\t\t\t\tid: generateFileID(file),\n\t\t\t\t\tpreview: createObjectURL(file, disablePreviewGenForNonImageFiles),\n\t\t\t\t\tprogress: 0,\n\t\t\t\t\tstatus: \"idle\",\n\t\t\t\t}));\n\n\t\t\t\tconst resolvedFileStateArray =\n\t\t\t\t\t!multiple ? newFileStateArray : [...existingFileStateArray, ...newFileStateArray];\n\n\t\t\t\tset(\n\t\t\t\t\t{\n\t\t\t\t\t\terrors,\n\t\t\t\t\t\tfileStateArray: resolvedFileStateArray,\n\t\t\t\t\t\tisDraggingOver: false,\n\t\t\t\t\t},\n\t\t\t\t\t{ shouldNotifySync: true }\n\t\t\t\t);\n\n\t\t\t\tawait actions.handleFileUpload({ newFileStateArray });\n\t\t\t},\n\t\t\tclearErrors: () => {\n\t\t\t\tset({ errors: [], isInvalid: false });\n\t\t\t},\n\n\t\t\tclearFiles: () => {\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tactions.clearObjectURLs();\n\n\t\t\t\tset({ errors: [], fileStateArray: [], isInvalid: false });\n\t\t\t},\n\n\t\t\tclearObjectURLs: () => {\n\t\t\t\tconst { fileStateArray } = get();\n\n\t\t\t\tfor (const fileState of fileStateArray) {\n\t\t\t\t\tclearObjectURL(fileState, disablePreviewGenForNonImageFiles);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\thandleChange: async (event) => {\n\t\t\t\tconst fileList = event.target.files;\n\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tawait actions.addFiles(fileList);\n\n\t\t\t\tclearInputValue();\n\t\t\t},\n\n\t\t\thandleDragEnter: (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tset({ isDraggingOver: true });\n\t\t\t},\n\n\t\t\thandleDragLeave: (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tset({ isDraggingOver: false });\n\t\t\t},\n\n\t\t\thandleDragOver: (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t},\n\n\t\t\thandleDrop: async (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tconst fileList = event.dataTransfer.files;\n\n\t\t\t\tawait actions.addFiles(fileList);\n\t\t\t},\n\n\t\t\thandleFileUpload: async (context) => {\n\t\t\t\tconst { newFileStateArray } = context;\n\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tif (!onUpload) {\n\t\t\t\t\tfor (const fileState of newFileStateArray) {\n\t\t\t\t\t\tactions.updateFileState({ fileStateOrID: fileState, progress: 100, status: \"success\" });\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait onUpload({\n\t\t\t\t\t\tfileStateArray: newFileStateArray,\n\t\t\t\t\t\tonError: (ctx) => {\n\t\t\t\t\t\t\tconst { error, fileStateOrID } = ctx;\n\n\t\t\t\t\t\t\tconst errorContext = getErrorContext(error);\n\n\t\t\t\t\t\t\tactions.updateFileState({ error: errorContext, fileStateOrID, status: \"error\" });\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonProgress: (ctx) => {\n\t\t\t\t\t\t\tconst { fileStateOrID, progress } = ctx;\n\n\t\t\t\t\t\t\tactions.updateFileState({ fileStateOrID, progress });\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonSuccess: (ctx) => {\n\t\t\t\t\t\t\tconst { fileStateOrID } = ctx;\n\n\t\t\t\t\t\t\tactions.updateFileState({ fileStateOrID, progress: 100, status: \"success\" });\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\t// == Handle Errors ==\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst errorContext = getErrorContext(error as Error);\n\n\t\t\t\t\tfor (const fileState of newFileStateArray) {\n\t\t\t\t\t\tactions.updateFileState({\n\t\t\t\t\t\t\terror: errorContext,\n\t\t\t\t\t\t\tfileStateOrID: fileState,\n\t\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\thandleKeyDown: (event) => {\n\t\t\t\tconst isEnterKey = event.key === \"Enter\";\n\t\t\t\tconst isSpaceKey = event.key === \" \";\n\n\t\t\t\tconst isAllowedKey = isEnterKey || isSpaceKey;\n\n\t\t\t\tif (!isAllowedKey) return;\n\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tactions.openFilePicker();\n\t\t\t},\n\n\t\t\thandlePaste: async (event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst { actions } = get();\n\n\t\t\t\tconst fileList = event.clipboardData.files;\n\n\t\t\t\tawait actions.addFiles(fileList);\n\t\t\t},\n\n\t\t\topenFilePicker: () => {\n\t\t\t\tinputRef.current?.click();\n\t\t\t},\n\n\t\t\tremoveFile: (ctx) => {\n\t\t\t\tconst { fileStateOrID } = ctx;\n\n\t\t\t\tconst { fileStateArray } = get();\n\n\t\t\t\tconst updatedFileStateArray = fileStateArray.filter((fileState) => {\n\t\t\t\t\tif (!isMatchingFile({ fileState, fileStateOrID })) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tclearObjectURL(fileState, disablePreviewGenForNonImageFiles);\n\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\n\t\t\t\tset({ errors: [], fileStateArray: updatedFileStateArray });\n\t\t\t},\n\n\t\t\tsetInputRef: (element) => {\n\t\t\t\tinputRef.current = element;\n\t\t\t},\n\n\t\t\tupdateFileState: (ctx) => {\n\t\t\t\tconst { fileStateOrID, ...updatedFileState } = ctx;\n\n\t\t\t\tconst { fileStateArray } = get();\n\n\t\t\t\tconst updatedFileStateArray: DropZoneState[\"fileStateArray\"] = fileStateArray.map(\n\t\t\t\t\t(fileState) => {\n\t\t\t\t\t\tif (!isMatchingFile({ fileState, fileStateOrID })) {\n\t\t\t\t\t\t\treturn fileState;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...fileState,\n\t\t\t\t\t\t\t...updatedFileState,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tset({ fileStateArray: updatedFileStateArray }, { shouldNotifySync: true });\n\t\t\t},\n\t\t},\n\t}));\n\n\t// == File change subscription\n\tstore.subscribe.withSelector(\n\t\t(state) => state.fileStateArray,\n\t\t(fileStateArray) => {\n\t\t\tonFilesChange?.({ fileStateArray });\n\t\t}\n\t);\n\n\t// == Set `isInvalid` to true if there are errors\n\tstore.subscribe.withSelector(\n\t\t(state) => state.errors,\n\t\t(errors) => {\n\t\t\tif (errors.length === 0) return;\n\n\t\t\tstore.setState({ isInvalid: true });\n\n\t\t\t// == Reset to false after 1.5 seconds\n\t\t\tsetTimeout(() => store.setState({ isInvalid: false }), 1500);\n\t\t}\n\t);\n\n\treturn store;\n};\n","import { dataAttr } from \"@zayne-labs/toolkit-core\";\nimport { useCallbackRef, useCompareValue, useStore, useUnmountEffect } from \"@zayne-labs/toolkit-react\";\nimport { composeRefs, composeTwoEventHandlers } from \"@zayne-labs/toolkit-react/utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport { createDropZoneStore } from \"./drop-zone-store\";\nimport type { DropZonePropGetters, UseDropZoneProps, UseDropZoneResult } from \"./types\";\nimport { getDropZoneScopeAttrs } from \"./utils\";\n\nexport const useDropZone = (props?: UseDropZoneProps): UseDropZoneResult => {\n\tconst {\n\t\tallowedFileTypes,\n\t\tdisabled = false,\n\t\tdisableFilePickerOpenOnAreaClick = false,\n\t\tdisableInternalStateSubscription = false,\n\t\tdisablePreviewGenForNonImageFiles = true,\n\t\tinitialFiles,\n\t\tmaxFileCount,\n\t\tmaxFileSize,\n\t\tmultiple,\n\t\tonFilesChange,\n\t\tonUpload,\n\t\tonValidationError,\n\t\tonValidationSuccess,\n\t\trejectDuplicateFiles = true,\n\t\tunstyled: globalUnstyled = false,\n\t\tvalidator,\n\t} = props ?? {};\n\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\n\tconst stableOnFilesChange = useCallbackRef(onFilesChange);\n\tconst stableOnUpload = useCallbackRef(onUpload);\n\tconst stableOnUploadError = useCallbackRef(onValidationError);\n\tconst stableOnUploadSuccess = useCallbackRef(onValidationSuccess);\n\tconst stableValidator = useCallbackRef(validator);\n\n\tconst shallowComparedInitialFiles = useCompareValue(initialFiles);\n\tconst shallowComparedMaxFileSize = useCompareValue(maxFileSize);\n\tconst shallowComparedAllowedFileTypes = useCompareValue(allowedFileTypes);\n\n\tconst storeApi = useMemo(() => {\n\t\treturn createDropZoneStore({\n\t\t\tallowedFileTypes: shallowComparedAllowedFileTypes,\n\t\t\tdisablePreviewGenForNonImageFiles,\n\t\t\tinitialFiles: shallowComparedInitialFiles,\n\t\t\tmaxFileCount,\n\t\t\tmaxFileSize: shallowComparedMaxFileSize,\n\t\t\tmultiple,\n\t\t\tonFilesChange: stableOnFilesChange,\n\t\t\tonUpload: stableOnUpload,\n\t\t\tonValidationError: stableOnUploadError,\n\t\t\tonValidationSuccess: stableOnUploadSuccess,\n\t\t\trejectDuplicateFiles,\n\t\t\tvalidator: stableValidator,\n\t\t});\n\t}, [\n\t\tshallowComparedAllowedFileTypes,\n\t\tdisablePreviewGenForNonImageFiles,\n\t\tshallowComparedInitialFiles,\n\t\tmaxFileCount,\n\t\tshallowComparedMaxFileSize,\n\t\tmultiple,\n\t\tstableOnFilesChange,\n\t\tstableOnUpload,\n\t\tstableOnUploadError,\n\t\tstableOnUploadSuccess,\n\t\trejectDuplicateFiles,\n\t\tstableValidator,\n\t]);\n\n\tconst actions = storeApi.getState().actions;\n\n\tuseUnmountEffect(() => {\n\t\tactions.clearObjectURLs();\n\t});\n\n\t/* eslint-disable react-hooks/hooks -- ignore */\n\t// eslint-disable-next-line react-x/component-hook-factories -- ignore\n\tconst useDropZoneStore: UseDropZoneResult[\"useDropZoneStore\"] = (selector) => {\n\t\treturn useStore(storeApi as never, selector);\n\t};\n\n\tconst isDraggingOver = useDropZoneStore((state) =>\n\t\t!disableInternalStateSubscription ? state.isDraggingOver : null\n\t);\n\n\tconst isInvalid = useDropZoneStore((state) =>\n\t\t!disableInternalStateSubscription ? state.isInvalid : null\n\t);\n\t/* eslint-enable react-hooks/hooks -- ignore */\n\n\tconst getContainerProps: DropZonePropGetters[\"getContainerProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { unstyled = globalUnstyled, ...restOfInnerProps } = innerProps;\n\n\t\t\tconst isDisabled = disabled;\n\t\t\tconst onFileDrop = !isDisabled ? actions.handleDrop : undefined;\n\t\t\tconst onFilePaste = !isDisabled ? actions.handlePaste : undefined;\n\t\t\tconst tabIndex = !isDisabled ? 0 : undefined;\n\t\t\tconst onAreaClick =\n\t\t\t\t!isDisabled && !disableFilePickerOpenOnAreaClick ? actions.openFilePicker : undefined;\n\t\t\tconst onKeyDown =\n\t\t\t\t!isDisabled && !disableFilePickerOpenOnAreaClick ? actions.handleKeyDown : undefined;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"container\"),\n\t\t\t\trole: \"region\",\n\t\t\t\t...(!disableInternalStateSubscription && {\n\t\t\t\t\t\"data-drag-over\": dataAttr(isDraggingOver),\n\t\t\t\t\t\"data-invalid\": dataAttr(isInvalid),\n\t\t\t\t}),\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\n\t\t\t\t\t\t`relative flex flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-6 transition-colors duration-250 ease-out outline-none select-none focus-visible:border-zu-ring/50`,\n\t\t\t\t\t\t`data-disabled:pointer-events-none data-drag-over:opacity-60 data-invalid:border-zu-destructive data-invalid:ring-zu-destructive/20`,\n\t\t\t\t\t\tinnerProps.className\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\t\tonClick: composeTwoEventHandlers(onAreaClick, innerProps.onClick),\n\t\t\t\tonDragEnter: composeTwoEventHandlers(actions.handleDragEnter, innerProps.onDragEnter),\n\t\t\t\tonDragLeave: composeTwoEventHandlers(actions.handleDragLeave, innerProps.onDragLeave),\n\t\t\t\tonDragOver: composeTwoEventHandlers(actions.handleDragOver, innerProps.onDragOver),\n\t\t\t\tonDrop: composeTwoEventHandlers(onFileDrop, innerProps.onDrop),\n\t\t\t\tonKeyDown: composeTwoEventHandlers(onKeyDown, innerProps.onKeyDown),\n\t\t\t\tonPaste: composeTwoEventHandlers(onFilePaste, innerProps.onPaste),\n\t\t\t\ttabIndex,\n\t\t\t};\n\t\t},\n\t\t[\n\t\t\tglobalUnstyled,\n\t\t\tdisabled,\n\t\t\tactions.handleDrop,\n\t\t\tactions.handlePaste,\n\t\t\tactions.openFilePicker,\n\t\t\tactions.handleKeyDown,\n\t\t\tactions.handleDragEnter,\n\t\t\tactions.handleDragLeave,\n\t\t\tactions.handleDragOver,\n\t\t\tdisableFilePickerOpenOnAreaClick,\n\t\t\tdisableInternalStateSubscription,\n\t\t\tisDraggingOver,\n\t\t\tisInvalid,\n\t\t]\n\t);\n\n\tconst refCallback: React.RefCallback<HTMLInputElement> = useCallbackRef((node) => {\n\t\tinputRef.current = node;\n\t\tactions.setInputRef(node);\n\t});\n\n\tconst getInputProps: DropZonePropGetters[\"getInputProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst isDisabled = innerProps.disabled ?? disabled;\n\n\t\t\tconst onFileChange = !isDisabled ? actions.handleChange : undefined;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"input\"),\n\t\t\t\t...(!disableInternalStateSubscription && { \"data-drag-over\": dataAttr(isDraggingOver) }),\n\t\t\t\t...innerProps,\n\t\t\t\taccept: allowedFileTypes ? allowedFileTypes.join(\", \") : innerProps.accept,\n\t\t\t\tclassName: cnMerge(\"hidden\", innerProps.className),\n\t\t\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\t\tdisabled: isDisabled,\n\t\t\t\tmultiple: multiple ?? innerProps.multiple,\n\t\t\t\tonChange: composeTwoEventHandlers(onFileChange, innerProps.onChange),\n\t\t\t\tref: composeRefs(refCallback, innerProps.ref),\n\t\t\t\ttype: \"file\",\n\t\t\t};\n\t\t},\n\t\t[\n\t\t\tactions.handleChange,\n\t\t\tallowedFileTypes,\n\t\t\tdisableInternalStateSubscription,\n\t\t\tdisabled,\n\t\t\tisDraggingOver,\n\t\t\tmultiple,\n\t\t\trefCallback,\n\t\t]\n\t);\n\n\tconst getTriggerProps: DropZonePropGetters[\"getTriggerProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst isDisabled = innerProps.disabled ?? disabled;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"trigger\"),\n\t\t\t\ttype: \"button\",\n\t\t\t\t...innerProps,\n\t\t\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\t\tdisabled: isDisabled,\n\t\t\t\tonClick: composeTwoEventHandlers(actions.openFilePicker, innerProps.onClick),\n\t\t\t};\n\t\t},\n\t\t[actions.openFilePicker, disabled]\n\t);\n\n\tconst getFileListProps: DropZonePropGetters[\"getFileListProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { orientation = \"vertical\", unstyled = globalUnstyled, ...restOfInnerProps } = innerProps;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-list\"),\n\t\t\t\t\"data-orientation\": orientation,\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\n\t\t\t\t\t\t\"flex flex-col gap-2\",\n\t\t\t\t\t\torientation === \"horizontal\" && \"flex-row overflow-x-auto p-1.5\",\n\t\t\t\t\t\tinnerProps.className\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\t[globalUnstyled]\n\t);\n\n\tconst getFileItemProps: DropZonePropGetters[\"getFileItemProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { unstyled = globalUnstyled, ...restOfInnerProps } = innerProps;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item\"),\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\n\t\t\t\t\t\t\"relative flex animate-files-in items-center gap-2.5 rounded-md border p-2\",\n\t\t\t\t\t\tinnerProps.className\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\t[globalUnstyled]\n\t);\n\n\tconst getFileItemProgressProps: DropZonePropGetters[\"getFileItemProgressProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { unstyled = globalUnstyled, variant = \"linear\", ...restOfInnerProps } = innerProps;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item-progress\"),\n\t\t\t\trole: \"progressbar\",\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\n\t\t\t\t\t\t\"inline-flex\",\n\t\t\t\t\t\tvariant === \"circular\" && \"absolute top-1/2 left-1/2 -translate-1/2\",\n\t\t\t\t\t\tvariant === \"fill\" && `absolute inset-0`,\n\t\t\t\t\t\tvariant === \"linear\"\n\t\t\t\t\t\t\t&& \"relative h-1.5 w-full overflow-hidden rounded-full bg-zu-primary/20\",\n\t\t\t\t\t\trestOfInnerProps.className\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\t[globalUnstyled]\n\t);\n\n\tconst getFileItemDeleteProps: DropZonePropGetters[\"getFileItemDeleteProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { fileStateOrID, ...restOfInnerProps } = innerProps;\n\n\t\t\tconst isDisabled = innerProps.disabled ?? disabled;\n\n\t\t\tconst onRemoveFile = () => fileStateOrID && actions.removeFile({ fileStateOrID });\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item-delete\"),\n\t\t\t\ttype: \"button\",\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\t\tdisabled: isDisabled,\n\t\t\t\tonClick: composeTwoEventHandlers(onRemoveFile, restOfInnerProps.onClick),\n\t\t\t};\n\t\t},\n\t\t[actions, disabled]\n\t);\n\n\tconst getFileItemPreviewProps: DropZonePropGetters[\"getFileItemPreviewProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { unstyled = globalUnstyled, ...restOfInnerProps } = innerProps;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item-preview\"),\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\n\t\t\t\t\t\t`relative flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-md bg-zu-accent/50 [&>svg]:size-10`,\n\t\t\t\t\t\tinnerProps.className\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\t[globalUnstyled]\n\t);\n\n\tconst getFileItemMetadataProps: DropZonePropGetters[\"getFileItemMetadataProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst { unstyled = globalUnstyled, ...restOfInnerProps } = innerProps;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item-metadata\"),\n\t\t\t\t...restOfInnerProps,\n\t\t\t\t...(!unstyled && {\n\t\t\t\t\tclassName: cnMerge(\"flex min-w-0 grow flex-col\", innerProps.className),\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\t[globalUnstyled]\n\t);\n\n\tconst getFileItemClearProps: DropZonePropGetters[\"getFileItemClearProps\"] = useCallback(\n\t\t(innerProps) => {\n\t\t\tconst isDisabled = innerProps.disabled ?? disabled;\n\n\t\t\treturn {\n\t\t\t\t...getDropZoneScopeAttrs(\"file-item-clear\"),\n\t\t\t\ttype: \"button\",\n\t\t\t\t...innerProps,\n\t\t\t\t\"data-disabled\": dataAttr(isDisabled),\n\t\t\t\tdisabled: isDisabled,\n\t\t\t\tonClick: composeTwoEventHandlers(actions.clearFiles, innerProps.onClick),\n\t\t\t};\n\t\t},\n\t\t[actions.clearFiles, disabled]\n\t);\n\n\tconst propGetters = useMemo<DropZonePropGetters>(\n\t\t() =>\n\t\t\t({\n\t\t\t\tgetContainerProps,\n\t\t\t\tgetFileItemClearProps,\n\t\t\t\tgetFileItemDeleteProps,\n\t\t\t\tgetFileItemMetadataProps,\n\t\t\t\tgetFileItemPreviewProps,\n\t\t\t\tgetFileItemProgressProps,\n\t\t\t\tgetFileItemProps,\n\t\t\t\tgetFileListProps,\n\t\t\t\tgetInputProps,\n\t\t\t\tgetTriggerProps,\n\t\t\t}) satisfies DropZonePropGetters,\n\t\t[\n\t\t\tgetContainerProps,\n\t\t\tgetFileListProps,\n\t\t\tgetFileItemClearProps,\n\t\t\tgetFileItemDeleteProps,\n\t\t\tgetFileItemMetadataProps,\n\t\t\tgetFileItemPreviewProps,\n\t\t\tgetFileItemProgressProps,\n\t\t\tgetFileItemProps,\n\t\t\tgetInputProps,\n\t\t\tgetTriggerProps,\n\t\t]\n\t);\n\n\tconst stableUseDropZoneStore = useCallbackRef(useDropZoneStore);\n\n\tconst result = useMemo<UseDropZoneResult>(\n\t\t() =>\n\t\t\t({\n\t\t\t\tdisabled,\n\t\t\t\tdisableInternalStateSubscription,\n\t\t\t\tinputRef,\n\t\t\t\tpropGetters,\n\t\t\t\tstoreApi,\n\t\t\t\tuseDropZoneStore: stableUseDropZoneStore,\n\t\t\t}) satisfies UseDropZoneResult,\n\t\t[disabled, disableInternalStateSubscription, propGetters, storeApi, stableUseDropZoneStore]\n\t);\n\n\treturn result;\n};\n","\"use client\";\n\nimport { dataAttr, formatBytes } from \"@zayne-labs/toolkit-core\";\nimport { useCompareSelector } from \"@zayne-labs/toolkit-react\";\nimport type {\n\tCssWithCustomProperties,\n\tInferProps,\n\tPolymorphicPropsStrict,\n} from \"@zayne-labs/toolkit-react/utils\";\nimport {\n\tisBoolean,\n\tisFunction,\n\tisNumber,\n\ttype AnyFunction,\n\ttype SelectorFn,\n\ttype UnionDiscriminator,\n\ttype UnionToIntersection,\n} from \"@zayne-labs/toolkit-type-helpers\";\nimport { useMemo } from \"react\";\nimport { For } from \"@/components/common/for\";\nimport { Presence } from \"@/components/common/presence\";\nimport { Slot } from \"@/components/common/slot\";\nimport { Switch } from \"@/components/common/switch\";\nimport { cnMerge } from \"@/lib/utils/cn\";\nimport {\n\tDropZoneRootContextProvider,\n\tDropZoneStoreContextProvider,\n\tFileItemContextProvider,\n\tuseDropZoneRootContext,\n\tuseDropZoneStoreContext,\n\tuseFileItemContext,\n\ttype DropZoneRootContextType,\n\ttype FileItemContextType,\n} from \"./drop-zone-context\";\nimport {\n\tFileArchiveIcon,\n\tFileAudioIcon,\n\tFileCodeIcon,\n\tFileCogIcon,\n\tFileIcon,\n\tFileTextIcon,\n\tFileVideoIcon,\n} from \"./icons\";\nimport type { DropZoneStore, PartInputProps, UseDropZoneProps } from \"./types\";\nimport { useDropZone } from \"./use-drop-zone\";\n\nexport type DropZoneRootProps = UseDropZoneProps & {\n\tchildren: React.ReactNode;\n};\n\nexport function DropZoneRoot(props: DropZoneRootProps) {\n\tconst { children, ...restOfProps } = props;\n\n\tconst { disabled, disableInternalStateSubscription, inputRef, propGetters, storeApi } =\n\t\tuseDropZone(restOfProps);\n\n\tconst rootContextValue = useMemo<DropZoneRootContextType>(\n\t\t() =>\n\t\t\t({\n\t\t\t\tdisabled,\n\t\t\t\tdisableInternalStateSubscription,\n\t\t\t\tinputRef,\n\t\t\t\tpropGetters,\n\t\t\t}) satisfies DropZoneRootContextType,\n\t\t[disableInternalStateSubscription, disabled, inputRef, propGetters]\n\t);\n\n\treturn (\n\t\t<DropZoneStoreContextProvider store={storeApi}>\n\t\t\t<DropZoneRootContextProvider value={rootContextValue}>{children}</DropZoneRootContextProvider>\n\t\t</DropZoneStoreContextProvider>\n\t);\n}\n\nexport type DropZoneContextProps<TSlice> = {\n\tchildren: React.ReactNode | ((context: TSlice) => React.ReactNode);\n\tselector?: SelectorFn<DropZoneStore, TSlice>;\n};\n\nexport function DropZoneContext<TSlice = DropZoneStore>(props: DropZoneContextProps<TSlice>) {\n\tconst { children, selector } = props;\n\n\tconst dropZoneCtx = useDropZoneStoreContext(useCompareSelector(selector));\n\n\tconst resolvedChildren = isFunction(children) ? children(dropZoneCtx) : children;\n\n\treturn resolvedChildren;\n}\n\n/* eslint-disable perfectionist/sort-intersection-types -- I need non-standard props to come first */\n\nexport type DropZoneContainerProps = {\n\tasChild?: boolean;\n} & PartInputProps[\"container\"];\n\nexport function DropZoneContainer<TElement extends React.ElementType = \"div\">(\n\tprops: PolymorphicPropsStrict<TElement, DropZoneContainerProps>\n) {\n\tconst { as: Element = \"div\", asChild, ...restOfProps } = props;\n\n\tconst { disableInternalStateSubscription, propGetters } = useDropZoneRootContext();\n\n\tconst isDraggingOver = useDropZoneStoreContext((store) =>\n\t\tdisableInternalStateSubscription ? store.isDraggingOver : null\n\t);\n\n\tconst isInvalid = useDropZoneStoreContext((store) =>\n\t\tdisableInternalStateSubscription ? store.isInvalid : null\n\t);\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\treturn (\n\t\t<Component\n\t\t\t{...propGetters.getContainerProps({\n\t\t\t\t...(disableInternalStateSubscription && {\n\t\t\t\t\t\"data-drag-over\": dataAttr(isDraggingOver),\n\t\t\t\t\t\"data-invalid\": dataAttr(isInvalid),\n\t\t\t\t}),\n\t\t\t\t...restOfProps,\n\t\t\t})}\n\t\t/>\n\t);\n}\n\nexport type DropZoneInputProps = {\n\tasChild?: boolean;\n} & PartInputProps[\"input\"];\n\nexport function DropZoneInput(props: DropZoneInputProps) {\n\tconst { asChild, ...restOfProps } = props;\n\n\tconst { disableInternalStateSubscription, propGetters } = useDropZoneRootContext();\n\n\tconst isDraggingOver = useDropZoneStoreContext((store) =>\n\t\tdisableInternalStateSubscription ? store.isDraggingOver : null\n\t);\n\n\tconst Component = asChild ? Slot.Root : \"input\";\n\n\treturn (\n\t\t<Component\n\t\t\t{...propGetters.getInputProps({\n\t\t\t\t...(disableInternalStateSubscription && { \"data-drag-over\": dataAttr(isDraggingOver) }),\n\t\t\t\t...restOfProps,\n\t\t\t})}\n\t\t/>\n\t);\n}\n\nexport type DropZoneAreaProps<TSlice = DropZoneStore> = DropZoneContextProps<TSlice> & {\n\tclassNames?: Partial<Record<Extract<keyof PartInputProps, \"container\" | \"input\">, string>>;\n\textraProps?: Partial<Pick<PartInputProps, \"container\" | \"input\">>;\n} & PartInputProps[\"container\"];\n\nexport function DropZoneArea<TSlice = DropZoneStore>(props: DropZoneAreaProps<TSlice>) {\n\tconst { children, className, classNames, extraProps, selector, ...restOfProps } = props;\n\n\treturn (\n\t\t<DropZoneContainer\n\t\t\t{...extraProps?.container}\n\t\t\t{...restOfProps}\n\t\t\tclassName={cnMerge(extraProps?.container?.className, className, classNames?.container)}\n\t\t>\n\t\t\t<DropZoneInput\n\t\t\t\t{...extraProps?.input}\n\t\t\t\tclassName={cnMerge(extraProps?.input?.className, classNames?.input)}\n\t\t\t/>\n\n\t\t\t<DropZoneContext selector={selector}>{children}</DropZoneContext>\n\t\t</DropZoneContainer>\n\t);\n}\n\nexport type DropZoneTriggerProps = {\n\tasChild?: boolean;\n} & PartInputProps[\"trigger\"];\n\nexport function DropZoneTrigger(props: DropZoneTriggerProps) {\n\tconst { asChild, ...restOfProps } = props;\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst Component = asChild ? Slot.Root : \"button\";\n\n\treturn <Component {...propGetters.getTriggerProps(restOfProps)} />;\n}\n\ntype ListPerItemContext = Pick<DropZoneStore, \"actions\"> & {\n\tarray: DropZoneStore[\"fileStateArray\"];\n\tfileState: DropZoneStore[\"fileStateArray\"][number];\n\tindex: number;\n};\n\ntype FileListPerItemVariant = {\n\tchildren: React.ReactNode | ((context: ListPerItemContext) => React.ReactNode);\n\trenderMode?: \"per-item\";\n};\n\ntype ListManualListContext = Pick<DropZoneStore, \"actions\" | \"fileStateArray\">;\n\ntype FileListManualListVariant = {\n\tchildren: React.ReactNode | ((context: ListManualListContext) => React.ReactNode);\n\trenderMode: \"manual-list\";\n};\n\nexport type DropZoneFileListProps = {\n\tasChild?: boolean;\n\tforceMount?: boolean;\n} & (FileListManualListVariant | FileListPerItemVariant)\n\t& Omit<PartInputProps[\"fileList\"], \"children\">;\n\nexport function DropZoneFileList<TElement extends React.ElementType = \"ul\">(\n\tprops: PolymorphicPropsStrict<TElement, DropZoneFileListProps>\n) {\n\tconst {\n\t\tas: Element = \"ul\",\n\t\tasChild,\n\t\tchildren,\n\t\tforceMount = false,\n\t\trenderMode = \"per-item\",\n\t\t...restOfProps\n\t} = props;\n\n\tconst fileStateArray = useDropZoneStoreContext((store) => store.fileStateArray);\n\tconst actions = useDropZoneStoreContext((store) => store.actions);\n\n\tconst { disableInternalStateSubscription, propGetters } = useDropZoneRootContext();\n\n\tconst childrenMap = {\n\t\t\"manual-list\": () => {\n\t\t\tconst childrenFn = children as Extract<FileListManualListVariant[\"children\"], AnyFunction>;\n\t\t\treturn childrenFn({ actions, fileStateArray });\n\t\t},\n\t\t\"per-item\": () => {\n\t\t\tconst childrenFn = children as Extract<FileListPerItemVariant[\"children\"], AnyFunction>;\n\n\t\t\treturn (\n\t\t\t\t<For\n\t\t\t\t\teach={fileStateArray}\n\t\t\t\t\trenderItem={(fileState, index, array) => childrenFn({ actions, array, fileState, index })}\n\t\t\t\t/>\n\t\t\t);\n\t\t},\n\t} satisfies Record<typeof renderMode, () => React.ReactNode>;\n\n\tconst hasFiles = fileStateArray.length > 0;\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\treturn (\n\t\t<Presence present={hasFiles} forceMount={forceMount}>\n\t\t\t<Component\n\t\t\t\t{...propGetters.getFileListProps({\n\t\t\t\t\t...(disableInternalStateSubscription && { \"data-state\": hasFiles ? \"active\" : \"inactive\" }),\n\t\t\t\t\t...restOfProps,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{isFunction(children) ? childrenMap[renderMode]() : children}\n\t\t\t</Component>\n\t\t</Presence>\n\t);\n}\n\nexport type DropZoneFileItemProps = FileItemContextType & {\n\tasChild?: boolean;\n} & PartInputProps[\"fileItem\"];\n\nexport function DropZoneFileItem<TElement extends React.ElementType = \"li\">(\n\tprops: PolymorphicPropsStrict<TElement, DropZoneFileItemProps>\n) {\n\tconst { as: Element = \"li\", asChild, fileState, ...restOfProps } = props;\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\tconst contextValue = useMemo<FileItemContextType>(\n\t\t() => ({ fileState }) satisfies FileItemContextType,\n\t\t[fileState]\n\t);\n\n\treturn (\n\t\t<FileItemContextProvider value={contextValue}>\n\t\t\t<Component {...propGetters.getFileItemProps(restOfProps)} />\n\t\t</FileItemContextProvider>\n\t);\n}\n\nexport type DropZoneFileItemDeleteProps = {\n\tasChild?: boolean;\n} & PartInputProps[\"fileItemDelete\"];\n\nexport function DropZoneFileItemDelete(props: DropZoneFileItemDeleteProps) {\n\tconst { asChild, fileStateOrID, ...restOfProps } = props;\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst fileItemContextValue = useFileItemContext();\n\n\tconst Component = asChild ? Slot.Root : \"button\";\n\n\tconst resolvedFileStateOrID = fileStateOrID ?? fileItemContextValue?.fileState;\n\n\treturn (\n\t\t<Component\n\t\t\t{...propGetters.getFileItemDeleteProps({ fileStateOrID: resolvedFileStateOrID, ...restOfProps })}\n\t\t/>\n\t);\n}\n\ntype StrictExtract<TUnion, TPick extends TUnion> = Extract<TUnion, TPick>;\n\nexport type DropZoneFileItemProgressProps = {\n\tasChild?: boolean;\n\tforceMount?: boolean;\n\tsize?: number;\n} & PartInputProps[\"fileItemProgress\"]\n\t& (\n\t\t| {\n\t\t\t\tclassNames?: { svgCircleOne?: string; svgCircleTwo?: string; svgRoot?: string };\n\t\t\t\tvariant: StrictExtract<PartInputProps[\"fileItemProgress\"][\"variant\"], \"circular\">;\n\t\t }\n\t\t| {\n\t\t\t\tclassNames?: { track?: string };\n\t\t\t\tvariant: StrictExtract<PartInputProps[\"fileItemProgress\"][\"variant\"], \"fill\">;\n\t\t }\n\t\t| {\n\t\t\t\tclassNames?: { track?: string };\n\t\t\t\tvariant?: StrictExtract<PartInputProps[\"fileItemProgress\"][\"variant\"], \"linear\">;\n\t\t }\n\t);\n\nexport function DropZoneFileItemProgress<TElement extends React.ElementType = \"span\">(\n\tprops: PolymorphicPropsStrict<TElement, DropZoneFileItemProgressProps>\n) {\n\tconst {\n\t\tas: Element = \"span\",\n\t\tasChild,\n\t\tclassName,\n\t\tclassNames: classNamesProp,\n\t\tforceMount = false,\n\t\tsize = 40,\n\t\tvariant = \"linear\",\n\t\t...restOfProps\n\t} = props;\n\n\tconst classNames = classNamesProp as\n\t\t| UnionToIntersection<NonNullable<typeof classNamesProp>>\n\t\t| undefined;\n\n\tconst fileItemContextValue = useFileItemContext();\n\n\tconst fileState = fileItemContextValue?.fileState;\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tif (!fileState) {\n\t\treturn null;\n\t}\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\tconst componentProps = propGetters.getFileItemProgressProps({ variant, ...restOfProps });\n\n\treturn (\n\t\t<Presence\n\t\t\tpresent={fileState.progress !== 100}\n\t\t\tforceMount={forceMount}\n\t\t\tclassName=\"data-[animation-phase=exit]:animate-progress-out\"\n\t\t>\n\t\t\t<Component className={cnMerge(\"inline-block\", className)} {...componentProps}>\n\t\t\t\t<Switch.Root>\n\t\t\t\t\t<Switch.Match when={variant === \"circular\"}>\n\t\t\t\t\t\t{() => {\n\t\t\t\t\t\t\tconst circumference = 2 * Math.PI * ((size - 4) / 2);\n\t\t\t\t\t\t\tconst strokeDashoffset = circumference - (fileState.progress / 100) * circumference;\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\tclassName={cnMerge(\"-rotate-90\", classNames?.svgRoot)}\n\t\t\t\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\t\t\t\theight={size}\n\t\t\t\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\t\t\tclassName={cnMerge(\"text-zu-primary/20\", classNames?.svgCircleOne)}\n\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\tcx={size / 2}\n\t\t\t\t\t\t\t\t\t\tcy={size / 2}\n\t\t\t\t\t\t\t\t\t\tr={(size - 4) / 2}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\t\t\t\t\t\"text-zu-primary transition-[stroke-dashoffset] duration-300 ease-linear\",\n\t\t\t\t\t\t\t\t\t\t\tclassNames?.svgCircleTwo\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstrokeDasharray={2 * Math.PI * ((size - 4) / 2)}\n\t\t\t\t\t\t\t\t\t\tstrokeDashoffset={strokeDashoffset}\n\t\t\t\t\t\t\t\t\t\tcx={size / 2}\n\t\t\t\t\t\t\t\t\t\tcy={size / 2}\n\t\t\t\t\t\t\t\t\t\tr={(size - 4) / 2}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t</Switch.Match>\n\t\t\t\t\t<Switch.Match when={variant === \"fill\"}>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\t\t`size-full bg-zu-primary/50 transition-[clip-path] duration-300 ease-linear\n\t\t\t\t\t\t\t\t[clip-path:var(--clip-path)]`,\n\t\t\t\t\t\t\t\tclassNames?.track\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"--clip-path\": `inset(${100 - fileState.progress}% 0% 0% 0%)`,\n\t\t\t\t\t\t\t\t} satisfies CssWithCustomProperties as CssWithCustomProperties\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Switch.Match>\n\t\t\t\t\t<Switch.Match when={variant === \"linear\"}>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\t\t`inline-block size-full grow translate-x-(--translate-distance) bg-zu-primary\n\t\t\t\t\t\t\t\ttransition-transform duration-300 ease-linear`,\n\t\t\t\t\t\t\t\tclassNames?.track\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"--translate-distance\": `-${100 - fileState.progress}%`,\n\t\t\t\t\t\t\t\t} satisfies CssWithCustomProperties as CssWithCustomProperties\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Switch.Match>\n\t\t\t\t</Switch.Root>\n\t\t\t</Component>\n\t\t</Presence>\n\t);\n}\n\ntype NodeCtx<TElement extends React.ElementType> = {\n\tgetProps: (innerProps: Partial<InferProps<TElement>>) => InferProps<TElement>;\n};\n\ntype RenderPreviewDetails<TElement extends React.ElementType = \"svg\"> = UnionDiscriminator<\n\t[\n\t\t{ props: InferProps<TElement> },\n\t\t{ node: React.ReactNode | ((ctx: NodeCtx<TElement>) => React.ReactNode) },\n\t]\n>;\n\ntype RenderPropContext = Pick<FileItemContextType, \"fileState\"> & {\n\tfileExtension: string;\n\tfileType: string;\n};\n\ntype RenderPreviewObject = {\n\tarchive?: RenderPreviewDetails;\n\taudio?: RenderPreviewDetails;\n\tcode?: RenderPreviewDetails;\n\tdefault?: RenderPreviewDetails;\n\texecutable?: RenderPreviewDetails;\n\timage?: RenderPreviewDetails<\"img\">;\n\ttext?: RenderPreviewDetails;\n\tvideo?: RenderPreviewDetails;\n};\ntype RenderPreviewFn = (context: RenderPropContext) => RenderPreviewObject;\n\ntype RenderPreview = RenderPreviewFn | RenderPreviewObject;\n\nexport type DropZoneFileItemPreviewProps = Partial<Pick<FileItemContextType, \"fileState\">> & {\n\tasChild?: boolean;\n\tchildren?:\n\t\t| React.ReactNode\n\t\t| ((context: RenderPropContext & { fallbackPreview: () => React.ReactNode }) => React.ReactNode);\n\trenderPreview?: boolean | RenderPreview;\n} & Omit<PartInputProps[\"fileItemPreview\"], \"children\">;\n\nexport function DropZoneFileItemPreview<TElement extends React.ElementType>(\n\tprops: PolymorphicPropsStrict<TElement, DropZoneFileItemPreviewProps>\n) {\n\tconst {\n\t\tas: Element = \"span\",\n\t\tasChild,\n\t\tchildren,\n\t\tfileState: fileStateProp,\n\t\trenderPreview = true,\n\t\t...restOfProps\n\t} = props;\n\n\tconst fileItemContextValue = useFileItemContext();\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst fileState = fileStateProp ?? fileItemContextValue?.fileState;\n\n\tif (!fileState) {\n\t\treturn null;\n\t}\n\n\tconst fileType = fileState.file.type ?? \"\";\n\n\tconst fileExtension = fileState.file.name?.split(\".\").pop()?.toLowerCase() ?? \"\";\n\n\tconst Component = asChild ? Slot.Root : Element;\n\n\tconst fallbackPreview = () =>\n\t\tgetFilePreviewOrIcon({ fileExtension, fileState, fileType, renderPreview });\n\n\tconst resolvedChildren =\n\t\tisFunction(children) ? children({ fallbackPreview, fileExtension, fileState, fileType }) : children;\n\n\treturn (\n\t\t<Component {...propGetters.getFileItemPreviewProps(restOfProps)}>\n\t\t\t{renderPreview && fallbackPreview()}\n\t\t\t{resolvedChildren}\n\t\t</Component>\n\t);\n}\n\nconst resolvePreviewNode = <\n\tTPreviewDetail extends NonNullable<RenderPreviewObject[keyof RenderPreviewObject]>,\n\tTNodeFn extends Extract<TPreviewDetail[\"node\"], AnyFunction>,\n>(\n\tdetails: TPreviewDetail | undefined,\n\tgetProps: Parameters<TNodeFn>[0][\"getProps\"] = ((props: unknown) => props) as never\n) => {\n\tconst resolvedNode =\n\t\tisFunction(details?.node) ? details.node({ getProps: getProps as never }) : details?.node;\n\n\treturn resolvedNode;\n};\n\nconst getFilePreviewOrIcon = (\n\tcontext: Pick<Required<DropZoneFileItemPreviewProps>, \"renderPreview\"> & Required<RenderPropContext>\n): React.ReactNode => {\n\tconst { fileExtension, fileState, fileType, renderPreview } = context;\n\n\tconst renderPreviewValue = isBoolean(renderPreview) ? {} : renderPreview;\n\n\tconst resolvedRenderPreviewObject =\n\t\tisFunction(renderPreviewValue) ?\n\t\t\trenderPreviewValue({ fileExtension, fileState, fileType })\n\t\t:\trenderPreviewValue;\n\n\tswitch (true) {\n\t\tcase fileType.startsWith(\"image/\"): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.image, (innerProps) => ({\n\t\t\t\t...innerProps,\n\t\t\t\talt: innerProps.alt ?? fileState.file.name ?? \"\",\n\t\t\t\tclassName: cnMerge(\"size-full object-cover\", innerProps.className),\n\t\t\t\tsrc: innerProps.src ?? fileState.preview,\n\t\t\t}));\n\n\t\t\treturn (\n\t\t\t\tresolvedNode ?? (\n\t\t\t\t\t<img\n\t\t\t\t\t\t{...resolvedRenderPreviewObject.image?.props}\n\t\t\t\t\t\tsrc={fileState.preview}\n\t\t\t\t\t\talt={fileState.file.name ?? \"\"}\n\t\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\t\"size-full object-cover\",\n\t\t\t\t\t\t\tresolvedRenderPreviewObject.image?.props?.className\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tcase fileType.startsWith(\"video/\"): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.video, (innerProps) => ({\n\t\t\t\t...innerProps,\n\t\t\t\tclassName: cnMerge(\"size-full object-cover\", innerProps.className),\n\t\t\t}));\n\n\t\t\treturn (\n\t\t\t\tresolvedNode ?? (\n\t\t\t\t\t<FileVideoIcon\n\t\t\t\t\t\t{...resolvedRenderPreviewObject.video?.props}\n\t\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\t\"size-full object-cover\",\n\t\t\t\t\t\t\tresolvedRenderPreviewObject.video?.props?.className\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tcase fileType.startsWith(\"audio/\"): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.audio, (innerProps) => ({\n\t\t\t\t...innerProps,\n\t\t\t\tclassName: cnMerge(\"size-full object-cover\", innerProps.className),\n\t\t\t}));\n\n\t\t\treturn (\n\t\t\t\tresolvedNode ?? (\n\t\t\t\t\t<FileAudioIcon\n\t\t\t\t\t\t{...resolvedRenderPreviewObject.audio?.props}\n\t\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\t\"size-full object-cover\",\n\t\t\t\t\t\t\tresolvedRenderPreviewObject.audio?.props?.className\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tcase fileType.startsWith(\"text/\") || [\"md\", \"pdf\", \"rtf\", \"txt\"].includes(fileExtension): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.text);\n\n\t\t\treturn resolvedNode ?? <FileTextIcon {...resolvedRenderPreviewObject.text?.props} />;\n\t\t}\n\n\t\tcase [\n\t\t\t\"c\",\n\t\t\t\"cpp\",\n\t\t\t\"cs\",\n\t\t\t\"css\",\n\t\t\t\"html\",\n\t\t\t\"java\",\n\t\t\t\"js\",\n\t\t\t\"json\",\n\t\t\t\"jsx\",\n\t\t\t\"php\",\n\t\t\t\"py\",\n\t\t\t\"rb\",\n\t\t\t\"ts\",\n\t\t\t\"tsx\",\n\t\t\t\"xml\",\n\t\t].includes(fileExtension): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.code);\n\n\t\t\treturn resolvedNode ?? <FileCodeIcon {...resolvedRenderPreviewObject.code?.props} />;\n\t\t}\n\n\t\tcase [\"7z\", \"bz2\", \"gz\", \"rar\", \"tar\", \"zip\"].includes(fileExtension): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.archive);\n\n\t\t\treturn resolvedNode ?? <FileArchiveIcon {...resolvedRenderPreviewObject.archive?.props} />;\n\t\t}\n\n\t\tcase [\"apk\", \"app\", \"deb\", \"exe\", \"msi\", \"rpm\"].includes(fileExtension): {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.executable);\n\n\t\t\treturn resolvedNode ?? <FileCogIcon {...resolvedRenderPreviewObject.executable?.props} />;\n\t\t}\n\n\t\tdefault: {\n\t\t\tconst resolvedNode = resolvePreviewNode(resolvedRenderPreviewObject.default);\n\n\t\t\treturn resolvedNode ?? <FileIcon {...resolvedRenderPreviewObject.default?.props} />;\n\t\t}\n\t}\n};\n\nexport type DropZoneFileItemMetadataProps = Partial<Pick<FileItemContextType, \"fileState\">> & {\n\tasChild?: boolean;\n\tchildren?: React.ReactNode | ((context: Pick<FileItemContextType, \"fileState\">) => React.ReactNode);\n\tclassNames?: {\n\t\tname?: string;\n\t\tsize?: string;\n\t};\n\tsize?: \"default\" | \"sm\";\n} & Omit<PartInputProps[\"fileItemMetadata\"], \"children\">;\n\nexport function DropZoneFileItemMetadata(props: DropZoneFileItemMetadataProps) {\n\tconst {\n\t\tasChild,\n\t\tchildren,\n\t\tclassNames,\n\t\tfileState: fileStateProp,\n\t\tsize = \"default\",\n\t\t...restOfProps\n\t} = props;\n\n\tconst fileItemContextValue = useFileItemContext();\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst fileState = fileStateProp ?? fileItemContextValue?.fileState;\n\n\tif (!fileState) {\n\t\treturn null;\n\t}\n\n\tconst Component = asChild ? Slot.Root : \"div\";\n\n\tconst resolvedChildren = isFunction(children) ? children({ fileState }) : children;\n\n\tconst getDefaultMetadataChildren = () => {\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<p\n\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\"truncate\",\n\t\t\t\t\t\tsize === \"default\" && \"text-[14px] font-medium\",\n\t\t\t\t\t\tsize === \"sm\" && \"text-[13px] leading-snug\",\n\t\t\t\t\t\tclassNames?.name\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{fileState.file.name}\n\t\t\t\t</p>\n\t\t\t\t<p\n\t\t\t\t\tclassName={cnMerge(\n\t\t\t\t\t\t\"truncate text-zu-muted-foreground\",\n\t\t\t\t\t\tsize === \"default\" && \"text-[12px]\",\n\t\t\t\t\t\tsize === \"sm\" && \"text-[11px] leading-snug\",\n\t\t\t\t\t\tclassNames?.size\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{isNumber(fileState.file.size) && formatBytes(fileState.file.size)}\n\t\t\t\t</p>\n\t\t\t\t{fileState.error && (\n\t\t\t\t\t<p className=\"text-[12px] text-zu-destructive\">{fileState.error.message}</p>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Component {...propGetters.getFileItemMetadataProps(restOfProps)}>\n\t\t\t{resolvedChildren ?? getDefaultMetadataChildren()}\n\t\t</Component>\n\t);\n}\n\nexport type DropZoneFileClearProps = {\n\tasChild?: boolean;\n\tforceMount?: boolean;\n} & PartInputProps[\"fileItemClear\"];\n\nexport function DropZoneFileClear(props: DropZoneFileClearProps) {\n\tconst { asChild, forceMount = false, ...restOfProps } = props;\n\n\tconst { propGetters } = useDropZoneRootContext();\n\n\tconst fileCount = useDropZoneStoreContext((state) => state.fileStateArray.length);\n\n\tconst shouldRender = forceMount || fileCount > 0;\n\n\tif (!shouldRender) {\n\t\treturn null;\n\t}\n\n\tconst Component = asChild ? Slot.Root : \"button\";\n\n\treturn <Component {...propGetters.getFileItemClearProps(restOfProps)} />;\n}\n\n/* eslint-enable perfectionist/sort-intersection-types -- I need non-standard props to come first */\n","export {\n\tDropZoneArea as Area,\n\tDropZoneContainer as Container,\n\tDropZoneContext as Context,\n\tDropZoneFileClear as FileClear,\n\tDropZoneFileItem as FileItem,\n\tDropZoneFileItemDelete as FileItemDelete,\n\tDropZoneFileItemMetadata as FileItemMetadata,\n\tDropZoneFileItemPreview as FileItemPreview,\n\tDropZoneFileItemProgress as FileItemProgress,\n\tDropZoneFileList as FileList,\n\tDropZoneInput as Input,\n\tDropZoneRoot as Root,\n\tDropZoneTrigger as Trigger,\n} from \"./drop-zone\";\n"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  import { t as __exportAll } from "../../chunk-pbuEa-1d.js";
3
3
  import { n as SlotRoot } from "../../slot-DuwoiC2C.js";
4
4
  import { r as ForWithWrapper } from "../../for-DGTMIS0w.js";
5
- import { t as cnMerge } from "../../cn-Bbh2G587.js";
5
+ import { t as cnMerge } from "../../cn-jNZfGhrk.js";
6
6
  import { composeRefs, composeTwoEventHandlers, getMultipleSlots } from "@zayne-labs/toolkit-react/utils";
7
7
  import { defineEnum, isObject } from "@zayne-labs/toolkit-type-helpers";
8
8
  import { Fragment, createElement, useEffect, useId, useMemo, useRef } from "react";
package/dist/style.css CHANGED
@@ -29,6 +29,7 @@
29
29
  --color-zu-ring: oklch(0.705 0.015 286.067);
30
30
  --animate-shake: shake 0.2s ease-in-out 0s 3;
31
31
  --animate-files-in: files-in 0.3s ease-out forwards;
32
+ --animate-progress-out: progress-out 0.3s ease-out forwards;
32
33
  }
33
34
  }
34
35
  @layer base {
@@ -683,6 +684,11 @@
683
684
  }
684
685
  }
685
686
  }
687
+ .data-\[animation-phase\=exit\]\:animate-progress-out {
688
+ &[data-animation-phase="exit"] {
689
+ animation: var(--animate-progress-out);
690
+ }
691
+ }
686
692
  .data-\[index\=0\]\:mt-1 {
687
693
  &[data-index="0"] {
688
694
  margin-top: calc(var(--spacing) * 1);
@@ -818,6 +824,16 @@
818
824
  transform: translateY(0);
819
825
  }
820
826
  }
827
+ @keyframes progress-out {
828
+ from {
829
+ opacity: 1;
830
+ transform: translateY(0);
831
+ }
832
+ to {
833
+ opacity: 0;
834
+ transform: translateY(-6px);
835
+ }
836
+ }
821
837
  @layer properties {
822
838
  @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {
823
839
  *, ::before, ::after, ::backdrop {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zayne-labs/ui-react",
3
3
  "type": "module",
4
- "version": "0.11.0",
4
+ "version": "0.11.2",
5
5
  "description": "A composable UI/UI-utilities components library. ",
6
6
  "author": "Ryan Zayne",
7
7
  "license": "MIT",
@@ -45,9 +45,9 @@
45
45
  }
46
46
  },
47
47
  "dependencies": {
48
- "@zayne-labs/toolkit-core": "0.12.45",
49
- "@zayne-labs/toolkit-react": "0.12.45",
50
- "@zayne-labs/toolkit-type-helpers": "0.12.45"
48
+ "@zayne-labs/toolkit-core": "0.12.46",
49
+ "@zayne-labs/toolkit-react": "0.12.46",
50
+ "@zayne-labs/toolkit-type-helpers": "0.12.46"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@arethetypeswrong/cli": "0.18.2",
@@ -72,7 +72,7 @@
72
72
  "size-limit": "12.0.1",
73
73
  "tailwind-merge": "3.5.0",
74
74
  "tailwindcss": "4.2.2",
75
- "tsdown": "0.21.4",
75
+ "tsdown": "0.21.5",
76
76
  "typescript": "6.0.2"
77
77
  },
78
78
  "publishConfig": {
@@ -87,7 +87,7 @@
87
87
  },
88
88
  {
89
89
  "path": "src/components/common/**/index.ts",
90
- "limit": "2 kb"
90
+ "limit": "4 kb"
91
91
  }
92
92
  ],
93
93
  "scripts": {