@iclips/ui 2.0.0 → 2.0.2

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.
@@ -1,2 +1,2 @@
1
- "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),U=require("react"),I=require("lucide-react"),W=require("../utils.cjs"),J=require("./input.cjs"),d=require("../primitives/button.cjs"),Y=require("../overlays/popover.cjs");function v(t){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const i in t)if(i!=="default"){const n=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(s,i,n.get?n:{enumerable:!0,get:()=>t[i]})}}return s.default=t,Object.freeze(s)}const u=v(U),D=["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"];function b(t,s){return t*12+s}function S(t){return`${D[t.getMonth()]}/${t.getFullYear()}`}function E(t){const s=t.trim().match(/^([A-Za-zÀ-ÿ]{3,}|\d{1,2})\/(\d{4})$/);if(!s)return null;const[,i,n]=s,l=Number(n);if(Number.isNaN(l))return null;let c;if(/^\d+$/.test(i))c=Number(i);else{const a=D.findIndex(f=>f.toLowerCase()===i.toLowerCase().slice(0,3));if(a===-1)return null;c=a+1}return c<1||c>12?null:new Date(l,c-1,1)}function tt(t){const s=t.trim();if(!s)return null;const i=["→","-","até","a"];for(const n of i){if(!s.includes(n))continue;const l=s.split(n).map(f=>f.trim());if(l.length!==2)continue;const c=E(l[0]),a=E(l[1]);if(c&&a)return b(c.getFullYear(),c.getMonth()+1)>b(a.getFullYear(),a.getMonth()+1)?null:{from:c,to:a}}return null}function L({titulo:t,year:s,onYearChange:i,minYear:n,maxYear:l,selectedMonth:c,selectedYear:a,onSelect:f,isMonthDisabled:g}){return r.jsxs("div",{className:"p-3 w-56",children:[r.jsx("p",{className:"text-xs font-medium text-muted-foreground mb-2",children:t}),r.jsxs("div",{className:"flex items-center justify-center mb-2 gap-1",children:[r.jsx(d.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:()=>i(Math.max(n,s-1)),disabled:s<=n,children:r.jsx(I.ChevronLeft,{className:"h-4 w-4"})}),r.jsx(J.Input,{type:"number",className:"w-20 text-center h-8",value:s,min:n,max:l,onChange:p=>{const h=Number(p.target.value);Number.isNaN(h)||i(h)}}),r.jsx(d.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:()=>i(Math.min(l,s+1)),disabled:s>=l,children:r.jsx(I.ChevronRight,{className:"h-4 w-4"})})]}),r.jsx("div",{className:"grid grid-cols-3 gap-1",children:D.map((p,h)=>{const w=h+1,y=(g==null?void 0:g(s,w))??!1,e=s===a&&w===c;return r.jsx(d.Button,{type:"button",variant:e?"default":"ghost",size:"sm",className:"px-0",disabled:y,onClick:()=>f(s,w),children:p},p)})})]})}const K=u.forwardRef(({value:t,onChange:s,placeholder:i="Selecione um período",disabled:n=!1,minYear:l=2020,maxYear:c=new Date().getFullYear()+5,className:a,error:f=!1,id:g,name:p},h)=>{var O,$,q,A;const[w,y]=u.useState(!1),[e,x]=u.useState(t),[M,j]=u.useState(""),[k,m]=u.useState(!1),[T,P]=u.useState(()=>((t==null?void 0:t.from)??new Date).getFullYear()),[_,R]=u.useState(()=>((t==null?void 0:t.to)??new Date).getFullYear());u.useEffect(()=>{x(t),t!=null&&t.from&&P(t.from.getFullYear()),t!=null&&t.to&&R(t.to.getFullYear()),t!=null&&t.from&&(t!=null&&t.to)?j(`${S(t.from)} → ${S(t.to)}`):j(""),m(!1)},[t]);const V=(o,N)=>{const F=new Date(o,N-1,1),Q=e!=null&&e.to&&b(e.to.getFullYear(),e.to.getMonth()+1)>=b(o,N)?e.to:F;x({from:F,to:Q})},C=(o,N)=>{if(!(e!=null&&e.from))return;const F=new Date(o,N-1,1);x({from:e.from,to:F})},X=(o,N)=>e!=null&&e.from?b(o,N)<b(e.from.getFullYear(),e.from.getMonth()+1):!1,Z=()=>{s==null||s(e),y(!1)},z=o=>{o.stopPropagation(),x(void 0),j(""),m(!1),s==null||s(void 0)},G=o=>{n||(j(o.target.value),m(!1))},B=()=>{if(n)return;if(!M.trim()){x(void 0),s==null||s(void 0),m(!1);return}const o=tt(M);o?(x(o),P(o.from.getFullYear()),R(o.to.getFullYear()),s==null||s(o),m(!1)):m(!0)},H=o=>{o.key==="Enter"?(o.preventDefault(),B(),k||y(!0)):o.key==="Escape"&&(o.preventDefault(),t!=null&&t.from&&(t!=null&&t.to)?j(`${S(t.from)} → ${S(t.to)}`):j(""),m(!1))};return r.jsxs(Y.Popover,{open:!n&&w,onOpenChange:o=>{n||y(o)},children:[r.jsxs("div",{className:"relative w-full",children:[r.jsx(J.Input,{ref:h,id:g,name:p,value:M,onChange:G,onBlur:B,onKeyDown:H,placeholder:i,disabled:n,"aria-invalid":f||k,className:W.cn("pr-20",(f||k)&&"border-destructive focus-visible:ring-destructive/20",a)}),r.jsxs("div",{className:"absolute inset-y-0 right-0 flex items-center gap-1 pr-1",children:[M&&!n&&r.jsxs(d.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0 hover:bg-transparent",onClick:z,tabIndex:-1,children:[r.jsx(I.X,{className:"h-4 w-4 text-muted-foreground hover:text-foreground"}),r.jsx("span",{className:"sr-only",children:"Limpar"})]}),r.jsx(Y.PopoverTrigger,{asChild:!0,children:r.jsx(d.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0 hover:bg-transparent",disabled:n,"aria-label":"Abrir calendário",children:r.jsx(I.CalendarIcon,{className:"h-4 w-4 text-muted-foreground"})})})]})]}),r.jsxs(Y.PopoverContent,{align:"start",className:"w-auto p-0 max-w-[calc(100vw-2rem)]",children:[r.jsxs("div",{className:"flex flex-col sm:flex-row divide-y sm:divide-y-0 sm:divide-x",children:[r.jsx(L,{titulo:"Mês inicial",year:T,onYearChange:P,minYear:l,maxYear:c,selectedYear:((O=e==null?void 0:e.from)==null?void 0:O.getFullYear())??-1,selectedMonth:((($=e==null?void 0:e.from)==null?void 0:$.getMonth())??-2)+1,onSelect:V}),r.jsx(L,{titulo:"Mês final",year:_,onYearChange:R,minYear:l,maxYear:c,selectedYear:((q=e==null?void 0:e.to)==null?void 0:q.getFullYear())??-1,selectedMonth:(((A=e==null?void 0:e.to)==null?void 0:A.getMonth())??-2)+1,onSelect:C,isMonthDisabled:X})]}),r.jsxs("div",{className:"border-t p-3 flex justify-end gap-2",children:[r.jsx(d.Button,{type:"button",variant:"outline",size:"sm",onClick:z,children:"Limpar"}),r.jsx(d.Button,{type:"button",size:"sm",disabled:!(e!=null&&e.from)||!(e!=null&&e.to),onClick:Z,children:"Confirmar"})]})]})]})});K.displayName="MonthRangePicker";exports.MonthRangePicker=K;
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),ee=require("react"),S=require("lucide-react"),te=require("../utils.cjs"),se=require("../use-controllable-value.cjs"),V=require("./input.cjs"),h=require("../primitives/button.cjs"),Y=require("../overlays/popover.cjs");function ne(o){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const l in o)if(l!=="default"){const c=Object.getOwnPropertyDescriptor(o,l);Object.defineProperty(n,l,c.get?c:{enumerable:!0,get:()=>o[l]})}}return n.default=o,Object.freeze(n)}const f=ne(ee),z=["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"];function w(o,n){return o*12+n}function F(o){return`${z[o.getMonth()]}/${o.getFullYear()}`}function E(o){const n=o.trim().match(/^([A-Za-zÀ-ÿ]{3,}|\d{1,2})\/(\d{4})$/);if(!n)return null;const[,l,c]=n,a=Number(c);if(Number.isNaN(a))return null;let i;if(/^\d+$/.test(l))i=Number(l);else{const u=z.findIndex(m=>m.toLowerCase()===l.toLowerCase().slice(0,3));if(u===-1)return null;i=u+1}return i<1||i>12?null:new Date(a,i-1,1)}function re(o){const n=o.trim();if(!n)return null;const l=["→","-","até","a"];for(const c of l){if(!n.includes(c))continue;const a=n.split(c).map(m=>m.trim());if(a.length!==2)continue;const i=E(a[0]),u=E(a[1]);if(i&&u)return w(i.getFullYear(),i.getMonth()+1)>w(u.getFullYear(),u.getMonth()+1)?null:{from:i,to:u}}return null}function L({titulo:o,year:n,onYearChange:l,minYear:c,maxYear:a,selectedMonth:i,selectedYear:u,onSelect:m,isMonthDisabled:p}){return s.jsxs("div",{className:"p-3 w-56",children:[s.jsx("p",{className:"text-xs font-medium text-muted-foreground mb-2",children:o}),s.jsxs("div",{className:"flex items-center justify-center mb-2 gap-1",children:[s.jsx(h.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:()=>l(Math.max(c,n-1)),disabled:n<=c,children:s.jsx(S.ChevronLeft,{className:"h-4 w-4"})}),s.jsx(V.Input,{type:"number",className:"w-20 text-center h-8",value:n,min:c,max:a,onChange:g=>{const x=Number(g.target.value);Number.isNaN(x)||l(x)}}),s.jsx(h.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0",onClick:()=>l(Math.min(a,n+1)),disabled:n>=a,children:s.jsx(S.ChevronRight,{className:"h-4 w-4"})})]}),s.jsx("div",{className:"grid grid-cols-3 gap-1",children:z.map((g,x)=>{const y=x+1,e=(p==null?void 0:p(n,y))??!1,j=n===u&&y===i;return s.jsx(h.Button,{type:"button",variant:j?"default":"ghost",size:"sm",className:"px-0",disabled:e,onClick:()=>m(n,y),children:g},g)})})]})}const J=f.forwardRef(({value:o,defaultValue:n,onChange:l,placeholder:c="Selecione um período",disabled:a=!1,minYear:i=2020,maxYear:u=new Date().getFullYear()+5,className:m,error:p=!1,id:g,name:x},y)=>{var O,q,$,A;const[e,j]=se.useControllableValue(o,n,l),[K,I]=f.useState(!1),[t,v]=f.useState(e),[C,N]=f.useState(""),[k,d]=f.useState(!1),[T,P]=f.useState(()=>((e==null?void 0:e.from)??new Date).getFullYear()),[_,R]=f.useState(()=>((e==null?void 0:e.to)??new Date).getFullYear());f.useEffect(()=>{v(e),e!=null&&e.from&&P(e.from.getFullYear()),e!=null&&e.to&&R(e.to.getFullYear()),e!=null&&e.from&&(e!=null&&e.to)?N(`${F(e.from)} → ${F(e.to)}`):N(""),d(!1)},[e]);const Z=(r,b)=>{const M=new Date(r,b-1,1),W=t!=null&&t.to&&w(t.to.getFullYear(),t.to.getMonth()+1)>=w(r,b)?t.to:M;v({from:M,to:W})},X=(r,b)=>{if(!(t!=null&&t.from))return;const M=new Date(r,b-1,1);v({from:t.from,to:M})},G=(r,b)=>t!=null&&t.from?w(r,b)<w(t.from.getFullYear(),t.from.getMonth()+1):!1,H=()=>{j(t),I(!1)},D=r=>{r.stopPropagation(),v(void 0),N(""),d(!1),j(void 0)},Q=r=>{a||(N(r.target.value.replace(/[^A-Za-zÀ-ÿ\d/\s→-]/g,"")),d(!1))},B=()=>{if(a)return;if(!C.trim()){v(void 0),j(void 0),d(!1);return}const r=re(C);r?(v(r),P(r.from.getFullYear()),R(r.to.getFullYear()),j(r),d(!1)):d(!0)},U=r=>{r.key==="Enter"?(r.preventDefault(),B(),k||I(!0)):r.key==="Escape"&&(r.preventDefault(),e!=null&&e.from&&(e!=null&&e.to)?N(`${F(e.from)} → ${F(e.to)}`):N(""),d(!1))};return s.jsxs(Y.Popover,{open:!a&&K,onOpenChange:r=>{a||I(r)},children:[s.jsxs("div",{className:"relative w-full",children:[s.jsx(V.Input,{ref:y,id:g,name:x,value:C,onChange:Q,onBlur:B,onKeyDown:U,placeholder:c,disabled:a,"aria-invalid":p||k,className:te.cn("pr-20",(p||k)&&"border-destructive focus-visible:ring-destructive/20",m)}),s.jsxs("div",{className:"absolute inset-y-0 right-0 flex items-center gap-1 pr-1",children:[C&&!a&&s.jsxs(h.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0 hover:bg-transparent",onClick:D,tabIndex:-1,children:[s.jsx(S.X,{className:"h-4 w-4 text-muted-foreground hover:text-foreground"}),s.jsx("span",{className:"sr-only",children:"Limpar"})]}),s.jsx(Y.PopoverTrigger,{asChild:!0,children:s.jsx(h.Button,{type:"button",variant:"ghost",size:"sm",className:"h-7 w-7 p-0 hover:bg-transparent",disabled:a,"aria-label":"Abrir calendário",children:s.jsx(S.CalendarIcon,{className:"h-4 w-4 text-muted-foreground"})})})]})]}),s.jsxs(Y.PopoverContent,{align:"start",className:"w-auto p-0 max-w-[calc(100vw-2rem)]",children:[s.jsxs("div",{className:"flex flex-col sm:flex-row divide-y sm:divide-y-0 sm:divide-x",children:[s.jsx(L,{titulo:"Mês inicial",year:T,onYearChange:P,minYear:i,maxYear:u,selectedYear:((O=t==null?void 0:t.from)==null?void 0:O.getFullYear())??-1,selectedMonth:(((q=t==null?void 0:t.from)==null?void 0:q.getMonth())??-2)+1,onSelect:Z}),s.jsx(L,{titulo:"Mês final",year:_,onYearChange:R,minYear:i,maxYear:u,selectedYear:(($=t==null?void 0:t.to)==null?void 0:$.getFullYear())??-1,selectedMonth:(((A=t==null?void 0:t.to)==null?void 0:A.getMonth())??-2)+1,onSelect:X,isMonthDisabled:G})]}),s.jsxs("div",{className:"border-t p-3 flex justify-end gap-2",children:[s.jsx(h.Button,{type:"button",variant:"outline",size:"sm",onClick:D,children:"Limpar"}),s.jsx(h.Button,{type:"button",size:"sm",disabled:!(t!=null&&t.from)||!(t!=null&&t.to),onClick:H,children:"Confirmar"})]})]})]})});J.displayName="MonthRangePicker";exports.MonthRangePicker=J;
2
2
  //# sourceMappingURL=month-range-picker.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"month-range-picker.cjs","sources":["../../../../src/components/ui/forms/month-range-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { CalendarIcon, ChevronLeft, ChevronRight, X } from \"lucide-react\";\n\nimport { cn } from \"../utils\";\nimport { Input } from \"./input\";\nimport { Button } from \"../primitives/button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlays/popover\";\n\nconst MESES = [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"];\n\nexport interface MonthYearRange {\n from: Date;\n to: Date;\n}\n\nexport interface MonthRangePickerProps {\n /**\n * Intervalo de meses selecionado. `from`/`to` representam o 1º dia do mês.\n */\n value?: MonthYearRange;\n /**\n * Callback quando o intervalo muda\n */\n onChange?: (range: MonthYearRange | undefined) => void;\n /**\n * Placeholder do campo\n * @default \"Selecione um período\"\n */\n placeholder?: string;\n /**\n * Desabilita o componente\n */\n disabled?: boolean;\n /**\n * Ano mínimo navegável\n * @default 2020\n */\n minYear?: number;\n /**\n * Ano máximo navegável\n * @default anoAtual + 5\n */\n maxYear?: number;\n /**\n * Classes CSS adicionais para o trigger\n */\n className?: string;\n /**\n * Estado de erro\n */\n error?: boolean;\n /**\n * ID do campo para acessibilidade\n */\n id?: string;\n /**\n * Nome do campo para formulários\n */\n name?: string;\n}\n\nfunction monthKey(year: number, month: number) {\n return year * 12 + month;\n}\n\nfunction formatMesAno(date: Date) {\n return `${MESES[date.getMonth()]}/${date.getFullYear()}`;\n}\n\nfunction parseMesAno(input: string): Date | null {\n const match = input.trim().match(/^([A-Za-zÀ-ÿ]{3,}|\\d{1,2})\\/(\\d{4})$/);\n if (!match) return null;\n\n const [, monthRaw, yearRaw] = match;\n const year = Number(yearRaw);\n if (Number.isNaN(year)) return null;\n\n let month: number;\n if (/^\\d+$/.test(monthRaw)) {\n month = Number(monthRaw);\n } else {\n const idx = MESES.findIndex((m) => m.toLowerCase() === monthRaw.toLowerCase().slice(0, 3));\n if (idx === -1) return null;\n month = idx + 1;\n }\n if (month < 1 || month > 12) return null;\n\n return new Date(year, month - 1, 1);\n}\n\nfunction parseInputRange(input: string): MonthYearRange | null {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const separators = [\"→\", \"-\", \"até\", \"a\"];\n for (const sep of separators) {\n if (!trimmed.includes(sep)) continue;\n const parts = trimmed.split(sep).map((p) => p.trim());\n if (parts.length !== 2) continue;\n\n const from = parseMesAno(parts[0]);\n const to = parseMesAno(parts[1]);\n if (from && to) {\n // Mês final anterior ao inicial é inválido (não é corrigido silenciosamente) — dispara estado de erro no input\n if (monthKey(from.getFullYear(), from.getMonth() + 1) > monthKey(to.getFullYear(), to.getMonth() + 1)) {\n return null;\n }\n return { from, to };\n }\n }\n\n return null;\n}\n\ninterface MonthPanelProps {\n titulo: string;\n year: number;\n onYearChange: (year: number) => void;\n minYear: number;\n maxYear: number;\n selectedMonth: number;\n selectedYear: number;\n onSelect: (year: number, month: number) => void;\n isMonthDisabled?: (year: number, month: number) => boolean;\n}\n\nfunction PainelMes({\n titulo,\n year,\n onYearChange,\n minYear,\n maxYear,\n selectedMonth,\n selectedYear,\n onSelect,\n isMonthDisabled,\n}: MonthPanelProps) {\n return (\n <div className=\"p-3 w-56\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">{titulo}</p>\n <div className=\"flex items-center justify-center mb-2 gap-1\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => onYearChange(Math.max(minYear, year - 1))}\n disabled={year <= minYear}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Input\n type=\"number\"\n className=\"w-20 text-center h-8\"\n value={year}\n min={minYear}\n max={maxYear}\n onChange={(e) => {\n const parsed = Number(e.target.value);\n if (!Number.isNaN(parsed)) onYearChange(parsed);\n }}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => onYearChange(Math.min(maxYear, year + 1))}\n disabled={year >= maxYear}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"grid grid-cols-3 gap-1\">\n {MESES.map((label, idx) => {\n const month = idx + 1;\n const disabled = isMonthDisabled?.(year, month) ?? false;\n const selected = year === selectedYear && month === selectedMonth;\n return (\n <Button\n key={label}\n type=\"button\"\n variant={selected ? \"default\" : \"ghost\"}\n size=\"sm\"\n className=\"px-0\"\n disabled={disabled}\n onClick={() => onSelect(year, month)}\n >\n {label}\n </Button>\n );\n })}\n </div>\n </div>\n );\n}\n\n/**\n * MonthRangePicker - Seleção de intervalo de meses (Mês/Ano Início + Mês/Ano Fim)\n *\n * @example\n * <MonthRangePicker\n * value={periodo}\n * onChange={setPeriodo}\n * placeholder=\"Selecione o período\"\n * />\n *\n * @example\n * // Digitação direta\n * // Set/2025 → Mar/2026\n * // 09/2025 - 03/2026\n */\nconst MonthRangePicker = React.forwardRef<\n React.ElementRef<typeof Input>,\n MonthRangePickerProps\n>(({\n value,\n onChange,\n placeholder = \"Selecione um período\",\n disabled = false,\n minYear = 2020,\n maxYear = new Date().getFullYear() + 5,\n className,\n error = false,\n id,\n name,\n}, ref) => {\n const [open, setOpen] = React.useState(false);\n const [pending, setPending] = React.useState<MonthYearRange | undefined>(value);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [isInvalid, setIsInvalid] = React.useState(false);\n const [yearInicio, setYearInicio] = React.useState(() => (value?.from ?? new Date()).getFullYear());\n const [yearFim, setYearFim] = React.useState(() => (value?.to ?? new Date()).getFullYear());\n\n React.useEffect(() => {\n setPending(value);\n if (value?.from) setYearInicio(value.from.getFullYear());\n if (value?.to) setYearFim(value.to.getFullYear());\n\n if (value?.from && value?.to) {\n setInputValue(`${formatMesAno(value.from)} → ${formatMesAno(value.to)}`);\n } else {\n setInputValue(\"\");\n }\n setIsInvalid(false);\n }, [value]);\n\n const handleSelectInicio = (year: number, month: number) => {\n const from = new Date(year, month - 1, 1);\n const to = pending?.to && monthKey(pending.to.getFullYear(), pending.to.getMonth() + 1) >= monthKey(year, month)\n ? pending.to\n : from;\n setPending({ from, to });\n };\n\n const handleSelectFim = (year: number, month: number) => {\n if (!pending?.from) return;\n const to = new Date(year, month - 1, 1);\n setPending({ from: pending.from, to });\n };\n\n const isFimDisabled = (year: number, month: number) => {\n if (!pending?.from) return false;\n return monthKey(year, month) < monthKey(pending.from.getFullYear(), pending.from.getMonth() + 1);\n };\n\n const handleConfirm = () => {\n onChange?.(pending);\n setOpen(false);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n setPending(undefined);\n setInputValue(\"\");\n setIsInvalid(false);\n onChange?.(undefined);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n setInputValue(e.target.value);\n setIsInvalid(false);\n };\n\n const handleInputBlur = () => {\n if (disabled) return;\n if (!inputValue.trim()) {\n setPending(undefined);\n onChange?.(undefined);\n setIsInvalid(false);\n return;\n }\n\n const parsed = parseInputRange(inputValue);\n if (parsed) {\n setPending(parsed);\n setYearInicio(parsed.from.getFullYear());\n setYearFim(parsed.to.getFullYear());\n onChange?.(parsed);\n setIsInvalid(false);\n } else {\n setIsInvalid(true);\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleInputBlur();\n if (!isInvalid) setOpen(true);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n if (value?.from && value?.to) {\n setInputValue(`${formatMesAno(value.from)} → ${formatMesAno(value.to)}`);\n } else {\n setInputValue(\"\");\n }\n setIsInvalid(false);\n }\n };\n\n return (\n <Popover open={!disabled && open} onOpenChange={(o) => { if (!disabled) setOpen(o); }}>\n <div className=\"relative w-full\">\n <Input\n ref={ref}\n id={id}\n name={name}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n onKeyDown={handleInputKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={error || isInvalid}\n className={cn(\n \"pr-20\",\n (error || isInvalid) && \"border-destructive focus-visible:ring-destructive/20\",\n className,\n )}\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center gap-1 pr-1\">\n {inputValue && !disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 hover:bg-transparent\"\n onClick={handleClear}\n tabIndex={-1}\n >\n <X className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" />\n <span className=\"sr-only\">Limpar</span>\n </Button>\n )}\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 hover:bg-transparent\"\n disabled={disabled}\n aria-label=\"Abrir calendário\"\n >\n <CalendarIcon className=\"h-4 w-4 text-muted-foreground\" />\n </Button>\n </PopoverTrigger>\n </div>\n </div>\n <PopoverContent align=\"start\" className=\"w-auto p-0 max-w-[calc(100vw-2rem)]\">\n <div className=\"flex flex-col sm:flex-row divide-y sm:divide-y-0 sm:divide-x\">\n <PainelMes\n titulo=\"Mês inicial\"\n year={yearInicio}\n onYearChange={setYearInicio}\n minYear={minYear}\n maxYear={maxYear}\n selectedYear={pending?.from?.getFullYear() ?? -1}\n selectedMonth={(pending?.from?.getMonth() ?? -2) + 1}\n onSelect={handleSelectInicio}\n />\n <PainelMes\n titulo=\"Mês final\"\n year={yearFim}\n onYearChange={setYearFim}\n minYear={minYear}\n maxYear={maxYear}\n selectedYear={pending?.to?.getFullYear() ?? -1}\n selectedMonth={(pending?.to?.getMonth() ?? -2) + 1}\n onSelect={handleSelectFim}\n isMonthDisabled={isFimDisabled}\n />\n </div>\n <div className=\"border-t p-3 flex justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleClear}>\n Limpar\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={!pending?.from || !pending?.to}\n onClick={handleConfirm}\n >\n Confirmar\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n );\n});\n\nMonthRangePicker.displayName = \"MonthRangePicker\";\n\nexport { MonthRangePicker };\n"],"names":["MESES","monthKey","year","month","formatMesAno","date","parseMesAno","input","match","monthRaw","yearRaw","idx","m","parseInputRange","trimmed","separators","sep","parts","p","from","to","PainelMes","titulo","onYearChange","minYear","maxYear","selectedMonth","selectedYear","onSelect","isMonthDisabled","jsxs","jsx","Button","ChevronLeft","Input","e","parsed","ChevronRight","label","disabled","selected","MonthRangePicker","React","value","onChange","placeholder","className","error","id","name","ref","open","setOpen","pending","setPending","inputValue","setInputValue","isInvalid","setIsInvalid","yearInicio","setYearInicio","yearFim","setYearFim","handleSelectInicio","handleSelectFim","isFimDisabled","handleConfirm","handleClear","handleInputChange","handleInputBlur","handleInputKeyDown","Popover","cn","X","PopoverTrigger","CalendarIcon","PopoverContent","_a","_b","_c","_d"],"mappings":"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"}
