@floegence/floe-webapp-core 0.86.76 → 0.87.1

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 (54) hide show
  1. package/dist/components/index.d.ts +2 -0
  2. package/dist/components/ui/Accordion.d.ts +16 -0
  3. package/dist/components/ui/Accordion.js +59 -0
  4. package/dist/components/ui/Breadcrumb.d.ts +14 -0
  5. package/dist/components/ui/Breadcrumb.js +72 -0
  6. package/dist/components/ui/Calendar.d.ts +17 -0
  7. package/dist/components/ui/Calendar.js +151 -0
  8. package/dist/components/ui/Checkbox.js +137 -130
  9. package/dist/components/ui/DataTable.d.ts +33 -0
  10. package/dist/components/ui/DataTable.js +269 -0
  11. package/dist/components/ui/DatePicker.d.ts +35 -0
  12. package/dist/components/ui/DatePicker.js +198 -0
  13. package/dist/components/ui/Dropdown.d.ts +4 -20
  14. package/dist/components/ui/Dropdown.js +195 -231
  15. package/dist/components/ui/Form.d.ts +24 -5
  16. package/dist/components/ui/Form.js +179 -128
  17. package/dist/components/ui/Input.d.ts +6 -0
  18. package/dist/components/ui/Input.js +237 -189
  19. package/dist/components/ui/Pagination.js +211 -162
  20. package/dist/components/ui/Popover.d.ts +6 -1
  21. package/dist/components/ui/Popover.js +75 -56
  22. package/dist/components/ui/Select.d.ts +46 -0
  23. package/dist/components/ui/Select.js +414 -0
  24. package/dist/components/ui/Slider.d.ts +7 -0
  25. package/dist/components/ui/Slider.js +28 -0
  26. package/dist/components/ui/Switch.js +41 -32
  27. package/dist/components/ui/Table.d.ts +9 -0
  28. package/dist/components/ui/Table.js +97 -0
  29. package/dist/components/ui/calendarModel.d.ts +6 -0
  30. package/dist/components/ui/calendarModel.js +37 -0
  31. package/dist/components/ui/controllable.d.ts +7 -0
  32. package/dist/components/ui/controllable.js +10 -0
  33. package/dist/components/ui/dataTableModel.d.ts +18 -0
  34. package/dist/components/ui/dataTableModel.js +18 -0
  35. package/dist/components/ui/formFieldContext.d.ts +26 -0
  36. package/dist/components/ui/formFieldContext.js +40 -0
  37. package/dist/components/ui/index.d.ts +13 -1
  38. package/dist/components/ui/picker/PickerBase.js +106 -112
  39. package/dist/context/LocaleContext.d.ts +55 -0
  40. package/dist/context/LocaleContext.js +80 -0
  41. package/dist/context/index.d.ts +1 -0
  42. package/dist/floe.css +1 -0
  43. package/dist/full.d.ts +2 -0
  44. package/dist/full.js +776 -737
  45. package/dist/index.js +111 -107
  46. package/dist/standalone.css +1 -0
  47. package/dist/styles/themes/presets.d.ts +7 -3
  48. package/dist/styles/themes/presets.js +91 -39
  49. package/dist/styles.css +1 -1
  50. package/dist/themes/porcelain-light.css +19 -0
  51. package/dist/themes/shell-presets.generated.css +62 -49
  52. package/dist/ui.js +223 -184
  53. package/dist/workbench-themes.css +3 -0
  54. package/package.json +1 -1
@@ -1,7 +1,15 @@
1
1
  import { type JSX, type Accessor } from 'solid-js';
