@voyantjs/finance-ui 0.13.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.
package/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # @voyantjs/finance-ui
2
+
3
+ Importable React UI components for Voyant finance. Bundler-consumed (Vite, Next.js, webpack, etc.).
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @voyantjs/finance-ui @voyantjs/finance-react @voyantjs/voyant-ui @tanstack/react-query react react-dom
9
+ ```
10
+
11
+ `@voyantjs/voyant-ui` provides the design-system primitives. `@voyantjs/finance-react` provides the data-layer hooks. Both are required peers.
12
+
13
+ All components accept a `className` prop and merge it with `cn()`. Wrap or compose to extend; use the registry copy-paste path (`npx shadcn add @voyant/...`) for components you want to fork outright.
@@ -0,0 +1,9 @@
1
+ import { type InvoiceRecord } from "@voyantjs/finance-react";
2
+ export interface InvoiceDialogProps {
3
+ open: boolean;
4
+ onOpenChange: (open: boolean) => void;
5
+ invoice?: InvoiceRecord;
6
+ onSuccess?: (invoice: InvoiceRecord) => void;
7
+ }
8
+ export declare function InvoiceDialog({ open, onOpenChange, invoice, onSuccess }: InvoiceDialogProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=invoice-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice-dialog.d.ts","sourceRoot":"","sources":["../../src/components/invoice-dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAsB,MAAM,yBAAyB,CAAA;AA4ChF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;CAC7C;AAkBD,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CAoO3F"}
@@ -0,0 +1,130 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useInvoiceMutation } from "@voyantjs/finance-react";
3
+ import { Button, Dialog, DialogBody, DialogContent, DialogFooter, DialogHeader, DialogTitle, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea, } from "@voyantjs/voyant-ui/components";
4
+ import { CurrencyCombobox } from "@voyantjs/voyant-ui/components/currency-combobox";
5
+ import { DatePicker } from "@voyantjs/voyant-ui/components/date-picker";
6
+ import { zodResolver } from "@voyantjs/voyant-ui/lib/zod-resolver";
7
+ import { Loader2 } from "lucide-react";
8
+ import { useEffect } from "react";
9
+ import { useForm } from "react-hook-form";
10
+ import { z } from "zod/v4";
11
+ const invoiceFormSchema = z.object({
12
+ invoiceNumber: z.string().min(1, "Invoice number is required"),
13
+ bookingId: z.string().min(1, "Booking ID is required"),
14
+ personId: z.string().optional().nullable(),
15
+ organizationId: z.string().optional().nullable(),
16
+ status: z.enum(["draft", "sent", "partially_paid", "paid", "overdue", "void"]),
17
+ currency: z.string().min(3).max(3, "Use 3-letter ISO code"),
18
+ subtotalCents: z.coerce.number().int().min(0).default(0),
19
+ taxCents: z.coerce.number().int().min(0).default(0),
20
+ totalCents: z.coerce.number().int().min(0).default(0),
21
+ issueDate: z.string().min(1, "Issue date is required"),
22
+ dueDate: z.string().min(1, "Due date is required"),
23
+ notes: z.string().optional().nullable(),
24
+ });
25
+ const INVOICE_STATUSES = [
26
+ { value: "draft", label: "Draft" },
27
+ { value: "sent", label: "Sent" },
28
+ { value: "partially_paid", label: "Partially Paid" },
29
+ { value: "paid", label: "Paid" },
30
+ { value: "overdue", label: "Overdue" },
31
+ { value: "void", label: "Void" },
32
+ ];
33
+ function generateInvoiceNumber() {
34
+ const now = new Date();
35
+ const y = now.getFullYear();
36
+ const seq = String(Math.floor(Math.random() * 9000) + 1000);
37
+ return `INV-${y}-${seq}`;
38
+ }
39
+ export function InvoiceDialog({ open, onOpenChange, invoice, onSuccess }) {
40
+ const isEditing = Boolean(invoice);
41
+ const { create, update } = useInvoiceMutation();
42
+ const form = useForm({
43
+ resolver: zodResolver(invoiceFormSchema),
44
+ defaultValues: {
45
+ invoiceNumber: "",
46
+ bookingId: "",
47
+ personId: "",
48
+ organizationId: "",
49
+ status: "draft",
50
+ currency: "EUR",
51
+ subtotalCents: 0,
52
+ taxCents: 0,
53
+ totalCents: 0,
54
+ issueDate: "",
55
+ dueDate: "",
56
+ notes: "",
57
+ },
58
+ });
59
+ useEffect(() => {
60
+ if (open && invoice) {
61
+ form.reset({
62
+ invoiceNumber: invoice.invoiceNumber,
63
+ bookingId: invoice.bookingId,
64
+ personId: invoice.personId ?? "",
65
+ organizationId: invoice.organizationId ?? "",
66
+ status: invoice.status,
67
+ currency: invoice.currency,
68
+ subtotalCents: invoice.subtotalCents,
69
+ taxCents: invoice.taxCents,
70
+ totalCents: invoice.totalCents,
71
+ issueDate: invoice.issueDate,
72
+ dueDate: invoice.dueDate,
73
+ notes: invoice.notes ?? "",
74
+ });
75
+ }
76
+ else if (open) {
77
+ const today = new Date().toISOString().split("T")[0];
78
+ form.reset({
79
+ invoiceNumber: generateInvoiceNumber(),
80
+ bookingId: "",
81
+ personId: "",
82
+ organizationId: "",
83
+ status: "draft",
84
+ currency: "EUR",
85
+ subtotalCents: 0,
86
+ taxCents: 0,
87
+ totalCents: 0,
88
+ issueDate: today,
89
+ dueDate: "",
90
+ notes: "",
91
+ });
92
+ }
93
+ }, [open, invoice, form]);
94
+ const onSubmit = async (values) => {
95
+ const payload = {
96
+ invoiceNumber: values.invoiceNumber,
97
+ bookingId: values.bookingId,
98
+ personId: values.personId || null,
99
+ organizationId: values.organizationId || null,
100
+ status: values.status,
101
+ currency: values.currency,
102
+ subtotalCents: values.subtotalCents,
103
+ taxCents: values.taxCents,
104
+ totalCents: values.totalCents,
105
+ paidCents: invoice?.paidCents ?? 0,
106
+ balanceDueCents: typeof invoice?.paidCents === "number"
107
+ ? values.totalCents - invoice.paidCents
108
+ : values.totalCents,
109
+ issueDate: values.issueDate,
110
+ dueDate: values.dueDate,
111
+ notes: values.notes || null,
112
+ };
113
+ const saved = isEditing
114
+ ? await update.mutateAsync({ id: invoice.id, input: payload })
115
+ : await create.mutateAsync(payload);
116
+ onOpenChange(false);
117
+ onSuccess?.(saved);
118
+ };
119
+ const isSubmitting = create.isPending || update.isPending;
120
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { size: "lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: isEditing ? "Edit Invoice" : "New Invoice" }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Invoice Number" }), _jsx(Input, { ...form.register("invoiceNumber"), placeholder: "INV-2025-1234" }), form.formState.errors.invoiceNumber ? (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.invoiceNumber.message })) : null] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Status" }), _jsxs(Select, { items: INVOICE_STATUSES, value: form.watch("status"), onValueChange: (value) => form.setValue("status", value), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: INVOICE_STATUSES.map((status) => (_jsx(SelectItem, { value: status.value, children: status.label }, status.value))) })] })] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Booking ID" }), _jsx(Input, { ...form.register("bookingId"), placeholder: "book_..." }), form.formState.errors.bookingId ? (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.bookingId.message })) : null] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Currency" }), _jsx(CurrencyCombobox, { value: form.watch("currency") || null, onChange: (next) => form.setValue("currency", next ?? "EUR", {
121
+ shouldValidate: true,
122
+ shouldDirty: true,
123
+ }) })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Subtotal (cents)" }), _jsx(Input, { ...form.register("subtotalCents"), type: "number", min: "0" })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Tax (cents)" }), _jsx(Input, { ...form.register("taxCents"), type: "number", min: "0" })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Total (cents)" }), _jsx(Input, { ...form.register("totalCents"), type: "number", min: "0" })] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Issue Date" }), _jsx(DatePicker, { value: form.watch("issueDate") || null, onChange: (nextValue) => form.setValue("issueDate", nextValue ?? "", {
124
+ shouldDirty: true,
125
+ shouldValidate: true,
126
+ }), placeholder: "Pick issue date", className: "w-full" }), form.formState.errors.issueDate ? (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.issueDate.message })) : null] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Due Date" }), _jsx(DatePicker, { value: form.watch("dueDate") || null, onChange: (nextValue) => form.setValue("dueDate", nextValue ?? "", {
127
+ shouldDirty: true,
128
+ shouldValidate: true,
129
+ }), placeholder: "Pick due date", className: "w-full" }), form.formState.errors.dueDate ? (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.dueDate.message })) : null] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Notes" }), _jsx(Textarea, { ...form.register("notes"), placeholder: "Invoice notes..." })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: () => onOpenChange(false), children: "Cancel" }), _jsxs(Button, { type: "submit", disabled: isSubmitting, children: [isSubmitting ? _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }) : null, isEditing ? "Save Changes" : "Create Invoice"] })] })] })] }) }));
130
+ }
@@ -0,0 +1,7 @@
1
+ export interface SupplierPaymentDialogProps {
2
+ open: boolean;
3
+ onOpenChange: (open: boolean) => void;
4
+ onSuccess?: () => void;
5
+ }
6
+ export declare function SupplierPaymentDialog({ open, onOpenChange, onSuccess, }: SupplierPaymentDialogProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=supplier-payment-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplier-payment-dialog.d.ts","sourceRoot":"","sources":["../../src/components/supplier-payment-dialog.tsx"],"names":[],"mappings":"AAyCA,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AAiBD,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EACJ,YAAY,EACZ,SAAS,GACV,EAAE,0BAA0B,2CA6L5B"}
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useSupplierPaymentMutation } from "@voyantjs/finance-react";
3
+ import { Button, Dialog, DialogBody, DialogContent, DialogFooter, DialogHeader, DialogTitle, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Textarea, } from "@voyantjs/voyant-ui/components";
4
+ import { CurrencyCombobox } from "@voyantjs/voyant-ui/components/currency-combobox";
5
+ import { DatePicker } from "@voyantjs/voyant-ui/components/date-picker";
6
+ import { zodResolver } from "@voyantjs/voyant-ui/lib/zod-resolver";
7
+ import { Loader2 } from "lucide-react";
8
+ import { useEffect } from "react";
9
+ import { useForm } from "react-hook-form";
10
+ import { z } from "zod/v4";
11
+ const supplierPaymentFormSchema = z.object({
12
+ bookingId: z.string().min(1, "Booking ID is required"),
13
+ supplierId: z.string().optional().nullable(),
14
+ amountCents: z.coerce.number().int().min(1, "Amount must be at least 1"),
15
+ currency: z.string().min(3).max(3),
16
+ paymentMethod: z.enum(["bank_transfer", "credit_card", "cash", "cheque", "other"]),
17
+ status: z.enum(["pending", "completed", "failed", "refunded"]),
18
+ referenceNumber: z.string().optional().nullable(),
19
+ paymentDate: z.string().min(1, "Payment date is required"),
20
+ notes: z.string().optional().nullable(),
21
+ });
22
+ const PAYMENT_METHODS = [
23
+ { value: "bank_transfer", label: "Bank Transfer" },
24
+ { value: "credit_card", label: "Credit Card" },
25
+ { value: "cash", label: "Cash" },
26
+ { value: "cheque", label: "Cheque" },
27
+ { value: "other", label: "Other" },
28
+ ];
29
+ const PAYMENT_STATUSES = [
30
+ { value: "pending", label: "Pending" },
31
+ { value: "completed", label: "Completed" },
32
+ { value: "failed", label: "Failed" },
33
+ { value: "refunded", label: "Refunded" },
34
+ ];
35
+ export function SupplierPaymentDialog({ open, onOpenChange, onSuccess, }) {
36
+ const { create } = useSupplierPaymentMutation();
37
+ const form = useForm({
38
+ resolver: zodResolver(supplierPaymentFormSchema),
39
+ defaultValues: {
40
+ bookingId: "",
41
+ supplierId: "",
42
+ amountCents: 0,
43
+ currency: "EUR",
44
+ paymentMethod: "bank_transfer",
45
+ status: "completed",
46
+ referenceNumber: "",
47
+ paymentDate: "",
48
+ notes: "",
49
+ },
50
+ });
51
+ useEffect(() => {
52
+ if (open) {
53
+ const today = new Date().toISOString().split("T")[0];
54
+ form.reset({
55
+ bookingId: "",
56
+ supplierId: "",
57
+ amountCents: 0,
58
+ currency: "EUR",
59
+ paymentMethod: "bank_transfer",
60
+ status: "completed",
61
+ referenceNumber: "",
62
+ paymentDate: today,
63
+ notes: "",
64
+ });
65
+ }
66
+ }, [open, form]);
67
+ const onSubmit = async (values) => {
68
+ await create.mutateAsync({
69
+ bookingId: values.bookingId,
70
+ supplierId: values.supplierId || null,
71
+ amountCents: values.amountCents,
72
+ currency: values.currency,
73
+ paymentMethod: values.paymentMethod,
74
+ status: values.status,
75
+ referenceNumber: values.referenceNumber || null,
76
+ paymentDate: values.paymentDate,
77
+ notes: values.notes || null,
78
+ });
79
+ onOpenChange(false);
80
+ onSuccess?.();
81
+ };
82
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { size: "lg", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: "Record Supplier Payment" }) }), _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), children: [_jsxs(DialogBody, { className: "grid gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Booking ID" }), _jsx(Input, { ...form.register("bookingId"), placeholder: "book_..." }), form.formState.errors.bookingId ? (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.bookingId.message })) : null] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Supplier ID (optional)" }), _jsx(Input, { ...form.register("supplierId"), placeholder: "supp_..." })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Amount (cents)" }), _jsx(Input, { ...form.register("amountCents"), type: "number", min: "1" }), form.formState.errors.amountCents ? (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.amountCents.message })) : null] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Currency" }), _jsx(CurrencyCombobox, { value: form.watch("currency") || null, onChange: (next) => form.setValue("currency", next ?? "EUR", {
83
+ shouldValidate: true,
84
+ shouldDirty: true,
85
+ }) })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Payment Date" }), _jsx(DatePicker, { value: form.watch("paymentDate") || null, onChange: (next) => form.setValue("paymentDate", next ?? "", {
86
+ shouldValidate: true,
87
+ shouldDirty: true,
88
+ }), placeholder: "Select payment date", className: "w-full" }), form.formState.errors.paymentDate ? (_jsx("p", { className: "text-xs text-destructive", children: form.formState.errors.paymentDate.message })) : null] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Payment Method" }), _jsxs(Select, { items: PAYMENT_METHODS, value: form.watch("paymentMethod"), onValueChange: (value) => form.setValue("paymentMethod", value), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: PAYMENT_METHODS.map((method) => (_jsx(SelectItem, { value: method.value, children: method.label }, method.value))) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Status" }), _jsxs(Select, { items: PAYMENT_STATUSES, value: form.watch("status"), onValueChange: (value) => form.setValue("status", value), children: [_jsx(SelectTrigger, { className: "w-full", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: PAYMENT_STATUSES.map((status) => (_jsx(SelectItem, { value: status.value, children: status.label }, status.value))) })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Reference Number" }), _jsx(Input, { ...form.register("referenceNumber"), placeholder: "TXN-12345" })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { children: "Notes" }), _jsx(Textarea, { ...form.register("notes"), placeholder: "Payment notes..." })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "ghost", onClick: () => onOpenChange(false), children: "Cancel" }), _jsxs(Button, { type: "submit", disabled: create.isPending, children: [create.isPending ? _jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }) : null, "Record Payment"] })] })] })] }) }));
89
+ }
@@ -0,0 +1,3 @@
1
+ export { InvoiceDialog, type InvoiceDialogProps } from "./components/invoice-dialog";
2
+ export { SupplierPaymentDialog, type SupplierPaymentDialogProps, } from "./components/supplier-payment-dialog";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AACpF,OAAO,EACL,qBAAqB,EACrB,KAAK,0BAA0B,GAChC,MAAM,sCAAsC,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { InvoiceDialog } from "./components/invoice-dialog";
2
+ export { SupplierPaymentDialog, } from "./components/supplier-payment-dialog";
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@voyantjs/finance-ui",
3
+ "version": "0.13.0",
4
+ "license": "FSL-1.1-Apache-2.0",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/voyantjs/voyant.git",
8
+ "directory": "packages/finance-ui"
9
+ },
10
+ "type": "module",
11
+ "sideEffects": false,
12
+ "exports": {
13
+ ".": "./src/index.ts",
14
+ "./components/*": "./src/components/*.tsx"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.build.json",
18
+ "clean": "rm -rf dist",
19
+ "prepack": "pnpm run build",
20
+ "typecheck": "tsc --noEmit",
21
+ "lint": "biome check src/",
22
+ "test": "vitest run --passWithNoTests"
23
+ },
24
+ "peerDependencies": {
25
+ "@tanstack/react-query": "^5.0.0",
26
+ "@voyantjs/finance-react": "workspace:*",
27
+ "@voyantjs/voyant-ui": "workspace:*",
28
+ "react": "^19.0.0",
29
+ "react-dom": "^19.0.0",
30
+ "react-hook-form": "^7.60.0",
31
+ "zod": "^3.25.76"
32
+ },
33
+ "devDependencies": {
34
+ "@tanstack/react-query": "^5.96.2",
35
+ "@types/react": "^19.2.14",
36
+ "@types/react-dom": "^19.2.3",
37
+ "@voyantjs/finance-react": "workspace:*",
38
+ "@voyantjs/voyant-typescript-config": "workspace:*",
39
+ "@voyantjs/voyant-ui": "workspace:*",
40
+ "lucide-react": "^0.475.0",
41
+ "react": "^19.2.4",
42
+ "react-dom": "^19.2.4",
43
+ "react-hook-form": "^7.60.0",
44
+ "typescript": "^6.0.2",
45
+ "vitest": "^4.1.2",
46
+ "zod": "^3.25.76"
47
+ },
48
+ "files": [
49
+ "dist"
50
+ ],
51
+ "publishConfig": {
52
+ "access": "public",
53
+ "exports": {
54
+ ".": {
55
+ "types": "./dist/index.d.ts",
56
+ "import": "./dist/index.js"
57
+ },
58
+ "./components/*": {
59
+ "types": "./dist/components/*.d.ts",
60
+ "import": "./dist/components/*.js"
61
+ }
62
+ },
63
+ "main": "./dist/index.js",
64
+ "types": "./dist/index.d.ts"
65
+ }
66
+ }