@momentumworld/ui-react 0.17.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/dist/chunk-2HQPCV2L.js +895 -0
- package/dist/chunk-2HQPCV2L.js.map +1 -0
- package/dist/form.d.ts +175 -0
- package/dist/form.js +356 -0
- package/dist/form.js.map +1 -0
- package/dist/index.d.ts +2162 -0
- package/dist/index.js +11640 -0
- package/dist/index.js.map +1 -0
- package/dist/input-JCZs61MO.d.ts +24 -0
- package/package.json +90 -0
- package/src/components/form/checkbox-group-field.tsx +101 -0
- package/src/components/form/date-field.tsx +79 -0
- package/src/components/form/date-range-field.tsx +106 -0
- package/src/components/form/form-context.ts +10 -0
- package/src/components/form/form.tsx +54 -0
- package/src/components/form/number-field.tsx +69 -0
- package/src/components/form/select-field.tsx +76 -0
- package/src/components/form/submit-button.tsx +28 -0
- package/src/components/form/text-field.tsx +107 -0
- package/src/components/layout/dashboard-header.tsx +54 -0
- package/src/components/layout/dashboard-panel.tsx +34 -0
- package/src/components/layout/dashboard-topbar.tsx +221 -0
- package/src/components/theme-provider.tsx +403 -0
- package/src/components/ui/accordion.tsx +69 -0
- package/src/components/ui/alert-dialog.tsx +169 -0
- package/src/components/ui/alert.tsx +80 -0
- package/src/components/ui/animated-counter.tsx +109 -0
- package/src/components/ui/animated-theme-toggler.tsx +265 -0
- package/src/components/ui/app-store-buttons.tsx +182 -0
- package/src/components/ui/aspect-ratio.tsx +23 -0
- package/src/components/ui/aurora-orb.tsx +163 -0
- package/src/components/ui/aurora-text.tsx +76 -0
- package/src/components/ui/autocomplete.tsx +296 -0
- package/src/components/ui/avatar-group.tsx +150 -0
- package/src/components/ui/avatar.tsx +285 -0
- package/src/components/ui/badge-group.tsx +160 -0
- package/src/components/ui/badge.tsx +172 -0
- package/src/components/ui/breadcrumb.tsx +112 -0
- package/src/components/ui/button.tsx +77 -0
- package/src/components/ui/calendar.tsx +137 -0
- package/src/components/ui/card.tsx +244 -0
- package/src/components/ui/carousel.tsx +258 -0
- package/src/components/ui/chart.tsx +379 -0
- package/src/components/ui/chat-divider.tsx +67 -0
- package/src/components/ui/chat.tsx +494 -0
- package/src/components/ui/checkbox-group.tsx +16 -0
- package/src/components/ui/checkbox.tsx +82 -0
- package/src/components/ui/collapsible.tsx +45 -0
- package/src/components/ui/color-picker.tsx +389 -0
- package/src/components/ui/combobox.tsx +411 -0
- package/src/components/ui/command.tsx +264 -0
- package/src/components/ui/confetti.tsx +196 -0
- package/src/components/ui/context-menu.tsx +271 -0
- package/src/components/ui/context-meter.tsx +134 -0
- package/src/components/ui/credit-card.tsx +214 -0
- package/src/components/ui/data-table-paged.tsx +163 -0
- package/src/components/ui/date-picker.tsx +154 -0
- package/src/components/ui/dialog.tsx +196 -0
- package/src/components/ui/drawer.tsx +135 -0
- package/src/components/ui/empty.tsx +127 -0
- package/src/components/ui/fab.tsx +45 -0
- package/src/components/ui/featured-icon.tsx +149 -0
- package/src/components/ui/field.tsx +88 -0
- package/src/components/ui/fieldset.tsx +29 -0
- package/src/components/ui/form.tsx +17 -0
- package/src/components/ui/frame.tsx +82 -0
- package/src/components/ui/generic-empty.tsx +142 -0
- package/src/components/ui/group.tsx +97 -0
- package/src/components/ui/help-tip.tsx +94 -0
- package/src/components/ui/horizontal-scroll-fader.tsx +228 -0
- package/src/components/ui/input-group.tsx +102 -0
- package/src/components/ui/input-otp.tsx +96 -0
- package/src/components/ui/input.tsx +66 -0
- package/src/components/ui/item.tsx +198 -0
- package/src/components/ui/kbd.tsx +30 -0
- package/src/components/ui/label.tsx +28 -0
- package/src/components/ui/markdown.tsx +188 -0
- package/src/components/ui/menu.tsx +312 -0
- package/src/components/ui/menubar.tsx +93 -0
- package/src/components/ui/meter.tsx +67 -0
- package/src/components/ui/multi-select.tsx +308 -0
- package/src/components/ui/navigation-menu.tsx +143 -0
- package/src/components/ui/number-field.tsx +160 -0
- package/src/components/ui/pagination-controls.tsx +74 -0
- package/src/components/ui/pagination.tsx +149 -0
- package/src/components/ui/pipeline.tsx +102 -0
- package/src/components/ui/popover.tsx +119 -0
- package/src/components/ui/preview-card.tsx +55 -0
- package/src/components/ui/progress.tsx +289 -0
- package/src/components/ui/qr-code.tsx +150 -0
- package/src/components/ui/radio-group.tsx +103 -0
- package/src/components/ui/resizable.tsx +56 -0
- package/src/components/ui/scroll-area.tsx +90 -0
- package/src/components/ui/scroller.tsx +38 -0
- package/src/components/ui/section-header.tsx +118 -0
- package/src/components/ui/segmented-control.tsx +83 -0
- package/src/components/ui/select.tsx +181 -0
- package/src/components/ui/separator.tsx +23 -0
- package/src/components/ui/sheet.tsx +224 -0
- package/src/components/ui/sidebar.tsx +774 -0
- package/src/components/ui/skeleton.tsx +16 -0
- package/src/components/ui/slider.tsx +108 -0
- package/src/components/ui/smooth-scroll.tsx +206 -0
- package/src/components/ui/social-button.tsx +247 -0
- package/src/components/ui/spinner-on-demand.tsx +32 -0
- package/src/components/ui/spinner.tsx +18 -0
- package/src/components/ui/stat.tsx +187 -0
- package/src/components/ui/stepper.tsx +167 -0
- package/src/components/ui/switch.tsx +56 -0
- package/src/components/ui/table.tsx +126 -0
- package/src/components/ui/tabs.tsx +90 -0
- package/src/components/ui/tag.tsx +242 -0
- package/src/components/ui/target-countdown.tsx +46 -0
- package/src/components/ui/text-editor.tsx +313 -0
- package/src/components/ui/textarea.tsx +51 -0
- package/src/components/ui/thinking-orb.tsx +6 -0
- package/src/components/ui/time-picker.tsx +308 -0
- package/src/components/ui/timeline.tsx +116 -0
- package/src/components/ui/toast.tsx +268 -0
- package/src/components/ui/toggle-group.tsx +101 -0
- package/src/components/ui/toggle.tsx +45 -0
- package/src/components/ui/toolbar.tsx +89 -0
- package/src/components/ui/tooltip.tsx +102 -0
- package/src/components/ui/vertical-scroll-fader.tsx +250 -0
- package/src/components/ui/video-player.tsx +275 -0
- package/src/components/upload/avatar-upload-base.tsx +131 -0
- package/src/components/upload/image-upload-base.tsx +112 -0
- package/src/form.ts +17 -0
- package/src/index.ts +143 -0
- package/src/lib/hooks/use-callback-ref.ts +15 -0
- package/src/lib/hooks/use-first-render.ts +11 -0
- package/src/lib/hooks/use-hover.ts +53 -0
- package/src/lib/hooks/use-is-tab-active.ts +17 -0
- package/src/lib/hooks/use-media-query.ts +164 -0
- package/src/lib/utils/css.ts +6 -0
- package/src/styles.css +329 -0
- package/src/types/helpers.ts +24 -0
- package/src/types/react.d.ts +7 -0
package/dist/form.js
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { Button, SpinnerOnDemand, Field, FieldLabel, FieldControl, NumberField, NumberFieldGroup, NumberFieldDecrement, NumberFieldInput, NumberFieldIncrement, FieldError, Popover, PopoverTrigger, cn, PopoverPopup, Calendar, Select, SelectTrigger, SelectValue, SelectPopup, SelectItem, CheckboxGroup, Checkbox, FieldDescription, InputGroup, InputGroupAddon, InputGroupInput, Input } from './chunk-2HQPCV2L.js';
|
|
2
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
3
|
+
import { format } from 'date-fns';
|
|
4
|
+
import { CalendarIcon } from 'lucide-react';
|
|
5
|
+
import { useState } from 'react';
|
|
6
|
+
import { createFormHookContexts, createFormHook, formOptions, revalidateLogic } from '@tanstack/react-form';
|
|
7
|
+
|
|
8
|
+
function CheckboxGroupField({
|
|
9
|
+
field,
|
|
10
|
+
label,
|
|
11
|
+
options,
|
|
12
|
+
emptyMessage,
|
|
13
|
+
description
|
|
14
|
+
}) {
|
|
15
|
+
const errors = field.state.meta.errors.map((err) => typeof err === "string" ? err : err?.message).filter(Boolean);
|
|
16
|
+
return /* @__PURE__ */ jsxs(Field, { name: field.name, children: [
|
|
17
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: label }),
|
|
18
|
+
options.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: emptyMessage ?? "No options" }) : /* @__PURE__ */ jsx(
|
|
19
|
+
CheckboxGroup,
|
|
20
|
+
{
|
|
21
|
+
value: field.state.value,
|
|
22
|
+
onValueChange: (next) => field.handleChange(next),
|
|
23
|
+
className: "gap-2 w-full",
|
|
24
|
+
children: options.map((opt) => {
|
|
25
|
+
const isChecked = field.state.value.includes(opt.value);
|
|
26
|
+
return /* @__PURE__ */ jsxs(
|
|
27
|
+
"button",
|
|
28
|
+
{
|
|
29
|
+
type: "button",
|
|
30
|
+
disabled: opt.disabled,
|
|
31
|
+
className: "flex w-full items-center gap-3 rounded-lg border px-3 py-2 transition-colors text-left bg-transparent disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer hover:bg-accent/50",
|
|
32
|
+
onClick: () => {
|
|
33
|
+
if (opt.disabled) return;
|
|
34
|
+
const next = isChecked ? field.state.value.filter((v) => v !== opt.value) : [...field.state.value, opt.value];
|
|
35
|
+
field.handleChange(next);
|
|
36
|
+
},
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsx(
|
|
39
|
+
Checkbox,
|
|
40
|
+
{
|
|
41
|
+
value: opt.value,
|
|
42
|
+
checked: isChecked,
|
|
43
|
+
disabled: opt.disabled,
|
|
44
|
+
readOnly: true
|
|
45
|
+
}
|
|
46
|
+
),
|
|
47
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
48
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-foreground", children: opt.label }),
|
|
49
|
+
opt.description ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: opt.description }) : null
|
|
50
|
+
] })
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
opt.value
|
|
54
|
+
);
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
),
|
|
58
|
+
/* @__PURE__ */ jsx(FieldError, { match: !!errors.length, children: errors.join(", ") }),
|
|
59
|
+
description && /* @__PURE__ */ jsx(FieldDescription, { children: description })
|
|
60
|
+
] });
|
|
61
|
+
}
|
|
62
|
+
function DateField({
|
|
63
|
+
field,
|
|
64
|
+
label,
|
|
65
|
+
placeholder
|
|
66
|
+
}) {
|
|
67
|
+
const value = field.state.value;
|
|
68
|
+
const errors = field.state.meta.errors.map((err) => typeof err === "string" ? err : err?.message).filter(Boolean);
|
|
69
|
+
const hasValue = Boolean(value);
|
|
70
|
+
return /* @__PURE__ */ jsxs(Field, { name: field.name, children: [
|
|
71
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: label }),
|
|
72
|
+
/* @__PURE__ */ jsxs(Popover, { onOpenChangeComplete: (open) => !open && field.handleBlur(), children: [
|
|
73
|
+
/* @__PURE__ */ jsxs(
|
|
74
|
+
PopoverTrigger,
|
|
75
|
+
{
|
|
76
|
+
render: /* @__PURE__ */ jsx(
|
|
77
|
+
Button,
|
|
78
|
+
{
|
|
79
|
+
className: cn("w-full justify-start", {
|
|
80
|
+
"text-muted-foreground": !hasValue
|
|
81
|
+
}),
|
|
82
|
+
variant: "outline"
|
|
83
|
+
}
|
|
84
|
+
),
|
|
85
|
+
children: [
|
|
86
|
+
/* @__PURE__ */ jsx(CalendarIcon, { "aria-hidden": "true" }),
|
|
87
|
+
value ? format(value, "LLL dd, y") : /* @__PURE__ */ jsx("span", { children: placeholder ?? "Pick a date" })
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
/* @__PURE__ */ jsx(PopoverPopup, { children: /* @__PURE__ */ jsx(
|
|
92
|
+
Calendar,
|
|
93
|
+
{
|
|
94
|
+
mode: "single",
|
|
95
|
+
defaultMonth: value,
|
|
96
|
+
selected: value,
|
|
97
|
+
numberOfMonths: 2,
|
|
98
|
+
onSelect: (next) => {
|
|
99
|
+
field.handleChange(next ?? void 0);
|
|
100
|
+
},
|
|
101
|
+
autoFocus: true
|
|
102
|
+
}
|
|
103
|
+
) })
|
|
104
|
+
] }),
|
|
105
|
+
/* @__PURE__ */ jsx(FieldError, { match: !!errors.length, children: errors.join(", ") })
|
|
106
|
+
] });
|
|
107
|
+
}
|
|
108
|
+
function DateRangeField({
|
|
109
|
+
field,
|
|
110
|
+
label,
|
|
111
|
+
placeholder,
|
|
112
|
+
numberOfMonths = 2
|
|
113
|
+
}) {
|
|
114
|
+
const value = field.state.value;
|
|
115
|
+
const errors = field.state.meta.errors.map((err) => typeof err === "string" ? err : err?.message).filter(Boolean);
|
|
116
|
+
const hasValue = Boolean(value.from);
|
|
117
|
+
const [open, setOpen] = useState(false);
|
|
118
|
+
return /* @__PURE__ */ jsxs(Field, { name: field.name, children: [
|
|
119
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: label }),
|
|
120
|
+
/* @__PURE__ */ jsxs(
|
|
121
|
+
Popover,
|
|
122
|
+
{
|
|
123
|
+
open,
|
|
124
|
+
onOpenChange: setOpen,
|
|
125
|
+
onOpenChangeComplete: (open2) => !open2 && field.handleBlur(),
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ jsxs(
|
|
128
|
+
PopoverTrigger,
|
|
129
|
+
{
|
|
130
|
+
render: /* @__PURE__ */ jsx(
|
|
131
|
+
Button,
|
|
132
|
+
{
|
|
133
|
+
className: cn("w-full justify-start", {
|
|
134
|
+
"text-muted-foreground": !hasValue
|
|
135
|
+
}),
|
|
136
|
+
variant: "outline"
|
|
137
|
+
}
|
|
138
|
+
),
|
|
139
|
+
children: [
|
|
140
|
+
/* @__PURE__ */ jsx(CalendarIcon, { "aria-hidden": "true" }),
|
|
141
|
+
value.from ? value.to ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
142
|
+
format(value.from, "LLL dd, y"),
|
|
143
|
+
" -",
|
|
144
|
+
" ",
|
|
145
|
+
format(value.to, "LLL dd, y")
|
|
146
|
+
] }) : format(value.from, "LLL dd, y") : /* @__PURE__ */ jsx("span", { children: placeholder ?? "Pick a date range" })
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
),
|
|
150
|
+
/* @__PURE__ */ jsx(PopoverPopup, { children: /* @__PURE__ */ jsx(
|
|
151
|
+
Calendar,
|
|
152
|
+
{
|
|
153
|
+
mode: "range",
|
|
154
|
+
defaultMonth: value.from,
|
|
155
|
+
selected: value,
|
|
156
|
+
resetOnSelect: true,
|
|
157
|
+
numberOfMonths,
|
|
158
|
+
onSelect: (range) => {
|
|
159
|
+
field.handleChange({
|
|
160
|
+
from: range?.from ?? void 0,
|
|
161
|
+
to: range?.to ?? void 0
|
|
162
|
+
});
|
|
163
|
+
if (range?.from && range?.to) {
|
|
164
|
+
setOpen(false);
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
autoFocus: true
|
|
168
|
+
}
|
|
169
|
+
) })
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
),
|
|
173
|
+
/* @__PURE__ */ jsx(FieldError, { match: !!errors.length, children: errors.join(", ") })
|
|
174
|
+
] });
|
|
175
|
+
}
|
|
176
|
+
var {
|
|
177
|
+
fieldContext: appFieldContext,
|
|
178
|
+
formContext: appFormContext,
|
|
179
|
+
useFieldContext: useAppFieldContext,
|
|
180
|
+
useFormContext: useAppFormContext
|
|
181
|
+
} = createFormHookContexts();
|
|
182
|
+
function NumberField2({
|
|
183
|
+
field,
|
|
184
|
+
label,
|
|
185
|
+
min,
|
|
186
|
+
className
|
|
187
|
+
}) {
|
|
188
|
+
const errors = field.state.meta.errors.map((err) => typeof err === "string" ? err : err?.message).filter(Boolean);
|
|
189
|
+
return /* @__PURE__ */ jsxs(Field, { className, name: field.name, children: [
|
|
190
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: label }),
|
|
191
|
+
/* @__PURE__ */ jsx(
|
|
192
|
+
FieldControl,
|
|
193
|
+
{
|
|
194
|
+
render: /* @__PURE__ */ jsx(
|
|
195
|
+
NumberField,
|
|
196
|
+
{
|
|
197
|
+
value: field.state.value,
|
|
198
|
+
min,
|
|
199
|
+
onValueChange: (next) => {
|
|
200
|
+
if (typeof next === "number") field.handleChange(next);
|
|
201
|
+
},
|
|
202
|
+
onBlur: () => field.handleBlur(),
|
|
203
|
+
children: /* @__PURE__ */ jsxs(NumberFieldGroup, { children: [
|
|
204
|
+
/* @__PURE__ */ jsx(NumberFieldDecrement, {}),
|
|
205
|
+
/* @__PURE__ */ jsx(NumberFieldInput, {}),
|
|
206
|
+
/* @__PURE__ */ jsx(NumberFieldIncrement, {})
|
|
207
|
+
] })
|
|
208
|
+
}
|
|
209
|
+
)
|
|
210
|
+
}
|
|
211
|
+
),
|
|
212
|
+
/* @__PURE__ */ jsx(FieldError, { match: !!errors.length, children: errors.join(", ") })
|
|
213
|
+
] });
|
|
214
|
+
}
|
|
215
|
+
function SelectField({
|
|
216
|
+
field,
|
|
217
|
+
label,
|
|
218
|
+
placeholder,
|
|
219
|
+
options
|
|
220
|
+
}) {
|
|
221
|
+
const errors = field.state.meta.errors.map((err) => typeof err === "string" ? err : err?.message).filter(Boolean);
|
|
222
|
+
return /* @__PURE__ */ jsxs(Field, { name: field.name, children: [
|
|
223
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: label }),
|
|
224
|
+
/* @__PURE__ */ jsx(
|
|
225
|
+
FieldControl,
|
|
226
|
+
{
|
|
227
|
+
render: /* @__PURE__ */ jsxs(
|
|
228
|
+
Select,
|
|
229
|
+
{
|
|
230
|
+
items: options,
|
|
231
|
+
value: field.state.value ? field.state.value : null,
|
|
232
|
+
onValueChange: (next) => {
|
|
233
|
+
field.handleChange(next ?? "");
|
|
234
|
+
},
|
|
235
|
+
onOpenChangeComplete: (open) => {
|
|
236
|
+
if (!open) field.handleBlur();
|
|
237
|
+
},
|
|
238
|
+
children: [
|
|
239
|
+
/* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, { placeholder: placeholder ?? "Select" }) }),
|
|
240
|
+
/* @__PURE__ */ jsx(SelectPopup, { children: options.map((opt) => /* @__PURE__ */ jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value)) })
|
|
241
|
+
]
|
|
242
|
+
}
|
|
243
|
+
)
|
|
244
|
+
}
|
|
245
|
+
),
|
|
246
|
+
/* @__PURE__ */ jsx(FieldError, { match: !!errors.length, children: errors.join(", ") })
|
|
247
|
+
] });
|
|
248
|
+
}
|
|
249
|
+
function SubmitButton({
|
|
250
|
+
children,
|
|
251
|
+
disabled,
|
|
252
|
+
icon,
|
|
253
|
+
...props
|
|
254
|
+
}) {
|
|
255
|
+
const form = useAppFormContext();
|
|
256
|
+
return /* @__PURE__ */ jsx(form.Subscribe, { selector: (state) => state.isSubmitting, children: (isSubmitting) => /* @__PURE__ */ jsxs(Button, { type: "submit", disabled: isSubmitting || disabled, ...props, children: [
|
|
257
|
+
/* @__PURE__ */ jsx(SpinnerOnDemand, { icon, isLoading: isSubmitting }),
|
|
258
|
+
children
|
|
259
|
+
] }) });
|
|
260
|
+
}
|
|
261
|
+
function TextField({
|
|
262
|
+
field,
|
|
263
|
+
label,
|
|
264
|
+
placeholder,
|
|
265
|
+
type = "text",
|
|
266
|
+
inlineLabel,
|
|
267
|
+
leadingIcon,
|
|
268
|
+
trailingIcon
|
|
269
|
+
}) {
|
|
270
|
+
const errors = field.state.meta.errors.map((err) => typeof err === "string" ? err : err?.message).filter(Boolean);
|
|
271
|
+
const useInputGroup = inlineLabel || leadingIcon || trailingIcon;
|
|
272
|
+
if (useInputGroup) {
|
|
273
|
+
return /* @__PURE__ */ jsxs(Field, { name: field.name, children: [
|
|
274
|
+
!inlineLabel && /* @__PURE__ */ jsx(FieldLabel, { children: label }),
|
|
275
|
+
/* @__PURE__ */ jsxs(InputGroup, { children: [
|
|
276
|
+
inlineLabel && /* @__PURE__ */ jsx(InputGroupAddon, { align: "block-start", children: /* @__PURE__ */ jsx(FieldLabel, { children: label }) }),
|
|
277
|
+
leadingIcon && /* @__PURE__ */ jsx(InputGroupAddon, { align: "inline-start", children: leadingIcon }),
|
|
278
|
+
/* @__PURE__ */ jsx(
|
|
279
|
+
FieldControl,
|
|
280
|
+
{
|
|
281
|
+
render: /* @__PURE__ */ jsx(
|
|
282
|
+
InputGroupInput,
|
|
283
|
+
{
|
|
284
|
+
value: field.state.value,
|
|
285
|
+
onChange: (e) => field.handleChange(e.target.value),
|
|
286
|
+
onBlur: field.handleBlur,
|
|
287
|
+
placeholder,
|
|
288
|
+
type
|
|
289
|
+
}
|
|
290
|
+
)
|
|
291
|
+
}
|
|
292
|
+
),
|
|
293
|
+
trailingIcon && /* @__PURE__ */ jsx(InputGroupAddon, { align: "inline-end", children: trailingIcon })
|
|
294
|
+
] }),
|
|
295
|
+
/* @__PURE__ */ jsx(FieldError, { match: !!errors.length, children: errors.join(", ") })
|
|
296
|
+
] });
|
|
297
|
+
}
|
|
298
|
+
return /* @__PURE__ */ jsxs(Field, { name: field.name, children: [
|
|
299
|
+
/* @__PURE__ */ jsx(FieldLabel, { children: label }),
|
|
300
|
+
/* @__PURE__ */ jsx(
|
|
301
|
+
FieldControl,
|
|
302
|
+
{
|
|
303
|
+
render: /* @__PURE__ */ jsx(
|
|
304
|
+
Input,
|
|
305
|
+
{
|
|
306
|
+
value: field.state.value,
|
|
307
|
+
onChange: (e) => field.handleChange(e.target.value),
|
|
308
|
+
onBlur: field.handleBlur,
|
|
309
|
+
placeholder,
|
|
310
|
+
type
|
|
311
|
+
}
|
|
312
|
+
)
|
|
313
|
+
}
|
|
314
|
+
),
|
|
315
|
+
/* @__PURE__ */ jsx(FieldError, { match: !!errors.length, children: errors.join(", ") })
|
|
316
|
+
] });
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// src/components/form/form.tsx
|
|
320
|
+
var { useAppForm, withForm: withAppForm } = createFormHook({
|
|
321
|
+
fieldContext: appFieldContext,
|
|
322
|
+
formContext: appFormContext,
|
|
323
|
+
fieldComponents: {
|
|
324
|
+
TextField,
|
|
325
|
+
CheckboxGroupField,
|
|
326
|
+
SelectField,
|
|
327
|
+
DateField,
|
|
328
|
+
DateRangeField,
|
|
329
|
+
NumberField: NumberField2
|
|
330
|
+
},
|
|
331
|
+
formComponents: {
|
|
332
|
+
SubmitButton
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
var customFormOptions = formOptions({
|
|
336
|
+
validationLogic: revalidateLogic({
|
|
337
|
+
mode: "submit",
|
|
338
|
+
modeAfterSubmission: "blur"
|
|
339
|
+
})
|
|
340
|
+
});
|
|
341
|
+
var useCustomAppForm = (options) => {
|
|
342
|
+
return useAppForm({
|
|
343
|
+
...customFormOptions,
|
|
344
|
+
...options
|
|
345
|
+
});
|
|
346
|
+
};
|
|
347
|
+
var withCustomAppForm = (options) => {
|
|
348
|
+
return withAppForm({
|
|
349
|
+
...customFormOptions,
|
|
350
|
+
...options
|
|
351
|
+
});
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
export { CheckboxGroupField, DateField, DateRangeField, NumberField2 as NumberField, SelectField, SubmitButton, TextField, appFieldContext, appFormContext, useAppFieldContext, useCustomAppForm as useAppForm, useAppFormContext, withCustomAppForm as withAppForm };
|
|
355
|
+
//# sourceMappingURL=form.js.map
|
|
356
|
+
//# sourceMappingURL=form.js.map
|
package/dist/form.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/form/checkbox-group-field.tsx","../src/components/form/date-field.tsx","../src/components/form/date-range-field.tsx","../src/components/form/form-context.ts","../src/components/form/number-field.tsx","../src/components/form/select-field.tsx","../src/components/form/submit-button.tsx","../src/components/form/text-field.tsx","../src/components/form/form.tsx"],"names":["jsxs","jsx","open","CalendarIcon","format","NumberField"],"mappings":"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","file":"form.js","sourcesContent":["\"use client\";\n\nimport type { StandardSchemaV1Issue } from \"@tanstack/react-form\";\nimport { Checkbox } from \"../ui/checkbox\";\nimport { CheckboxGroup } from \"../ui/checkbox-group\";\nimport {\n Field,\n FieldDescription,\n FieldError,\n FieldLabel,\n} from \"../ui/field\";\n\nexport function CheckboxGroupField({\n field,\n label,\n options,\n emptyMessage,\n description,\n}: {\n field: {\n name: string;\n state: {\n value: string[];\n meta: {\n readonly errors: ReadonlyArray<\n string | StandardSchemaV1Issue | undefined\n >;\n };\n };\n handleChange: (nextValue: string[]) => void;\n };\n label: string;\n options: Array<{\n value: string;\n label: string;\n description?: string;\n disabled?: boolean;\n }>;\n emptyMessage?: string;\n description?: string;\n}) {\n const errors = field.state.meta.errors\n .map((err) => (typeof err === \"string\" ? err : err?.message))\n .filter(Boolean);\n return (\n <Field name={field.name}>\n <FieldLabel>{label}</FieldLabel>\n\n {options.length === 0 ? (\n <div className=\"text-sm text-muted-foreground\">\n {emptyMessage ?? \"No options\"}\n </div>\n ) : (\n <CheckboxGroup\n value={field.state.value}\n onValueChange={(next) => field.handleChange(next)}\n className=\"gap-2 w-full\"\n >\n {options.map((opt) => {\n const isChecked = field.state.value.includes(opt.value);\n return (\n <button\n type=\"button\"\n key={opt.value}\n disabled={opt.disabled}\n className=\"flex w-full items-center gap-3 rounded-lg border px-3 py-2 transition-colors text-left bg-transparent disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer hover:bg-accent/50\"\n onClick={() => {\n if (opt.disabled) return;\n const next = isChecked\n ? field.state.value.filter((v) => v !== opt.value)\n : [...field.state.value, opt.value];\n field.handleChange(next);\n }}\n >\n <Checkbox\n value={opt.value}\n checked={isChecked}\n disabled={opt.disabled}\n readOnly\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {opt.label}\n </p>\n {opt.description ? (\n <p className=\"text-xs text-muted-foreground\">\n {opt.description}\n </p>\n ) : null}\n </div>\n </button>\n );\n })}\n </CheckboxGroup>\n )}\n\n <FieldError match={!!errors.length}>{errors.join(\", \")}</FieldError>\n {description && <FieldDescription>{description}</FieldDescription>}\n </Field>\n );\n}\n","\"use client\";\n\nimport type { StandardSchemaV1Issue } from \"@tanstack/react-form\";\nimport { format } from \"date-fns\";\nimport { CalendarIcon } from \"lucide-react\";\n\nimport { Button } from \"../ui/button\";\nimport { Calendar } from \"../ui/calendar\";\nimport { Field, FieldError, FieldLabel } from \"../ui/field\";\nimport { Popover, PopoverPopup, PopoverTrigger } from \"../ui/popover\";\nimport { cn } from \"../../lib/utils/css\";\n\nexport function DateField({\n field,\n label,\n placeholder,\n}: {\n field: {\n name: string;\n state: {\n value: Date | undefined;\n meta: {\n readonly errors: ReadonlyArray<\n string | StandardSchemaV1Issue | undefined\n >;\n };\n };\n handleChange: (nextValue: Date | undefined) => void;\n handleBlur: () => void;\n };\n label: string;\n placeholder?: string;\n}) {\n const value = field.state.value;\n\n const errors = field.state.meta.errors\n .map((err) => (typeof err === \"string\" ? err : err?.message))\n .filter(Boolean);\n\n const hasValue = Boolean(value);\n\n return (\n <Field name={field.name}>\n <FieldLabel>{label}</FieldLabel>\n <Popover onOpenChangeComplete={(open) => !open && field.handleBlur()}>\n <PopoverTrigger\n render={\n <Button\n className={cn(\"w-full justify-start\", {\n \"text-muted-foreground\": !hasValue,\n })}\n variant=\"outline\"\n />\n }\n >\n <CalendarIcon aria-hidden=\"true\" />\n {value ? (\n format(value, \"LLL dd, y\")\n ) : (\n <span>{placeholder ?? \"Pick a date\"}</span>\n )}\n </PopoverTrigger>\n <PopoverPopup>\n <Calendar\n mode=\"single\"\n defaultMonth={value}\n selected={value}\n numberOfMonths={2}\n onSelect={(next) => {\n field.handleChange(next ?? undefined);\n }}\n autoFocus\n />\n </PopoverPopup>\n </Popover>\n <FieldError match={!!errors.length}>{errors.join(\", \")}</FieldError>\n </Field>\n );\n}\n","\"use client\";\n\nimport type { StandardSchemaV1Issue } from \"@tanstack/react-form\";\nimport { format } from \"date-fns\";\nimport { CalendarIcon } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Button } from \"../ui/button\";\nimport { Calendar } from \"../ui/calendar\";\nimport { Field, FieldError, FieldLabel } from \"../ui/field\";\nimport { Popover, PopoverPopup, PopoverTrigger } from \"../ui/popover\";\nimport { cn } from \"../../lib/utils/css\";\n\nexport function DateRangeField({\n field,\n label,\n placeholder,\n numberOfMonths = 2,\n}: {\n field: {\n name: string;\n state: {\n value: {\n from: Date | undefined;\n to: Date | undefined;\n };\n meta: {\n readonly errors: ReadonlyArray<\n string | StandardSchemaV1Issue | undefined\n >;\n };\n };\n handleChange: (nextValue: {\n from: Date | undefined;\n to: Date | undefined;\n }) => void;\n handleBlur: () => void;\n };\n label: string;\n placeholder?: string;\n numberOfMonths?: number;\n}) {\n const value = field.state.value;\n\n const errors = field.state.meta.errors\n .map((err) => (typeof err === \"string\" ? err : err?.message))\n .filter(Boolean);\n\n const hasValue = Boolean(value.from);\n const [open, setOpen] = useState(false);\n\n return (\n <Field name={field.name}>\n <FieldLabel>{label}</FieldLabel>\n <Popover\n open={open}\n onOpenChange={setOpen}\n onOpenChangeComplete={(open) => !open && field.handleBlur()}\n >\n <PopoverTrigger\n render={\n <Button\n className={cn(\"w-full justify-start\", {\n \"text-muted-foreground\": !hasValue,\n })}\n variant=\"outline\"\n />\n }\n >\n <CalendarIcon aria-hidden=\"true\" />\n {value.from ? (\n value.to ? (\n <>\n {format(value.from, \"LLL dd, y\")} -{\" \"}\n {format(value.to, \"LLL dd, y\")}\n </>\n ) : (\n format(value.from, \"LLL dd, y\")\n )\n ) : (\n <span>{placeholder ?? \"Pick a date range\"}</span>\n )}\n </PopoverTrigger>\n <PopoverPopup>\n <Calendar\n mode=\"range\"\n defaultMonth={value.from}\n selected={value}\n resetOnSelect\n numberOfMonths={numberOfMonths}\n onSelect={(range) => {\n field.handleChange({\n from: range?.from ?? undefined,\n to: range?.to ?? undefined,\n });\n if (range?.from && range?.to) {\n setOpen(false);\n }\n }}\n autoFocus\n />\n </PopoverPopup>\n </Popover>\n <FieldError match={!!errors.length}>{errors.join(\", \")}</FieldError>\n </Field>\n );\n}\n","\"use client\";\n\nimport { createFormHookContexts } from \"@tanstack/react-form\";\n\nexport const {\n fieldContext: appFieldContext,\n formContext: appFormContext,\n useFieldContext: useAppFieldContext,\n useFormContext: useAppFormContext,\n} = createFormHookContexts();\n","\"use client\";\n\nimport type { StandardSchemaV1Issue } from \"@tanstack/react-form\";\nimport {\n Field,\n FieldControl,\n FieldError,\n FieldLabel,\n} from \"../ui/field\";\nimport {\n NumberFieldDecrement,\n NumberFieldGroup,\n NumberFieldIncrement,\n NumberFieldInput,\n NumberField as NumberFieldPrimitive,\n} from \"../ui/number-field\";\n\nexport function NumberField({\n field,\n label,\n min,\n className,\n}: {\n field: {\n name: string;\n state: {\n value: number;\n meta: {\n readonly errors: ReadonlyArray<\n string | StandardSchemaV1Issue | undefined\n >;\n };\n };\n handleChange: (nextValue: number) => void;\n handleBlur: () => void;\n };\n label: string;\n min?: number;\n className?: string;\n}) {\n const errors = field.state.meta.errors\n .map((err) => (typeof err === \"string\" ? err : err?.message))\n .filter(Boolean);\n\n return (\n <Field className={className} name={field.name}>\n <FieldLabel>{label}</FieldLabel>\n <FieldControl\n render={\n <NumberFieldPrimitive\n value={field.state.value}\n min={min}\n onValueChange={(next) => {\n if (typeof next === \"number\") field.handleChange(next);\n }}\n onBlur={() => field.handleBlur()}\n >\n <NumberFieldGroup>\n <NumberFieldDecrement />\n <NumberFieldInput />\n <NumberFieldIncrement />\n </NumberFieldGroup>\n </NumberFieldPrimitive>\n }\n />\n <FieldError match={!!errors.length}>{errors.join(\", \")}</FieldError>\n </Field>\n );\n}\n","\"use client\";\n\nimport type { StandardSchemaV1Issue } from \"@tanstack/react-form\";\nimport {\n Field,\n FieldControl,\n FieldError,\n FieldLabel,\n} from \"../ui/field\";\nimport {\n Select,\n SelectItem,\n SelectPopup,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\";\n\nexport function SelectField({\n field,\n label,\n placeholder,\n options,\n}: {\n field: {\n name: string;\n state: {\n value: string;\n meta: {\n readonly errors: ReadonlyArray<\n string | StandardSchemaV1Issue | undefined\n >;\n };\n };\n handleChange: (nextValue: string) => void;\n handleBlur: () => void;\n };\n label: string;\n placeholder?: string;\n options: Array<{ value: string; label: string }>;\n}) {\n const errors = field.state.meta.errors\n .map((err) => (typeof err === \"string\" ? err : err?.message))\n .filter(Boolean);\n\n return (\n <Field name={field.name}>\n <FieldLabel>{label}</FieldLabel>\n <FieldControl\n render={\n <Select\n items={options}\n value={field.state.value ? field.state.value : null}\n onValueChange={(next) => {\n field.handleChange(next ?? \"\");\n }}\n onOpenChangeComplete={(open) => {\n if (!open) field.handleBlur();\n }}\n >\n <SelectTrigger>\n <SelectValue placeholder={placeholder ?? \"Select\"} />\n </SelectTrigger>\n <SelectPopup>\n {options.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectPopup>\n </Select>\n }\n />\n <FieldError match={!!errors.length}>{errors.join(\", \")}</FieldError>\n </Field>\n );\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport { SpinnerOnDemand } from \"../ui/spinner-on-demand\";\nimport { useAppFormContext } from \"./form-context\";\n\ninterface SubmitButtonProps extends React.ComponentProps<typeof Button> {\n icon?: React.ReactNode;\n}\n\nexport function SubmitButton({\n children,\n disabled,\n icon,\n ...props\n}: SubmitButtonProps) {\n const form = useAppFormContext();\n return (\n <form.Subscribe selector={(state) => state.isSubmitting}>\n {(isSubmitting) => (\n <Button type=\"submit\" disabled={isSubmitting || disabled} {...props}>\n <SpinnerOnDemand icon={icon} isLoading={isSubmitting} />\n {children}\n </Button>\n )}\n </form.Subscribe>\n );\n}\n","\"use client\";\n\nimport type { StandardSchemaV1Issue } from \"@tanstack/react-form\";\nimport {\n Field,\n FieldControl,\n FieldError,\n FieldLabel,\n} from \"../ui/field\";\nimport { Input } from \"../ui/input\";\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupInput,\n} from \"../ui/input-group\";\n\nexport function TextField({\n field,\n label,\n placeholder,\n type = \"text\",\n inlineLabel,\n leadingIcon,\n trailingIcon,\n}: {\n field: {\n name: string;\n state: {\n value: string;\n meta: {\n readonly errors: ReadonlyArray<\n string | StandardSchemaV1Issue | undefined\n >;\n };\n };\n handleChange: (nextValue: string) => void;\n handleBlur: () => void;\n };\n label: string;\n placeholder?: string;\n type?: React.ComponentProps<typeof Input>[\"type\"];\n /** Render label inside the input border as a block-start addon */\n inlineLabel?: boolean;\n /** Content rendered as an inline-start addon (e.g. an icon) */\n leadingIcon?: React.ReactNode;\n /** Content rendered as an inline-end addon (e.g. an icon) */\n trailingIcon?: React.ReactNode;\n}) {\n const errors = field.state.meta.errors\n .map((err) => (typeof err === \"string\" ? err : err?.message))\n .filter(Boolean);\n\n const useInputGroup = inlineLabel || leadingIcon || trailingIcon;\n\n if (useInputGroup) {\n return (\n <Field name={field.name}>\n {!inlineLabel && <FieldLabel>{label}</FieldLabel>}\n <InputGroup>\n {inlineLabel && (\n <InputGroupAddon align=\"block-start\">\n <FieldLabel>{label}</FieldLabel>\n </InputGroupAddon>\n )}\n {leadingIcon && (\n <InputGroupAddon align=\"inline-start\">\n {leadingIcon}\n </InputGroupAddon>\n )}\n <FieldControl\n render={\n <InputGroupInput\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n placeholder={placeholder}\n type={type}\n />\n }\n />\n {trailingIcon && (\n <InputGroupAddon align=\"inline-end\">{trailingIcon}</InputGroupAddon>\n )}\n </InputGroup>\n <FieldError match={!!errors.length}>{errors.join(\", \")}</FieldError>\n </Field>\n );\n }\n\n return (\n <Field name={field.name}>\n <FieldLabel>{label}</FieldLabel>\n <FieldControl\n render={\n <Input\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n placeholder={placeholder}\n type={type}\n />\n }\n />\n <FieldError match={!!errors.length}>{errors.join(\", \")}</FieldError>\n </Field>\n );\n}\n","\"use client\";\n\nimport {\n createFormHook,\n formOptions,\n revalidateLogic,\n} from \"@tanstack/react-form\";\nimport { CheckboxGroupField } from \"./checkbox-group-field\";\nimport { DateField } from \"./date-field\";\nimport { DateRangeField } from \"./date-range-field\";\nimport { appFieldContext, appFormContext } from \"./form-context\";\nimport { NumberField } from \"./number-field\";\nimport { SelectField } from \"./select-field\";\nimport { SubmitButton } from \"./submit-button\";\nimport { TextField } from \"./text-field\";\n\nconst { useAppForm, withForm: withAppForm } = createFormHook({\n fieldContext: appFieldContext,\n formContext: appFormContext,\n fieldComponents: {\n TextField,\n CheckboxGroupField,\n SelectField,\n DateField,\n DateRangeField,\n NumberField,\n },\n formComponents: {\n SubmitButton,\n },\n});\n\nconst customFormOptions = formOptions({\n validationLogic: revalidateLogic({\n mode: \"submit\",\n modeAfterSubmission: \"blur\",\n }),\n});\n\nconst useCustomAppForm: typeof useAppForm = (options) => {\n return useAppForm({\n ...customFormOptions,\n ...options,\n });\n};\n\nconst withCustomAppForm: typeof withAppForm = (options) => {\n return withAppForm({\n ...customFormOptions,\n ...options,\n });\n};\n\nexport { useCustomAppForm as useAppForm, withCustomAppForm as withAppForm };\n"]}
|