2
- export interface FormProps extends Omit<JSX.FormHTMLAttributes<HTMLFormElement>, 'onSubmit'> {
2
+ import { useFormControl } from './formFieldContext';
3
+ export interface FormProps extends Omit<JSX.FormHTMLAttributes<HTMLFormElement>, 'onSubmit' | 'onReset'> {
3
4
  /** Called when form is submitted */
4
- onSubmit?: (e: SubmitEvent) => void | Promise<void>;
5
+ onSubmit?: (e: SubmitEvent, context: {
6
+ form: HTMLFormElement;
7
+ data: FormData;
8
+ }) => void | Promise<void>;
9
+ /** Host-owned validation. Return field messages; undefined means valid. */
10
+ validate?: (data: FormData) => Record<string, string> | undefined | Promise<Record<string, string> | undefined>;
11
+ onReset?: (event: Event) => void;
12
+ onSubmitError?: (error: unknown) => void;
5
13
  /** Additional class names */
6
14
  class?: string;
7
15
  children: JSX.Element;
@@ -12,6 +20,13 @@ export interface FormProps extends Omit<JSX.FormHTMLAttributes<HTMLFormElement>,
12
20
  */
13
21
  export declare function Form(props: FormProps): JSX.Element;
14
22
  export interface FormFieldProps {
23
+ /** Put explicit control identities here so the label shares the same ID. */
24
+ id?: string;
25
+ error?: string;
26
+ description?: string;
27
+ required?: boolean;
28
+ disabled?: boolean;
29
+ readOnly?: boolean;
15
30
  /** Field name for identification */
16
31
  name?: string;
17
32
  /** Additional class names */
@@ -36,11 +51,11 @@ export declare function FormLabel(props: FormLabelProps): JSX.Element;
36
51
  export interface FormControlProps {
37
52
  /** Additional class names */
38
53
  class?: string;
39
- children: JSX.Element;
54
+ children: JSX.Element | ((control: ReturnType<typeof useFormControl>) => JSX.Element);
40
55
  }
41
56
  /**
42
- * Wrapper for form input elements. Passes field context props to children.
43
- * Children should accept id, aria-describedby, and aria-invalid props.
57
+ * Layout wrapper. Floe inputs consume the context directly. Custom controls
58
+ * can use the render function to spread the same reactive field properties.
44
59
  */
45
60
  export declare function FormControl(props: FormControlProps): JSX.Element;
46
61
  export interface FormDescriptionProps {
@@ -55,6 +70,10 @@ export declare function FormDescription(props: FormDescriptionProps): JSX.Elemen
55
70
  export interface FormMessageProps {
56
71
  /** Error message to display */
57
72
  error?: string;
73
+ /** Issues from validators implementing Standard Schema. */
74
+ errors?: readonly {
75
+ message: string;
76
+ }[];
58
77
  /** Additional class names */
59
78
  class?: string;
60
79
  children?: JSX.Element;
@@ -1,230 +1,281 @@
1
- import { createComponent as f, spread as h, mergeProps as v, insert as c, effect as g, className as p, setAttribute as $, template as a } from "solid-js/web";
2
- import { splitProps as d, createSignal as _, Show as m, createUniqueId as S, createContext as F, useContext as y } from "solid-js";
3
- import { cn as u } from "../../utils/cn.js";
4
- var k = /* @__PURE__ */ a("<form>"), x = /* @__PURE__ */ a("<div>"), E = /* @__PURE__ */ a('<span class="text-error ml-0.5"aria-hidden=true>*'), I = /* @__PURE__ */ a("<label>"), j = /* @__PURE__ */ a("<div data-field-control>"), q = /* @__PURE__ */ a("<p>"), P = /* @__PURE__ */ a("<p role=alert>"), D = /* @__PURE__ */ a('<h3 class="text-sm font-medium text-foreground">'), A = /* @__PURE__ */ a('<p class="text-[length:var(--floe-type-caption)] text-[var(--floe-ink-soft)]">'), L = /* @__PURE__ */ a("<div class=space-y-0.5>"), V = /* @__PURE__ */ a("<div><div class=space-y-3>"), M = /* @__PURE__ */ a('<div><div class="flex-1 h-px bg-border"></div><span class="text-[length:var(--floe-type-caption)] text-[var(--floe-ink-quiet)] uppercase tracking-[0.06em]"></span><div class="flex-1 h-px bg-border">');
5
- const C = F();
6
- function N() {
7
- return y(C);
1
+ import { createComponent as f, spread as _, mergeProps as y, insert as a, memo as L, effect as b, className as F, setAttribute as C, template as d } from "solid-js/web";
2
+ import { splitProps as $, createSignal as S, onCleanup as I, createUniqueId as j, Show as x, For as O, createContext as A, useContext as R } from "solid-js";
3
+ import { cn as g } from "../../utils/cn.js";
4
+ import { useFormField as q, useFormControl as B, FormFieldContext as T } from "./formFieldContext.js";
5
+ var V = /* @__PURE__ */ d("<form>"), H = /* @__PURE__ */ d('<p class="text-caption text-muted-foreground">'), E = /* @__PURE__ */ d("<div>"), N = /* @__PURE__ */ d('<span class="text-error ml-0.5"aria-hidden=true>*'), U = /* @__PURE__ */ d("<label>"), z = /* @__PURE__ */ d("<div data-field-control>"), G = /* @__PURE__ */ d("<p>"), J = /* @__PURE__ */ d("<ul>"), K = /* @__PURE__ */ d("<div role=alert>"), Q = /* @__PURE__ */ d("<li>"), W = /* @__PURE__ */ d('<h3 class="text-sm font-medium text-foreground">'), X = /* @__PURE__ */ d('<p class="text-[length:var(--floe-type-caption)] text-[var(--floe-ink-soft)]">'), Y = /* @__PURE__ */ d("<div class=space-y-0.5>"), Z = /* @__PURE__ */ d("<div><div class=space-y-3>"), ee = /* @__PURE__ */ d('<div><div class="flex-1 h-px bg-border"></div><span class="text-[length:var(--floe-type-caption)] text-[var(--floe-ink-quiet)] uppercase tracking-[0.06em]"></span><div class="flex-1 h-px bg-border">');
6
+ const M = A();
7
+ function P() {
8
+ return R(M);
8
9
  }
9
- function B(l) {
10
- const [e, n] = d(l, ["onSubmit", "class", "children"]), [r, t] = _(!1), s = async (o) => {
11
- if (o.preventDefault(), !r() && e.onSubmit) {
12
- t(!0);
13
- try {
14
- await e.onSubmit(o);
15
- } finally {
16
- t(!1);
10
+ function se(l) {
11
+ const [e, r] = $(l, ["onSubmit", "onReset", "validate", "onSubmitError", "class", "children"]), [s, t] = S(!1), [n, o] = S({});
12
+ let c = 0;
13
+ I(() => {
14
+ c++;
15
+ });
16
+ const v = async (u) => {
17
+ if (u.preventDefault(), s()) return;
18
+ const i = u.currentTarget, m = new FormData(i, u.submitter), h = ++c;
19
+ t(!0);
20
+ try {
21
+ const p = e.validate ? await e.validate(m) : void 0;
22
+ if (h !== c) return;
23
+ if (o(p ?? {}), p && Object.values(p).some(Boolean)) {
24
+ const k = Array.from(i.elements).find((D) => "name" in D && p[String(D.name)]);
25
+ k instanceof HTMLElement && (k.closest("[data-field]")?.querySelector('[role="combobox"]') ?? k).focus();
26
+ return;
17
27
  }
28
+ await e.onSubmit?.(u, {
29
+ form: i,
30
+ data: m
31
+ });
32
+ } catch (p) {
33
+ if (h !== c) return;
34
+ if (e.onSubmitError) e.onSubmitError(p);
35
+ else throw p;
36
+ } finally {
37
+ h === c && t(!1);
18
38
  }
19
- }, i = {
20
- isSubmitting: r,
21
- setSubmitting: t
39
+ }, w = {
40
+ isSubmitting: s,
41
+ setSubmitting: t,
42
+ errors: n
22
43
  };
23
- return f(C.Provider, {
24
- value: i,
44
+ return f(M.Provider, {
45
+ value: w,
25
46
  get children() {
26
- var o = k();
27
- return o.addEventListener("submit", s), h(o, v({
47
+ var u = V();
48
+ return u.addEventListener("reset", (i) => {
49
+ e.onReset?.(i), !i.defaultPrevented && (c++, o({}), t(!1));
50
+ }), u.addEventListener("submit", v), _(u, y({
51
+ get "aria-busy"() {
52
+ return s() || void 0;
53
+ },
28
54
  get class() {
29
- return u("space-y-4", e.class);
55
+ return g("space-y-4", e.class);
30
56
  }
31
- }, n), !1, !0), c(o, () => e.children), o;
57
+ }, r), !1, !0), a(u, () => e.children), u;
32
58
  }
33
59
  });
34
60
  }
35
- const w = F();
36
- function b() {
37
- const l = y(w);
38
- if (!l)
39
- throw new Error("useFormField must be used within a FormField");
40
- return l;
41
- }
42
- function G(l) {
43
- const [e, n] = d(l, ["name", "class", "children"]), r = S(), [t, s] = _(), i = {
44
- id: `field-${r}`,
45
- errorId: `field-${r}-error`,
46
- helperId: `field-${r}-helper`,
47
- hasError: () => !!t(),
48
- setError: s
61
+ function ie(l) {
62
+ const e = P(), [r, s] = $(l, ["id", "name", "error", "description", "required", "disabled", "readOnly", "class", "children"]), t = j(), n = () => r.id ?? `field-${t}`, [o, c] = S([]), [v, w] = S([]), u = {
63
+ id: n,
64
+ name: () => r.name,
65
+ error: () => r.error || (r.name ? e?.errors()[r.name] : void 0) || v().map((i) => i.error()).find(Boolean),
66
+ required: () => r.required,
67
+ disabled: () => r.disabled,
68
+ readOnly: () => r.readOnly,
69
+ descriptionIds: () => [...r.description ? [`${n()}-helper`] : [], ...o()],
70
+ messageIds: () => [...r.error || r.name && e?.errors()[r.name] ? [`${n()}-error`] : [], ...v().filter((i) => i.error()).map((i) => i.id)],
71
+ registerDescription: (i) => (c((m) => [...m, i]), () => c((m) => m.filter((h) => h !== i))),
72
+ registerMessage: (i, m) => (w((h) => [...h, {
73
+ id: i,
74
+ error: m
75
+ }]), () => w((h) => h.filter((p) => p.id !== i)))
49
76
  };
50
- return f(w.Provider, {
51
- value: i,
77
+ return f(T.Provider, {
78
+ value: u,
52
79
  get children() {
53
- var o = x();
54
- return h(o, v({
80
+ var i = E();
81
+ return _(i, y({
55
82
  get class() {
56
- return u("space-y-1.5", e.class);
83
+ return g("space-y-1.5", r.class);
57
84
  },
58
85
  get "data-field"() {
59
- return e.name;
86
+ return r.name;
60
87
  }
61
- }, n), !1, !0), c(o, () => e.children), o;
88
+ }, s), !1, !0), a(i, () => r.children, null), a(i, f(x, {
89
+ get when() {
90
+ return r.description;
91
+ },
92
+ get children() {
93
+ var m = H();
94
+ return a(m, () => r.description), b(() => C(m, "id", `${n()}-helper`)), m;
95
+ }
96
+ }), null), i;
62
97
  }
63
98
  });
64
99
  }
65
- function H(l) {
66
- const [e, n] = d(l, ["required", "class", "children"]), r = b();
100
+ function oe(l) {
101
+ const [e, r] = $(l, ["required", "class", "children"]), s = q();
67
102
  return (() => {
68
- var t = I();
69
- return h(t, v({
103
+ var t = U();
104
+ return _(t, y({
70
105
  get for() {
71
- return r.id;
106
+ return s?.id();
72
107
  },
73
108
  get class() {
74
- return u("block text-xs font-medium text-foreground", r.hasError() && "text-error", e.class);
109
+ return g("block text-xs font-medium text-foreground", s?.error() && "text-error", e.class);
75
110
  }
76
- }, n), !1, !0), c(t, () => e.children, null), c(t, f(m, {
111
+ }, r), !1, !0), a(t, () => e.children, null), a(t, f(x, {
77
112
  get when() {
78
- return e.required;
113
+ return e.required ?? s?.required();
79
114
  },
80
115
  get children() {
81
- return E();
116
+ return N();
82
117
  }
83
118
  }), null), t;
84
119
  })();
85
120
  }
86
- function J(l) {
87
- const [e] = d(l, ["class", "children"]), n = b();
121
+ function ae(l) {
122
+ const [e] = $(l, ["class", "children"]), r = q(), s = B();
88
123
  return (() => {
89
- var r = j();
90
- return c(r, () => e.children), g((t) => {
91
- var s = u("relative", e.class), i = n.id;
92
- return s !== t.e && p(r, t.e = s), i !== t.t && $(r, "data-field-id", t.t = i), t;
124
+ var t = z();
125
+ return a(t, (() => {
126
+ var n = L(() => typeof e.children == "function");
127
+ return () => n() ? e.children(s) : e.children;
128
+ })()), b((n) => {
129
+ var o = g("relative", e.class), c = r?.id();
130
+ return o !== n.e && F(t, n.e = o), c !== n.t && C(t, "data-field-id", n.t = c), n;
93
131
  }, {
94
132
  e: void 0,
95
133
  t: void 0
96
- }), r;
134
+ }), t;
97
135
  })();
98
136
  }
99
- function K(l) {
100
- const [e] = d(l, ["class", "children"]), n = b();
101
- return (() => {
102
- var r = q();
103
- return c(r, () => e.children), g((t) => {
104
- var s = n.helperId, i = u("text-[length:var(--floe-type-caption)] text-[var(--floe-ink-soft)]", e.class);
105
- return s !== t.e && $(r, "id", t.e = s), i !== t.t && p(r, t.t = i), t;
106
- }, {
107
- e: void 0,
108
- t: void 0
109
- }), r;
137
+ function ce(l) {
138
+ const [e] = $(l, ["class", "children"]), r = q(), s = j(), t = `${r?.id() ?? s}-description-${s}`;
139
+ return r && I(r.registerDescription(t)), (() => {
140
+ var n = G();
141
+ return C(n, "id", t), a(n, () => e.children), b(() => F(n, g("text-[length:var(--floe-type-caption)] text-[var(--floe-ink-soft)]", e.class))), n;
110
142
  })();
111
143
  }
112
- function O(l) {
113
- const [e] = d(l, ["error", "class", "children"]), n = b(), r = () => !!e.error || !!e.children;
114
- return f(m, {
144
+ function de(l) {
145
+ const e = q(), r = j(), s = `message-${r}`, t = () => l.error || l.errors?.map((n) => n.message).join(" ") || (l.children ? String(l.children) : void 0);
146
+ return e && I(e.registerMessage(s, () => t())), f(x, {
115
147
  get when() {
116
- return r();
148
+ return t() || e?.error();
117
149
  },
118
150
  get children() {
119
- var t = P();
120
- return c(t, () => e.error ?? e.children), g((s) => {
121
- var i = n.errorId, o = u("text-caption text-error", e.class);
122
- return i !== s.e && $(t, "id", s.e = i), o !== s.t && p(t, s.t = o), s;
151
+ var n = K();
152
+ return a(n, f(x, {
153
+ get when() {
154
+ return l.errors?.length;
155
+ },
156
+ get fallback() {
157
+ return l.error ?? l.children ?? e?.error();
158
+ },
159
+ get children() {
160
+ var o = J();
161
+ return a(o, f(O, {
162
+ get each() {
163
+ return l.errors;
164
+ },
165
+ children: (c) => (() => {
166
+ var v = Q();
167
+ return a(v, () => c.message), v;
168
+ })()
169
+ })), o;
170
+ }
171
+ })), b((o) => {
172
+ var c = t() ? s : `${e?.id() ?? r}-error`, v = g("text-caption text-error", l.class);
173
+ return c !== o.e && C(n, "id", o.e = c), v !== o.t && F(n, o.t = v), o;
123
174
  }, {
124
175
  e: void 0,
125
176
  t: void 0
126
- }), t;
177
+ }), n;
127
178
  }
128
179
  });
129
180
  }
130
- function Q(l) {
131
- const [e, n] = d(l, ["align", "class", "children"]), r = {
181
+ function ue(l) {
182
+ const [e, r] = $(l, ["align", "class", "children"]), s = {
132
183
  start: "justify-start",
133
184
  center: "justify-center",
134
185
  end: "justify-end",
135
186
  between: "justify-between"
136
187
  };
137
188
  return (() => {
138
- var t = x();
139
- return h(t, v({
189
+ var t = E();
190
+ return _(t, y({
140
191
  get class() {
141
- return u("flex items-center gap-2 pt-2", r[e.align ?? "end"], e.class);
192
+ return g("flex items-center gap-2 pt-2", s[e.align ?? "end"], e.class);
142
193
  }
143
- }, n), !1, !0), c(t, () => e.children), t;
194
+ }, r), !1, !0), a(t, () => e.children), t;
144
195
  })();
145
196
  }
146
- function T(l) {
147
- const [e, n] = d(l, ["title", "description", "class", "children"]);
197
+ function me(l) {
198
+ const [e, r] = $(l, ["title", "description", "class", "children"]);
148
199
  return (() => {
149
- var r = V(), t = r.firstChild;
150
- return h(r, v({
200
+ var s = Z(), t = s.firstChild;
201
+ return _(s, y({
151
202
  get class() {
152
- return u("space-y-3", e.class);
203
+ return g("space-y-3", e.class);
153
204
  }
154
- }, n), !1, !0), c(r, f(m, {
205
+ }, r), !1, !0), a(s, f(x, {
155
206
  get when() {
156
207
  return e.title || e.description;
157
208
  },
158
209
  get children() {
159
- var s = L();
160
- return c(s, f(m, {
210
+ var n = Y();
211
+ return a(n, f(x, {
161
212
  get when() {
162
213
  return e.title;
163
214
  },
164
215
  get children() {
165
- var i = D();
166
- return c(i, () => e.title), i;
216
+ var o = W();
217
+ return a(o, () => e.title), o;
167
218
  }
168
- }), null), c(s, f(m, {
219
+ }), null), a(n, f(x, {
169
220
  get when() {
170
221
  return e.description;
171
222
  },
172
223
  get children() {
173
- var i = A();
174
- return c(i, () => e.description), i;
224
+ var o = X();
225
+ return a(o, () => e.description), o;
175
226
  }
176
- }), null), s;
227
+ }), null), n;
177
228
  }
178
- }), t), c(t, () => e.children), r;
229
+ }), t), a(t, () => e.children), s;
179
230
  })();
180
231
  }
181
- function W(l) {
182
- const [e] = d(l, ["label", "class"]);
183
- return f(m, {
232
+ function fe(l) {
233
+ const [e] = $(l, ["label", "class"]);
234
+ return f(x, {
184
235
  get when() {
185
236
  return e.label;
186
237
  },
187
238
  get fallback() {
188
239
  return (() => {
189
- var n = x();
190
- return g(() => p(n, u("h-px bg-border my-4", e.class))), n;
240
+ var r = E();
241
+ return b(() => F(r, g("h-px bg-border my-4", e.class))), r;
191
242
  })();
192
243
  },
193
244
  get children() {
194
- var n = M(), r = n.firstChild, t = r.nextSibling;
195
- return c(t, () => e.label), g(() => p(n, u("flex items-center gap-3 my-4", e.class))), n;
245
+ var r = ee(), s = r.firstChild, t = s.nextSibling;
246
+ return a(t, () => e.label), b(() => F(r, g("flex items-center gap-3 my-4", e.class))), r;
196
247
  }
197
248
  });
198
249
  }
199
- function X(l) {
200
- const [e, n] = d(l, ["cols", "class", "children"]), r = {
250
+ function ge(l) {
251
+ const [e, r] = $(l, ["cols", "class", "children"]), s = {
201
252
  1: "grid-cols-1",
202
253
  2: "sm:grid-cols-2",
203
254
  3: "sm:grid-cols-3",
204
255
  4: "sm:grid-cols-4"
205
256
  };
206
257
  return (() => {
207
- var t = x();
208
- return h(t, v({
258
+ var t = E();
259
+ return _(t, y({
209
260
  get class() {
210
- return u("grid gap-3 grid-cols-1", r[e.cols ?? 2], e.class);
261
+ return g("grid gap-3 grid-cols-1", s[e.cols ?? 2], e.class);
211
262
  }
212
- }, n), !1, !0), c(t, () => e.children), t;
263
+ }, r), !1, !0), a(t, () => e.children), t;
213
264
  })();
214
265
  }
215
- function Y() {
216
- return N()?.isSubmitting;
266
+ function ve() {
267
+ return P()?.isSubmitting;
217
268
  }
218
269
  export {
219
- B as Form,
220
- Q as FormActions,
221
- J as FormControl,
222
- K as FormDescription,
223
- W as FormDivider,
224
- G as FormField,
225
- H as FormLabel,
226
- O as FormMessage,
227
- X as FormRow,
228
- T as FormSection,
229
- Y as useFormSubmitting
270
+ se as Form,
271
+ ue as FormActions,
272
+ ae as FormControl,
273
+ ce as FormDescription,
274
+ fe as FormDivider,
275
+ ie as FormField,
276
+ oe as FormLabel,
277
+ de as FormMessage,
278
+ ge as FormRow,
279
+ me as FormSection,
280
+ ve as useFormSubmitting
230
281
  };
@@ -27,6 +27,12 @@ export declare function Textarea(props: TextareaProps): JSX.Element;
27
27
  * NumberInput - Number input with increment/decrement buttons
28
28
  */
29
29
  export interface NumberInputProps {
30
+ id?: string;
31
+ name?: string;
32
+ required?: boolean;
33
+ ariaLabel?: string;
34
+ ariaDescribedBy?: string;
35
+ readOnly?: boolean;
30
36
  /** Current value */
31
37
  value: number;
32
38
  /** Called when value changes */