1
+ {"version":3,"file":"month-range-picker.cjs","sources":["../../../../src/components/ui/forms/month-range-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { CalendarIcon, ChevronLeft, ChevronRight, X } from \"lucide-react\";\n\nimport { cn } from \"../utils\";\nimport { useControllableValue } from \"../use-controllable-value\";\nimport { Input } from \"./input\";\nimport { Button } from \"../primitives/button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../overlays/popover\";\n\nconst MESES = [\"Jan\", \"Fev\", \"Mar\", \"Abr\", \"Mai\", \"Jun\", \"Jul\", \"Ago\", \"Set\", \"Out\", \"Nov\", \"Dez\"];\n\nexport interface MonthYearRange {\n from: Date;\n to: Date;\n}\n\nexport interface MonthRangePickerProps {\n /**\n * Intervalo de meses selecionado (modo controlado). `from`/`to` representam o\n * 1º dia do mês. Omita para o modo não-controlado.\n */\n value?: MonthYearRange;\n /**\n * Valor inicial no modo não-controlado (quando `value` não é passado).\n */\n defaultValue?: MonthYearRange;\n /**\n * Callback quando o intervalo muda. Chamado nos dois modos.\n */\n onChange?: (range: MonthYearRange | undefined) => void;\n /**\n * Placeholder do campo\n * @default \"Selecione um período\"\n */\n placeholder?: string;\n /**\n * Desabilita o componente\n */\n disabled?: boolean;\n /**\n * Ano mínimo navegável\n * @default 2020\n */\n minYear?: number;\n /**\n * Ano máximo navegável\n * @default anoAtual + 5\n */\n maxYear?: number;\n /**\n * Classes CSS adicionais para o trigger\n */\n className?: string;\n /**\n * Estado de erro\n */\n error?: boolean;\n /**\n * ID do campo para acessibilidade\n */\n id?: string;\n /**\n * Nome do campo para formulários\n */\n name?: string;\n}\n\nfunction monthKey(year: number, month: number) {\n return year * 12 + month;\n}\n\nfunction formatMesAno(date: Date) {\n return `${MESES[date.getMonth()]}/${date.getFullYear()}`;\n}\n\nfunction parseMesAno(input: string): Date | null {\n const match = input.trim().match(/^([A-Za-zÀ-ÿ]{3,}|\\d{1,2})\\/(\\d{4})$/);\n if (!match) return null;\n\n const [, monthRaw, yearRaw] = match;\n const year = Number(yearRaw);\n if (Number.isNaN(year)) return null;\n\n let month: number;\n if (/^\\d+$/.test(monthRaw)) {\n month = Number(monthRaw);\n } else {\n const idx = MESES.findIndex((m) => m.toLowerCase() === monthRaw.toLowerCase().slice(0, 3));\n if (idx === -1) return null;\n month = idx + 1;\n }\n if (month < 1 || month > 12) return null;\n\n return new Date(year, month - 1, 1);\n}\n\nfunction parseInputRange(input: string): MonthYearRange | null {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const separators = [\"→\", \"-\", \"até\", \"a\"];\n for (const sep of separators) {\n if (!trimmed.includes(sep)) continue;\n const parts = trimmed.split(sep).map((p) => p.trim());\n if (parts.length !== 2) continue;\n\n const from = parseMesAno(parts[0]);\n const to = parseMesAno(parts[1]);\n if (from && to) {\n // Mês final anterior ao inicial é inválido (não é corrigido silenciosamente) — dispara estado de erro no input\n if (monthKey(from.getFullYear(), from.getMonth() + 1) > monthKey(to.getFullYear(), to.getMonth() + 1)) {\n return null;\n }\n return { from, to };\n }\n }\n\n return null;\n}\n\ninterface MonthPanelProps {\n titulo: string;\n year: number;\n onYearChange: (year: number) => void;\n minYear: number;\n maxYear: number;\n selectedMonth: number;\n selectedYear: number;\n onSelect: (year: number, month: number) => void;\n isMonthDisabled?: (year: number, month: number) => boolean;\n}\n\nfunction PainelMes({\n titulo,\n year,\n onYearChange,\n minYear,\n maxYear,\n selectedMonth,\n selectedYear,\n onSelect,\n isMonthDisabled,\n}: MonthPanelProps) {\n return (\n <div className=\"p-3 w-56\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">{titulo}</p>\n <div className=\"flex items-center justify-center mb-2 gap-1\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => onYearChange(Math.max(minYear, year - 1))}\n disabled={year <= minYear}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Input\n type=\"number\"\n className=\"w-20 text-center h-8\"\n value={year}\n min={minYear}\n max={maxYear}\n onChange={(e) => {\n const parsed = Number(e.target.value);\n if (!Number.isNaN(parsed)) onYearChange(parsed);\n }}\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => onYearChange(Math.min(maxYear, year + 1))}\n disabled={year >= maxYear}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"grid grid-cols-3 gap-1\">\n {MESES.map((label, idx) => {\n const month = idx + 1;\n const disabled = isMonthDisabled?.(year, month) ?? false;\n const selected = year === selectedYear && month === selectedMonth;\n return (\n <Button\n key={label}\n type=\"button\"\n variant={selected ? \"default\" : \"ghost\"}\n size=\"sm\"\n className=\"px-0\"\n disabled={disabled}\n onClick={() => onSelect(year, month)}\n >\n {label}\n </Button>\n );\n })}\n </div>\n </div>\n );\n}\n\n/**\n * MonthRangePicker - Seleção de intervalo de meses (Mês/Ano Início + Mês/Ano Fim)\n *\n * @example\n * <MonthRangePicker\n * value={periodo}\n * onChange={setPeriodo}\n * placeholder=\"Selecione o período\"\n * />\n *\n * @example\n * // Digitação direta\n * // Set/2025 → Mar/2026\n * // 09/2025 - 03/2026\n */\nconst MonthRangePicker = React.forwardRef<\n React.ElementRef<typeof Input>,\n MonthRangePickerProps\n>(({\n value: valueProp,\n defaultValue,\n onChange,\n placeholder = \"Selecione um período\",\n disabled = false,\n minYear = 2020,\n maxYear = new Date().getFullYear() + 5,\n className,\n error = false,\n id,\n name,\n}, ref) => {\n const [value, setValue] = useControllableValue<MonthYearRange>(valueProp, defaultValue, onChange);\n const [open, setOpen] = React.useState(false);\n const [pending, setPending] = React.useState<MonthYearRange | undefined>(value);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [isInvalid, setIsInvalid] = React.useState(false);\n const [yearInicio, setYearInicio] = React.useState(() => (value?.from ?? new Date()).getFullYear());\n const [yearFim, setYearFim] = React.useState(() => (value?.to ?? new Date()).getFullYear());\n\n React.useEffect(() => {\n setPending(value);\n if (value?.from) setYearInicio(value.from.getFullYear());\n if (value?.to) setYearFim(value.to.getFullYear());\n\n if (value?.from && value?.to) {\n setInputValue(`${formatMesAno(value.from)} → ${formatMesAno(value.to)}`);\n } else {\n setInputValue(\"\");\n }\n setIsInvalid(false);\n }, [value]);\n\n const handleSelectInicio = (year: number, month: number) => {\n const from = new Date(year, month - 1, 1);\n const to = pending?.to && monthKey(pending.to.getFullYear(), pending.to.getMonth() + 1) >= monthKey(year, month)\n ? pending.to\n : from;\n setPending({ from, to });\n };\n\n const handleSelectFim = (year: number, month: number) => {\n if (!pending?.from) return;\n const to = new Date(year, month - 1, 1);\n setPending({ from: pending.from, to });\n };\n\n const isFimDisabled = (year: number, month: number) => {\n if (!pending?.from) return false;\n return monthKey(year, month) < monthKey(pending.from.getFullYear(), pending.from.getMonth() + 1);\n };\n\n const handleConfirm = () => {\n setValue(pending);\n setOpen(false);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n setPending(undefined);\n setInputValue(\"\");\n setIsInvalid(false);\n setValue(undefined);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n // Aceita \"09/2026\" e \"Set/2026\" (nome do mês) — filtra pontuação/símbolos fora disso.\n setInputValue(e.target.value.replace(/[^A-Za-zÀ-ÿ\\d/\\s→-]/g, \"\"));\n setIsInvalid(false);\n };\n\n const handleInputBlur = () => {\n if (disabled) return;\n if (!inputValue.trim()) {\n setPending(undefined);\n setValue(undefined);\n setIsInvalid(false);\n return;\n }\n\n const parsed = parseInputRange(inputValue);\n if (parsed) {\n setPending(parsed);\n setYearInicio(parsed.from.getFullYear());\n setYearFim(parsed.to.getFullYear());\n setValue(parsed);\n setIsInvalid(false);\n } else {\n setIsInvalid(true);\n }\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleInputBlur();\n if (!isInvalid) setOpen(true);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n if (value?.from && value?.to) {\n setInputValue(`${formatMesAno(value.from)} → ${formatMesAno(value.to)}`);\n } else {\n setInputValue(\"\");\n }\n setIsInvalid(false);\n }\n };\n\n return (\n <Popover open={!disabled && open} onOpenChange={(o) => { if (!disabled) setOpen(o); }}>\n <div className=\"relative w-full\">\n <Input\n ref={ref}\n id={id}\n name={name}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n onKeyDown={handleInputKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={error || isInvalid}\n className={cn(\n \"pr-20\",\n (error || isInvalid) && \"border-destructive focus-visible:ring-destructive/20\",\n className,\n )}\n />\n <div className=\"absolute inset-y-0 right-0 flex items-center gap-1 pr-1\">\n {inputValue && !disabled && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 hover:bg-transparent\"\n onClick={handleClear}\n tabIndex={-1}\n >\n <X className=\"h-4 w-4 text-muted-foreground hover:text-foreground\" />\n <span className=\"sr-only\">Limpar</span>\n </Button>\n )}\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0 hover:bg-transparent\"\n disabled={disabled}\n aria-label=\"Abrir calendário\"\n >\n <CalendarIcon className=\"h-4 w-4 text-muted-foreground\" />\n </Button>\n </PopoverTrigger>\n </div>\n </div>\n <PopoverContent align=\"start\" className=\"w-auto p-0 max-w-[calc(100vw-2rem)]\">\n <div className=\"flex flex-col sm:flex-row divide-y sm:divide-y-0 sm:divide-x\">\n <PainelMes\n titulo=\"Mês inicial\"\n year={yearInicio}\n onYearChange={setYearInicio}\n minYear={minYear}\n maxYear={maxYear}\n selectedYear={pending?.from?.getFullYear() ?? -1}\n selectedMonth={(pending?.from?.getMonth() ?? -2) + 1}\n onSelect={handleSelectInicio}\n />\n <PainelMes\n titulo=\"Mês final\"\n year={yearFim}\n onYearChange={setYearFim}\n minYear={minYear}\n maxYear={maxYear}\n selectedYear={pending?.to?.getFullYear() ?? -1}\n selectedMonth={(pending?.to?.getMonth() ?? -2) + 1}\n onSelect={handleSelectFim}\n isMonthDisabled={isFimDisabled}\n />\n </div>\n <div className=\"border-t p-3 flex justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleClear}>\n Limpar\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n disabled={!pending?.from || !pending?.to}\n onClick={handleConfirm}\n >\n Confirmar\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n );\n});\n\nMonthRangePicker.displayName = \"MonthRangePicker\";\n\nexport { MonthRangePicker };\n"],"names":["MESES","monthKey","year","month","formatMesAno","date","parseMesAno","input","match","monthRaw","yearRaw","idx","parseInputRange","trimmed","separators","sep","parts","p","from","to","PainelMes","titulo","onYearChange","minYear","maxYear","selectedMonth","selectedYear","onSelect","isMonthDisabled","jsxs","jsx","Button","ChevronLeft","Input","e","parsed","ChevronRight","label","disabled","selected","MonthRangePicker","React","valueProp","defaultValue","onChange","placeholder","className","error","id","name","ref","value","setValue","useControllableValue","open","setOpen","pending","setPending","inputValue","setInputValue","isInvalid","setIsInvalid","yearInicio","setYearInicio","yearFim","setYearFim","handleSelectInicio","handleSelectFim","isFimDisabled","handleConfirm","handleClear","handleInputChange","handleInputBlur","handleInputKeyDown","Popover","o","cn","X","PopoverTrigger","CalendarIcon","PopoverContent","_a","_b","_c","_d"],"mappings":"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"}
@@ -1,61 +1,62 @@
1
1
  "use client";
