@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.
Files changed (138) hide show
  1. package/dist/chunk-2HQPCV2L.js +895 -0
  2. package/dist/chunk-2HQPCV2L.js.map +1 -0
  3. package/dist/form.d.ts +175 -0
  4. package/dist/form.js +356 -0
  5. package/dist/form.js.map +1 -0
  6. package/dist/index.d.ts +2162 -0
  7. package/dist/index.js +11640 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/input-JCZs61MO.d.ts +24 -0
  10. package/package.json +90 -0
  11. package/src/components/form/checkbox-group-field.tsx +101 -0
  12. package/src/components/form/date-field.tsx +79 -0
  13. package/src/components/form/date-range-field.tsx +106 -0
  14. package/src/components/form/form-context.ts +10 -0
  15. package/src/components/form/form.tsx +54 -0
  16. package/src/components/form/number-field.tsx +69 -0
  17. package/src/components/form/select-field.tsx +76 -0
  18. package/src/components/form/submit-button.tsx +28 -0
  19. package/src/components/form/text-field.tsx +107 -0
  20. package/src/components/layout/dashboard-header.tsx +54 -0
  21. package/src/components/layout/dashboard-panel.tsx +34 -0
  22. package/src/components/layout/dashboard-topbar.tsx +221 -0
  23. package/src/components/theme-provider.tsx +403 -0
  24. package/src/components/ui/accordion.tsx +69 -0
  25. package/src/components/ui/alert-dialog.tsx +169 -0
  26. package/src/components/ui/alert.tsx +80 -0
  27. package/src/components/ui/animated-counter.tsx +109 -0
  28. package/src/components/ui/animated-theme-toggler.tsx +265 -0
  29. package/src/components/ui/app-store-buttons.tsx +182 -0
  30. package/src/components/ui/aspect-ratio.tsx +23 -0
  31. package/src/components/ui/aurora-orb.tsx +163 -0
  32. package/src/components/ui/aurora-text.tsx +76 -0
  33. package/src/components/ui/autocomplete.tsx +296 -0
  34. package/src/components/ui/avatar-group.tsx +150 -0
  35. package/src/components/ui/avatar.tsx +285 -0
  36. package/src/components/ui/badge-group.tsx +160 -0
  37. package/src/components/ui/badge.tsx +172 -0
  38. package/src/components/ui/breadcrumb.tsx +112 -0
  39. package/src/components/ui/button.tsx +77 -0
  40. package/src/components/ui/calendar.tsx +137 -0
  41. package/src/components/ui/card.tsx +244 -0
  42. package/src/components/ui/carousel.tsx +258 -0
  43. package/src/components/ui/chart.tsx +379 -0
  44. package/src/components/ui/chat-divider.tsx +67 -0
  45. package/src/components/ui/chat.tsx +494 -0
  46. package/src/components/ui/checkbox-group.tsx +16 -0
  47. package/src/components/ui/checkbox.tsx +82 -0
  48. package/src/components/ui/collapsible.tsx +45 -0
  49. package/src/components/ui/color-picker.tsx +389 -0
  50. package/src/components/ui/combobox.tsx +411 -0
  51. package/src/components/ui/command.tsx +264 -0
  52. package/src/components/ui/confetti.tsx +196 -0
  53. package/src/components/ui/context-menu.tsx +271 -0
  54. package/src/components/ui/context-meter.tsx +134 -0
  55. package/src/components/ui/credit-card.tsx +214 -0
  56. package/src/components/ui/data-table-paged.tsx +163 -0
  57. package/src/components/ui/date-picker.tsx +154 -0
  58. package/src/components/ui/dialog.tsx +196 -0
  59. package/src/components/ui/drawer.tsx +135 -0
  60. package/src/components/ui/empty.tsx +127 -0
  61. package/src/components/ui/fab.tsx +45 -0
  62. package/src/components/ui/featured-icon.tsx +149 -0
  63. package/src/components/ui/field.tsx +88 -0
  64. package/src/components/ui/fieldset.tsx +29 -0
  65. package/src/components/ui/form.tsx +17 -0
  66. package/src/components/ui/frame.tsx +82 -0
  67. package/src/components/ui/generic-empty.tsx +142 -0
  68. package/src/components/ui/group.tsx +97 -0
  69. package/src/components/ui/help-tip.tsx +94 -0
  70. package/src/components/ui/horizontal-scroll-fader.tsx +228 -0
  71. package/src/components/ui/input-group.tsx +102 -0
  72. package/src/components/ui/input-otp.tsx +96 -0
  73. package/src/components/ui/input.tsx +66 -0
  74. package/src/components/ui/item.tsx +198 -0
  75. package/src/components/ui/kbd.tsx +30 -0
  76. package/src/components/ui/label.tsx +28 -0
  77. package/src/components/ui/markdown.tsx +188 -0
  78. package/src/components/ui/menu.tsx +312 -0
  79. package/src/components/ui/menubar.tsx +93 -0
  80. package/src/components/ui/meter.tsx +67 -0
  81. package/src/components/ui/multi-select.tsx +308 -0
  82. package/src/components/ui/navigation-menu.tsx +143 -0
  83. package/src/components/ui/number-field.tsx +160 -0
  84. package/src/components/ui/pagination-controls.tsx +74 -0
  85. package/src/components/ui/pagination.tsx +149 -0
  86. package/src/components/ui/pipeline.tsx +102 -0
  87. package/src/components/ui/popover.tsx +119 -0
  88. package/src/components/ui/preview-card.tsx +55 -0
  89. package/src/components/ui/progress.tsx +289 -0
  90. package/src/components/ui/qr-code.tsx +150 -0
  91. package/src/components/ui/radio-group.tsx +103 -0
  92. package/src/components/ui/resizable.tsx +56 -0
  93. package/src/components/ui/scroll-area.tsx +90 -0
  94. package/src/components/ui/scroller.tsx +38 -0
  95. package/src/components/ui/section-header.tsx +118 -0
  96. package/src/components/ui/segmented-control.tsx +83 -0
  97. package/src/components/ui/select.tsx +181 -0
  98. package/src/components/ui/separator.tsx +23 -0
  99. package/src/components/ui/sheet.tsx +224 -0
  100. package/src/components/ui/sidebar.tsx +774 -0
  101. package/src/components/ui/skeleton.tsx +16 -0
  102. package/src/components/ui/slider.tsx +108 -0
  103. package/src/components/ui/smooth-scroll.tsx +206 -0
  104. package/src/components/ui/social-button.tsx +247 -0
  105. package/src/components/ui/spinner-on-demand.tsx +32 -0
  106. package/src/components/ui/spinner.tsx +18 -0
  107. package/src/components/ui/stat.tsx +187 -0
  108. package/src/components/ui/stepper.tsx +167 -0
  109. package/src/components/ui/switch.tsx +56 -0
  110. package/src/components/ui/table.tsx +126 -0
  111. package/src/components/ui/tabs.tsx +90 -0
  112. package/src/components/ui/tag.tsx +242 -0
  113. package/src/components/ui/target-countdown.tsx +46 -0
  114. package/src/components/ui/text-editor.tsx +313 -0
  115. package/src/components/ui/textarea.tsx +51 -0
  116. package/src/components/ui/thinking-orb.tsx +6 -0
  117. package/src/components/ui/time-picker.tsx +308 -0
  118. package/src/components/ui/timeline.tsx +116 -0
  119. package/src/components/ui/toast.tsx +268 -0
  120. package/src/components/ui/toggle-group.tsx +101 -0
  121. package/src/components/ui/toggle.tsx +45 -0
  122. package/src/components/ui/toolbar.tsx +89 -0
  123. package/src/components/ui/tooltip.tsx +102 -0
  124. package/src/components/ui/vertical-scroll-fader.tsx +250 -0
  125. package/src/components/ui/video-player.tsx +275 -0
  126. package/src/components/upload/avatar-upload-base.tsx +131 -0
  127. package/src/components/upload/image-upload-base.tsx +112 -0
  128. package/src/form.ts +17 -0
  129. package/src/index.ts +143 -0
  130. package/src/lib/hooks/use-callback-ref.ts +15 -0
  131. package/src/lib/hooks/use-first-render.ts +11 -0
  132. package/src/lib/hooks/use-hover.ts +53 -0
  133. package/src/lib/hooks/use-is-tab-active.ts +17 -0
  134. package/src/lib/hooks/use-media-query.ts +164 -0
  135. package/src/lib/utils/css.ts +6 -0
  136. package/src/styles.css +329 -0
  137. package/src/types/helpers.ts +24 -0
  138. 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
@@ -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"]}