@wildo-ai/zod-decorators 1.1.4 → 1.1.6

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 (68) hide show
  1. package/dist/esm/currencies.shared.schemas.d.ts.map +1 -1
  2. package/dist/esm/currencies.shared.schemas.js.map +1 -1
  3. package/dist/esm/files/agent-file-formats.d.ts +51 -37
  4. package/dist/esm/files/agent-file-formats.d.ts.map +1 -1
  5. package/dist/esm/files/agent-file-formats.js +54 -47
  6. package/dist/esm/files/agent-file-formats.js.map +1 -1
  7. package/dist/esm/files/extension-nature-map.d.ts.map +1 -1
  8. package/dist/esm/files/mime-registry.d.ts.map +1 -1
  9. package/dist/esm/files/unified-registry.d.ts +2 -2
  10. package/dist/esm/files/unified-registry.d.ts.map +1 -1
  11. package/dist/esm/files/unified-registry.js +1 -1
  12. package/dist/esm/files/unified-registry.js.map +1 -1
  13. package/dist/esm/index.d.ts +1 -0
  14. package/dist/esm/index.d.ts.map +1 -1
  15. package/dist/esm/index.js +1 -0
  16. package/dist/esm/index.js.map +1 -1
  17. package/dist/esm/testing/decorated-test-schemas.d.ts.map +1 -1
  18. package/dist/esm/testing.d.ts +11 -0
  19. package/dist/esm/testing.d.ts.map +1 -1
  20. package/dist/esm/testing.js +11 -0
  21. package/dist/esm/testing.js.map +1 -1
  22. package/dist/esm/zod-address.d.ts +146 -0
  23. package/dist/esm/zod-address.d.ts.map +1 -0
  24. package/dist/esm/zod-address.js +176 -0
  25. package/dist/esm/zod-address.js.map +1 -0
  26. package/dist/esm/zod-bigdecimal.d.ts.map +1 -1
  27. package/dist/esm/zod-code.d.ts +2 -0
  28. package/dist/esm/zod-code.d.ts.map +1 -1
  29. package/dist/esm/zod-code.js +4 -4
  30. package/dist/esm/zod-code.js.map +1 -1
  31. package/dist/esm/zod-color.d.ts.map +1 -1
  32. package/dist/esm/zod-decorators.types.d.ts +311 -29
  33. package/dist/esm/zod-decorators.types.d.ts.map +1 -1
  34. package/dist/esm/zod-decorators.types.js +177 -8
  35. package/dist/esm/zod-decorators.types.js.map +1 -1
  36. package/dist/esm/zod-duration.d.ts +2 -0
  37. package/dist/esm/zod-duration.d.ts.map +1 -1
  38. package/dist/esm/zod-duration.js +4 -4
  39. package/dist/esm/zod-duration.js.map +1 -1
  40. package/dist/esm/zod-file.d.ts +70 -4
  41. package/dist/esm/zod-file.d.ts.map +1 -1
  42. package/dist/esm/zod-file.js +92 -75
  43. package/dist/esm/zod-file.js.map +1 -1
  44. package/dist/esm/zod-money.d.ts +2 -0
  45. package/dist/esm/zod-money.d.ts.map +1 -1
  46. package/dist/esm/zod-money.js +6 -6
  47. package/dist/esm/zod-money.js.map +1 -1
  48. package/dist/esm/zod-phone.d.ts +8 -0
  49. package/dist/esm/zod-phone.d.ts.map +1 -1
  50. package/dist/esm/zod-phone.js +6 -1
  51. package/dist/esm/zod-phone.js.map +1 -1
  52. package/dist/esm/zod-range.d.ts.map +1 -1
  53. package/dist/esm/zod-utils.shared.d.ts +343 -12
  54. package/dist/esm/zod-utils.shared.d.ts.map +1 -1
  55. package/dist/esm/zod-utils.shared.js +1004 -90
  56. package/dist/esm/zod-utils.shared.js.map +1 -1
  57. package/dist/esm/zod-versioned.d.ts.map +1 -1
  58. package/dist/esm/zod-versioned.js.map +1 -1
  59. package/dist/esm/zod.module-override.d.ts +29 -1
  60. package/dist/esm/zod.module-override.d.ts.map +1 -1
  61. package/dist/esm/zod.module-override.js +67 -8
  62. package/dist/esm/zod.module-override.js.map +1 -1
  63. package/dist/tsconfig.build.tsbuildinfo +1 -1
  64. package/package.json +2 -7
  65. package/dist/esm/companion-exports.d.ts +0 -8
  66. package/dist/esm/companion-exports.d.ts.map +0 -1
  67. package/dist/esm/companion-exports.js +0 -8
  68. package/dist/esm/companion-exports.js.map +0 -1
