@strategicos/ui 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +51 -2
  2. package/THIRD_PARTY_NOTICES.md +187 -0
  3. package/dist/components/calendar.d.ts +24 -0
  4. package/dist/components/calendar.d.ts.map +1 -0
  5. package/dist/components/calendar.js +81 -0
  6. package/dist/components/calendar.js.map +1 -0
  7. package/dist/components/combobox.d.ts +73 -0
  8. package/dist/components/combobox.d.ts.map +1 -0
  9. package/dist/components/combobox.js +193 -0
  10. package/dist/components/combobox.js.map +1 -0
  11. package/dist/components/date-input.d.ts +46 -0
  12. package/dist/components/date-input.d.ts.map +1 -0
  13. package/dist/components/date-input.js +202 -0
  14. package/dist/components/date-input.js.map +1 -0
  15. package/dist/components/date-picker-input.d.ts +49 -0
  16. package/dist/components/date-picker-input.d.ts.map +1 -0
  17. package/dist/components/date-picker-input.js +126 -0
  18. package/dist/components/date-picker-input.js.map +1 -0
  19. package/dist/components/date-time-picker.d.ts +27 -0
  20. package/dist/components/date-time-picker.d.ts.map +1 -0
  21. package/dist/components/date-time-picker.js +77 -0
  22. package/dist/components/date-time-picker.js.map +1 -0
  23. package/dist/components/dates.d.ts +94 -0
  24. package/dist/components/dates.d.ts.map +1 -0
  25. package/dist/components/dates.js +94 -0
  26. package/dist/components/dates.js.map +1 -0
  27. package/dist/components/multi-select.d.ts.map +1 -1
  28. package/dist/components/multi-select.js +2 -1
  29. package/dist/components/multi-select.js.map +1 -1
  30. package/dist/components/select.d.ts +16 -1
  31. package/dist/components/select.d.ts.map +1 -1
  32. package/dist/components/select.js +24 -2
  33. package/dist/components/select.js.map +1 -1
  34. package/dist/components/time-input.d.ts +16 -0
  35. package/dist/components/time-input.d.ts.map +1 -0
  36. package/dist/components/time-input.js +18 -0
  37. package/dist/components/time-input.js.map +1 -0
  38. package/package.json +2 -1
  39. package/src/components/calendar.tsx +139 -0
  40. package/src/components/combobox.tsx +390 -0
  41. package/src/components/date-input.tsx +287 -0
  42. package/src/components/date-picker-input.tsx +287 -0
  43. package/src/components/date-time-picker.tsx +152 -0
  44. package/src/components/dates.tsx +274 -0
  45. package/src/components/multi-select.tsx +3 -1
  46. package/src/components/select.tsx +29 -1
  47. package/src/components/time-input.tsx +34 -0
