vultus-core 0.5.0 → 0.5.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.
package/README.md CHANGED
@@ -118,6 +118,12 @@ printers probe the object without tripping the guard (`then`, `toJSON`,
118
118
  context value can be logged, pattern-matched or passed around during tests
119
119
  without the guard misfiring.
120
120
 
121
+ Caution: the parameter-count rule above only decides what a function gets
122
+ with no provider. With a provider, a function whose declared parameter
123
+ count is zero — a default parameter (`(ctx = {}) => ...`), a rest parameter
124
+ (`(...args) => ...`), or a bound `t` — still receives the guarded context,
125
+ and reading a key it was not given still throws.
126
+
121
127
  ```tsx
122
128
  const { Provider: ModuleContext } = createFieldContext<{ items: Item[] }>();
123
129
 
@@ -171,7 +177,8 @@ The value is a single number. `min`, `max`, `step`, `integer` (moxb's
171
177
  `onlyInteger`) and `unit` may each be a context function; `format(n, ctx)`
172
178
  overrides the default display (the number followed by the unit, if any).
173
179
  The shown value is always clamped into the bounds, then rounded when
174
- `integer` (a stored `2.5` shows `3`), since a value from outside — a
180
+ `integer` to a whole number inside them (a stored `2.5` shows `3`; with
181
+ `max: 9.5`, `9.7` shows `9`), since a value from outside — a
175
182
  passed-in `value`, a stored one — may fall outside them or be fractional
176
183
  even though every request the hook itself makes fits; a non-finite request
177
184
  (a widget that parsed `''`) is refused with a warning. `valueText` carries
@@ -315,7 +322,8 @@ the default (or is dropped from a list), with a `console.warn`.
315
322
  namespaced as `${prefix}.${key}`, guarded for SSR so creating one outside a
316
323
  browser is a safe no-op; where the browser blocks storage or refuses a
317
324
  write, a failing read reads as absent and a failing write is skipped, with
318
- one `console.warn` per store); a URL store comes from a router package.
325
+ one `console.warn` per store); a URL store comes from a router package —
326
+ vultus-react-router for react-router.
319
327
  Create a store once — outside render, or in `useMemo` — not on every
320
328
  render: each store is a new subscription target, so a fresh one per render
321
329
  makes every hook below resubscribe.
@@ -344,9 +352,10 @@ is `initialValueOf`. It returns `{ options, isDefault, reset }` — `options`
344
352
  is the definition in its outside form (`value` plus `onChange`, ready for
345
353
  the kind's hook), with the stored raw value made to fit the definition as
346
354
  it is now (`sanitizeStored`: unknown choices or nodes dropped, numbers and
347
- ranges clamped). A value that needed fixing up warns once per field and per raw
348
- value — not again on every render, and not at all when the key is simply
349
- absent (then the default applies, and an absent key is not outside input).
355
+ ranges clamped, and rounded when `integer`). A value that needed fixing up
356
+ warns once per field and per raw value — not again on every render, and not
357
+ at all when the key is simply absent (then the default applies, and an
358
+ absent key is not outside input).
350
359
  `useStoredFields(definitions)` answers for several definitions over one
351
360
  store subscription: `isDefault(id)` (throws for an id not among the
352
361
  definitions), `changedCount`, and `resetAll(method)` (one write for every
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './types.js';
1
+ export type { FormLike, Decision, ValueOrFn, Thunk, Severity, Message, ExecutionContext, ConfirmationSpec, ActionOptions, ActionStatus, ParsedApiError, RegistryEntry, ErrorRoutesRegistry, ApiErrorContext, ActionErrorCtx, } from './types.js';
2
2
  export * from './decision.js';
3
3
  export * from './resolve.js';
4
4
  export * from './parseApiError.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- export * from './types.js';
2
1
  export * from './decision.js';
3
2
  export * from './resolve.js';
4
3
  export * from './parseApiError.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,GAC5E,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,GAGnE,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAA8C,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAiD,MAAM,mBAAmB,CAAC;AAClH,OAAO,EACL,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,GAExD,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EAAE,iBAAiB,GACjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EAAE,kBAAkB,GAEnC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,cAAc,EAA4C,MAAM,cAAc,CAAC;AAC/F,OAAO,EACL,eAAe,EAAE,mBAAmB,GAErC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,aAAa,EAAE,iBAAiB,GAEjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,GAEhF,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EAAE,gBAAgB,GAE/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EAAE,gBAAgB,GAE/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,GAC9D,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAwB,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAoD,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EACL,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,GAEvC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,EAAE,cAAc,EAAE,eAAe,GACvC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAA8B,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAC;AACxF,OAAO,EACL,uBAAuB,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,GAE1E,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,GAC5E,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,GAGnE,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAA8C,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAiD,MAAM,mBAAmB,CAAC;AAClH,OAAO,EACL,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,GAExD,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EAAE,iBAAiB,GACjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EAAE,kBAAkB,GAEnC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,cAAc,EAA4C,MAAM,cAAc,CAAC;AAC/F,OAAO,EACL,eAAe,EAAE,mBAAmB,GAErC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,aAAa,EAAE,iBAAiB,GAEjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,GAEhF,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EAAE,gBAAgB,GAE/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EAAE,gBAAgB,GAE/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,GAC9D,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAwB,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAoD,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EACL,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,GAEvC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,EAAE,cAAc,EAAE,eAAe,GACvC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAA8B,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAC;AACxF,OAAO,EACL,uBAAuB,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,GAE1E,MAAM,iBAAiB,CAAC"}
package/dist/kinds.d.ts CHANGED
@@ -40,11 +40,15 @@ export declare function valueTypeOf(kind: FieldKind): ValueType<any>;
40
40
  * A stored value (already parsed by the kind's value type) made fit for the definition as it is
41
41
  * now: choices, nodes and bounds follow the data, and an old URL may not. A one-of value that is
42
42
  * not a choice becomes the initial value; many-of and tree values that are not choices or nodes
43
- * are dropped; numbers and ranges are clamped into the bounds. Each such change warns, naming
44
- * the field: the value came from outside, so it is not an error. Reordering is silent: lists
45
- * come back in choice order or normalized under the tree's selection (a store keeps them
46
- * sorted, so a warning would come on every read), and a range's ends in order. The warnings go
47
- * to `warn`, console.warn unless a caller that only summarizes (useStoredFields) silences them.
43
+ * are dropped; numbers and ranges are clamped into the bounds, then rounded when the field is
44
+ * `integer` (so a stored `2.5` reads `3`; a whole number inside the bounds, see `fit`), with one
45
+ * warning for whichever of the two actually changed the value: "outside its bounds" when
46
+ * clamping did (whether or not rounding also did), "not a whole number" ("has ends that are not
47
+ * whole numbers" for a range) when only rounding did. Each such change warns, naming the
48
+ * field: the value came from outside, so it is not an error. Reordering is silent: lists come
49
+ * back in choice order or normalized under the tree's selection (a store keeps them sorted, so a
50
+ * warning would come on every read), and a range's ends in order. The warnings go to `warn`,
51
+ * console.warn unless a caller that only summarizes (useStoredFields) silences them.
48
52
  */
49
53
  export declare function sanitizeStored(definition: FieldDefinition, value: unknown, ctx: FieldCtx, warn?: (message: string) => void): unknown;
50
54
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIlD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAsB,KAAK,gBAAgB,EAAuB,MAAM,qBAAqB,CAAC;AACrG,OAAO,EAAyB,KAAK,SAAS,EAA0B,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAuB,KAAK,iBAAiB,EAAwB,MAAM,sBAAsB,CAAC;AACzG,OAAO,EAAqB,KAAK,eAAe,EAAsB,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,eAAe,EAAsB,MAAM,oBAAoB,CAAC;AACnH,OAAO,EAAoB,KAAK,cAAc,EAAqB,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAoB,KAAK,cAAc,EAAqB,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAiE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEhH;;;;GAIG;AACH,KAAK,UAAU,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,IAC9C;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;CAAE,GAAG,GAAG,CAAC;AAEtF;;;;GAIG;AACH,MAAM,MAAM,eAAe,CAAC,GAAG,GAAG,GAAG,IACjC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,GACvC,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,GAC/C,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAC9D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAClE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAC1D,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAC3D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAC9D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;AAkDpD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAclF;AAED,gIAAgI;AAChI,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAY3D;AAQD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,QAAQ,EACb,IAAI,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAyC,GACnE,OAAO,CAgDT"}
1
+ {"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIlD,OAAO,KAAK,EAAQ,SAAS,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAsB,KAAK,gBAAgB,EAAuB,MAAM,qBAAqB,CAAC;AACrG,OAAO,EAAyB,KAAK,SAAS,EAA0B,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAuB,KAAK,iBAAiB,EAAwB,MAAM,sBAAsB,CAAC;AACzG,OAAO,EAAqB,KAAK,eAAe,EAAsB,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,eAAe,EAAsB,MAAM,oBAAoB,CAAC;AACnH,OAAO,EAAoB,KAAK,cAAc,EAAqB,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAoB,KAAK,cAAc,EAAqB,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAiE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEhH;;;;GAIG;AACH,KAAK,UAAU,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,IAC9C;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;CAAE,GAAG,GAAG,CAAC;AAEtF;;;;GAIG;AACH,MAAM,MAAM,eAAe,CAAC,GAAG,GAAG,GAAG,IACjC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,GACvC,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,GAC/C,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAC9D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAClE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAC1D,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAC3D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAC9D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;AAgDpD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAclF;AAED,gIAAgI;AAChI,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAY3D;AAQD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,QAAQ,EACb,IAAI,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAyC,GACnE,OAAO,CAyDT"}
package/dist/kinds.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { resolveChoice } from './choices.js';
2
- import { clamp, resolveNumeric } from './numeric.js';
2
+ import { clamp, fit, resolveNumeric } from './numeric.js';
3
3
  import { resolveIn } from './resolve.js';
4
4
  import { normalizeTreeValue } from './tree.js';
5
5
  import { boolInitialValue } from './useBoolField.js';
@@ -82,11 +82,15 @@ function warnDropped(id, among, dropped, warn) {
82
82
  * A stored value (already parsed by the kind's value type) made fit for the definition as it is
83
83
  * now: choices, nodes and bounds follow the data, and an old URL may not. A one-of value that is
84
84
  * not a choice becomes the initial value; many-of and tree values that are not choices or nodes
85
- * are dropped; numbers and ranges are clamped into the bounds. Each such change warns, naming
86
- * the field: the value came from outside, so it is not an error. Reordering is silent: lists
87
- * come back in choice order or normalized under the tree's selection (a store keeps them
88
- * sorted, so a warning would come on every read), and a range's ends in order. The warnings go
89
- * to `warn`, console.warn unless a caller that only summarizes (useStoredFields) silences them.
85
+ * are dropped; numbers and ranges are clamped into the bounds, then rounded when the field is
86
+ * `integer` (so a stored `2.5` reads `3`; a whole number inside the bounds, see `fit`), with one
87
+ * warning for whichever of the two actually changed the value: "outside its bounds" when
88
+ * clamping did (whether or not rounding also did), "not a whole number" ("has ends that are not
89
+ * whole numbers" for a range) when only rounding did. Each such change warns, naming the
90
+ * field: the value came from outside, so it is not an error. Reordering is silent: lists come
91
+ * back in choice order or normalized under the tree's selection (a store keeps them sorted, so a
92
+ * warning would come on every read), and a range's ends in order. The warnings go to `warn`,
93
+ * console.warn unless a caller that only summarizes (useStoredFields) silences them.
90
94
  */
91
95
  export function sanitizeStored(definition, value, ctx, warn = (message) => console.warn(message)) {
92
96
  const { id } = definition;
@@ -120,20 +124,31 @@ export function sanitizeStored(definition, value, ctx, warn = (message) => conso
120
124
  }
121
125
  case 'numeric': {
122
126
  const stored = value;
123
- const { min, max } = resolveNumeric(id, definition, ctx);
127
+ const { min, max, integer } = resolveNumeric(id, definition, ctx);
124
128
  const clamped = clamp(stored, min, max);
125
- if (clamped !== stored)
126
- warn(`Field '${id}': stored value ${stored} is outside its bounds, using ${clamped}`);
127
- return clamped;
129
+ const fitted = fit(stored, min, max, integer);
130
+ if (fitted !== stored) {
131
+ if (clamped !== stored)
132
+ warn(`Field '${id}': stored value ${stored} is outside its bounds, using ${fitted}`);
133
+ else
134
+ warn(`Field '${id}': stored value ${stored} is not a whole number, using ${fitted}`);
135
+ }
136
+ return fitted;
128
137
  }
129
138
  case 'range': {
130
139
  const stored = value;
131
- const { min, max } = resolveNumeric(id, definition, ctx);
132
- const from = clamp(stored[0], min, max);
133
- const to = clamp(stored[1], min, max);
140
+ const { min, max, integer } = resolveNumeric(id, definition, ctx);
141
+ const clampedChanged = clamp(stored[0], min, max) !== stored[0] || clamp(stored[1], min, max) !== stored[1];
142
+ const from = fit(stored[0], min, max, integer);
143
+ const to = fit(stored[1], min, max, integer);
134
144
  const sanitized = [Math.min(from, to), Math.max(from, to)];
135
145
  if (from !== stored[0] || to !== stored[1]) {
136
- warn(`Field '${id}': stored range ${rangeType.format(stored)} is outside its bounds, using ${rangeType.format(sanitized)}`);
146
+ if (clampedChanged) {
147
+ warn(`Field '${id}': stored range ${rangeType.format(stored)} is outside its bounds, using ${rangeType.format(sanitized)}`);
148
+ }
149
+ else {
150
+ warn(`Field '${id}': stored range ${rangeType.format(stored)} has ends that are not whole numbers, using ${rangeType.format(sanitized)}`);
151
+ }
137
152
  }
138
153
  return sanitized;
139
154
  }
package/dist/kinds.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"kinds.js","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kinds.js","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"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"}
package/dist/numeric.d.ts CHANGED
@@ -26,6 +26,13 @@ export interface ResolvedNumeric {
26
26
  }
27
27
  /** Clamps `n` into [min, max]; either end left out leaves that side open. */
28
28
  export declare function clamp(n: number, min?: number, max?: number): number;
29
+ /**
30
+ * `n` clamped into [min, max], then, when `integer` is true, rounded and kept to the whole numbers
31
+ * inside the bounds ([ceil(min), floor(max)]: with `max: 9.5`, 9.7 is 9, not 10): the rule a
32
+ * numeric or range field's shown value and requests are fit by (useNumericField, useRangeField),
33
+ * and the one `sanitizeStored` fits a stored value by.
34
+ */
35
+ export declare function fit(n: number, min: number | undefined, max: number | undefined, integer: boolean): number;
29
36
  /**
30
37
  * Resolves a numeric field's bounds and formatter with the field context. `format` goes by its
31
38
  * own rule, not resolveIn's, as it always receives the number first; otherwise it is treated
@@ -1 +1 @@
1
- {"version":3,"file":"numeric.d.ts","sourceRoot":"","sources":["../src/numeric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,aAAa,CAAC,GAAG,GAAG,GAAG;IACtC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IAC1C,qFAAqF;IACrF,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;CAC1C;AAED,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,6EAA6E;AAC7E,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,GAAG,eAAe,CAqB9F"}
1
+ {"version":3,"file":"numeric.d.ts","sourceRoot":"","sources":["../src/numeric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,aAAa,CAAC,GAAG,GAAG,GAAG;IACtC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IAC1C,qFAAqF;IACrF,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC;CAC1C;AAED,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,6EAA6E;AAC7E,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAKnE;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAIzG;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,GAAG,eAAe,CAqB9F"}
package/dist/numeric.js CHANGED
@@ -9,6 +9,18 @@ export function clamp(n, min, max) {
9
9
  result = Math.min(result, max);
10
10
  return result;
11
11
  }
12
+ /**
13
+ * `n` clamped into [min, max], then, when `integer` is true, rounded and kept to the whole numbers
14
+ * inside the bounds ([ceil(min), floor(max)]: with `max: 9.5`, 9.7 is 9, not 10): the rule a
15
+ * numeric or range field's shown value and requests are fit by (useNumericField, useRangeField),
16
+ * and the one `sanitizeStored` fits a stored value by.
17
+ */
18
+ export function fit(n, min, max, integer) {
19
+ const clamped = clamp(n, min, max);
20
+ if (!integer)
21
+ return clamped;
22
+ return clamp(Math.round(clamped), min === undefined ? undefined : Math.ceil(min), max === undefined ? undefined : Math.floor(max));
23
+ }
12
24
  /**
13
25
  * Resolves a numeric field's bounds and formatter with the field context. `format` goes by its
14
26
  * own rule, not resolveIn's, as it always receives the number first; otherwise it is treated
@@ -1 +1 @@
1
- {"version":3,"file":"numeric.js","sourceRoot":"","sources":["../src/numeric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAiB,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AA6BzC,6EAA6E;AAC7E,MAAM,UAAU,KAAK,CAAC,CAAS,EAAE,GAAY,EAAE,GAAY;IACzD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtD,IAAI,GAAG,KAAK,SAAS;QAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,IAAmB,EAAE,GAAa;IAC3E,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,EAAE,cAAc,IAAI,GAAG,CAAC;IAClE,MAAM,GAAG,GAAG,SAAS,CAAqB,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAClF,MAAM,GAAG,GAAG,SAAS,CAAqB,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,SAAS,CAAqB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,SAAS,CAAU,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,SAAS,CAAqB,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAErF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,IAAI,cAAqC,CAAC;IAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,cAAc,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;IAC9C,CAAC;SAAM,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;QACpC,cAAc,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAAY,CAAC,CAAC,CAAC;IACzF,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,cAAc,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,SAAkB,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,8EAA8E,CAAC,CAAC;IACpH,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"numeric.js","sourceRoot":"","sources":["../src/numeric.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -74,6 +74,8 @@ export interface ActionOptions<TArgs = void, TResult = void, RouteId extends str
74
74
  fire: (args: TArgs, ctx: ExecutionContext) => Promise<TResult> | TResult;
75
75
  onSuccess?: (result: TResult) => void;
76
76
  }
77
+ /** Compiles only when `A` is assignable to `B`. Not part of the package's public API: kept here as the one definition, imported directly by the files that use it (kinds.ts), and left out of index.ts's re-export of this module. */
78
+ export type Fits<A extends B, B> = A;
77
79
  type FireArgs<TArgs> = [TArgs] extends [void] ? [] : [args: TArgs];
78
80
  export interface ActionStatus<TArgs = void> {
79
81
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useNumericField.d.ts","sourceRoot":"","sources":["../src/useNumericField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAyB,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,iBAAiB,CAAC,GAAG,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;AAE9D,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,IACxE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAEtE,MAAM,WAAW,oBAAqB,SAAQ,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe;IAC1F,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAMhG;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,EACxE,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,EACvC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,oBAAoB,CA6BtB"}
1
+ {"version":3,"file":"useNumericField.d.ts","sourceRoot":"","sources":["../src/useNumericField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAA2C,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACjH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,MAAM,iBAAiB,CAAC,GAAG,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;AAE9D,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,IACxE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAEtE,MAAM,WAAW,oBAAqB,SAAQ,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe;IAC1F,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAMhG;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,EACxE,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,EACvC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,oBAAoB,CA0BtB"}
@@ -1,7 +1,7 @@
1
1
  import { useFieldCore } from './field.js';
2
2
  import { useFieldContext } from './FieldContext.js';
3
3
  import { resolveIn } from './resolve.js';
4
- import { clamp, resolveNumeric } from './numeric.js';
4
+ import { clamp, fit as fitNumber, resolveNumeric } from './numeric.js';
5
5
  /**
6
6
  * The implicit initial value for a numeric field: `initialValue` resolved, else `min` (or 0),
7
7
  * clamped into the bounds. Only those options are resolved, not `format`, so a `format` of the
@@ -29,10 +29,7 @@ export function useNumericField(opts, registry) {
29
29
  const initialValue = () => numericInitialValue(opts, ctx, opts.id);
30
30
  const field = useFieldCore('numeric', inside ? { ...opts, initialValue } : opts, registry);
31
31
  /** A number clamped into the bounds, then rounded when `integer`. */
32
- const fit = (n) => {
33
- const clamped = clamp(n, resolved.min, resolved.max);
34
- return resolved.integer ? Math.round(clamped) : clamped;
35
- };
32
+ const fit = (n) => fitNumber(n, resolved.min, resolved.max, resolved.integer);
36
33
  const value = fit(field.value);
37
34
  const setValue = (next) => {
38
35
  if (!Number.isFinite(next)) {
@@ -1 +1 @@
1
- {"version":3,"file":"useNumericField.js","sourceRoot":"","sources":["../src/useNumericField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,eAAe,EAAiB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,cAAc,EAA4C,MAAM,cAAc,CAAC;AAa/F;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAyB,EAAE,GAAa,EAAE,EAAU;IACtF,MAAM,QAAQ,GAAG,SAAS,CAAqB,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,0BAA0B,CAAC,CAAC;IAC1H,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAqB,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACnG,MAAM,GAAG,GAAG,SAAS,CAAqB,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACnG,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAuC,EACvC,QAAuC;IAEvC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9C,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,YAAY,CAA+B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEzH,qEAAqE;IACrE,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACrD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1D,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;QAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,OAAO,IAAI,0BAA0B,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,KAAK;QACR,GAAG,QAAQ;QACX,KAAK;QACL,QAAQ;QACR,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;KAClC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"useNumericField.js","sourceRoot":"","sources":["../src/useNumericField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,eAAe,EAAiB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,SAAS,EAAE,cAAc,EAA4C,MAAM,cAAc,CAAC;AAajH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAyB,EAAE,GAAa,EAAE,EAAU;IACtF,MAAM,QAAQ,GAAG,SAAS,CAAqB,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,0BAA0B,CAAC,CAAC;IAC1H,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,GAAG,GAAG,SAAS,CAAqB,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACnG,MAAM,GAAG,GAAG,SAAS,CAAqB,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACnG,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAuC,EACvC,QAAuC;IAEvC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9C,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,YAAY,CAA+B,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAEzH,qEAAqE;IACrE,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;QAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,OAAO,IAAI,0BAA0B,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,KAAK;QACR,GAAG,QAAQ;QACX,KAAK;QACL,QAAQ;QACR,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;KAClC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useRangeField.d.ts","sourceRoot":"","sources":["../src/useRangeField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAyB,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjE,sGAAsG;AACtG,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3C,MAAM,MAAM,eAAe,CAAC,GAAG,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG;IAAE,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC;AAE3H,MAAM,MAAM,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,IACtE,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;AAE9E,MAAM,WAAW,kBAAmB,SAAQ,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,eAAe;IAClG,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,CAMjG;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,EACtE,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,EACrC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,kBAAkB,CAmCpB"}
1
+ {"version":3,"file":"useRangeField.d.ts","sourceRoot":"","sources":["../src/useRangeField.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAoC,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1G,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEjE,sGAAsG;AACtG,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3C,MAAM,MAAM,eAAe,CAAC,GAAG,GAAG,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG;IAAE,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,GAAG,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,CAAC;AAE3H,MAAM,MAAM,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,IACtE,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;AAE9E,MAAM,WAAW,kBAAmB,SAAQ,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,eAAe;IAClG,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,CAMjG;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,GAAG,GAAG,EACtE,IAAI,EAAE,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,EACrC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,kBAAkB,CAgCpB"}
@@ -1,7 +1,7 @@
1
1
  import { useFieldCore } from './field.js';
2
2
  import { useFieldContext } from './FieldContext.js';
3
3
  import { resolveIn } from './resolve.js';
4
- import { clamp, resolveNumeric } from './numeric.js';
4
+ import { fit as fitNumber, resolveNumeric } from './numeric.js';
5
5
  function order([from, to]) {
6
6
  return from <= to ? [from, to] : [to, from];
7
7
  }
@@ -37,10 +37,7 @@ export function useRangeField(opts, registry) {
37
37
  const initialValue = () => rangeInitialValue(opts, ctx, opts.id);
38
38
  const field = useFieldCore('range', inside ? { ...opts, initialValue } : opts, registry);
39
39
  /** An end clamped into the bounds, then rounded when `integer`. */
40
- const fit = (n) => {
41
- const clamped = clamp(n, min, max);
42
- return resolved.integer ? Math.round(clamped) : clamped;
43
- };
40
+ const fit = (n) => fitNumber(n, min, max, resolved.integer);
44
41
  const value = order([fit(field.value[0]), fit(field.value[1])]);
45
42
  const setValue = (next) => {
46
43
  if (!Number.isFinite(next[0]) || !Number.isFinite(next[1])) {
@@ -1 +1 @@
1
- {"version":3,"file":"useRangeField.js","sourceRoot":"","sources":["../src/useRangeField.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useRangeField.js","sourceRoot":"","sources":["../src/useRangeField.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vultus-core",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Framework-neutral action model + hooks for vultus (antd-free by design)",
6
6
  "repository": {
package/src/index.ts CHANGED
@@ -1,4 +1,8 @@
1
- export * from './types.js';
1
+ // Fits is deliberately left out here: it is an internal compile-time check (see types.ts), not public API.
2
+ export type {
3
+ FormLike, Decision, ValueOrFn, Thunk, Severity, Message, ExecutionContext, ConfirmationSpec,
4
+ ActionOptions, ActionStatus, ParsedApiError, RegistryEntry, ErrorRoutesRegistry, ApiErrorContext, ActionErrorCtx,
5
+ } from './types.js';
2
6
  export * from './decision.js';
3
7
  export * from './resolve.js';
4
8
  export * from './parseApiError.js';
package/src/kinds.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { resolveChoice, type OneOfChoice, type OneOfChoiceControls } from './choices.js';
2
2
  import type { FieldBaseOptions, FieldKind } from './field.js';
3
3
  import type { FieldCtx } from './FieldContext.js';
4
- import { clamp, resolveNumeric } from './numeric.js';
4
+ import { clamp, fit, resolveNumeric } from './numeric.js';
5
5
  import { resolveIn } from './resolve.js';
6
6
  import { normalizeTreeValue, type TreeNode } from './tree.js';
7
- import type { ValueOrFn } from './types.js';
7
+ import type { Fits, ValueOrFn } from './types.js';
8
8
  import { boolInitialValue, type useBoolField } from './useBoolField.js';
9
9
  import { manyOfInitialValue, type ManyOfOwnOptions, type useManyOfField } from './useManyOfField.js';
10
10
  import { mixedBoolInitialValue, type MixedBool, type useMixedBoolField } from './useMixedBoolField.js';
@@ -38,8 +38,6 @@ export type FieldDefinition<Ctx = any> =
38
38
  | Definition<'tree', string[], TreeOwnOptions<string, Ctx>, Ctx>
39
39
  | Definition<'text', string, TextOwnOptions, Ctx>;
40
40
 
41
- /** Compiles only when `A` is assignable to `B`. */
42
- type Fits<A extends B, B> = A;
43
41
  type DefinitionOf<K extends FieldKind> = Extract<FieldDefinition, { kind: K }>;
44
42
  type HookOptions<H extends (...args: any[]) => unknown> = Parameters<H>[0];
45
43
 
@@ -135,11 +133,15 @@ function warnDropped(id: string, among: 'choices' | 'nodes', dropped: string[],
135
133
  * A stored value (already parsed by the kind's value type) made fit for the definition as it is
136
134
  * now: choices, nodes and bounds follow the data, and an old URL may not. A one-of value that is
137
135
  * not a choice becomes the initial value; many-of and tree values that are not choices or nodes
138
- * are dropped; numbers and ranges are clamped into the bounds. Each such change warns, naming
139
- * the field: the value came from outside, so it is not an error. Reordering is silent: lists
140
- * come back in choice order or normalized under the tree's selection (a store keeps them
141
- * sorted, so a warning would come on every read), and a range's ends in order. The warnings go
142
- * to `warn`, console.warn unless a caller that only summarizes (useStoredFields) silences them.
136
+ * are dropped; numbers and ranges are clamped into the bounds, then rounded when the field is
137
+ * `integer` (so a stored `2.5` reads `3`; a whole number inside the bounds, see `fit`), with one
138
+ * warning for whichever of the two actually changed the value: "outside its bounds" when
139
+ * clamping did (whether or not rounding also did), "not a whole number" ("has ends that are not
140
+ * whole numbers" for a range) when only rounding did. Each such change warns, naming the
141
+ * field: the value came from outside, so it is not an error. Reordering is silent: lists come
142
+ * back in choice order or normalized under the tree's selection (a store keeps them sorted, so a
143
+ * warning would come on every read), and a range's ends in order. The warnings go to `warn`,
144
+ * console.warn unless a caller that only summarizes (useStoredFields) silences them.
143
145
  */
144
146
  export function sanitizeStored(
145
147
  definition: FieldDefinition,
@@ -176,19 +178,28 @@ export function sanitizeStored(
176
178
  }
177
179
  case 'numeric': {
178
180
  const stored = value as number;
179
- const { min, max } = resolveNumeric(id, definition, ctx);
181
+ const { min, max, integer } = resolveNumeric(id, definition, ctx);
180
182
  const clamped = clamp(stored, min, max);
181
- if (clamped !== stored) warn(`Field '${id}': stored value ${stored} is outside its bounds, using ${clamped}`);
182
- return clamped;
183
+ const fitted = fit(stored, min, max, integer);
184
+ if (fitted !== stored) {
185
+ if (clamped !== stored) warn(`Field '${id}': stored value ${stored} is outside its bounds, using ${fitted}`);
186
+ else warn(`Field '${id}': stored value ${stored} is not a whole number, using ${fitted}`);
187
+ }
188
+ return fitted;
183
189
  }
184
190
  case 'range': {
185
191
  const stored = value as NumberRange;
186
- const { min, max } = resolveNumeric(id, definition, ctx);
187
- const from = clamp(stored[0], min, max);
188
- const to = clamp(stored[1], min, max);
192
+ const { min, max, integer } = resolveNumeric(id, definition, ctx);
193
+ const clampedChanged = clamp(stored[0], min, max) !== stored[0] || clamp(stored[1], min, max) !== stored[1];
194
+ const from = fit(stored[0], min, max, integer);
195
+ const to = fit(stored[1], min, max, integer);
189
196
  const sanitized: NumberRange = [Math.min(from, to), Math.max(from, to)];
190
197
  if (from !== stored[0] || to !== stored[1]) {
191
- warn(`Field '${id}': stored range ${rangeType.format(stored)} is outside its bounds, using ${rangeType.format(sanitized)}`);
198
+ if (clampedChanged) {
199
+ warn(`Field '${id}': stored range ${rangeType.format(stored)} is outside its bounds, using ${rangeType.format(sanitized)}`);
200
+ } else {
201
+ warn(`Field '${id}': stored range ${rangeType.format(stored)} has ends that are not whole numbers, using ${rangeType.format(sanitized)}`);
202
+ }
192
203
  }
193
204
  return sanitized;
194
205
  }
package/src/numeric.ts CHANGED
@@ -36,6 +36,18 @@ export function clamp(n: number, min?: number, max?: number): number {
36
36
  return result;
37
37
  }
38
38
 
39
+ /**
40
+ * `n` clamped into [min, max], then, when `integer` is true, rounded and kept to the whole numbers
41
+ * inside the bounds ([ceil(min), floor(max)]: with `max: 9.5`, 9.7 is 9, not 10): the rule a
42
+ * numeric or range field's shown value and requests are fit by (useNumericField, useRangeField),
43
+ * and the one `sanitizeStored` fits a stored value by.
44
+ */
45
+ export function fit(n: number, min: number | undefined, max: number | undefined, integer: boolean): number {
46
+ const clamped = clamp(n, min, max);
47
+ if (!integer) return clamped;
48
+ return clamp(Math.round(clamped), min === undefined ? undefined : Math.ceil(min), max === undefined ? undefined : Math.floor(max));
49
+ }
50
+
39
51
  /**
40
52
  * Resolves a numeric field's bounds and formatter with the field context. `format` goes by its
41
53
  * own rule, not resolveIn's, as it always receives the number first; otherwise it is treated
package/src/types.ts CHANGED
@@ -73,8 +73,8 @@ export interface ActionOptions<TArgs = void, TResult = void, RouteId extends str
73
73
  onSuccess?: (result: TResult) => void;
74
74
  }
75
75
 
76
- /** Compiles only when `A` is assignable to `B`. */
77
- type Fits<A extends B, B> = A;
76
+ /** Compiles only when `A` is assignable to `B`. Not part of the package's public API: kept here as the one definition, imported directly by the files that use it (kinds.ts), and left out of index.ts's re-export of this module. */
77
+ export type Fits<A extends B, B> = A;
78
78
 
79
79
  /**
80
80
  * A compile-time check: an action calls its options' functions with nothing, so one that takes
@@ -1,7 +1,7 @@
1
1
  import { useFieldCore, type FieldControls, type FieldOptions } from './field.js';
2
2
  import { useFieldContext, type FieldCtx } from './FieldContext.js';
3
3
  import { resolveIn } from './resolve.js';
4
- import { clamp, resolveNumeric, type NumericBounds, type ResolvedNumeric } from './numeric.js';
4
+ import { clamp, fit as fitNumber, resolveNumeric, type NumericBounds, type ResolvedNumeric } from './numeric.js';
5
5
  import type { ErrorRoutesRegistry } from './types.js';
6
6
 
7
7
  export type NumericOwnOptions<Ctx = any> = NumericBounds<Ctx>;
@@ -45,10 +45,7 @@ export function useNumericField<RouteId extends string = string, Ctx = any>(
45
45
  const field = useFieldCore<number, number, RouteId, Ctx>('numeric', inside ? { ...opts, initialValue } : opts, registry);
46
46
 
47
47
  /** A number clamped into the bounds, then rounded when `integer`. */
48
- const fit = (n: number) => {
49
- const clamped = clamp(n, resolved.min, resolved.max);
50
- return resolved.integer ? Math.round(clamped) : clamped;
51
- };
48
+ const fit = (n: number) => fitNumber(n, resolved.min, resolved.max, resolved.integer);
52
49
  const value = fit(field.value);
53
50
 
54
51
  const setValue = (next: number) => {
@@ -1,7 +1,7 @@
1
1
  import { useFieldCore, type FieldControls, type FieldOptions } from './field.js';
2
2
  import { useFieldContext, type FieldCtx } from './FieldContext.js';
3
3
  import { resolveIn } from './resolve.js';
4
- import { clamp, resolveNumeric, type NumericBounds, type ResolvedNumeric } from './numeric.js';
4
+ import { fit as fitNumber, resolveNumeric, type NumericBounds, type ResolvedNumeric } from './numeric.js';
5
5
  import type { ErrorRoutesRegistry, ValueOrFn } from './types.js';
6
6
 
7
7
  /** A `[from, to]` pair, `from <= to`. Not named `Range`, which would shadow the DOM's global type. */
@@ -59,10 +59,7 @@ export function useRangeField<RouteId extends string = string, Ctx = any>(
59
59
  const field = useFieldCore<NumberRange, NumberRange, RouteId, Ctx>('range', inside ? { ...opts, initialValue } : opts, registry);
60
60
 
61
61
  /** An end clamped into the bounds, then rounded when `integer`. */
62
- const fit = (n: number) => {
63
- const clamped = clamp(n, min, max);
64
- return resolved.integer ? Math.round(clamped) : clamped;
65
- };
62
+ const fit = (n: number) => fitNumber(n, min, max, resolved.integer);
66
63
  const value = order([fit(field.value[0]), fit(field.value[1])]);
67
64
 
68
65
  const setValue = (next: NumberRange) => {