@@ -44,6 +44,7 @@ export declare enum FieldSchemaType {
44
44
  FILE = "file",// File schemas created by z_file() - detected by SCHEMA_METADATA.fileConfig
45
45
  DURATION = "duration",// Duration schemas created by z_duration() - detected by SCHEMA_METADATA.durationConfig
46
46
  PHONE = "phone",// Phone schemas created by z_phone() - detected by SCHEMA_METADATA.phoneConfig
47
+ ADDRESS = "address",// Address schemas created by z_address() - detected by SCHEMA_METADATA.addressConfig
47
48
  VERSIONED_FOREIGN_KEY = "versioned_foreign_key",// Versioned foreign key schemas created by z_foreignKeyVersioned() - detected by SCHEMA_METADATA.versionedForeignKeyConfig
48
49
  VERSIONED_OBJECT = "versioned_object",// Versioned object schemas created by versioned() - detected by SCHEMA_METADATA.versionedConfig
49
50
  UNKNOWN = "unknown"
@@ -67,7 +68,8 @@ export declare enum FormFieldComponent {
67
68
  BIGDECIMAL_RANGE = "bigdecimal-range",// BigDecimal range input (from/to bigdecimal)
68
69
  MONEY_RANGE = "money-range",// Money range input (from/to money)
69
70
  DURATION = "duration",// Duration input (value + unit selector)
70
- PHONE = "phone"
71
+ PHONE = "phone",// Phone input (country + number, E.164 output)
72
+ ADDRESS = "address"
71
73
  }
72
74
  /**
73
75
  * Official HTML autocomplete field identifiers.
@@ -197,11 +199,11 @@ export type ResponsiveChromeMode = EditChromeMode | Partial<Record<ViewportBreak
197
199
  */
198
200
  export type ResponsiveAware<T> = T | Partial<Record<ViewportBreakpoint, T>>;
199
201
  export type FormFieldSchemaTypeComponents = {
200
- [K in FieldSchemaType]: K extends FieldSchemaType.STRING ? FormFieldComponent.INPUT | FormFieldComponent.TEXTAREA | FormFieldComponent.SELECT | FormFieldComponent.RADIO_GROUP | FormFieldComponent.DATE | FormFieldComponent.TIME | FormFieldComponent.DATETIME : K extends FieldSchemaType.NUMBER ? FormFieldComponent.INPUT | FormFieldComponent.SLIDER | FormFieldComponent.SELECT | FormFieldComponent.RADIO_GROUP : K extends FieldSchemaType.BIGINT ? FormFieldComponent.INPUT : K extends FieldSchemaType.BOOLEAN ? FormFieldComponent.SWITCH | FormFieldComponent.CHECKBOX | FormFieldComponent.SELECT | FormFieldComponent.RADIO_GROUP : K extends FieldSchemaType.ENUM ? FormFieldComponent.SELECT | FormFieldComponent.RADIO_GROUP : K extends FieldSchemaType.DATE ? FormFieldComponent.DATE | FormFieldComponent.DATETIME | FormFieldComponent.INPUT : K extends FieldSchemaType.TIME ? FormFieldComponent.TIME | FormFieldComponent.INPUT : K extends FieldSchemaType.DATETIME ? FormFieldComponent.DATETIME | FormFieldComponent.INPUT : K extends FieldSchemaType.RANGE_NUMBER ? FormFieldComponent.RANGE_SLIDER : K extends FieldSchemaType.RANGE_DATE ? FormFieldComponent.DATE_RANGE : K extends FieldSchemaType.RANGE_DATETIME ? FormFieldComponent.DATETIME_RANGE : K extends FieldSchemaType.RANGE_TIME ? FormFieldComponent.TIME_RANGE : K extends FieldSchemaType.RANGE_BIGDECIMAL ? FormFieldComponent.BIGDECIMAL_RANGE : K extends FieldSchemaType.RANGE_MONEY ? FormFieldComponent.MONEY_RANGE : K extends FieldSchemaType.MONEY ? FormFieldComponent.INPUT : K extends FieldSchemaType.DURATION ? FormFieldComponent.DURATION : K extends FieldSchemaType.PHONE ? FormFieldComponent.PHONE : K extends FieldSchemaType.BIGDECIMAL ? FormFieldComponent.INPUT : K extends FieldSchemaType.CODE ? FormFieldComponent.TEXTAREA : K extends FieldSchemaType.FILE ? FormFieldComponent.INPUT : K extends FieldSchemaType.ARRAY ? FormFieldComponent.CHECKBOX_GROUP | FormFieldComponent.SELECT : K extends FieldSchemaType.SET ? FormFieldComponent.INPUT | FormFieldComponent.CHECKBOX_GROUP | FormFieldComponent.SELECT : K extends FieldSchemaType.TUPLE ? FormFieldComponent.INPUT : K extends FieldSchemaType.UNKNOWN ? FormFieldComponent.INPUT : never;
202
+ [K in FieldSchemaType]: K extends FieldSchemaType.STRING ? FormFieldComponent.INPUT | FormFieldComponent.TEXTAREA | FormFieldComponent.SELECT | FormFieldComponent.RADIO_GROUP | FormFieldComponent.DATE | FormFieldComponent.TIME | FormFieldComponent.DATETIME : K extends FieldSchemaType.NUMBER ? FormFieldComponent.INPUT | FormFieldComponent.SLIDER | FormFieldComponent.SELECT | FormFieldComponent.RADIO_GROUP : K extends FieldSchemaType.BIGINT ? FormFieldComponent.INPUT : K extends FieldSchemaType.BOOLEAN ? FormFieldComponent.SWITCH | FormFieldComponent.CHECKBOX | FormFieldComponent.SELECT | FormFieldComponent.RADIO_GROUP : K extends FieldSchemaType.ENUM ? FormFieldComponent.SELECT | FormFieldComponent.RADIO_GROUP : K extends FieldSchemaType.DATE ? FormFieldComponent.DATE | FormFieldComponent.DATETIME | FormFieldComponent.INPUT : K extends FieldSchemaType.TIME ? FormFieldComponent.TIME | FormFieldComponent.INPUT : K extends FieldSchemaType.DATETIME ? FormFieldComponent.DATETIME | FormFieldComponent.INPUT : K extends FieldSchemaType.RANGE_NUMBER ? FormFieldComponent.RANGE_SLIDER : K extends FieldSchemaType.RANGE_DATE ? FormFieldComponent.DATE_RANGE : K extends FieldSchemaType.RANGE_DATETIME ? FormFieldComponent.DATETIME_RANGE : K extends FieldSchemaType.RANGE_TIME ? FormFieldComponent.TIME_RANGE : K extends FieldSchemaType.RANGE_BIGDECIMAL ? FormFieldComponent.BIGDECIMAL_RANGE : K extends FieldSchemaType.RANGE_MONEY ? FormFieldComponent.MONEY_RANGE : K extends FieldSchemaType.MONEY ? FormFieldComponent.INPUT : K extends FieldSchemaType.DURATION ? FormFieldComponent.DURATION : K extends FieldSchemaType.PHONE ? FormFieldComponent.PHONE : K extends FieldSchemaType.ADDRESS ? FormFieldComponent.ADDRESS : K extends FieldSchemaType.BIGDECIMAL ? FormFieldComponent.INPUT : K extends FieldSchemaType.CODE ? FormFieldComponent.TEXTAREA : K extends FieldSchemaType.FILE ? FormFieldComponent.INPUT : K extends FieldSchemaType.ARRAY ? FormFieldComponent.CHECKBOX_GROUP | FormFieldComponent.SELECT : K extends FieldSchemaType.SET ? FormFieldComponent.INPUT | FormFieldComponent.CHECKBOX_GROUP | FormFieldComponent.SELECT : K extends FieldSchemaType.TUPLE ? FormFieldComponent.INPUT : K extends FieldSchemaType.UNKNOWN ? FormFieldComponent.INPUT : never;
201
203
  };
202
204
  export type FormComponentForSchemaType<T extends FieldSchemaType> = FormFieldSchemaTypeComponents[T];
203
205
  export type FormFieldSchemaTypeDefaultComponent = {
204
- [K in FieldSchemaType]: K extends FieldSchemaType.STRING ? FormFieldComponent.INPUT : K extends FieldSchemaType.NUMBER ? FormFieldComponent.INPUT : K extends FieldSchemaType.BIGINT ? FormFieldComponent.INPUT : K extends FieldSchemaType.BOOLEAN ? FormFieldComponent.SWITCH : K extends FieldSchemaType.ENUM ? FormFieldComponent.SELECT : K extends FieldSchemaType.DATE ? FormFieldComponent.DATE : K extends FieldSchemaType.TIME ? FormFieldComponent.TIME : K extends FieldSchemaType.DATETIME ? FormFieldComponent.DATETIME : K extends FieldSchemaType.RANGE_NUMBER ? FormFieldComponent.RANGE_SLIDER : K extends FieldSchemaType.RANGE_DATE ? FormFieldComponent.DATE_RANGE : K extends FieldSchemaType.RANGE_DATETIME ? FormFieldComponent.DATETIME_RANGE : K extends FieldSchemaType.RANGE_TIME ? FormFieldComponent.TIME_RANGE : K extends FieldSchemaType.RANGE_BIGDECIMAL ? FormFieldComponent.BIGDECIMAL_RANGE : K extends FieldSchemaType.RANGE_MONEY ? FormFieldComponent.MONEY_RANGE : K extends FieldSchemaType.MONEY ? FormFieldComponent.INPUT : K extends FieldSchemaType.DURATION ? FormFieldComponent.DURATION : K extends FieldSchemaType.PHONE ? FormFieldComponent.PHONE : K extends FieldSchemaType.BIGDECIMAL ? FormFieldComponent.INPUT : K extends FieldSchemaType.CODE ? FormFieldComponent.TEXTAREA : K extends FieldSchemaType.FILE ? FormFieldComponent.INPUT : FormFieldComponent.INPUT;
206
+ [K in FieldSchemaType]: K extends FieldSchemaType.STRING ? FormFieldComponent.INPUT : K extends FieldSchemaType.NUMBER ? FormFieldComponent.INPUT : K extends FieldSchemaType.BIGINT ? FormFieldComponent.INPUT : K extends FieldSchemaType.BOOLEAN ? FormFieldComponent.SWITCH : K extends FieldSchemaType.ENUM ? FormFieldComponent.SELECT : K extends FieldSchemaType.DATE ? FormFieldComponent.DATE : K extends FieldSchemaType.TIME ? FormFieldComponent.TIME : K extends FieldSchemaType.DATETIME ? FormFieldComponent.DATETIME : K extends FieldSchemaType.RANGE_NUMBER ? FormFieldComponent.RANGE_SLIDER : K extends FieldSchemaType.RANGE_DATE ? FormFieldComponent.DATE_RANGE : K extends FieldSchemaType.RANGE_DATETIME ? FormFieldComponent.DATETIME_RANGE : K extends FieldSchemaType.RANGE_TIME ? FormFieldComponent.TIME_RANGE : K extends FieldSchemaType.RANGE_BIGDECIMAL ? FormFieldComponent.BIGDECIMAL_RANGE : K extends FieldSchemaType.RANGE_MONEY ? FormFieldComponent.MONEY_RANGE : K extends FieldSchemaType.MONEY ? FormFieldComponent.INPUT : K extends FieldSchemaType.DURATION ? FormFieldComponent.DURATION : K extends FieldSchemaType.PHONE ? FormFieldComponent.PHONE : K extends FieldSchemaType.ADDRESS ? FormFieldComponent.ADDRESS : K extends FieldSchemaType.BIGDECIMAL ? FormFieldComponent.INPUT : K extends FieldSchemaType.CODE ? FormFieldComponent.TEXTAREA : K extends FieldSchemaType.FILE ? FormFieldComponent.INPUT : FormFieldComponent.INPUT;
205
207
  };
206
208
  export type DefaultFormComponentForSchemaType<T extends FieldSchemaType> = FormFieldSchemaTypeDefaultComponent[T];
207
209
  export type DecoratorConfig<T extends ZodDecorator> = {
@@ -224,6 +226,7 @@ export declare enum DisplayFieldComponent {
224
226
  BIGDECIMAL = "bigdecimal",
225
227
  DURATION = "duration",
226
228
  PHONE = "phone",
229
+ ADDRESS = "address",
227
230
  RANGE_NUMBER = "range-number",
228
231
  RANGE_DATE = "range-date",
229
232
  RANGE_TIME = "range-time",
@@ -232,11 +235,11 @@ export declare enum DisplayFieldComponent {
232
235
  RANGE_MONEY = "range-money"
233
236
  }
234
237
  export type DisplayFieldSchemaTypeComponents = {
235
- [K in FieldSchemaType]: K extends FieldSchemaType.STRING ? DisplayFieldComponent.STRING | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.NUMBER ? DisplayFieldComponent.NUMBER | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.BIGINT ? DisplayFieldComponent.NUMBER | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.BOOLEAN ? DisplayFieldComponent.BOOLEAN | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.ENUM ? DisplayFieldComponent.ENUM | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.DATE ? DisplayFieldComponent.DATE | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.TIME ? DisplayFieldComponent.TIME | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.DATETIME ? DisplayFieldComponent.DATETIME | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.OBJECT ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.ARRAY ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RECORD ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.MAP ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_NUMBER ? DisplayFieldComponent.RANGE_NUMBER | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_DATE ? DisplayFieldComponent.RANGE_DATE | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_TIME ? DisplayFieldComponent.RANGE_TIME | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_DATETIME ? DisplayFieldComponent.RANGE_DATETIME | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_BIGDECIMAL ? DisplayFieldComponent.RANGE_BIGDECIMAL | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_MONEY ? DisplayFieldComponent.RANGE_MONEY | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.MONEY ? DisplayFieldComponent.MONEY | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.DURATION ? DisplayFieldComponent.DURATION | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.PHONE ? DisplayFieldComponent.PHONE | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.BIGDECIMAL ? DisplayFieldComponent.BIGDECIMAL | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.CODE ? DisplayFieldComponent.CODE | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.FILE ? DisplayFieldComponent.FILE | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.SET ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.TUPLE ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.VERSIONED_FOREIGN_KEY ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.VERSIONED_OBJECT ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.UNKNOWN ? DisplayFieldComponent.SIMPLE_TEXT : never;
238
+ [K in FieldSchemaType]: K extends FieldSchemaType.STRING ? DisplayFieldComponent.STRING | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.NUMBER ? DisplayFieldComponent.NUMBER | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.BIGINT ? DisplayFieldComponent.NUMBER | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.BOOLEAN ? DisplayFieldComponent.BOOLEAN | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.ENUM ? DisplayFieldComponent.ENUM | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.DATE ? DisplayFieldComponent.DATE | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.TIME ? DisplayFieldComponent.TIME | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.DATETIME ? DisplayFieldComponent.DATETIME | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.OBJECT ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.ARRAY ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RECORD ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.MAP ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_NUMBER ? DisplayFieldComponent.RANGE_NUMBER | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_DATE ? DisplayFieldComponent.RANGE_DATE | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_TIME ? DisplayFieldComponent.RANGE_TIME | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_DATETIME ? DisplayFieldComponent.RANGE_DATETIME | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_BIGDECIMAL ? DisplayFieldComponent.RANGE_BIGDECIMAL | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_MONEY ? DisplayFieldComponent.RANGE_MONEY | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.MONEY ? DisplayFieldComponent.MONEY | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.DURATION ? DisplayFieldComponent.DURATION | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.PHONE ? DisplayFieldComponent.PHONE | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.ADDRESS ? DisplayFieldComponent.ADDRESS | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.BIGDECIMAL ? DisplayFieldComponent.BIGDECIMAL | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.CODE ? DisplayFieldComponent.CODE | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.FILE ? DisplayFieldComponent.FILE | DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.SET ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.TUPLE ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.VERSIONED_FOREIGN_KEY ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.VERSIONED_OBJECT ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.UNKNOWN ? DisplayFieldComponent.SIMPLE_TEXT : never;
236
239
  };
237
240
  export type DisplayComponentForSchemaType<T extends FieldSchemaType> = DisplayFieldSchemaTypeComponents[T];
238
241
  export type DisplayFieldSchemaTypeDefaultComponent = {
239
- [K in FieldSchemaType]: K extends FieldSchemaType.STRING ? DisplayFieldComponent.STRING : K extends FieldSchemaType.NUMBER ? DisplayFieldComponent.NUMBER : K extends FieldSchemaType.BIGINT ? DisplayFieldComponent.NUMBER : K extends FieldSchemaType.BOOLEAN ? DisplayFieldComponent.BOOLEAN : K extends FieldSchemaType.ENUM ? DisplayFieldComponent.ENUM : K extends FieldSchemaType.DATE ? DisplayFieldComponent.DATE : K extends FieldSchemaType.TIME ? DisplayFieldComponent.TIME : K extends FieldSchemaType.DATETIME ? DisplayFieldComponent.DATETIME : K extends FieldSchemaType.OBJECT ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.ARRAY ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RECORD ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.MAP ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_NUMBER ? DisplayFieldComponent.RANGE_NUMBER : K extends FieldSchemaType.RANGE_DATE ? DisplayFieldComponent.RANGE_DATE : K extends FieldSchemaType.RANGE_TIME ? DisplayFieldComponent.RANGE_TIME : K extends FieldSchemaType.RANGE_DATETIME ? DisplayFieldComponent.RANGE_DATETIME : K extends FieldSchemaType.RANGE_BIGDECIMAL ? DisplayFieldComponent.RANGE_BIGDECIMAL : K extends FieldSchemaType.RANGE_MONEY ? DisplayFieldComponent.RANGE_MONEY : K extends FieldSchemaType.MONEY ? DisplayFieldComponent.MONEY : K extends FieldSchemaType.DURATION ? DisplayFieldComponent.DURATION : K extends FieldSchemaType.PHONE ? DisplayFieldComponent.PHONE : K extends FieldSchemaType.BIGDECIMAL ? DisplayFieldComponent.BIGDECIMAL : K extends FieldSchemaType.CODE ? DisplayFieldComponent.CODE : K extends FieldSchemaType.FILE ? DisplayFieldComponent.FILE : K extends FieldSchemaType.SET ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.TUPLE ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.VERSIONED_FOREIGN_KEY ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.VERSIONED_OBJECT ? DisplayFieldComponent.SIMPLE_TEXT : DisplayFieldComponent.SIMPLE_TEXT;
242
+ [K in FieldSchemaType]: K extends FieldSchemaType.STRING ? DisplayFieldComponent.STRING : K extends FieldSchemaType.NUMBER ? DisplayFieldComponent.NUMBER : K extends FieldSchemaType.BIGINT ? DisplayFieldComponent.NUMBER : K extends FieldSchemaType.BOOLEAN ? DisplayFieldComponent.BOOLEAN : K extends FieldSchemaType.ENUM ? DisplayFieldComponent.ENUM : K extends FieldSchemaType.DATE ? DisplayFieldComponent.DATE : K extends FieldSchemaType.TIME ? DisplayFieldComponent.TIME : K extends FieldSchemaType.DATETIME ? DisplayFieldComponent.DATETIME : K extends FieldSchemaType.OBJECT ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.ARRAY ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RECORD ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.MAP ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.RANGE_NUMBER ? DisplayFieldComponent.RANGE_NUMBER : K extends FieldSchemaType.RANGE_DATE ? DisplayFieldComponent.RANGE_DATE : K extends FieldSchemaType.RANGE_TIME ? DisplayFieldComponent.RANGE_TIME : K extends FieldSchemaType.RANGE_DATETIME ? DisplayFieldComponent.RANGE_DATETIME : K extends FieldSchemaType.RANGE_BIGDECIMAL ? DisplayFieldComponent.RANGE_BIGDECIMAL : K extends FieldSchemaType.RANGE_MONEY ? DisplayFieldComponent.RANGE_MONEY : K extends FieldSchemaType.MONEY ? DisplayFieldComponent.MONEY : K extends FieldSchemaType.DURATION ? DisplayFieldComponent.DURATION : K extends FieldSchemaType.PHONE ? DisplayFieldComponent.PHONE : K extends FieldSchemaType.ADDRESS ? DisplayFieldComponent.ADDRESS : K extends FieldSchemaType.BIGDECIMAL ? DisplayFieldComponent.BIGDECIMAL : K extends FieldSchemaType.CODE ? DisplayFieldComponent.CODE : K extends FieldSchemaType.FILE ? DisplayFieldComponent.FILE : K extends FieldSchemaType.SET ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.TUPLE ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.VERSIONED_FOREIGN_KEY ? DisplayFieldComponent.SIMPLE_TEXT : K extends FieldSchemaType.VERSIONED_OBJECT ? DisplayFieldComponent.SIMPLE_TEXT : DisplayFieldComponent.SIMPLE_TEXT;
240
243
  };
241
244
  export type DefaultDisplayComponentForSchemaType<T extends FieldSchemaType> = DisplayFieldSchemaTypeDefaultComponent[T];
242
245
  /**
@@ -366,6 +369,50 @@ export declare const BooleanLabellingValue: {
366
369
  readonly ACTIVE_INACTIVE: "active/inactive";
367
370
  };
368
371
  export type BooleanLabellingValue = typeof BooleanLabellingValue[keyof typeof BooleanLabellingValue];
372
+ /**
373
+ * WHY a field has nothing to show — the semantic half of an empty rendering.
374
+ *
375
+ * ## The problem this names
376
+ *
377
+ * Every empty value rendered as one em dash, and an em dash says four different things at once.
378
+ * Administration → Entitlements showed five rows of "—" for a ledger whose emptiness is the CORRECT
379
+ * and reassuring state ("nothing is overridden"); an SSO pane showed "—" for `verifiedDomains`,
380
+ * which an operator can fill, beside "—" for `domainVerificationStatus`, which is computed and which
381
+ * they cannot. A reader cannot tell a working empty ledger from a failed read, nor a field awaiting
382
+ * their input from one awaiting the system's.
383
+ *
384
+ * ## Derived, never authored
385
+ *
386
+ * No new decoration: the reason is computed from what the field already declares and from the shape
387
+ * of the emptiness at the render site. A field added tomorrow is classified without anybody
388
+ * remembering to mark it — a derivation that is TOTAL over the vocabulary, which a hand-kept list of
389
+ * marked fields can never be.
390
+ *
391
+ * This is the REASON. How it renders — an em dash, the word, nothing at all, a skeleton — stays
392
+ * `AutoEmptyValue`, a surface policy. Keeping them apart is what lets one surface show "No domains
393
+ * yet" while a dense table keeps its dash, without either deciding what the emptiness MEANS.
394
+ */
395
+ export declare const DisplayEmptyReason: {
396
+ /**
397
+ * Writable and unset. The operator can fill it, and the word should invite that.
398
+ * `verifiedDomains` before a domain is claimed.
399
+ */
400
+ readonly NOT_SET: "not-set";
401
+ /**
402
+ * A COLLECTION with no members — an empty array, object or record. Distinct from `NOT_SET`
403
+ * because "none yet" is a statement about a list that exists, not about a field nobody has
404
+ * touched, and because an empty ledger is frequently the correct state rather than a gap.
405
+ */
406
+ readonly NONE: "none";
407
+ /**
408
+ * Nothing has produced a value, and the operator cannot produce one either — the field is
409
+ * `.excludeFromUpdate()`, so it is computed, derived or system-owned. `domainVerificationStatus`
410
+ * with no domain to verify. Rendering this identically to `NOT_SET` is what sends an operator
411
+ * hunting for a control that does not exist.
412
+ */
413
+ readonly NOT_PROVIDED: "not-provided";
414
+ };
415
+ export type DisplayEmptyReason = typeof DisplayEmptyReason[keyof typeof DisplayEmptyReason];
369
416
  /**
370
417
  * Display mode for boolean fields
371
418
  */
@@ -408,12 +455,24 @@ export declare const StringDisplayMode: {
408
455
  * it identifies. Use for values a reader needs to copy or trace, never to read as content.
409
456
  */
410
457
  readonly IDENTIFIER: "identifier";
458
+ /**
459
+ * HTML written by someone OUTSIDE the application — the HTML part of a received email. Rendered in a sandboxed
460
+ * frame that runs nothing and fetches nothing (no remote image, stylesheet or font: a remote image is a read
461
+ * receipt), with the message's own styles confined to the frame. Never use it for HTML the application authored.
462
+ */
463
+ readonly UNTRUSTED_HTML: "untrusted_html";
411
464
  readonly COLOR: "color";
412
465
  readonly LINK: "link";
413
466
  readonly EMAIL: "email";
414
467
  readonly BADGE: "badge";
415
468
  readonly COPY: "copy";
416
469
  readonly SECRET: "secret";
470
+ /**
471
+ * The value is a KEY of the organization role table (#1921) — render the role's WORD from the application's
472
+ * `roles` labels, never the key. A role with no authored word shows its key, visibly unlabelled. Pair with
473
+ * `edit.editMode: StringEditMode.ORGANIZATION_ROLE` so the field is picked the way it is read.
474
+ */
475
+ readonly ORGANIZATION_ROLE: "organization_role";
417
476
  };
418
477
  export type StringDisplayMode = typeof StringDisplayMode[keyof typeof StringDisplayMode];
419
478
  /**
@@ -433,6 +492,15 @@ export declare const StringEditMode: {
433
492
  * separate future edit mode/component.
434
493
  */
435
494
  readonly MARKDOWN: "markdown";
495
+ /**
496
+ * A SINGLE-ROLE picker (#1921): the field's value is one key of the organization role table — the core
497
+ * organization roles plus the application's custom organization roles, as the backend publishes them on
498
+ * `/application-config` (`organizationRoles`). Each option reads as the role's word from the `roles` labels. Use it
499
+ * for any string field that names ONE role a setting admits (a reader role, a routing role), so an administrator
500
+ * picks a role that exists instead of typing a key exactly. Falls back to a text input when the backend publishes no
501
+ * table. The server remains the control: it decides what holding the role grants.
502
+ */
503
+ readonly ORGANIZATION_ROLE: "organization_role";
436
504
  };
437
505
  export type StringEditMode = typeof StringEditMode[keyof typeof StringEditMode];
438
506
  /**
@@ -511,6 +579,40 @@ export declare const EnumEditMode: {
511
579
  readonly COMBOBOX: "combobox";
512
580
  };
513
581
  export type EnumEditMode = typeof EnumEditMode[keyof typeof EnumEditMode];
582
+ /**
583
+ * How an ARRAY OF ENUM VALUES is chosen — the MULTIPLE-selection sibling of {@link EnumEditMode},
584
+ * and a category of its own rather than a flag on that one.
585
+ *
586
+ * Picking several of a closed set is a different act from picking one, and the controls are
587
+ * different controls: a checkbox group, a multi-select trigger showing chips, a segmented group
588
+ * where any number of segments can be on. Before this vocabulary existed an array of enums
589
+ * declared its shape with the SINGLE-select one — `z.array(z.enum(X).enumUI({ edit: { editMode:
590
+ * EnumEditMode.COMBOBOX } }))` — so one member meant two different controls depending on whether
591
+ * the field happened to be an array, and the other seven meant nothing at all there. Two meanings
592
+ * on one enum member is exactly the merge a framework must not make.
593
+ *
594
+ * **There is no RADIO twin, and that absence is the point.** A radio group is single-choice by
595
+ * definition; its multiple form IS the checkbox group, which is why `CHECKBOX` sits where `RADIO`
596
+ * and `RADIO_ICON_ONLY` sit in the single vocabulary. Every other member is the same control
597
+ * admitting more than one answer.
598
+ */
599
+ export declare const EnumMultipleEditMode: {
600
+ /** A checkbox per option. The default: it shows the whole vocabulary and says "any number" without being told. */
601
+ readonly CHECKBOX: "checkbox";
602
+ /** A dropdown whose trigger carries the chosen values as chips. For a vocabulary too long to list inline. */
603
+ readonly SELECT: "select";
604
+ /** A segmented group where any number of segments can be on at once. */
605
+ readonly TOGGLE: "toggle";
606
+ /** The same group, each segment reduced to its value's glyph. */
607
+ readonly TOGGLE_ICON_ONLY: "toggle_icon_only";
608
+ /** One card per option, each independently on or off. */
609
+ readonly CARD: "card";
610
+ /** The same grid, each card reduced to its value's glyph. */
611
+ readonly CARD_ICON_ONLY: "card_icon_only";
612
+ /** A searchable popover with chips. For a long vocabulary someone types their way through. */
613
+ readonly COMBOBOX: "combobox";
614
+ };
615
+ export type EnumMultipleEditMode = typeof EnumMultipleEditMode[keyof typeof EnumMultipleEditMode];
514
616
  /**
515
617
  * Layout direction for form layouts
516
618
  */
@@ -947,6 +1049,34 @@ export interface PhoneSchemaOptions {
947
1049
  /** Default country when parsing numbers without country code */
948
1050
  defaultCountry?: PhoneCountryCode;
949
1051
  }
1052
+ /**
1053
+ * Metadata stored on address schemas for detection and configuration (#561).
1054
+ *
1055
+ * Country codes are ISO 3166-1 alpha-2 STRINGS rather than the `AvailableCountry` enum on purpose:
1056
+ * that enum lives in `@wildo-ai/presets-components-models`, which depends on this package, so importing
1057
+ * it here would be a cycle — the same reason `PhoneUIParams.displayCountry` is a string.
1058
+ */
1059
+ export interface AddressSchemaMetadata {
1060
+ /** Marker for detecting address schemas */
1061
+ isAddress: true;
1062
+ /** Whether the form offers the optional `coordinates` pair for editing. The value may carry one either way. */
1063
+ withCoordinates: boolean;
1064
+ /** Countries a value may name (uppercase ISO 3166-1 alpha-2). Absent means any country. */
1065
+ countriesAllowed?: readonly string[];
1066
+ /** Country pre-selected for a new value (uppercase ISO 3166-1 alpha-2). */
1067
+ defaultCountry?: string;
1068
+ }
1069
+ /**
1070
+ * Options for creating an address schema via z_address().
1071
+ */
1072
+ export interface AddressSchemaOptions {
1073
+ /** Offer the optional `{ latitude, longitude }` pair in the form. Default `false`. */
1074
+ withCoordinates?: boolean;
1075
+ /** Restrict the countries a value may name (ISO 3166-1 alpha-2, any case). */
1076
+ countriesAllowed?: readonly string[];
1077
+ /** Country pre-selected for a new value (ISO 3166-1 alpha-2, any case). Must be allowed when `countriesAllowed` is set. */
1078
+ defaultCountry?: string;
1079
+ }
950
1080
  /**
951
1081
  * Supported code/programming languages for code schemas.
952
1082
  */
@@ -1158,10 +1288,13 @@ export interface FileMediaPreviewOptions {
1158
1288
  * EXPRESSES PREFERENCE: list several and the first CONFIGURED one is used. Omit the option entirely
1159
1289
  * and the field resolves to managed storage.
1160
1290
  *
1161
- * ⚠️ **`WILDO_MANAGED`, `LOCAL_DIRECTORY` and `GOOGLE_DRIVE` have a provider behind them.** `ONEDRIVE`
1162
- * and `DROPBOX` are declared vocabulary with no implementation — a field naming only those has no
1163
- * configured provider, and startup configuration validation refuses the application rather than
1164
- * letting it serve a field that could never accept an upload.
1291
+ * ⚠️ **The engine serves `WILDO_MANAGED`, `LOCAL_DIRECTORY` and `GOOGLE_DRIVE` itself.** Any other
1292
+ * member is served only when a loaded provider CONTRIBUTES a storage adapter for it:
1293
+ * `ONEDRIVE` is served by the engine's `microsoft-onedrive` provider (a person's own OneDrive,
1294
+ * commercial cloud only) once the application scopes that provider; nothing serves
1295
+ * `DROPBOX`. A field naming only storages nothing serves has no configured provider, and startup
1296
+ * configuration validation refuses the application rather than letting it serve a field that could
1297
+ * never accept an upload.
1165
1298
  *
1166
1299
  * `GOOGLE_DRIVE` is a VENDOR storage: the bytes live in a person's Drive and are reached through the
1167
1300
  * delegated grant of whoever linked (via the Drive picker) or uploaded them, never through an
@@ -1369,11 +1502,16 @@ export type AudioFormat = typeof AudioFormat[keyof typeof AudioFormat];
1369
1502
  * field's `nature`. `imageConstraints`, `videoConstraints`, `audioConstraints` and
1370
1503
  * `documentConstraints` on the `z_file()` options each take the matching interface below.
1371
1504
  *
1372
- * ⚠️ **A constraint describes what the FIELD ACCEPTS, not what the bytes ARE.** The media type comes
1373
- * from the upload's declared content type; nothing here decodes the file to confirm that something
1374
- * claiming to be an image is one. Treat these as an authoring contract and a form control's
1375
- * behaviour, not as a security boundary — the defence against a mislabelled file is on the SERVING
1376
- * side, where every response carries a no-sniff header and a restrictive content policy.
1505
+ * Image geometry declared with `nature: FileNature.IMAGE` is enforced on multipart uploads by the
1506
+ * default backend image analyzer. Bounds are inclusive positive integer pixels; aspect ratio
1507
+ * permits a 1% relative difference. Measurements use EXIF-oriented, per-frame dimensions from
1508
+ * image headers. Invalid declarations or unavailable/failed analysis refuse the upload.
1509
+ * Metadata-only remote links cannot establish geometry and are refused for these fields; upload
1510
+ * the image bytes instead. Browser cropping prepares an image but cannot authorize its admission.
1511
+ *
1512
+ * Type/extension checks still use the upload's declared MIME type and filename. Header geometry
1513
+ * does not prove complete pixel integrity, content-type authenticity or malware safety. Other
1514
+ * media analyzers retain their optional policies; serving headers and scanning remain separate.
1377
1515
  *
1378
1516
  * ⚠️ **`generateThumbnails` (image, PLURAL) and `generateThumbnail` (video, SINGULAR) are different
1379
1517
  * options on different bags.** The names differ by one letter and do not behave alike; read each
@@ -1533,11 +1671,33 @@ export interface FileGenerationConfig {
1533
1671
  templateId: string;
1534
1672
  }
1535
1673
  /** @wildo_source:part:end zod.decorators.file-generation */
1674
+ /**
1675
+ * @wildo_source:part:start zod.decorators.file-readiness-metadata
1676
+ *
1677
+ * Import FileReadiness and FileMetadata from @wildo-ai/zod-decorators.
1678
+ * Standard file fields wait for READY before publishing new references to forms/autosave.
1679
+ * Custom upload clients must inspect the returned metadata, refresh PROCESSING through
1680
+ * the authorized metadata endpoint, and refuse unknown or UNAVAILABLE results.
1681
+ * An HTTP upload success is not evidence that asynchronous scanning finished.
1682
+ *
1683
+ * Attachment readiness, distinct from storage lifecycle and download authorization.
1684
+ * READY may be attached; ATTACHED may be retained by its current parent, not reused elsewhere.
1685
+ * PROCESSING must be refreshed; UNAVAILABLE cannot be newly attached. A downloadable orphan
1686
+ * can still be UNAVAILABLE here. Server authorization remains authoritative for every operation.
1687
+ */
1688
+ export declare enum FileReadiness {
1689
+ READY = "ready",
1690
+ PROCESSING = "processing",
1691
+ ATTACHED = "attached",
1692
+ UNAVAILABLE = "unavailable"
1693
+ }
1536
1694
  /**
1537
1695
  * File metadata returned by the getMetadata endpoint.
1538
1696
  * This describes the uploaded file's properties.
1539
1697
  */
1540
1698
  export type FileMetadata = {
1699
+ /** Server-derived attachment readiness; never infer this from an upload HTTP success. */
1700
+ readiness: FileReadiness;
1541
1701
  /** Unique file identifier */
1542
1702
  fileId: string;
1543
1703
  /** Original filename */
@@ -1567,6 +1727,7 @@ export type FileMetadata = {
1567
1727
  /** Upload timestamp */
1568
1728
  uploadedAt: Date;
1569
1729
  } & FileUploaderOwnership;
1730
+ /** @wildo_source:part:end zod.decorators.file-readiness-metadata */
1570
1731
  /**
1571
1732
  * @wildo_source:part:start zod.decorators.file-vocabularies
1572
1733
  *
@@ -2109,12 +2270,6 @@ export interface UniqueFieldParams {
2109
2270
  * @default true
2110
2271
  */
2111
2272
  sparse?: boolean;
2112
- /**
2113
- * Custom error message to show when uniqueness is violated.
2114
- * Supports placeholder {fieldName} which is replaced with the actual field name.
2115
- * @example "This {fieldName} is already taken"
2116
- */
2117
- errorMessage?: string;
2118
2273
  /**
2119
2274
  * The custom message reference the API returns when THIS field's unique index is violated.
2120
2275
  *
@@ -2204,7 +2359,11 @@ export interface BusinessKeySetParams {
2204
2359
  * stays above its target until the rate changes; it reports when it stops early;
2205
2360
  * - a resource CANNOT declare both a lifetime and retrieval-source fields (`.ragSource()`). That
2206
2361
  * pair is refused at startup, because rows expiring under a native index leave with no
2207
- * application code running, so the derived search chunks could never be removed with them.
2362
+ * application code running, so the derived search chunks could never be removed with them;
2363
+ * - a resource scoped to an ORGANIZATION cannot declare a lifetime at all. For the same reason
2364
+ * no legal hold could suspend the deletion, and a hold on an organization covers every row of
2365
+ * it. A lifetime is for application-level plumbing; tenant data binds a retention class
2366
+ * (`retentionBinding`), whose sweep deletes through the service layer and skips held rows.
2208
2367
  *
2209
2368
  * This is unrelated to `retentionPolicy`, which decides what an ERASURE does to a row that must
2210
2369
  * SURVIVE. This one decides whether the row lives at all.
@@ -2476,9 +2635,11 @@ export interface BooleanLabellingCustomParams {
2476
2635
  * How a display field's LABEL is styled, independent of chrome mode (which decides layout).
2477
2636
  *
2478
2637
  * - `DEFAULT` — the chrome's ordinary label treatment.
2479
- * - `TITLE` — the label reads as a SMALL TITLE above its content (small, semibold, foreground):
2480
- * for a field that acts as a mini-section inside a prose flow — "Who suffers it" above its
2481
- * answer — where the ordinary muted label would not carry the structure.
2638
+ * - `TITLE` — the label reads as a SMALL TITLE above its content, in the theme's EYEBROW voice (small,
2639
+ * tracked, uppercase): for a field or a collection that acts as a mini-section inside a prose flow —
2640
+ * "Who suffers it" above its answer, "Rejected categories" above the entries it holds — where the
2641
+ * ordinary muted label would not carry the structure. It is NOT for the rows that qualify an entry's
2642
+ * headline: those keep the ordinary label, or an entry reads as a stack of sections.
2482
2643
  */
2483
2644
  export declare const DisplayLabelStyle: {
2484
2645
  readonly DEFAULT: "default";
@@ -2623,9 +2784,18 @@ export interface BooleanUIParams {
2623
2784
  edit?: BooleanUIEditParams;
2624
2785
  }
2625
2786
  export interface StringUIDisplayParams extends PrimitiveUIBaseDisplayParams {
2626
- /** Display renderer. TEXT | TRUNCATE | MULTILINE | MARKDOWN | COLOR | LINK | EMAIL | BADGE | COPY | SECRET. */
2787
+ /** Display renderer. TEXT | TRUNCATE | MULTILINE | MARKDOWN | IDENTIFIER | UNTRUSTED_HTML | COLOR | LINK | EMAIL | BADGE | COPY | SECRET | ORGANIZATION_ROLE. */
2627
2788
  displayMode?: StringDisplayMode;
2628
- /** Max characters before truncation (TRUNCATE displayMode only). */
2789
+ /**
2790
+ * Max characters of the value to show (TRUNCATE displayMode only). Beyond it the value is cut
2791
+ * and an ellipsis marks that more exists; the full value stays reachable as the element's
2792
+ * `title`.
2793
+ *
2794
+ * This is a CHARACTER cap and it composes with — rather than replaces — the width cap TRUNCATE
2795
+ * already applies through CSS. A value is clipped by whichever of the two is shorter, so the
2796
+ * cap holds on a wide screen where the container would have had room, which is the point of
2797
+ * declaring it. Leave it unset to keep width as the only axis.
2798
+ */
2629
2799
  truncateLength?: number;
2630
2800
  /**
2631
2801
  * SECRET displayMode only: render the value revealed (not masked) on first
@@ -2637,7 +2807,7 @@ export interface StringUIDisplayParams extends PrimitiveUIBaseDisplayParams {
2637
2807
  initiallyRevealed?: boolean;
2638
2808
  }
2639
2809
  export interface StringUIEditParams extends PrimitiveUIBaseEditParams {
2640
- /** Edit control. INPUT | TEXTAREA | COLOR | PASSWORD | OTP. */
2810
+ /** Edit control. INPUT | TEXTAREA | COLOR | PASSWORD | OTP | MARKDOWN | ORGANIZATION_ROLE. */
2641
2811
  editMode?: StringEditMode;
2642
2812
  /** Number of rows for TEXTAREA editMode. */
2643
2813
  textareaRows?: number;
@@ -2666,6 +2836,12 @@ export interface NumberUIParams {
2666
2836
  suffix?: string;
2667
2837
  /** How to interpret percentage values: NORMALIZED (0–1) or PERCENT (0–100). */
2668
2838
  percentageScale?: PercentageScale;
2839
+ /**
2840
+ * The value that means NO LIMIT rather than a quantity (#1851) — a feature limit stores `FEATURES_UNLIMITED` (`-1`).
2841
+ * Displayed as the word for unlimited instead of the number, which read as "minus one projects". Leave it unset for
2842
+ * any number whose every value is a real quantity.
2843
+ */
2844
+ unlimitedAt?: number;
2669
2845
  display?: NumberUIDisplayParams;
2670
2846
  summaryOverride?: NumberUIDisplayParams;
2671
2847
  edit?: NumberUIEditParams;
@@ -2677,6 +2853,17 @@ export interface EnumUIDisplayParams extends PrimitiveUIBaseDisplayParams {
2677
2853
  export interface EnumUIEditParams extends PrimitiveUIBaseEditParams {
2678
2854
  /** Edit control. SELECT | RADIO | RADIO_ICON_ONLY | TOGGLE | TOGGLE_ICON_ONLY | CARD | CARD_ICON_ONLY | COMBOBOX. */
2679
2855
  editMode?: EnumEditMode;
2856
+ /**
2857
+ * How this enum is chosen when the FIELD IS AN ARRAY of it (`z.array(z.enum(X))`).
2858
+ *
2859
+ * A separate key from `editMode`, not a reinterpretation of it: the two vocabularies answer
2860
+ * different questions and share no member meaning. Declared on the ELEMENT rather than on the
2861
+ * array because every other per-value presentation decision — `values`, `defaultIcon`,
2862
+ * `defaultColor` — is declared here too, and splitting them would put half an enum's appearance
2863
+ * in `arrayUI()`, which is otherwise about arrayness (sorting, add mode, item framing) and is
2864
+ * shared with arrays of things that are not enums at all.
2865
+ */
2866
+ multipleEditMode?: EnumMultipleEditMode;
2680
2867
  /** Direction of radio/toggle/checkbox group. Renamed from `layout`. */
2681
2868
  editDirection?: LayoutDirection;
2682
2869
  /** Number of grid columns for radio/toggle/card groups. Renamed from `columns`. */
@@ -2693,20 +2880,62 @@ export interface EnumUIParams {
2693
2880
  summaryOverride?: EnumUIDisplayParams;
2694
2881
  edit?: EnumUIEditParams;
2695
2882
  }
2696
- export type DateUIDisplayParams = PrimitiveUIBaseDisplayParams;
2883
+ /**
2884
+ * How a date or datetime value is PHRASED. The sibling of `StringDisplayMode` and
2885
+ * `NumberDisplayMode` for the temporal primitives.
2886
+ *
2887
+ * Without it every date in every Wildo application reads identically: a `createdAt` on an audit
2888
+ * row and a `dueDate` on a work item are the same pixels, because the only available rendering
2889
+ * was the regional absolute format. The distinction is not cosmetic — a deadline is understood
2890
+ * against NOW, and a record of when something happened is understood against the calendar.
2891
+ *
2892
+ * `AUTO` is the one to reach for on a field that is both at different times: a due date is a
2893
+ * deadline this week and a historical fact next quarter.
2894
+ */
2895
+ export declare const DateDisplayMode: {
2896
+ /** The regional absolute format — what every date rendered as before this vocabulary existed. */
2897
+ readonly ABSOLUTE: "absolute";
2898
+ /** Phrased against now: "tomorrow", "in 3 days", "2 months ago". Always relative, at any distance. */
2899
+ readonly RELATIVE: "relative";
2900
+ /** Relative while the value is near now, absolute once it is not. The near window is a week. */
2901
+ readonly AUTO: "auto";
2902
+ };
2903
+ export type DateDisplayMode = typeof DateDisplayMode[keyof typeof DateDisplayMode];
2904
+ export interface DateUIDisplayParams extends PrimitiveUIBaseDisplayParams {
2905
+ /** How the value is phrased. ABSOLUTE (default) | RELATIVE | AUTO. */
2906
+ displayMode?: DateDisplayMode;
2907
+ }
2697
2908
  export type DateUIEditParams = PrimitiveUIBaseEditParams;
2698
2909
  export interface DateUIParams {
2699
2910
  display?: DateUIDisplayParams;
2700
2911
  summaryOverride?: DateUIDisplayParams;
2701
2912
  edit?: DateUIEditParams;
2702
2913
  }
2703
- export type DateTimeUIDisplayParams = PrimitiveUIBaseDisplayParams;
2914
+ export interface DateTimeUIDisplayParams extends PrimitiveUIBaseDisplayParams {
2915
+ /**
2916
+ * How the value is phrased. ABSOLUTE (default) | RELATIVE | AUTO.
2917
+ *
2918
+ * A datetime's relative phrasing resolves finer than a date's — "in 20 minutes", "3 hours ago"
2919
+ * — because the value carries a time of day to be precise about. Beyond a day it falls back to
2920
+ * the same calendar units a date uses.
2921
+ */
2922
+ displayMode?: DateDisplayMode;
2923
+ }
2704
2924
  export type DateTimeUIEditParams = PrimitiveUIBaseEditParams;
2705
2925
  export interface DateTimeUIParams {
2706
2926
  display?: DateTimeUIDisplayParams;
2707
2927
  summaryOverride?: DateTimeUIDisplayParams;
2708
2928
  edit?: DateTimeUIEditParams;
2709
2929
  }
2930
+ /**
2931
+ * DELIBERATELY has no `displayMode`, and this is a statement rather than an omission.
2932
+ *
2933
+ * A time-of-day carries no date, so "relative to now" has no answer: is `09:30` this morning,
2934
+ * tomorrow morning, or the opening hour of a shop that never happens on any particular day? Any
2935
+ * relative phrasing would have to ASSUME a date the value does not hold, and would be confidently
2936
+ * wrong on exactly the fields — opening hours, schedules, recurring slots — that `z.time()` exists
2937
+ * for. A field that wants a relative phrasing is carrying a datetime and should say so.
2938
+ */
2710
2939
  export type TimeUIDisplayParams = PrimitiveUIBaseDisplayParams;
2711
2940
  export type TimeUIEditParams = PrimitiveUIBaseEditParams;
2712
2941
  export interface TimeUIParams {
@@ -2824,6 +3053,36 @@ export interface ForeignKeyUIDisplayParams extends PrimitiveUIBaseDisplayParams
2824
3053
  linkable?: boolean;
2825
3054
  /** Override the preset used to display the referenced resource summary. */
2826
3055
  displayPresetOverride?: string;
3056
+ /**
3057
+ * A SIBLING field on the SAME record holding a readable copy of the referenced row's label —
3058
+ * used when the reference itself cannot be resolved, INSTEAD of printing the raw id.
3059
+ *
3060
+ * ## Why a raw id is not an acceptable fallback
3061
+ *
3062
+ * `ForeignKeyDisplayMode.LABEL` is the default and resolves the referenced row's label. When that
3063
+ * resolution yields nothing the renderer had one option left: print the foreign key. Measured
3064
+ * 2026-09-19 on the Settings hub's member directory — three of four rows showed
3065
+ * `6aaba6b3a2d3b6b0ad61f33e` in the USER column, because those people are invited and have no
3066
+ * `USER_PROFILE` for a label to come from. The fourth, a real user, resolved.
3067
+ *
3068
+ * The readable value was on the row the whole time. `organizationMembers.userEmail` is a
3069
+ * denormalized immutable copy of the linked user's email whose own docstring says it exists so "a
3070
+ * membership row can be read without resolving the user" — exactly this case — and it is
3071
+ * `.isHidden({ display: true })` precisely BECAUSE "the user-facing email is surfaced by resolving
3072
+ * the `userId` reference". When that resolution fails, the design's own premise fails with it and
3073
+ * nothing picks the copy up.
3074
+ *
3075
+ * ## Why this is declared rather than derived
3076
+ *
3077
+ * Nothing in the schema says "this field is a readable copy of that reference". A convention
3078
+ * guessed from the name (`userId` → `userEmail`) would be wrong the first time a resource spells
3079
+ * it differently, and silently. So the relationship is NAMED by the one author who knows it, and
3080
+ * omitting it keeps today's behaviour exactly.
3081
+ *
3082
+ * Read from the record being displayed; a missing or empty sibling falls through to the id as
3083
+ * before, so this can never render less than it does now.
3084
+ */
3085
+ labelFallbackField?: string;
2827
3086
  }
2828
3087
  export interface ForeignKeyUIEditParams extends PrimitiveUIBaseEditParams {
2829
3088
  /**
@@ -3126,6 +3385,7 @@ export declare enum CodePrimitiveKind {
3126
3385
  FILE = "file",
3127
3386
  DURATION = "duration",
3128
3387
  PHONE = "phone",
3388
+ ADDRESS = "address",
3129
3389
  BIGDECIMAL = "bigdecimal",
3130
3390
  UNKNOWN = "unknown"
3131
3391
  }
@@ -3684,15 +3944,37 @@ export interface CustomFieldMetadata {
3684
3944
  durationConfig?: DurationSchemaMetadata;
3685
3945
  /** Phone schema configuration (only present for phone schemas) */
3686
3946
  phoneConfig?: PhoneSchemaMetadata;
3947
+ /** Address schema configuration (only present for address schemas) */
3948
+ addressConfig?: AddressSchemaMetadata;
3687
3949
  /** Code schema configuration (only present for code schemas) */
3688
3950
  codeConfig?: CodeSchemaMetadata;
3689
3951
  /** File schema configuration (only present for file schemas) */
3690
3952
  fileConfig?: FileSchemaMetadata;
3953
+ /**
3954
+ * Set on an UPDATE request DTO object whose keys follow the PATCH write rule — see
3955
+ * `RequestDtoWriteSemantics` and `markPatchRequestDtoObject`. Absent on every other object.
3956
+ */
3957
+ requestDtoWriteSemantics?: RequestDtoWriteSemantics;
3691
3958
  /** Versioned schema configuration (only present for versioned schemas) */
3692
3959
  versionedConfig?: VersionedSchemaMetadata;
3693
3960
  /** Versioned foreign key configuration (only present for versioned foreign key schemas) */
3694
3961
  versionedForeignKeyConfig?: VersionedForeignKeySchemaMetadata;
3695
3962
  }
3963
+ /**
3964
+ * How the keys of a request DTO OBJECT are written — the fact a form needs to decide how a field inside it
3965
+ * is cleared (#989).
3966
+ *
3967
+ * Only one member exists because only one rule needs naming. A request DTO's UPDATE root is written PATCH
3968
+ * style: an ABSENT key leaves the stored value untouched, so clearing needs an explicit `null`, and
3969
+ * `toPatchOptionalField` admits that null. An object VALUE nested inside a field (`reminder`, an address)
3970
+ * is written WHOLE instead: the persistence layer clears only top-level fields, a stored nested `null`
3971
+ * would fail the main schema's `.optional()` on the next read, and absence is therefore the only clear.
3972
+ * An object carrying no member is written whole.
3973
+ */
3974
+ export declare enum RequestDtoWriteSemantics {
3975
+ /** Absent key = untouched, `null` = clear. The UPDATE request DTO root, and a nested child's update branch. */
3976
+ PATCH = "patch"
3977
+ }
3696
3978
  /** @wildo_source:part:end zod.decorators.schema-metadata */
3697
3979
  type ZodenumInstance = ReturnType<typeof z.enum>;
3698
3980
  export type PrimitiveZodType = z.ZodString | z.ZodNumber | z.ZodBoolean | z.ZodDate | z.ZodEnum<any> | ZodenumInstance | ZodBrandedColorInstance | DecoratedPrimitiveZodType<z.ZodString> | DecoratedPrimitiveZodType<z.ZodNumber> | DecoratedPrimitiveZodType<z.ZodBoolean> | DecoratedPrimitiveZodType<z.ZodDate> | DecoratedPrimitiveZodType<z.ZodEnum<any>> | DecoratedPrimitiveZodType<ZodenumInstance>;