jalaali-date-time-picker
Version:
Production-ready Jalali (Persian) date + time picker for **React / Next.js**.
2 lines • 18.6 kB
JavaScript
;var _=require('jalaali-js'),react=require('react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),reactSlot=require('@radix-ui/react-slot'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),i=require('@radix-ui/react-select'),lucideReact=require('lucide-react'),f=require('@radix-ui/react-dialog');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 ___default=/*#__PURE__*/_interopDefault(_);var i__namespace=/*#__PURE__*/_interopNamespace(i);var f__namespace=/*#__PURE__*/_interopNamespace(f);var ct=Object.defineProperty,mt=Object.defineProperties;var dt=Object.getOwnPropertyDescriptors;var Q=Object.getOwnPropertySymbols;var Ie=Object.prototype.hasOwnProperty,Re=Object.prototype.propertyIsEnumerable;var Ne=(t,a,o)=>a in t?ct(t,a,{enumerable:true,configurable:true,writable:true,value:o}):t[a]=o,l=(t,a)=>{for(var o in a||(a={}))Ie.call(a,o)&&Ne(t,o,a[o]);if(Q)for(var o of Q(a))Re.call(a,o)&&Ne(t,o,a[o]);return t},w=(t,a)=>mt(t,dt(a));var c=(t,a)=>{var o={};for(var r in t)Ie.call(t,r)&&a.indexOf(r)<0&&(o[r]=t[r]);if(t!=null&&Q)for(var r of Q(t))a.indexOf(r)<0&&Re.call(t,r)&&(o[r]=t[r]);return o};function Te(t){let{jy:a,jm:o,jd:r}=___default.default.toJalaali(t);return `${a}/${o.toString().padStart(2,"0")}/${r.toString().padStart(2,"0")}`}function z(t,a,o){let{gy:r,gm:g,gd:b}=___default.default.toGregorian(t,a,o);return new Date(r,g-1,b)}function ze(t,a){return ___default.default.jalaaliMonthLength(t,a)}function Me(t,a){let{gy:o,gm:r,gd:g}=___default.default.toGregorian(t,a,1);return new Date(o,r-1,g).getDay()}function J(t){return ___default.default.toJalaali(t)}var je=["\u0634","\u06CC","\u062F","\u0633","\u0686","\u067E","\u062C"],Be=["\u0641\u0631\u0648\u0631\u062F\u06CC\u0646","\u0627\u0631\u062F\u06CC\u0628\u0647\u0634\u062A","\u062E\u0631\u062F\u0627\u062F","\u062A\u06CC\u0631","\u0645\u0631\u062F\u0627\u062F","\u0634\u0647\u0631\u06CC\u0648\u0631","\u0645\u0647\u0631","\u0622\u0628\u0627\u0646","\u0622\u0630\u0631","\u062F\u06CC","\u0628\u0647\u0645\u0646","\u0627\u0633\u0641\u0646\u062F"];function m(...t){return tailwindMerge.twMerge(clsx.clsx(t))}var vt=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",{variants:{variant:{default:"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}});function y(b){var A=b,{className:t,variant:a,size:o,asChild:r=false}=A,g=c(A,["className","variant","size","asChild"]);return jsxRuntime.jsx(r?reactSlot.Slot:"button",l({"data-slot":"button",className:m(vt({variant:a,size:o,className:t}))},g))}function Ve(a){var t=c(a,[]);return jsxRuntime.jsx(i__namespace.Root,l({"data-slot":"select"},t))}function He(a){var t=c(a,[]);return jsxRuntime.jsx(i__namespace.Value,l({"data-slot":"select-value"},t))}function _e(g){var b=g,{className:t,size:a="default",children:o}=b,r=c(b,["className","size","children"]);return jsxRuntime.jsxs(i__namespace.Trigger,w(l({"data-slot":"select-trigger","data-size":a,className:m("border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",t)},r),{children:[o,jsxRuntime.jsx(i__namespace.Icon,{asChild:true,children:jsxRuntime.jsx(lucideReact.ChevronDownIcon,{className:"size-4 opacity-50"})})]}))}function Oe(g){var b=g,{className:t,children:a,position:o="popper"}=b,r=c(b,["className","children","position"]);return jsxRuntime.jsx(i__namespace.Portal,{children:jsxRuntime.jsxs(i__namespace.Content,w(l({"data-slot":"select-content",className:m("bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",o==="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:o},r),{children:[jsxRuntime.jsx(xt,{}),jsxRuntime.jsx(i__namespace.Viewport,{className:m("p-1",o==="popper"&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"),children:a}),jsxRuntime.jsx(yt,{})]}))})}function Ae(r){var g=r,{className:t,children:a}=g,o=c(g,["className","children"]);return jsxRuntime.jsxs(i__namespace.Item,w(l({"data-slot":"select-item",className:m("focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",t)},o),{children:[jsxRuntime.jsx("span",{className:"absolute right-2 flex size-3.5 items-center justify-center",children:jsxRuntime.jsx(i__namespace.ItemIndicator,{children:jsxRuntime.jsx(lucideReact.CheckIcon,{className:"size-4"})})}),jsxRuntime.jsx(i__namespace.ItemText,{children:a})]}))}function xt(o){var r=o,{className:t}=r,a=c(r,["className"]);return jsxRuntime.jsx(i__namespace.ScrollUpButton,w(l({"data-slot":"select-scroll-up-button",className:m("flex cursor-default items-center justify-center py-1",t)},a),{children:jsxRuntime.jsx(lucideReact.ChevronUpIcon,{className:"size-4"})}))}function yt(o){var r=o,{className:t}=r,a=c(r,["className"]);return jsxRuntime.jsx(i__namespace.ScrollDownButton,w(l({"data-slot":"select-scroll-down-button",className:m("flex cursor-default items-center justify-center py-1",t)},a),{children:jsxRuntime.jsx(lucideReact.ChevronDownIcon,{className:"size-4"})}))}function Ee(a){var t=c(a,[]);return jsxRuntime.jsx(f__namespace.Root,l({"data-slot":"sheet"},t))}function Le(a){var t=c(a,[]);return jsxRuntime.jsx(f__namespace.Trigger,l({"data-slot":"sheet-trigger"},t))}function wt(a){var t=c(a,[]);return jsxRuntime.jsx(f__namespace.Portal,l({"data-slot":"sheet-portal"},t))}function Ct(o){var r=o,{className:t}=r,a=c(r,["className"]);return jsxRuntime.jsx(f__namespace.Overlay,l({"data-slot":"sheet-overlay",className:m("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",t)},a))}function Ue(g){var b=g,{className:t,children:a,side:o="right"}=b,r=c(b,["className","children","side"]);return jsxRuntime.jsxs(wt,{children:[jsxRuntime.jsx(Ct,{}),jsxRuntime.jsxs(f__namespace.Content,w(l({"data-slot":"sheet-content",className:m("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",o==="right"&&"data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",o==="left"&&"data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",o==="top"&&"data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",o==="bottom"&&"data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",t)},r),{children:[a,jsxRuntime.jsxs(f__namespace.Close,{className:"ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none",children:[jsxRuntime.jsx(lucideReact.XIcon,{className:"size-4"}),jsxRuntime.jsx("span",{className:"sr-only",children:"Close"})]})]}))]})}function Ge(o){var r=o,{className:t}=r,a=c(r,["className"]);return jsxRuntime.jsx("div",l({"data-slot":"sheet-header",className:m("flex flex-col gap-1.5 p-4",t)},a))}function $e(o){var r=o,{className:t}=r,a=c(r,["className"]);return jsxRuntime.jsx(f__namespace.Title,l({"data-slot":"sheet-title",className:m("text-foreground font-semibold",t)},a))}function We(o){var r=o,{className:t}=r,a=c(r,["className"]);return jsxRuntime.jsx(f__namespace.Description,l({"data-slot":"sheet-description",className:m("text-muted-foreground text-sm",t)},a))}var Xe=react.forwardRef(({className:t,defaultValue:a=new Date,value:o,minDate:r,maxDate:g,disablePast:b=false,disableFuture:A=false,minuteStep:Z=1,disabled:pe=false,showTime:N=true,format:qe="jalali",clearable:Qe=false,inline:F=false,trigger:ee,formatLabel:fe,onChange:E,onOpenChange:te,onClear:L,inputRef:I,placeholderLabel:ae,inputFieldProps:d},Ze)=>{let oe=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()),U=oe(new Date),re=oe(r!=null?r:new Date(1970,0,1)),ne=oe(g!=null?g:new Date(2100,11,31)),D=b?re>U?re:U:re,k=A?ne<U?ne:U:ne,ie=o!=null?o:a,{jy:Fe,jm:et,jd:tt}=J(ie),[at,ge]=react.useState(false),[P,V]=react.useState(Fe),[x,M]=react.useState(et),[j,G]=react.useState(tt),[$,W]=react.useState(ie.getHours()),[Y,K]=react.useState(ie.getMinutes()),[S,se]=react.useState(null),[X,ve]=react.useState(null);react.useEffect(()=>{if(!o)return;let{jy:e,jm:v,jd:s}=J(o);V(e),M(v),G(s),W(o.getHours()),K(o.getMinutes()),se(o);},[o]);let{weeks:ot,daysFlat:H,canPrevMonth:he,canNextMonth:be}=react.useMemo(()=>{let e=ze(P,x),v=(Me(P,x)+1)%7,s=Array.from({length:42},(u,B)=>{let ce=B-v+1;return ce>0&&ce<=e?ce:null});return {weeks:Array.from({length:6},(u,B)=>s.slice(B*7,B*7+7)),daysFlat:s.map(u=>u!=null?u:-1),canPrevMonth:z(P,x,1)>D,canNextMonth:z(P,x,e)<k}},[P,x,D,k]),T=react.useMemo(()=>{let e=z(P,x,j);return e.setHours(N?$:0),e.setMinutes(N?Y:0),e},[P,x,j,$,Y,N]);react.useImperativeHandle(Ze,()=>({getValue:()=>S}),[S]);let le=e=>{d!=null&&d.onChange&&d.onChange({target:{name:d.name,value:e}});};react.useEffect(()=>{le(S?S.toISOString():"");},[S]);let rt=react.useMemo(()=>{let e=J(D).jy,v=J(k).jy;return Array.from({length:v-e+1},(s,u)=>e+u)},[D,k]),Se=react.useCallback(e=>{let v=z(P,x,e);return v<D||v>k},[P,x,D,k]),nt=S?fe?fe(S):(e=>qe==="gregorian"?e.toLocaleDateString("fa-IR",{year:"numeric",month:"2-digit",day:"2-digit"}):Te(e))(S):void 0,q=react.useCallback(e=>{let s=H.findIndex(B=>B===j)+e;for(;s>=0&&s<H.length&&H[s]===-1;)s+=e>0?1:-1;let u=H[s];u!==void 0&&u!==-1&&G(u);},[H,j]),xe=react.useCallback(()=>{var e;if(T<D||T>k){ve("\u062A\u0627\u0631\u06CC\u062E \u062E\u0627\u0631\u062C \u0627\u0632 \u0645\u062D\u062F\u0648\u062F\u0647 \u0645\u062C\u0627\u0632 \u0627\u0633\u062A");return}ve(null),se(T),le(T.toISOString()),F||ge(false),E==null||E(T),(e=I==null?void 0:I.current)==null||e.setAttribute("value",T.toISOString());},[T,F,D,k,E,I]),it=react.useCallback(()=>{var e;L==null||L(S),se(null),le(""),(e=I==null?void 0:I.current)==null||e.setAttribute("value","");},[L,S,I]),ye=react.useCallback(e=>{let{jy:v,jm:s,jd:u}=J(e);V(v),M(s),G(u),W(e.getHours()),K(e.getMinutes());},[]),st=react.useRef(null),Pe=jsxRuntime.jsx("input",w(l({type:"hidden"},d!=null?d:{}),{ref:d!=null&&d.ref?d.ref:st,value:S?S.toISOString():""})),we=jsxRuntime.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[jsxRuntime.jsx(y,{size:"icon",variant:"ghost",onClick:()=>be&&(x===12?(M(1),V(e=>e+1)):M(e=>e+1)),disabled:!be,"aria-label":"\u0645\u0627\u0647 \u0628\u0639\u062F",children:jsxRuntime.jsx(lucideReact.ChevronRight,{className:"w-4 h-4"})}),jsxRuntime.jsx("div",{className:"font-semibold w-24 text-center",children:Be[x-1]}),jsxRuntime.jsx(y,{size:"icon",variant:"ghost",onClick:()=>he&&(x===1?(M(12),V(e=>e-1)):M(e=>e-1)),disabled:!he,"aria-label":"\u0645\u0627\u0647 \u0642\u0628\u0644",children:jsxRuntime.jsx(lucideReact.ChevronLeft,{className:"w-4 h-4"})})]}),jsxRuntime.jsxs(Ve,{value:P.toString(),onValueChange:e=>V(+e),children:[jsxRuntime.jsx(_e,{className:"w-[96px]",children:jsxRuntime.jsx(He,{placeholder:"\u0633\u0627\u0644"})}),jsxRuntime.jsx(Oe,{children:rt.map(e=>jsxRuntime.jsx(Ae,{value:e.toString(),disabled:z(e,12,29)<D||z(e,1,1)>k,children:e},e))})]})]}),Ce=jsxRuntime.jsx("div",{onKeyDown:e=>{switch(e.key){case "ArrowLeft":q(-1),e.preventDefault();break;case "ArrowRight":q(1),e.preventDefault();break;case "ArrowUp":q(-7),e.preventDefault();break;case "ArrowDown":q(7),e.preventDefault();break;case "Enter":xe(),e.preventDefault();break}},children:jsxRuntime.jsxs("table",{className:"w-full",children:[jsxRuntime.jsx("thead",{children:jsxRuntime.jsx("tr",{children:je.map(e=>jsxRuntime.jsx("th",{className:"text-center text-sm font-medium text-muted-foreground",children:e},e))})}),jsxRuntime.jsx("tbody",{children:ot.map((e,v)=>jsxRuntime.jsx("tr",{children:e.map((s,u)=>jsxRuntime.jsx("td",{className:"p-0",children:s?jsxRuntime.jsx(y,{size:"sm",className:"w-full hover:ring ring-primary/40",variant:s===j?"default":"ghost",onClick:()=>!Se(s)&&G(s),disabled:Se(s),"aria-selected":s===j,children:s}):jsxRuntime.jsx("span",{className:"inline-block h-9 w-full"})},u))},v))})]})}),De=N&&jsxRuntime.jsx("div",{className:"flex gap-6 justify-center mt-2",children:[{label:"\u0633\u0627\u0639\u062A",value:$,inc:()=>W(e=>(e+1)%24),dec:()=>W(e=>(e+23)%24)},{label:"\u062F\u0642\u06CC\u0642\u0647",value:Y,inc:()=>K(e=>(e+Z)%60),dec:()=>K(e=>(e-Z+60*60)%60)}].map(({label:e,value:v,inc:s,dec:u})=>jsxRuntime.jsxs("div",{className:"flex flex-col items-center",children:[jsxRuntime.jsx("span",{className:"text-sm mb-1",children:e}),jsxRuntime.jsxs("div",{className:"flex items-center gap-1",children:[jsxRuntime.jsx(y,{size:"icon",variant:"ghost",onClick:s,children:jsxRuntime.jsx(lucideReact.ChevronUp,{className:"h-3.5 w-3.5"})}),jsxRuntime.jsx("span",{className:"w-10 text-center",children:v.toString().padStart(2,"0")}),jsxRuntime.jsx(y,{size:"icon",variant:"ghost",onClick:u,children:jsxRuntime.jsx(lucideReact.ChevronDown,{className:"h-3.5 w-3.5"})})]})]},e))}),ke=jsxRuntime.jsxs("div",{className:"flex gap-2 mt-4",children:[jsxRuntime.jsx(y,{variant:"secondary",onClick:()=>ye(new Date),children:"\u0627\u0644\u0627\u0646"}),jsxRuntime.jsx(y,{variant:"secondary",onClick:()=>{let e=new Date;e.setDate(e.getDate()+1),ye(e);},children:"\u0641\u0631\u062F\u0627"}),Qe&&jsxRuntime.jsx(y,{variant:"outline",onClick:it,children:"\u067E\u0627\u06A9 \u06A9\u0631\u062F\u0646"}),jsxRuntime.jsx(y,{onClick:xe,children:"\u062B\u0628\u062A"})]}),lt=ae!=null?ae:N?"\u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0627\u0631\u06CC\u062E \u0648 \u0632\u0645\u0627\u0646":"\u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0627\u0631\u06CC\u062E";return F?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[Pe,jsxRuntime.jsxs("div",{className:m("p-4 space-y-4 border rounded-lg bg-background max-w-md mx-auto",t),children:[we,Ce,De,ke,X&&jsxRuntime.jsx("p",{className:"text-sm text-destructive text-center mt-2",children:X})]})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[Pe,jsxRuntime.jsxs(Ee,{open:at,onOpenChange:e=>{pe||(ge(e),te==null||te(e));},children:[jsxRuntime.jsx(Le,{asChild:true,className:"w-fit",children:ee!=null?ee:jsxRuntime.jsx(y,{variant:"outline",disabled:pe,children:S?jsxRuntime.jsxs("span",{className:"text-sm text-muted-foreground",children:[N?`${$.toString().padStart(2,"0")}:${Y.toString().padStart(2,"0")} - `:"",nt]}):lt})}),jsxRuntime.jsxs(Ue,{side:"bottom",className:m("max-w-md mx-auto",t),children:[jsxRuntime.jsxs(Ge,{className:"text-center",children:[jsxRuntime.jsx($e,{children:N?"\u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0627\u0631\u06CC\u062E \u0648 \u0632\u0645\u0627\u0646":"\u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0627\u0631\u06CC\u062E"}),jsxRuntime.jsx(We,{children:N?"\u062A\u0627\u0631\u06CC\u062E \u0648 \u0632\u0645\u0627\u0646 \u0631\u0627 \u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F":"\u062A\u0627\u0631\u06CC\u062E \u0631\u0627 \u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F"})]}),jsxRuntime.jsxs("div",{className:"p-4 space-y-4",children:[we,Ce,De,ke,X&&jsxRuntime.jsx("p",{className:"text-sm text-destructive text-center mt-2",children:X})]})]})]})]})});Xe.displayName="JalaaliDateTimePicker";exports.JalaaliDateTimePicker=Xe;//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map