@reformer/core 9.0.0-beta.2 → 9.1.0

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 (101) hide show
  1. package/dist/behaviors-node-BMOI2JJF.js +26 -0
  2. package/dist/behaviors-value-lCpqicfa.js +148 -0
  3. package/dist/behaviors.d.ts +2 -133
  4. package/dist/behaviors.js +29 -28
  5. package/dist/{core/utils → form}/aggregate-signals.d.ts +2 -2
  6. package/dist/form/behaviors-node.d.ts +55 -0
  7. package/dist/form/behaviors.d.ts +133 -0
  8. package/dist/{core/utils → form}/create-form.d.ts +5 -4
  9. package/dist/{core/utils → form}/error-handler.d.ts +1 -1
  10. package/dist/{core → form}/factories/node-factory.d.ts +1 -1
  11. package/dist/{core/utils → form}/form-proxy-builder.d.ts +2 -2
  12. package/dist/{hooks → form/hooks}/types.d.ts +1 -1
  13. package/dist/{hooks → form/hooks}/useArrayLength.d.ts +1 -1
  14. package/dist/{hooks → form/hooks}/useFormControl.d.ts +3 -3
  15. package/dist/{hooks → form/hooks}/useFormControlValue.d.ts +2 -2
  16. package/dist/form/index.d.ts +36 -0
  17. package/dist/{core → form}/nodes/array-node.d.ts +1 -1
  18. package/dist/{core → form}/nodes/field-node.d.ts +1 -1
  19. package/dist/{core → form}/nodes/form-node.d.ts +1 -1
  20. package/dist/{core → form}/nodes/group-node.d.ts +2 -2
  21. package/dist/{core → form}/nodes/model-array-node.d.ts +2 -2
  22. package/dist/{core/utils → form}/signal-node-registry.d.ts +1 -1
  23. package/dist/{core/utils → form}/status-machine.d.ts +1 -1
  24. package/dist/{core/utils → form}/type-guards.d.ts +5 -5
  25. package/dist/{core/types/index.d.ts → form/types/contracts.d.ts} +11 -90
  26. package/dist/form/types/index.d.ts +91 -0
  27. package/dist/{core → form}/types/schema-node.d.ts +1 -1
  28. package/dist/{core → form}/types/validation-schema.d.ts +1 -1
  29. package/dist/{core/model/validate-model.d.ts → form/validate-model-core.d.ts} +25 -25
  30. package/dist/form/validate-model.d.ts +27 -0
  31. package/dist/form/validators.d.ts +6 -0
  32. package/dist/form-model-C8Fi83k4.js +439 -0
  33. package/dist/index.d.ts +11 -16
  34. package/dist/index.js +663 -1016
  35. package/dist/{core/model/behaviors.d.ts → state/behaviors-value.d.ts} +0 -53
  36. package/dist/state/form-model.d.ts +26 -0
  37. package/dist/state/index.d.ts +31 -0
  38. package/dist/{core/utils → state}/safe-effect.d.ts +4 -4
  39. package/dist/{core/model → state}/types.d.ts +14 -11
  40. package/dist/state.d.ts +2 -0
  41. package/dist/state.js +19 -0
  42. package/dist/validators/email.d.ts +1 -1
  43. package/dist/validators/future-date.d.ts +1 -1
  44. package/dist/validators/integer.d.ts +1 -1
  45. package/dist/validators/is-date.d.ts +1 -1
  46. package/dist/validators/is-number.d.ts +1 -1
  47. package/dist/validators/max-age.d.ts +1 -1
  48. package/dist/validators/max-date.d.ts +1 -1
  49. package/dist/validators/max-length.d.ts +1 -1
  50. package/dist/validators/max.d.ts +1 -1
  51. package/dist/validators/min-age.d.ts +1 -1
  52. package/dist/validators/min-date.d.ts +1 -1
  53. package/dist/validators/min-length.d.ts +1 -1
  54. package/dist/validators/min.d.ts +1 -1
  55. package/dist/validators/multiple-of.d.ts +1 -1
  56. package/dist/validators/non-negative.d.ts +1 -1
  57. package/dist/validators/non-zero.d.ts +1 -1
  58. package/dist/validators/past-date.d.ts +1 -1
  59. package/dist/validators/pattern.d.ts +1 -1
  60. package/dist/validators/phone.d.ts +1 -1
  61. package/dist/validators/required.d.ts +1 -1
  62. package/dist/validators/url.d.ts +1 -1
  63. package/dist/validators.d.ts +6 -6
  64. package/llms.txt +161 -147
  65. package/package.json +5 -1
  66. package/dist/behaviors-Br4Im38V.js +0 -263
  67. package/dist/core/model/form-model.d.ts +0 -18
  68. package/dist/core/model/index.d.ts +0 -12
  69. package/dist/core/utils/index.d.ts +0 -18
  70. /package/dist/{core → form}/factories/index.d.ts +0 -0
  71. /package/dist/{core/utils → form}/form-submitter.d.ts +0 -0
  72. /package/dist/{hooks → form/hooks}/useSignalSubscription.d.ts +0 -0
  73. /package/dist/{core → form}/types/deep-schema.d.ts +0 -0
  74. /package/dist/{core → form}/types/form-proxy.d.ts +0 -0
  75. /package/dist/{core/utils → form}/unique-id.d.ts +0 -0
  76. /package/dist/{core → form}/validation/index.d.ts +0 -0
  77. /package/dist/{core → form}/validation/validators/date-utils.d.ts +0 -0
  78. /package/dist/{core → form}/validation/validators/email.d.ts +0 -0
  79. /package/dist/{core → form}/validation/validators/future-date.d.ts +0 -0
  80. /package/dist/{core → form}/validation/validators/index.d.ts +0 -0
  81. /package/dist/{core → form}/validation/validators/integer.d.ts +0 -0
  82. /package/dist/{core → form}/validation/validators/is-date.d.ts +0 -0
  83. /package/dist/{core → form}/validation/validators/is-number.d.ts +0 -0
  84. /package/dist/{core → form}/validation/validators/max-age.d.ts +0 -0
  85. /package/dist/{core → form}/validation/validators/max-date.d.ts +0 -0
  86. /package/dist/{core → form}/validation/validators/max-length.d.ts +0 -0
  87. /package/dist/{core → form}/validation/validators/max.d.ts +0 -0
  88. /package/dist/{core → form}/validation/validators/min-age.d.ts +0 -0
  89. /package/dist/{core → form}/validation/validators/min-date.d.ts +0 -0
  90. /package/dist/{core → form}/validation/validators/min-length.d.ts +0 -0
  91. /package/dist/{core → form}/validation/validators/min.d.ts +0 -0
  92. /package/dist/{core → form}/validation/validators/multiple-of.d.ts +0 -0
  93. /package/dist/{core → form}/validation/validators/non-negative.d.ts +0 -0
  94. /package/dist/{core → form}/validation/validators/non-zero.d.ts +0 -0
  95. /package/dist/{core → form}/validation/validators/past-date.d.ts +0 -0
  96. /package/dist/{core → form}/validation/validators/pattern.d.ts +0 -0
  97. /package/dist/{core → form}/validation/validators/phone.d.ts +0 -0
  98. /package/dist/{core → form}/validation/validators/required.d.ts +0 -0
  99. /package/dist/{core → form}/validation/validators/url.d.ts +0 -0
  100. /package/dist/{core/utils → state}/derived-registry.d.ts +0 -0
  101. /package/dist/{core/utils → state}/subscription-manager.d.ts +0 -0
