@muhgholy/next-drive 4.0.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,16 +17,16 @@ var formatBytes = (bytes, decimals = 2) => {
17
17
  const i = Math.floor(Math.log(bytes) / Math.log(k));
18
18
  return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
19
19
  };
20
- var getFileIcon = (mime, isFolder, className = "nd-w-6 nd-h-6") => {
21
- if (isFolder) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Folder, { className: cn("nd-text-blue-500 nd-fill-blue-500/20", className) });
22
- if (mime.startsWith("image/")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Image, { className: cn("nd-text-purple-500", className) });
23
- if (mime.startsWith("video/")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Video, { className: cn("nd-text-red-500", className) });
24
- if (mime.startsWith("audio/")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Music, { className: cn("nd-text-yellow-500", className) });
25
- if (mime === "application/pdf") return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: cn("nd-text-orange-500", className) });
26
- if (mime.includes("text") || mime.includes("document")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: cn("nd-text-slate-500", className) });
27
- if (mime.includes("zip") || mime.includes("compressed")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileArchive, { className: cn("nd-text-amber-500", className) });
28
- if (mime.includes("javascript") || mime.includes("typescript") || mime.includes("json") || mime.includes("html") || mime.includes("css")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileCode, { className: cn("nd-text-green-500", className) });
29
- return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.File, { className: cn("nd-text-gray-400", className) });
20
+ var getFileIcon = (mime, isFolder, className = "nd:w-6 nd:h-6") => {
21
+ if (isFolder) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Folder, { className: cn("nd:text-blue-500 nd:fill-blue-500/20", className) });
22
+ if (mime.startsWith("image/")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Image, { className: cn("nd:text-purple-500", className) });
23
+ if (mime.startsWith("video/")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Video, { className: cn("nd:text-red-500", className) });
24
+ if (mime.startsWith("audio/")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Music, { className: cn("nd:text-yellow-500", className) });
25
+ if (mime === "application/pdf") return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: cn("nd:text-orange-500", className) });
26
+ if (mime.includes("text") || mime.includes("document")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: cn("nd:text-slate-500", className) });
27
+ if (mime.includes("zip") || mime.includes("compressed")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileArchive, { className: cn("nd:text-amber-500", className) });
28
+ if (mime.includes("javascript") || mime.includes("typescript") || mime.includes("json") || mime.includes("html") || mime.includes("css")) return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileCode, { className: cn("nd:text-green-500", className) });
29
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.File, { className: cn("nd:text-gray-400", className) });
30
30
  };
