@solace-health/ui 0.10.621 → 0.10.623
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.
- package/dist/chunk-66KLV3VW.js +2 -0
- package/dist/chunk-66KLV3VW.js.map +1 -0
- package/dist/chunk-YBPXQGN6.cjs +2 -0
- package/dist/chunk-YBPXQGN6.cjs.map +1 -0
- package/dist/chunk-YNUUIWFV.cjs +2 -0
- package/dist/chunk-YNUUIWFV.cjs.map +1 -0
- package/dist/chunk-ZYHTNK3Y.js +2 -0
- package/dist/chunk-ZYHTNK3Y.js.map +1 -0
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/v2/date-picker/date-picker.cjs +1 -1
- package/dist/v2/date-picker/date-picker.js +1 -1
- package/dist/v2/image-preview/image-preview.cjs +1 -1
- package/dist/v2/image-preview/image-preview.d.ts +2 -1
- package/dist/v2/image-preview/image-preview.js +1 -1
- package/dist/v2/image-preview/useImageCropper.cjs +1 -1
- package/dist/v2/image-preview/useImageCropper.js +1 -1
- package/dist/v2/index.cjs +1 -1
- package/dist/v2/index.js +1 -1
- package/dist/v2/time-select/time-select.cjs +1 -1
- package/dist/v2/time-select/time-select.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-DAN4YSG2.cjs +0 -2
- package/dist/chunk-DAN4YSG2.cjs.map +0 -1
- package/dist/chunk-DI35VWWR.js +0 -2
- package/dist/chunk-DI35VWWR.js.map +0 -1
- package/dist/chunk-IAMALZ4P.js +0 -2
- package/dist/chunk-IAMALZ4P.js.map +0 -1
- package/dist/chunk-WIO4QPNH.cjs +0 -2
- package/dist/chunk-WIO4QPNH.cjs.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {useState,useCallback}from'react';var U=e=>new Promise((n,p)=>{let r=new Image;r.addEventListener("load",()=>n(r)),r.addEventListener("error",s=>p(s)),r.src=e;}),j=async e=>{if("decode"in e)try{await e.decode();}catch{}await new Promise(requestAnimationFrame);},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},z=(e,n,p)=>{if(!e.startsWith("data:")){let y=f(p);return new File([e],P(n,y),{type:y})}let[r,s]=e.split(","),C=f(r.split(";")[0].replace("data:","")),u=atob(s),x=u.length,d=new Uint8Array(x),m=0;for(;m<x;)d[m]=u.charCodeAt(m),m+=1;return new File([d],P(n,C),{type:C})};function T(e={}){let{aspect:n=1.6,minZoom:p=1,maxZoom:r=3,initialZoom:s=1}=e,[C,u]=useState({x:0,y:0}),[x,d]=useState(s),[m,y]=useState(n),[g,F]=useState(null),I=useCallback((t,a)=>{F(a);},[]),Z=useCallback(()=>{u({x:0,y:0}),d(s),F(null);},[s]),v=useCallback(async(t,a)=>{if(!g)return null;let i=await U(t);await j(i);let o=document.createElement("canvas"),l=o.getContext("2d");if(!l)throw new Error("Canvas 2D context not available");let{width:c,height:w}=g;o.width=c,o.height=w,l.drawImage(i,g.x,g.y,c,w,0,0,c,w);let h=f(a||(t.startsWith("data:")?t.split(";")[0].replace("data:",""):void 0));return {canvas:o,mime:h}},[g]),E=useCallback(async(t,a,i)=>{let o=await v(t,i);if(!o)return z(t,a||"cropped-image",i);let{canvas:l,mime:c}=o,w=await new Promise(h=>{l.toBlob(L=>h(L||new Blob),c,.9);});return new File([w],P(a||"cropped-image",c),{type:c})},[v]),M=useCallback(async(t,a)=>{let i=await v(t,a);if(!i)return t;let{canvas:o,mime:l}=i;return o.toDataURL(l,.9)},[v]);return {crop:C,zoom:x,aspect:m,croppedAreaPixels:g,setCrop:u,setZoom:t=>d(Math.min(Math.max(t,p),r)),setAspect:y,onCropComplete:I,reset:Z,getCroppedFile:E,getCroppedPreview:M}}export{T as a};//# sourceMappingURL=chunk-66KLV3VW.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-66KLV3VW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/image-preview/useImageCropper.ts"],"names":["createImage","url","resolve","reject","img","e","waitForDecode","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-66KLV3VW.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 waitForDecode = async (img: HTMLImageElement) => {\n // Safari sometimes needs decode + a frame to avoid black canvas\n if ('decode' in img) {\n try {\n await img.decode();\n } catch {\n // decode can fail for cross-origin or some data URLs; ignore and proceed\n }\n }\n await new Promise(requestAnimationFrame);\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 await waitForDecode(image);\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:r,className:t="",containerClassName:n="",imagePreview:a=void 0,cropper:e=void 0})=>{let[m,d]=react.useState(false),u=!a||!m,p=!!e;return jsxRuntime.jsxs("div",{className:chunkQRO22BPZ_cjs.a("flex max-w-[386px] flex-col",t),children:[jsxRuntime.jsxs("div",{className:chunkQRO22BPZ_cjs.a("relative h-60 rounded-md border",n),children:[a&&p?jsxRuntime.jsx(Y__default.default,{image:a,crop:e.crop,zoom:e.zoom,aspect:e.aspect,objectFit:"contain",onCropChange:e.setCrop,onZoomChange:e.setZoom,onCropComplete:e.onCropComplete,onMediaLoaded:()=>d(true),showGrid:false}):a&&jsxRuntime.jsx("img",{alt:r,className:`m-auto h-full w-full object-contain transition-opacity duration-300 ${m?"opacity-100":"opacity-0"}`,src:a,onLoad:()=>d(true),draggable:false}),u&&jsxRuntime.jsx("div",{"aria-label":a?"Loading image":"Awaiting image",className:"from-grey-300 to-grey-300 absolute inset-0 animate-pulse bg-gradient-to-r"})]}),!u&&p&&jsxRuntime.jsxs("div",{className:"mt-3 flex flex-col items-center justify-between gap-1 px-1 sm:flex-row sm:gap-4",children:[jsxRuntime.jsxs("div",{className:"flex w-full 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:c=>e.setZoom(c[0]),className:"w-full sm:flex-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=r=>luxon.DateTime.fromFormat(r,"HH:mm").isValid,O=({startTime:r=L,endTime:t=B,interval:n=30,onChange:a=void 0,className:e="",size:m="default",portal:d=true,...u})=>{R(r)||(console.error(`Invalid startTime: ${r}`),r=L),R(t)||(console.error(`Invalid endTime: ${t}`),t=B);let p=react.useMemo(()=>{let o=luxon.DateTime.fromFormat(t,"HH:mm"),g=luxon.Duration.fromObject({minutes:n}),v=[],l=luxon.DateTime.fromFormat(r,"HH:mm");for(;l<=o;){let w=l.toFormat("HH:mm");w==="00:00"&&l.equals(o)&&(w="24:00"),v.push({label:l.toFormat("h:mm a"),value:{hour:l.toFormat("HH"),min:l.toFormat("mm"),raw:w,formatted:l.toFormat("h:mm a")}}),l=l.plus(g);}return v},[r,t,n]),c=p.map(o=>({label:o.label,value:o.value.raw}));return jsxRuntime.jsxs(chunkKMKBBT3A_cjs.a,{onValueChange:o=>{let g=p.find(v=>v.value.raw===o);g&&a?.(g);},...u,children:[jsxRuntime.jsx(chunkKMKBBT3A_cjs.d,{className:chunkQRO22BPZ_cjs.a("max-w-[240px] md:w-[150px]",e),size:m,children:jsxRuntime.jsx(chunkKMKBBT3A_cjs.c,{placeholder:"Select one"})}),jsxRuntime.jsx(chunkKMKBBT3A_cjs.g,{position:"popper",className:"max-h-90",portal:d,children:c.map(o=>jsxRuntime.jsx(chunkKMKBBT3A_cjs.i,{className:"h-10",value:o.value,children:o.label},o.value))})]})},pe=O;function q({className:r="",wrapperClassName:t="",value:n=void 0,onChange:a=void 0,disabled:e=false,calendarProps:m=void 0,placeholder:d="Pick a date",inputProps:u=void 0,showCalendarIcon:p=true}){let[c,D]=react.useState(false),o=g=>{a?.(g),D(false);};return jsxRuntime.jsxs(chunkSV7GB6CH_cjs.a,{open:!e&&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",t),children:[jsxRuntime.jsx(chunkNZANLY4M_cjs.b,{className:chunkQRO22BPZ_cjs.a(p&&"pl-10",c?"border-dark-green":"",r),value:n?V__default.default(n).format("MM/DD/YYYY"):"",placeholder:d,readOnly:true,disabled:e,...u}),p&&jsxRuntime.jsx("div",{className:chunkQRO22BPZ_cjs.a("absolute top-1/2 left-4 h-4 w-4 -translate-y-1/2",e?"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:n?V__default.default(n).toDate():void 0,onSelect:o,...m})})]})}exports.a=q;exports.b=_;exports.c=O;exports.d=pe;//# sourceMappingURL=chunk-YBPXQGN6.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-YBPXQGN6.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","containerClassName","imagePreview","cropper","loaded","setLoaded","useState","showLoader","enableCrop","jsxs","cn","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","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-YBPXQGN6.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';\nimport { cn } from '@/lib/utils';\n\nexport type ImagePreviewProps = {\n alt: string;\n className?: string;\n containerClassName?: 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 containerClassName = '',\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={cn(`flex max-w-[386px] flex-col`, className)}>\n <div className={cn('relative h-60 rounded-md border', containerClassName)}>\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 flex-col items-center justify-between gap-1 px-1 sm:flex-row sm:gap-4\">\n <div className=\"flex w-full 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-full sm:flex-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,p)=>{let r=new Image;r.addEventListener("load",()=>n(r)),r.addEventListener("error",s=>p(s)),r.src=e;}),j=async e=>{if("decode"in e)try{await e.decode();}catch{}await new Promise(requestAnimationFrame);},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},z=(e,n,p)=>{if(!e.startsWith("data:")){let y=f(p);return new File([e],P(n,y),{type:y})}let[r,s]=e.split(","),C=f(r.split(";")[0].replace("data:","")),u=atob(s),x=u.length,d=new Uint8Array(x),m=0;for(;m<x;)d[m]=u.charCodeAt(m),m+=1;return new File([d],P(n,C),{type:C})};function T(e={}){let{aspect:n=1.6,minZoom:p=1,maxZoom:r=3,initialZoom:s=1}=e,[C,u]=react.useState({x:0,y:0}),[x,d]=react.useState(s),[m,y]=react.useState(n),[g,F]=react.useState(null),I=react.useCallback((t,a)=>{F(a);},[]),Z=react.useCallback(()=>{u({x:0,y:0}),d(s),F(null);},[s]),v=react.useCallback(async(t,a)=>{if(!g)return null;let i=await U(t);await j(i);let o=document.createElement("canvas"),l=o.getContext("2d");if(!l)throw new Error("Canvas 2D context not available");let{width:c,height:w}=g;o.width=c,o.height=w,l.drawImage(i,g.x,g.y,c,w,0,0,c,w);let h=f(a||(t.startsWith("data:")?t.split(";")[0].replace("data:",""):void 0));return {canvas:o,mime:h}},[g]),E=react.useCallback(async(t,a,i)=>{let o=await v(t,i);if(!o)return z(t,a||"cropped-image",i);let{canvas:l,mime:c}=o,w=await new Promise(h=>{l.toBlob(L=>h(L||new Blob),c,.9);});return new File([w],P(a||"cropped-image",c),{type:c})},[v]),M=react.useCallback(async(t,a)=>{let i=await v(t,a);if(!i)return t;let{canvas:o,mime:l}=i;return o.toDataURL(l,.9)},[v]);return {crop:C,zoom:x,aspect:m,croppedAreaPixels:g,setCrop:u,setZoom:t=>d(Math.min(Math.max(t,p),r)),setAspect:y,onCropComplete:I,reset:Z,getCroppedFile:E,getCroppedPreview:M}}exports.a=T;//# sourceMappingURL=chunk-YNUUIWFV.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-YNUUIWFV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/image-preview/useImageCropper.ts"],"names":["createImage","url","resolve","reject","img","e","waitForDecode","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-YNUUIWFV.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 waitForDecode = async (img: HTMLImageElement) => {\n // Safari sometimes needs decode + a frame to avoid black canvas\n if ('decode' in img) {\n try {\n await img.decode();\n } catch {\n // decode can fail for cross-origin or some data URLs; ignore and proceed\n }\n }\n await new Promise(requestAnimationFrame);\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 await waitForDecode(image);\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
|
+
import {a as a$1}from'./chunk-WEDRHQPW.js';import {a as a$2,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}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:r,className:t="",containerClassName:n="",imagePreview:a$2=void 0,cropper:e=void 0})=>{let[m,d]=useState(false),u=!a$2||!m,p=!!e;return jsxs("div",{className:a("flex max-w-[386px] flex-col",t),children:[jsxs("div",{className:a("relative h-60 rounded-md border",n),children:[a$2&&p?jsx(Y,{image:a$2,crop:e.crop,zoom:e.zoom,aspect:e.aspect,objectFit:"contain",onCropChange:e.setCrop,onZoomChange:e.setZoom,onCropComplete:e.onCropComplete,onMediaLoaded:()=>d(true),showGrid:false}):a$2&&jsx("img",{alt:r,className:`m-auto h-full w-full object-contain transition-opacity duration-300 ${m?"opacity-100":"opacity-0"}`,src:a$2,onLoad:()=>d(true),draggable:false}),u&&jsx("div",{"aria-label":a$2?"Loading image":"Awaiting image",className:"from-grey-300 to-grey-300 absolute inset-0 animate-pulse bg-gradient-to-r"})]}),!u&&p&&jsxs("div",{className:"mt-3 flex flex-col items-center justify-between gap-1 px-1 sm:flex-row sm:gap-4",children:[jsxs("div",{className:"flex w-full 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$1,{value:[e.zoom],min:1,max:3,step:.01,onValueChange:c=>e.setZoom(c[0]),className:"w-full sm:flex-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=r=>DateTime.fromFormat(r,"HH:mm").isValid,O=({startTime:r=L,endTime:t=B,interval:n=30,onChange:a$1=void 0,className:e="",size:m="default",portal:d$1=true,...u})=>{R(r)||(console.error(`Invalid startTime: ${r}`),r=L),R(t)||(console.error(`Invalid endTime: ${t}`),t=B);let p=useMemo(()=>{let o=DateTime.fromFormat(t,"HH:mm"),g=Duration.fromObject({minutes:n}),v=[],l=DateTime.fromFormat(r,"HH:mm");for(;l<=o;){let w=l.toFormat("HH:mm");w==="00:00"&&l.equals(o)&&(w="24:00"),v.push({label:l.toFormat("h:mm a"),value:{hour:l.toFormat("HH"),min:l.toFormat("mm"),raw:w,formatted:l.toFormat("h:mm a")}}),l=l.plus(g);}return v},[r,t,n]),c$1=p.map(o=>({label:o.label,value:o.value.raw}));return jsxs(a$2,{onValueChange:o=>{let g=p.find(v=>v.value.raw===o);g&&a$1?.(g);},...u,children:[jsx(d,{className:a("max-w-[240px] md:w-[150px]",e),size:m,children:jsx(c,{placeholder:"Select one"})}),jsx(g,{position:"popper",className:"max-h-90",portal:d$1,children:c$1.map(o=>jsx(i,{className:"h-10",value:o.value,children:o.label},o.value))})]})},pe=O;function q({className:r="",wrapperClassName:t="",value:n=void 0,onChange:a$1=void 0,disabled:e=false,calendarProps:m=void 0,placeholder:d="Pick a date",inputProps:u=void 0,showCalendarIcon:p=true}){let[c,D]=useState(false),o=g=>{a$1?.(g),D(false);};return jsxs(a$3,{open:!e&&c,onOpenChange:D,children:[jsxs(b$1,{className: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",t),children:[jsx(b$2,{className:a(p&&"pl-10",c?"border-dark-green":"",r),value:n?V(n).format("MM/DD/YYYY"):"",placeholder:d,readOnly:true,disabled:e,...u}),p&&jsx("div",{className:a("absolute top-1/2 left-4 h-4 w-4 -translate-y-1/2",e?"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:n?V(n).toDate():void 0,onSelect:o,...m})})]})}export{q as a,_ as b,O as c,pe as d};//# sourceMappingURL=chunk-ZYHTNK3Y.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-ZYHTNK3Y.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","containerClassName","imagePreview","cropper","loaded","setLoaded","useState","showLoader","enableCrop","jsxs","cn","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","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-ZYHTNK3Y.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';\nimport { cn } from '@/lib/utils';\n\nexport type ImagePreviewProps = {\n alt: string;\n className?: string;\n containerClassName?: 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 containerClassName = '',\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={cn(`flex max-w-[386px] flex-col`, className)}>\n <div className={cn('relative h-60 rounded-md border', containerClassName)}>\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 flex-col items-center justify-between gap-1 px-1 sm:flex-row sm:gap-4\">\n <div className=\"flex w-full 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-full sm:flex-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"]}
|