2
- import { jsxs as m, jsx as s } from "react/jsx-runtime";
3
- import * as u from "react";
4
- import { X as H, CalendarIcon as Q, ChevronLeft as U, ChevronRight as W } from "lucide-react";
5
- import { cn as _ } from "../utils.js";
6
- import { Input as J } from "./input.js";
2
+ import { jsxs as u, jsx as s } from "react/jsx-runtime";
3
+ import * as f from "react";
4
+ import { X as U, CalendarIcon as W, ChevronLeft as _, ChevronRight as ee } from "lucide-react";
5
+ import { cn as te } from "../utils.js";
6
+ import { useControllableValue as re } from "../use-controllable-value.js";
7
+ import { Input as B } from "./input.js";
7
8
  import { Button as p } from "../primitives/button.js";
8
- import { Popover as v, PopoverTrigger as tt, PopoverContent as et } from "../overlays/popover.js";
9
+ import { Popover as oe, PopoverTrigger as ne, PopoverContent as se } from "../overlays/popover.js";
9
10
  const P = ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"];
10
- function b(t, r) {
11
- return t * 12 + r;
11
+ function C(l, o) {
12
+ return l * 12 + o;
12
13
  }
13
- function Y(t) {
14
- return `${P[t.getMonth()]}/${t.getFullYear()}`;
14
+ function S(l) {
15
+ return `${P[l.getMonth()]}/${l.getFullYear()}`;
15
16
  }
16
- function K(t) {
17
- const r = t.trim().match(/^([A-Za-zÀ-ÿ]{3,}|\d{1,2})\/(\d{4})$/);
18
- if (!r) return null;
19
- const [, l, n] = r, c = Number(n);
20
- if (Number.isNaN(c)) return null;
21
- let i;
22
- if (/^\d+$/.test(l))
23
- i = Number(l);
17
+ function K(l) {
18
+ const o = l.trim().match(/^([A-Za-zÀ-ÿ]{3,}|\d{1,2})\/(\d{4})$/);
19
+ if (!o) return null;
20
+ const [, c, m] = o, n = Number(m);
21
+ if (Number.isNaN(n)) return null;
22
+ let a;
23
+ if (/^\d+$/.test(c))
24
+ a = Number(c);
24
25
  else {
25
- const a = P.findIndex((f) => f.toLowerCase() === l.toLowerCase().slice(0, 3));
26
- if (a === -1) return null;
27
- i = a + 1;
26
+ const i = P.findIndex((h) => h.toLowerCase() === c.toLowerCase().slice(0, 3));
27
+ if (i === -1) return null;
28
+ a = i + 1;
28
29
  }
29
- return i < 1 || i > 12 ? null : new Date(c, i - 1, 1);
30
+ return a < 1 || a > 12 ? null : new Date(n, a - 1, 1);
30
31
  }
31
- function rt(t) {
32
- const r = t.trim();
33
- if (!r) return null;
34
- const l = ["→", "-", "até", "a"];
35
- for (const n of l) {
36
- if (!r.includes(n)) continue;
37
- const c = r.split(n).map((f) => f.trim());
38
- if (c.length !== 2) continue;
39
- const i = K(c[0]), a = K(c[1]);
40
- if (i && a)
41
- return b(i.getFullYear(), i.getMonth() + 1) > b(a.getFullYear(), a.getMonth() + 1) ? null : { from: i, to: a };
32
+ function ae(l) {
33
+ const o = l.trim();
34
+ if (!o) return null;
35
+ const c = ["→", "-", "até", "a"];
36
+ for (const m of c) {
37
+ if (!o.includes(m)) continue;
38
+ const n = o.split(m).map((h) => h.trim());
39
+ if (n.length !== 2) continue;
40
+ const a = K(n[0]), i = K(n[1]);
41
+ if (a && i)
42
+ return C(a.getFullYear(), a.getMonth() + 1) > C(i.getFullYear(), i.getMonth() + 1) ? null : { from: a, to: i };
42
43
  }
43
44
  return null;
44
45
  }
45
- function B({
46
- titulo: t,
47
- year: r,
48
- onYearChange: l,
49
- minYear: n,
50
- maxYear: c,
51
- selectedMonth: i,
52
- selectedYear: a,
53
- onSelect: f,
54
- isMonthDisabled: y
46
+ function V({
47
+ titulo: l,
48
+ year: o,
49
+ onYearChange: c,
50
+ minYear: m,
51
+ maxYear: n,
52
+ selectedMonth: a,
53
+ selectedYear: i,
54
+ onSelect: h,
55
+ isMonthDisabled: g
55
56
  }) {
56
- return /* @__PURE__ */ m("div", { className: "p-3 w-56", children: [
57
- /* @__PURE__ */ s("p", { className: "text-xs font-medium text-muted-foreground mb-2", children: t }),
58
- /* @__PURE__ */ m("div", { className: "flex items-center justify-center mb-2 gap-1", children: [
57
+ return /* @__PURE__ */ u("div", { className: "p-3 w-56", children: [
58
+ /* @__PURE__ */ s("p", { className: "text-xs font-medium text-muted-foreground mb-2", children: l }),
59
+ /* @__PURE__ */ u("div", { className: "flex items-center justify-center mb-2 gap-1", children: [
59
60
  /* @__PURE__ */ s(
60
61
  p,
61
62
  {
@@ -63,22 +64,22 @@ function B({
63
64
  variant: "ghost",
64
65
  size: "sm",
65
66
  className: "h-7 w-7 p-0",
66
- onClick: () => l(Math.max(n, r - 1)),
67
- disabled: r <= n,
68
- children: /* @__PURE__ */ s(U, { className: "h-4 w-4" })
67
+ onClick: () => c(Math.max(m, o - 1)),
68
+ disabled: o <= m,
69
+ children: /* @__PURE__ */ s(_, { className: "h-4 w-4" })
69
70
  }
70
71
  ),
71
72
  /* @__PURE__ */ s(
72
- J,
73
+ B,
73
74
  {
74
75
  type: "number",
75
76
  className: "w-20 text-center h-8",
76
- value: r,
77
- min: n,
78
- max: c,
79
- onChange: (h) => {
80
- const N = Number(h.target.value);
81
- Number.isNaN(N) || l(N);
77
+ value: o,
78
+ min: m,
79
+ max: n,
80
+ onChange: (N) => {
81
+ const v = Number(N.target.value);
82
+ Number.isNaN(v) || c(v);
82
83
  }
83
84
  }
84
85
  ),
@@ -89,97 +90,98 @@ function B({
89
90
  variant: "ghost",
90
91
  size: "sm",
91
92
  className: "h-7 w-7 p-0",
92
- onClick: () => l(Math.min(c, r + 1)),
93
- disabled: r >= c,
94
- children: /* @__PURE__ */ s(W, { className: "h-4 w-4" })
93
+ onClick: () => c(Math.min(n, o + 1)),
94
+ disabled: o >= n,
95
+ children: /* @__PURE__ */ s(ee, { className: "h-4 w-4" })
95
96
  }
96
97
  )
97
98
  ] }),
98
- /* @__PURE__ */ s("div", { className: "grid grid-cols-3 gap-1", children: P.map((h, N) => {
99
- const F = N + 1, M = (y == null ? void 0 : y(r, F)) ?? !1;
99
+ /* @__PURE__ */ s("div", { className: "grid grid-cols-3 gap-1", children: P.map((N, v) => {
100
+ const y = v + 1, e = (g == null ? void 0 : g(o, y)) ?? !1;
100
101
  return /* @__PURE__ */ s(
101
102
  p,
102
103
  {
103
104
  type: "button",
104
- variant: r === a && F === i ? "default" : "ghost",
105
+ variant: o === i && y === a ? "default" : "ghost",
105
106
  size: "sm",
106
107
  className: "px-0",
107
- disabled: M,
108
- onClick: () => f(r, F),
109
- children: h
108
+ disabled: e,
109
+ onClick: () => h(o, y),
110
+ children: N
110
111
  },
111
- h
112
+ N
112
113
  );
113
114
  }) })
114
115
  ] });
115
116
  }
116
- const ot = u.forwardRef(({
117
- value: t,
118
- onChange: r,
119
- placeholder: l = "Selecione um período",
117
+ const le = f.forwardRef(({
118
+ value: l,
119
+ defaultValue: o,
120
+ onChange: c,
121
+ placeholder: m = "Selecione um período",
120
122
  disabled: n = !1,
121
- minYear: c = 2020,
123
+ minYear: a = 2020,
122
124
  maxYear: i = (/* @__PURE__ */ new Date()).getFullYear() + 5,
123
- className: a,
124
- error: f = !1,
125
- id: y,
126
- name: h
127
- }, N) => {
125
+ className: h,
126
+ error: g = !1,
127
+ id: N,
128
+ name: v
129
+ }, y) => {
128
130
  var A, E, L, j;
129
- const [F, M] = u.useState(!1), [e, w] = u.useState(t), [I, g] = u.useState(""), [k, d] = u.useState(!1), [O, D] = u.useState(() => ((t == null ? void 0 : t.from) ?? /* @__PURE__ */ new Date()).getFullYear()), [V, z] = u.useState(() => ((t == null ? void 0 : t.to) ?? /* @__PURE__ */ new Date()).getFullYear());
130
- u.useEffect(() => {
131
- w(t), t != null && t.from && D(t.from.getFullYear()), t != null && t.to && z(t.to.getFullYear()), t != null && t.from && (t != null && t.to) ? g(`${Y(t.from)} → ${Y(t.to)}`) : g(""), d(!1);
132
- }, [t]);
133
- const C = (o, x) => {
134
- const S = new Date(o, x - 1, 1), G = e != null && e.to && b(e.to.getFullYear(), e.to.getMonth() + 1) >= b(o, x) ? e.to : S;
135
- w({ from: S, to: G });
136
- }, T = (o, x) => {
137
- if (!(e != null && e.from)) return;
138
- const S = new Date(o, x - 1, 1);
139
- w({ from: e.from, to: S });
140
- }, X = (o, x) => e != null && e.from ? b(o, x) < b(e.from.getFullYear(), e.from.getMonth() + 1) : !1, Z = () => {
141
- r == null || r(e), M(!1);
142
- }, R = (o) => {
143
- o.stopPropagation(), w(void 0), g(""), d(!1), r == null || r(void 0);
144
- }, q = (o) => {
145
- n || (g(o.target.value), d(!1));
131
+ const [e, F] = re(l, o, c), [J, Y] = f.useState(!1), [t, w] = f.useState(e), [M, b] = f.useState(""), [k, d] = f.useState(!1), [O, z] = f.useState(() => ((e == null ? void 0 : e.from) ?? /* @__PURE__ */ new Date()).getFullYear()), [Z, D] = f.useState(() => ((e == null ? void 0 : e.to) ?? /* @__PURE__ */ new Date()).getFullYear());
132
+ f.useEffect(() => {
133
+ w(e), e != null && e.from && z(e.from.getFullYear()), e != null && e.to && D(e.to.getFullYear()), e != null && e.from && (e != null && e.to) ? b(`${S(e.from)} → ${S(e.to)}`) : b(""), d(!1);
134
+ }, [e]);
135
+ const T = (r, x) => {
136
+ const I = new Date(r, x - 1, 1), Q = t != null && t.to && C(t.to.getFullYear(), t.to.getMonth() + 1) >= C(r, x) ? t.to : I;
137
+ w({ from: I, to: Q });
138
+ }, X = (r, x) => {
139
+ if (!(t != null && t.from)) return;
140
+ const I = new Date(r, x - 1, 1);
141
+ w({ from: t.from, to: I });
142
+ }, q = (r, x) => t != null && t.from ? C(r, x) < C(t.from.getFullYear(), t.from.getMonth() + 1) : !1, G = () => {
143
+ F(t), Y(!1);
144
+ }, R = (r) => {
145
+ r.stopPropagation(), w(void 0), b(""), d(!1), F(void 0);
146
+ }, H = (r) => {
147
+ n || (b(r.target.value.replace(/[^A-Za-zÀ-ÿ\d/\s→-]/g, "")), d(!1));
146
148
  }, $ = () => {
147
149
  if (n) return;
148
- if (!I.trim()) {
149
- w(void 0), r == null || r(void 0), d(!1);
150
+ if (!M.trim()) {
151
+ w(void 0), F(void 0), d(!1);
150
152
  return;
151
153
  }
152
- const o = rt(I);
153
- o ? (w(o), D(o.from.getFullYear()), z(o.to.getFullYear()), r == null || r(o), d(!1)) : d(!0);
154
+ const r = ae(M);
155
+ r ? (w(r), z(r.from.getFullYear()), D(r.to.getFullYear()), F(r), d(!1)) : d(!0);
154
156
  };
155
- return /* @__PURE__ */ m(v, { open: !n && F, onOpenChange: (o) => {
156
- n || M(o);
157
+ return /* @__PURE__ */ u(oe, { open: !n && J, onOpenChange: (r) => {
158
+ n || Y(r);
157
159
  }, children: [
158
- /* @__PURE__ */ m("div", { className: "relative w-full", children: [
160
+ /* @__PURE__ */ u("div", { className: "relative w-full", children: [
159
161
  /* @__PURE__ */ s(
160
- J,
162
+ B,
161
163
  {
162
- ref: N,
163
- id: y,
164
- name: h,
165
- value: I,
166
- onChange: q,
164
+ ref: y,
165
+ id: N,
166
+ name: v,
167
+ value: M,
168
+ onChange: H,
167
169
  onBlur: $,
168
- onKeyDown: (o) => {
169
- o.key === "Enter" ? (o.preventDefault(), $(), k || M(!0)) : o.key === "Escape" && (o.preventDefault(), t != null && t.from && (t != null && t.to) ? g(`${Y(t.from)} → ${Y(t.to)}`) : g(""), d(!1));
170
+ onKeyDown: (r) => {
171
+ r.key === "Enter" ? (r.preventDefault(), $(), k || Y(!0)) : r.key === "Escape" && (r.preventDefault(), e != null && e.from && (e != null && e.to) ? b(`${S(e.from)} → ${S(e.to)}`) : b(""), d(!1));
170
172
  },
171
- placeholder: l,
173
+ placeholder: m,
172
174
  disabled: n,
173
- "aria-invalid": f || k,
174
- className: _(
175
+ "aria-invalid": g || k,
176
+ className: te(
175
177
  "pr-20",
176
- (f || k) && "border-destructive focus-visible:ring-destructive/20",
177
- a
178
+ (g || k) && "border-destructive focus-visible:ring-destructive/20",
179
+ h
178
180
  )
179
181
  }
180
182
  ),
181
- /* @__PURE__ */ m("div", { className: "absolute inset-y-0 right-0 flex items-center gap-1 pr-1", children: [
182
- I && !n && /* @__PURE__ */ m(
183
+ /* @__PURE__ */ u("div", { className: "absolute inset-y-0 right-0 flex items-center gap-1 pr-1", children: [
184
+ M && !n && /* @__PURE__ */ u(
183
185
  p,
184
186
  {
185
187
  type: "button",
@@ -189,12 +191,12 @@ const ot = u.forwardRef(({
189
191
  onClick: R,
190
192
  tabIndex: -1,
191
193
  children: [
192
- /* @__PURE__ */ s(H, { className: "h-4 w-4 text-muted-foreground hover:text-foreground" }),
194
+ /* @__PURE__ */ s(U, { className: "h-4 w-4 text-muted-foreground hover:text-foreground" }),
193
195
  /* @__PURE__ */ s("span", { className: "sr-only", children: "Limpar" })
194
196
  ]
195
197
  }
196
198
  ),
197
- /* @__PURE__ */ s(tt, { asChild: !0, children: /* @__PURE__ */ s(
199
+ /* @__PURE__ */ s(ne, { asChild: !0, children: /* @__PURE__ */ s(
198
200
  p,
199
201
  {
200
202
  type: "button",
@@ -203,50 +205,50 @@ const ot = u.forwardRef(({
203
205
  className: "h-7 w-7 p-0 hover:bg-transparent",
204
206
  disabled: n,
205
207
  "aria-label": "Abrir calendário",
206
- children: /* @__PURE__ */ s(Q, { className: "h-4 w-4 text-muted-foreground" })
208
+ children: /* @__PURE__ */ s(W, { className: "h-4 w-4 text-muted-foreground" })
207
209
  }
208
210
  ) })
209
211
  ] })
210
212
  ] }),
211
- /* @__PURE__ */ m(et, { align: "start", className: "w-auto p-0 max-w-[calc(100vw-2rem)]", children: [
212
- /* @__PURE__ */ m("div", { className: "flex flex-col sm:flex-row divide-y sm:divide-y-0 sm:divide-x", children: [
213
+ /* @__PURE__ */ u(se, { align: "start", className: "w-auto p-0 max-w-[calc(100vw-2rem)]", children: [
214
+ /* @__PURE__ */ u("div", { className: "flex flex-col sm:flex-row divide-y sm:divide-y-0 sm:divide-x", children: [
213
215
  /* @__PURE__ */ s(
214
- B,
216
+ V,
215
217
  {
216
218
  titulo: "Mês inicial",
217
219
  year: O,
218
- onYearChange: D,
219
- minYear: c,
220
+ onYearChange: z,
221
+ minYear: a,
220
222
  maxYear: i,
221
- selectedYear: ((A = e == null ? void 0 : e.from) == null ? void 0 : A.getFullYear()) ?? -1,
222
- selectedMonth: (((E = e == null ? void 0 : e.from) == null ? void 0 : E.getMonth()) ?? -2) + 1,
223
- onSelect: C
223
+ selectedYear: ((A = t == null ? void 0 : t.from) == null ? void 0 : A.getFullYear()) ?? -1,
224
+ selectedMonth: (((E = t == null ? void 0 : t.from) == null ? void 0 : E.getMonth()) ?? -2) + 1,
225
+ onSelect: T
224
226
  }
225
227
  ),
226
228
  /* @__PURE__ */ s(
227
- B,
229
+ V,
228
230
  {
229
231
  titulo: "Mês final",
230
- year: V,
231
- onYearChange: z,
232
- minYear: c,
232
+ year: Z,
233
+ onYearChange: D,
234
+ minYear: a,
233
235
  maxYear: i,
234
- selectedYear: ((L = e == null ? void 0 : e.to) == null ? void 0 : L.getFullYear()) ?? -1,
235
- selectedMonth: (((j = e == null ? void 0 : e.to) == null ? void 0 : j.getMonth()) ?? -2) + 1,
236
- onSelect: T,
237
- isMonthDisabled: X
236
+ selectedYear: ((L = t == null ? void 0 : t.to) == null ? void 0 : L.getFullYear()) ?? -1,
237
+ selectedMonth: (((j = t == null ? void 0 : t.to) == null ? void 0 : j.getMonth()) ?? -2) + 1,
238
+ onSelect: X,
239
+ isMonthDisabled: q
238
240
  }
239
241
  )
240
242
  ] }),
241
- /* @__PURE__ */ m("div", { className: "border-t p-3 flex justify-end gap-2", children: [
243
+ /* @__PURE__ */ u("div", { className: "border-t p-3 flex justify-end gap-2", children: [
242
244
  /* @__PURE__ */ s(p, { type: "button", variant: "outline", size: "sm", onClick: R, children: "Limpar" }),
243
245
  /* @__PURE__ */ s(
244
246
  p,
245
247
  {
246
248
  type: "button",
247
249
  size: "sm",
248
- disabled: !(e != null && e.from) || !(e != null && e.to),
249
- onClick: Z,
250
+ disabled: !(t != null && t.from) || !(t != null && t.to),
251
+ onClick: G,
250
252
  children: "Confirmar"
251
253
  }
252
254
  )
@@ -254,8 +256,8 @@ const ot = u.forwardRef(({
254
256
  ] })
255
257
  ] });
256
258
  });
257
- ot.displayName = "MonthRangePicker";
259
+ le.displayName = "MonthRangePicker";
258
260
  export {
259
- ot as MonthRangePicker
261
+ le as MonthRangePicker
260
262
  };
261
263
  //# sourceMappingURL=month-range-picker.js.map