vultus-core 0.4.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.
Files changed (120) hide show
  1. package/README.md +313 -6
  2. package/dist/ArgStoreContext.d.ts +10 -0
  3. package/dist/ArgStoreContext.d.ts.map +1 -0
  4. package/dist/ArgStoreContext.js +15 -0
  5. package/dist/ArgStoreContext.js.map +1 -0
  6. package/dist/FieldContext.d.ts +38 -0
  7. package/dist/FieldContext.d.ts.map +1 -0
  8. package/dist/FieldContext.js +82 -0
  9. package/dist/FieldContext.js.map +1 -0
  10. package/dist/argStore.d.ts +26 -0
  11. package/dist/argStore.d.ts.map +1 -0
  12. package/dist/argStore.js +27 -0
  13. package/dist/argStore.js.map +1 -0
  14. package/dist/choices.d.ts +43 -0
  15. package/dist/choices.d.ts.map +1 -0
  16. package/dist/choices.js +20 -0
  17. package/dist/choices.js.map +1 -0
  18. package/dist/field.d.ts +42 -15
  19. package/dist/field.d.ts.map +1 -1
  20. package/dist/field.js +20 -7
  21. package/dist/field.js.map +1 -1
  22. package/dist/index.d.ts +22 -5
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +20 -4
  25. package/dist/index.js.map +1 -1
  26. package/dist/kinds.d.ts +55 -0
  27. package/dist/kinds.d.ts.map +1 -0
  28. package/dist/kinds.js +158 -0
  29. package/dist/kinds.js.map +1 -0
  30. package/dist/localStorageStore.d.ts +16 -0
  31. package/dist/localStorageStore.d.ts.map +1 -0
  32. package/dist/localStorageStore.js +72 -0
  33. package/dist/localStorageStore.js.map +1 -0
  34. package/dist/normalizeText.d.ts +6 -0
  35. package/dist/normalizeText.d.ts.map +1 -0
  36. package/dist/normalizeText.js +8 -0
  37. package/dist/normalizeText.js.map +1 -0
  38. package/dist/numeric.d.ts +45 -0
  39. package/dist/numeric.d.ts.map +1 -0
  40. package/dist/numeric.js +55 -0
  41. package/dist/numeric.js.map +1 -0
  42. package/dist/resolve.d.ts +13 -0
  43. package/dist/resolve.d.ts.map +1 -1
  44. package/dist/resolve.js +25 -0
  45. package/dist/resolve.js.map +1 -1
  46. package/dist/tree.d.ts +69 -0
  47. package/dist/tree.d.ts.map +1 -0
  48. package/dist/tree.js +151 -0
  49. package/dist/tree.js.map +1 -0
  50. package/dist/types.d.ts +17 -7
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/useArg.d.ts +45 -0
  53. package/dist/useArg.d.ts.map +1 -0
  54. package/dist/useArg.js +83 -0
  55. package/dist/useArg.js.map +1 -0
  56. package/dist/useBoolField.d.ts +8 -3
  57. package/dist/useBoolField.d.ts.map +1 -1
  58. package/dist/useBoolField.js +9 -1
  59. package/dist/useBoolField.js.map +1 -1
  60. package/dist/useManyOfField.d.ts +35 -0
  61. package/dist/useManyOfField.d.ts.map +1 -0
  62. package/dist/useManyOfField.js +74 -0
  63. package/dist/useManyOfField.js.map +1 -0
  64. package/dist/useMixedBoolField.d.ts +8 -3
  65. package/dist/useMixedBoolField.d.ts.map +1 -1
  66. package/dist/useMixedBoolField.js +9 -1
  67. package/dist/useMixedBoolField.js.map +1 -1
  68. package/dist/useNumericField.d.ts +25 -0
  69. package/dist/useNumericField.d.ts.map +1 -0
  70. package/dist/useNumericField.js +49 -0
  71. package/dist/useNumericField.js.map +1 -0
  72. package/dist/useOneOfField.d.ts +18 -34
  73. package/dist/useOneOfField.d.ts.map +1 -1
  74. package/dist/useOneOfField.js +18 -18
  75. package/dist/useOneOfField.js.map +1 -1
  76. package/dist/useRangeField.d.ts +34 -0
  77. package/dist/useRangeField.d.ts.map +1 -0
  78. package/dist/useRangeField.js +60 -0
  79. package/dist/useRangeField.js.map +1 -0
  80. package/dist/useStoredField.d.ts +61 -0
  81. package/dist/useStoredField.d.ts.map +1 -0
  82. package/dist/useStoredField.js +151 -0
  83. package/dist/useStoredField.js.map +1 -0
  84. package/dist/useTextField.d.ts +22 -0
  85. package/dist/useTextField.d.ts.map +1 -0
  86. package/dist/useTextField.js +21 -0
  87. package/dist/useTextField.js.map +1 -0
  88. package/dist/useTreeField.d.ts +39 -0
  89. package/dist/useTreeField.d.ts.map +1 -0
  90. package/dist/useTreeField.js +66 -0
  91. package/dist/useTreeField.js.map +1 -0
  92. package/dist/valueTypes.d.ts +28 -0
  93. package/dist/valueTypes.d.ts.map +1 -0
  94. package/dist/valueTypes.js +65 -0
  95. package/dist/valueTypes.js.map +1 -0
  96. package/package.json +1 -1
  97. package/src/ArgStoreContext.tsx +16 -0
  98. package/src/FieldContext.tsx +98 -0
  99. package/src/argStore.ts +49 -0
  100. package/src/choices.ts +62 -0
  101. package/src/field.ts +64 -25
  102. package/src/index.ts +55 -5
  103. package/src/kinds.ts +208 -0
  104. package/src/localStorageStore.ts +68 -0
  105. package/src/normalizeText.ts +7 -0
  106. package/src/numeric.ts +80 -0
  107. package/src/resolve.ts +23 -0
  108. package/src/tree.ts +175 -0
  109. package/src/types.ts +28 -7
  110. package/src/useArg.ts +121 -0
  111. package/src/useBoolField.ts +19 -6
  112. package/src/useManyOfField.ts +107 -0
  113. package/src/useMixedBoolField.ts +19 -6
  114. package/src/useNumericField.ts +66 -0
  115. package/src/useOneOfField.ts +38 -58
  116. package/src/useRangeField.ts +83 -0
  117. package/src/useStoredField.ts +205 -0
  118. package/src/useTextField.ts +39 -0
  119. package/src/useTreeField.ts +108 -0
  120. package/src/valueTypes.ts +77 -0