@@ -0,0 +1,193 @@
1
+ "use client";
2
+ import { Fragment as _Fragment, jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { CheckIcon, ChevronDownIcon, Loader2Icon, PlusIcon, SearchIcon, XIcon } from "lucide-react";
5
+ import { cn } from "../lib/utils.js";
6
+ import { Button } from "./button.js";
7
+ import { useFieldControl } from "./field.js";
8
+ import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
9
+ import { selectTriggerVariants } from "./select.js";
10
+ function errorMessage(err, fallback) {
11
+ return err instanceof Error && err.message ? err.message : fallback;
12
+ }
13
+ /**
14
+ * Seleção de um item com busca, como o Select `searchable` do Mantine. Use no
15
+ * lugar do Select quando a lista é longa ou quando a tela precisa criar ou
16
+ * excluir opções ali mesmo.
17
+ *
18
+ * <Combobox
19
+ * options={setores.map(s => ({ value: s.id, label: s.name }))}
20
+ * value={setorId}
21
+ * onValueChange={setSetorId}
22
+ * clearable
23
+ * onCreate={async nome => (await criarSetor(nome)).id}
24
+ * />
25
+ *
26
+ * - `clearable`: um X no gatilho volta o valor para `null`.
27
+ * - `onCreate`: com texto na busca que não bate com nenhuma opção, aparece
28
+ * "Criar “texto”". Se a função devolver um valor, ele fica selecionado.
29
+ * - `onRemove`: cada opção ganha um X que pede confirmação na própria linha.
30
+ * Se a opção excluída era a selecionada, o valor volta para `null`.
31
+ *
32
+ * Erros de `onCreate`/`onRemove` (promessa rejeitada) aparecem no rodapé da
33
+ * lista, com a mensagem do erro.
34
+ *
35
+ * Teclado: digite para filtrar, ↑/↓ para andar, Enter para escolher, Delete
36
+ * (com a busca vazia) para excluir a opção ativa, Esc para fechar. Dentro de
37
+ * um <Field>, o gatilho recebe o id e os aria-*.
38
+ */
39
+ function Combobox({ options, value, onValueChange, placeholder = "Selecione", searchPlaceholder = "Buscar…", emptyText = "Nada encontrado.", searchable = true, clearable = false, onCreate, createLabel = q => _jsxs(_Fragment, { children: ["Criar \u201C", q, "\u201D"] }), onRemove, removeLabel = o => `Excluir ${o.label}`, removeConfirmLabel = o => _jsxs(_Fragment, { children: ["Excluir \u201C", o.label, "\u201D?"] }), size = "default", disabled = false, className, wrapperClassName, contentClassName, onOpenChange, ...props }) {
40
+ const controlProps = useFieldControl(props, { withRequired: false });
41
+ const [open, setOpen] = React.useState(false);
42
+ const [query, setQuery] = React.useState("");
43
+ const [active, setActive] = React.useState(0);
44
+ const [creating, setCreating] = React.useState(false);
45
+ const [confirming, setConfirming] = React.useState(null);
46
+ const [removing, setRemoving] = React.useState(null);
47
+ const [error, setError] = React.useState(null);
48
+ const listId = React.useId();
49
+ const searchRef = React.useRef(null);
50
+ const selected = options.find(o => o.value === value);
51
+ const q = query.trim().toLowerCase();
52
+ const filtered = q ? options.filter(o => o.label.toLowerCase().includes(q)) : options;
53
+ const canCreate = !!onCreate && !!q && !options.some(o => o.label.trim().toLowerCase() === q);
54
+ // Ordem do teclado: as opções habilitadas e, por último, o "Criar".
55
+ const entries = filtered.filter(o => !o.disabled).map(option => ({ kind: "option", option }));
56
+ if (canCreate)
57
+ entries.push({ kind: "create" });
58
+ const activeIndex = Math.min(active, entries.length - 1);
59
+ const entryId = (i) => `${listId}-${i}`;
60
+ // Grupos na ordem em que aparecem nas opções.
61
+ const groups = [];
62
+ for (const o of filtered) {
63
+ const g = groups.find(x => x.name === o.group);
64
+ if (g)
65
+ g.items.push(o);
66
+ else
67
+ groups.push({ name: o.group, items: [o] });
68
+ }
69
+ // Mantém a opção ativa à vista ao andar com as setas.
70
+ React.useEffect(() => {
71
+ if (!open || activeIndex < 0)
72
+ return;
73
+ document.getElementById(entryId(activeIndex))?.scrollIntoView({ block: "nearest" });
74
+ // eslint-disable-next-line react-hooks/exhaustive-deps
75
+ }, [open, activeIndex]);
76
+ function handleOpenChange(o) {
77
+ setOpen(o);
78
+ if (!o) {
79
+ setQuery("");
80
+ setActive(0);
81
+ setConfirming(null);
82
+ setError(null);
83
+ }
84
+ else {
85
+ // Abre com a opção selecionada ativa.
86
+ const i = entries.findIndex(e => e.kind === "option" && e.option.value === value);
87
+ setActive(Math.max(i, 0));
88
+ }
89
+ onOpenChange?.(o);
90
+ }
91
+ function choose(v) {
92
+ onValueChange(v);
93
+ handleOpenChange(false);
94
+ }
95
+ async function create() {
96
+ if (!onCreate || creating)
97
+ return;
98
+ setCreating(true);
99
+ setError(null);
100
+ try {
101
+ const created = await onCreate(query.trim());
102
+ if (typeof created === "string")
103
+ onValueChange(created);
104
+ handleOpenChange(false);
105
+ }
106
+ catch (err) {
107
+ setError(errorMessage(err, "Não foi possível criar."));
108
+ }
109
+ finally {
110
+ setCreating(false);
111
+ }
112
+ }
113
+ async function remove(option) {
114
+ if (!onRemove)
115
+ return;
116
+ setRemoving(option.value);
117
+ setError(null);
118
+ try {
119
+ await onRemove(option);
120
+ if (option.value === value)
121
+ onValueChange(null);
122
+ }
123
+ catch (err) {
124
+ setError(errorMessage(err, "Não foi possível excluir."));
125
+ }
126
+ finally {
127
+ setRemoving(null);
128
+ setConfirming(null);
129
+ searchRef.current?.focus();
130
+ }
131
+ }
132
+ function cancelConfirm() {
133
+ setConfirming(null);
134
+ searchRef.current?.focus();
135
+ }
136
+ function activate(entry) {
137
+ if (!entry)
138
+ return;
139
+ if (entry.kind === "create")
140
+ void create();
141
+ else
142
+ choose(entry.option.value);
143
+ }
144
+ function onKeyDown(e) {
145
+ // Na confirmação, o teclado é dos botões Excluir/Cancelar.
146
+ if (confirming)
147
+ return;
148
+ if (e.key === "ArrowDown") {
149
+ e.preventDefault();
150
+ setActive(Math.min(activeIndex + 1, entries.length - 1));
151
+ }
152
+ else if (e.key === "ArrowUp") {
153
+ e.preventDefault();
154
+ setActive(Math.max(activeIndex - 1, 0));
155
+ }
156
+ else if (e.key === "Enter") {
157
+ e.preventDefault();
158
+ activate(entries[activeIndex]);
159
+ }
160
+ else if (e.key === "Delete" && onRemove && !query) {
161
+ const entry = entries[activeIndex];
162
+ if (entry?.kind === "option") {
163
+ e.preventDefault();
164
+ setConfirming(entry.option.value);
165
+ }
166
+ }
167
+ }
168
+ const showClear = clearable && !!selected && !disabled;
169
+ const trigger = (_jsx(PopoverTrigger, { asChild: true, disabled: disabled, children: _jsxs("button", { type: "button", role: "combobox", "aria-expanded": open, "aria-controls": listId, "aria-haspopup": "listbox", "data-slot": "combobox-trigger", "data-size": size, "data-placeholder": selected ? undefined : "", ...controlProps, className: cn(selectTriggerVariants({ size }), "w-full min-w-0 cursor-pointer text-left", showClear && "pr-9", className), children: [_jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [selected?.color && _jsx("span", { className: "size-2 shrink-0 rounded-full", style: { background: selected.color } }), _jsx("span", { className: "truncate", children: selected?.label ?? placeholder })] }), !showClear && _jsx(ChevronDownIcon, { className: "size-4 shrink-0 opacity-70" })] }) }));
170
+ return (_jsxs(Popover, { open: open, onOpenChange: handleOpenChange, children: [clearable ? (_jsxs("div", { "data-slot": "combobox-wrapper", className: cn("relative w-full min-w-0", wrapperClassName), children: [trigger, showClear && (
171
+ // Irmão do gatilho, não filho: botão dentro de botão não é HTML válido.
172
+ _jsx("button", { type: "button", onClick: () => onValueChange(null), "aria-label": "Limpar", className: "absolute inset-y-0 right-1.5 my-auto flex size-6 cursor-pointer items-center justify-center rounded text-muted-foreground outline-none hover:text-foreground focus-visible:ring-3 focus-visible:ring-ring/50", children: _jsx(XIcon, { className: "size-4" }) }))] })) : trigger, _jsxs(PopoverContent, { className: cn("w-(--radix-popover-trigger-width) min-w-60 p-0", contentClassName), onKeyDown: onKeyDown, onEscapeKeyDown: e => { if (confirming) {
173
+ e.preventDefault();
174
+ cancelConfirm();
175
+ } }, children: [searchable && (_jsxs("div", { className: "flex items-center gap-2 border-b border-border px-3", children: [_jsx(SearchIcon, { className: "size-4 shrink-0 text-muted-foreground" }), _jsx("input", { ref: searchRef, autoFocus: true, value: query, onChange: e => { setQuery(e.target.value); setActive(0); setError(null); }, placeholder: searchPlaceholder, "aria-label": searchPlaceholder, "aria-controls": listId, "aria-activedescendant": activeIndex >= 0 && !confirming ? entryId(activeIndex) : undefined, "aria-autocomplete": "list", className: "h-9 w-full bg-transparent text-base outline-none placeholder:text-muted-foreground md:text-sm" })] })), _jsxs("div", { id: listId, role: "listbox", className: "max-h-64 overflow-y-auto overscroll-contain p-1", children: [filtered.length === 0 && !canCreate && (_jsx("p", { className: "px-2.5 py-6 text-center text-sm text-muted-foreground", children: emptyText })), groups.map(g => (_jsxs("div", { role: "group", "aria-label": g.name, children: [g.name && _jsx("p", { className: "px-2.5 pt-2 pb-1 text-xs font-medium text-muted-foreground", children: g.name }), g.items.map(o => {
176
+ const index = entries.findIndex(e => e.kind === "option" && e.option.value === o.value);
177
+ const isSelected = o.value === value;
178
+ const isActive = index === activeIndex;
179
+ if (confirming === o.value)
180
+ return (_jsxs("div", { role: "alert", className: "flex items-center gap-1.5 rounded-md bg-destructive/10 py-1 pr-1 pl-2.5 text-sm", children: [_jsx("span", { className: "min-w-0 flex-1 truncate", children: removeConfirmLabel(o) }), _jsx(Button, { type: "button", size: "sm", variant: "destructive", autoFocus: true, disabled: removing === o.value, onClick: () => remove(o), children: removing === o.value ? _jsx(Loader2Icon, { className: "animate-spin" }) : "Excluir" }), _jsx(Button, { type: "button", size: "sm", variant: "ghost", disabled: removing === o.value, onClick: cancelConfirm, children: "Cancelar" })] }, o.value));
181
+ return (_jsxs("div", { id: index >= 0 ? entryId(index) : undefined, role: "option", "aria-selected": isSelected, "aria-disabled": o.disabled || undefined, "data-active": isActive || undefined, onMouseEnter: () => { if (index >= 0)
182
+ setActive(index); }, onClick: () => { if (!o.disabled)
183
+ choose(o.value); }, className: "group/option flex cursor-pointer items-center gap-2 rounded-md py-1.5 pr-2 pl-2.5 text-sm select-none data-active:bg-accent data-active:text-accent-foreground aria-disabled:cursor-not-allowed aria-disabled:opacity-50", children: [o.color && _jsx("span", { className: "size-2 shrink-0 rounded-full", style: { background: o.color } }), _jsxs("span", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx("span", { className: "truncate", children: o.label }), o.description && _jsx("span", { className: "truncate text-[11px] text-muted-foreground", children: o.description })] }), isSelected && _jsx(CheckIcon, { className: "size-4 shrink-0" }), onRemove && !o.disabled && (
184
+ // Fora da ordem do Tab (a lista anda pelas setas); no
185
+ // teclado, a exclusão é o Delete na opção ativa.
186
+ _jsx("button", { type: "button", tabIndex: -1, "aria-label": removeLabel(o), title: removeLabel(o), onClick: e => { e.stopPropagation(); setConfirming(o.value); }, className: "-m-1 flex size-6 shrink-0 cursor-pointer items-center justify-center rounded text-muted-foreground opacity-60 outline-none hover:text-destructive hover:opacity-100 [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover/option:opacity-60 [@media(hover:hover)]:group-data-[active]/option:opacity-60", children: _jsx(XIcon, { className: "size-3.5" }) }))] }, o.value));
187
+ })] }, g.name ?? "_"))), canCreate && (() => {
188
+ const index = entries.length - 1;
189
+ return (_jsxs("div", { id: entryId(index), role: "option", "aria-selected": false, "data-active": index === activeIndex || undefined, onMouseEnter: () => setActive(index), onClick: () => void create(), className: "flex cursor-pointer items-center gap-2 rounded-md py-1.5 pr-2 pl-2.5 text-sm font-medium text-primary-strong select-none data-active:bg-primary/10", children: [creating ? _jsx(Loader2Icon, { className: "size-4 shrink-0 animate-spin" }) : _jsx(PlusIcon, { className: "size-4 shrink-0" }), _jsx("span", { className: "truncate", children: createLabel(query.trim()) })] }));
190
+ })()] }), error && (_jsx("p", { role: "alert", className: "border-t border-border px-3 py-2 text-xs text-destructive", children: error }))] })] }));
191
+ }
192
+ export { Combobox };
193
+ //# sourceMappingURL=combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.js","sourceRoot":"","sources":["../../src/components/combobox.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import * as React from "react";
2
+ import { type FieldControlProps } from "./dates.js";
3
+ /**
4
+ * Data digitada, como o DateInput do Mantine: dd/mm/aaaa com as barras postas
5
+ * sozinhas, e um calendário que abre no clique (ou ↓) para quem prefere
6
+ * escolher. `withTime` acrescenta a hora: dd/mm/aaaa hh:mm.
7
+ *
8
+ * <Field label="Início">
9
+ * <DateInput value={inicio} onValueChange={setInicio} maxDate={fim} />
10
+ * </Field>
11
+ *
12
+ * - Valor: "AAAA-MM-DD" (com `withTime`, "AAAA-MM-DD HH:mm:ss") ou `null`.
13
+ * - Grava assim que o texto vira uma data válida dentro de `minDate`/`maxDate`.
14
+ * Ao sair do campo, texto incompleto ou fora dos limites volta ao último
15
+ * valor válido; campo vazio grava `null`.
16
+ * - Colar "2026-10-15" (ISO) também funciona.
17
+ *
18
+ * Teclado: ↓ abre o calendário e põe o foco nele; Enter confirma o texto; Esc
19
+ * fecha o calendário.
20
+ */
21
+ declare function DateInput({ value, onValueChange, withTime, minDate, maxDate, placeholder, clearable, withCalendar, captionLayout, disabled, required, name, className, wrapperClassName, onBlur, "aria-invalid": ariaInvalid, ...props }: FieldControlProps & {
22
+ value: string | null;
23
+ onValueChange: (value: string | null) => void;
24
+ /** Data e hora (dd/mm/aaaa hh:mm). */
25
+ withTime?: boolean;
26
+ /** Primeiro dia aceito ("AAAA-MM-DD"). */
27
+ minDate?: string;
28
+ /** Último dia aceito ("AAAA-MM-DD"). */
29
+ maxDate?: string;
30
+ placeholder?: string;
31
+ /** Um X no campo limpa o valor. */
32
+ clearable?: boolean;
33
+ /** Calendário no clique. Sem ele, o campo é só de digitar. */
34
+ withCalendar?: boolean;
35
+ captionLayout?: "label" | "dropdown" | "dropdown-months" | "dropdown-years";
36
+ disabled?: boolean;
37
+ required?: boolean;
38
+ name?: string;
39
+ /** Classes do <input>. */
40
+ className?: string;
41
+ /** Classes do invólucro (largura e posição no layout). */
42
+ wrapperClassName?: string;
43
+ onBlur?: React.FocusEventHandler<HTMLInputElement>;
44
+ }): React.JSX.Element;
45
+ export { DateInput };
46
+ //# sourceMappingURL=date-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-input.d.ts","sourceRoot":"","sources":["../../src/components/date-input.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,EAEwB,KAAK,iBAAiB,EACpD,MAAM,YAAY,CAAA;AA+CnB;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,SAAS,CAAC,EACjB,KAAK,EACL,aAAa,EACb,QAAgB,EAChB,OAAO,EACP,OAAO,EACP,WAA0D,EAC1D,SAAiB,EACjB,YAAmB,EACnB,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,gBAAgB,EAChB,MAAM,EACN,cAAc,EAAE,WAAW,EAC3B,GAAG,KAAK,EACT,EAAE,iBAAiB,GAAG;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC7C,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,iBAAiB,GAAG,gBAAgB,CAAA;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;CACnD,qBAwKA;AAED,OAAO,EAAE,SAAS,EAAE,CAAA"}
@@ -0,0 +1,202 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { CalendarIcon } from "lucide-react";
5
+ import { cn } from "../lib/utils.js";
6
+ import { Calendar } from "./calendar.js";
7
+ import { clampDate, ClearButton, formatDate, formatDateTime, inRange, outOfRange, parseDateValue, toDateValue, } from "./dates.js";
8
+ import { Input } from "./input.js";
9
+ import { Popover, PopoverAnchor, PopoverContent } from "./popover.js";
10
+ /** Põe as barras (e o espaço e os dois-pontos da hora) entre os dígitos.
11
+ * Separador só ENTRE grupos já começados: "15" e não "15/" — assim apagar
12
+ * para trás nunca esbarra num separador que volta sozinho. */
13
+ function mask(digits, withTime) {
14
+ const d = digits.slice(0, withTime ? 12 : 8);
15
+ let out = d.slice(0, 2);
16
+ if (d.length > 2)
17
+ out += "/" + d.slice(2, 4);
18
+ if (d.length > 4)
19
+ out += "/" + d.slice(4, 8);
20
+ if (d.length > 8)
21
+ out += " " + d.slice(8, 10);
22
+ if (d.length > 10)
23
+ out += ":" + d.slice(10, 12);
24
+ return out;
25
+ }
26
+ const countDigits = (s) => s.replace(/\D/g, "").length;
27
+ /** Posição do cursor logo depois do n-ésimo dígito do texto mascarado. */
28
+ function caretAfterDigits(masked, n) {
29
+ if (n === 0)
30
+ return 0;
31
+ let seen = 0;
32
+ for (let i = 0; i < masked.length; i++) {
33
+ if (/\d/.test(masked[i]) && ++seen === n)
34
+ return i + 1;
35
+ }
36
+ return masked.length;
37
+ }
38
+ /**
39
+ * Texto digitado → valor. Data completa → "AAAA-MM-DD"; com hora →
40
+ * "AAAA-MM-DD HH:mm:00". Incompleto ou inexistente (31/02) → undefined.
41
+ * `dateOnlyOk`: com hora, aceita só a data (hora 00:00) — vale ao sair do
42
+ * campo, não enquanto se digita (a hora pode estar vindo).
43
+ */
44
+ function parseTyped(text, withTime, dateOnlyOk) {
45
+ const d = text.replace(/\D/g, "");
46
+ if (d.length < 8)
47
+ return undefined;
48
+ const date = `${d.slice(4, 8)}-${d.slice(2, 4)}-${d.slice(0, 2)}`;
49
+ let v;
50
+ if (!withTime)
51
+ v = date;
52
+ else if (d.length === 12)
53
+ v = `${date} ${d.slice(8, 10)}:${d.slice(10, 12)}:00`;
54
+ else if (dateOnlyOk && d.length === 8)
55
+ v = `${date} 00:00:00`;
56
+ else
57
+ return undefined;
58
+ return parseDateValue(v) ? v : undefined;
59
+ }
60
+ /**
61
+ * Data digitada, como o DateInput do Mantine: dd/mm/aaaa com as barras postas
62
+ * sozinhas, e um calendário que abre no clique (ou ↓) para quem prefere
63
+ * escolher. `withTime` acrescenta a hora: dd/mm/aaaa hh:mm.
64
+ *
65
+ * <Field label="Início">
66
+ * <DateInput value={inicio} onValueChange={setInicio} maxDate={fim} />
67
+ * </Field>
68
+ *
69
+ * - Valor: "AAAA-MM-DD" (com `withTime`, "AAAA-MM-DD HH:mm:ss") ou `null`.
70
+ * - Grava assim que o texto vira uma data válida dentro de `minDate`/`maxDate`.
71
+ * Ao sair do campo, texto incompleto ou fora dos limites volta ao último
72
+ * valor válido; campo vazio grava `null`.
73
+ * - Colar "2026-10-15" (ISO) também funciona.
74
+ *
75
+ * Teclado: ↓ abre o calendário e põe o foco nele; Enter confirma o texto; Esc
76
+ * fecha o calendário.
77
+ */
78
+ function DateInput({ value, onValueChange, withTime = false, minDate, maxDate, placeholder = withTime ? "dd/mm/aaaa hh:mm" : "dd/mm/aaaa", clearable = false, withCalendar = true, captionLayout, disabled, required, name, className, wrapperClassName, onBlur, "aria-invalid": ariaInvalid, ...props }) {
79
+ const display = React.useCallback((v) => {
80
+ const d = parseDateValue(v);
81
+ return d ? (withTime ? formatDateTime(d) : formatDate(d)) : "";
82
+ }, [withTime]);
83
+ const [text, setText] = React.useState(() => display(value));
84
+ const [open, setOpen] = React.useState(false);
85
+ // Pedido de foco nos dias (↓). Contador, e não booleano: a ↓ com o
86
+ // calendário já aberto também precisa levar o foco.
87
+ const [focusRequest, setFocusRequest] = React.useState(0);
88
+ const [month, setMonth] = React.useState(() => parseDateValue(value));
89
+ const inputRef = React.useRef(null);
90
+ const anchorRef = React.useRef(null);
91
+ const contentRef = React.useRef(null);
92
+ const caret = React.useRef(null);
93
+ // Valor trocado por fora (outro campo, reset do formulário): o texto segue,
94
+ // a menos que já represente esse valor (é o que se está digitando).
95
+ const [prevValue, setPrevValue] = React.useState(value);
96
+ if (value !== prevValue) {
97
+ setPrevValue(value);
98
+ if (parseTyped(text, withTime, true) !== value)
99
+ setText(display(value));
100
+ }
101
+ // Recoloca o cursor onde estava depois que a máscara reescreveu o texto.
102
+ React.useLayoutEffect(() => {
103
+ if (caret.current === null || !inputRef.current)
104
+ return;
105
+ inputRef.current.setSelectionRange(caret.current, caret.current);
106
+ caret.current = null;
107
+ }, [text]);
108
+ const accepts = (v) => !!v && inRange(v, minDate, maxDate);
109
+ function setTyped(next, caretAt) {
110
+ caret.current = caretAt;
111
+ setText(next);
112
+ const v = parseTyped(next, withTime, false);
113
+ if (accepts(v)) {
114
+ setMonth(parseDateValue(v));
115
+ if (v !== value)
116
+ onValueChange(v);
117
+ }
118
+ }
119
+ function handleChange(e) {
120
+ const raw = e.target.value;
121
+ const before = countDigits(raw.slice(0, e.target.selectionStart ?? raw.length));
122
+ const next = mask(raw.replace(/\D/g, ""), withTime);
123
+ setTyped(next, caretAfterDigits(next, before));
124
+ }
125
+ function handlePaste(e) {
126
+ // ISO colado ("2026-10-15", "2026-10-15 14:30") vira o texto brasileiro.
127
+ const d = parseDateValue(e.clipboardData.getData("text").trim());
128
+ if (!d)
129
+ return;
130
+ e.preventDefault();
131
+ setTyped(withTime ? formatDateTime(d) : formatDate(d), null);
132
+ }
133
+ /** Sair do campo (ou Enter): grava o texto válido ou volta ao último valor. */
134
+ function settle() {
135
+ if (!text.trim()) {
136
+ if (value !== null)
137
+ onValueChange(null);
138
+ return;
139
+ }
140
+ const v = parseTyped(text, withTime, true);
141
+ if (accepts(v)) {
142
+ if (v !== value)
143
+ onValueChange(v);
144
+ setText(display(v));
145
+ }
146
+ else {
147
+ setText(display(value));
148
+ }
149
+ }
150
+ // O dia focável do DayPicker é o único com tabindex=0 (o escolhido ou hoje).
151
+ React.useEffect(() => {
152
+ if (!focusRequest)
153
+ return;
154
+ contentRef.current?.querySelector('[role=grid] button[tabindex="0"]')?.focus();
155
+ }, [focusRequest]);
156
+ function openCalendar(focus) {
157
+ if (!withCalendar || disabled)
158
+ return;
159
+ if (!open)
160
+ setMonth(parseDateValue(value));
161
+ setOpen(true);
162
+ if (focus)
163
+ setFocusRequest(n => n + 1);
164
+ }
165
+ function pickDay(day) {
166
+ // Com hora, mantém a hora já digitada (ou a do valor, ou 00:00).
167
+ const current = parseTyped(text, withTime, true) ?? value;
168
+ const time = current && current.length >= 19 ? current.slice(11, 19) : "00:00:00";
169
+ const v = withTime ? `${toDateValue(day)} ${time}` : toDateValue(day);
170
+ onValueChange(v);
171
+ setText(display(v));
172
+ setOpen(false);
173
+ inputRef.current?.focus();
174
+ }
175
+ // Digitado e completo, mas inválido ou fora dos limites: borda de erro já
176
+ // enquanto se digita (o Field, se houver, ainda manda no aria-invalid).
177
+ const typedInvalid = countDigits(text) === (withTime ? 12 : 8) && !accepts(parseTyped(text, withTime, false));
178
+ const min = parseDateValue(minDate);
179
+ const max = parseDateValue(maxDate);
180
+ const selected = parseDateValue(value);
181
+ const showClear = clearable && !!text && !disabled;
182
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverAnchor, { asChild: true, children: _jsxs("div", { ref: anchorRef, "data-slot": "date-input-wrapper", className: cn("relative w-full min-w-0", wrapperClassName), children: [_jsx(Input, { ref: inputRef, "data-slot": "date-input", value: text, placeholder: placeholder, disabled: disabled, required: required, name: name, inputMode: "numeric", autoComplete: "off", "aria-haspopup": withCalendar ? "dialog" : undefined, "aria-expanded": withCalendar ? open : undefined, "aria-invalid": ariaInvalid ?? (typedInvalid || undefined), leftSection: _jsx(CalendarIcon, {}), className: cn("tabular-nums", showClear && "pr-9", className), onChange: handleChange, onPaste: handlePaste, onClick: () => { if (!open)
183
+ openCalendar(false); }, onKeyDown: e => {
184
+ if (e.key === "ArrowDown" && withCalendar) {
185
+ e.preventDefault();
186
+ openCalendar(true);
187
+ }
188
+ else if (e.key === "Enter") {
189
+ e.preventDefault();
190
+ settle();
191
+ setOpen(false);
192
+ }
193
+ }, onBlur: e => { settle(); onBlur?.(e); }, ...props }), showClear && (_jsx(ClearButton, { onClick: () => { setText(""); onValueChange(null); inputRef.current?.focus(); } }))] }) }), withCalendar && (_jsx(PopoverContent, { ref: contentRef, className: "w-auto p-0",
194
+ // O foco fica no campo: dá para continuar digitando com o calendário
195
+ // aberto. Só a ↓ leva o foco para os dias.
196
+ onOpenAutoFocus: e => e.preventDefault(), onCloseAutoFocus: e => e.preventDefault(),
197
+ // Clicar no próprio campo não conta como "fora".
198
+ onInteractOutside: e => { if (anchorRef.current?.contains(e.target))
199
+ e.preventDefault(); }, children: _jsx(Calendar, { mode: "single", required: true, selected: selected, onSelect: pickDay, month: month ?? clampDate(new Date(), min, max), onMonthChange: setMonth, startMonth: min, endMonth: max, disabled: outOfRange(min, max), captionLayout: captionLayout }) }))] }));
200
+ }
201
+ export { DateInput };
202
+ //# sourceMappingURL=date-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-input.js","sourceRoot":"","sources":["../../src/components/date-input.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import * as React from "react";
2
+ import { type PickerBaseProps } from "./dates.js";
3
+ export type DatePreset = {
4
+ label: string;
5
+ value: string;
6
+ };
7
+ export type DateRangeValue = [string | null, string | null];
8
+ export type DateRangePreset = {
9
+ label: string;
10
+ value: [string, string];
11
+ };
12
+ type SingleProps = PickerBaseProps & {
13
+ type?: "default";
14
+ value: string | null;
15
+ onValueChange: (value: string | null) => void;
16
+ presets?: DatePreset[];
17
+ };
18
+ type RangeProps = PickerBaseProps & {
19
+ type: "range";
20
+ value: DateRangeValue;
21
+ onValueChange: (value: DateRangeValue) => void;
22
+ presets?: DateRangePreset[];
23
+ /** Meses lado a lado (no celular é sempre um). Padrão: 2. */
24
+ numberOfColumns?: number;
25
+ };
26
+ /**
27
+ * Campo que abre um calendário para escolher uma data ou um período, como o
28
+ * DatePickerInput do Mantine. Não se digita nele — para digitar, `DateInput`.
29
+ *
30
+ * <Field label="Prazo">
31
+ * <DatePickerInput value={prazo} onValueChange={setPrazo} minDate={inicio} clearable />
32
+ * </Field>
33
+ *
34
+ * <DatePickerInput type="range" value={[inicio, fim]} onValueChange={([i, f]) => …} withApplyButton />
35
+ *
36
+ * - Valor: "AAAA-MM-DD" (ou `[início, fim]` no `type="range"`), `null` quando vazio.
37
+ * - `withApplyButton`: a escolha só vale no Aplicar; fechar de outro jeito
38
+ * descarta. Sem ele, escolher o dia (ou o fim do período) já grava e fecha.
39
+ * - `presets`: atalhos ao lado ("Hoje", "Fim do mês"…); os que caem fora de
40
+ * `minDate`/`maxDate` ficam desabilitados.
41
+ * - Período: o primeiro clique marca o início e o segundo, o fim; se o segundo
42
+ * vier antes, os dois trocam.
43
+ *
44
+ * Teclado: o calendário abre com o foco no dia escolhido (ou hoje); setas
45
+ * andam pelos dias, PageUp/PageDown pelos meses, Enter escolhe, Esc fecha.
46
+ */
47
+ declare function DatePickerInput(props: SingleProps | RangeProps): React.JSX.Element;
48
+ export { DatePickerInput };
49
+ //# sourceMappingURL=date-picker-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-picker-input.d.ts","sourceRoot":"","sources":["../../src/components/date-picker-input.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,EAEgD,KAAK,eAAe,EAC1E,MAAM,YAAY,CAAA;AAInB,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AACzD,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;AAC3D,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAA;AAExE,KAAK,WAAW,GAAG,eAAe,GAAG;IACnC,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC7C,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;CACvB,CAAA;AAED,KAAK,UAAU,GAAG,eAAe,GAAG;IAClC,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,cAAc,CAAA;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;IAC9C,OAAO,CAAC,EAAE,eAAe,EAAE,CAAA;IAC3B,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,iBAAS,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,qBAEvD;AAiOD,OAAO,EAAE,eAAe,EAAE,CAAA"}