package/llms.txt CHANGED
@@ -242,7 +242,7 @@ model.properties.length; // реактивная длина
242
242
  ```typescript
243
243
  // Модель данных (источник истины значений)
244
244
  createModel<T extends object>(initial: T): FormModel<T>
245
- // model.get() / model.set(partial) / model.patch(partial) / model.isDirty()
245
+ // model.get() / model.set(full) / model.patch(partial) / model.isDirty()
246
246
  // model.reset() / model.captureInitial() / model.signalAt(path)
247
247
  // model.$.field → PathAwareSignal<FieldType> (escape-hatch к сигналу)
248
248
  // model.arrayField → ModelArray<Item> (push/removeAt/insertAt/move/swap/clear/at/map/length)
@@ -937,20 +937,21 @@ const form = createForm<MyForm>({ model, schema });
937
937
 
938
938
  ### Nested Objects
939
939
 
940
- Вложенная группа — обычный объект под-узлов, привязанных к сигналам под-модели
941
- (`model.$.address.city`). Удобно вынести в builder, принимающий `ModelSignals<Sub>`:
940
+ Вложенная группа модели — это сама по себе под-модель `FormModel<Sub>` (доступна как `model.<group>`,
941
+ с `.$`/API). Удобно вынести в builder, принимающий `FormModel<Sub>` — симметрично builder'у элемента
942
+ массива. Сигналы под-модели идентичны корневым: `model.address.$.city === model.$.address.city`.
942
943
 
943
944
  ```typescript
944
- import type { ModelSignals } from '@reformer/core';
945
+ import type { FormModel } from '@reformer/core';
945
946
 