package/dist/field.d.ts CHANGED
@@ -8,6 +8,13 @@ import type { ConfirmationSpec, Decision, ErrorRoutesRegistry, ExecutionContext,
8
8
  * immediate commit (`commit`), whose setter runs as an action.
9
9
  * Design notes: unitas docs/2026-10-05-vultus-field-model-design.md.
10
10
  */
11
+ /** The field kinds (FieldControls.type and a FieldDefinition's `kind`). */
12
+ export type FieldKind = 'boolean' | 'mixed-boolean' | 'oneOf' | 'manyOf' | 'numeric' | 'range' | 'tree' | 'text';
13
+ /** The widget to render a field with: a name, or a name with display options overriding its defaults. */
14
+ export type WidgetHint = string | {
15
+ name: string;
16
+ [option: string]: unknown;
17
+ };
11
18
  /** How an immediately committing field stores a change: an action that receives the requested value. */
12
19
  export interface FieldCommit<TRequest, RouteId extends string = string> {
13
20
  fire: (next: TRequest, ctx: ExecutionContext) => Promise<void> | void;
@@ -17,16 +24,30 @@ export interface FieldCommit<TRequest, RouteId extends string = string> {
17
24
  }
18
25
  /** The key of a value in `valueDescriptions`: 'true' / 'false' for booleans, the value itself for strings. */
19
26
  export type ValueKey<T> = T extends boolean ? `${T}` : T extends string | number ? `${T}` : never;
20
- interface FieldBaseOptions<TValue> {
27
+ /**
28
+ * What every field has, whatever its storage. `Ctx` is the field context the options' functions
29
+ * receive (see FieldContextProvider); a function without parameters needs none.
30
+ */
31
+ export interface FieldBaseOptions<TValue, Ctx = any> {
21
32
  id: string;
22
- label?: ValueOrFn<string>;
23
- description?: ValueOrFn<string | undefined>;
33
+ /**
34
+ * The field's kind, as a FieldDefinition carries it (optional here: a hook knows its own
35
+ * kind). Given and different from the hook's own kind, it throws — a defence against passing
36
+ * the wrong definition to a kind-specific hook.
37
+ */
38
+ kind?: FieldKind;
39
+ label?: ValueOrFn<string, Ctx>;
40
+ description?: ValueOrFn<string | undefined, Ctx>;
41
+ /** Shown while the field is empty (moxb's Value); a widget that has no notion of "empty" ignores it. */
42
+ placeholder?: ValueOrFn<string | undefined, Ctx>;
43
+ /** The widget to render this field with: a name, or a name with its display options. Each kind has a default; vultus-antd's `<Field>` applies render-site overrides on top of this. */
44
+ widget?: WidgetHint;
24
45
  /** Shown? Default true. Use `visible` or `hidden`, not contradicting each other. */
25
- visible?: ValueOrFn<boolean>;
26
- hidden?: ValueOrFn<boolean>;
46
+ visible?: ValueOrFn<boolean, Ctx>;
47
+ hidden?: ValueOrFn<boolean, Ctx>;
27
48
  /** Changeable? Default true, optionally with a reason. Use `enabled` or `disabled`, not contradicting each other. */
28
- enabled?: ValueOrFn<Decision>;
29
- disabled?: ValueOrFn<Decision>;
49
+ enabled?: ValueOrFn<Decision, Ctx>;
50
+ disabled?: ValueOrFn<Decision, Ctx>;
30
51
  /**
31
52
  * What each value means right now, keyed by value (for booleans `true` / `false`, and `mixed`
32
53
  * where the field can show it). Shown with the current value, next to `description`, which
@@ -39,10 +60,10 @@ interface FieldBaseOptions<TValue> {
39
60
  * `TValue` and can be asked for a `TRequest`; usually the same type, but an aggregate can show
40
61
  * a state that cannot be requested (a boolean field showing 'mixed').
41
62
  */
42
- export type FieldStorage<TValue, TRequest = TValue, RouteId extends string = string> =
43
- /** Inside the field: its own state, starting at `initialValue`. */
63
+ export type FieldStorage<TValue, TRequest = TValue, RouteId extends string = string, Ctx = any> =
64
+ /** Inside the field: its own state, starting at `initialValue` (resolved once, when the field mounts). */
44
65
  {
45
- initialValue?: TValue;
66
+ initialValue?: ValueOrFn<TValue, Ctx>;
46
67
  value?: never;
47
68
  onChange?: never;
48
69
  commit?: never;
@@ -61,13 +82,14 @@ export type FieldStorage<TValue, TRequest = TValue, RouteId extends string = str
61
82
  initialValue?: never;
62
83
  onChange?: never;
63
84
  };
64
- export type FieldOptions<TValue, TRequest = TValue, RouteId extends string = string> = FieldBaseOptions<TValue> & FieldStorage<TValue, TRequest, RouteId>;
85
+ export type FieldOptions<TValue, TRequest = TValue, RouteId extends string = string, Ctx = any> = FieldBaseOptions<TValue, Ctx> & FieldStorage<TValue, TRequest, RouteId, Ctx>;
65
86
  /** What a field widget receives: everything it shows, and the one way to change the value. */
66
87
  export interface FieldControls<TValue, TRequest = TValue> {
67
- type: string;
88
+ type: FieldKind;
68
89
  id: string;
69
90
  label: string;
70
91
  description: string | undefined;
92
+ placeholder: string | undefined;
71
93
  /** What the current value means (from `valueDescriptions`). */
72
94
  valueDescription: string | undefined;
73
95
  visible: boolean;
@@ -78,10 +100,13 @@ export interface FieldControls<TValue, TRequest = TValue> {
78
100
  setValue(next: TRequest): void;
79
101
  /** A commit is running. */
80
102
  pending: boolean;
103
+ /** The field stores through `commit` — true exactly in commit storage mode, so a widget can hold back requests while typing. */
104
+ commits: boolean;
81
105
  /** Messages of the last commit. */
82
106
  messages: Message[];
83
107
  /** The confirmation a widget must obtain before requesting `next`, if any. */
84
108
  confirmationFor(next: TRequest): ConfirmationSpec | undefined;
109
+ widget: WidgetHint | undefined;
85
110
  }
86
111
  export type FieldStorageMode = 'inside' | 'local' | 'commit';
87
112
  export declare function fieldStorageMode(id: string, opts: FieldStorage<unknown, unknown, string>): FieldStorageMode;
@@ -90,8 +115,10 @@ export declare function calculateEnabled(id: string, enabled: Decision | undefin
90
115
  /**
91
116
  * The shared core of every field hook: label and description, visibility and
92
117
  * enabled state (with reason), the storage mode, and in commit mode the setter
93
- * as an action (its pending state and messages become the field's).
118
+ * as an action (its pending state and messages become the field's). Functions
119
+ * among the options are resolved with the field context, on every render;
120
+ * `initialValue` once, when the field mounts. A kind's hook passes its implicit
121
+ * initial value as a zero-argument function, so that too is computed only then.
94
122
  */
95
- export declare function useFieldCore<TValue, TRequest extends TValue = TValue, RouteId extends string = string>(type: string, opts: FieldOptions<TValue, TRequest, RouteId>, registry?: ErrorRoutesRegistry<RouteId>): FieldControls<TValue, TRequest>;
96
- export {};
123
+ export declare function useFieldCore<TValue, TRequest extends TValue = TValue, RouteId extends string = string, Ctx = any>(type: FieldKind, opts: FieldOptions<TValue, TRequest, RouteId, Ctx>, registry?: ErrorRoutesRegistry<RouteId>): FieldControls<TValue, TRequest>;
97
124
  //# sourceMappingURL=field.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB;;;;;;;;GAQG;AAEH,wGAAwG;AACxG,MAAM,WAAW,WAAW,CAAC,QAAQ,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM;IACpE,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtE,wGAAwG;IACxG,YAAY,CAAC,EAAE,gBAAgB,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,KAAK,gBAAgB,GAAG,SAAS,CAAC,CAAC;IACrF,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,8GAA8G;AAC9G,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;AAElG,UAAU,gBAAgB,CAAC,MAAM;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC5C,oFAAoF;IACpF,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC5B,qHAAqH;IACrH,OAAO,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC/B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/D;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM;AACjF,mEAAmE;AACjE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE;AAC5E,kFAAkF;GAChF;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE;AAC9F,yGAAyG;GACvG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAEtG,MAAM,MAAM,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,IACjF,gBAAgB,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAErE,8FAA8F;AAC9F,MAAM,WAAW,aAAa,CAAC,MAAM,EAAE,QAAQ,GAAG,MAAM;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,+DAA+D;IAC/D,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC/B,2BAA2B;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,8EAA8E;IAC9E,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,GAAG,SAAS,CAAC;CAC/D;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7D,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAY3G;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAI/G;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAOpH;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,SAAS,MAAM,GAAG,MAAM,EAAE,OAAO,SAAS,MAAM,GAAG,MAAM,EACpG,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,EAC7C,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAkEjC"}
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"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"}
package/dist/field.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { useState } from 'react';
2
2
  import { getReason, getVerdict, invertDecision } from './decision.js';
3
- import { resolve } from './resolve.js';
3
+ import { useFieldContext } from './FieldContext.js';
4
+ import { resolveIn } from './resolve.js';
4
5
  import { useAction } from './useAction.js';
5
6
  export function fieldStorageMode(id, opts) {
6
7
  const { initialValue, value, onChange, commit } = opts;
@@ -37,15 +38,24 @@ export function calculateEnabled(id, enabled, disabled) {
37
38
  /**
38
39
  * The shared core of every field hook: label and description, visibility and
39
40
  * enabled state (with reason), the storage mode, and in commit mode the setter
40
- * as an action (its pending state and messages become the field's).
41
+ * as an action (its pending state and messages become the field's). Functions
42
+ * among the options are resolved with the field context, on every render;
43
+ * `initialValue` once, when the field mounts. A kind's hook passes its implicit
44
+ * initial value as a zero-argument function, so that too is computed only then.
41
45
  */
42
46
  export function useFieldCore(type, opts, registry) {
47
+ if (opts.kind !== undefined && opts.kind !== type) {
48
+ throw new Error(`Field '${opts.id}': a definition of kind '${opts.kind}' was passed to the '${type}' hook`);
49
+ }
43
50
  const mode = fieldStorageMode(opts.id, opts);
44
- const [inner, setInner] = useState(opts.initialValue);
45
- const label = resolve(opts.label, '');
46
- const description = resolve(opts.description, undefined);
47
- const visible = calculateVisible(opts.id, resolve(opts.visible, undefined), resolve(opts.hidden, undefined));
48
- const enabledDecision = calculateEnabled(opts.id, resolve(opts.enabled, undefined), resolve(opts.disabled, undefined));
51
+ const ctx = useFieldContext();
52
+ const where = (name) => `Field '${opts.id}': option '${name}'`;
53
+ const [inner, setInner] = useState(() => resolveIn(opts.initialValue, undefined, ctx, where('initialValue')));
54
+ const label = resolveIn(opts.label, '', ctx, where('label'));
55
+ const description = resolveIn(opts.description, undefined, ctx, where('description'));
56
+ const placeholder = resolveIn(opts.placeholder, undefined, ctx, where('placeholder'));
57
+ const visible = calculateVisible(opts.id, resolveIn(opts.visible, undefined, ctx, where('visible')), resolveIn(opts.hidden, undefined, ctx, where('hidden')));
58
+ const enabledDecision = calculateEnabled(opts.id, resolveIn(opts.enabled, undefined, ctx, where('enabled')), resolveIn(opts.disabled, undefined, ctx, where('disabled')));
49
59
  const enabled = getVerdict(enabledDecision, true);
50
60
  const whyDisabled = enabled ? undefined : getReason(enabledDecision);
51
61
  // Hooks run unconditionally; the setter action is only fired in commit mode.
@@ -81,6 +91,7 @@ export function useFieldCore(type, opts, registry) {
81
91
  id: opts.id,
82
92
  label,
83
93
  description,
94
+ placeholder,
84
95
  valueDescription,
85
96
  visible,
86
97
  enabled,
@@ -88,8 +99,10 @@ export function useFieldCore(type, opts, registry) {
88
99
  value,
89
100
  setValue,
90
101
  pending,
102
+ commits: mode === 'commit',
91
103
  messages: mode === 'commit' ? (setter.messages ?? []) : [],
92
104
  confirmationFor,
105
+ widget: opts.widget,
93
106
  };
94
107
  }
95
108
  //# sourceMappingURL=field.js.map
package/dist/field.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"field.js","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"field.js","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"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"}
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';
@@ -6,10 +6,27 @@ export * from './routeApiError.js';
6
6
  export { ActionErrorContext, useActionErrorCtx } from './useActionErrorCtx.js';
7
7
  export { useAction } from './useAction.js';
8
8
  export { useActionList } from './useActionList.js';
9
- export { useFieldCore, fieldStorageMode, calculateVisible, calculateEnabled, type FieldCommit, type FieldControls, type FieldOptions, type FieldStorage, type FieldStorageMode, type ValueKey, } from './field.js';
10
- export { useBoolField, type BoolFieldControls, type BoolFieldOptions } from './useBoolField.js';
11
- export { useMixedBoolField, aggregateBool, type MixedBool, type MixedBoolFieldControls, type MixedBoolFieldOptions, } from './useMixedBoolField.js';
12
- export { useOneOfField, type OneOfChoice, type OneOfChoiceControls, type OneOfFieldControls, type OneOfFieldOptions, } from './useOneOfField.js';
9
+ export { FieldContextProvider, createFieldContext, useFieldContext, NO_FIELD_CONTEXT, type FieldCtx, } from './FieldContext.js';
10
+ export { useFieldCore, fieldStorageMode, calculateVisible, calculateEnabled, type FieldBaseOptions, type FieldCommit, type FieldControls, type FieldOptions, type FieldStorage, type FieldStorageMode, type FieldKind, type WidgetHint, type ValueKey, } from './field.js';
11
+ export { resolveChoice, type OneOfChoice, type OneOfChoiceControls } from './choices.js';
12
+ export { normalizeText } from './normalizeText.js';
13
+ export { useBoolField, boolInitialValue, type BoolFieldControls, type BoolFieldOptions } from './useBoolField.js';
14
+ export { useMixedBoolField, aggregateBool, mixedBoolInitialValue, type MixedBool, type MixedBoolFieldControls, type MixedBoolFieldOptions, } from './useMixedBoolField.js';
15
+ export { useOneOfField, oneOfInitialValue, type OneOfFieldControls, type OneOfFieldOptions, type OneOfOwnOptions, } from './useOneOfField.js';
16
+ export { useManyOfField, manyOfInitialValue, type ManyOfFieldControls, type ManyOfFieldOptions, type ManyOfOwnOptions, type ManyOfChoiceControls, } from './useManyOfField.js';
17
+ export { clamp, resolveNumeric, type NumericBounds, type ResolvedNumeric } from './numeric.js';
18
+ export { useNumericField, numericInitialValue, type NumericFieldControls, type NumericFieldOptions, type NumericOwnOptions, } from './useNumericField.js';
19
+ export { useRangeField, rangeInitialValue, type NumberRange, type RangeFieldControls, type RangeFieldOptions, type RangeOwnOptions, } from './useRangeField.js';
20
+ export { normalizeTreeValue, coveredNodes, toggleTreeValue, expandedTreeKeys, filterTree, type TreeNode, type TreeNodeControls, type TreeSelection, type TreeExpand, } from './tree.js';
21
+ export { useTreeField, treeInitialValue, type TreeFieldControls, type TreeFieldOptions, type TreeOwnOptions, } from './useTreeField.js';
22
+ export { useTextField, textInitialValue, type TextFieldControls, type TextFieldOptions, type TextOwnOptions, } from './useTextField.js';
23
+ export { booleanType, stringType, stringSetType, numberType, rangeType, type ValueType, } from './valueTypes.js';
24
+ export { initialValueOf, valueTypeOf, sanitizeStored, type FieldDefinition } from './kinds.js';
25
+ export { memoryStore, type ArgStore, type RawChange, type UpdateMethod } from './argStore.js';
26
+ export { localStorageStore } from './localStorageStore.js';
27
+ export { ArgStoreProvider, useArgStore } from './ArgStoreContext.js';
28
+ export { useArg, useArgWriter, setArg, resetArg, type ArgDefinition, type ArgControls, type ArgChange, } from './useArg.js';
29
+ export { argOf, useStoredField, useStoredFields, type StoredField, type StoredFields, } from './useStoredField.js';
13
30
  export { InternalLinkContext, useInternalLink, type InternalLinkComponent } from './LinkContext.js';
14
31
  export { MessageSinkContext, useMessageSink, type MessageSink } from './MessageSink.js';
15
32
  export { VultusComponentsContext, useVultusComponents, SpinnerScope, useSpinnerKey, type VultusComponents, type SpinnerProps, type SpinnerComponent, } from './Components.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","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,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAClE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,QAAQ,GACjH,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EACL,iBAAiB,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,GAC1G,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,GAC3G,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EACL,uBAAuB,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EACzE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,GAChE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAC3F,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,GACjH,MAAM,YAAY,CAAC;AACpB,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,EAAE,KAAK,QAAQ,GAC3F,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAClE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EACxH,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,GAC/C,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EACL,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,EACvD,KAAK,SAAS,EAAE,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,GACxE,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,eAAe,GACxG,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EAAE,kBAAkB,EAClC,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,KAAK,oBAAoB,GACpG,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/F,OAAO,EACL,eAAe,EAAE,mBAAmB,EACpC,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,GAC5E,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,aAAa,EAAE,iBAAiB,EAChC,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,eAAe,GACxF,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAC/E,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,GAC1E,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EAAE,gBAAgB,EAC9B,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,GACnE,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EAAE,gBAAgB,EAC9B,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,GACnE,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,SAAS,GAC9E,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,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,EACtC,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,GACrD,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,GAC5E,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EACL,uBAAuB,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EACzE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,GAChE,MAAM,iBAAiB,CAAC"}
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';
@@ -6,10 +5,27 @@ export * from './routeApiError.js';
6
5
  export { ActionErrorContext, useActionErrorCtx } from './useActionErrorCtx.js';
7
6
  export { useAction } from './useAction.js';
8
7
  export { useActionList } from './useActionList.js';
8
+ export { FieldContextProvider, createFieldContext, useFieldContext, NO_FIELD_CONTEXT, } from './FieldContext.js';
9
9
  export { useFieldCore, fieldStorageMode, calculateVisible, calculateEnabled, } from './field.js';
10
- export { useBoolField } from './useBoolField.js';
11
- export { useMixedBoolField, aggregateBool, } from './useMixedBoolField.js';
12
- export { useOneOfField, } from './useOneOfField.js';
10
+ export { resolveChoice } from './choices.js';
11
+ export { normalizeText } from './normalizeText.js';
12
+ export { useBoolField, boolInitialValue } from './useBoolField.js';
13
+ export { useMixedBoolField, aggregateBool, mixedBoolInitialValue, } from './useMixedBoolField.js';
14
+ export { useOneOfField, oneOfInitialValue, } from './useOneOfField.js';
15
+ export { useManyOfField, manyOfInitialValue, } from './useManyOfField.js';
16
+ export { clamp, resolveNumeric } from './numeric.js';
17
+ export { useNumericField, numericInitialValue, } from './useNumericField.js';
18
+ export { useRangeField, rangeInitialValue, } from './useRangeField.js';
19
+ export { normalizeTreeValue, coveredNodes, toggleTreeValue, expandedTreeKeys, filterTree, } from './tree.js';
20
+ export { useTreeField, treeInitialValue, } from './useTreeField.js';
21
+ export { useTextField, textInitialValue, } from './useTextField.js';
22
+ export { booleanType, stringType, stringSetType, numberType, rangeType, } from './valueTypes.js';
23
+ export { initialValueOf, valueTypeOf, sanitizeStored } from './kinds.js';
24
+ export { memoryStore } from './argStore.js';
25
+ export { localStorageStore } from './localStorageStore.js';
26
+ export { ArgStoreProvider, useArgStore } from './ArgStoreContext.js';
27
+ export { useArg, useArgWriter, setArg, resetArg, } from './useArg.js';
28
+ export { argOf, useStoredField, useStoredFields, } from './useStoredField.js';
13
29
  export { InternalLinkContext, useInternalLink } from './LinkContext.js';
14
30
  export { MessageSinkContext, useMessageSink } from './MessageSink.js';
15
31
  export { VultusComponentsContext, useVultusComponents, SpinnerScope, useSpinnerKey, } from './Components.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,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,GAEnE,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAiD,MAAM,mBAAmB,CAAC;AAChG,OAAO,EACL,iBAAiB,EAAE,aAAa,GACjC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,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"}
@@ -0,0 +1,55 @@
1
+ import type { FieldBaseOptions, FieldKind } from './field.js';
2
+ import type { FieldCtx } from './FieldContext.js';
3
+ import type { ValueOrFn } from './types.js';
4
+ import { type ManyOfOwnOptions } from './useManyOfField.js';
5
+ import { type MixedBool } from './useMixedBoolField.js';
6
+ import { type NumericOwnOptions } from './useNumericField.js';
7
+ import { type OneOfOwnOptions } from './useOneOfField.js';
8
+ import { type NumberRange, type RangeOwnOptions } from './useRangeField.js';
9
+ import { type TextOwnOptions } from './useTextField.js';
10
+ import { type TreeOwnOptions } from './useTreeField.js';
11
+ import { type ValueType } from './valueTypes.js';
12
+ /**
13
+ * A definition of kind `K`: the kind's hook options in their inside form, with `kind` required.
14
+ * It has no `value`, `onChange` or `commit`: where the value lives is chosen by whoever runs the
15
+ * field, and a store holds the definition's initial value as its default.
16
+ */
17
+ type Definition<K extends FieldKind, V, Own, Ctx> = {
18
+ kind: K;
19
+ } & FieldBaseOptions<V, Ctx> & {
20
+ initialValue?: ValueOrFn<V, Ctx>;
21
+ } & Own;
22
+ /**
23
+ * A field as plain data (a module's filters, a dialog's options), tagged by its kind. Narrowed
24
+ * by `kind`, a definition is its kind's hook options as they are: `useOneOfField(definition)`.
25
+ * Its functions receive the field context `Ctx` (see FieldContextProvider).
26
+ */
27
+ export type FieldDefinition<Ctx = any> = Definition<'boolean', boolean, {}, Ctx> | Definition<'mixed-boolean', MixedBool, {}, Ctx> | Definition<'oneOf', string, OneOfOwnOptions<string, Ctx>, Ctx> | Definition<'manyOf', string[], ManyOfOwnOptions<string, Ctx>, Ctx> | Definition<'numeric', number, NumericOwnOptions<Ctx>, Ctx> | Definition<'range', NumberRange, RangeOwnOptions<Ctx>, Ctx> | Definition<'tree', string[], TreeOwnOptions<string, Ctx>, Ctx> | Definition<'text', string, TextOwnOptions, Ctx>;
28
+ /**
29
+ * A definition's default: `initialValue` resolved with the field context, else its kind's
30
+ * implicit initial value (false; the first enabled choice; the empty list; `min`, or 0, clamped
31
+ * into the bounds; `[min, max]`; the empty string). A tree's comes normalized under its
32
+ * selection, as the hook shows it, so a value equal to what the field shows by default is equal
33
+ * to the default too. It is what a store falls back to, what a reset restores, and what "is it
34
+ * set?" compares against; the kind's hook starts at the same value.
35
+ */
36
+ export declare function initialValueOf(definition: FieldDefinition, ctx: FieldCtx): unknown;
37
+ /** How a kind's value is kept in a store. A mixed-boolean field shows an aggregate of other data, so it has none and throws. */
38
+ export declare function valueTypeOf(kind: FieldKind): ValueType<any>;
39
+ /**
40
+ * A stored value (already parsed by the kind's value type) made fit for the definition as it is
41
+ * now: choices, nodes and bounds follow the data, and an old URL may not. A one-of value that is
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, 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.
52
+ */
53
+ export declare function sanitizeStored(definition: FieldDefinition, value: unknown, ctx: FieldCtx, warn?: (message: string) => void): unknown;
54
+ export {};
55
+ //# sourceMappingURL=kinds.d.ts.map
@@ -0,0 +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,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 ADDED
@@ -0,0 +1,158 @@
1
+ import { resolveChoice } from './choices.js';
2
+ import { clamp, fit, resolveNumeric } from './numeric.js';
3
+ import { resolveIn } from './resolve.js';
4
+ import { normalizeTreeValue } from './tree.js';
5
+ import { boolInitialValue } from './useBoolField.js';
6
+ import { manyOfInitialValue } from './useManyOfField.js';
7
+ import { mixedBoolInitialValue } from './useMixedBoolField.js';
8
+ import { numericInitialValue } from './useNumericField.js';
9
+ import { oneOfInitialValue } from './useOneOfField.js';
10
+ import { rangeInitialValue } from './useRangeField.js';
11
+ import { textInitialValue } from './useTextField.js';
12
+ import { treeInitialValue } from './useTreeField.js';
13
+ import { booleanType, numberType, rangeType, stringSetType, stringType } from './valueTypes.js';
14
+ const NOT_STORABLE = 'a mixed-boolean field is an aggregate of other data and cannot be stored';
15
+ /** A definition whose kind is none of FieldKind's (plain data can carry anything): fail loudly rather than give nothing. */
16
+ function unknownKind(definition) {
17
+ const { id, kind } = definition;
18
+ throw new Error(`Field '${id}': unknown kind '${String(kind)}'`);
19
+ }
20
+ /** The choices of a one-of or many-of definition, resolved as the hooks resolve them. */
21
+ function choicesOf(definition, ctx) {
22
+ const { id, choices } = definition;
23
+ return resolveIn(choices, [], ctx, `Field '${id}': option 'choices'`).map((c) => resolveChoice(id, c));
24
+ }
25
+ /** Every node's value, at any depth. */
26
+ function nodeValues(nodes, into = new Set()) {
27
+ for (const node of nodes) {
28
+ into.add(node.value);
29
+ if (node.children)
30
+ nodeValues(node.children, into);
31
+ }
32
+ return into;
33
+ }
34
+ /** A tree definition's nodes, resolved as useTreeField resolves them. */
35
+ function nodesOf(definition, ctx) {
36
+ return resolveIn(definition.nodes, [], ctx, `Field '${definition.id}': option 'nodes'`);
37
+ }
38
+ /**
39
+ * A definition's default: `initialValue` resolved with the field context, else its kind's
40
+ * implicit initial value (false; the first enabled choice; the empty list; `min`, or 0, clamped
41
+ * into the bounds; `[min, max]`; the empty string). A tree's comes normalized under its
42
+ * selection, as the hook shows it, so a value equal to what the field shows by default is equal
43
+ * to the default too. It is what a store falls back to, what a reset restores, and what "is it
44
+ * set?" compares against; the kind's hook starts at the same value.
45
+ */
46
+ export function initialValueOf(definition, ctx) {
47
+ const { id } = definition;
48
+ switch (definition.kind) {
49
+ case 'boolean': return boolInitialValue(definition, ctx, id);
50
+ case 'mixed-boolean': return mixedBoolInitialValue(definition, ctx, id);
51
+ case 'oneOf': return oneOfInitialValue(definition, ctx, id, choicesOf(definition, ctx));
52
+ case 'manyOf': return manyOfInitialValue(definition, ctx, id);
53
+ case 'numeric': return numericInitialValue(definition, ctx, id);
54
+ case 'range': return rangeInitialValue(definition, ctx, id);
55
+ case 'tree':
56
+ return normalizeTreeValue(nodesOf(definition, ctx), treeInitialValue(definition, ctx, id), definition.selection ?? 'topmost');
57
+ case 'text': return textInitialValue(definition, ctx, id);
58
+ default: return unknownKind(definition);
59
+ }
60
+ }
61
+ /** How a kind's value is kept in a store. A mixed-boolean field shows an aggregate of other data, so it has none and throws. */
62
+ export function valueTypeOf(kind) {
63
+ switch (kind) {
64
+ case 'boolean': return booleanType;
65
+ case 'oneOf':
66
+ case 'text': return stringType;
67
+ case 'manyOf':
68
+ case 'tree': return stringSetType;
69
+ case 'numeric': return numberType;
70
+ case 'range': return rangeType;
71
+ case 'mixed-boolean': throw new Error(NOT_STORABLE);
72
+ default: throw new Error(`unknown field kind '${String(kind)}'`);
73
+ }
74
+ }
75
+ function warnDropped(id, among, dropped, warn) {
76
+ if (dropped.length === 0)
77
+ return;
78
+ const listed = [...new Set(dropped)].map((v) => `'${v}'`).join(', ');
79
+ warn(`Field '${id}': dropping stored values that are not among its ${among}: ${listed}`);
80
+ }
81
+ /**
82
+ * A stored value (already parsed by the kind's value type) made fit for the definition as it is
83
+ * now: choices, nodes and bounds follow the data, and an old URL may not. A one-of value that is
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, 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.
94
+ */
95
+ export function sanitizeStored(definition, value, ctx, warn = (message) => console.warn(message)) {
96
+ const { id } = definition;
97
+ switch (definition.kind) {
98
+ case 'boolean':
99
+ case 'text':
100
+ return value;
101
+ case 'mixed-boolean':
102
+ throw new Error(`Field '${id}': ${NOT_STORABLE}`);
103
+ case 'oneOf': {
104
+ const choices = choicesOf(definition, ctx);
105
+ if (choices.some((c) => c.value === value))
106
+ return value;
107
+ const fallback = oneOfInitialValue(definition, ctx, id, choices);
108
+ if (fallback !== value)
109
+ warn(`Field '${id}': stored value '${value}' is not one of its choices, using '${fallback}'`);
110
+ return fallback;
111
+ }
112
+ case 'manyOf': {
113
+ const stored = value;
114
+ const known = choicesOf(definition, ctx).map((c) => c.value);
115
+ warnDropped(id, 'choices', stored.filter((v) => !known.includes(v)), warn);
116
+ return known.filter((v) => stored.includes(v));
117
+ }
118
+ case 'tree': {
119
+ const stored = value;
120
+ const nodes = nodesOf(definition, ctx);
121
+ const known = nodeValues(nodes);
122
+ warnDropped(id, 'nodes', stored.filter((v) => !known.has(v)), warn);
123
+ return normalizeTreeValue(nodes, stored.filter((v) => known.has(v)), definition.selection ?? 'topmost');
124
+ }
125
+ case 'numeric': {
126
+ const stored = value;
127
+ const { min, max, integer } = resolveNumeric(id, definition, ctx);
128
+ const clamped = clamp(stored, min, max);
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;
137
+ }
138
+ case 'range': {
139
+ const stored = value;
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);
144
+ const sanitized = [Math.min(from, to), Math.max(from, to)];
145
+ if (from !== stored[0] || to !== stored[1]) {
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
+ }
152
+ }
153
+ return sanitized;
154
+ }
155
+ default: return unknownKind(definition);
156
+ }
157
+ }
158
+ //# sourceMappingURL=kinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinds.js","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ArgStore } from './argStore.js';
2
+ /**
3
+ * An ArgStore over `window.localStorage` (Praeceptor's print options), items kept under
4
+ * `${prefix}.${key}`. Guarded for SSR/Node (`typeof window === 'undefined'`), so creating one
5
+ * outside a browser does not crash: reads then give `undefined` and writes are no-ops. A browser
6
+ * may block storage (a sandboxed frame, blocked site data) or refuse a write (quota), and then
7
+ * reaching or using `localStorage` throws: a read that fails reads as absent and a write that
8
+ * fails is skipped, with one warning per store rather than one per call.
9
+ *
10
+ * A write notifies this store's own subscribers; a `storage` event (another tab changed a key
11
+ * under the prefix) notifies them too. The store listens for that event on `window` only while
12
+ * it has subscribers, so a store that is dropped leaves no listener behind; still, create one
13
+ * once (outside render, or in `useMemo`) rather than on every render.
14
+ */
15
+ export declare function localStorageStore(prefix: string): ArgStore;
16
+ //# sourceMappingURL=localStorageStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localStorageStore.d.ts","sourceRoot":"","sources":["../src/localStorageStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAoD1D"}