@igne-agency/react-web-ui 0.2.1 → 0.3.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 (59) hide show
  1. package/README.md +39 -0
  2. package/dist/components/checkbox-field/tsf-checkbox-field.js +1 -1
  3. package/dist/components/checkbox-group-field/checkbox-group.d.ts +1 -1
  4. package/dist/components/checkbox-group-field/checkbox-group.js +1 -1
  5. package/dist/components/checkbox-group-field/tsf-checkbox-group-field.js +1 -1
  6. package/dist/components/combobox-field/tsf-combobox-field.js +2 -2
  7. package/dist/components/date-field/tsf-date-field.js +1 -1
  8. package/dist/components/date-range-field/tsf-date-range-field.js +1 -1
  9. package/dist/components/field/field-group-context.d.ts +21 -0
  10. package/dist/components/field/field-group-context.js +38 -0
  11. package/dist/components/field/field.css +27 -8
  12. package/dist/components/field/field.d.ts +6 -3
  13. package/dist/components/field/field.js +88 -45
  14. package/dist/components/field/field.module.js +12 -10
  15. package/dist/components/fieldset/field-group.d.ts +31 -0
  16. package/dist/components/fieldset/field-group.js +102 -0
  17. package/dist/components/fieldset/fieldset-root.d.ts +60 -0
  18. package/dist/components/fieldset/fieldset-root.js +285 -0
  19. package/dist/components/fieldset/fieldset.css +22 -0
  20. package/dist/components/fieldset/fieldset.d.ts +37 -0
  21. package/dist/components/fieldset/fieldset.js +127 -0
  22. package/dist/components/fieldset/fieldset.module.js +8 -0
  23. package/dist/components/fieldset/index.d.ts +4 -0
  24. package/dist/components/fieldset/index.js +4 -0
  25. package/dist/components/fieldset/tsf-field-group.d.ts +21 -0
  26. package/dist/components/fieldset/tsf-field-group.js +58 -0
  27. package/dist/components/file-field/tsf-file-field.js +1 -1
  28. package/dist/components/number-field/tsf-number-field.js +1 -1
  29. package/dist/components/otp-field/tsf-otp-field.js +1 -1
  30. package/dist/components/password-field/tsf-password-field.js +1 -1
  31. package/dist/components/photo-field/tsf-photo-field.js +1 -1
  32. package/dist/components/radio-group-field/radio-group.d.ts +1 -1
  33. package/dist/components/radio-group-field/radio-group.js +1 -1
  34. package/dist/components/radio-group-field/tsf-radio-group-field.js +1 -1
  35. package/dist/components/segmented-control-field/segmented-control.d.ts +1 -1
  36. package/dist/components/segmented-control-field/segmented-control.js +1 -1
  37. package/dist/components/segmented-control-field/tsf-segmented-control-field.js +1 -1
  38. package/dist/components/select-field/tsf-select-field.js +1 -1
  39. package/dist/components/switch-field/tsf-switch-field.js +1 -1
  40. package/dist/components/text-field/connect-text-preset.js +1 -1
  41. package/dist/components/text-field/text-field.css +28 -27
  42. package/dist/components/text-field/text-field.module.js +9 -9
  43. package/dist/components/text-field/tsf-text-field.js +1 -1
  44. package/dist/components/textarea-field/tsf-textarea-field.js +1 -1
  45. package/dist/components/time-field/tsf-time-field.js +1 -1
  46. package/dist/components/toggle-group-field/toggle-group.d.ts +1 -1
  47. package/dist/components/toggle-group-field/toggle-group.js +1 -1
  48. package/dist/components/toggle-group-field/tsf-toggle-group-field.js +1 -1
  49. package/dist/index.d.ts +1 -0
  50. package/dist/index.js +6 -2
  51. package/dist/lib/forms/create-app-form.d.ts +18 -9
  52. package/dist/lib/forms/create-app-form.js +17 -8
  53. package/dist/lib/forms/index.d.ts +1 -0
  54. package/dist/lib/forms/index.js +2 -1
  55. package/dist/lib/forms/use-connected-field.d.ts +10 -7
  56. package/dist/lib/forms/use-connected-field.js +54 -28
  57. package/package.json +5 -1
  58. package/dist/components/field/fieldset.d.ts +0 -22
  59. package/dist/components/field/fieldset.js +0 -130