946
- const addressNodes = (s: ModelSignals<Address>) => ({
947
- street: { value: s.street, component: Input, componentProps: { label: 'Street' } },
948
- city: { value: s.city, component: Input, componentProps: { label: 'City' } },
949
- zip: { value: s.zip, component: Input, componentProps: { label: 'ZIP' } },
947
+ const addressNodes = (m: FormModel<Address>) => ({
948
+ street: { value: m.$.street, component: Input, componentProps: { label: 'Street' } },
949
+ city: { value: m.$.city, component: Input, componentProps: { label: 'City' } },
950
+ zip: { value: m.$.zip, component: Input, componentProps: { label: 'ZIP' } },
950
951
  });
951
952
 
952
953
  const schema = {
953
- address: addressNodes(model.$.address),
954
+ address: addressNodes(model.address),
954
955
  };
955
956
  ```
956
957
 
@@ -1963,11 +1964,12 @@ const count = useArrayLength(control.items);
1963
1964
  // value-доступ (реактивно внутри effect/computed, запись присваиванием)
1964
1965
  model.email; // читать
1965
1966
  model.email = 'a@b.c'; // писать
1966
- model.address.city; // вложенное поле
1967
+ model.address.city; // вложенное поле (model.address — под-модель FormModel<Address>)
1967
1968
 
1968
1969
  // через сигнал (escape-hatch)
1969
1970
  model.$.email.value; // реактивное чтение/запись
1970
1971
  model.$.email.peek(); // нереактивный снимок
1972
+ model.$.address.city.value; // сигнал вложенного поля (≡ model.address.$.city у под-модели)
1971
1973
 
1972
1974
  // весь объект
1973
1975
  model.get(); // снимок { email, address: { city }, ... } — для submit
@@ -2962,7 +2964,7 @@ A: Передай в колбэк под-схему только этого по
2962
2964
  // Модель (источник истины значений):
2963
2965
  interface ModelApi<T> {
2964
2966
  get(): T; // снимок значений — для submit
2965
- set(value: Partial<T>): void; // массовая замена (load с сервера)
2967
+ set(value: T): void; // полная установка (все ключи T)
2966
2968
  patch(value: Partial<T>): void; // частичное слияние
2967
2969
  isDirty(): boolean; // отличаются ли значения от initial-снимка
2968
2970
  reset(): void; // вернуть к initial-снимку
@@ -3083,7 +3085,7 @@ import { createModel, validateModel } from '@reformer/core';
3083
3085
 
3084
3086
  async function processFormPayload(rawData: Partial<MyForm>) {
3085
3087
  const model = createModel<MyForm>(initialValues);
3086
- model.set(rawData); // load данных
3088
+ model.patch(rawData); // частичный load данных
3087
3089
 
3088
3090
  const result = await validateModel(model, schema); // без нод — просто данные
3089
3091
  if (!result.valid) return { ok: false, errors: result.errors };
@@ -3166,8 +3168,8 @@ race-guard через deps). Динамические `componentProps` (опци
3166
3168
 
3167
3169
  ```typescript
3168
3170
  // Модель:
3169
- model.set(value: Partial<T>): void; // массовая замена (load с сервера). Не меняет initial.
3170
- model.patch(value: Partial<T>): void; // частичное слияние (алиас set по семантике merge)
3171
+ model.set(value: T): void; // полная установка значений (load полного DTO). Не меняет initial.
3172
+ model.patch(value: Partial<T>): void; // частичное слияние (только переданные ключи). Не меняет initial.
3171
3173
  model.reset(): void; // вернуть к initial-снимку
3172
3174
  model.captureInitial(): void; // сделать текущие значения новым initial-снимком
3173
3175
 
@@ -3695,7 +3697,7 @@ _Auto-generated from JSDoc on public exports._
3695
3697
  export type AnyFunction = (...args: never[]) => unknown;
3696
3698
  ```
3697
3699
 
3698
- _Source: src/core/types/index.ts_
3700
+ _Source: src/form/types/index.ts_
3699
3701
 
3700
3702
  ### ArrayConfig
3701
3703
 
@@ -3711,7 +3713,7 @@ export interface ArrayConfig<T extends object> {
3711
3713
  }
3712
3714
  ```
3713
3715
 
3714
- _Source: src/core/types/deep-schema.ts_
3716
+ _Source: src/form/types/deep-schema.ts_
3715
3717
 
3716
3718
  ### ArrayControlState
3717
3719
 
@@ -3877,7 +3879,7 @@ Add Phone
3877
3879
  - {@link useFormControl} - хук для получения состояния
3878
3880
  - {@link FieldControlState} - состояние для полей
3879
3881
 
3880
- _Source: src/hooks/types.ts_
3882
+ _Source: src/form/hooks/types.ts_
3881
3883
 
3882
3884
  ### ArrayNode
3883
3885
 
@@ -3906,7 +3908,7 @@ array.at(0)?.title.setValue('Updated');
3906
3908
  console.log(array.length.value); // 1
3907
3909
  ```
3908
3910
 
3909
- _Source: src/core/nodes/array-node.ts_
3911
+ _Source: src/form/nodes/array-node.ts_
3910
3912
 
3911
3913
  ### ArrayNodeLike
3912
3914
 
@@ -3923,7 +3925,7 @@ export interface ArrayNodeLike {
3923
3925
  }
3924
3926
  ```
3925
3927
 
3926
- _Source: src/core/types/index.ts_
3928
+ _Source: src/form/types/index.ts_
3927
3929
 
3928
3930
  ### AsyncValidator
3929
3931
 
@@ -3945,7 +3947,7 @@ export type AsyncValidator<TForm, TField> = (
3945
3947
  потребляется — живой async-путь узла поля использует `AsyncValidatorFn` `(value, { signal })`.
3946
3948
  Экспортируется только ради обратной совместимости.
3947
3949
 
3948
- _Source: src/core/types/validation-schema.ts_
3950
+ _Source: src/form/types/validation-schema.ts_
3949
3951
 
3950
3952
  ### AsyncValidatorFn
3951
3953
 
@@ -3985,7 +3987,7 @@ const emailExistsAbortable: AsyncValidatorFn<string> = async (value, options) =>
3985
3987
  };
3986
3988
  ```
3987
3989
 
3988
- _Source: src/core/types/index.ts_
3990
+ _Source: src/form/types/contracts.ts_
3989
3991
 
3990
3992
  ### AsyncValidatorOptions
3991
3993
 
@@ -4004,7 +4006,7 @@ export interface AsyncValidatorOptions {
4004
4006
  }
4005
4007
  ```
4006
4008
 
4007
- _Source: src/core/types/index.ts_
4009
+ _Source: src/form/types/contracts.ts_
4008
4010
 
4009
4011
  ### BehaviorCleanup
4010
4012
 
@@ -4017,7 +4019,7 @@ _Source: src/core/types/index.ts_
4017
4019
  export type BehaviorCleanup = () => void;
4018
4020
  ```
4019
4021
 
4020
- _Source: src/core/model/behaviors.ts_
4022
+ _Source: src/state/behaviors-value.ts_
4021
4023
 
4022
4024
  ### computeFrom
4023
4025
 
@@ -4048,7 +4050,7 @@ export function computeFrom<R>(
4048
4050
  computeFrom([model.$.price, model.$.qty], model.$.total, (price, qty) => price * qty);
4049
4051
  ```
4050
4052
 
4051
- _Source: src/core/model/behaviors.ts_
4053
+ _Source: src/state/behaviors-value.ts_
4052
4054
 
4053
4055
  ### ConditionFn
4054
4056
 
@@ -4064,7 +4066,7 @@ export type ConditionFn<T> = (value: T) => boolean;
4064
4066
  **Deprecated:** Осиротевший остаток удалённого оператора `applyWhen` (Ф7). Рантаймом не
4065
4067
  потребляется; экспортируется только ради обратной совместимости.
4066
4068
 
4067
- _Source: src/core/types/validation-schema.ts_
4069
+ _Source: src/form/types/validation-schema.ts_
4068
4070
 
4069
4071
  ### ConfigWithSchema
4070
4072
 
@@ -4080,7 +4082,7 @@ export interface ConfigWithSchema {
4080
4082
  }
4081
4083
  ```
4082
4084
 
4083
- _Source: src/core/types/index.ts_
4085
+ _Source: src/form/types/index.ts_
4084
4086
 
4085
4087
  ### ConfigWithValue
4086
4088
 
@@ -4095,7 +4097,7 @@ export interface ConfigWithValue {
4095
4097
  }
4096
4098
  ```
4097
4099
 
4098
- _Source: src/core/types/index.ts_
4100
+ _Source: src/form/types/index.ts_
4099
4101
 
4100
4102
  ### copyFrom
4101
4103
 
@@ -4118,7 +4120,7 @@ export function copyFrom<T>(
4118
4120
  copyFrom(model.$.email, model.$.emailAdditional, { when: () => model.sameEmail });
4119
4121
  ```
4120
4122
 
4121
- _Source: src/core/model/behaviors.ts_
4123
+ _Source: src/state/behaviors-value.ts_
4122
4124
 
4123
4125
  ### createForm
4124
4126
 
@@ -4174,7 +4176,7 @@ form.email.setValue('test@mail.com');
4174
4176
  const { valid } = await validateFormModel(model, schema);
4175
4177
  ```
4176
4178
 
4177
- _Source: src/core/utils/create-form.ts_
4179
+ _Source: src/form/create-form.ts_
4178
4180
 
4179
4181
  ### createFormFromModel
4180
4182
 
@@ -4217,6 +4219,7 @@ const schema = {
4217
4219
  component: Section,
4218
4220
  children: [
4219
4221
  { value: model.$.email, component: Input, validators: [required] },
4222
+ // вложенная группа: `model.$.profile.name` (≡ под-модель `model.profile.$.name` — тот же сигнал)
4220
4223
  { value: model.$.profile.name, component: Input },
4221
4224
  ],
4222
4225
  };
@@ -4231,7 +4234,7 @@ console.log(model.email); // 'user@mail.com'
4231
4234
  **See also:**
4232
4235
  - {@link createForm} - основная фабрика (диспетчеризует сюда при аргументе `{ model, schema }`)
4233
4236
 
4234
- _Source: src/core/utils/create-form.ts_
4237
+ _Source: src/form/create-form.ts_
4235
4238
 
4236
4239
  ### CreateFormFromModelArgs
4237
4240
 
@@ -4258,7 +4261,7 @@ export interface CreateFormFromModelArgs<T> {
4258
4261
  }
4259
4262
  ```
4260
4263
 
4261
- _Source: src/core/utils/create-form.ts_
4264
+ _Source: src/form/create-form.ts_
4262
4265
 
4263
4266
  ### createModel
4264
4267
 
@@ -4279,14 +4282,22 @@ export function createModel<T extends object>(initial: T): FormModel<T>
4279
4282
  **Examples:**
4280
4283
 
4281
4284
  ```typescript
4282
- const model = createModel<{ email: string; tags: string[] }>({ email: '', tags: [] });
4285
+ const model = createModel<{ email: string; profile: { name: string }; tags: string[] }>({
4286
+ email: '',
4287
+ profile: { name: '' },
4288
+ tags: [],
4289
+ });
4283
4290
  model.email = 'a@b.c';
4284
- model.$.email.value; // 'a@b.c' (сигнал)
4291
+ model.$.email.value; // 'a@b.c' (сигнал)
4292
+ // вложенная объект-группа — под-модель FormModel (value-доступ + `.$` + API):
4293
+ model.profile.name = 'Ada'; // value-запись
4294
+ model.$.profile.name.value; // 'Ada' (сигнал; ≡ model.profile.$.name у под-модели)
4295
+ model.profile.get(); // { name: 'Ada' }
4285
4296
  model.tags.push('x');
4286
- model.get(); // { email: 'a@b.c', tags: ['x'] }
4297
+ model.get(); // { email: 'a@b.c', profile: { name: 'Ada' }, tags: ['x'] }
4287
4298
  ```
4288
4299
 
4289
- _Source: src/core/model/form-model.ts_
4300
+ _Source: src/state/form-model.ts_
4290
4301
 
4291
4302
  ### disableWhen
4292
4303
 
@@ -4318,7 +4329,7 @@ export function disableWhen(
4318
4329
  disableWhen(model.$.discount, () => model.plan !== 'promo', { resetOnDisable: true });
4319
4330
  ```
4320
4331
 
4321
- _Source: src/core/model/behaviors.ts_
4332
+ _Source: src/form/behaviors-node.ts_
4322
4333
 
4323
4334
  ### email
4324
4335
 
@@ -4355,7 +4366,7 @@ validators: [required(), email({ message: 'Введите корректный e
4355
4366
  },
4356
4367
  ```
4357
4368
 
4358
- _Source: src/core/validation/validators/email.ts_
4369
+ _Source: src/form/validation/validators/email.ts_
4359
4370
 
4360
4371
  ### enableWhen
4361
4372
 
@@ -4399,7 +4410,7 @@ compute(model.$.initialPayment, () => model.propertyValue * 0.2, {
4399
4410
  });
4400
4411
  ```
4401
4412
 
4402
- _Source: src/core/model/behaviors.ts_
4413
+ _Source: src/form/behaviors-node.ts_
4403
4414
 
4404
4415
  ### ErrorFilterOptions
4405
4416
 
@@ -4424,7 +4435,7 @@ export interface ErrorFilterOptions {
4424
4435
  }
4425
4436
  ```
4426
4437
 
4427
- _Source: src/core/types/index.ts_
4438
+ _Source: src/form/types/contracts.ts_
4428
4439
 
4429
4440
  ### ErrorStrategy
4430
4441
 
@@ -4457,7 +4468,7 @@ export enum ErrorStrategy {
4457
4468
  }
4458
4469
  ```
4459
4470
 
4460
- _Source: src/core/utils/error-handler.ts_
4471
+ _Source: src/form/error-handler.ts_
4461
4472
 
4462
4473
  ### FieldConfig
4463
4474
 
@@ -4495,7 +4506,7 @@ export interface FieldConfig<T> {
4495
4506
  }
4496
4507
  ```
4497
4508
 
4498
- _Source: src/core/types/deep-schema.ts_
4509
+ _Source: src/form/types/deep-schema.ts_
4499
4510
 
4500
4511
  ### FieldControlState
4501
4512
 
@@ -4719,7 +4730,7 @@ onChange={e => control.setValue(e.target.value)}
4719
4730
  - {@link useFormControl} - хук для получения состояния
4720
4731
  - {@link ArrayControlState} - состояние для массивов
4721
4732
 
4722
- _Source: src/hooks/types.ts_
4733
+ _Source: src/form/hooks/types.ts_
4723
4734
 
4724
4735
  ### FieldNode
4725
4736
 
@@ -4749,7 +4760,7 @@ await field.validate();
4749
4760
  console.log(field.valid.value); // true
4750
4761
  ```
4751
4762
 
4752
- _Source: src/core/nodes/field-node.ts_
4763
+ _Source: src/form/nodes/field-node.ts_
4753
4764
 
4754
4765
  ### FieldPathSegment
4755
4766
 
@@ -4766,7 +4777,7 @@ export type FieldPathSegment = {
4766
4777
  };
4767
4778
  ```
4768
4779
 
4769
- _Source: src/core/types/index.ts_
4780
+ _Source: src/form/types/index.ts_
4770
4781
 
4771
4782
  ### FieldStatus
4772
4783
 
@@ -4779,7 +4790,7 @@ _Source: src/core/types/index.ts_
4779
4790
  export type FieldStatus = 'valid' | 'invalid' | 'pending' | 'disabled';
4780
4791
  ```
4781
4792
 
4782
- _Source: src/core/types/index.ts_
4793
+ _Source: src/form/types/contracts.ts_
4783
4794
 
4784
4795
  ### FormArrayProxy
4785
4796
 
@@ -4833,7 +4844,7 @@ todos.forEach((item, i) => {
4833
4844
  });
4834
4845
  ```
4835
4846
 
4836
- _Source: src/core/types/form-proxy.ts_
4847
+ _Source: src/form/types/form-proxy.ts_
4837
4848
 
4838
4849
  ### FormControlsProxy
4839
4850
 
@@ -4865,7 +4876,7 @@ export type FormControlsProxy<T> = {
4865
4876
  };
4866
4877
  ```
4867
4878
 
4868
- _Source: src/core/types/form-proxy.ts_
4879
+ _Source: src/form/types/form-proxy.ts_
4869
4880
 
4870
4881
  ### FormErrorHandler
4871
4882
 
@@ -4947,20 +4958,22 @@ try {
4947
4958
  }
4948
4959
  ```
4949
4960
 
4950
- _Source: src/core/utils/error-handler.ts_
4961
+ _Source: src/form/error-handler.ts_
4951
4962
 
4952
4963
  ### FormModel
4953
4964
 
4954
4965
  **Kind:** `type`
4955
4966
 
4956
- FormModel — value-proxy объекта `T` + {@link ModelApi}.
4967
+ FormModel — под-модель объекта `T`: value-доступ ({@link ModelObject}) + `.$`-сигналы + {@link ModelApi}
4968
+ (get/set/patch/isDirty/reset/signalAt). Вложенные объекты-группы модели — тоже {@link FormModel}
4969
+ (доступны как `model.<group>`), поэтому `model.<group>.$.<field>` эквивалентно `model.$.<group>.<field>`.
4957
4970
 
4958
4971
  **Signature:**
4959
4972
  ```typescript
4960
4973
  export type FormModel<T> = ModelObject<T> & ModelApi<T>;
4961
4974
  ```
4962
4975
 
4963
- _Source: src/core/model/types.ts_
4976
+ _Source: src/state/types.ts_
4964
4977
 
4965
4978
  ### FormNode
4966
4979
 
@@ -5000,7 +5013,7 @@ form.email instanceof FormNode; // true
5000
5013
  form.email.markAsTouched();
5001
5014
  ```
5002
5015
 
5003
- _Source: src/core/nodes/form-node.ts_
5016
+ _Source: src/form/nodes/form-node.ts_
5004
5017
 
5005
5018
  ### FormProxy
5006
5019
 
@@ -5059,7 +5072,7 @@ form.email.setValue('test@mail.com');
5059
5072
  form.profile.name.setValue('John');
5060
5073
  ```
5061
5074
 
5062
- _Source: src/core/types/form-proxy.ts_
5075
+ _Source: src/form/types/form-proxy.ts_
5063
5076
 
5064
5077
  ### FormSchema
5065
5078
 
@@ -5124,7 +5137,7 @@ const schema: FormSchema<Form> = {
5124
5137
  };
5125
5138
  ```
5126
5139
 
5127
- _Source: src/core/types/deep-schema.ts_
5140
+ _Source: src/form/types/deep-schema.ts_
5128
5141
 
5129
5142
  ### FormSchemaNode
5130
5143
 
@@ -5183,7 +5196,7 @@ export interface FormSchemaNode {
5183
5196
  }
5184
5197
  ```
5185
5198
 
5186
- _Source: src/core/types/schema-node.ts_
5199
+ _Source: src/form/types/schema-node.ts_
5187
5200
 
5188
5201
  ### FormStatusMachine
5189
5202
 
@@ -5220,7 +5233,7 @@ statusMachine.disable();
5220
5233
  console.log(statusMachine.disabled.value); // true
5221
5234
  ```
5222
5235
 
5223
- _Source: src/core/utils/status-machine.ts_
5236
+ _Source: src/form/status-machine.ts_
5224
5237
 
5225
5238
  ### FormSubmitter
5226
5239
 
@@ -5250,7 +5263,7 @@ if (submitter.submitting.value) {
5250
5263
  }
5251
5264
  ```
5252
5265
 
5253
- _Source: src/core/utils/form-submitter.ts_
5266
+ _Source: src/form/form-submitter.ts_
5254
5267
 
5255
5268
  ### FormValue
5256
5269
 
@@ -5273,7 +5286,7 @@ export type FormValue =
5273
5286
  | { [key: string]: FormValue };
5274
5287
  ```
5275
5288
 
5276
- _Source: src/core/types/index.ts_
5289
+ _Source: src/form/types/contracts.ts_
5277
5290
 
5278
5291
  ### futureDate
5279
5292
 
@@ -5311,7 +5324,7 @@ validators: [required(), futureDate({ message: 'Дата записи должн
5311
5324
  },
5312
5325
  ```
5313
5326
 
5314
- _Source: src/core/validation/validators/future-date.ts_
5327
+ _Source: src/form/validation/validators/future-date.ts_
5315
5328
 
5316
5329
  ### getNodeForSignal
5317
5330
 
@@ -5346,7 +5359,7 @@ getNodeForSignal(sig)?.setErrors([{ code: 'required', message: 'Обязател
5346
5359
  **See also:**
5347
5360
  - {@link registerSignalNode} - регистрация связи сигнал→нода
5348
5361
 
5349
- _Source: src/core/utils/signal-node-registry.ts_
5362
+ _Source: src/form/signal-node-registry.ts_
5350
5363
 
5351
5364
  ### getNodeType
5352
5365
 
@@ -5372,7 +5385,7 @@ export function getNodeType(node: unknown): string
5372
5385
  console.log('Node type:', getNodeType(node)); // "FieldNode" | "GroupNode" | "ArrayNode" | "FormNode" | "Unknown"
5373
5386
  ```
5374
5387
 
5375
- _Source: src/core/utils/type-guards.ts_
5388
+ _Source: src/form/type-guards.ts_
5376
5389
 
5377
5390
  ### GroupNode
5378
5391
 
@@ -5407,7 +5420,7 @@ await proxy.validate();
5407
5420
  console.log(proxy.valid.value);
5408
5421
  ```
5409
5422
 
5410
- _Source: src/core/nodes/group-node.ts_
5423
+ _Source: src/form/nodes/group-node.ts_
5411
5424
 
5412
5425
  ### GroupNodeConfig
5413
5426
 
@@ -5426,7 +5439,7 @@ export interface GroupNodeConfig<T> {
5426
5439
  }
5427
5440
  ```
5428
5441
 
5429
- _Source: src/core/types/index.ts_
5442
+ _Source: src/form/types/index.ts_
5430
5443
 
5431
5444
  ### integer
5432
5445
 
@@ -5462,7 +5475,7 @@ validators: [required(), integer({ message: 'Должно быть целым ч
5462
5475
  },
5463
5476
  ```
5464
5477
 
5465
- _Source: src/core/validation/validators/integer.ts_
5478
+ _Source: src/form/validation/validators/integer.ts_
5466
5479
 
5467
5480
  ### isArrayNode
5468
5481
 
@@ -5493,7 +5506,7 @@ if (isArrayNode(node)) {
5493
5506
  }
5494
5507
  ```
5495
5508
 
5496
- _Source: src/core/utils/type-guards.ts_
5509
+ _Source: src/form/type-guards.ts_
5497
5510
 
5498
5511
  ### isDate
5499
5512
 
@@ -5530,7 +5543,7 @@ validators: [required(), isDate({ message: 'Введите корректную
5530
5543
  },
5531
5544
  ```
5532
5545
 
5533
- _Source: src/core/validation/validators/is-date.ts_
5546
+ _Source: src/form/validation/validators/is-date.ts_
5534
5547
 
5535
5548
  ### isDerived
5536
5549
 
@@ -5564,7 +5577,7 @@ if (!isDerived(model.$.total)) {
5564
5577
  **See also:**
5565
5578
  - {@link markDerived} - пометить сигнал производным
5566
5579
 
5567
- _Source: src/core/utils/derived-registry.ts_
5580
+ _Source: src/state/derived-registry.ts_
5568
5581
 
5569
5582
  ### isFieldNode
5570
5583
 
@@ -5595,7 +5608,7 @@ if (isFieldNode(node)) {
5595
5608
  }
5596
5609
  ```
5597
5610
 
5598
- _Source: src/core/utils/type-guards.ts_
5611
+ _Source: src/form/type-guards.ts_
5599
5612
 
5600
5613
  ### isFormNode
5601
5614
 
@@ -5624,7 +5637,7 @@ if (isFormNode(value)) {
5624
5637
  }
5625
5638
  ```
5626
5639
 
5627
- _Source: src/core/utils/type-guards.ts_
5640
+ _Source: src/form/type-guards.ts_
5628
5641
 
5629
5642
  ### isGroupNode
5630
5643
 
@@ -5653,7 +5666,7 @@ if (isGroupNode(node)) {
5653
5666
  }
5654
5667
  ```
5655
5668
 
5656
- _Source: src/core/utils/type-guards.ts_
5669
+ _Source: src/form/type-guards.ts_
5657
5670
 
5658
5671
  ### isNumber
5659
5672
 
@@ -5691,7 +5704,7 @@ validators: [required(), isNumber({ message: 'Введите число' })],
5691
5704
  },
5692
5705
  ```
5693
5706
 
5694
- _Source: src/core/validation/validators/is-number.ts_
5707
+ _Source: src/form/validation/validators/is-number.ts_
5695
5708
 
5696
5709
  ### markDerived
5697
5710
 
@@ -5727,7 +5740,7 @@ markDerived(model.$.total);
5727
5740
  - {@link isDerived} - проверка пометки
5728
5741
  - {@link unmarkDerived} - снять пометку при dispose оператора
5729
5742
 
5730
- _Source: src/core/utils/derived-registry.ts_
5743
+ _Source: src/state/derived-registry.ts_
5731
5744
 
5732
5745
  ### max
5733
5746
 
@@ -5767,7 +5780,7 @@ validators: [required(), max(50, { message: 'Не более 50%' })],
5767
5780
  },
5768
5781
  ```
5769
5782
 
5770
- _Source: src/core/validation/validators/max.ts_
5783
+ _Source: src/form/validation/validators/max.ts_
5771
5784
 
5772
5785
  ### maxAge
5773
5786
 
@@ -5807,7 +5820,7 @@ validators: [maxAge(100, { message: 'Проверьте дату рождени
5807
5820
  },
5808
5821
  ```
5809
5822
 
5810
- _Source: src/core/validation/validators/max-age.ts_
5823
+ _Source: src/form/validation/validators/max-age.ts_
5811
5824
 
5812
5825
  ### maxDate
5813
5826
 
@@ -5847,7 +5860,7 @@ validators: [maxDate(new Date(), { message: 'Дата не может быть
5847
5860
  },
5848
5861
  ```
5849
5862
 
5850
- _Source: src/core/validation/validators/max-date.ts_
5863
+ _Source: src/form/validation/validators/max-date.ts_
5851
5864
 
5852
5865
  ### maxLength
5853
5866
 
@@ -5889,7 +5902,7 @@ validators: [maxLength(500, { message: 'Максимум 500 символов' }
5889
5902
  },
5890
5903
  ```
5891
5904
 
5892
- _Source: src/core/validation/validators/max-length.ts_
5905
+ _Source: src/form/validation/validators/max-length.ts_
5893
5906
 
5894
5907
  ### min
5895
5908
 
@@ -5929,7 +5942,7 @@ validators: [required(), min(1, { message: 'Минимум 1' })],
5929
5942
  },
5930
5943
  ```
5931
5944
 
5932
- _Source: src/core/validation/validators/min.ts_
5945
+ _Source: src/form/validation/validators/min.ts_
5933
5946
 
5934
5947
  ### minAge
5935
5948
 
@@ -5969,7 +5982,7 @@ validators: [required(), minAge(18, { message: 'Вам должно быть н
5969
5982
  },
5970
5983
  ```
5971
5984
 
5972
- _Source: src/core/validation/validators/min-age.ts_
5985
+ _Source: src/form/validation/validators/min-age.ts_
5973
5986
 
5974
5987
  ### minDate
5975
5988
 
@@ -6009,7 +6022,7 @@ validators: [required(), minDate(new Date(), { message: 'Дата не рань
6009
6022
  },
6010
6023
  ```
6011
6024
 
6012
- _Source: src/core/validation/validators/min-date.ts_
6025
+ _Source: src/form/validation/validators/min-date.ts_
6013
6026
 
6014
6027
  ### minLength
6015
6028
 
@@ -6051,13 +6064,13 @@ validators: [required(), minLength(8, { message: 'Минимум 8 символ
6051
6064
  },
6052
6065
  ```
6053
6066
 
6054
- _Source: src/core/validation/validators/min-length.ts_
6067
+ _Source: src/form/validation/validators/min-length.ts_
6055
6068
 
6056
6069
  ### ModelApi
6057
6070
 
6058
6071
  **Kind:** `interface`
6059
6072
 
6060
- API уровня модели (доступно на корне и под-моделях элементов массива).
6073
+ API уровня модели (доступно на корне, под-моделях вложенных объектов-групп и элементов массива).
6061
6074
 
6062
6075
  ⚠️ Имена методов (`$`/`get`/`set`/`patch`/`isDirty`/`reset`/`signalAt`/`captureInitial`)
6063
6076
  зарезервированы: одноимённое поле формы их затеняет (редкий краевой случай).
@@ -6070,12 +6083,11 @@ export interface ModelApi<T> {
6070
6083
  /** Снимок значений (без подписки) — для submit. */
6071
6084
  get(): T;
6072
6085
  /**
6073
- * @deprecated Алиас {@link ModelApi.patch}: `set` выполняет то же частичное **слияние** —
6074
- * обновляет только переданные ключи, отсутствующие НЕ трогает (это НЕ полная замена, вопреки
6075
- * старому названию). Используйте `patch`; для замены с обнулением лишних полей делайте
6076
- * `patch({ ...defaults, ...dto })` явно. Не меняет initial-снимок.
6086
+ * Полная установка значений: принимает объект целиком (все ключи `T`) и записывает их в модель.
6087
+ * Производными полями (цели `compute`) владеет compute — их значения из payload игнорируются.
6088
+ * Не меняет initial-снимок. Для частичного обновления (только переданные ключи) — {@link ModelApi.patch}.
6077
6089
  */
6078
- set(value: Partial<T>): void;
6090
+ set(value: T): void;
6079
6091
  /**
6080
6092
  * Частичное слияние значений (load/patch с сервера): обновляет только переданные ключи,
6081
6093
  * отсутствующие ключи НЕ трогаются. Не меняет initial-снимок.
@@ -6092,7 +6104,7 @@ export interface ModelApi<T> {
6092
6104
  }
6093
6105
  ```
6094
6106
 
6095
- _Source: src/core/model/types.ts_
6107
+ _Source: src/state/types.ts_
6096
6108
 
6097
6109
  ### ModelArray
6098
6110
 
@@ -6138,7 +6150,7 @@ export interface ModelArray<U> {
6138
6150
  }
6139
6151
  ```
6140
6152
 
6141
- _Source: src/core/model/types.ts_
6153
+ _Source: src/state/types.ts_
6142
6154
 
6143
6155
  ### ModelArrayControl
6144
6156
 
@@ -6161,7 +6173,7 @@ export interface ModelArrayControl<TItem extends object> {
6161
6173
  }
6162
6174
  ```
6163
6175
 
6164
- _Source: src/core/nodes/model-array-node.ts_
6176
+ _Source: src/form/nodes/model-array-node.ts_
6165
6177
 
6166
6178
  ### ModelArrayNode
6167
6179
 
@@ -6209,14 +6221,15 @@ rows.at(0)?.name.setValue('B'); // правка поля элемента д
6209
6221
  rows.length.value; // 1 (реактивная длина)
6210
6222
  ```
6211
6223
 
6212
- _Source: src/core/nodes/model-array-node.ts_
6224
+ _Source: src/form/nodes/model-array-node.ts_
6213
6225
 
6214
6226
  ### ModelObject
6215
6227
 
6216
6228
  **Kind:** `type`
6217
6229
 
6218
- value-proxy объекта: поля доступны как обычные свойства (чтение реактивно
6219
- внутри `effect`/`computed`, запись — присваиванием).
6230
+ Карта value-полей объекта (value-половина {@link FormModel}): поля доступны как обычные свойства
6231
+ (чтение реактивно внутри `effect`/`computed`, запись — присваиванием). Вложенные объекты-поля
6232
+ резолвятся в под-модели {@link FormModel} (см. {@link ModelValue}), массивы — в {@link ModelArray}.
6220
6233
 
6221
6234
  **Signature:**
6222
6235
  ```typescript
@@ -6225,7 +6238,7 @@ export type ModelObject<T> = {
6225
6238
  };
6226
6239
  ```
6227
6240
 
6228
- _Source: src/core/model/types.ts_
6241
+ _Source: src/state/types.ts_
6229
6242
 
6230
6243
  ### ModelSignals
6231
6244
 
@@ -6241,7 +6254,7 @@ export type ModelSignals<T> = {
6241
6254
  };
6242
6255
  ```
6243
6256
 
6244
- _Source: src/core/model/types.ts_
6257
+ _Source: src/state/types.ts_
6245
6258
 
6246
6259
  ### ModelValidationResult
6247
6260
 
@@ -6258,7 +6271,7 @@ export interface ModelValidationResult {
6258
6271
  }
6259
6272
  ```
6260
6273
 
6261
- _Source: src/core/model/validate-model.ts_
6274
+ _Source: src/form/validate-model-core.ts_
6262
6275
 
6263
6276
  ### ModelValidator
6264
6277
 
@@ -6279,7 +6292,7 @@ export type ModelValidator<TValue = unknown, TModel = unknown, TRoot = unknown>
6279
6292
  ) => ValidationError | null | Promise<ValidationError | null>;
6280
6293
  ```
6281
6294
 
6282
- _Source: src/core/model/validate-model.ts_
6295
+ _Source: src/form/validate-model-core.ts_
6283
6296
 
6284
6297
  ### ModelValue
6285
6298
 
@@ -6288,7 +6301,8 @@ _Source: src/core/model/validate-model.ts_
6288
6301
  Значение поля в value-доступе модели:
6289
6302
  - массив → {@link ModelArray}
6290
6303
  - спец-объект (Date/File/Blob) → как есть
6291
- - объект → вложенный value-proxy
6304
+ - объект → под-модель {@link FormModel} (value-доступ + `.$`-сигналы + API get/set/patch/…);
6305
+ промоутится рантаймом (`makeFormModel`); сигналы идентичны `model.$.<path>`
6292
6306
  - примитив → значение
6293
6307
 
6294
6308
  **Signature:**
@@ -6299,11 +6313,11 @@ export type ModelValue<V> =
6299
6313
  : NonNullable<V> extends Opaque
6300
6314
  ? V
6301
6315
  : NonNullable<V> extends object
6302
- ? ModelObject<NonNullable<V>>
6316
+ ? FormModel<NonNullable<V>>
6303
6317
  : V;
6304
6318
  ```
6305
6319
 
6306
- _Source: src/core/model/types.ts_
6320
+ _Source: src/state/types.ts_
6307
6321
 
6308
6322
  ### multipleOf
6309
6323
 
@@ -6342,7 +6356,7 @@ validators: [multipleOf(0.5, { message: 'Только шаг 0.5' })],
6342
6356
  },
6343
6357
  ```
6344
6358
 
6345
- _Source: src/core/validation/validators/multiple-of.ts_
6359
+ _Source: src/form/validation/validators/multiple-of.ts_
6346
6360
 
6347
6361
  ### NodeFactory
6348
6362
 
@@ -6412,7 +6426,7 @@ const factory = new NodeFactory();
6412
6426
  const node = factory.createNode({ value: '', component: Input }); // → FieldNode<string>
6413
6427
  ```
6414
6428
 
6415
- _Source: src/core/factories/node-factory.ts_
6429
+ _Source: src/form/factories/node-factory.ts_
6416
6430
 
6417
6431
  ### nonNegative
6418
6432
 
@@ -6448,7 +6462,7 @@ validators: [nonNegative({ message: 'Баланс не может быть от
6448
6462
  },
6449
6463
  ```
6450
6464
 
6451
- _Source: src/core/validation/validators/non-negative.ts_
6465
+ _Source: src/form/validation/validators/non-negative.ts_
6452
6466
 
6453
6467
  ### nonZero
6454
6468
 
@@ -6484,7 +6498,7 @@ validators: [nonZero({ message: 'Не может быть нулём' })],
6484
6498
  },
6485
6499
  ```
6486
6500
 
6487
- _Source: src/core/validation/validators/non-zero.ts_
6501
+ _Source: src/form/validation/validators/non-zero.ts_
6488
6502
 
6489
6503
  ### pastDate
6490
6504
 
@@ -6521,7 +6535,7 @@ validators: [required(), pastDate({ message: 'Дата рождения не м
6521
6535
  },
6522
6536
  ```
6523
6537
 
6524
- _Source: src/core/validation/validators/past-date.ts_
6538
+ _Source: src/form/validation/validators/past-date.ts_
6525
6539
 
6526
6540
  ### PathAwareSignal
6527
6541
 
@@ -6538,7 +6552,7 @@ export type PathAwareSignal<T> = Signal<T> & {
6538
6552
  };
6539
6553
  ```
6540
6554
 
6541
- _Source: src/core/model/types.ts_
6555
+ _Source: src/state/types.ts_
6542
6556
 
6543
6557
  ### pattern
6544
6558
 
@@ -6586,7 +6600,7 @@ pattern(/^\+7 \(\d{3}\) \d{3}-\d{2}-\d{2}$/, { message: 'Формат +7 (999) 1
6586
6600
  },
6587
6601
  ```
6588
6602
 
6589
- _Source: src/core/validation/validators/pattern.ts_
6603
+ _Source: src/form/validation/validators/pattern.ts_
6590
6604
 
6591
6605
  ### phone
6592
6606
 
@@ -6624,7 +6638,7 @@ validators: [required(), phone({ format: 'ru' })],
6624
6638
  },
6625
6639
  ```
6626
6640
 
6627
- _Source: src/core/validation/validators/phone.ts_
6641
+ _Source: src/form/validation/validators/phone.ts_
6628
6642
 
6629
6643
  ### PhoneFormat
6630
6644
 
@@ -6642,7 +6656,7 @@ _Source: src/core/validation/validators/phone.ts_
6642
6656
  export type PhoneFormat = 'international' | 'ru' | 'us' | 'any';
6643
6657
  ```
6644
6658
 
6645
- _Source: src/core/validation/validators/phone.ts_
6659
+ _Source: src/form/validation/validators/phone.ts_
6646
6660
 
6647
6661
  ### registerSignalNode
6648
6662
 
@@ -6676,7 +6690,7 @@ if (sig && node) registerSignalNode(sig, node);
6676
6690
  **See also:**
6677
6691
  - {@link getNodeForSignal} - обратный поиск ноды по сигналу
6678
6692
 
6679
- _Source: src/core/utils/signal-node-registry.ts_
6693
+ _Source: src/form/signal-node-registry.ts_
6680
6694
 
6681
6695
  ### required
6682
6696
 
@@ -6722,7 +6736,7 @@ validators: [required({ message: 'Необходимо принять услов
6722
6736
  },
6723
6737
  ```
6724
6738
 
6725
- _Source: src/core/validation/validators/required.ts_
6739
+ _Source: src/form/validation/validators/required.ts_
6726
6740
 
6727
6741
  ### resetWhen
6728
6742
 
@@ -6745,7 +6759,7 @@ export function resetWhen<T>(
6745
6759
  resetWhen(model.$.cardNumber, () => model.paymentType !== 'card', { resetValue: '' });
6746
6760
  ```
6747
6761
 
6748
- _Source: src/core/model/behaviors.ts_
6762
+ _Source: src/state/behaviors-value.ts_
6749
6763
 
6750
6764
  ### ResourceLoadResult
6751
6765
 
@@ -6758,7 +6772,7 @@ _Source: src/core/model/behaviors.ts_
6758
6772
  export type ResourceLoadResult = unknown;
6759
6773
  ```
6760
6774
 
6761
- _Source: src/core/types/index.ts_
6775
+ _Source: src/form/types/index.ts_
6762
6776
 
6763
6777
  ### revalidateWhen
6764
6778
 
@@ -6781,7 +6795,7 @@ export function revalidateWhen(
6781
6795
  revalidateWhen([model.$.maxAmount], () => validateFormModel(model, schema));
6782
6796
  ```
6783
6797
 
6784
- _Source: src/core/model/behaviors.ts_
6798
+ _Source: src/state/behaviors-value.ts_
6785
6799
 
6786
6800
  ### runOutsideEffect
6787
6801
 
@@ -6789,7 +6803,7 @@ _Source: src/core/model/behaviors.ts_
6789
6803
 
6790
6804
  Выполняет функцию вне контекста effect (отложенная запись на микротаск).
6791
6805
 
6792
- Сбои fn (синхронный throw и async-rejection) маршрутизируются через {@link FormErrorHandler}, а не
6806
+ Сбои fn (синхронный throw и async-rejection) маршрутизируются dev-логгером (logDeferError), а не
6793
6807
  всплывают неперехваченными. Возвращает отменитель: вызов до срабатывания микротаска отменяет запись
6794
6808
  (liveness-охрана — не писать против снесённого узла при dispose в том же тике).
6795
6809
 
@@ -6815,7 +6829,7 @@ effect(() => {
6815
6829
  });
6816
6830
  ```
6817
6831
 
6818
- _Source: src/core/utils/safe-effect.ts_
6832
+ _Source: src/state/safe-effect.ts_
6819
6833
 
6820
6834
  ### safeCallback
6821
6835
 
@@ -6854,7 +6868,7 @@ effect(() => {
6854
6868
  });
6855
6869
  ```
6856
6870
 
6857
- _Source: src/core/utils/safe-effect.ts_
6871
+ _Source: src/state/safe-effect.ts_
6858
6872
 
6859
6873
  ### safeDebouncedCallback
6860
6874
 
@@ -6864,7 +6878,7 @@ _Source: src/core/utils/safe-effect.ts_
6864
6878
 
6865
6879
  `withDebounce` уже откладывает вызов (таймер) — этого достаточно для выхода из effect-контекста,
6866
6880
  поэтому дополнительного `queueMicrotask` нет (устранён двойной defer). Сбои callback (в т.ч.
6867
- async-rejection) маршрутизируются через {@link FormErrorHandler}.
6881
+ async-rejection) маршрутизируются dev-логгером (logDeferError).
6868
6882
 
6869
6883
  **Signature:**
6870
6884
  ```typescript
@@ -6892,7 +6906,7 @@ return effect(() => {
6892
6906
  });
6893
6907
  ```
6894
6908
 
6895
- _Source: src/core/utils/safe-effect.ts_
6909
+ _Source: src/state/safe-effect.ts_
6896
6910
 
6897
6911
  ### SchemaArrayControl
6898
6912
 
@@ -6915,7 +6929,7 @@ export interface SchemaArrayControl {
6915
6929
  }
6916
6930
  ```
6917
6931
 
6918
- _Source: src/core/types/schema-node.ts_
6932
+ _Source: src/form/types/schema-node.ts_
6919
6933
 
6920
6934
  ### SchemaValidator
6921
6935
 
@@ -6934,7 +6948,7 @@ export type SchemaValidator = (
6934
6948
  ) => ValidationError | null | Promise<ValidationError | null>;
6935
6949
  ```
6936
6950
 
6937
- _Source: src/core/types/schema-node.ts_
6951
+ _Source: src/form/types/schema-node.ts_
6938
6952
 
6939
6953
  ### SetValueOptions
6940
6954
 
@@ -6952,7 +6966,7 @@ export interface SetValueOptions {
6952
6966
  }
6953
6967
  ```
6954
6968
 
6955
- _Source: src/core/nodes/form-node.ts_
6969
+ _Source: src/form/nodes/form-node.ts_
6956
6970
 
6957
6971
  ### StatusEvent
6958
6972
 
@@ -6971,7 +6985,7 @@ export type StatusEvent =
6971
6985
  | { type: 'SET_ERRORS'; hasErrors: boolean };
6972
6986
  ```
6973
6987
 
6974
- _Source: src/core/utils/status-machine.ts_
6988
+ _Source: src/form/status-machine.ts_
6975
6989
 
6976
6990
  ### SubmitOptions
6977
6991
 
@@ -6989,7 +7003,7 @@ export interface SubmitOptions {
6989
7003
  }
6990
7004
  ```
6991
7005
 
6992
- _Source: src/core/utils/form-submitter.ts_
7006
+ _Source: src/form/form-submitter.ts_
6993
7007
 
6994
7008
  ### SubmitResult
6995
7009
 
@@ -7009,7 +7023,7 @@ export interface SubmitResult<R> {
7009
7023
  }
7010
7024
  ```
7011
7025
 
7012
- _Source: src/core/utils/form-submitter.ts_
7026
+ _Source: src/form/form-submitter.ts_
7013
7027
 
7014
7028
  ### SubmittableForm
7015
7029
 
@@ -7030,7 +7044,7 @@ export interface SubmittableForm<T extends object> {
7030
7044
  }
7031
7045
  ```
7032
7046
 
7033
- _Source: src/core/utils/form-submitter.ts_
7047
+ _Source: src/form/form-submitter.ts_
7034
7048
 
7035
7049
  ### SubscriptionManager
7036
7050
 
@@ -7073,7 +7087,7 @@ class FieldNode {
7073
7087
  }
7074
7088
  ```
7075
7089
 
7076
- _Source: src/core/utils/subscription-manager.ts_
7090
+ _Source: src/state/subscription-manager.ts_
7077
7091
 
7078
7092
  ### syncFields
7079
7093
 
@@ -7097,7 +7111,7 @@ export function syncFields<T>(
7097
7111
  syncFields(model.$.field1, model.$.field2);
7098
7112
  ```
7099
7113
 
7100
- _Source: src/core/model/behaviors.ts_
7114
+ _Source: src/state/behaviors-value.ts_
7101
7115
 
7102
7116
  ### transformValue
7103
7117
 
@@ -7120,7 +7134,7 @@ export function transformValue<T>(
7120
7134
  transformValue(model.$.promoCode, (v) => (v ?? '').toUpperCase());
7121
7135
  ```
7122
7136
 
7123
- _Source: src/core/model/behaviors.ts_
7137
+ _Source: src/state/behaviors-value.ts_
7124
7138
 
7125
7139
  ### uniqueId
7126
7140
 
@@ -7147,7 +7161,7 @@ uniqueId(SubscriptionKey.WatchField); // → 'watchField-1'
7147
7161
  uniqueId(SubscriptionKey.WatchField); // → 'watchField-2'
7148
7162
  ```
7149
7163
 
7150
- _Source: src/core/utils/unique-id.ts_
7164
+ _Source: src/form/unique-id.ts_
7151
7165
 
7152
7166
  ### UnknownCallback
7153
7167
 
@@ -7161,7 +7175,7 @@ _Source: src/core/utils/unique-id.ts_
7161
7175
  export type UnknownCallback = (...args: unknown[]) => unknown;
7162
7176
  ```
7163
7177
 
7164
- _Source: src/core/types/index.ts_
7178
+ _Source: src/form/types/index.ts_
7165
7179
 
7166
7180
  ### UnknownFormValue
7167
7181
 
@@ -7175,7 +7189,7 @@ Requires explicit type checking before use
7175
7189
  export type UnknownFormValue = unknown;
7176
7190
  ```
7177
7191
 
7178
- _Source: src/core/types/index.ts_
7192
+ _Source: src/form/types/contracts.ts_
7179
7193
 
7180
7194
  ### UnknownRecord
7181
7195
 
@@ -7189,7 +7203,7 @@ _Source: src/core/types/index.ts_
7189
7203
  export type UnknownRecord = Record<string, unknown>;
7190
7204
  ```
7191
7205
 
7192
- _Source: src/core/types/index.ts_
7206
+ _Source: src/form/types/index.ts_
7193
7207
 
7194
7208
  ### unmarkDerived
7195
7209
 
@@ -7225,7 +7239,7 @@ onDispose(() => unmarkDerived(model.$.total)); // при снятии compute с
7225
7239
  **See also:**
7226
7240
  - {@link markDerived} - пометить сигнал производным
7227
7241
 
7228
- _Source: src/core/utils/derived-registry.ts_
7242
+ _Source: src/state/derived-registry.ts_
7229
7243
 
7230
7244
  ### url
7231
7245
 
@@ -7269,7 +7283,7 @@ validators: [url({ requireProtocol: true, allowedProtocols: ['https'] })],
7269
7283
  },
7270
7284
  ```
7271
7285
 
7272
- _Source: src/core/validation/validators/url.ts_
7286
+ _Source: src/form/validation/validators/url.ts_
7273
7287
 
7274
7288
  ### useArrayLength
7275
7289
 
@@ -7307,7 +7321,7 @@ function ArrayRenderer({ arrayNode }) {
7307
7321
  }
7308
7322
  ```
7309
7323
 
7310
- _Source: src/hooks/useArrayLength.ts_
7324
+ _Source: src/form/hooks/useArrayLength.ts_
7311
7325
 
7312
7326
  ### useFormControl
7313
7327
 
@@ -7541,7 +7555,7 @@ return <div>Items: {length}</div>;
7541
7555
  - {@link FieldControlState} - тип состояния для FieldNode
7542
7556
  - {@link ArrayControlState} - тип состояния для ArrayNode
7543
7557
 
7544
- _Source: src/hooks/useFormControl.ts_
7558
+ _Source: src/form/hooks/useFormControl.ts_
7545
7559
 
7546
7560
  ### useFormControlValue
7547
7561
 
@@ -7722,7 +7736,7 @@ return (
7722
7736
  - {@link useFormControl} - для полного состояния поля
7723
7737
  - {@link FieldNode} - тип контрола поля
7724
7738
 
7725
- _Source: src/hooks/useFormControlValue.ts_
7739
+ _Source: src/form/hooks/useFormControlValue.ts_
7726
7740
 
7727
7741
  ### ValidateAsyncOptions
7728
7742
 
@@ -7740,7 +7754,7 @@ export interface ValidateAsyncOptions extends ValidateOptions {
7740
7754
  подключалась тем оператором, которого больше нет. Рантаймом не потребляется; экспортируется
7741
7755
  только ради обратной совместимости.
7742
7756
 
7743
- _Source: src/core/types/validation-schema.ts_
7757
+ _Source: src/form/types/validation-schema.ts_
7744
7758
 
7745
7759
  ### validateFormModel
7746
7760
 
@@ -7774,7 +7788,7 @@ const res = await validateFormModel(model, schema);
7774
7788
  if (res.valid) await api.save(model.get());
7775
7789
  ```
7776
7790
 
7777
- _Source: src/core/model/validate-model.ts_
7791
+ _Source: src/form/validate-model.ts_
7778
7792
 
7779
7793
  ### validateModel
7780
7794
 
@@ -7797,7 +7811,7 @@ const res = await validateModel(model, schema);
7797
7811
  if (!res.valid) console.log(res.errors); // { 'email': [{ code, message }], ... }
7798
7812
  ```
7799
7813
 
7800
- _Source: src/core/model/validate-model.ts_
7814
+ _Source: src/form/validate-model-core.ts_
7801
7815
 
7802
7816
  ### validateModelSync
7803
7817
 
@@ -7828,7 +7842,7 @@ const res = validateModelSync(model, schema);
7828
7842
  if (!res.valid) console.log(res.errors); // { 'email': [{ code, message }], ... }
7829
7843
  ```
7830
7844
 
7831
- _Source: src/core/model/validate-model.ts_
7845
+ _Source: src/form/validate-model-core.ts_
7832
7846
 
7833
7847
  ### ValidateOptions
7834
7848
 
@@ -7848,7 +7862,7 @@ export interface ValidateOptions {
7848
7862
  }
7849
7863
  ```
7850
7864
 
7851
- _Source: src/core/types/validation-schema.ts_
7865
+ _Source: src/form/types/validation-schema.ts_
7852
7866
 
7853
7867
  ### ValidationError
7854
7868
 
@@ -7867,7 +7881,7 @@ export interface ValidationError {
7867
7881
  }
7868
7882
  ```
7869
7883
 
7870
- _Source: src/core/types/index.ts_
7884
+ _Source: src/form/types/contracts.ts_
7871
7885
 
7872
7886
  ### Validator
7873
7887
 
@@ -7915,7 +7929,7 @@ children: [
7915
7929
  };
7916
7930
  ```
7917
7931
 
7918
- _Source: src/core/types/validation-schema.ts_
7932
+ _Source: src/form/types/validation-schema.ts_
7919
7933
 
7920
7934
  ### ValidatorFn
7921
7935
 
@@ -7928,7 +7942,7 @@ _Source: src/core/types/validation-schema.ts_
7928
7942
  export type ValidatorFn<T = FormValue> = (value: T) => ValidationError | null;
7929
7943
  ```
7930
7944
 
7931
- _Source: src/core/types/index.ts_
7945
+ _Source: src/form/types/contracts.ts_
7932
7946
 
7933
7947
  ### watchField
7934
7948
 
@@ -7955,7 +7969,7 @@ watchField(model.$.country, async (country) => {
7955
7969
  });
7956
7970
  ```
7957
7971
 
7958
- _Source: src/core/model/behaviors.ts_
7972
+ _Source: src/state/behaviors-value.ts_
7959
7973
 
7960
7974
  ### WithBehaviorSchema
7961
7975
 
@@ -7970,7 +7984,7 @@ export interface WithBehaviorSchema {
7970
7984
  }
7971
7985
  ```
7972
7986
 
7973
- _Source: src/core/types/index.ts_
7987
+ _Source: src/form/types/index.ts_
7974
7988
 
7975
7989
  ### WithValidationSchema
7976
7990
 
@@ -7985,4 +7999,4 @@ export interface WithValidationSchema {
7985
7999
  }
7986
8000
  ```
7987
8001
 
7988
- _Source: src/core/types/index.ts_
8002
+ _Source: src/form/types/index.ts_