31
31
  var matchesMimeFilter = (mime, isFolder, filter) => {
32
32
  if (!filter) return true;
@@ -127,5 +127,5 @@ exports.driveCreateUrl = driveCreateUrl;
127
127
  exports.formatBytes = formatBytes;
128
128
  exports.getFileIcon = getFileIcon;
129
129
  exports.matchesMimeFilter = matchesMimeFilter;
130
- //# sourceMappingURL=chunk-YOZO2DQ7.cjs.map
131
- //# sourceMappingURL=chunk-YOZO2DQ7.cjs.map
130
+ //# sourceMappingURL=chunk-CFLH4TCQ.cjs.map
131
+ //# sourceMappingURL=chunk-CFLH4TCQ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/utils.tsx"],"names":["twMerge","clsx","jsx","Folder","Image","Video","Music","FileText","FileArchive","FileCode","File"],"mappings":";;;;;;;;AAKO,SAAS,MAAM,MAAA,EAAsB;AACxC,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC/B;AAGO,IAAM,WAAA,GAAc,CAAC,KAAA,EAAe,QAAA,GAAW,CAAA,KAAc;AAChE,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,SAAA;AACxB,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,EAAA,GAAK,QAAA,GAAW,CAAA,GAAI,CAAA,GAAI,QAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AACtE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAClD,EAAA,OAAO,UAAA,CAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,EAAE,CAAC,CAAA,GAAI,GAAA,GAAM,MAAM,CAAC,CAAA;AAC3E;AAMO,IAAM,WAAA,GAAc,CAAC,IAAA,EAAc,QAAA,EAAmB,YAAY,eAAA,KAA+B;AACpG,EAAA,IAAI,QAAA,yBAAiBC,cAAA,CAACC,kBAAA,EAAA,EAAO,WAAW,EAAA,CAAG,sCAAA,EAAwC,SAAS,CAAA,EAAG,CAAA;AAC/F,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG,uBAAOD,cAAA,CAACE,iBAAA,EAAA,EAAM,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS,CAAA,EAAG,CAAA;AAC7F,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG,uBAAOF,cAAA,CAACG,iBAAA,EAAA,EAAM,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA,EAAG,CAAA;AAC1F,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG,uBAAOH,cAAA,CAACI,iBAAA,EAAA,EAAM,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS,CAAA,EAAG,CAAA;AAC7F,EAAA,IAAI,IAAA,KAAS,mBAAmB,uBAAOJ,cAAA,CAACK,wBAAS,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS,CAAA,EAAG,CAAA;AACjG,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,KAAK,QAAA,CAAS,UAAU,CAAA,EAAG,sCAAQA,oBAAA,EAAA,EAAS,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,SAAS,CAAA,EAAG,CAAA;AACxH,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,KAAK,QAAA,CAAS,YAAY,CAAA,EAAG,sCAAQC,uBAAA,EAAA,EAAY,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,SAAS,CAAA,EAAG,CAAA;AAC5H,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG,uBAAON,cAAA,CAACO,oBAAA,EAAA,EAAS,SAAA,EAAW,EAAA,CAAG,mBAAA,EAAqB,SAAS,CAAA,EAAG,CAAA;AAC1M,EAAA,sCAAQC,gBAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,kBAAA,EAAoB,SAAS,CAAA,EAAG,CAAA;AAC/D;AAIO,IAAM,iBAAA,GAAoB,CAAC,IAAA,EAAc,QAAA,EAAmB,MAAA,KAA6B;AAC5F,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI,UAAU,OAAO,IAAA;AACrB,EAAA,IAAI,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,GAAA,EAAK,OAAO,IAAA;AAE/C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAa,CAAA;AAC/D,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAEnC,EAAA,OAAO,KAAA,CAAM,KAAK,CAAA,IAAA,KAAQ;AAEtB,IAAA,IAAI,IAAA,KAAS,WAAW,OAAO,IAAA;AAG/B,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACrB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC/B,MAAA,OAAO,SAAA,CAAU,UAAA,CAAW,CAAA,EAAG,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACtB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAExB,MAAA,MAAM,UAAA,GAAuC;AAAA,QACzC,KAAA,EAAO,CAAC,YAAY,CAAA;AAAA,QACpB,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,QACrB,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,QACrB,KAAA,EAAO,CAAC,eAAe,CAAA;AAAA,QACvB,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,KAAA,EAAO,CAAC,cAAA,EAAgB,0BAA0B,CAAA;AAAA,QAClD,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,QACrB,KAAA,EAAO,CAAC,YAAY,CAAA;AAAA,QACpB,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,QACrB,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,QACrB,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,QACrB,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,QACrB,KAAA,EAAO,CAAC,iBAAiB,CAAA;AAAA,QACzB,KAAA,EAAO,CAAC,iBAAiB,CAAA;AAAA,QACzB,KAAA,EAAO,CAAC,kBAAkB,CAAA;AAAA,QAC1B,KAAA,EAAO,CAAC,gBAAgB,CAAA;AAAA,QACxB,KAAA,EAAO,CAAC,aAAa,CAAA;AAAA,QACrB,KAAA,EAAO,CAAC,YAAA,EAAc,WAAW,CAAA;AAAA,QACjC,KAAA,EAAO,CAAC,WAAA,EAAa,aAAa,CAAA;AAAA,QAClC,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,MAAA,EAAQ,CAAC,YAAY,CAAA;AAAA,QACrB,KAAA,EAAO,CAAC,WAAW,CAAA;AAAA,QACnB,KAAA,EAAO,CAAC,WAAA,EAAa,aAAa,CAAA;AAAA,QAClC,KAAA,EAAO,CAAC,iBAAiB,CAAA;AAAA,QACzB,KAAA,EAAO,CAAC,oBAAoB,CAAA;AAAA,QAC5B,MAAA,EAAQ,CAAC,yEAAyE,CAAA;AAAA,QAClF,KAAA,EAAO,CAAC,0BAA0B,CAAA;AAAA,QAClC,MAAA,EAAQ,CAAC,mEAAmE,CAAA;AAAA,QAC5E,KAAA,EAAO,CAAC,+BAA+B,CAAA;AAAA,QACvC,MAAA,EAAQ,CAAC,2EAA2E,CAAA;AAAA,QACpF,KAAA,EAAO,CAAC,YAAY,CAAA;AAAA,QACpB,KAAA,EAAO,CAAC,UAAU,CAAA;AAAA,QAClB,MAAA,EAAQ,CAAC,kBAAkB,CAAA;AAAA,QAC3B,KAAA,EAAO,CAAC,iBAAA,EAAmB,UAAU,CAAA;AAAA,QACrC,KAAA,EAAO,CAAC,iBAAA,EAAmB,8BAA8B,CAAA;AAAA,QACzD,KAAA,EAAO,CAAC,8BAAA,EAAgC,qBAAqB,CAAA;AAAA,QAC7D,IAAA,EAAM,CAAC,6BAA6B,CAAA;AAAA,QACpC,KAAA,EAAO,CAAC,mBAAmB,CAAA;AAAA,QAC3B,IAAA,EAAM,CAAC,kBAAkB;AAAA,OAC7B;AACA,MAAA,MAAM,YAAA,GAAe,WAAW,GAAG,CAAA;AACnC,MAAA,IAAI,YAAA,EAAc;AACd,QAAA,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,SAAA,KAAc,CAAC,CAAA;AAAA,MACjD;AAEA,MAAA,OAAO,SAAA,CAAU,SAAS,GAAG,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO,KAAA;AAAA,EACX,CAAC,CAAA;AACL;AAYO,IAAM,cAAA,GAAiB,CAC1B,SAAA,EACA,WAAA,EACA,OAAA,KACS;AACT,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,IAC/B,MAAA,EAAQ,OAAA;AAAA,IACR,IAAI,SAAA,CAAU;AAAA,GACjB,CAAA;AAED,EAAA,IAAI,SAAS,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,QAAQ,OAAO,CAAA;AACrD,EAAA,IAAI,SAAS,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AAExD,EAAA,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA;AAC9C;AAGO,IAAM,iBAAA,GAAoB,CAC7B,SAAA,EACA,WAAA,EACA,SAAuB,MAAA,KACa;AACpC,EAAA,MAAM,SAAA,GAA6B,CAAC,UAAA,EAAY,KAAA,EAAO,UAAU,MAAM,CAAA;AAGvE,EAAA,MAAM,eAAA,GAAiD;AAAA,IACnD,QAAA,EAAU,GAAA;AAAA,IACV,GAAA,EAAK,GAAA;AAAA,IACL,MAAA,EAAQ,GAAA;AAAA,IACR,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACZ;AAGA,EAAA,MAAM,MAAA,GAAS,SAAA,CACV,GAAA,CAAI,CAAA,OAAA,KAAW;AACZ,IAAA,MAAM,MAAM,cAAA,CAAe,SAAA,EAAW,aAAa,EAAE,OAAA,EAAS,QAAQ,CAAA;AACtE,IAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,eAAA,CAAgB,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,EAC7C,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAGd,EAAA,MAAM,KAAA,GAAQ,sFAAA;AAEd,EAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAC3B","file":"chunk-YOZO2DQ7.cjs","sourcesContent":["// ** Client Utils\nimport React from 'react';\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// ** Format bytes to human readable string\nexport const formatBytes = (bytes: number, decimals = 2): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n\nimport type { ReactNode } from 'react';\nimport { File, Folder, Image, Video, Music, FileText, Package, FileCode, FileArchive } from 'lucide-react';\n\n// ** Get file icon based on mime type\nexport const getFileIcon = (mime: string, isFolder: boolean, className = \"nd-w-6 nd-h-6\"): ReactNode => {\n if (isFolder) return <Folder className={cn(\"nd-text-blue-500 nd-fill-blue-500/20\", className)} />;\n if (mime.startsWith('image/')) return <Image className={cn(\"nd-text-purple-500\", className)} />;\n if (mime.startsWith('video/')) return <Video className={cn(\"nd-text-red-500\", className)} />;\n if (mime.startsWith('audio/')) return <Music className={cn(\"nd-text-yellow-500\", className)} />;\n if (mime === 'application/pdf') return <FileText className={cn(\"nd-text-orange-500\", className)} />;\n if (mime.includes('text') || mime.includes('document')) return <FileText className={cn(\"nd-text-slate-500\", className)} />;\n if (mime.includes('zip') || mime.includes('compressed')) return <FileArchive className={cn(\"nd-text-amber-500\", className)} />;\n if (mime.includes('javascript') || mime.includes('typescript') || mime.includes('json') || mime.includes('html') || mime.includes('css')) return <FileCode className={cn(\"nd-text-green-500\", className)} />;\n return <File className={cn(\"nd-text-gray-400\", className)} />;\n};\n\n// ** Check if file matches mime filter (supports native accept format)\n// Supports: \"image/*\", \"video/*\", \".pdf\", \".jpg,.png\", \"image/png,image/jpeg\", etc.\nexport const matchesMimeFilter = (mime: string, isFolder: boolean, filter?: string): boolean => {\n if (!filter) return true;\n if (isFolder) return true;\n if (filter === '*/*' || filter === '*') return true;\n\n const types = filter.split(',').map(t => t.trim().toLowerCase());\n const lowerMime = mime.toLowerCase();\n\n return types.some(type => {\n // Exact mime match: \"image/png\"\n if (type === lowerMime) return true;\n\n // Wildcard mime: \"image/*\"\n if (type.endsWith('/*')) {\n const prefix = type.slice(0, -2);\n return lowerMime.startsWith(`${prefix}/`);\n }\n\n // Extension format: \".pdf\", \".jpg\"\n if (type.startsWith('.')) {\n const ext = type.slice(1);\n // Map common extensions to mimes\n const extMimeMap: Record<string, string[]> = {\n 'jpg': ['image/jpeg'],\n 'jpeg': ['image/jpeg'],\n 'png': ['image/png'],\n 'gif': ['image/gif'],\n 'webp': ['image/webp'],\n 'svg': ['image/svg+xml'],\n 'bmp': ['image/bmp'],\n 'ico': ['image/x-icon', 'image/vnd.microsoft.icon'],\n 'tiff': ['image/tiff'],\n 'tif': ['image/tiff'],\n 'heic': ['image/heic'],\n 'heif': ['image/heif'],\n 'avif': ['image/avif'],\n 'mp4': ['video/mp4'],\n 'webm': ['video/webm'],\n 'mov': ['video/quicktime'],\n 'avi': ['video/x-msvideo'],\n 'mkv': ['video/x-matroska'],\n 'wmv': ['video/x-ms-wmv'],\n 'flv': ['video/x-flv'],\n 'mp3': ['audio/mpeg', 'audio/mp3'],\n 'wav': ['audio/wav', 'audio/x-wav'],\n 'ogg': ['audio/ogg'],\n 'flac': ['audio/flac'],\n 'aac': ['audio/aac'],\n 'm4a': ['audio/mp4', 'audio/x-m4a'],\n 'pdf': ['application/pdf'],\n 'doc': ['application/msword'],\n 'docx': ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n 'xls': ['application/vnd.ms-excel'],\n 'xlsx': ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n 'ppt': ['application/vnd.ms-powerpoint'],\n 'pptx': ['application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n 'txt': ['text/plain'],\n 'csv': ['text/csv'],\n 'json': ['application/json'],\n 'xml': ['application/xml', 'text/xml'],\n 'zip': ['application/zip', 'application/x-zip-compressed'],\n 'rar': ['application/x-rar-compressed', 'application/vnd.rar'],\n '7z': ['application/x-7z-compressed'],\n 'tar': ['application/x-tar'],\n 'gz': ['application/gzip'],\n };\n const allowedMimes = extMimeMap[ext];\n if (allowedMimes) {\n return allowedMimes.some(m => lowerMime === m);\n }\n // Fallback: check if mime ends with extension\n return lowerMime.includes(ext);\n }\n\n return false;\n });\n};\n\n// ** Get accept string for input element from filter\nexport const getAcceptString = (filter?: string): string | undefined => {\n if (!filter) return undefined;\n // Already in correct format for input accept\n return filter;\n};\n\nimport type { TDriveFile, TImageQuality, TImageFormat } from '@/types/client';\n\n// ** Create URL for drive file with optional quality and format\nexport const driveCreateUrl = (\n driveFile: TDriveFile,\n apiEndpoint: string,\n options?: { quality?: TImageQuality; format?: TImageFormat }\n): string => {\n const params = new URLSearchParams({\n action: 'serve',\n id: driveFile.id,\n });\n\n if (options?.quality) params.set('q', options.quality);\n if (options?.format) params.set('format', options.format);\n\n return `${apiEndpoint}?${params.toString()}`;\n};\n\n// ** Generate responsive image srcSet for drive file\nexport const driveCreateSrcSet = (\n driveFile: TDriveFile,\n apiEndpoint: string,\n format: TImageFormat = 'webp'\n): { srcSet: string; sizes: string } => {\n const qualities: TImageQuality[] = ['ultralow', 'low', 'medium', 'high'];\n\n // ** Quality to width mapping for srcSet\n const qualityWidthMap: Record<TImageQuality, number> = {\n ultralow: 200,\n low: 400,\n medium: 800,\n high: 1200,\n normal: 1600,\n };\n\n // ** Create srcSet for different qualities\n const srcSet = qualities\n .map(quality => {\n const url = driveCreateUrl(driveFile, apiEndpoint, { quality, format });\n return `${url} ${qualityWidthMap[quality]}w`;\n })\n .join(', ');\n\n // ** Default sizes attribute for responsive images\n const sizes = '(max-width: 320px) 200px, (max-width: 480px) 400px, (max-width: 768px) 800px, 1200px';\n\n return { srcSet, sizes };\n};\n"]}
1
+ {"version":3,"sources":["../src/client/utils.tsx"],"names":["twMerge","clsx","jsx","Folder","Image","Video","Music","FileText","FileArchive","FileCode","File"],"mappings":"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","file":"chunk-CFLH4TCQ.cjs","sourcesContent":["// ** Client Utils\nimport React from 'react';\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// ** Format bytes to human readable string\nexport const formatBytes = (bytes: number, decimals = 2): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n\nimport type { ReactNode } from 'react';\nimport { File, Folder, Image, Video, Music, FileText, Package, FileCode, FileArchive } from 'lucide-react';\n\n// ** Get file icon based on mime type\nexport const getFileIcon = (mime: string, isFolder: boolean, className = \"nd:w-6 nd:h-6\"): ReactNode => {\n if (isFolder) return <Folder className={cn(\"nd:text-blue-500 nd:fill-blue-500/20\", className)} />;\n if (mime.startsWith('image/')) return <Image className={cn(\"nd:text-purple-500\", className)} />;\n if (mime.startsWith('video/')) return <Video className={cn(\"nd:text-red-500\", className)} />;\n if (mime.startsWith('audio/')) return <Music className={cn(\"nd:text-yellow-500\", className)} />;\n if (mime === 'application/pdf') return <FileText className={cn(\"nd:text-orange-500\", className)} />;\n if (mime.includes('text') || mime.includes('document')) return <FileText className={cn(\"nd:text-slate-500\", className)} />;\n if (mime.includes('zip') || mime.includes('compressed')) return <FileArchive className={cn(\"nd:text-amber-500\", className)} />;\n if (mime.includes('javascript') || mime.includes('typescript') || mime.includes('json') || mime.includes('html') || mime.includes('css')) return <FileCode className={cn(\"nd:text-green-500\", className)} />;\n return <File className={cn(\"nd:text-gray-400\", className)} />;\n};\n\n// ** Check if file matches mime filter (supports native accept format)\n// Supports: \"image/*\", \"video/*\", \".pdf\", \".jpg,.png\", \"image/png,image/jpeg\", etc.\nexport const matchesMimeFilter = (mime: string, isFolder: boolean, filter?: string): boolean => {\n if (!filter) return true;\n if (isFolder) return true;\n if (filter === '*/*' || filter === '*') return true;\n\n const types = filter.split(',').map(t => t.trim().toLowerCase());\n const lowerMime = mime.toLowerCase();\n\n return types.some(type => {\n // Exact mime match: \"image/png\"\n if (type === lowerMime) return true;\n\n // Wildcard mime: \"image/*\"\n if (type.endsWith('/*')) {\n const prefix = type.slice(0, -2);\n return lowerMime.startsWith(`${prefix}/`);\n }\n\n // Extension format: \".pdf\", \".jpg\"\n if (type.startsWith('.')) {\n const ext = type.slice(1);\n // Map common extensions to mimes\n const extMimeMap: Record<string, string[]> = {\n 'jpg': ['image/jpeg'],\n 'jpeg': ['image/jpeg'],\n 'png': ['image/png'],\n 'gif': ['image/gif'],\n 'webp': ['image/webp'],\n 'svg': ['image/svg+xml'],\n 'bmp': ['image/bmp'],\n 'ico': ['image/x-icon', 'image/vnd.microsoft.icon'],\n 'tiff': ['image/tiff'],\n 'tif': ['image/tiff'],\n 'heic': ['image/heic'],\n 'heif': ['image/heif'],\n 'avif': ['image/avif'],\n 'mp4': ['video/mp4'],\n 'webm': ['video/webm'],\n 'mov': ['video/quicktime'],\n 'avi': ['video/x-msvideo'],\n 'mkv': ['video/x-matroska'],\n 'wmv': ['video/x-ms-wmv'],\n 'flv': ['video/x-flv'],\n 'mp3': ['audio/mpeg', 'audio/mp3'],\n 'wav': ['audio/wav', 'audio/x-wav'],\n 'ogg': ['audio/ogg'],\n 'flac': ['audio/flac'],\n 'aac': ['audio/aac'],\n 'm4a': ['audio/mp4', 'audio/x-m4a'],\n 'pdf': ['application/pdf'],\n 'doc': ['application/msword'],\n 'docx': ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n 'xls': ['application/vnd.ms-excel'],\n 'xlsx': ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n 'ppt': ['application/vnd.ms-powerpoint'],\n 'pptx': ['application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n 'txt': ['text/plain'],\n 'csv': ['text/csv'],\n 'json': ['application/json'],\n 'xml': ['application/xml', 'text/xml'],\n 'zip': ['application/zip', 'application/x-zip-compressed'],\n 'rar': ['application/x-rar-compressed', 'application/vnd.rar'],\n '7z': ['application/x-7z-compressed'],\n 'tar': ['application/x-tar'],\n 'gz': ['application/gzip'],\n };\n const allowedMimes = extMimeMap[ext];\n if (allowedMimes) {\n return allowedMimes.some(m => lowerMime === m);\n }\n // Fallback: check if mime ends with extension\n return lowerMime.includes(ext);\n }\n\n return false;\n });\n};\n\n// ** Get accept string for input element from filter\nexport const getAcceptString = (filter?: string): string | undefined => {\n if (!filter) return undefined;\n // Already in correct format for input accept\n return filter;\n};\n\nimport type { TDriveFile, TImageQuality, TImageFormat } from '@/types/client';\n\n// ** Create URL for drive file with optional quality and format\nexport const driveCreateUrl = (\n driveFile: TDriveFile,\n apiEndpoint: string,\n options?: { quality?: TImageQuality; format?: TImageFormat }\n): string => {\n const params = new URLSearchParams({\n action: 'serve',\n id: driveFile.id,\n });\n\n if (options?.quality) params.set('q', options.quality);\n if (options?.format) params.set('format', options.format);\n\n return `${apiEndpoint}?${params.toString()}`;\n};\n\n// ** Generate responsive image srcSet for drive file\nexport const driveCreateSrcSet = (\n driveFile: TDriveFile,\n apiEndpoint: string,\n format: TImageFormat = 'webp'\n): { srcSet: string; sizes: string } => {\n const qualities: TImageQuality[] = ['ultralow', 'low', 'medium', 'high'];\n\n // ** Quality to width mapping for srcSet\n const qualityWidthMap: Record<TImageQuality, number> = {\n ultralow: 200,\n low: 400,\n medium: 800,\n high: 1200,\n normal: 1600,\n };\n\n // ** Create srcSet for different qualities\n const srcSet = qualities\n .map(quality => {\n const url = driveCreateUrl(driveFile, apiEndpoint, { quality, format });\n return `${url} ${qualityWidthMap[quality]}w`;\n })\n .join(', ');\n\n // ** Default sizes attribute for responsive images\n const sizes = '(max-width: 320px) 200px, (max-width: 480px) 400px, (max-width: 768px) 800px, 1200px';\n\n return { srcSet, sizes };\n};\n"]}
@@ -15,16 +15,16 @@ var formatBytes = (bytes, decimals = 2) => {
15
15
  const i = Math.floor(Math.log(bytes) / Math.log(k));
16
16
  return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
17
17
  };
18
- var getFileIcon = (mime, isFolder, className = "nd-w-6 nd-h-6") => {
19
- if (isFolder) return /* @__PURE__ */ jsx(Folder, { className: cn("nd-text-blue-500 nd-fill-blue-500/20", className) });
20
- if (mime.startsWith("image/")) return /* @__PURE__ */ jsx(Image, { className: cn("nd-text-purple-500", className) });
21
- if (mime.startsWith("video/")) return /* @__PURE__ */ jsx(Video, { className: cn("nd-text-red-500", className) });
22
- if (mime.startsWith("audio/")) return /* @__PURE__ */ jsx(Music, { className: cn("nd-text-yellow-500", className) });
23
- if (mime === "application/pdf") return /* @__PURE__ */ jsx(FileText, { className: cn("nd-text-orange-500", className) });
24
- if (mime.includes("text") || mime.includes("document")) return /* @__PURE__ */ jsx(FileText, { className: cn("nd-text-slate-500", className) });
25
- if (mime.includes("zip") || mime.includes("compressed")) return /* @__PURE__ */ jsx(FileArchive, { className: cn("nd-text-amber-500", className) });
26
- if (mime.includes("javascript") || mime.includes("typescript") || mime.includes("json") || mime.includes("html") || mime.includes("css")) return /* @__PURE__ */ jsx(FileCode, { className: cn("nd-text-green-500", className) });
27
- return /* @__PURE__ */ jsx(File, { className: cn("nd-text-gray-400", className) });
18
+ var getFileIcon = (mime, isFolder, className = "nd:w-6 nd:h-6") => {
19
+ if (isFolder) return /* @__PURE__ */ jsx(Folder, { className: cn("nd:text-blue-500 nd:fill-blue-500/20", className) });
20
+ if (mime.startsWith("image/")) return /* @__PURE__ */ jsx(Image, { className: cn("nd:text-purple-500", className) });
21
+ if (mime.startsWith("video/")) return /* @__PURE__ */ jsx(Video, { className: cn("nd:text-red-500", className) });
22
+ if (mime.startsWith("audio/")) return /* @__PURE__ */ jsx(Music, { className: cn("nd:text-yellow-500", className) });
23
+ if (mime === "application/pdf") return /* @__PURE__ */ jsx(FileText, { className: cn("nd:text-orange-500", className) });
24
+ if (mime.includes("text") || mime.includes("document")) return /* @__PURE__ */ jsx(FileText, { className: cn("nd:text-slate-500", className) });
25
+ if (mime.includes("zip") || mime.includes("compressed")) return /* @__PURE__ */ jsx(FileArchive, { className: cn("nd:text-amber-500", className) });
26
+ if (mime.includes("javascript") || mime.includes("typescript") || mime.includes("json") || mime.includes("html") || mime.includes("css")) return /* @__PURE__ */ jsx(FileCode, { className: cn("nd:text-green-500", className) });
27
+ return /* @__PURE__ */ jsx(File, { className: cn("nd:text-gray-400", className) });
28
28
  };
29
29
  var matchesMimeFilter = (mime, isFolder, filter) => {
30
30
  if (!filter) return true;
@@ -120,5 +120,5 @@ var driveCreateSrcSet = (driveFile, apiEndpoint, format = "webp") => {
120
120
  };
121
121
 
122
122
  export { cn, driveCreateSrcSet, driveCreateUrl, formatBytes, getFileIcon, matchesMimeFilter };
123
- //# sourceMappingURL=chunk-6BBEPJMR.js.map
124
- //# sourceMappingURL=chunk-6BBEPJMR.js.map
123
+ //# sourceMappingURL=chunk-T43C7MQ6.js.map
124
+ //# sourceMappingURL=chunk-T43C7MQ6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/utils.tsx"],"names":[],"mappings":"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","file":"chunk-6BBEPJMR.js","sourcesContent":["// ** Client Utils\nimport React from 'react';\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// ** Format bytes to human readable string\nexport const formatBytes = (bytes: number, decimals = 2): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n\nimport type { ReactNode } from 'react';\nimport { File, Folder, Image, Video, Music, FileText, Package, FileCode, FileArchive } from 'lucide-react';\n\n// ** Get file icon based on mime type\nexport const getFileIcon = (mime: string, isFolder: boolean, className = \"nd-w-6 nd-h-6\"): ReactNode => {\n if (isFolder) return <Folder className={cn(\"nd-text-blue-500 nd-fill-blue-500/20\", className)} />;\n if (mime.startsWith('image/')) return <Image className={cn(\"nd-text-purple-500\", className)} />;\n if (mime.startsWith('video/')) return <Video className={cn(\"nd-text-red-500\", className)} />;\n if (mime.startsWith('audio/')) return <Music className={cn(\"nd-text-yellow-500\", className)} />;\n if (mime === 'application/pdf') return <FileText className={cn(\"nd-text-orange-500\", className)} />;\n if (mime.includes('text') || mime.includes('document')) return <FileText className={cn(\"nd-text-slate-500\", className)} />;\n if (mime.includes('zip') || mime.includes('compressed')) return <FileArchive className={cn(\"nd-text-amber-500\", className)} />;\n if (mime.includes('javascript') || mime.includes('typescript') || mime.includes('json') || mime.includes('html') || mime.includes('css')) return <FileCode className={cn(\"nd-text-green-500\", className)} />;\n return <File className={cn(\"nd-text-gray-400\", className)} />;\n};\n\n// ** Check if file matches mime filter (supports native accept format)\n// Supports: \"image/*\", \"video/*\", \".pdf\", \".jpg,.png\", \"image/png,image/jpeg\", etc.\nexport const matchesMimeFilter = (mime: string, isFolder: boolean, filter?: string): boolean => {\n if (!filter) return true;\n if (isFolder) return true;\n if (filter === '*/*' || filter === '*') return true;\n\n const types = filter.split(',').map(t => t.trim().toLowerCase());\n const lowerMime = mime.toLowerCase();\n\n return types.some(type => {\n // Exact mime match: \"image/png\"\n if (type === lowerMime) return true;\n\n // Wildcard mime: \"image/*\"\n if (type.endsWith('/*')) {\n const prefix = type.slice(0, -2);\n return lowerMime.startsWith(`${prefix}/`);\n }\n\n // Extension format: \".pdf\", \".jpg\"\n if (type.startsWith('.')) {\n const ext = type.slice(1);\n // Map common extensions to mimes\n const extMimeMap: Record<string, string[]> = {\n 'jpg': ['image/jpeg'],\n 'jpeg': ['image/jpeg'],\n 'png': ['image/png'],\n 'gif': ['image/gif'],\n 'webp': ['image/webp'],\n 'svg': ['image/svg+xml'],\n 'bmp': ['image/bmp'],\n 'ico': ['image/x-icon', 'image/vnd.microsoft.icon'],\n 'tiff': ['image/tiff'],\n 'tif': ['image/tiff'],\n 'heic': ['image/heic'],\n 'heif': ['image/heif'],\n 'avif': ['image/avif'],\n 'mp4': ['video/mp4'],\n 'webm': ['video/webm'],\n 'mov': ['video/quicktime'],\n 'avi': ['video/x-msvideo'],\n 'mkv': ['video/x-matroska'],\n 'wmv': ['video/x-ms-wmv'],\n 'flv': ['video/x-flv'],\n 'mp3': ['audio/mpeg', 'audio/mp3'],\n 'wav': ['audio/wav', 'audio/x-wav'],\n 'ogg': ['audio/ogg'],\n 'flac': ['audio/flac'],\n 'aac': ['audio/aac'],\n 'm4a': ['audio/mp4', 'audio/x-m4a'],\n 'pdf': ['application/pdf'],\n 'doc': ['application/msword'],\n 'docx': ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n 'xls': ['application/vnd.ms-excel'],\n 'xlsx': ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n 'ppt': ['application/vnd.ms-powerpoint'],\n 'pptx': ['application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n 'txt': ['text/plain'],\n 'csv': ['text/csv'],\n 'json': ['application/json'],\n 'xml': ['application/xml', 'text/xml'],\n 'zip': ['application/zip', 'application/x-zip-compressed'],\n 'rar': ['application/x-rar-compressed', 'application/vnd.rar'],\n '7z': ['application/x-7z-compressed'],\n 'tar': ['application/x-tar'],\n 'gz': ['application/gzip'],\n };\n const allowedMimes = extMimeMap[ext];\n if (allowedMimes) {\n return allowedMimes.some(m => lowerMime === m);\n }\n // Fallback: check if mime ends with extension\n return lowerMime.includes(ext);\n }\n\n return false;\n });\n};\n\n// ** Get accept string for input element from filter\nexport const getAcceptString = (filter?: string): string | undefined => {\n if (!filter) return undefined;\n // Already in correct format for input accept\n return filter;\n};\n\nimport type { TDriveFile, TImageQuality, TImageFormat } from '@/types/client';\n\n// ** Create URL for drive file with optional quality and format\nexport const driveCreateUrl = (\n driveFile: TDriveFile,\n apiEndpoint: string,\n options?: { quality?: TImageQuality; format?: TImageFormat }\n): string => {\n const params = new URLSearchParams({\n action: 'serve',\n id: driveFile.id,\n });\n\n if (options?.quality) params.set('q', options.quality);\n if (options?.format) params.set('format', options.format);\n\n return `${apiEndpoint}?${params.toString()}`;\n};\n\n// ** Generate responsive image srcSet for drive file\nexport const driveCreateSrcSet = (\n driveFile: TDriveFile,\n apiEndpoint: string,\n format: TImageFormat = 'webp'\n): { srcSet: string; sizes: string } => {\n const qualities: TImageQuality[] = ['ultralow', 'low', 'medium', 'high'];\n\n // ** Quality to width mapping for srcSet\n const qualityWidthMap: Record<TImageQuality, number> = {\n ultralow: 200,\n low: 400,\n medium: 800,\n high: 1200,\n normal: 1600,\n };\n\n // ** Create srcSet for different qualities\n const srcSet = qualities\n .map(quality => {\n const url = driveCreateUrl(driveFile, apiEndpoint, { quality, format });\n return `${url} ${qualityWidthMap[quality]}w`;\n })\n .join(', ');\n\n // ** Default sizes attribute for responsive images\n const sizes = '(max-width: 320px) 200px, (max-width: 480px) 400px, (max-width: 768px) 800px, 1200px';\n\n return { srcSet, sizes };\n};\n"]}
1
+ {"version":3,"sources":["../src/client/utils.tsx"],"names":[],"mappings":"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","file":"chunk-T43C7MQ6.js","sourcesContent":["// ** Client Utils\nimport React from 'react';\nimport { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// ** Format bytes to human readable string\nexport const formatBytes = (bytes: number, decimals = 2): string => {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n\nimport type { ReactNode } from 'react';\nimport { File, Folder, Image, Video, Music, FileText, Package, FileCode, FileArchive } from 'lucide-react';\n\n// ** Get file icon based on mime type\nexport const getFileIcon = (mime: string, isFolder: boolean, className = \"nd:w-6 nd:h-6\"): ReactNode => {\n if (isFolder) return <Folder className={cn(\"nd:text-blue-500 nd:fill-blue-500/20\", className)} />;\n if (mime.startsWith('image/')) return <Image className={cn(\"nd:text-purple-500\", className)} />;\n if (mime.startsWith('video/')) return <Video className={cn(\"nd:text-red-500\", className)} />;\n if (mime.startsWith('audio/')) return <Music className={cn(\"nd:text-yellow-500\", className)} />;\n if (mime === 'application/pdf') return <FileText className={cn(\"nd:text-orange-500\", className)} />;\n if (mime.includes('text') || mime.includes('document')) return <FileText className={cn(\"nd:text-slate-500\", className)} />;\n if (mime.includes('zip') || mime.includes('compressed')) return <FileArchive className={cn(\"nd:text-amber-500\", className)} />;\n if (mime.includes('javascript') || mime.includes('typescript') || mime.includes('json') || mime.includes('html') || mime.includes('css')) return <FileCode className={cn(\"nd:text-green-500\", className)} />;\n return <File className={cn(\"nd:text-gray-400\", className)} />;\n};\n\n// ** Check if file matches mime filter (supports native accept format)\n// Supports: \"image/*\", \"video/*\", \".pdf\", \".jpg,.png\", \"image/png,image/jpeg\", etc.\nexport const matchesMimeFilter = (mime: string, isFolder: boolean, filter?: string): boolean => {\n if (!filter) return true;\n if (isFolder) return true;\n if (filter === '*/*' || filter === '*') return true;\n\n const types = filter.split(',').map(t => t.trim().toLowerCase());\n const lowerMime = mime.toLowerCase();\n\n return types.some(type => {\n // Exact mime match: \"image/png\"\n if (type === lowerMime) return true;\n\n // Wildcard mime: \"image/*\"\n if (type.endsWith('/*')) {\n const prefix = type.slice(0, -2);\n return lowerMime.startsWith(`${prefix}/`);\n }\n\n // Extension format: \".pdf\", \".jpg\"\n if (type.startsWith('.')) {\n const ext = type.slice(1);\n // Map common extensions to mimes\n const extMimeMap: Record<string, string[]> = {\n 'jpg': ['image/jpeg'],\n 'jpeg': ['image/jpeg'],\n 'png': ['image/png'],\n 'gif': ['image/gif'],\n 'webp': ['image/webp'],\n 'svg': ['image/svg+xml'],\n 'bmp': ['image/bmp'],\n 'ico': ['image/x-icon', 'image/vnd.microsoft.icon'],\n 'tiff': ['image/tiff'],\n 'tif': ['image/tiff'],\n 'heic': ['image/heic'],\n 'heif': ['image/heif'],\n 'avif': ['image/avif'],\n 'mp4': ['video/mp4'],\n 'webm': ['video/webm'],\n 'mov': ['video/quicktime'],\n 'avi': ['video/x-msvideo'],\n 'mkv': ['video/x-matroska'],\n 'wmv': ['video/x-ms-wmv'],\n 'flv': ['video/x-flv'],\n 'mp3': ['audio/mpeg', 'audio/mp3'],\n 'wav': ['audio/wav', 'audio/x-wav'],\n 'ogg': ['audio/ogg'],\n 'flac': ['audio/flac'],\n 'aac': ['audio/aac'],\n 'm4a': ['audio/mp4', 'audio/x-m4a'],\n 'pdf': ['application/pdf'],\n 'doc': ['application/msword'],\n 'docx': ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n 'xls': ['application/vnd.ms-excel'],\n 'xlsx': ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n 'ppt': ['application/vnd.ms-powerpoint'],\n 'pptx': ['application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n 'txt': ['text/plain'],\n 'csv': ['text/csv'],\n 'json': ['application/json'],\n 'xml': ['application/xml', 'text/xml'],\n 'zip': ['application/zip', 'application/x-zip-compressed'],\n 'rar': ['application/x-rar-compressed', 'application/vnd.rar'],\n '7z': ['application/x-7z-compressed'],\n 'tar': ['application/x-tar'],\n 'gz': ['application/gzip'],\n };\n const allowedMimes = extMimeMap[ext];\n if (allowedMimes) {\n return allowedMimes.some(m => lowerMime === m);\n }\n // Fallback: check if mime ends with extension\n return lowerMime.includes(ext);\n }\n\n return false;\n });\n};\n\n// ** Get accept string for input element from filter\nexport const getAcceptString = (filter?: string): string | undefined => {\n if (!filter) return undefined;\n // Already in correct format for input accept\n return filter;\n};\n\nimport type { TDriveFile, TImageQuality, TImageFormat } from '@/types/client';\n\n// ** Create URL for drive file with optional quality and format\nexport const driveCreateUrl = (\n driveFile: TDriveFile,\n apiEndpoint: string,\n options?: { quality?: TImageQuality; format?: TImageFormat }\n): string => {\n const params = new URLSearchParams({\n action: 'serve',\n id: driveFile.id,\n });\n\n if (options?.quality) params.set('q', options.quality);\n if (options?.format) params.set('format', options.format);\n\n return `${apiEndpoint}?${params.toString()}`;\n};\n\n// ** Generate responsive image srcSet for drive file\nexport const driveCreateSrcSet = (\n driveFile: TDriveFile,\n apiEndpoint: string,\n format: TImageFormat = 'webp'\n): { srcSet: string; sizes: string } => {\n const qualities: TImageQuality[] = ['ultralow', 'low', 'medium', 'high'];\n\n // ** Quality to width mapping for srcSet\n const qualityWidthMap: Record<TImageQuality, number> = {\n ultralow: 200,\n low: 400,\n medium: 800,\n high: 1200,\n normal: 1600,\n };\n\n // ** Create srcSet for different qualities\n const srcSet = qualities\n .map(quality => {\n const url = driveCreateUrl(driveFile, apiEndpoint, { quality, format });\n return `${url} ${qualityWidthMap[quality]}w`;\n })\n .join(', ');\n\n // ** Default sizes attribute for responsive images\n const sizes = '(max-width: 320px) 200px, (max-width: 480px) 400px, (max-width: 768px) 800px, 1200px';\n\n return { srcSet, sizes };\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../../src/client/components/drive/header.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAgBxC,eAAO,MAAM,WAAW,GAAI,eAAe;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,sBA8RhE,CAAC;AAKF,eAAO,MAAM,oBAAoB,gCAchC,CAAC"}
1
+ {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../../src/client/components/drive/header.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAiBxC,eAAO,MAAM,WAAW,GAAI,eAAe;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,sBA8RhE,CAAC;AAKF,eAAO,MAAM,oBAAoB,gCAchC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dialog-fullscreen.d.ts","sourceRoot":"","sources":["../../../../src/client/components/ui/dialog-fullscreen.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AAKzD,iBAAS,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,qBAE/E;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,qBAEzF;AAED,iBAAS,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,qBAErF;AAED,iBAAS,cAAc,CAAC,EACpB,SAAS,EACT,QAAQ,EACR,eAAsB,EACtB,GAAG,KAAK,EACX,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,GAAG;IACtD,eAAe,CAAC,EAAE,OAAO,CAAA;CAC5B,qBAqDA;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQxE;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,YAAY,CAAC,EAClB,SAAS,EACT,GAAG,KAAK,EACX,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,qBAQpD;AAED,iBAAS,kBAAkB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACX,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,WAAW,CAAC,qBAQ1D;AAED,OAAO,EACH,OAAO,EACP,YAAY,EACZ,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,GACjB,CAAA"}
1
+ {"version":3,"file":"dialog-fullscreen.d.ts","sourceRoot":"","sources":["../../../../src/client/components/ui/dialog-fullscreen.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AAKzD,iBAAS,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,qBAE/E;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,qBAEzF;AAED,iBAAS,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,qBAErF;AAED,iBAAS,cAAc,CAAC,EACpB,SAAS,EACT,QAAQ,EACR,eAAsB,EACtB,GAAG,KAAK,EACX,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,GAAG;IACtD,eAAe,CAAC,EAAE,OAAO,CAAA;CAC5B,qBAuDA;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQxE;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,YAAY,CAAC,EAClB,SAAS,EACT,GAAG,KAAK,EACX,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,qBAQpD;AAED,iBAAS,kBAAkB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACX,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,WAAW,CAAC,qBAQ1D;AAED,OAAO,EACH,OAAO,EACP,YAAY,EACZ,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,GACjB,CAAA"}