@@ -1,48 +1,74 @@
1
+ import { FieldGroupContext } from "../../components/field/field-group-context.js";
1
2
  import { useFieldContext } from "./context.js";
2
3
  import { c } from "react/compiler-runtime";
4
+ import { useContext, useLayoutEffect } from "react";
3
5
  // src/lib/forms/use-connected-field.ts
4
6
  /**
5
- * The field a bridge renders for, and the props every field takes from it:
6
- * its name, its errors as the validators returned them, `dirty`, `touched`,
7
- * `pending` while it validates, and the blur handler. The value and its change
8
- * handler are the control's own.
7
+ * The TanStack Form field a control renders in, and the props every field
8
+ * takes from it: its name, its errors as the validators returned them,
9
+ * `dirty`, `touched`, `pending` while it validates, and the blur handler. The
10
+ * value and its change handler are the control's own. Given the field's
11
+ * label, it tells an enclosing field group, whose `formatError` receives it.
9
12
  *
10
13
  * @example
11
- * const { field, props } = useConnectedField<string>();
12
- * <TextField {...props} value={field.state.value} onValueChange={field.handleChange} label={label} optionalLabel={optionalLabel} />
14
+ * const { field, props: { name, onBlur, ...state } } = useConnectedField<string>(label);
15
+ * <TextInput.Root {...state} value={field.state.value} onValueChange={field.handleChange} optionalLabel="optional">
16
+ * <TextInput.Input name={name} onBlur={onBlur} />
17
+ * </TextInput.Root>
13
18
  */
