formstand 0.15.0 → 0.15.2
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/CHANGELOG.md +84 -0
- package/dist/{createForm-C9hZffCQ.d.cts → createForm-jlzK2lCG.d.cts} +1 -1
- package/dist/{createForm-C9hZffCQ.d.ts → createForm-jlzK2lCG.d.ts} +1 -1
- package/dist/devtools/index.d.cts +1 -1
- package/dist/devtools/index.d.ts +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,89 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.15.2 — 2026-08-11
|
|
4
|
+
|
|
5
|
+
Identical to 0.15.1, republished under a fresh tag. The v0.15.1 tag was
|
|
6
|
+
pushed during the August 6 GitHub Actions outage and GitHub dropped the
|
|
7
|
+
tag event outright, so the Publish workflow never ran and 0.15.1 never
|
|
8
|
+
reached npm. The Publish workflow only fires on tag pushes by design (the
|
|
9
|
+
trusted-publishing trust is bound to that trigger), so the recovery is a
|
|
10
|
+
new version under a new tag. No code changes.
|
|
11
|
+
|
|
12
|
+
## formstand-cli 0.11.1 — 2026-08-11
|
|
13
|
+
|
|
14
|
+
Identical to formstand-cli 0.11.0, republished under a fresh tag for the
|
|
15
|
+
same reason as 0.15.2 above: the cli-v0.11.0 tag event was dropped in the
|
|
16
|
+
August 6 outage and the version never reached npm. No code changes.
|
|
17
|
+
|
|
18
|
+
## 0.15.1 — 2026-08-06
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- **Tuple element paths type as their exact element.** `FieldValue` resolved
|
|
23
|
+
a path like `"pair.0"` into `[string, number]` through the generic array
|
|
24
|
+
arm, so the value typed as `string | number` instead of `string`. The
|
|
25
|
+
bundled field components hid this by asserting their own value type; the
|
|
26
|
+
raw hooks exposed it, and a CLI module tuple section over a mixed tuple
|
|
27
|
+
did not compile because its per-kind prop builders need the exact element.
|
|
28
|
+
Tuple index paths now resolve positionally. Types only, no runtime change.
|
|
29
|
+
|
|
30
|
+
## formstand-cli 0.11.0 — 2026-08-06
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
|
|
34
|
+
- **Four edge-config compile and layout bugs in the container migration**,
|
|
35
|
+
all one family: a gate that decides imports or exports did not count every
|
|
36
|
+
shape that renders section chrome.
|
|
37
|
+
- A module union section at `--columns 2|3` rendered its vertical `Stack`
|
|
38
|
+
shell while importing for the grid it no longer renders, a TS2304 in
|
|
39
|
+
mantine and mui output. Imports and shell now derive from one visual.
|
|
40
|
+
- A tuple-only root emitted section chrome (`Typography`/`Title`/`Heading`
|
|
41
|
+
headings, and at `--columns 2|3` the `Row`/`Col` or `Grid` pair) without
|
|
42
|
+
importing any of it; the section-import gate now counts tuples.
|
|
43
|
+
- A module tuple section imported the bound field hook from `hooks.ts`,
|
|
44
|
+
which never exported it for a tuple-only root; the export gate now
|
|
45
|
+
mirrors the tuple section's own import rule.
|
|
46
|
+
- A module nested `<fieldset>` lost its full-row span for the CSS-grid
|
|
47
|
+
backends (plain, shadcn, chakra), collapsing a nested section into one
|
|
48
|
+
grid cell; the span now rides the fieldset whenever no cell wrapper
|
|
49
|
+
exists to carry it.
|
|
50
|
+
|
|
51
|
+
The version matrix now generates tuple-only and root-union schemas against
|
|
52
|
+
every kit's real declarations (`cli/matrix/edgeSchemas.ts`), and the CI
|
|
53
|
+
suite grew matching regression tests, so the class cannot ship green again.
|
|
54
|
+
|
|
55
|
+
### Changed
|
|
56
|
+
|
|
57
|
+
- **`--columns` output is responsive.** `--columns 2` now means "two columns
|
|
58
|
+
when there is room, one on a phone" in every backend's own dialect: MUI gets
|
|
59
|
+
an `sx` breakpoint object, chakra a responsive `gridTemplateColumns` style
|
|
60
|
+
prop, mantine `SimpleGrid cols={{ base: 1, sm: N }}`, and the inline-style
|
|
61
|
+
backends (plain, antd) a `repeat(auto-fit, minmax(...))` track whose calc
|
|
62
|
+
caps the column count at N while a 220px floor collapses columns that would
|
|
63
|
+
squeeze inputs below a usable width. shadcn already collapsed via
|
|
64
|
+
`md:grid-cols-N`. Fixed grid tracks were why generated multi-column forms
|
|
65
|
+
were unusable on phones; regenerate to pick the new grids up.
|
|
66
|
+
- **antd sections lay out with `Row`/`Col`** instead of an inline CSS grid:
|
|
67
|
+
the kit's own 24-column idiom, responsive via `xs`/`sm` props, in both
|
|
68
|
+
layouts. Nested sections, arrays, unions, and tuples ride spanning or item
|
|
69
|
+
`Col`s; a union section keeps its vertical shell, since its children are
|
|
70
|
+
conditional fragments that cannot each be a `Col`. This is also the shape
|
|
71
|
+
that makes a per-field span a one-prop change later.
|
|
72
|
+
- **mantine sections lay out with `Grid`/`Grid.Col`** instead of
|
|
73
|
+
`SimpleGrid`: responsive span objects (`span={{ base: 12, sm: 6 }}`), and
|
|
74
|
+
the container that can express a per-field span at all, which `SimpleGrid`
|
|
75
|
+
cannot. Same cell rules as antd: leaves ride item Cols, nested content
|
|
76
|
+
spans, 1-column chrome reads as a `Stack`. The version matrix caught one
|
|
77
|
+
invented prop on the way in (`Grid` has no `gutter` in v9), which is
|
|
78
|
+
exactly the drift it exists to catch.
|
|
79
|
+
- **mui sections lay out with `Grid` containers** instead of `sx` CSS grids
|
|
80
|
+
— the same component the hand-written playground demos use — with the
|
|
81
|
+
spelling the pinned major actually accepts: `size={{ xs: 12, sm: 6 }}` on
|
|
82
|
+
v7/v9, legacy `item xs={12} sm={6}` on v5 **and** v6 (v6's size-prop grid
|
|
83
|
+
is the separate `Grid2` import; the matrix against real v6 declarations is
|
|
84
|
+
what established that). 1-column chrome keeps the historical Stack and
|
|
85
|
+
CardContent output.
|
|
86
|
+
|
|
3
87
|
## 0.15.0 — 2026-08-04
|
|
4
88
|
|
|
5
89
|
### Fixed
|
|
@@ -40,7 +40,7 @@ type FieldPath<T, D extends number = DefaultPathDepth> = FieldPathRec<T, Normali
|
|
|
40
40
|
type FieldPathRec<T, D extends number> = [D] extends [0] ? never : IsArray<T> extends true ? T extends readonly (infer U)[] ? `${number}` | (IsRecord<NonNullable<U>> extends true ? `${number}.${FieldPathRec<NonNullable<U>, Prev[D]>}` : IsArray<NonNullable<U>> extends true ? `${number}.${FieldPathRec<NonNullable<U>, Prev[D]>}` : never) : never : IsRecord<T> extends true ? {
|
|
41
41
|
[K in keyof T & string]: K | (IsRecord<NonNullable<T[K]>> extends true ? `${K}.${FieldPathRec<NonNullable<T[K]>, Prev[D]>}` : IsArray<NonNullable<T[K]>> extends true ? `${K}.${FieldPathRec<NonNullable<T[K]>, Prev[D]>}` : never);
|
|
42
42
|
}[keyof T & string] : never;
|
|
43
|
-
type StepValue<T, K extends string> = T extends readonly (infer U)[] ? K extends `${number}` ? U : never : T extends object ? K extends keyof T ? T[K] : never : never;
|
|
43
|
+
type StepValue<T, K extends string> = T extends readonly (infer U)[] ? K extends keyof T ? T[K] : K extends `${number}` ? U : never : T extends object ? K extends keyof T ? T[K] : never : never;
|
|
44
44
|
type FieldValue<T, P extends string> = [T] extends [NonNullable<T>] ? P extends `${infer Head}.${infer Tail}` ? FieldValue<StepValue<T, Head>, Tail> : StepValue<T, P> : FieldValue<NonNullable<T>, P> | undefined;
|
|
45
45
|
|
|
46
46
|
type ValidationMode = "onChange" | "onBlur" | "onSubmit" | "onTouched" | "all";
|
|
@@ -40,7 +40,7 @@ type FieldPath<T, D extends number = DefaultPathDepth> = FieldPathRec<T, Normali
|
|
|
40
40
|
type FieldPathRec<T, D extends number> = [D] extends [0] ? never : IsArray<T> extends true ? T extends readonly (infer U)[] ? `${number}` | (IsRecord<NonNullable<U>> extends true ? `${number}.${FieldPathRec<NonNullable<U>, Prev[D]>}` : IsArray<NonNullable<U>> extends true ? `${number}.${FieldPathRec<NonNullable<U>, Prev[D]>}` : never) : never : IsRecord<T> extends true ? {
|
|
41
41
|
[K in keyof T & string]: K | (IsRecord<NonNullable<T[K]>> extends true ? `${K}.${FieldPathRec<NonNullable<T[K]>, Prev[D]>}` : IsArray<NonNullable<T[K]>> extends true ? `${K}.${FieldPathRec<NonNullable<T[K]>, Prev[D]>}` : never);
|
|
42
42
|
}[keyof T & string] : never;
|
|
43
|
-
type StepValue<T, K extends string> = T extends readonly (infer U)[] ? K extends `${number}` ? U : never : T extends object ? K extends keyof T ? T[K] : never : never;
|
|
43
|
+
type StepValue<T, K extends string> = T extends readonly (infer U)[] ? K extends keyof T ? T[K] : K extends `${number}` ? U : never : T extends object ? K extends keyof T ? T[K] : never : never;
|
|
44
44
|
type FieldValue<T, P extends string> = [T] extends [NonNullable<T>] ? P extends `${infer Head}.${infer Tail}` ? FieldValue<StepValue<T, Head>, Tail> : StepValue<T, P> : FieldValue<NonNullable<T>, P> | undefined;
|
|
45
45
|
|
|
46
46
|
type ValidationMode = "onChange" | "onBlur" | "onSubmit" | "onTouched" | "all";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { F as Form } from '../createForm-
|
|
3
|
+
import { F as Form } from '../createForm-jlzK2lCG.cjs';
|
|
4
4
|
import 'zustand/vanilla';
|
|
5
5
|
|
|
6
6
|
type DevtoolsPosition = "bottom-right" | "bottom-left" | "top-right" | "top-left";
|
package/dist/devtools/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { F as Form } from '../createForm-
|
|
3
|
+
import { F as Form } from '../createForm-jlzK2lCG.js';
|
|
4
4
|
import 'zustand/vanilla';
|
|
5
5
|
|
|
6
6
|
type DevtoolsPosition = "bottom-right" | "bottom-left" | "top-right" | "top-left";
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as PathDepth, D as DefaultPathDepth, F as Form, C as CreateFormOptions, a as FieldValidationResult, b as FormState, c as FieldPath, d as FieldValue, E as ErrorMap } from './createForm-
|
|
2
|
-
export { B as BoolMap, e as FieldSnapshot, f as FieldsValidationResult, I as InvalidSubmitHandler, R as ReadonlyStoreApi, g as ResetOptions, S as SettledFieldValidationResult, h as SettledFieldsValidationResult, i as SettledValidationResult, j as SubmitHandler, k as SubmitOptions, l as SubmitResult, V as ValidationMode, m as ValidationResult, n as ValidationTrigger, o as createForm, p as emptyValueForSchema, q as flattenIssues, r as isAsyncRequiredError, s as shouldValidateOn, v as validateAsync, t as validateSync } from './createForm-
|
|
1
|
+
import { P as PathDepth, D as DefaultPathDepth, F as Form, C as CreateFormOptions, a as FieldValidationResult, b as FormState, c as FieldPath, d as FieldValue, E as ErrorMap } from './createForm-jlzK2lCG.cjs';
|
|
2
|
+
export { B as BoolMap, e as FieldSnapshot, f as FieldsValidationResult, I as InvalidSubmitHandler, R as ReadonlyStoreApi, g as ResetOptions, S as SettledFieldValidationResult, h as SettledFieldsValidationResult, i as SettledValidationResult, j as SubmitHandler, k as SubmitOptions, l as SubmitResult, V as ValidationMode, m as ValidationResult, n as ValidationTrigger, o as createForm, p as emptyValueForSchema, q as flattenIssues, r as isAsyncRequiredError, s as shouldValidateOn, v as validateAsync, t as validateSync } from './createForm-jlzK2lCG.cjs';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import * as react from 'react';
|
|
5
5
|
import { ReactNode, ChangeEvent } from 'react';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { P as PathDepth, D as DefaultPathDepth, F as Form, C as CreateFormOptions, a as FieldValidationResult, b as FormState, c as FieldPath, d as FieldValue, E as ErrorMap } from './createForm-
|
|
2
|
-
export { B as BoolMap, e as FieldSnapshot, f as FieldsValidationResult, I as InvalidSubmitHandler, R as ReadonlyStoreApi, g as ResetOptions, S as SettledFieldValidationResult, h as SettledFieldsValidationResult, i as SettledValidationResult, j as SubmitHandler, k as SubmitOptions, l as SubmitResult, V as ValidationMode, m as ValidationResult, n as ValidationTrigger, o as createForm, p as emptyValueForSchema, q as flattenIssues, r as isAsyncRequiredError, s as shouldValidateOn, v as validateAsync, t as validateSync } from './createForm-
|
|
1
|
+
import { P as PathDepth, D as DefaultPathDepth, F as Form, C as CreateFormOptions, a as FieldValidationResult, b as FormState, c as FieldPath, d as FieldValue, E as ErrorMap } from './createForm-jlzK2lCG.js';
|
|
2
|
+
export { B as BoolMap, e as FieldSnapshot, f as FieldsValidationResult, I as InvalidSubmitHandler, R as ReadonlyStoreApi, g as ResetOptions, S as SettledFieldValidationResult, h as SettledFieldsValidationResult, i as SettledValidationResult, j as SubmitHandler, k as SubmitOptions, l as SubmitResult, V as ValidationMode, m as ValidationResult, n as ValidationTrigger, o as createForm, p as emptyValueForSchema, q as flattenIssues, r as isAsyncRequiredError, s as shouldValidateOn, v as validateAsync, t as validateSync } from './createForm-jlzK2lCG.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import * as react from 'react';
|
|
5
5
|
import { ReactNode, ChangeEvent } from 'react';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "formstand",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.2",
|
|
4
4
|
"description": "Zod-schema-first React 19 form library backed by zustand",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Tim Frank <timfrankdev@gmail.com>",
|
|
@@ -73,24 +73,24 @@
|
|
|
73
73
|
"@chakra-ui/react": "^3.36.1",
|
|
74
74
|
"@emotion/react": "^11.14.0",
|
|
75
75
|
"@emotion/styled": "^11.14.1",
|
|
76
|
-
"@mantine/core": "^9.5.
|
|
77
|
-
"@mantine/hooks": "^9.5.
|
|
76
|
+
"@mantine/core": "^9.5.1",
|
|
77
|
+
"@mantine/hooks": "^9.5.1",
|
|
78
78
|
"@mui/icons-material": "^9.2.0",
|
|
79
79
|
"@mui/material": "^9.2.0",
|
|
80
80
|
"@mui/x-tree-view": "^9.9.0",
|
|
81
81
|
"@testing-library/react": "^16.1.0",
|
|
82
82
|
"@types/node": "^26.1.0",
|
|
83
83
|
"@types/prismjs": "^1.26.6",
|
|
84
|
-
"@types/react": "^19.
|
|
85
|
-
"@types/react-dom": "^19.2.
|
|
84
|
+
"@types/react": "^19.2.18",
|
|
85
|
+
"@types/react-dom": "^19.2.4",
|
|
86
86
|
"@vitest/coverage-v8": "^4.1.10",
|
|
87
|
-
"antd": "^6.5.
|
|
87
|
+
"antd": "^6.5.3",
|
|
88
88
|
"class-variance-authority": "^0.7.1",
|
|
89
89
|
"clsx": "^2.1.1",
|
|
90
90
|
"eslint": "^10.6.0",
|
|
91
91
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
92
92
|
"jsdom": "^30.0.1",
|
|
93
|
-
"lucide-react": "^1.
|
|
93
|
+
"lucide-react": "^1.28.0",
|
|
94
94
|
"prismjs": "^1.30.0",
|
|
95
95
|
"radix-ui": "^1.6.2",
|
|
96
96
|
"react": "^19.0.0",
|