@solace-health/ui 0.10.631 → 0.10.633
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-KJS4EDKB.js → chunk-4BYIXSFL.js} +2 -2
- package/dist/{chunk-KJS4EDKB.js.map → chunk-4BYIXSFL.js.map} +1 -1
- package/dist/chunk-AEG63JU5.js +2 -0
- package/dist/chunk-AEG63JU5.js.map +1 -0
- package/dist/chunk-J3F5C3FQ.cjs +2 -0
- package/dist/chunk-J3F5C3FQ.cjs.map +1 -0
- package/dist/{chunk-I2KUNICA.cjs → chunk-N4XVSLFR.cjs} +2 -2
- package/dist/{chunk-I2KUNICA.cjs.map → chunk-N4XVSLFR.cjs.map} +1 -1
- package/dist/chunk-U32FGCKV.cjs +2 -0
- package/dist/chunk-U32FGCKV.cjs.map +1 -0
- package/dist/chunk-UZMH5AGP.js +2 -0
- package/dist/chunk-UZMH5AGP.js.map +1 -0
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/v2/carousel/carousel.cjs +1 -1
- package/dist/v2/carousel/carousel.d.ts +13 -1
- package/dist/v2/carousel/carousel.js +1 -1
- package/dist/v2/carousel/carousel.stories.d.ts +1 -0
- 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.js +1 -1
- package/dist/v2/index.cjs +1 -1
- package/dist/v2/index.d.ts +1 -1
- package/dist/v2/index.js +1 -1
- package/dist/v2/select/select.cjs +1 -1
- package/dist/v2/select/select.d.ts +1 -1
- package/dist/v2/select/select.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-7XCCBMKH.js +0 -2
- package/dist/chunk-7XCCBMKH.js.map +0 -1
- package/dist/chunk-KMKBBT3A.cjs +0 -2
- package/dist/chunk-KMKBBT3A.cjs.map +0 -1
- package/dist/chunk-KU4DPJLD.cjs +0 -2
- package/dist/chunk-KU4DPJLD.cjs.map +0 -1
- package/dist/chunk-U3HXZ2GM.js +0 -2
- package/dist/chunk-U3HXZ2GM.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {a as a$2,d,c,g,i}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import {a as a$2,d,c,g,i}from'./chunk-AEG63JU5.js';import {a as a$1}from'./chunk-WEDRHQPW.js';import {a as a$3,b as b$1,c as c$1}from'./chunk-QXJK4OO3.js';import {b as b$3}from'./chunk-QKW55VWE.js';import {b}from'./chunk-HOEJQG5V.js';import {b as b$2}from'./chunk-6LESB5UU.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-4BYIXSFL.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-4BYIXSFL.js.map
|
|
@@ -1 +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-KJS4EDKB.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"]}
|
|
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-4BYIXSFL.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"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a}from'./chunk-YTIIAU4W.js';import*as e from'@radix-ui/react-select';import {LuChevronUp,LuChevronDown,LuCheck}from'react-icons/lu';import {jsx,jsxs}from'react/jsx-runtime';function P({...t}){return jsx(e.Root,{"data-slot":"select",...t})}function b({...t}){return jsx(e.Group,{"data-slot":"select-group",...t})}function x({...t}){return jsx(e.Value,{"data-slot":"select-value",...t})}function h({className:t,size:o="default",children:r,open:l=false,styled:n=true,...s}){let u=a("flex w-full items-center justify-between gap-2 bg-white px-3 py-2 text-left whitespace-nowrap","border-input rounded-md border",l&&"border-dark-green","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40","disabled:cursor-not-allowed disabled:bg-gray-200 disabled:opacity-50","hover:enabled:border-dark-green","shadow-xs transition-all outline-none","data-[placeholder]:text-gray-700","[&_svg:not([class*='text-'])]:text-gray-950","[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4","data-[size=default]:h-12 data-[size=md]:h-10 data-[size=sm]:h-8","*:data-[slot=select-value]:flex *:data-[slot=select-value]:w-0 *:data-[slot=select-value]:flex-1","*:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2",t);return jsxs(e.Trigger,{"data-slot":"select-trigger","data-size":o,className:n?u:t,...s,children:[r,n&&jsx(e.Icon,{asChild:true,children:l?jsx(LuChevronUp,{}):jsx(LuChevronDown,{})})]})}function v({className:t,...o}){return jsx(e.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:a("flex cursor-default items-center justify-center py-1",t),...o,children:jsx(LuChevronUp,{className:"size-4"})})}function f({className:t,...o}){return jsx(e.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:a("flex cursor-default items-center justify-center py-1",t),...o,children:jsx(LuChevronDown,{className:"size-4"})})}function y({className:t,children:o,position:r="popper",portal:l=true,...n}){let s=jsxs(e.Content,{"data-slot":"select-content",className:a("bg-popover text-popover-foreground","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0","data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95","data-[side=bottom]:slide-in-from-top-2","data-[side=left]:slide-in-from-right-2","data-[side=right]:slide-in-from-left-2","data-[side=top]:slide-in-from-bottom-2","z-modal-stacking-context relative","min-w-[8rem]","max-h-[var(--radix-select-content-available-height)]","origin-[var(--radix-select-content-transform-origin)]","overflow-x-hidden overflow-y-auto","rounded-md border shadow-md",r==="popper"&&["data-[side=bottom]:translate-y-1","data-[side=left]:-translate-x-1","data-[side=right]:translate-x-1","data-[side=top]:-translate-y-1"],t),position:r,...n,children:[jsx(v,{}),jsx(e.Viewport,{className:a(r==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1 p-1"),children:o}),jsx(f,{})]});return l?jsx(e.Portal,{children:s}):s}function w({className:t,...o}){return jsx(e.Label,{"data-slot":"select-label",className:a("text-muted-foreground px-3 py-1.5 text-xs",t),...o})}function C({className:t,children:o,showIconOnHover:r=false,...l}){return jsxs(e.Item,{"data-slot":"select-item",className:a("focus:text-primary hover:text-primary hover:bg-green-50 focus:bg-green-100","data-[state=checked]:text-primary data-[state=checked]:bg-green-200 data-[state=checked]:font-bold","group relative flex h-12 w-full items-center gap-2 py-1.5 pr-8 pl-3","text-md select-none","rounded-sm","cursor-default outline-none","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","[&_svg]:pointer-events-none [&_svg]:shrink-0","[&_svg:not([class*='text-'])]:text-green-600","[&_svg:not([class*='size-'])]:size-4",t),...l,children:[r&&jsxs("div",{className:"relative flex h-4 w-4 items-center justify-center",children:[jsx(e.ItemIndicator,{children:jsx(LuCheck,{className:"h-4 w-4 text-green-600"})}),jsx(LuCheck,{className:a("absolute h-4 w-4 text-green-600 opacity-0 transition-opacity duration-150","group-hover:opacity-100","data-[state=checked]:opacity-0")})]}),jsx(e.ItemText,{children:o})]})}function z({className:t,...o}){return jsx(e.Separator,{"data-slot":"select-separator",className:a("bg-border h-2px pointer-events-none -mx-1 my-1",t),...o})}export{P as a,b,x as c,h as d,v as e,f,y as g,w as h,C as i,z as j};//# sourceMappingURL=chunk-AEG63JU5.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-AEG63JU5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/select/select.tsx"],"names":["Select","props","jsx","SelectGroup","SelectValue","SelectTrigger","className","size","children","open","styled","styles","cn","jsxs","LuChevronUp","LuChevronDown","SelectScrollUpButton","SelectScrollDownButton","SelectContent","position","portal","content","SelectLabel","SelectItem","showIconOnHover","LuCheck","SelectSeparator"],"mappings":"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","file":"chunk-AEG63JU5.js","sourcesContent":["import * as React from 'react';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { LuCheck, LuChevronDown, LuChevronUp } from 'react-icons/lu';\n\nimport { cn } from '@/lib/utils';\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n open = false,\n styled = true,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: 'sm' | 'md' | 'default';\n open?: boolean;\n styled?: boolean;\n}) {\n const styles = cn(\n // Layout & spacing\n 'flex w-full items-center justify-between gap-2 bg-white px-3 py-2 text-left whitespace-nowrap',\n\n // Border & ring\n 'border-input rounded-md border',\n open && 'border-dark-green', // conditional green border when open\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n\n // States\n 'aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40',\n 'disabled:cursor-not-allowed disabled:bg-gray-200 disabled:opacity-50',\n 'hover:enabled:border-dark-green',\n\n // Shadow & transitions\n 'shadow-xs transition-all outline-none',\n\n // Placeholder & icons\n 'data-[placeholder]:text-gray-700',\n \"[&_svg:not([class*='text-'])]:text-gray-950\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\n // Size variants\n 'data-[size=default]:h-12 data-[size=md]:h-10 data-[size=sm]:h-8',\n\n // Select value slot customization (Flex & fit to size)\n '*:data-[slot=select-value]:flex *:data-[slot=select-value]:w-0 *:data-[slot=select-value]:flex-1',\n\n // Select value slot customization (layout)\n '*:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2',\n\n // Any additional className\n className,\n );\n\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={styled ? styles : className}\n {...props}\n >\n {children}\n {styled && (\n <SelectPrimitive.Icon asChild>\n {open ? <LuChevronUp /> : <LuChevronDown />}\n </SelectPrimitive.Icon>\n )}\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <LuChevronUp className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <LuChevronDown className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n portal = true,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content> & { portal?: boolean }) {\n const content = (\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n // Color & background\n 'bg-popover text-popover-foreground',\n\n // Animation states\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0',\n 'data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95',\n\n // Slide-in based on side\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n\n // Layout & positioning\n 'z-modal-stacking-context relative',\n 'min-w-[8rem]',\n 'max-h-[var(--radix-select-content-available-height)]',\n 'origin-[var(--radix-select-content-transform-origin)]',\n\n // Overflow & scroll\n 'overflow-x-hidden overflow-y-auto',\n\n // Border, shape, shadow\n 'rounded-md border shadow-md',\n\n // Conditional transform adjustments for popper positioning\n position === 'popper' && [\n 'data-[side=bottom]:translate-y-1',\n 'data-[side=left]:-translate-x-1',\n 'data-[side=right]:translate-x-1',\n 'data-[side=top]:-translate-y-1',\n ],\n\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1 p-1',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n );\n return portal ? <SelectPrimitive.Portal>{content}</SelectPrimitive.Portal> : content;\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn('text-muted-foreground px-3 py-1.5 text-xs', className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({\n className,\n children,\n showIconOnHover = false,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item> & {\n multiSelect?: boolean;\n showIconOnHover?: boolean;\n}) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n // Focus states\n 'focus:text-primary hover:text-primary hover:bg-green-50 focus:bg-green-100',\n\n // Selected states\n 'data-[state=checked]:text-primary data-[state=checked]:bg-green-200 data-[state=checked]:font-bold',\n\n // Layout & spacing\n 'group relative flex h-12 w-full items-center gap-2 py-1.5 pr-8 pl-3',\n\n // Text & font\n 'text-md select-none',\n\n // Border radius & shape\n 'rounded-sm',\n\n // Interactivity\n 'cursor-default outline-none',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n\n // SVG icon styling\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n \"[&_svg:not([class*='text-'])]:text-green-600\",\n \"[&_svg:not([class*='size-'])]:size-4\",\n\n className,\n )}\n {...props}\n >\n {showIconOnHover && (\n <div className=\"relative flex h-4 w-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <LuCheck className=\"h-4 w-4 text-green-600\" />\n </SelectPrimitive.ItemIndicator>\n\n <LuCheck\n className={cn(\n 'absolute h-4 w-4 text-green-600 opacity-0 transition-opacity duration-150',\n 'group-hover:opacity-100',\n 'data-[state=checked]:opacity-0', // hide if selected\n )}\n />\n </div>\n )}\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn('bg-border h-2px pointer-events-none -mx-1 my-1', className)}\n {...props}\n />\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkQRO22BPZ_cjs=require('./chunk-QRO22BPZ.cjs'),e=require('@radix-ui/react-select'),lu=require('react-icons/lu'),jsxRuntime=require('react/jsx-runtime');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var e__namespace=/*#__PURE__*/_interopNamespace(e);function P({...t}){return jsxRuntime.jsx(e__namespace.Root,{"data-slot":"select",...t})}function b({...t}){return jsxRuntime.jsx(e__namespace.Group,{"data-slot":"select-group",...t})}function x({...t}){return jsxRuntime.jsx(e__namespace.Value,{"data-slot":"select-value",...t})}function h({className:t,size:o="default",children:r,open:l=false,styled:n=true,...s}){let u=chunkQRO22BPZ_cjs.a("flex w-full items-center justify-between gap-2 bg-white px-3 py-2 text-left whitespace-nowrap","border-input rounded-md border",l&&"border-dark-green","focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]","aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40","disabled:cursor-not-allowed disabled:bg-gray-200 disabled:opacity-50","hover:enabled:border-dark-green","shadow-xs transition-all outline-none","data-[placeholder]:text-gray-700","[&_svg:not([class*='text-'])]:text-gray-950","[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4","data-[size=default]:h-12 data-[size=md]:h-10 data-[size=sm]:h-8","*:data-[slot=select-value]:flex *:data-[slot=select-value]:w-0 *:data-[slot=select-value]:flex-1","*:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2",t);return jsxRuntime.jsxs(e__namespace.Trigger,{"data-slot":"select-trigger","data-size":o,className:n?u:t,...s,children:[r,n&&jsxRuntime.jsx(e__namespace.Icon,{asChild:true,children:l?jsxRuntime.jsx(lu.LuChevronUp,{}):jsxRuntime.jsx(lu.LuChevronDown,{})})]})}function v({className:t,...o}){return jsxRuntime.jsx(e__namespace.ScrollUpButton,{"data-slot":"select-scroll-up-button",className:chunkQRO22BPZ_cjs.a("flex cursor-default items-center justify-center py-1",t),...o,children:jsxRuntime.jsx(lu.LuChevronUp,{className:"size-4"})})}function f({className:t,...o}){return jsxRuntime.jsx(e__namespace.ScrollDownButton,{"data-slot":"select-scroll-down-button",className:chunkQRO22BPZ_cjs.a("flex cursor-default items-center justify-center py-1",t),...o,children:jsxRuntime.jsx(lu.LuChevronDown,{className:"size-4"})})}function y({className:t,children:o,position:r="popper",portal:l=true,...n}){let s=jsxRuntime.jsxs(e__namespace.Content,{"data-slot":"select-content",className:chunkQRO22BPZ_cjs.a("bg-popover text-popover-foreground","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0","data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95","data-[side=bottom]:slide-in-from-top-2","data-[side=left]:slide-in-from-right-2","data-[side=right]:slide-in-from-left-2","data-[side=top]:slide-in-from-bottom-2","z-modal-stacking-context relative","min-w-[8rem]","max-h-[var(--radix-select-content-available-height)]","origin-[var(--radix-select-content-transform-origin)]","overflow-x-hidden overflow-y-auto","rounded-md border shadow-md",r==="popper"&&["data-[side=bottom]:translate-y-1","data-[side=left]:-translate-x-1","data-[side=right]:translate-x-1","data-[side=top]:-translate-y-1"],t),position:r,...n,children:[jsxRuntime.jsx(v,{}),jsxRuntime.jsx(e__namespace.Viewport,{className:chunkQRO22BPZ_cjs.a(r==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1 p-1"),children:o}),jsxRuntime.jsx(f,{})]});return l?jsxRuntime.jsx(e__namespace.Portal,{children:s}):s}function w({className:t,...o}){return jsxRuntime.jsx(e__namespace.Label,{"data-slot":"select-label",className:chunkQRO22BPZ_cjs.a("text-muted-foreground px-3 py-1.5 text-xs",t),...o})}function C({className:t,children:o,showIconOnHover:r=false,...l}){return jsxRuntime.jsxs(e__namespace.Item,{"data-slot":"select-item",className:chunkQRO22BPZ_cjs.a("focus:text-primary hover:text-primary hover:bg-green-50 focus:bg-green-100","data-[state=checked]:text-primary data-[state=checked]:bg-green-200 data-[state=checked]:font-bold","group relative flex h-12 w-full items-center gap-2 py-1.5 pr-8 pl-3","text-md select-none","rounded-sm","cursor-default outline-none","data-[disabled]:pointer-events-none data-[disabled]:opacity-50","[&_svg]:pointer-events-none [&_svg]:shrink-0","[&_svg:not([class*='text-'])]:text-green-600","[&_svg:not([class*='size-'])]:size-4",t),...l,children:[r&&jsxRuntime.jsxs("div",{className:"relative flex h-4 w-4 items-center justify-center",children:[jsxRuntime.jsx(e__namespace.ItemIndicator,{children:jsxRuntime.jsx(lu.LuCheck,{className:"h-4 w-4 text-green-600"})}),jsxRuntime.jsx(lu.LuCheck,{className:chunkQRO22BPZ_cjs.a("absolute h-4 w-4 text-green-600 opacity-0 transition-opacity duration-150","group-hover:opacity-100","data-[state=checked]:opacity-0")})]}),jsxRuntime.jsx(e__namespace.ItemText,{children:o})]})}function z({className:t,...o}){return jsxRuntime.jsx(e__namespace.Separator,{"data-slot":"select-separator",className:chunkQRO22BPZ_cjs.a("bg-border h-2px pointer-events-none -mx-1 my-1",t),...o})}exports.a=P;exports.b=b;exports.c=x;exports.d=h;exports.e=v;exports.f=f;exports.g=y;exports.h=w;exports.i=C;exports.j=z;//# sourceMappingURL=chunk-J3F5C3FQ.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-J3F5C3FQ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/select/select.tsx"],"names":["Select","props","jsx","e","SelectGroup","SelectValue","SelectTrigger","className","size","children","open","styled","styles","cn","jsxs","LuChevronUp","LuChevronDown","SelectScrollUpButton","SelectScrollDownButton","SelectContent","position","portal","content","SelectLabel","SelectItem","showIconOnHover","LuCheck","SelectSeparator"],"mappings":"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","file":"chunk-J3F5C3FQ.cjs","sourcesContent":["import * as React from 'react';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { LuCheck, LuChevronDown, LuChevronUp } from 'react-icons/lu';\n\nimport { cn } from '@/lib/utils';\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />;\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />;\n}\n\nfunction SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />;\n}\n\nfunction SelectTrigger({\n className,\n size = 'default',\n children,\n open = false,\n styled = true,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: 'sm' | 'md' | 'default';\n open?: boolean;\n styled?: boolean;\n}) {\n const styles = cn(\n // Layout & spacing\n 'flex w-full items-center justify-between gap-2 bg-white px-3 py-2 text-left whitespace-nowrap',\n\n // Border & ring\n 'border-input rounded-md border',\n open && 'border-dark-green', // conditional green border when open\n 'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n\n // States\n 'aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40',\n 'disabled:cursor-not-allowed disabled:bg-gray-200 disabled:opacity-50',\n 'hover:enabled:border-dark-green',\n\n // Shadow & transitions\n 'shadow-xs transition-all outline-none',\n\n // Placeholder & icons\n 'data-[placeholder]:text-gray-700',\n \"[&_svg:not([class*='text-'])]:text-gray-950\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\n // Size variants\n 'data-[size=default]:h-12 data-[size=md]:h-10 data-[size=sm]:h-8',\n\n // Select value slot customization (Flex & fit to size)\n '*:data-[slot=select-value]:flex *:data-[slot=select-value]:w-0 *:data-[slot=select-value]:flex-1',\n\n // Select value slot customization (layout)\n '*:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2',\n\n // Any additional className\n className,\n );\n\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={styled ? styles : className}\n {...props}\n >\n {children}\n {styled && (\n <SelectPrimitive.Icon asChild>\n {open ? <LuChevronUp /> : <LuChevronDown />}\n </SelectPrimitive.Icon>\n )}\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <LuChevronUp className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <LuChevronDown className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n position = 'popper',\n portal = true,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content> & { portal?: boolean }) {\n const content = (\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n // Color & background\n 'bg-popover text-popover-foreground',\n\n // Animation states\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0',\n 'data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95',\n\n // Slide-in based on side\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n\n // Layout & positioning\n 'z-modal-stacking-context relative',\n 'min-w-[8rem]',\n 'max-h-[var(--radix-select-content-available-height)]',\n 'origin-[var(--radix-select-content-transform-origin)]',\n\n // Overflow & scroll\n 'overflow-x-hidden overflow-y-auto',\n\n // Border, shape, shadow\n 'rounded-md border shadow-md',\n\n // Conditional transform adjustments for popper positioning\n position === 'popper' && [\n 'data-[side=bottom]:translate-y-1',\n 'data-[side=left]:-translate-x-1',\n 'data-[side=right]:translate-x-1',\n 'data-[side=top]:-translate-y-1',\n ],\n\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1 p-1',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n );\n return portal ? <SelectPrimitive.Portal>{content}</SelectPrimitive.Portal> : content;\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn('text-muted-foreground px-3 py-1.5 text-xs', className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({\n className,\n children,\n showIconOnHover = false,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item> & {\n multiSelect?: boolean;\n showIconOnHover?: boolean;\n}) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n // Focus states\n 'focus:text-primary hover:text-primary hover:bg-green-50 focus:bg-green-100',\n\n // Selected states\n 'data-[state=checked]:text-primary data-[state=checked]:bg-green-200 data-[state=checked]:font-bold',\n\n // Layout & spacing\n 'group relative flex h-12 w-full items-center gap-2 py-1.5 pr-8 pl-3',\n\n // Text & font\n 'text-md select-none',\n\n // Border radius & shape\n 'rounded-sm',\n\n // Interactivity\n 'cursor-default outline-none',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n\n // SVG icon styling\n '[&_svg]:pointer-events-none [&_svg]:shrink-0',\n \"[&_svg:not([class*='text-'])]:text-green-600\",\n \"[&_svg:not([class*='size-'])]:size-4\",\n\n className,\n )}\n {...props}\n >\n {showIconOnHover && (\n <div className=\"relative flex h-4 w-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <LuCheck className=\"h-4 w-4 text-green-600\" />\n </SelectPrimitive.ItemIndicator>\n\n <LuCheck\n className={cn(\n 'absolute h-4 w-4 text-green-600 opacity-0 transition-opacity duration-150',\n 'group-hover:opacity-100',\n 'data-[state=checked]:opacity-0', // hide if selected\n )}\n />\n </div>\n )}\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn('bg-border h-2px pointer-events-none -mx-1 my-1', className)}\n {...props}\n />\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
'use strict';var chunkJ3F5C3FQ_cjs=require('./chunk-J3F5C3FQ.cjs'),chunkQAGOBPAT_cjs=require('./chunk-QAGOBPAT.cjs'),chunkSV7GB6CH_cjs=require('./chunk-SV7GB6CH.cjs'),chunkW5S2KUYD_cjs=require('./chunk-W5S2KUYD.cjs'),chunkSAWCIRIH_cjs=require('./chunk-SAWCIRIH.cjs'),chunkOUGYUQUB_cjs=require('./chunk-OUGYUQUB.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(chunkJ3F5C3FQ_cjs.a,{onValueChange:o=>{let g=p.find(v=>v.value.raw===o);g&&a?.(g);},...u,children:[jsxRuntime.jsx(chunkJ3F5C3FQ_cjs.d,{className:chunkQRO22BPZ_cjs.a("max-w-[240px] md:w-[150px]",e),size:m,children:jsxRuntime.jsx(chunkJ3F5C3FQ_cjs.c,{placeholder:"Select one"})}),jsxRuntime.jsx(chunkJ3F5C3FQ_cjs.g,{position:"popper",className:"max-h-90",portal:d,children:c.map(o=>jsxRuntime.jsx(chunkJ3F5C3FQ_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(chunkOUGYUQUB_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-N4XVSLFR.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-N4XVSLFR.cjs.map
|
|
@@ -1 +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-I2KUNICA.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"]}
|
|
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-N4XVSLFR.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 chunkSAWCIRIH_cjs=require('./chunk-SAWCIRIH.cjs'),chunkQRO22BPZ_cjs=require('./chunk-QRO22BPZ.cjs'),e=require('react'),w=require('embla-carousel-react'),lu=require('react-icons/lu'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var e__namespace=/*#__PURE__*/_interopNamespace(e);var w__default=/*#__PURE__*/_interopDefault(w);var v=e__namespace.createContext(null);function d(){let t=e__namespace.useContext(v);if(!t)throw new Error("useCarousel must be used within a <Carousel />");return t}function T({orientation:t="horizontal",opts:l,setApi:o,plugins:s,className:u,children:c,...i}){let[x,r]=w__default.default({...l,axis:t==="horizontal"?"x":"y"},s),[P,R]=e__namespace.useState(false),[y,b]=e__namespace.useState(false),[N,S]=e__namespace.useState(0),[h,z]=e__namespace.useState(0),p=e__namespace.useCallback(C=>{C&&(R(C.canScrollPrev()),b(C.canScrollNext()),S(C.selectedScrollSnap()),z(C.scrollSnapList().length));},[]),g=e__namespace.useCallback(()=>{r?.scrollPrev();},[r]),E=e__namespace.useCallback(()=>{r?.scrollNext();},[r]);return e__namespace.useEffect(()=>{!r||!o||o(r);},[r,o]),e__namespace.useEffect(()=>{if(r)return p(r),r.on("reInit",p),r.on("select",p),()=>{r?.off("select",p);}},[r,p]),jsxRuntime.jsx(v.Provider,{value:{carouselRef:x,api:r,opts:l,orientation:t||(l?.axis==="y"?"vertical":"horizontal"),selectedIndex:N,slideCount:h,scrollPrev:g,scrollNext:E,canScrollPrev:P,canScrollNext:y},children:jsxRuntime.jsx("div",{className:chunkQRO22BPZ_cjs.a("relative",u),role:"region","aria-roledescription":"carousel","data-slot":"carousel",...i,children:c})})}function O({className:t,...l}){let{carouselRef:o,orientation:s}=d();return jsxRuntime.jsx("div",{ref:o,className:"overflow-hidden","data-slot":"carousel-content",children:jsxRuntime.jsx("div",{className:chunkQRO22BPZ_cjs.a("flex",s==="horizontal"?"-ml-4":"-mt-4 flex-col",t),...l})})}function F({className:t,...l}){let{orientation:o}=d();return jsxRuntime.jsx("div",{role:"group","aria-roledescription":"slide","data-slot":"carousel-item",className:chunkQRO22BPZ_cjs.a("min-w-0 shrink-0 grow-0 basis-full",o==="horizontal"?"pl-4":"pt-4",t),...l})}function j({className:t,variant:l="outline",size:o="sm",...s}){let{orientation:u,scrollPrev:c,canScrollPrev:i}=d();return jsxRuntime.jsxs(chunkSAWCIRIH_cjs.b,{"data-slot":"carousel-previous",variant:l,size:o,className:chunkQRO22BPZ_cjs.a("absolute size-8 rounded-full",u==="horizontal"?"top-1/2 -left-12 -translate-y-1/2":"-top-12 left-1/2 -translate-x-1/2 rotate-90",t),disabled:!i,onClick:c,...s,children:[jsxRuntime.jsx(lu.LuArrowLeft,{}),jsxRuntime.jsx("span",{className:"sr-only",children:"Previous slide"})]})}function q({className:t,variant:l="outline",size:o="sm",...s}){let{orientation:u,scrollNext:c,canScrollNext:i}=d();return jsxRuntime.jsxs(chunkSAWCIRIH_cjs.b,{"data-slot":"carousel-next",variant:l,size:o,className:chunkQRO22BPZ_cjs.a("absolute size-8 rounded-full",u==="horizontal"?"top-1/2 -right-12 -translate-y-1/2":"-bottom-12 left-1/2 -translate-x-1/2 rotate-90",t),disabled:!i,onClick:c,...s,children:[jsxRuntime.jsx(lu.LuArrowRight,{}),jsxRuntime.jsx("span",{className:"sr-only",children:"Next slide"})]})}function D({className:t,...l}){let{slideCount:o,selectedIndex:s}=d();return o<=1?null:jsxRuntime.jsxs("div",{className:chunkQRO22BPZ_cjs.a("text-muted-foreground text-sm",t),"data-slot":"carousel-fraction",...l,children:[s+1,"/",o]})}exports.a=d;exports.b=T;exports.c=O;exports.d=F;exports.e=j;exports.f=q;exports.g=D;//# sourceMappingURL=chunk-U32FGCKV.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-U32FGCKV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/carousel/carousel.tsx"],"names":["CarouselContext","e","useCarousel","context","Carousel","orientation","opts","setApi","plugins","className","children","props","carouselRef","api","useEmblaCarousel","canScrollPrev","setCanScrollPrev","canScrollNext","setCanScrollNext","selectedIndex","setSelectedIndex","slideCount","setSlideCount","onSelect","scrollPrev","scrollNext","jsx","cn","CarouselContent","CarouselItem","CarouselPrevious","variant","size","jsxs","Button","LuArrowLeft","CarouselNext","LuArrowRight","CarouselFraction"],"mappings":"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","file":"chunk-U32FGCKV.cjs","sourcesContent":["import * as React from 'react';\nimport useEmblaCarousel, { type UseEmblaCarouselType } from 'embla-carousel-react';\nimport { LuArrowLeft, LuArrowRight } from 'react-icons/lu';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/v2/button/button';\n\ntype CarouselApi = UseEmblaCarouselType[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n opts?: CarouselOptions;\n plugins?: CarouselPlugin;\n orientation?: 'horizontal' | 'vertical';\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n selectedIndex: number;\n slideCount: number;\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext);\n\n if (!context) {\n throw new Error('useCarousel must be used within a <Carousel />');\n }\n\n return context;\n}\n\nfunction Carousel({\n orientation = 'horizontal',\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === 'horizontal' ? 'x' : 'y',\n },\n plugins,\n );\n const [canScrollPrev, setCanScrollPrev] = React.useState(false);\n const [canScrollNext, setCanScrollNext] = React.useState(false);\n const [selectedIndex, setSelectedIndex] = React.useState(0);\n const [slideCount, setSlideCount] = React.useState(0);\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return;\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n setSelectedIndex(api.selectedScrollSnap());\n setSlideCount(api.scrollSnapList().length);\n }, []);\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n React.useEffect(() => {\n if (!api || !setApi) return;\n setApi(api);\n }, [api, setApi]);\n\n React.useEffect(() => {\n if (!api) return;\n onSelect(api);\n api.on('reInit', onSelect);\n api.on('select', onSelect);\n\n // eslint-disable-next-line consistent-return\n return () => {\n api?.off('select', onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n carouselRef,\n api,\n opts,\n orientation: orientation || (opts?.axis === 'y' ? 'vertical' : 'horizontal'),\n selectedIndex,\n slideCount,\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n className={cn('relative', className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<'div'>) {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\" data-slot=\"carousel-content\">\n <div\n className={cn('flex', orientation === 'horizontal' ? '-ml-4' : '-mt-4 flex-col', className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<'div'>) {\n const { orientation } = useCarousel();\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n 'min-w-0 shrink-0 grow-0 basis-full',\n orientation === 'horizontal' ? 'pl-4' : 'pt-4',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CarouselPrevious({\n className,\n variant = 'outline',\n size = 'sm',\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n 'absolute size-8 rounded-full',\n orientation === 'horizontal'\n ? 'top-1/2 -left-12 -translate-y-1/2'\n : '-top-12 left-1/2 -translate-x-1/2 rotate-90',\n className,\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <LuArrowLeft />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n );\n}\n\nfunction CarouselNext({\n className,\n variant = 'outline',\n size = 'sm',\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n 'absolute size-8 rounded-full',\n orientation === 'horizontal'\n ? 'top-1/2 -right-12 -translate-y-1/2'\n : '-bottom-12 left-1/2 -translate-x-1/2 rotate-90',\n className,\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <LuArrowRight />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n );\n}\n\nfunction CarouselFraction({ className, ...props }: React.ComponentProps<'div'>) {\n const { slideCount, selectedIndex } = useCarousel();\n\n if (slideCount <= 1) return null;\n\n return (\n <div\n className={cn('text-muted-foreground text-sm', className)}\n data-slot=\"carousel-fraction\"\n {...props}\n >\n {selectedIndex + 1}/{slideCount}\n </div>\n );\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n CarouselFraction,\n useCarousel,\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {b}from'./chunk-HOEJQG5V.js';import {a}from'./chunk-YTIIAU4W.js';import*as e from'react';import w from'embla-carousel-react';import {LuArrowLeft,LuArrowRight}from'react-icons/lu';import {jsx,jsxs}from'react/jsx-runtime';var v=e.createContext(null);function d(){let t=e.useContext(v);if(!t)throw new Error("useCarousel must be used within a <Carousel />");return t}function T({orientation:t="horizontal",opts:l,setApi:o,plugins:s,className:u,children:c,...i}){let[x,r]=w({...l,axis:t==="horizontal"?"x":"y"},s),[P,R]=e.useState(false),[y,b]=e.useState(false),[N,S]=e.useState(0),[h,z]=e.useState(0),p=e.useCallback(C=>{C&&(R(C.canScrollPrev()),b(C.canScrollNext()),S(C.selectedScrollSnap()),z(C.scrollSnapList().length));},[]),g=e.useCallback(()=>{r?.scrollPrev();},[r]),E=e.useCallback(()=>{r?.scrollNext();},[r]);return e.useEffect(()=>{!r||!o||o(r);},[r,o]),e.useEffect(()=>{if(r)return p(r),r.on("reInit",p),r.on("select",p),()=>{r?.off("select",p);}},[r,p]),jsx(v.Provider,{value:{carouselRef:x,api:r,opts:l,orientation:t||(l?.axis==="y"?"vertical":"horizontal"),selectedIndex:N,slideCount:h,scrollPrev:g,scrollNext:E,canScrollPrev:P,canScrollNext:y},children:jsx("div",{className:a("relative",u),role:"region","aria-roledescription":"carousel","data-slot":"carousel",...i,children:c})})}function O({className:t,...l}){let{carouselRef:o,orientation:s}=d();return jsx("div",{ref:o,className:"overflow-hidden","data-slot":"carousel-content",children:jsx("div",{className:a("flex",s==="horizontal"?"-ml-4":"-mt-4 flex-col",t),...l})})}function F({className:t,...l}){let{orientation:o}=d();return jsx("div",{role:"group","aria-roledescription":"slide","data-slot":"carousel-item",className:a("min-w-0 shrink-0 grow-0 basis-full",o==="horizontal"?"pl-4":"pt-4",t),...l})}function j({className:t,variant:l="outline",size:o="sm",...s}){let{orientation:u,scrollPrev:c,canScrollPrev:i}=d();return jsxs(b,{"data-slot":"carousel-previous",variant:l,size:o,className:a("absolute size-8 rounded-full",u==="horizontal"?"top-1/2 -left-12 -translate-y-1/2":"-top-12 left-1/2 -translate-x-1/2 rotate-90",t),disabled:!i,onClick:c,...s,children:[jsx(LuArrowLeft,{}),jsx("span",{className:"sr-only",children:"Previous slide"})]})}function q({className:t,variant:l="outline",size:o="sm",...s}){let{orientation:u,scrollNext:c,canScrollNext:i}=d();return jsxs(b,{"data-slot":"carousel-next",variant:l,size:o,className:a("absolute size-8 rounded-full",u==="horizontal"?"top-1/2 -right-12 -translate-y-1/2":"-bottom-12 left-1/2 -translate-x-1/2 rotate-90",t),disabled:!i,onClick:c,...s,children:[jsx(LuArrowRight,{}),jsx("span",{className:"sr-only",children:"Next slide"})]})}function D({className:t,...l}){let{slideCount:o,selectedIndex:s}=d();return o<=1?null:jsxs("div",{className:a("text-muted-foreground text-sm",t),"data-slot":"carousel-fraction",...l,children:[s+1,"/",o]})}export{d as a,T as b,O as c,F as d,j as e,q as f,D as g};//# sourceMappingURL=chunk-UZMH5AGP.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-UZMH5AGP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/v2/carousel/carousel.tsx"],"names":["CarouselContext","useCarousel","context","Carousel","orientation","opts","setApi","plugins","className","children","props","carouselRef","api","useEmblaCarousel","canScrollPrev","setCanScrollPrev","canScrollNext","setCanScrollNext","selectedIndex","setSelectedIndex","slideCount","setSlideCount","onSelect","scrollPrev","scrollNext","jsx","cn","CarouselContent","CarouselItem","CarouselPrevious","variant","size","jsxs","Button","LuArrowLeft","CarouselNext","LuArrowRight","CarouselFraction"],"mappings":"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","file":"chunk-UZMH5AGP.js","sourcesContent":["import * as React from 'react';\nimport useEmblaCarousel, { type UseEmblaCarouselType } from 'embla-carousel-react';\nimport { LuArrowLeft, LuArrowRight } from 'react-icons/lu';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/v2/button/button';\n\ntype CarouselApi = UseEmblaCarouselType[1];\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>;\ntype CarouselOptions = UseCarouselParameters[0];\ntype CarouselPlugin = UseCarouselParameters[1];\n\ntype CarouselProps = {\n opts?: CarouselOptions;\n plugins?: CarouselPlugin;\n orientation?: 'horizontal' | 'vertical';\n setApi?: (api: CarouselApi) => void;\n};\n\ntype CarouselContextProps = {\n carouselRef: ReturnType<typeof useEmblaCarousel>[0];\n api: ReturnType<typeof useEmblaCarousel>[1];\n selectedIndex: number;\n slideCount: number;\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n} & CarouselProps;\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext);\n\n if (!context) {\n throw new Error('useCarousel must be used within a <Carousel />');\n }\n\n return context;\n}\n\nfunction Carousel({\n orientation = 'horizontal',\n opts,\n setApi,\n plugins,\n className,\n children,\n ...props\n}: React.ComponentProps<'div'> & CarouselProps) {\n const [carouselRef, api] = useEmblaCarousel(\n {\n ...opts,\n axis: orientation === 'horizontal' ? 'x' : 'y',\n },\n plugins,\n );\n const [canScrollPrev, setCanScrollPrev] = React.useState(false);\n const [canScrollNext, setCanScrollNext] = React.useState(false);\n const [selectedIndex, setSelectedIndex] = React.useState(0);\n const [slideCount, setSlideCount] = React.useState(0);\n\n const onSelect = React.useCallback((api: CarouselApi) => {\n if (!api) return;\n setCanScrollPrev(api.canScrollPrev());\n setCanScrollNext(api.canScrollNext());\n setSelectedIndex(api.selectedScrollSnap());\n setSlideCount(api.scrollSnapList().length);\n }, []);\n\n const scrollPrev = React.useCallback(() => {\n api?.scrollPrev();\n }, [api]);\n\n const scrollNext = React.useCallback(() => {\n api?.scrollNext();\n }, [api]);\n\n React.useEffect(() => {\n if (!api || !setApi) return;\n setApi(api);\n }, [api, setApi]);\n\n React.useEffect(() => {\n if (!api) return;\n onSelect(api);\n api.on('reInit', onSelect);\n api.on('select', onSelect);\n\n // eslint-disable-next-line consistent-return\n return () => {\n api?.off('select', onSelect);\n };\n }, [api, onSelect]);\n\n return (\n <CarouselContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n carouselRef,\n api,\n opts,\n orientation: orientation || (opts?.axis === 'y' ? 'vertical' : 'horizontal'),\n selectedIndex,\n slideCount,\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n className={cn('relative', className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n}\n\nfunction CarouselContent({ className, ...props }: React.ComponentProps<'div'>) {\n const { carouselRef, orientation } = useCarousel();\n\n return (\n <div ref={carouselRef} className=\"overflow-hidden\" data-slot=\"carousel-content\">\n <div\n className={cn('flex', orientation === 'horizontal' ? '-ml-4' : '-mt-4 flex-col', className)}\n {...props}\n />\n </div>\n );\n}\n\nfunction CarouselItem({ className, ...props }: React.ComponentProps<'div'>) {\n const { orientation } = useCarousel();\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n 'min-w-0 shrink-0 grow-0 basis-full',\n orientation === 'horizontal' ? 'pl-4' : 'pt-4',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CarouselPrevious({\n className,\n variant = 'outline',\n size = 'sm',\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-previous\"\n variant={variant}\n size={size}\n className={cn(\n 'absolute size-8 rounded-full',\n orientation === 'horizontal'\n ? 'top-1/2 -left-12 -translate-y-1/2'\n : '-top-12 left-1/2 -translate-x-1/2 rotate-90',\n className,\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <LuArrowLeft />\n <span className=\"sr-only\">Previous slide</span>\n </Button>\n );\n}\n\nfunction CarouselNext({\n className,\n variant = 'outline',\n size = 'sm',\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n data-slot=\"carousel-next\"\n variant={variant}\n size={size}\n className={cn(\n 'absolute size-8 rounded-full',\n orientation === 'horizontal'\n ? 'top-1/2 -right-12 -translate-y-1/2'\n : '-bottom-12 left-1/2 -translate-x-1/2 rotate-90',\n className,\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <LuArrowRight />\n <span className=\"sr-only\">Next slide</span>\n </Button>\n );\n}\n\nfunction CarouselFraction({ className, ...props }: React.ComponentProps<'div'>) {\n const { slideCount, selectedIndex } = useCarousel();\n\n if (slideCount <= 1) return null;\n\n return (\n <div\n className={cn('text-muted-foreground text-sm', className)}\n data-slot=\"carousel-fraction\"\n {...props}\n >\n {selectedIndex + 1}/{slideCount}\n </div>\n );\n}\n\nexport {\n type CarouselApi,\n Carousel,\n CarouselContent,\n CarouselItem,\n CarouselPrevious,\n CarouselNext,\n CarouselFraction,\n useCarousel,\n};\n"]}
|