14
- var useConnectedField = () => {
15
- const $ = c(10);
19
+ var useConnectedField = (label) => {
20
+ const $ = c(15);
16
21
  const field = useFieldContext();
22
+ const registerLabel = useContext(FieldGroupContext)?.registerLabel;
23
+ const { name } = field;
17
24
  const { meta } = field.state;
18
25
  let t0;
19
- if ($[0] !== field.handleBlur || $[1] !== field.name || $[2] !== meta.errors || $[3] !== meta.isDirty || $[4] !== meta.isTouched || $[5] !== meta.isValidating) {
20
- t0 = {
21
- name: field.name,
26
+ let t1;
27
+ if ($[0] !== label || $[1] !== name || $[2] !== registerLabel) {
28
+ t0 = () => registerLabel === void 0 || label === void 0 ? void 0 : registerLabel(name, label);
29
+ t1 = [
30
+ registerLabel,
31
+ name,
32
+ label
33
+ ];
34
+ $[0] = label;
35
+ $[1] = name;
36
+ $[2] = registerLabel;
37
+ $[3] = t0;
38
+ $[4] = t1;
39
+ } else {
40
+ t0 = $[3];
41
+ t1 = $[4];
42
+ }
43
+ useLayoutEffect(t0, t1);
44
+ let t2;
45
+ if ($[5] !== field.handleBlur || $[6] !== meta.errors || $[7] !== meta.isDirty || $[8] !== meta.isTouched || $[9] !== meta.isValidating || $[10] !== name) {
46
+ t2 = {
47
+ name,
22
48
  errors: meta.errors,
23
49
  dirty: meta.isDirty,
24
50
  touched: meta.isTouched,
25
51
  pending: meta.isValidating,
26
52
  onBlur: field.handleBlur
27
53
  };
28
- $[0] = field.handleBlur;
29
- $[1] = field.name;
30
- $[2] = meta.errors;
31
- $[3] = meta.isDirty;
32
- $[4] = meta.isTouched;
33
- $[5] = meta.isValidating;
34
- $[6] = t0;
35
- } else t0 = $[6];
36
- let t1;
37
- if ($[7] !== field || $[8] !== t0) {
38
- t1 = {
54
+ $[5] = field.handleBlur;
55
+ $[6] = meta.errors;
56
+ $[7] = meta.isDirty;
57
+ $[8] = meta.isTouched;
58
+ $[9] = meta.isValidating;
59
+ $[10] = name;
60
+ $[11] = t2;
61
+ } else t2 = $[11];
62
+ let t3;
63
+ if ($[12] !== field || $[13] !== t2) {
64
+ t3 = {
39
65
  field,
40
- props: t0
66
+ props: t2
41
67
  };
42
- $[7] = field;
43
- $[8] = t0;
44
- $[9] = t1;
45
- } else t1 = $[9];
46
- return t1;
68
+ $[12] = field;
69
+ $[13] = t2;
70
+ $[14] = t3;
71
+ } else t3 = $[14];
72
+ return t3;
47
73
  };
48
74
  export { useConnectedField };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@igne-agency/react-web-ui",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "IGNE's React web component kit: primitives and the presets over them, form controls in three tiers with a TanStack Form bridge, and DTCG tokens themed per app.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -145,6 +145,10 @@
145
145
  "types": "./dist/components/field-placeholder/index.d.ts",
146
146
  "default": "./dist/components/field-placeholder/index.js"
147
147
  },
148
+ "./fieldset": {
149
+ "types": "./dist/components/fieldset/index.d.ts",
150
+ "default": "./dist/components/fieldset/index.js"
151
+ },
148
152
  "./file-field": {
149
153
  "types": "./dist/components/file-field/index.d.ts",
150
154
  "default": "./dist/components/file-field/index.js"
@@ -1,22 +0,0 @@
1
- import type { ReactNode } from "react";
2
- import { type FieldLabelProps, type FieldProps, type FieldRootProps } from "./field.tsx";
3
- /** What the fieldset root of a group of choices takes. */
4
- export type FieldsetRootProps = FieldRootProps & Pick<FieldProps, "errors" | "requiredness" | "dirty" | "touched" | "pending"> & Readonly<{
5
- /** A choice is made. */
6
- filled?: boolean;
7
- readOnly?: boolean;
8
- }>;
9
- /**
10
- * A field rendered as a fieldset, for a group of choices named by its legend.
11
- *
12
- * @example
13
- * <FieldsetRoot filled={kind !== null}>…</FieldsetRoot>
14
- */
15
- export declare const FieldsetRoot: ({ errors, requiredness, dirty, touched, pending, filled, readOnly, disabled, ...props }: FieldsetRootProps) => ReactNode;
16
- /**
17
- * The legend that names a {@link FieldsetRoot}.
18
- *
19
- * @example
20
- * <FieldsetLegend optionalLabel="optional">Kind</FieldsetLegend>
21
- */
22
- export declare const FieldsetLegend: (props: FieldLabelProps) => ReactNode;
@@ -1,130 +0,0 @@
1
- import { Field } from "./field.js";
2
- import { fieldStateAttributes } from "./field-state.js";
3
- import { useFieldState } from "./use-field-state.js";
4
- import { c } from "react/compiler-runtime";
5
- import { jsx } from "react/jsx-runtime";
6
- import { Fieldset } from "@base-ui/react/fieldset";
7
- // src/components/field/fieldset.tsx
8
- /**
9
- * A field rendered as a fieldset, for a group of choices named by its legend.
10
- *
11
- * @example
12
- * <FieldsetRoot filled={kind !== null}>…</FieldsetRoot>
13
- */
14
- var FieldsetRoot = (t0) => {
15
- const $ = c(29);
16
- let dirty;
17
- let disabled;
18
- let errors;
19
- let filled;
20
- let pending;
21
- let props;
22
- let readOnly;
23
- let requiredness;
24
- let touched;
25
- if ($[0] !== t0) {
26
- ({errors, requiredness, dirty, touched, pending, filled, readOnly, disabled, ...props} = t0);
27
- $[0] = t0;
28
- $[1] = dirty;
29
- $[2] = disabled;
30
- $[3] = errors;
31
- $[4] = filled;
32
- $[5] = pending;
33
- $[6] = props;
34
- $[7] = readOnly;
35
- $[8] = requiredness;
36
- $[9] = touched;
37
- } else {
38
- dirty = $[1];
39
- disabled = $[2];
40
- errors = $[3];
41
- filled = $[4];
42
- pending = $[5];
43
- props = $[6];
44
- readOnly = $[7];
45
- requiredness = $[8];
46
- touched = $[9];
47
- }
48
- let t1;
49
- if ($[10] !== dirty || $[11] !== disabled || $[12] !== errors || $[13] !== filled || $[14] !== pending || $[15] !== readOnly || $[16] !== requiredness || $[17] !== touched) {
50
- t1 = {
51
- errors,
52
- requiredness,
53
- dirty,
54
- touched,
55
- pending,
56
- disabled,
57
- readOnly,
58
- filled
59
- };
60
- $[10] = dirty;
61
- $[11] = disabled;
62
- $[12] = errors;
63
- $[13] = filled;
64
- $[14] = pending;
65
- $[15] = readOnly;
66
- $[16] = requiredness;
67
- $[17] = touched;
68
- $[18] = t1;
69
- } else t1 = $[18];
70
- const field = useFieldState(t1);
71
- let t2;
72
- if ($[19] === Symbol.for("react.memo_cache_sentinel")) {
73
- t2 = /* @__PURE__ */ jsx(Fieldset.Root, {});
74
- $[19] = t2;
75
- } else t2 = $[19];
76
- const t3 = field.disabled;
77
- const t4 = field.invalid;
78
- let t5;
79
- if ($[20] !== field.state) {
80
- t5 = fieldStateAttributes(field.state);
81
- $[20] = field.state;
82
- $[21] = t5;
83
- } else t5 = $[21];
84
- let t6;
85
- if ($[22] !== dirty || $[23] !== field.disabled || $[24] !== field.invalid || $[25] !== props || $[26] !== t5 || $[27] !== touched) {
86
- t6 = /* @__PURE__ */ jsx(Field.Root, {
87
- render: t2,
88
- disabled: t3,
89
- invalid: t4,
90
- dirty,
91
- touched,
92
- ...t5,
93
- ...props
94
- });
95
- $[22] = dirty;
96
- $[23] = field.disabled;
97
- $[24] = field.invalid;
98
- $[25] = props;
99
- $[26] = t5;
100
- $[27] = touched;
101
- $[28] = t6;
102
- } else t6 = $[28];
103
- return t6;
104
- };
105
- /**
106
- * The legend that names a {@link FieldsetRoot}.
107
- *
108
- * @example
109
- * <FieldsetLegend optionalLabel="optional">Kind</FieldsetLegend>
110
- */
111
- var FieldsetLegend = (props) => {
112
- const $ = c(3);
113
- let t0;
114
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
115
- t0 = /* @__PURE__ */ jsx(Fieldset.Legend, {});
116
- $[0] = t0;
117
- } else t0 = $[0];
118
- let t1;
119
- if ($[1] !== props) {
120
- t1 = /* @__PURE__ */ jsx(Field.Label, {
121
- nativeLabel: false,
122
- render: t0,
123
- ...props
124
- });
125
- $[1] = props;
126
- $[2] = t1;
127
- } else t1 = $[2];
128
- return t1;
129
- };
130
- export { FieldsetLegend, FieldsetRoot };