@solace-health/ui 0.10.618 → 0.10.620

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/chunk-3P5KFJMO.js +2 -0
  2. package/dist/chunk-3P5KFJMO.js.map +1 -0
  3. package/dist/chunk-IAMALZ4P.js +2 -0
  4. package/dist/chunk-IAMALZ4P.js.map +1 -0
  5. package/dist/chunk-MVFONYCF.cjs +2 -0
  6. package/dist/chunk-MVFONYCF.cjs.map +1 -0
  7. package/dist/chunk-OCTFPWXI.cjs +2 -0
  8. package/dist/chunk-OCTFPWXI.cjs.map +1 -0
  9. package/dist/chunk-TKCBOIK2.js +2 -0
  10. package/dist/chunk-TKCBOIK2.js.map +1 -0
  11. package/dist/chunk-WIO4QPNH.cjs +2 -0
  12. package/dist/chunk-WIO4QPNH.cjs.map +1 -0
  13. package/dist/metafile-cjs.json +1 -1
  14. package/dist/metafile-esm.json +1 -1
  15. package/dist/v2/date-picker/date-picker.cjs +1 -1
  16. package/dist/v2/date-picker/date-picker.js +1 -1
  17. package/dist/v2/dropzone/dropzone.cjs +1 -1
  18. package/dist/v2/dropzone/dropzone.d.ts +2 -1
  19. package/dist/v2/dropzone/dropzone.js +1 -1
  20. package/dist/v2/image-preview/image-preview.cjs +2 -0
  21. package/dist/v2/image-preview/image-preview.cjs.map +1 -0
  22. package/dist/v2/image-preview/image-preview.d.ts +8 -0
  23. package/dist/v2/image-preview/image-preview.js +2 -0
  24. package/dist/v2/image-preview/image-preview.js.map +1 -0
  25. package/dist/v2/image-preview/image-preview.stories.d.ts +7 -0
  26. package/dist/v2/image-preview/images.d.cjs +2 -0
  27. package/dist/v2/image-preview/images.d.cjs.map +1 -0
  28. package/dist/v2/image-preview/images.d.js +2 -0
  29. package/dist/v2/image-preview/images.d.js.map +1 -0
  30. package/dist/v2/image-preview/useImageCropper.cjs +2 -0
  31. package/dist/v2/image-preview/useImageCropper.cjs.map +1 -0
  32. package/dist/v2/image-preview/useImageCropper.d.ts +35 -0
  33. package/dist/v2/image-preview/useImageCropper.js +2 -0
  34. package/dist/v2/image-preview/useImageCropper.js.map +1 -0
  35. package/dist/v2/index.cjs +1 -1
  36. package/dist/v2/index.d.ts +2 -0
  37. package/dist/v2/index.js +1 -1
  38. package/dist/v2/time-select/time-select.cjs +1 -1
  39. package/dist/v2/time-select/time-select.js +1 -1
  40. package/package.json +2 -1
  41. package/dist/chunk-HAPDKANP.cjs +0 -2
  42. package/dist/chunk-HAPDKANP.cjs.map +0 -1
  43. package/dist/chunk-HPYGGFCG.cjs +0 -2
  44. package/dist/chunk-HPYGGFCG.cjs.map +0 -1
  45. package/dist/chunk-YGC2FML2.js +0 -2
  46. package/dist/chunk-YGC2FML2.js.map +0 -1
  47. package/dist/chunk-ZNF7XI2Y.js +0 -2
  48. package/dist/chunk-ZNF7XI2Y.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import {a}from'./chunk-BAN2U7YX.js';import {a as a$1}from'./chunk-YTIIAU4W.js';import {useDropzone}from'react-dropzone';import {LuFileWarning,LuUpload}from'react-icons/lu';import {jsx,jsxs,Fragment}from'react/jsx-runtime';var w={"image/jpeg":[".jpeg",".jpg"],"image/png":[".png"],"image/avif":[".avif"],"image/heic":[".heic"],"image/webp":[".webp"],"application/pdf":[".pdf"],"text/csv":[".csv"],"application/xml":[".xml",".xlsx"],"application/msword":[".doc"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":[".docx"]},D=[],P={},A=()=>null,B=({accept:m=w,files:p=D,maxFiles:o=5,maxSizeInMb:a$2=10,onDrop:g=A,className:f=void 0,wrapperClassName:u=void 0,extraInputProps:n=P,isLoading:c=false})=>{let i=p.length>=o,{getRootProps:b,getInputProps:x,isDragActive:d}=useDropzone({maxFiles:o,multiple:o>1,onDrop:g,maxSize:a$2*1024*1024,accept:m,onDropRejected:r=>{r.length>0&&r[0].errors[0].code==="too-many-files"?a.error(`Too many files. Please upload up to ${o} files at a time.`):r.length>0&&r[0].errors[0].code==="file-too-large"?a.error(`File is too large. Please upload files smaller than ${a$2} MB.`):a.error("File type not supported");},disabled:p.length>=o}),v={...x(),...n,disabled:c||n.disabled};return jsx("div",{className:a$1("flex min-h-48 flex-col gap-4 hover:cursor-pointer",d&&"border-grey-700 opacity-75",i&&"hover:cursor-not-allowed",u),...b(),children:jsx("div",{className:a$1("bg-grey-100 border-grey-300 flex w-full flex-col items-center justify-center rounded-lg border-2 border-dashed py-10 text-center",i&&!d&&"border-red-300",f),children:i?jsxs("div",{className:"text flex flex-col items-center",children:[jsx(LuFileWarning,{className:"h-8 w-8 text-red-500"}),jsxs("div",{className:"strong mt-4",children:["Maximum ",o," file limit reached"]})]}):jsxs(Fragment,{children:[jsx("input",{...v}),c?jsx("div",{className:"h-8 w-8 animate-spin rounded-full border-4 border-gray-300 border-t-gray-700"}):jsx(LuUpload,{className:"h-8 w-8 text-gray-700"}),jsxs("div",{className:"text-grey-700 mt-4 flex flex-col gap-1",children:[jsx("p",{className:"text-body-lg",children:"Drag an image or click to browse"}),jsxs("p",{className:"text-body-sm",children:[a$2," MB max file size"]})]})]})})})};export{B as a};//# sourceMappingURL=chunk-3P5KFJMO.js.map
2
+ //# sourceMappingURL=chunk-3P5KFJMO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/v2/dropzone/dropzone.tsx"],"names":["defaultAcceptedFileTypes","stableArray","stableObject","stableFunc","Dropzone","accept","files","maxFiles","maxSizeInMb","onDrop","className","wrapperClassName","extraInputProps","isLoading","overMaxFileLimit","getRootProps","getInputProps","isDragActive","useDropzone","errorList","toast","inputProps","jsx","cn","jsxs","LuFileWarning","Fragment","LuUpload"],"mappings":"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","file":"chunk-3P5KFJMO.js","sourcesContent":["import { Accept, useDropzone } from 'react-dropzone';\nimport { LuFileWarning, LuUpload } from 'react-icons/lu';\nimport { toast } from '@/v2/toast/toaster';\nimport { cn } from '@/lib/utils';\n\nconst defaultAcceptedFileTypes = {\n 'image/jpeg': ['.jpeg', '.jpg'],\n 'image/png': ['.png'],\n 'image/avif': ['.avif'],\n 'image/heic': ['.heic'],\n 'image/webp': ['.webp'],\n 'application/pdf': ['.pdf'],\n 'text/csv': ['.csv'],\n 'application/xml': ['.xml', '.xlsx'],\n 'application/msword': ['.doc'],\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': ['.docx'],\n};\nconst stableArray: File[] = [];\nconst stableObject = {};\nconst stableFunc = () => null;\n\nexport type DropzoneProps = {\n accept?: Accept;\n files?: File[];\n maxFiles?: number;\n maxSizeInMb?: number;\n onDrop?: (acceptedFiles: File[]) => void;\n className?: string;\n wrapperClassName?: string;\n extraInputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n isLoading?: boolean;\n};\n\nexport const Dropzone = ({\n accept = defaultAcceptedFileTypes,\n files = stableArray,\n maxFiles = 5,\n maxSizeInMb = 10,\n onDrop = stableFunc,\n className = undefined,\n wrapperClassName = undefined,\n extraInputProps = stableObject,\n isLoading = false,\n}: DropzoneProps) => {\n const overMaxFileLimit = files.length >= maxFiles;\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n maxFiles,\n multiple: maxFiles > 1,\n onDrop,\n maxSize: maxSizeInMb * 1024 * 1024,\n accept,\n onDropRejected: (errorList) => {\n if (errorList.length > 0 && errorList[0].errors[0].code === 'too-many-files') {\n toast.error(`Too many files. Please upload up to ${maxFiles} files at a time.`);\n } else if (errorList.length > 0 && errorList[0].errors[0].code === 'file-too-large') {\n toast.error(`File is too large. Please upload files smaller than ${maxSizeInMb} MB.`);\n } else {\n toast.error('File type not supported');\n }\n },\n disabled: files.length >= maxFiles,\n });\n\n const inputProps = {\n ...getInputProps(),\n ...extraInputProps,\n disabled: isLoading || extraInputProps.disabled,\n };\n\n return (\n <div\n className={cn(\n 'flex min-h-48 flex-col gap-4 hover:cursor-pointer',\n isDragActive && 'border-grey-700 opacity-75',\n overMaxFileLimit && 'hover:cursor-not-allowed',\n wrapperClassName,\n )}\n {...getRootProps()}\n >\n <div\n className={cn(\n 'bg-grey-100 border-grey-300 flex w-full flex-col items-center justify-center rounded-lg border-2 border-dashed py-10 text-center',\n overMaxFileLimit && !isDragActive && 'border-red-300',\n className,\n )}\n >\n {overMaxFileLimit ? (\n <div className=\"text flex flex-col items-center\">\n <LuFileWarning className=\"h-8 w-8 text-red-500\" />\n <div className=\"strong mt-4\">Maximum {maxFiles} file limit reached</div>\n </div>\n ) : (\n <>\n <input {...inputProps} />\n {isLoading ? (\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-gray-300 border-t-gray-700\" />\n ) : (\n <LuUpload className=\"h-8 w-8 text-gray-700\" />\n )}\n <div className=\"text-grey-700 mt-4 flex flex-col gap-1\">\n <p className=\"text-body-lg\">Drag an image or click to browse</p>\n <p className=\"text-body-sm\">{maxSizeInMb} MB max file size</p>\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n"]}
@@ -0,0 +1,2 @@
1
+ import {useState,useCallback}from'react';var U=e=>new Promise((n,m)=>{let r=new Image;r.addEventListener("load",()=>n(r)),r.addEventListener("error",s=>m(s)),r.src=e;}),f=e=>e&&["image/webp","image/png","image/jpeg","image/avif"].includes(e)?e:"image/jpeg",P=(e,n)=>{let r={"image/jpeg":".jpg","image/png":".png","image/webp":".webp","image/avif":".avif"}[n]||"";return e.toLowerCase().endsWith(r)?e:e.replace(/\.[a-zA-Z0-9]+$/,"")+r},j=(e,n,m)=>{if(!e.startsWith("data:")){let v=f(m);return new File([e],P(n,v),{type:v})}let[r,s]=e.split(","),C=f(r.split(";")[0].replace("data:","")),u=atob(s),x=u.length,d=new Uint8Array(x),c=0;for(;c<x;)d[c]=u.charCodeAt(c),c+=1;return new File([d],P(n,C),{type:C})};function B(e={}){let{aspect:n=1.6,minZoom:m=1,maxZoom:r=3,initialZoom:s=1}=e,[C,u]=useState({x:0,y:0}),[x,d]=useState(s),[c,v]=useState(n),[g,Z]=useState(null),I=useCallback((t,i)=>{Z(i);},[]),F=useCallback(()=>{u({x:0,y:0}),d(s),Z(null);},[s]),y=useCallback(async(t,i)=>{if(!g)return null;let a=await U(t),o=document.createElement("canvas"),l=o.getContext("2d");if(!l)throw new Error("Canvas 2D context not available");let{width:p,height:b}=g;o.width=p,o.height=b,l.drawImage(a,g.x,g.y,p,b,0,0,p,b);let h=f(i||(t.startsWith("data:")?t.split(";")[0].replace("data:",""):void 0));return {canvas:o,mime:h}},[g]),E=useCallback(async(t,i,a)=>{let o=await y(t,a);if(!o)return j(t,i||"cropped-image",a);let{canvas:l,mime:p}=o,b=await new Promise(h=>{l.toBlob(L=>h(L||new Blob),p,.9);});return new File([b],P(i||"cropped-image",p),{type:p})},[y]),M=useCallback(async(t,i)=>{let a=await y(t,i);if(!a)return t;let{canvas:o,mime:l}=a;return o.toDataURL(l,.9)},[y]);return {crop:C,zoom:x,aspect:c,croppedAreaPixels:g,setCrop:u,setZoom:t=>d(Math.min(Math.max(t,m),r)),setAspect:v,onCropComplete:I,reset:F,getCroppedFile:E,getCroppedPreview:M}}export{B as a};//# sourceMappingURL=chunk-IAMALZ4P.js.map
2
+ //# sourceMappingURL=chunk-IAMALZ4P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/v2/image-preview/useImageCropper.ts"],"names":["createImage","url","resolve","reject","img","e","chooseOutputMime","input","ensureExtension","name","mime","wantedExt","dataUrlToFile","dataUrl","fileName","mimeTypeHint","meta","base64","binary","len","buffer","i","useImageCropper","options","aspect","minZoom","maxZoom","initialZoom","crop","setCrop","useState","zoom","setZoom","currentAspect","setAspect","croppedAreaPixels","setCroppedAreaPixels","onCropComplete","useCallback","_","croppedPixels","reset","getCroppedCanvas","imageSrc","image","canvas","ctx","width","height","getCroppedFile","result","blob","b","getCroppedPreview","z"],"mappings":"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","file":"chunk-IAMALZ4P.js","sourcesContent":["import { useCallback, useState } from 'react';\nimport type { Area } from 'react-easy-crop';\n\nexport type UseImageCropperOptions = {\n aspect?: number; // default 1.6\n minZoom?: number; // default 1\n maxZoom?: number; // default 3\n initialZoom?: number; // default 1\n};\n\nexport type UseImageCropper = {\n crop: { x: number; y: number };\n zoom: number;\n aspect: number;\n croppedAreaPixels: Area | null;\n setCrop: (c: { x: number; y: number }) => void;\n setZoom: (z: number) => void;\n setAspect: (a: number) => void;\n onCropComplete: (croppedArea: Area, croppedAreaPixels: Area) => void;\n reset: () => void;\n /**\n * Given an image source (Data URL or object URL) returns a Promise<File> of the cropped image\n * using current crop state. If cropping fails, rejects.\n */\n getCroppedFile: (imageSrc: string, fileName?: string, mimeTypeHint?: string) => Promise<File>;\n /**\n * Given an image source (Data URL or object URL) returns a Data URL string of the cropped image\n * using current crop state. If cropping fails, rejects.\n */\n getCroppedPreview: (imageSrc: string, mimeTypeHint?: string) => Promise<string>;\n};\n\n// Utilities\nconst createImage = (url: string): Promise<HTMLImageElement> => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.addEventListener('load', () => resolve(img));\n img.addEventListener('error', (e) => reject(e));\n img.src = url;\n });\n};\n\nconst chooseOutputMime = (input?: string): string => {\n const allowed = ['image/webp', 'image/png', 'image/jpeg', 'image/avif'];\n if (input && allowed.includes(input)) return input;\n return 'image/jpeg';\n};\n\nconst ensureExtension = (name: string, mime: string): string => {\n const extMap: Record<string, string> = {\n 'image/jpeg': '.jpg',\n 'image/png': '.png',\n 'image/webp': '.webp',\n 'image/avif': '.avif',\n };\n const wantedExt = extMap[mime] || '';\n if (name.toLowerCase().endsWith(wantedExt)) return name;\n // strip existing extension\n const base = name.replace(/\\.[a-zA-Z0-9]+$/, '');\n return base + wantedExt;\n};\n\nconst dataUrlToFile = (dataUrl: string, fileName: string, mimeTypeHint?: string): File => {\n if (!dataUrl.startsWith('data:')) {\n // Not a data URL; create a File with generic mime\n const mime = chooseOutputMime(mimeTypeHint);\n return new File([dataUrl], ensureExtension(fileName, mime), { type: mime });\n }\n const [meta, base64] = dataUrl.split(',');\n const mime = chooseOutputMime(meta.split(';')[0].replace('data:', ''));\n const binary = atob(base64);\n const len = binary.length;\n const buffer = new Uint8Array(len);\n let i = 0;\n while (i < len) {\n buffer[i] = binary.charCodeAt(i);\n i += 1;\n }\n return new File([buffer], ensureExtension(fileName, mime), { type: mime });\n};\n\nexport function useImageCropper(options: UseImageCropperOptions = {}): UseImageCropper {\n const { aspect = 1.6, minZoom = 1, maxZoom = 3, initialZoom = 1 } = options;\n\n const [crop, setCrop] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(initialZoom);\n const [currentAspect, setAspect] = useState(aspect);\n const [croppedAreaPixels, setCroppedAreaPixels] = useState<Area | null>(null);\n\n const onCropComplete = useCallback((_: Area, croppedPixels: Area) => {\n setCroppedAreaPixels(croppedPixels);\n }, []);\n\n const reset = useCallback(() => {\n setCrop({ x: 0, y: 0 });\n setZoom(initialZoom);\n setCroppedAreaPixels(null);\n }, [initialZoom]);\n\n const getCroppedCanvas = useCallback(\n async (imageSrc: string, mimeTypeHint?: string) => {\n if (!croppedAreaPixels) {\n return null;\n }\n const image = await createImage(imageSrc);\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Canvas 2D context not available');\n\n const { width, height } = croppedAreaPixels;\n canvas.width = width;\n canvas.height = height;\n\n ctx.drawImage(\n image,\n croppedAreaPixels.x,\n croppedAreaPixels.y,\n width,\n height,\n 0,\n 0,\n width,\n height,\n );\n\n const mime = chooseOutputMime(\n mimeTypeHint ||\n (imageSrc.startsWith('data:') ? imageSrc.split(';')[0].replace('data:', '') : undefined),\n );\n\n return { canvas, mime };\n },\n [croppedAreaPixels],\n );\n\n const getCroppedFile = useCallback(\n async (imageSrc: string, fileName?: string, mimeTypeHint?: string) => {\n const result = await getCroppedCanvas(imageSrc, mimeTypeHint);\n if (!result) {\n return dataUrlToFile(imageSrc, fileName || 'cropped-image', mimeTypeHint);\n }\n\n const { canvas, mime } = result;\n const blob: Blob = await new Promise((resolve) => {\n canvas.toBlob((b) => resolve((b as Blob) || new Blob()), mime, 0.9);\n });\n return new File([blob], ensureExtension(fileName || 'cropped-image', mime), { type: mime });\n },\n [getCroppedCanvas],\n );\n\n const getCroppedPreview = useCallback(\n async (imageSrc: string, mimeTypeHint?: string) => {\n const result = await getCroppedCanvas(imageSrc, mimeTypeHint);\n if (!result) {\n return imageSrc;\n }\n\n const { canvas, mime } = result;\n return canvas.toDataURL(mime, 0.9);\n },\n [getCroppedCanvas],\n );\n\n return {\n crop,\n zoom,\n aspect: currentAspect,\n croppedAreaPixels,\n setCrop,\n setZoom: (z: number) => setZoom(Math.min(Math.max(z, minZoom), maxZoom)),\n setAspect,\n onCropComplete,\n reset,\n getCroppedFile,\n getCroppedPreview,\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkQAGOBPAT_cjs=require('./chunk-QAGOBPAT.cjs'),chunkKMKBBT3A_cjs=require('./chunk-KMKBBT3A.cjs'),chunkW5S2KUYD_cjs=require('./chunk-W5S2KUYD.cjs'),chunkSV7GB6CH_cjs=require('./chunk-SV7GB6CH.cjs'),chunkSAWCIRIH_cjs=require('./chunk-SAWCIRIH.cjs'),chunkNZANLY4M_cjs=require('./chunk-NZANLY4M.cjs'),chunkQRO22BPZ_cjs=require('./chunk-QRO22BPZ.cjs'),react=require('react'),lu=require('react-icons/lu'),V=require('dayjs'),Y=require('react-easy-crop'),jsxRuntime=require('react/jsx-runtime'),luxon=require('luxon');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var V__default=/*#__PURE__*/_interopDefault(V);var Y__default=/*#__PURE__*/_interopDefault(Y);var _=({alt:t,className:a="",imagePreview:o=void 0,cropper:e=void 0})=>{let[i,p]=react.useState(false),m=!o||!i,d=!!e;return jsxRuntime.jsxs("div",{className:`flex max-w-[386px] flex-col ${a}`,children:[jsxRuntime.jsxs("div",{className:"relative h-60 rounded-md border",children:[o&&d?jsxRuntime.jsx(Y__default.default,{image:o,crop:e.crop,zoom:e.zoom,aspect:e.aspect,objectFit:"contain",onCropChange:e.setCrop,onZoomChange:e.setZoom,onCropComplete:e.onCropComplete,onMediaLoaded:()=>p(true),showGrid:false}):o&&jsxRuntime.jsx("img",{alt:t,className:`m-auto h-full w-full object-contain transition-opacity duration-300 ${i?"opacity-100":"opacity-0"}`,src:o,onLoad:()=>p(true),draggable:false}),m&&jsxRuntime.jsx("div",{"aria-label":o?"Loading image":"Awaiting image",className:"from-grey-300 to-grey-300 absolute inset-0 animate-pulse bg-gradient-to-r"})]}),!m&&d&&jsxRuntime.jsxs("div",{className:"mt-3 flex items-center justify-between gap-4 px-1",children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-3",children:[jsxRuntime.jsx(chunkSAWCIRIH_cjs.b,{"aria-label":"zoom out",onClick:()=>e.setZoom(Math.max(e.zoom-.1,1)),className:"h-8",variant:"ghost-icon",children:jsxRuntime.jsx(lu.LuZoomOut,{})}),jsxRuntime.jsx(chunkQAGOBPAT_cjs.a,{value:[e.zoom],min:1,max:3,step:.01,onValueChange:s=>e.setZoom(s[0]),className:"w-50",classNames:{thumb:"border-2 border-green-800",range:"bg-green-900"}}),jsxRuntime.jsx(chunkSAWCIRIH_cjs.b,{"aria-label":"zoom in",onClick:()=>e.setZoom(Math.min(e.zoom+.1,3)),variant:"ghost-icon",className:"h-8",children:jsxRuntime.jsx(lu.LuZoomIn,{})})]}),jsxRuntime.jsxs(chunkSAWCIRIH_cjs.b,{onClick:e.reset,variant:"ghost",className:"h-8 p-2",children:[jsxRuntime.jsx(lu.LuRefreshCcw,{}),"Reset"]})]})]})};var L="00:00",B="24:00",R=t=>luxon.DateTime.fromFormat(t,"HH:mm").isValid,O=({startTime:t=L,endTime:a=B,interval:o=30,onChange:e=void 0,className:i="",size:p="default",portal:m=true,...d})=>{R(t)||(console.error(`Invalid startTime: ${t}`),t=L),R(a)||(console.error(`Invalid endTime: ${a}`),a=B);let s=react.useMemo(()=>{let r=luxon.DateTime.fromFormat(a,"HH:mm"),u=luxon.Duration.fromObject({minutes:o}),v=[],n=luxon.DateTime.fromFormat(t,"HH:mm");for(;n<=r;){let w=n.toFormat("HH:mm");w==="00:00"&&n.equals(r)&&(w="24:00"),v.push({label:n.toFormat("h:mm a"),value:{hour:n.toFormat("HH"),min:n.toFormat("mm"),raw:w,formatted:n.toFormat("h:mm a")}}),n=n.plus(u);}return v},[t,a,o]),C=s.map(r=>({label:r.label,value:r.value.raw}));return jsxRuntime.jsxs(chunkKMKBBT3A_cjs.a,{onValueChange:r=>{let u=s.find(v=>v.value.raw===r);u&&e?.(u);},...d,children:[jsxRuntime.jsx(chunkKMKBBT3A_cjs.d,{className:chunkQRO22BPZ_cjs.a("max-w-[240px] md:w-[150px]",i),size:p,children:jsxRuntime.jsx(chunkKMKBBT3A_cjs.c,{placeholder:"Select one"})}),jsxRuntime.jsx(chunkKMKBBT3A_cjs.g,{position:"popper",className:"max-h-90",portal:m,children:C.map(r=>jsxRuntime.jsx(chunkKMKBBT3A_cjs.i,{className:"h-10",value:r.value,children:r.label},r.value))})]})},se=O;function q({className:t="",wrapperClassName:a="",value:o=void 0,onChange:e=void 0,disabled:i=false,calendarProps:p=void 0,placeholder:m="Pick a date",inputProps:d=void 0,showCalendarIcon:s=true}){let[C,D]=react.useState(false),r=u=>{e?.(u),D(false);};return jsxRuntime.jsxs(chunkSV7GB6CH_cjs.a,{open:!i&&C,onOpenChange:D,children:[jsxRuntime.jsxs(chunkSV7GB6CH_cjs.b,{className:chunkQRO22BPZ_cjs.a("focus-visible:ring-ring/50 hover:enabled:border-dark-green focus:enabled:border-dark-green focus-visible:border-dark-green relative flex w-full items-center rounded-md transition-all outline-none focus-within:shadow focus-within:shadow-green-300 focus-visible:ring-[3px] focus:enabled:shadow-green-300",a),children:[jsxRuntime.jsx(chunkNZANLY4M_cjs.b,{className:chunkQRO22BPZ_cjs.a(s&&"pl-10",C?"border-dark-green":"",t),value:o?V__default.default(o).format("MM/DD/YYYY"):"",placeholder:m,readOnly:true,disabled:i,...d}),s&&jsxRuntime.jsx("div",{className:chunkQRO22BPZ_cjs.a("absolute top-1/2 left-4 h-4 w-4 -translate-y-1/2",i?"text-gray-400":"cursor-pointer text-black"),children:jsxRuntime.jsx(lu.LuCalendar,{size:16})})]}),jsxRuntime.jsx(chunkSV7GB6CH_cjs.c,{className:"w-auto overflow-hidden p-0",align:"start",children:jsxRuntime.jsx(chunkW5S2KUYD_cjs.b,{mode:"single",selected:o?V__default.default(o).toDate():void 0,onSelect:r,...p})})]})}exports.a=q;exports.b=_;exports.c=O;exports.d=se;//# sourceMappingURL=chunk-MVFONYCF.cjs.map
2
+ //# sourceMappingURL=chunk-MVFONYCF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/v2/image-preview/image-preview.tsx","../src/v2/time-select/time-select.tsx","../src/v2/date-picker/date-picker.tsx"],"names":["ImagePreview","alt","className","imagePreview","cropper","loaded","setLoaded","useState","showLoader","enableCrop","jsxs","jsx","Cropper","Button","LuZoomOut","Slider","v","LuZoomIn","LuRefreshCcw","START_TIME_DEFAULT","END_TIME_DEFAULT","isValidTime","time","DateTime","TimeSelect","startTime","endTime","interval","onChange","size","portal","inputProps","intervals","useMemo","dtEnd","durationInterval","Duration","res","i","raw","options","Select","e","SelectTrigger","cn","SelectValue","SelectContent","option","SelectItem","time_select_default","DatePicker","wrapperClassName","value","disabled","calendarProps","placeholder","showCalendarIcon","open","setOpen","handleSelect","val","Popover","PopoverTrigger","Input","dayjs","LuCalendar","PopoverContent","Calendar"],"mappings":"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","file":"chunk-MVFONYCF.cjs","sourcesContent":["import { useState } from 'react';\nimport { LuRefreshCcw, LuZoomIn, LuZoomOut } from 'react-icons/lu';\nimport Cropper from 'react-easy-crop';\nimport { Button, Slider } from '../index';\nimport type { UseImageCropper } from './useImageCropper';\n\nexport type ImagePreviewProps = {\n alt: string;\n className?: string;\n imagePreview?: string; // optional so we can show skeleton while awaiting URL\n cropper?: UseImageCropper; // when provided, show cropping UI\n};\n\nexport const ImagePreview = ({\n alt,\n className = '',\n imagePreview = undefined,\n cropper = undefined,\n}: ImagePreviewProps) => {\n const [loaded, setLoaded] = useState(false);\n const showLoader = !imagePreview || !loaded;\n const enableCrop = !!cropper;\n\n return (\n <div className={`flex max-w-[386px] flex-col ${className}`}>\n <div className=\"relative h-60 rounded-md border\">\n {imagePreview && enableCrop ? (\n <Cropper\n image={imagePreview}\n crop={cropper.crop}\n zoom={cropper.zoom}\n aspect={cropper.aspect}\n objectFit=\"contain\"\n onCropChange={cropper.setCrop}\n onZoomChange={cropper.setZoom}\n onCropComplete={cropper.onCropComplete}\n onMediaLoaded={() => setLoaded(true)}\n showGrid={false}\n />\n ) : (\n imagePreview && (\n <img\n alt={alt}\n className={`m-auto h-full w-full object-contain transition-opacity duration-300 ${loaded ? 'opacity-100' : 'opacity-0'}`}\n src={imagePreview}\n onLoad={() => setLoaded(true)}\n draggable={false}\n />\n )\n )}\n\n {showLoader && (\n <div\n aria-label={imagePreview ? 'Loading image' : 'Awaiting image'}\n className=\"from-grey-300 to-grey-300 absolute inset-0 animate-pulse bg-gradient-to-r\"\n />\n )}\n </div>\n\n {!showLoader && enableCrop && (\n <div className=\"mt-3 flex items-center justify-between gap-4 px-1\">\n <div className=\"flex items-center gap-3\">\n <Button\n aria-label=\"zoom out\"\n onClick={() => cropper.setZoom(Math.max(cropper.zoom - 0.1, 1))}\n className=\"h-8\"\n variant=\"ghost-icon\"\n >\n <LuZoomOut />\n </Button>\n\n <Slider\n value={[cropper.zoom]}\n min={1}\n max={3}\n step={0.01}\n onValueChange={(v: number[]) => cropper.setZoom(v[0])}\n className=\"w-50\"\n classNames={{ thumb: 'border-2 border-green-800', range: 'bg-green-900' }}\n />\n\n <Button\n aria-label=\"zoom in\"\n onClick={() => cropper.setZoom(Math.min(cropper.zoom + 0.1, 3))}\n variant=\"ghost-icon\"\n className=\"h-8\"\n >\n <LuZoomIn />\n </Button>\n </div>\n\n <Button onClick={cropper.reset} variant=\"ghost\" className=\"h-8 p-2\">\n <LuRefreshCcw />\n Reset\n </Button>\n </div>\n )}\n </div>\n );\n};\n","import { DateTime, Duration } from 'luxon';\nimport { useMemo } from 'react';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/v2';\nimport { cn } from '@/lib/utils';\n\nexport type Interval = {\n label: string;\n value: {\n hour: string;\n min: string;\n raw: string;\n formatted: string;\n };\n};\n\ntype Props = {\n startTime?: string;\n endTime?: string;\n interval?: number;\n onChange?: (e: Interval) => void;\n className?: string;\n size?: 'default' | 'sm';\n portal?: boolean;\n [inputProps: string]: unknown;\n};\n\nconst START_TIME_DEFAULT = '00:00';\nconst END_TIME_DEFAULT = '24:00';\n\nconst isValidTime = (time: string) => {\n const dt = DateTime.fromFormat(time, 'HH:mm');\n return dt.isValid;\n};\n\nexport const TimeSelect = ({\n startTime = START_TIME_DEFAULT,\n endTime = END_TIME_DEFAULT,\n interval = 30,\n onChange = undefined,\n className = '',\n size = 'default',\n portal = true,\n ...inputProps\n}: Props) => {\n if (!isValidTime(startTime)) {\n console.error(`Invalid startTime: ${startTime}`);\n // eslint-disable-next-line no-param-reassign\n startTime = START_TIME_DEFAULT;\n }\n if (!isValidTime(endTime)) {\n console.error(`Invalid endTime: ${endTime}`);\n // eslint-disable-next-line no-param-reassign\n endTime = END_TIME_DEFAULT;\n }\n\n const intervals = useMemo((): Interval[] => {\n const dtEnd = DateTime.fromFormat(endTime, 'HH:mm');\n const durationInterval = Duration.fromObject({ minutes: interval });\n const res = [];\n let i = DateTime.fromFormat(startTime, 'HH:mm');\n while (i <= dtEnd) {\n let raw = i.toFormat('HH:mm');\n // Avoid duplicate keys for \"00:00\" and \"00:00\" (end of day)\n if (raw === '00:00' && i.equals(dtEnd)) raw = '24:00';\n\n res.push({\n label: i.toFormat('h:mm a'),\n value: {\n hour: i.toFormat('HH'),\n min: i.toFormat('mm'),\n raw,\n formatted: i.toFormat('h:mm a'),\n },\n });\n i = i.plus(durationInterval);\n }\n\n return res;\n }, [startTime, endTime, interval]);\n\n const options = intervals.map((time) => ({\n label: time.label,\n value: time.value.raw,\n }));\n\n const handleOnSelect = (e: unknown) => {\n const interval = intervals.find((time) => time.value.raw === e);\n\n if (!interval) return;\n\n onChange?.(interval);\n };\n\n return (\n <Select onValueChange={handleOnSelect} {...inputProps}>\n <SelectTrigger className={cn('max-w-[240px] md:w-[150px]', className)} size={size}>\n <SelectValue placeholder=\"Select one\" />\n </SelectTrigger>\n <SelectContent position=\"popper\" className=\"max-h-90\" portal={portal}>\n {options.map((option) => (\n // Note that labels and values here may appear to be duplicates\n // For example, \"00:00\" and \"24:00\" will both have the same value \"00:00\"\n <SelectItem className=\"h-10\" key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n};\n\nexport default TimeSelect;\n","import * as React from 'react';\nimport { ComponentProps, useState } from 'react';\nimport { LuCalendar } from 'react-icons/lu';\nimport dayjs from 'dayjs';\nimport { Calendar, Input, Popover, PopoverContent, PopoverTrigger } from '@/v2';\nimport { cn } from '@/lib/utils';\nimport { InputProps } from '@/v2/input/input';\n\nexport type DatePickerProps = {\n className?: string;\n wrapperClassName?: string;\n value?: Date;\n onChange?: (value: Date | undefined) => void;\n disabled?: boolean;\n // NOTE: Disallow changing this to a range-picker by forcing mode to \"single\" and using value instead of selected\n calendarProps?: Omit<ComponentProps<typeof Calendar>, 'mode' | 'selected' | 'onSelect'>;\n placeholder?: string;\n inputProps?: InputProps;\n showCalendarIcon?: boolean;\n};\n\nexport function DatePicker({\n className = '',\n wrapperClassName = '',\n value = undefined,\n onChange = undefined,\n disabled = false,\n calendarProps = undefined,\n placeholder = 'Pick a date',\n inputProps = undefined,\n showCalendarIcon = true,\n}: DatePickerProps & ComponentProps<typeof Calendar>) {\n const [open, setOpen] = useState<boolean>(false);\n\n const handleSelect = (val: Date | undefined) => {\n onChange?.(val);\n setOpen(false);\n };\n\n return (\n <Popover open={!disabled && open} onOpenChange={setOpen}>\n <PopoverTrigger\n className={cn(\n 'focus-visible:ring-ring/50 hover:enabled:border-dark-green focus:enabled:border-dark-green focus-visible:border-dark-green relative flex w-full items-center rounded-md transition-all outline-none focus-within:shadow focus-within:shadow-green-300 focus-visible:ring-[3px] focus:enabled:shadow-green-300',\n wrapperClassName,\n )}\n >\n <Input\n className={cn(showCalendarIcon && 'pl-10', open ? 'border-dark-green' : '', className)}\n value={value ? dayjs(value).format('MM/DD/YYYY') : ''}\n placeholder={placeholder}\n readOnly\n disabled={disabled}\n {...inputProps}\n />\n {showCalendarIcon && (\n <div\n className={cn(\n 'absolute top-1/2 left-4 h-4 w-4 -translate-y-1/2',\n disabled ? 'text-gray-400' : 'cursor-pointer text-black',\n )}\n >\n <LuCalendar size={16} />\n </div>\n )}\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={value ? dayjs(value).toDate() : undefined}\n onSelect={handleSelect}\n {...calendarProps}\n />\n </PopoverContent>\n </Popover>\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkOCM6L6SZ_cjs=require('./chunk-OCM6L6SZ.cjs'),chunkQRO22BPZ_cjs=require('./chunk-QRO22BPZ.cjs'),reactDropzone=require('react-dropzone'),lu=require('react-icons/lu'),jsxRuntime=require('react/jsx-runtime');var w={"image/jpeg":[".jpeg",".jpg"],"image/png":[".png"],"image/avif":[".avif"],"image/heic":[".heic"],"image/webp":[".webp"],"application/pdf":[".pdf"],"text/csv":[".csv"],"application/xml":[".xml",".xlsx"],"application/msword":[".doc"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":[".docx"]},D=[],P={},A=()=>null,B=({accept:m=w,files:p=D,maxFiles:o=5,maxSizeInMb:a=10,onDrop:g=A,className:f=void 0,wrapperClassName:u=void 0,extraInputProps:n=P,isLoading:c=false})=>{let i=p.length>=o,{getRootProps:b,getInputProps:x,isDragActive:d}=reactDropzone.useDropzone({maxFiles:o,multiple:o>1,onDrop:g,maxSize:a*1024*1024,accept:m,onDropRejected:r=>{r.length>0&&r[0].errors[0].code==="too-many-files"?chunkOCM6L6SZ_cjs.a.error(`Too many files. Please upload up to ${o} files at a time.`):r.length>0&&r[0].errors[0].code==="file-too-large"?chunkOCM6L6SZ_cjs.a.error(`File is too large. Please upload files smaller than ${a} MB.`):chunkOCM6L6SZ_cjs.a.error("File type not supported");},disabled:p.length>=o}),v={...x(),...n,disabled:c||n.disabled};return jsxRuntime.jsx("div",{className:chunkQRO22BPZ_cjs.a("flex min-h-48 flex-col gap-4 hover:cursor-pointer",d&&"border-grey-700 opacity-75",i&&"hover:cursor-not-allowed",u),...b(),children:jsxRuntime.jsx("div",{className:chunkQRO22BPZ_cjs.a("bg-grey-100 border-grey-300 flex w-full flex-col items-center justify-center rounded-lg border-2 border-dashed py-10 text-center",i&&!d&&"border-red-300",f),children:i?jsxRuntime.jsxs("div",{className:"text flex flex-col items-center",children:[jsxRuntime.jsx(lu.LuFileWarning,{className:"h-8 w-8 text-red-500"}),jsxRuntime.jsxs("div",{className:"strong mt-4",children:["Maximum ",o," file limit reached"]})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("input",{...v}),c?jsxRuntime.jsx("div",{className:"h-8 w-8 animate-spin rounded-full border-4 border-gray-300 border-t-gray-700"}):jsxRuntime.jsx(lu.LuUpload,{className:"h-8 w-8 text-gray-700"}),jsxRuntime.jsxs("div",{className:"text-grey-700 mt-4 flex flex-col gap-1",children:[jsxRuntime.jsx("p",{className:"text-body-lg",children:"Drag an image or click to browse"}),jsxRuntime.jsxs("p",{className:"text-body-sm",children:[a," MB max file size"]})]})]})})})};exports.a=B;//# sourceMappingURL=chunk-OCTFPWXI.cjs.map
2
+ //# sourceMappingURL=chunk-OCTFPWXI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/v2/dropzone/dropzone.tsx"],"names":["defaultAcceptedFileTypes","stableArray","stableObject","stableFunc","Dropzone","accept","files","maxFiles","maxSizeInMb","onDrop","className","wrapperClassName","extraInputProps","isLoading","overMaxFileLimit","getRootProps","getInputProps","isDragActive","useDropzone","errorList","toast","inputProps","jsx","cn","jsxs","LuFileWarning","Fragment","LuUpload"],"mappings":"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","file":"chunk-OCTFPWXI.cjs","sourcesContent":["import { Accept, useDropzone } from 'react-dropzone';\nimport { LuFileWarning, LuUpload } from 'react-icons/lu';\nimport { toast } from '@/v2/toast/toaster';\nimport { cn } from '@/lib/utils';\n\nconst defaultAcceptedFileTypes = {\n 'image/jpeg': ['.jpeg', '.jpg'],\n 'image/png': ['.png'],\n 'image/avif': ['.avif'],\n 'image/heic': ['.heic'],\n 'image/webp': ['.webp'],\n 'application/pdf': ['.pdf'],\n 'text/csv': ['.csv'],\n 'application/xml': ['.xml', '.xlsx'],\n 'application/msword': ['.doc'],\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': ['.docx'],\n};\nconst stableArray: File[] = [];\nconst stableObject = {};\nconst stableFunc = () => null;\n\nexport type DropzoneProps = {\n accept?: Accept;\n files?: File[];\n maxFiles?: number;\n maxSizeInMb?: number;\n onDrop?: (acceptedFiles: File[]) => void;\n className?: string;\n wrapperClassName?: string;\n extraInputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n isLoading?: boolean;\n};\n\nexport const Dropzone = ({\n accept = defaultAcceptedFileTypes,\n files = stableArray,\n maxFiles = 5,\n maxSizeInMb = 10,\n onDrop = stableFunc,\n className = undefined,\n wrapperClassName = undefined,\n extraInputProps = stableObject,\n isLoading = false,\n}: DropzoneProps) => {\n const overMaxFileLimit = files.length >= maxFiles;\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n maxFiles,\n multiple: maxFiles > 1,\n onDrop,\n maxSize: maxSizeInMb * 1024 * 1024,\n accept,\n onDropRejected: (errorList) => {\n if (errorList.length > 0 && errorList[0].errors[0].code === 'too-many-files') {\n toast.error(`Too many files. Please upload up to ${maxFiles} files at a time.`);\n } else if (errorList.length > 0 && errorList[0].errors[0].code === 'file-too-large') {\n toast.error(`File is too large. Please upload files smaller than ${maxSizeInMb} MB.`);\n } else {\n toast.error('File type not supported');\n }\n },\n disabled: files.length >= maxFiles,\n });\n\n const inputProps = {\n ...getInputProps(),\n ...extraInputProps,\n disabled: isLoading || extraInputProps.disabled,\n };\n\n return (\n <div\n className={cn(\n 'flex min-h-48 flex-col gap-4 hover:cursor-pointer',\n isDragActive && 'border-grey-700 opacity-75',\n overMaxFileLimit && 'hover:cursor-not-allowed',\n wrapperClassName,\n )}\n {...getRootProps()}\n >\n <div\n className={cn(\n 'bg-grey-100 border-grey-300 flex w-full flex-col items-center justify-center rounded-lg border-2 border-dashed py-10 text-center',\n overMaxFileLimit && !isDragActive && 'border-red-300',\n className,\n )}\n >\n {overMaxFileLimit ? (\n <div className=\"text flex flex-col items-center\">\n <LuFileWarning className=\"h-8 w-8 text-red-500\" />\n <div className=\"strong mt-4\">Maximum {maxFiles} file limit reached</div>\n </div>\n ) : (\n <>\n <input {...inputProps} />\n {isLoading ? (\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-gray-300 border-t-gray-700\" />\n ) : (\n <LuUpload className=\"h-8 w-8 text-gray-700\" />\n )}\n <div className=\"text-grey-700 mt-4 flex flex-col gap-1\">\n <p className=\"text-body-lg\">Drag an image or click to browse</p>\n <p className=\"text-body-sm\">{maxSizeInMb} MB max file size</p>\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n"]}
@@ -0,0 +1,2 @@
1
+ import {a}from'./chunk-WEDRHQPW.js';import {a as a$1,d,c,g,i}from'./chunk-7XCCBMKH.js';import {b as b$3}from'./chunk-QKW55VWE.js';import {a as a$3,b as b$1,c as c$1}from'./chunk-QXJK4OO3.js';import {b}from'./chunk-HOEJQG5V.js';import {b as b$2}from'./chunk-YXYBZKDG.js';import {a as a$2}from'./chunk-YTIIAU4W.js';import {useState,useMemo}from'react';import {LuZoomOut,LuZoomIn,LuRefreshCcw,LuCalendar}from'react-icons/lu';import V from'dayjs';import Y from'react-easy-crop';import {jsxs,jsx}from'react/jsx-runtime';import {DateTime,Duration}from'luxon';var _=({alt:t,className:a$1="",imagePreview:o=void 0,cropper:e=void 0})=>{let[i,p]=useState(false),m=!o||!i,d=!!e;return jsxs("div",{className:`flex max-w-[386px] flex-col ${a$1}`,children:[jsxs("div",{className:"relative h-60 rounded-md border",children:[o&&d?jsx(Y,{image:o,crop:e.crop,zoom:e.zoom,aspect:e.aspect,objectFit:"contain",onCropChange:e.setCrop,onZoomChange:e.setZoom,onCropComplete:e.onCropComplete,onMediaLoaded:()=>p(true),showGrid:false}):o&&jsx("img",{alt:t,className:`m-auto h-full w-full object-contain transition-opacity duration-300 ${i?"opacity-100":"opacity-0"}`,src:o,onLoad:()=>p(true),draggable:false}),m&&jsx("div",{"aria-label":o?"Loading image":"Awaiting image",className:"from-grey-300 to-grey-300 absolute inset-0 animate-pulse bg-gradient-to-r"})]}),!m&&d&&jsxs("div",{className:"mt-3 flex items-center justify-between gap-4 px-1",children:[jsxs("div",{className:"flex items-center gap-3",children:[jsx(b,{"aria-label":"zoom out",onClick:()=>e.setZoom(Math.max(e.zoom-.1,1)),className:"h-8",variant:"ghost-icon",children:jsx(LuZoomOut,{})}),jsx(a,{value:[e.zoom],min:1,max:3,step:.01,onValueChange:s=>e.setZoom(s[0]),className:"w-50",classNames:{thumb:"border-2 border-green-800",range:"bg-green-900"}}),jsx(b,{"aria-label":"zoom in",onClick:()=>e.setZoom(Math.min(e.zoom+.1,3)),variant:"ghost-icon",className:"h-8",children:jsx(LuZoomIn,{})})]}),jsxs(b,{onClick:e.reset,variant:"ghost",className:"h-8 p-2",children:[jsx(LuRefreshCcw,{}),"Reset"]})]})]})};var L="00:00",B="24:00",R=t=>DateTime.fromFormat(t,"HH:mm").isValid,O=({startTime:t=L,endTime:a=B,interval:o=30,onChange:e=void 0,className:i$1="",size:p="default",portal:m=true,...d$1})=>{R(t)||(console.error(`Invalid startTime: ${t}`),t=L),R(a)||(console.error(`Invalid endTime: ${a}`),a=B);let s=useMemo(()=>{let r=DateTime.fromFormat(a,"HH:mm"),u=Duration.fromObject({minutes:o}),v=[],n=DateTime.fromFormat(t,"HH:mm");for(;n<=r;){let w=n.toFormat("HH:mm");w==="00:00"&&n.equals(r)&&(w="24:00"),v.push({label:n.toFormat("h:mm a"),value:{hour:n.toFormat("HH"),min:n.toFormat("mm"),raw:w,formatted:n.toFormat("h:mm a")}}),n=n.plus(u);}return v},[t,a,o]),C=s.map(r=>({label:r.label,value:r.value.raw}));return jsxs(a$1,{onValueChange:r=>{let u=s.find(v=>v.value.raw===r);u&&e?.(u);},...d$1,children:[jsx(d,{className:a$2("max-w-[240px] md:w-[150px]",i$1),size:p,children:jsx(c,{placeholder:"Select one"})}),jsx(g,{position:"popper",className:"max-h-90",portal:m,children:C.map(r=>jsx(i,{className:"h-10",value:r.value,children:r.label},r.value))})]})},se=O;function q({className:t="",wrapperClassName:a="",value:o=void 0,onChange:e=void 0,disabled:i=false,calendarProps:p=void 0,placeholder:m="Pick a date",inputProps:d=void 0,showCalendarIcon:s=true}){let[C,D]=useState(false),r=u=>{e?.(u),D(false);};return jsxs(a$3,{open:!i&&C,onOpenChange:D,children:[jsxs(b$1,{className:a$2("focus-visible:ring-ring/50 hover:enabled:border-dark-green focus:enabled:border-dark-green focus-visible:border-dark-green relative flex w-full items-center rounded-md transition-all outline-none focus-within:shadow focus-within:shadow-green-300 focus-visible:ring-[3px] focus:enabled:shadow-green-300",a),children:[jsx(b$2,{className:a$2(s&&"pl-10",C?"border-dark-green":"",t),value:o?V(o).format("MM/DD/YYYY"):"",placeholder:m,readOnly:true,disabled:i,...d}),s&&jsx("div",{className:a$2("absolute top-1/2 left-4 h-4 w-4 -translate-y-1/2",i?"text-gray-400":"cursor-pointer text-black"),children:jsx(LuCalendar,{size:16})})]}),jsx(c$1,{className:"w-auto overflow-hidden p-0",align:"start",children:jsx(b$3,{mode:"single",selected:o?V(o).toDate():void 0,onSelect:r,...p})})]})}export{q as a,_ as b,O as c,se as d};//# sourceMappingURL=chunk-TKCBOIK2.js.map
2
+ //# sourceMappingURL=chunk-TKCBOIK2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/v2/image-preview/image-preview.tsx","../src/v2/time-select/time-select.tsx","../src/v2/date-picker/date-picker.tsx"],"names":["ImagePreview","alt","className","imagePreview","cropper","loaded","setLoaded","useState","showLoader","enableCrop","jsxs","jsx","Cropper","Button","LuZoomOut","Slider","v","LuZoomIn","LuRefreshCcw","START_TIME_DEFAULT","END_TIME_DEFAULT","isValidTime","time","DateTime","TimeSelect","startTime","endTime","interval","onChange","size","portal","inputProps","intervals","useMemo","dtEnd","durationInterval","Duration","res","i","raw","options","Select","e","SelectTrigger","cn","SelectValue","SelectContent","option","SelectItem","time_select_default","DatePicker","wrapperClassName","value","disabled","calendarProps","placeholder","showCalendarIcon","open","setOpen","handleSelect","val","Popover","PopoverTrigger","Input","dayjs","LuCalendar","PopoverContent","Calendar"],"mappings":"6iBAaaA,CAAAA,CAAe,CAAC,CAC3B,GAAA,CAAAC,CAAAA,CACA,UAAAC,GAAAA,CAAY,EAAA,CACZ,YAAA,CAAAC,CAAAA,CAAe,OACf,OAAA,CAAAC,CAAAA,CAAU,MACZ,CAAA,GAAyB,CACvB,GAAM,CAACC,CAAAA,CAAQC,CAAS,EAAIC,QAAAA,CAAS,KAAK,EACpCC,CAAAA,CAAa,CAACL,GAAgB,CAACE,CAAAA,CAC/BI,CAAAA,CAAa,CAAC,CAACL,CAAAA,CAErB,OACEM,KAAC,KAAA,CAAA,CAAI,SAAA,CAAW,+BAA+BR,GAAS,CAAA,CAAA,CACtD,QAAA,CAAA,CAAAQ,IAAAA,CAAC,OAAI,SAAA,CAAU,iCAAA,CACZ,UAAAP,CAAAA,EAAgBM,CAAAA,CACfE,IAACC,CAAAA,CAAA,CACC,KAAA,CAAOT,CAAAA,CACP,KAAMC,CAAAA,CAAQ,IAAA,CACd,IAAA,CAAMA,CAAAA,CAAQ,KACd,MAAA,CAAQA,CAAAA,CAAQ,MAAA,CAChB,SAAA,CAAU,UACV,YAAA,CAAcA,CAAAA,CAAQ,QACtB,YAAA,CAAcA,CAAAA,CAAQ,QACtB,cAAA,CAAgBA,CAAAA,CAAQ,cAAA,CACxB,aAAA,CAAe,IAAME,CAAAA,CAAU,IAAI,CAAA,CACnC,QAAA,CAAU,MACZ,CAAA,CAEAH,CAAAA,EACEQ,GAAAA,CAAC,KAAA,CAAA,CACC,IAAKV,CAAAA,CACL,SAAA,CAAW,uEAAuEI,CAAAA,CAAS,aAAA,CAAgB,WAAW,CAAA,CAAA,CACtH,GAAA,CAAKF,CAAAA,CACL,MAAA,CAAQ,IAAMG,CAAAA,CAAU,IAAI,CAAA,CAC5B,SAAA,CAAW,MACb,CAAA,CAIHE,CAAAA,EACCG,GAAAA,CAAC,KAAA,CAAA,CACC,aAAYR,CAAAA,CAAe,eAAA,CAAkB,iBAC7C,SAAA,CAAU,2EAAA,CACZ,GAEJ,CAAA,CAEC,CAACK,CAAAA,EAAcC,CAAAA,EACdC,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oDACb,QAAA,CAAA,CAAAA,IAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAC,GAAAA,CAACE,EAAA,CACC,YAAA,CAAW,WACX,OAAA,CAAS,IAAMT,EAAQ,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAQ,KAAO,EAAA,CAAK,CAAC,CAAC,CAAA,CAC9D,UAAU,KAAA,CACV,OAAA,CAAQ,YAAA,CAER,QAAA,CAAAO,IAACG,SAAAA,CAAA,EAAU,EACb,CAAA,CAEAH,GAAAA,CAACI,EAAA,CACC,KAAA,CAAO,CAACX,CAAAA,CAAQ,IAAI,CAAA,CACpB,GAAA,CAAK,CAAA,CACL,GAAA,CAAK,EACL,IAAA,CAAM,GAAA,CACN,aAAA,CAAgBY,CAAAA,EAAgBZ,EAAQ,OAAA,CAAQY,CAAAA,CAAE,CAAC,CAAC,CAAA,CACpD,UAAU,MAAA,CACV,UAAA,CAAY,CAAE,KAAA,CAAO,4BAA6B,KAAA,CAAO,cAAe,CAAA,CAC1E,CAAA,CAEAL,IAACE,CAAAA,CAAA,CACC,YAAA,CAAW,SAAA,CACX,QAAS,IAAMT,CAAAA,CAAQ,QAAQ,IAAA,CAAK,GAAA,CAAIA,EAAQ,IAAA,CAAO,EAAA,CAAK,CAAC,CAAC,EAC9D,OAAA,CAAQ,YAAA,CACR,UAAU,KAAA,CAEV,QAAA,CAAAO,IAACM,QAAAA,CAAA,EAAS,CAAA,CACZ,CAAA,CAAA,CACF,EAEAP,IAAAA,CAACG,CAAAA,CAAA,CAAO,OAAA,CAAST,CAAAA,CAAQ,MAAO,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,SAAA,CACxD,UAAAO,GAAAA,CAACO,YAAAA,CAAA,EAAa,CAAA,CAAE,SAElB,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,CAEJ,ECzEA,IAAMC,EAAqB,OAAA,CACrBC,CAAAA,CAAmB,OAAA,CAEnBC,CAAAA,CAAeC,GACRC,QAAAA,CAAS,UAAA,CAAWD,EAAM,OAAO,CAAA,CAClC,QAGCE,CAAAA,CAAa,CAAC,CACzB,SAAA,CAAAC,EAAYN,CAAAA,CACZ,OAAA,CAAAO,CAAAA,CAAUN,CAAAA,CACV,SAAAO,CAAAA,CAAW,EAAA,CACX,QAAA,CAAAC,CAAAA,CAAW,OACX,SAAA,CAAA1B,GAAAA,CAAY,GACZ,IAAA,CAAA2B,CAAAA,CAAO,UACP,MAAA,CAAAC,CAAAA,CAAS,IAAA,CACT,GAAGC,GACL,CAAA,GAAa,CACNV,EAAYI,CAAS,CAAA,GACxB,QAAQ,KAAA,CAAM,CAAA,mBAAA,EAAsBA,CAAS,CAAA,CAAE,EAE/CA,CAAAA,CAAYN,CAAAA,CAAAA,CAETE,EAAYK,CAAO,CAAA,GACtB,QAAQ,KAAA,CAAM,CAAA,iBAAA,EAAoBA,CAAO,CAAA,CAAE,EAE3CA,CAAAA,CAAUN,CAAAA,CAAAA,CAGZ,IAAMY,CAAAA,CAAYC,QAAQ,IAAkB,CAC1C,IAAMC,CAAAA,CAAQX,SAAS,UAAA,CAAWG,CAAAA,CAAS,OAAO,CAAA,CAC5CS,CAAAA,CAAmBC,SAAS,UAAA,CAAW,CAAE,OAAA,CAAST,CAAS,CAAC,CAAA,CAC5DU,CAAAA,CAAM,EAAC,CACTC,EAAIf,QAAAA,CAAS,UAAA,CAAWE,CAAAA,CAAW,OAAO,EAC9C,KAAOa,CAAAA,EAAKJ,GAAO,CACjB,IAAIK,EAAMD,CAAAA,CAAE,QAAA,CAAS,OAAO,CAAA,CAExBC,IAAQ,OAAA,EAAWD,CAAAA,CAAE,MAAA,CAAOJ,CAAK,IAAGK,CAAAA,CAAM,OAAA,CAAA,CAE9CF,CAAAA,CAAI,IAAA,CAAK,CACP,KAAA,CAAOC,CAAAA,CAAE,SAAS,QAAQ,CAAA,CAC1B,MAAO,CACL,IAAA,CAAMA,CAAAA,CAAE,QAAA,CAAS,IAAI,CAAA,CACrB,GAAA,CAAKA,EAAE,QAAA,CAAS,IAAI,EACpB,GAAA,CAAAC,CAAAA,CACA,SAAA,CAAWD,CAAAA,CAAE,SAAS,QAAQ,CAChC,CACF,CAAC,CAAA,CACDA,EAAIA,CAAAA,CAAE,IAAA,CAAKH,CAAgB,EAC7B,CAEA,OAAOE,CACT,CAAA,CAAG,CAACZ,EAAWC,CAAAA,CAASC,CAAQ,CAAC,CAAA,CAE3Ba,EAAUR,CAAAA,CAAU,GAAA,CAAKV,IAAU,CACvC,KAAA,CAAOA,EAAK,KAAA,CACZ,KAAA,CAAOA,CAAAA,CAAK,KAAA,CAAM,GACpB,CAAA,CAAE,CAAA,CAUF,OACEZ,IAAAA,CAAC+B,IAAA,CAAO,aAAA,CATcC,CAAAA,EAAe,CACrC,IAAMf,CAAAA,CAAWK,CAAAA,CAAU,KAAMV,CAAAA,EAASA,CAAAA,CAAK,MAAM,GAAA,GAAQoB,CAAC,CAAA,CAEzDf,CAAAA,EAELC,IAAWD,CAAQ,EACrB,CAAA,CAG0C,GAAGI,IACzC,QAAA,CAAA,CAAApB,GAAAA,CAACgC,CAAAA,CAAA,CAAc,UAAWC,GAAAA,CAAG,4BAAA,CAA8B1C,GAAS,CAAA,CAAG,IAAA,CAAM2B,EAC3E,QAAA,CAAAlB,GAAAA,CAACkC,CAAAA,CAAA,CAAY,YAAY,YAAA,CAAa,CAAA,CACxC,EACAlC,GAAAA,CAACmC,CAAAA,CAAA,CAAc,QAAA,CAAS,QAAA,CAAS,SAAA,CAAU,UAAA,CAAW,OAAQhB,CAAAA,CAC3D,QAAA,CAAAU,EAAQ,GAAA,CAAKO,CAAAA,EAGZpC,IAACqC,CAAAA,CAAA,CAAW,SAAA,CAAU,MAAA,CAA0B,MAAOD,CAAAA,CAAO,KAAA,CAC3D,QAAA,CAAAA,CAAAA,CAAO,OADwBA,CAAAA,CAAO,KAEzC,CACD,CAAA,CACH,GACF,CAEJ,CAAA,CAEOE,GAAQzB,EC1FR,SAAS0B,CAAAA,CAAW,CACzB,SAAA,CAAAhD,CAAAA,CAAY,GACZ,gBAAA,CAAAiD,CAAAA,CAAmB,EAAA,CACnB,KAAA,CAAAC,EAAQ,MAAA,CACR,QAAA,CAAAxB,EAAW,MAAA,CACX,QAAA,CAAAyB,EAAW,KAAA,CACX,aAAA,CAAAC,CAAAA,CAAgB,MAAA,CAChB,YAAAC,CAAAA,CAAc,aAAA,CACd,UAAA,CAAAxB,CAAAA,CAAa,OACb,gBAAA,CAAAyB,CAAAA,CAAmB,IACrB,CAAA,CAAsD,CACpD,GAAM,CAACC,EAAMC,CAAO,CAAA,CAAInD,SAAkB,KAAK,CAAA,CAEzCoD,CAAAA,CAAgBC,CAAAA,EAA0B,CAC9ChC,CAAAA,GAAWgC,CAAG,EACdF,CAAAA,CAAQ,KAAK,EACf,CAAA,CAEA,OACEhD,IAAAA,CAACmD,GAAAA,CAAA,CAAQ,IAAA,CAAM,CAACR,GAAYI,CAAAA,CAAM,YAAA,CAAcC,EAC9C,QAAA,CAAA,CAAAhD,IAAAA,CAACoD,GAAAA,CAAA,CACC,UAAWlB,GAAAA,CACT,+SAAA,CACAO,CACF,CAAA,CAEA,UAAAxC,GAAAA,CAACoD,GAAAA,CAAA,CACC,SAAA,CAAWnB,IAAGY,CAAAA,EAAoB,OAAA,CAASC,EAAO,mBAAA,CAAsB,EAAA,CAAIvD,CAAS,CAAA,CACrF,KAAA,CAAOkD,CAAAA,CAAQY,CAAAA,CAAMZ,CAAK,CAAA,CAAE,MAAA,CAAO,YAAY,CAAA,CAAI,EAAA,CACnD,YAAaG,CAAAA,CACb,QAAA,CAAQ,IAAA,CACR,QAAA,CAAUF,EACT,GAAGtB,CAAAA,CACN,EACCyB,CAAAA,EACC7C,GAAAA,CAAC,OACC,SAAA,CAAWiC,GAAAA,CACT,kDAAA,CACAS,CAAAA,CAAW,gBAAkB,2BAC/B,CAAA,CAEA,QAAA,CAAA1C,GAAAA,CAACsD,WAAA,CAAW,IAAA,CAAM,EAAA,CAAI,CAAA,CACxB,GAEJ,CAAA,CACAtD,GAAAA,CAACuD,IAAA,CAAe,SAAA,CAAU,6BAA6B,KAAA,CAAM,OAAA,CAC3D,QAAA,CAAAvD,GAAAA,CAACwD,IAAA,CACC,IAAA,CAAK,SACL,QAAA,CAAUf,CAAAA,CAAQY,EAAMZ,CAAK,CAAA,CAAE,MAAA,EAAO,CAAI,OAC1C,QAAA,CAAUO,CAAAA,CACT,GAAGL,CAAAA,CACN,CAAA,CACF,GACF,CAEJ","file":"chunk-TKCBOIK2.js","sourcesContent":["import { useState } from 'react';\nimport { LuRefreshCcw, LuZoomIn, LuZoomOut } from 'react-icons/lu';\nimport Cropper from 'react-easy-crop';\nimport { Button, Slider } from '../index';\nimport type { UseImageCropper } from './useImageCropper';\n\nexport type ImagePreviewProps = {\n alt: string;\n className?: string;\n imagePreview?: string; // optional so we can show skeleton while awaiting URL\n cropper?: UseImageCropper; // when provided, show cropping UI\n};\n\nexport const ImagePreview = ({\n alt,\n className = '',\n imagePreview = undefined,\n cropper = undefined,\n}: ImagePreviewProps) => {\n const [loaded, setLoaded] = useState(false);\n const showLoader = !imagePreview || !loaded;\n const enableCrop = !!cropper;\n\n return (\n <div className={`flex max-w-[386px] flex-col ${className}`}>\n <div className=\"relative h-60 rounded-md border\">\n {imagePreview && enableCrop ? (\n <Cropper\n image={imagePreview}\n crop={cropper.crop}\n zoom={cropper.zoom}\n aspect={cropper.aspect}\n objectFit=\"contain\"\n onCropChange={cropper.setCrop}\n onZoomChange={cropper.setZoom}\n onCropComplete={cropper.onCropComplete}\n onMediaLoaded={() => setLoaded(true)}\n showGrid={false}\n />\n ) : (\n imagePreview && (\n <img\n alt={alt}\n className={`m-auto h-full w-full object-contain transition-opacity duration-300 ${loaded ? 'opacity-100' : 'opacity-0'}`}\n src={imagePreview}\n onLoad={() => setLoaded(true)}\n draggable={false}\n />\n )\n )}\n\n {showLoader && (\n <div\n aria-label={imagePreview ? 'Loading image' : 'Awaiting image'}\n className=\"from-grey-300 to-grey-300 absolute inset-0 animate-pulse bg-gradient-to-r\"\n />\n )}\n </div>\n\n {!showLoader && enableCrop && (\n <div className=\"mt-3 flex items-center justify-between gap-4 px-1\">\n <div className=\"flex items-center gap-3\">\n <Button\n aria-label=\"zoom out\"\n onClick={() => cropper.setZoom(Math.max(cropper.zoom - 0.1, 1))}\n className=\"h-8\"\n variant=\"ghost-icon\"\n >\n <LuZoomOut />\n </Button>\n\n <Slider\n value={[cropper.zoom]}\n min={1}\n max={3}\n step={0.01}\n onValueChange={(v: number[]) => cropper.setZoom(v[0])}\n className=\"w-50\"\n classNames={{ thumb: 'border-2 border-green-800', range: 'bg-green-900' }}\n />\n\n <Button\n aria-label=\"zoom in\"\n onClick={() => cropper.setZoom(Math.min(cropper.zoom + 0.1, 3))}\n variant=\"ghost-icon\"\n className=\"h-8\"\n >\n <LuZoomIn />\n </Button>\n </div>\n\n <Button onClick={cropper.reset} variant=\"ghost\" className=\"h-8 p-2\">\n <LuRefreshCcw />\n Reset\n </Button>\n </div>\n )}\n </div>\n );\n};\n","import { DateTime, Duration } from 'luxon';\nimport { useMemo } from 'react';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/v2';\nimport { cn } from '@/lib/utils';\n\nexport type Interval = {\n label: string;\n value: {\n hour: string;\n min: string;\n raw: string;\n formatted: string;\n };\n};\n\ntype Props = {\n startTime?: string;\n endTime?: string;\n interval?: number;\n onChange?: (e: Interval) => void;\n className?: string;\n size?: 'default' | 'sm';\n portal?: boolean;\n [inputProps: string]: unknown;\n};\n\nconst START_TIME_DEFAULT = '00:00';\nconst END_TIME_DEFAULT = '24:00';\n\nconst isValidTime = (time: string) => {\n const dt = DateTime.fromFormat(time, 'HH:mm');\n return dt.isValid;\n};\n\nexport const TimeSelect = ({\n startTime = START_TIME_DEFAULT,\n endTime = END_TIME_DEFAULT,\n interval = 30,\n onChange = undefined,\n className = '',\n size = 'default',\n portal = true,\n ...inputProps\n}: Props) => {\n if (!isValidTime(startTime)) {\n console.error(`Invalid startTime: ${startTime}`);\n // eslint-disable-next-line no-param-reassign\n startTime = START_TIME_DEFAULT;\n }\n if (!isValidTime(endTime)) {\n console.error(`Invalid endTime: ${endTime}`);\n // eslint-disable-next-line no-param-reassign\n endTime = END_TIME_DEFAULT;\n }\n\n const intervals = useMemo((): Interval[] => {\n const dtEnd = DateTime.fromFormat(endTime, 'HH:mm');\n const durationInterval = Duration.fromObject({ minutes: interval });\n const res = [];\n let i = DateTime.fromFormat(startTime, 'HH:mm');\n while (i <= dtEnd) {\n let raw = i.toFormat('HH:mm');\n // Avoid duplicate keys for \"00:00\" and \"00:00\" (end of day)\n if (raw === '00:00' && i.equals(dtEnd)) raw = '24:00';\n\n res.push({\n label: i.toFormat('h:mm a'),\n value: {\n hour: i.toFormat('HH'),\n min: i.toFormat('mm'),\n raw,\n formatted: i.toFormat('h:mm a'),\n },\n });\n i = i.plus(durationInterval);\n }\n\n return res;\n }, [startTime, endTime, interval]);\n\n const options = intervals.map((time) => ({\n label: time.label,\n value: time.value.raw,\n }));\n\n const handleOnSelect = (e: unknown) => {\n const interval = intervals.find((time) => time.value.raw === e);\n\n if (!interval) return;\n\n onChange?.(interval);\n };\n\n return (\n <Select onValueChange={handleOnSelect} {...inputProps}>\n <SelectTrigger className={cn('max-w-[240px] md:w-[150px]', className)} size={size}>\n <SelectValue placeholder=\"Select one\" />\n </SelectTrigger>\n <SelectContent position=\"popper\" className=\"max-h-90\" portal={portal}>\n {options.map((option) => (\n // Note that labels and values here may appear to be duplicates\n // For example, \"00:00\" and \"24:00\" will both have the same value \"00:00\"\n <SelectItem className=\"h-10\" key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n};\n\nexport default TimeSelect;\n","import * as React from 'react';\nimport { ComponentProps, useState } from 'react';\nimport { LuCalendar } from 'react-icons/lu';\nimport dayjs from 'dayjs';\nimport { Calendar, Input, Popover, PopoverContent, PopoverTrigger } from '@/v2';\nimport { cn } from '@/lib/utils';\nimport { InputProps } from '@/v2/input/input';\n\nexport type DatePickerProps = {\n className?: string;\n wrapperClassName?: string;\n value?: Date;\n onChange?: (value: Date | undefined) => void;\n disabled?: boolean;\n // NOTE: Disallow changing this to a range-picker by forcing mode to \"single\" and using value instead of selected\n calendarProps?: Omit<ComponentProps<typeof Calendar>, 'mode' | 'selected' | 'onSelect'>;\n placeholder?: string;\n inputProps?: InputProps;\n showCalendarIcon?: boolean;\n};\n\nexport function DatePicker({\n className = '',\n wrapperClassName = '',\n value = undefined,\n onChange = undefined,\n disabled = false,\n calendarProps = undefined,\n placeholder = 'Pick a date',\n inputProps = undefined,\n showCalendarIcon = true,\n}: DatePickerProps & ComponentProps<typeof Calendar>) {\n const [open, setOpen] = useState<boolean>(false);\n\n const handleSelect = (val: Date | undefined) => {\n onChange?.(val);\n setOpen(false);\n };\n\n return (\n <Popover open={!disabled && open} onOpenChange={setOpen}>\n <PopoverTrigger\n className={cn(\n 'focus-visible:ring-ring/50 hover:enabled:border-dark-green focus:enabled:border-dark-green focus-visible:border-dark-green relative flex w-full items-center rounded-md transition-all outline-none focus-within:shadow focus-within:shadow-green-300 focus-visible:ring-[3px] focus:enabled:shadow-green-300',\n wrapperClassName,\n )}\n >\n <Input\n className={cn(showCalendarIcon && 'pl-10', open ? 'border-dark-green' : '', className)}\n value={value ? dayjs(value).format('MM/DD/YYYY') : ''}\n placeholder={placeholder}\n readOnly\n disabled={disabled}\n {...inputProps}\n />\n {showCalendarIcon && (\n <div\n className={cn(\n 'absolute top-1/2 left-4 h-4 w-4 -translate-y-1/2',\n disabled ? 'text-gray-400' : 'cursor-pointer text-black',\n )}\n >\n <LuCalendar size={16} />\n </div>\n )}\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={value ? dayjs(value).toDate() : undefined}\n onSelect={handleSelect}\n {...calendarProps}\n />\n </PopoverContent>\n </Popover>\n );\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react');var U=e=>new Promise((n,m)=>{let r=new Image;r.addEventListener("load",()=>n(r)),r.addEventListener("error",s=>m(s)),r.src=e;}),f=e=>e&&["image/webp","image/png","image/jpeg","image/avif"].includes(e)?e:"image/jpeg",P=(e,n)=>{let r={"image/jpeg":".jpg","image/png":".png","image/webp":".webp","image/avif":".avif"}[n]||"";return e.toLowerCase().endsWith(r)?e:e.replace(/\.[a-zA-Z0-9]+$/,"")+r},j=(e,n,m)=>{if(!e.startsWith("data:")){let v=f(m);return new File([e],P(n,v),{type:v})}let[r,s]=e.split(","),C=f(r.split(";")[0].replace("data:","")),u=atob(s),x=u.length,d=new Uint8Array(x),c=0;for(;c<x;)d[c]=u.charCodeAt(c),c+=1;return new File([d],P(n,C),{type:C})};function B(e={}){let{aspect:n=1.6,minZoom:m=1,maxZoom:r=3,initialZoom:s=1}=e,[C,u]=react.useState({x:0,y:0}),[x,d]=react.useState(s),[c,v]=react.useState(n),[g,Z]=react.useState(null),I=react.useCallback((t,i)=>{Z(i);},[]),F=react.useCallback(()=>{u({x:0,y:0}),d(s),Z(null);},[s]),y=react.useCallback(async(t,i)=>{if(!g)return null;let a=await U(t),o=document.createElement("canvas"),l=o.getContext("2d");if(!l)throw new Error("Canvas 2D context not available");let{width:p,height:b}=g;o.width=p,o.height=b,l.drawImage(a,g.x,g.y,p,b,0,0,p,b);let h=f(i||(t.startsWith("data:")?t.split(";")[0].replace("data:",""):void 0));return {canvas:o,mime:h}},[g]),E=react.useCallback(async(t,i,a)=>{let o=await y(t,a);if(!o)return j(t,i||"cropped-image",a);let{canvas:l,mime:p}=o,b=await new Promise(h=>{l.toBlob(L=>h(L||new Blob),p,.9);});return new File([b],P(i||"cropped-image",p),{type:p})},[y]),M=react.useCallback(async(t,i)=>{let a=await y(t,i);if(!a)return t;let{canvas:o,mime:l}=a;return o.toDataURL(l,.9)},[y]);return {crop:C,zoom:x,aspect:c,croppedAreaPixels:g,setCrop:u,setZoom:t=>d(Math.min(Math.max(t,m),r)),setAspect:v,onCropComplete:I,reset:F,getCroppedFile:E,getCroppedPreview:M}}exports.a=B;//# sourceMappingURL=chunk-WIO4QPNH.cjs.map
2
+ //# sourceMappingURL=chunk-WIO4QPNH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/v2/image-preview/useImageCropper.ts"],"names":["createImage","url","resolve","reject","img","e","chooseOutputMime","input","ensureExtension","name","mime","wantedExt","dataUrlToFile","dataUrl","fileName","mimeTypeHint","meta","base64","binary","len","buffer","i","useImageCropper","options","aspect","minZoom","maxZoom","initialZoom","crop","setCrop","useState","zoom","setZoom","currentAspect","setAspect","croppedAreaPixels","setCroppedAreaPixels","onCropComplete","useCallback","_","croppedPixels","reset","getCroppedCanvas","imageSrc","image","canvas","ctx","width","height","getCroppedFile","result","blob","b","getCroppedPreview","z"],"mappings":"wCAiCA,IAAMA,CAAAA,CAAeC,CAAAA,EACZ,IAAI,OAAA,CAAQ,CAACC,CAAAA,CAASC,CAAAA,GAAW,CACtC,IAAMC,CAAAA,CAAM,IAAI,KAAA,CAChBA,CAAAA,CAAI,gBAAA,CAAiB,MAAA,CAAQ,IAAMF,CAAAA,CAAQE,CAAG,CAAC,CAAA,CAC/CA,CAAAA,CAAI,gBAAA,CAAiB,OAAA,CAAUC,CAAAA,EAAMF,CAAAA,CAAOE,CAAC,CAAC,CAAA,CAC9CD,CAAAA,CAAI,GAAA,CAAMH,EACZ,CAAC,CAAA,CAGGK,CAAAA,CAAoBC,CAAAA,EAEpBA,CAAAA,EADY,CAAC,YAAA,CAAc,WAAA,CAAa,YAAA,CAAc,YAAY,CAAA,CACjD,QAAA,CAASA,CAAK,CAAA,CAAUA,CAAAA,CACtC,YAAA,CAGHC,CAAAA,CAAkB,CAACC,CAAAA,CAAcC,CAAAA,GAAyB,CAO9D,IAAMC,CAAAA,CANiC,CACrC,YAAA,CAAc,MAAA,CACd,WAAA,CAAa,MAAA,CACb,YAAA,CAAc,OAAA,CACd,YAAA,CAAc,OAChB,CAAA,CACyBD,CAAI,CAAA,EAAK,EAAA,CAClC,OAAID,CAAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAASE,CAAS,CAAA,CAAUF,CAAAA,CAEtCA,CAAAA,CAAK,OAAA,CAAQ,iBAAA,CAAmB,EAAE,CAAA,CACjCE,CAChB,CAAA,CAEMC,CAAAA,CAAgB,CAACC,CAAAA,CAAiBC,CAAAA,CAAkBC,CAAAA,GAAgC,CACxF,GAAI,CAACF,CAAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,CAAG,CAEhC,IAAMH,CAAAA,CAAOJ,CAAAA,CAAiBS,CAAY,CAAA,CAC1C,OAAO,IAAI,IAAA,CAAK,CAACF,CAAO,CAAA,CAAGL,CAAAA,CAAgBM,CAAAA,CAAUJ,CAAI,CAAA,CAAG,CAAE,IAAA,CAAMA,CAAK,CAAC,CAC5E,CACA,GAAM,CAACM,CAAAA,CAAMC,CAAM,CAAA,CAAIJ,CAAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAClCH,CAAAA,CAAOJ,CAAAA,CAAiBU,CAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAS,EAAE,CAAC,CAAA,CAC/DE,CAAAA,CAAS,IAAA,CAAKD,CAAM,CAAA,CACpBE,CAAAA,CAAMD,CAAAA,CAAO,MAAA,CACbE,CAAAA,CAAS,IAAI,UAAA,CAAWD,CAAG,CAAA,CAC7BE,CAAAA,CAAI,CAAA,CACR,KAAOA,CAAAA,CAAIF,CAAAA,EACTC,CAAAA,CAAOC,CAAC,CAAA,CAAIH,CAAAA,CAAO,UAAA,CAAWG,CAAC,CAAA,CAC/BA,CAAAA,EAAK,CAAA,CAEP,OAAO,IAAI,IAAA,CAAK,CAACD,CAAM,CAAA,CAAGZ,CAAAA,CAAgBM,CAAAA,CAAUJ,CAAI,CAAA,CAAG,CAAE,IAAA,CAAMA,CAAK,CAAC,CAC3E,CAAA,CAEO,SAASY,CAAAA,CAAgBC,CAAAA,CAAkC,GAAqB,CACrF,GAAM,CAAE,MAAA,CAAAC,CAAAA,CAAS,GAAA,CAAK,OAAA,CAAAC,CAAAA,CAAU,CAAA,CAAG,OAAA,CAAAC,CAAAA,CAAU,CAAA,CAAG,WAAA,CAAAC,CAAAA,CAAc,CAAE,CAAA,CAAIJ,CAAAA,CAE9D,CAACK,CAAAA,CAAMC,CAAO,CAAA,CAAIC,cAAAA,CAAS,CAAE,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAE,CAAC,CAAA,CACzC,CAACC,CAAAA,CAAMC,CAAO,CAAA,CAAIF,cAAAA,CAASH,CAAW,CAAA,CACtC,CAACM,CAAAA,CAAeC,CAAS,CAAA,CAAIJ,cAAAA,CAASN,CAAM,CAAA,CAC5C,CAACW,CAAAA,CAAmBC,CAAoB,CAAA,CAAIN,cAAAA,CAAsB,IAAI,CAAA,CAEtEO,CAAAA,CAAiBC,iBAAAA,CAAY,CAACC,CAAAA,CAASC,CAAAA,GAAwB,CACnEJ,CAAAA,CAAqBI,CAAa,EACpC,CAAA,CAAG,EAAE,CAAA,CAECC,CAAAA,CAAQH,kBAAY,IAAM,CAC9BT,CAAAA,CAAQ,CAAE,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAE,CAAC,CAAA,CACtBG,CAAAA,CAAQL,CAAW,CAAA,CACnBS,CAAAA,CAAqB,IAAI,EAC3B,CAAA,CAAG,CAACT,CAAW,CAAC,CAAA,CAEVe,CAAAA,CAAmBJ,iBAAAA,CACvB,MAAOK,CAAAA,CAAkB5B,CAAAA,GAA0B,CACjD,GAAI,CAACoB,CAAAA,CACH,OAAO,IAAA,CAET,IAAMS,CAAAA,CAAQ,MAAM5C,CAAAA,CAAY2C,CAAQ,CAAA,CAClCE,CAAAA,CAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CACxCC,CAAAA,CAAMD,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAClC,GAAI,CAACC,CAAAA,CAAK,MAAM,IAAI,KAAA,CAAM,iCAAiC,CAAA,CAE3D,GAAM,CAAE,KAAA,CAAAC,CAAAA,CAAO,MAAA,CAAAC,CAAO,CAAA,CAAIb,CAAAA,CAC1BU,EAAO,KAAA,CAAQE,CAAAA,CACfF,CAAAA,CAAO,MAAA,CAASG,CAAAA,CAEhBF,CAAAA,CAAI,SAAA,CACFF,CAAAA,CACAT,CAAAA,CAAkB,CAAA,CAClBA,CAAAA,CAAkB,CAAA,CAClBY,CAAAA,CACAC,CAAAA,CACA,CAAA,CACA,CAAA,CACAD,CAAAA,CACAC,CACF,CAAA,CAEA,IAAMtC,CAAAA,CAAOJ,CAAAA,CACXS,CAAAA,GACG4B,CAAAA,CAAS,UAAA,CAAW,OAAO,CAAA,CAAIA,CAAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAS,EAAE,CAAA,CAAI,MAAA,CAClF,CAAA,CAEA,OAAO,CAAE,MAAA,CAAAE,CAAAA,CAAQ,IAAA,CAAAnC,CAAK,CACxB,CAAA,CACA,CAACyB,CAAiB,CACpB,CAAA,CAEMc,CAAAA,CAAiBX,iBAAAA,CACrB,MAAOK,CAAAA,CAAkB7B,CAAAA,CAAmBC,CAAAA,GAA0B,CACpE,IAAMmC,CAAAA,CAAS,MAAMR,CAAAA,CAAiBC,CAAAA,CAAU5B,CAAY,EAC5D,GAAI,CAACmC,CAAAA,CACH,OAAOtC,CAAAA,CAAc+B,CAAAA,CAAU7B,CAAAA,EAAY,eAAA,CAAiBC,CAAY,CAAA,CAG1E,GAAM,CAAE,MAAA,CAAA8B,CAAAA,CAAQ,IAAA,CAAAnC,CAAK,CAAA,CAAIwC,CAAAA,CACnBC,CAAAA,CAAa,MAAM,IAAI,OAAA,CAASjD,CAAAA,EAAY,CAChD2C,CAAAA,CAAO,MAAA,CAAQO,CAAAA,EAAMlD,CAAAA,CAASkD,CAAAA,EAAc,IAAI,IAAM,CAAA,CAAG1C,CAAAA,CAAM,EAAG,EACpE,CAAC,CAAA,CACD,OAAO,IAAI,IAAA,CAAK,CAACyC,CAAI,CAAA,CAAG3C,CAAAA,CAAgBM,CAAAA,EAAY,eAAA,CAAiBJ,CAAI,CAAA,CAAG,CAAE,IAAA,CAAMA,CAAK,CAAC,CAC5F,CAAA,CACA,CAACgC,CAAgB,CACnB,CAAA,CAEMW,CAAAA,CAAoBf,iBAAAA,CACxB,MAAOK,CAAAA,CAAkB5B,CAAAA,GAA0B,CACjD,IAAMmC,CAAAA,CAAS,MAAMR,CAAAA,CAAiBC,CAAAA,CAAU5B,CAAY,CAAA,CAC5D,GAAI,CAACmC,CAAAA,CACH,OAAOP,CAAAA,CAGT,GAAM,CAAE,MAAA,CAAAE,CAAAA,CAAQ,IAAA,CAAAnC,CAAK,CAAA,CAAIwC,CAAAA,CACzB,OAAOL,CAAAA,CAAO,SAAA,CAAUnC,CAAAA,CAAM,EAAG,CACnC,CAAA,CACA,CAACgC,CAAgB,CACnB,CAAA,CAEA,OAAO,CACL,IAAA,CAAAd,CAAAA,CACA,IAAA,CAAAG,CAAAA,CACA,MAAA,CAAQE,CAAAA,CACR,iBAAA,CAAAE,CAAAA,CACA,OAAA,CAAAN,CAAAA,CACA,OAAA,CAAUyB,CAAAA,EAActB,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIsB,CAAAA,CAAG7B,CAAO,CAAA,CAAGC,CAAO,CAAC,CAAA,CACvE,SAAA,CAAAQ,CAAAA,CACA,cAAA,CAAAG,CAAAA,CACA,KAAA,CAAAI,CAAAA,CACA,cAAA,CAAAQ,CAAAA,CACA,iBAAA,CAAAI,CACF,CACF","file":"chunk-WIO4QPNH.cjs","sourcesContent":["import { useCallback, useState } from 'react';\nimport type { Area } from 'react-easy-crop';\n\nexport type UseImageCropperOptions = {\n aspect?: number; // default 1.6\n minZoom?: number; // default 1\n maxZoom?: number; // default 3\n initialZoom?: number; // default 1\n};\n\nexport type UseImageCropper = {\n crop: { x: number; y: number };\n zoom: number;\n aspect: number;\n croppedAreaPixels: Area | null;\n setCrop: (c: { x: number; y: number }) => void;\n setZoom: (z: number) => void;\n setAspect: (a: number) => void;\n onCropComplete: (croppedArea: Area, croppedAreaPixels: Area) => void;\n reset: () => void;\n /**\n * Given an image source (Data URL or object URL) returns a Promise<File> of the cropped image\n * using current crop state. If cropping fails, rejects.\n */\n getCroppedFile: (imageSrc: string, fileName?: string, mimeTypeHint?: string) => Promise<File>;\n /**\n * Given an image source (Data URL or object URL) returns a Data URL string of the cropped image\n * using current crop state. If cropping fails, rejects.\n */\n getCroppedPreview: (imageSrc: string, mimeTypeHint?: string) => Promise<string>;\n};\n\n// Utilities\nconst createImage = (url: string): Promise<HTMLImageElement> => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.addEventListener('load', () => resolve(img));\n img.addEventListener('error', (e) => reject(e));\n img.src = url;\n });\n};\n\nconst chooseOutputMime = (input?: string): string => {\n const allowed = ['image/webp', 'image/png', 'image/jpeg', 'image/avif'];\n if (input && allowed.includes(input)) return input;\n return 'image/jpeg';\n};\n\nconst ensureExtension = (name: string, mime: string): string => {\n const extMap: Record<string, string> = {\n 'image/jpeg': '.jpg',\n 'image/png': '.png',\n 'image/webp': '.webp',\n 'image/avif': '.avif',\n };\n const wantedExt = extMap[mime] || '';\n if (name.toLowerCase().endsWith(wantedExt)) return name;\n // strip existing extension\n const base = name.replace(/\\.[a-zA-Z0-9]+$/, '');\n return base + wantedExt;\n};\n\nconst dataUrlToFile = (dataUrl: string, fileName: string, mimeTypeHint?: string): File => {\n if (!dataUrl.startsWith('data:')) {\n // Not a data URL; create a File with generic mime\n const mime = chooseOutputMime(mimeTypeHint);\n return new File([dataUrl], ensureExtension(fileName, mime), { type: mime });\n }\n const [meta, base64] = dataUrl.split(',');\n const mime = chooseOutputMime(meta.split(';')[0].replace('data:', ''));\n const binary = atob(base64);\n const len = binary.length;\n const buffer = new Uint8Array(len);\n let i = 0;\n while (i < len) {\n buffer[i] = binary.charCodeAt(i);\n i += 1;\n }\n return new File([buffer], ensureExtension(fileName, mime), { type: mime });\n};\n\nexport function useImageCropper(options: UseImageCropperOptions = {}): UseImageCropper {\n const { aspect = 1.6, minZoom = 1, maxZoom = 3, initialZoom = 1 } = options;\n\n const [crop, setCrop] = useState({ x: 0, y: 0 });\n const [zoom, setZoom] = useState(initialZoom);\n const [currentAspect, setAspect] = useState(aspect);\n const [croppedAreaPixels, setCroppedAreaPixels] = useState<Area | null>(null);\n\n const onCropComplete = useCallback((_: Area, croppedPixels: Area) => {\n setCroppedAreaPixels(croppedPixels);\n }, []);\n\n const reset = useCallback(() => {\n setCrop({ x: 0, y: 0 });\n setZoom(initialZoom);\n setCroppedAreaPixels(null);\n }, [initialZoom]);\n\n const getCroppedCanvas = useCallback(\n async (imageSrc: string, mimeTypeHint?: string) => {\n if (!croppedAreaPixels) {\n return null;\n }\n const image = await createImage(imageSrc);\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Canvas 2D context not available');\n\n const { width, height } = croppedAreaPixels;\n canvas.width = width;\n canvas.height = height;\n\n ctx.drawImage(\n image,\n croppedAreaPixels.x,\n croppedAreaPixels.y,\n width,\n height,\n 0,\n 0,\n width,\n height,\n );\n\n const mime = chooseOutputMime(\n mimeTypeHint ||\n (imageSrc.startsWith('data:') ? imageSrc.split(';')[0].replace('data:', '') : undefined),\n );\n\n return { canvas, mime };\n },\n [croppedAreaPixels],\n );\n\n const getCroppedFile = useCallback(\n async (imageSrc: string, fileName?: string, mimeTypeHint?: string) => {\n const result = await getCroppedCanvas(imageSrc, mimeTypeHint);\n if (!result) {\n return dataUrlToFile(imageSrc, fileName || 'cropped-image', mimeTypeHint);\n }\n\n const { canvas, mime } = result;\n const blob: Blob = await new Promise((resolve) => {\n canvas.toBlob((b) => resolve((b as Blob) || new Blob()), mime, 0.9);\n });\n return new File([blob], ensureExtension(fileName || 'cropped-image', mime), { type: mime });\n },\n [getCroppedCanvas],\n );\n\n const getCroppedPreview = useCallback(\n async (imageSrc: string, mimeTypeHint?: string) => {\n const result = await getCroppedCanvas(imageSrc, mimeTypeHint);\n if (!result) {\n return imageSrc;\n }\n\n const { canvas, mime } = result;\n return canvas.toDataURL(mime, 0.9);\n },\n [getCroppedCanvas],\n );\n\n return {\n crop,\n zoom,\n aspect: currentAspect,\n croppedAreaPixels,\n setCrop,\n setZoom: (z: number) => setZoom(Math.min(Math.max(z, minZoom), maxZoom)),\n setAspect,\n onCropComplete,\n reset,\n getCroppedFile,\n getCroppedPreview,\n };\n}\n"]}