@ng-forge/dynamic-form-mcp 0.7.0 → 0.8.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,12 +20,6 @@ var FIELD_TYPES = [
20
20
  description: "HTML input type",
21
21
  required: false,
22
22
  default: "text"
23
- },
24
- placeholder: {
25
- name: "placeholder",
26
- type: "DynamicText",
27
- description: "Placeholder text displayed when field is empty",
28
- required: false
29
23
  }
30
24
  },
31
25
  validationSupported: true,
@@ -37,7 +31,8 @@ var FIELD_TYPES = [
37
31
  label: 'Email Address',
38
32
  required: true,
39
33
  email: true,
40
- props: { type: 'email', placeholder: 'user@example.com' }
34
+ placeholder: 'user@example.com',
35
+ props: { type: 'email' }
41
36
  }`,
42
37
  minimalExample: `{ key: 'name', type: 'input', label: 'Name' }`
43
38
  },
@@ -54,12 +49,6 @@ var FIELD_TYPES = [
54
49
  description: "Number of visible text lines",
55
50
  required: false,
56
51
  default: 3
57
- },
58
- placeholder: {
59
- name: "placeholder",
60
- type: "DynamicText",
61
- description: "Placeholder text displayed when field is empty",
62
- required: false
63
52
  }
64
53
  },
65
54
  validationSupported: true,
@@ -69,7 +58,8 @@ var FIELD_TYPES = [
69
58
  key: 'description',
70
59
  type: 'textarea',
71
60
  label: 'Description',
72
- props: { rows: 5, placeholder: 'Enter description...' }
61
+ placeholder: 'Enter description...',
62
+ props: { rows: 5 }
73
63
  }`,
74
64
  minimalExample: `{ key: 'bio', type: 'textarea', label: 'Bio' }`
75
65
  },
@@ -92,12 +82,6 @@ var FIELD_TYPES = [
92
82
  description: "Allow multiple selections",
93
83
  required: false,
94
84
  default: false
95
- },
96
- placeholder: {
97
- name: "placeholder",
98
- type: "DynamicText",
99
- description: "Placeholder text for empty selection",
100
- required: false
101
85
  }
102
86
  },
103
87
  validationSupported: true,
@@ -444,7 +428,7 @@ var FIELD_TYPES = [
444
428
  {
445
429
  type: "array",
446
430
  category: "container",
447
- description: 'Repeatable field group for dynamic lists/arrays. Arrays do NOT have a label property. Use "fields" (not "template") to define the item template. Supports only \'hidden\' logic type for conditional visibility. Supports minLength/maxLength for array size validation. Each array item is rendered inside a `<div class="df-array-item">` wrapper with `role="group"`, `aria-label="Item N"` (1-based), `data-array-item-id`, and `data-array-item-index` attributes for styling, accessibility, and testing.',
431
+ description: 'Repeatable field group for dynamic lists/arrays. Arrays do NOT have a label property. Use "fields" (not "template") to define the item template. Supports only \'hidden\' logic type for conditional visibility. Supports minLength/maxLength for array size validation. Full-API arrays are positional \u2014 each item must have its own entry in `fields`. For homogeneous arrays driven by a value (e.g., tags, contacts), use the simplified array API (`template` + `value`) instead. Each array item is rendered inside a `<div class="df-array-item">` wrapper with `role="group"`, `aria-label="Item N"` (1-based), `data-array-item-id`, and `data-array-item-index` attributes for styling, accessibility, and testing.',
448
432
  valueType: "T[]",
449
433
  baseInterface: "FieldDef",
450
434
  props: {
@@ -961,6 +945,20 @@ var UI_ADAPTERS = [
961
945
  required: false,
962
946
  default: "dynamic"
963
947
  },
948
+ floatLabel: {
949
+ name: "floatLabel",
950
+ type: "'auto' | 'always' | 'never'",
951
+ description: "Label float behavior",
952
+ required: false,
953
+ default: "auto"
954
+ },
955
+ hideRequiredMarker: {
956
+ name: "hideRequiredMarker",
957
+ type: "boolean",
958
+ description: "Hide the required asterisk",
959
+ required: false,
960
+ default: false
961
+ },
964
962
  hint: {
965
963
  name: "hint",
966
964
  type: "DynamicText",
@@ -979,6 +977,26 @@ var UI_ADAPTERS = [
979
977
  description: "Material form field appearance",
980
978
  required: false,
981
979
  default: "outline"
980
+ },
981
+ floatLabel: {
982
+ name: "floatLabel",
983
+ type: "'auto' | 'always' | 'never'",
984
+ description: "Label float behavior",
985
+ required: false,
986
+ default: "auto"
987
+ },
988
+ hideRequiredMarker: {
989
+ name: "hideRequiredMarker",
990
+ type: "boolean",
991
+ description: "Hide the required asterisk",
992
+ required: false,
993
+ default: false
994
+ },
995
+ hint: {
996
+ name: "hint",
997
+ type: "DynamicText",
998
+ description: "Hint text below the field",
999
+ required: false
982
1000
  }
983
1001
  }
984
1002
  },
@@ -999,12 +1017,118 @@ var UI_ADAPTERS = [
999
1017
  type: "datepicker",
1000
1018
  componentName: "MatDatepickerFieldComponent",
1001
1019
  additionalProps: {
1020
+ appearance: {
1021
+ name: "appearance",
1022
+ type: "'fill' | 'outline'",
1023
+ description: "Material form field appearance",
1024
+ required: false,
1025
+ default: "outline"
1026
+ },
1027
+ subscriptSizing: {
1028
+ name: "subscriptSizing",
1029
+ type: "'fixed' | 'dynamic'",
1030
+ description: "Error/hint text sizing",
1031
+ required: false,
1032
+ default: "dynamic"
1033
+ },
1034
+ floatLabel: {
1035
+ name: "floatLabel",
1036
+ type: "'auto' | 'always' | 'never'",
1037
+ description: "Label float behavior",
1038
+ required: false,
1039
+ default: "auto"
1040
+ },
1041
+ hideRequiredMarker: {
1042
+ name: "hideRequiredMarker",
1043
+ type: "boolean",
1044
+ description: "Hide the required asterisk",
1045
+ required: false,
1046
+ default: false
1047
+ },
1002
1048
  startView: {
1003
1049
  name: "startView",
1004
1050
  type: "'month' | 'year' | 'multi-year'",
1005
1051
  description: "Initial calendar view",
1006
1052
  required: false,
1007
1053
  default: "month"
1054
+ },
1055
+ touchUi: {
1056
+ name: "touchUi",
1057
+ type: "boolean",
1058
+ description: "Use touch-friendly calendar UI",
1059
+ required: false,
1060
+ default: false
1061
+ },
1062
+ hint: {
1063
+ name: "hint",
1064
+ type: "DynamicText",
1065
+ description: "Hint text below the field",
1066
+ required: false
1067
+ }
1068
+ }
1069
+ },
1070
+ {
1071
+ type: "textarea",
1072
+ componentName: "MatTextareaFieldComponent",
1073
+ additionalProps: {
1074
+ appearance: {
1075
+ name: "appearance",
1076
+ type: "'fill' | 'outline'",
1077
+ description: "Material form field appearance",
1078
+ required: false,
1079
+ default: "outline"
1080
+ },
1081
+ subscriptSizing: {
1082
+ name: "subscriptSizing",
1083
+ type: "'fixed' | 'dynamic'",
1084
+ description: "Error/hint text sizing",
1085
+ required: false,
1086
+ default: "dynamic"
1087
+ },
1088
+ floatLabel: {
1089
+ name: "floatLabel",
1090
+ type: "'auto' | 'always' | 'never'",
1091
+ description: "Label float behavior",
1092
+ required: false,
1093
+ default: "auto"
1094
+ },
1095
+ hideRequiredMarker: {
1096
+ name: "hideRequiredMarker",
1097
+ type: "boolean",
1098
+ description: "Hide the required asterisk",
1099
+ required: false,
1100
+ default: false
1101
+ },
1102
+ hint: {
1103
+ name: "hint",
1104
+ type: "DynamicText",
1105
+ description: "Hint text below the field",
1106
+ required: false
1107
+ },
1108
+ rows: {
1109
+ name: "rows",
1110
+ type: "number",
1111
+ description: "Visible row count",
1112
+ required: false
1113
+ },
1114
+ cols: {
1115
+ name: "cols",
1116
+ type: "number",
1117
+ description: "Visible column count",
1118
+ required: false
1119
+ },
1120
+ resize: {
1121
+ name: "resize",
1122
+ type: "'none' | 'both' | 'horizontal' | 'vertical'",
1123
+ description: "Resize handle behavior",
1124
+ required: false,
1125
+ default: "vertical"
1126
+ },
1127
+ maxLength: {
1128
+ name: "maxLength",
1129
+ type: "number",
1130
+ description: "Maximum character length",
1131
+ required: false
1008
1132
  }
1009
1133
  }
1010
1134
  }
@@ -1279,6 +1403,160 @@ var DOCUMENTATION = [
1279
1403
  { id: "example-array", title: "Complete Array Form", category: "examples", url: `${BASE_URL}/examples/array-form` }
1280
1404
  ];
1281
1405
 
1406
+ // packages/dynamic-form-mcp/src/registry/wrappers.ts
1407
+ var WRAPPER_AUTHORING_CONTRACT = `All wrapper components MUST:
1408
+
1409
+ 1. Implement \`FieldWrapperContract\` from \`@ng-forge/dynamic-forms\`.
1410
+ 2. Expose \`readonly fieldComponent = viewChild.required('fieldComponent', { read: ViewContainerRef });\`
1411
+ \u2014 this is the slot where the inner wrapper (or the field) is rendered
1412
+ imperatively by the outlet.
1413
+ 3. Place the \`#fieldComponent\` template ref UNCONDITIONALLY. It cannot
1414
+ live inside \`@if\`, \`@defer\`, \`@for\`, \`@switch\`, \`<ng-template>\`,
1415
+ or any structural directive that delays view creation. The outlet reads
1416
+ the \`ViewContainerRef\` immediately after creation \u2014 if the slot isn't
1417
+ materialised yet, \`viewChild.required\` throws \`NG0951\`
1418
+ (REQUIRED_QUERY_NO_VALUE), the wrapper chain is torn down, and the field
1419
+ renders bare.
1420
+ 4. Declare every config key the wrapper consumes as an Angular \`input()\`.
1421
+ Unknown keys are silently dropped \u2014 the outlet probes
1422
+ \`reflectComponentType(...).inputs\` before calling \`setInput()\`.
1423
+ Runtime typos in config will NOT throw; rely on TypeScript (via
1424
+ \`FieldRegistryWrappers\` module augmentation) to catch them.
1425
+ 5. Optionally accept \`fieldInputs: input<WrapperFieldInputs>()\` to read
1426
+ the wrapped field's mapper outputs and read-only form state.`;
1427
+ var WRAPPERS = [
1428
+ {
1429
+ type: "css",
1430
+ category: "core",
1431
+ availability: "shipping",
1432
+ package: "@ng-forge/dynamic-forms",
1433
+ description: "Invisible wrapper that applies CSS classes to the host element via a `DynamicText` input. Useful for decorating any field (or container) with styling without authoring a custom wrapper. Resolves `Signal<string>` / `Observable<string>` / `string` uniformly.",
1434
+ props: {
1435
+ cssClasses: {
1436
+ name: "cssClasses",
1437
+ type: "DynamicText",
1438
+ description: "Space-separated CSS class names to apply to the wrapper host element. Accepts a literal string, a Signal<string>, or an Observable<string> \u2014 the wrapper subscribes and updates the host [class] binding reactively.",
1439
+ required: false
1440
+ }
1441
+ },
1442
+ autoAppliesTo: [],
1443
+ componentName: "CssWrapperComponent",
1444
+ contract: WRAPPER_AUTHORING_CONTRACT,
1445
+ example: `// Field-level CSS wrapper (scoped to a single field)
1446
+ {
1447
+ key: 'email',
1448
+ type: 'input',
1449
+ label: 'Email',
1450
+ wrappers: [{ type: 'css', cssClasses: 'field--highlight' }]
1451
+ }
1452
+
1453
+ // Dynamic classes via Signal<string>
1454
+ {
1455
+ key: 'amount',
1456
+ type: 'input',
1457
+ label: 'Amount',
1458
+ wrappers: [{ type: 'css', cssClasses: highlightClass }] // highlightClass: Signal<string>
1459
+ }
1460
+
1461
+ // Chained with other wrappers (outer-most first)
1462
+ {
1463
+ key: 'contact',
1464
+ type: 'group',
1465
+ wrappers: [
1466
+ { type: 'section', title: 'Contact' }, // outer
1467
+ { type: 'css', cssClasses: 'pad-lg' } // inner
1468
+ ],
1469
+ fields: [...]
1470
+ }`,
1471
+ minimalExample: `{ type: 'css', cssClasses: 'my-class' }`
1472
+ },
1473
+ {
1474
+ type: "arraySection",
1475
+ category: "demo",
1476
+ availability: "demo-only",
1477
+ package: "@internal/examples-shared-ui",
1478
+ description: 'Demo wrapper used by the docs sandbox. Wraps an array field in a titled card whose header contains an "Add" button \u2014 the wrapper owns the append behaviour, dispatching `arrayEvent(key).append(itemTemplate)` on click via the `EventBus`. Lets the consumer config drop the separate `addArrayItem` button field. NOT a shipping primitive; copy the component out of `internal/examples-shared-ui/src/lib/demo-wrappers/` or author your own if you want this pattern in production.',
1479
+ props: {
1480
+ title: {
1481
+ name: "title",
1482
+ type: "string",
1483
+ description: "Card header text rendered above the array.",
1484
+ required: false
1485
+ },
1486
+ addLabel: {
1487
+ name: "addLabel",
1488
+ type: "string",
1489
+ description: 'Text for the Add button in the header. Defaults to "Add" when omitted.',
1490
+ required: false
1491
+ },
1492
+ itemTemplate: {
1493
+ name: "itemTemplate",
1494
+ type: "FieldDef<unknown> | readonly FieldDef<unknown>[]",
1495
+ description: "Template passed to `arrayEvent(key).append(template)` when the Add button is clicked. Should match the array's `fields` shape.",
1496
+ required: true
1497
+ }
1498
+ },
1499
+ autoAppliesTo: [],
1500
+ componentName: "ArraySectionWrapperComponent",
1501
+ contract: WRAPPER_AUTHORING_CONTRACT,
1502
+ example: `// Array wrapped with arraySection \u2014 the wrapper owns the Add button
1503
+ import { arrayEvent } from '@ng-forge/dynamic-forms';
1504
+
1505
+ const tagItemTemplate = { key: 'tag', type: 'input', label: 'Tag' } as const satisfies FieldDef;
1506
+
1507
+ {
1508
+ key: 'tags',
1509
+ type: 'array',
1510
+ wrappers: [{
1511
+ type: 'arraySection',
1512
+ title: 'Tags',
1513
+ addLabel: 'Add tag',
1514
+ itemTemplate: tagItemTemplate,
1515
+ }],
1516
+ fields: [tagItemTemplate],
1517
+ }
1518
+ // Clicking the header button dispatches arrayEvent('tags').append(tagItemTemplate)`,
1519
+ minimalExample: `{ type: 'arraySection', title: 'Items', itemTemplate: { key: 'item', type: 'input', label: 'Item' } }`
1520
+ },
1521
+ {
1522
+ type: "section",
1523
+ category: "demo",
1524
+ availability: "demo-only",
1525
+ package: "@internal/examples-shared-ui",
1526
+ description: "Demo wrapper used by the docs sandbox. Renders a titled card around the wrapped content and is registered with every sandbox adapter so the Writing-a-Wrapper docs can demonstrate an end-to-end custom wrapper. NOT a shipping primitive \u2014 use as a pattern/template, not a dependency.",
1527
+ props: {
1528
+ title: {
1529
+ name: "title",
1530
+ type: "string",
1531
+ description: "Card header text. Omit to render a header-less card.",
1532
+ required: false
1533
+ }
1534
+ },
1535
+ autoAppliesTo: [],
1536
+ componentName: "SectionWrapperComponent",
1537
+ contract: WRAPPER_AUTHORING_CONTRACT,
1538
+ example: `// Section wrapper around a group
1539
+ {
1540
+ key: 'address',
1541
+ type: 'group',
1542
+ wrappers: [{ type: 'section', title: 'Shipping address' }],
1543
+ fields: [
1544
+ { key: 'street', type: 'input', label: 'Street' },
1545
+ { key: 'city', type: 'input', label: 'City' }
1546
+ ]
1547
+ }
1548
+
1549
+ // Header-less card (title omitted)
1550
+ {
1551
+ key: 'details',
1552
+ type: 'group',
1553
+ wrappers: [{ type: 'section' }],
1554
+ fields: [...]
1555
+ }`,
1556
+ minimalExample: `{ type: 'section', title: 'Section title' }`
1557
+ }
1558
+ ];
1559
+
1282
1560
  // packages/dynamic-form-mcp/src/registry/index.ts
1283
1561
  function getFieldTypes() {
1284
1562
  return FIELD_TYPES;
@@ -1304,6 +1582,15 @@ function getUIAdapters() {
1304
1582
  function getUIAdapter(library) {
1305
1583
  return UI_ADAPTERS.find((a) => a.library === library);
1306
1584
  }
1585
+ function getWrappers() {
1586
+ return WRAPPERS;
1587
+ }
1588
+ function getWrapper(type) {
1589
+ return WRAPPERS.find((w) => w.type === type);
1590
+ }
1591
+ function getWrappersByCategory(category) {
1592
+ return WRAPPERS.filter((w) => w.category === category);
1593
+ }
1307
1594
  function getDocPages() {
1308
1595
  return DOCUMENTATION;
1309
1596
  }
@@ -1874,13 +2161,13 @@ For fields that collect user input (\`input\`, \`textarea\`, \`select\`, \`check
1874
2161
  label: 'Email Address',
1875
2162
  required: true, // Shorthand validator
1876
2163
  email: true, // Shorthand validator
2164
+ placeholder: 'user@example.com', // Field-level, not inside props
1877
2165
  validationMessages: { // Always provide clear messages
1878
2166
  required: 'Email is required',
1879
2167
  email: 'Please enter a valid email'
1880
2168
  },
1881
2169
  props: {
1882
2170
  type: 'email', // HTML input type
1883
- placeholder: 'user@example.com',
1884
2171
  hint: 'We will never share your email' // UI library specific
1885
2172
  }
1886
2173
  }
@@ -1896,11 +2183,11 @@ MUST include \`options\` array:
1896
2183
  type: 'select',
1897
2184
  label: 'Country',
1898
2185
  required: true,
2186
+ placeholder: 'Select a country',
1899
2187
  options: [
1900
2188
  { value: 'us', label: 'United States' },
1901
2189
  { value: 'uk', label: 'United Kingdom' }
1902
- ],
1903
- props: { placeholder: 'Select a country' }
2190
+ ]
1904
2191
  }
1905
2192
  \`\`\`
1906
2193
 
@@ -2014,6 +2301,27 @@ Use shorthand properties directly on field definitions:
2014
2301
 
2015
2302
  Available shorthands: \`required\`, \`email\`, \`min\`, \`max\`, \`minLength\`, \`maxLength\`, \`pattern\`
2016
2303
 
2304
+ ### Nullable Values
2305
+
2306
+ Value fields accept a \`nullable?: boolean\` flag. When \`true\`:
2307
+
2308
+ - \`value\` accepts \`null\` in addition to the field's normal value type.
2309
+ - An omitted \`value\` resolves to \`null\` (instead of the type-specific empty default like \`''\`, \`NaN\`, or \`[]\`).
2310
+ - Orthogonal to \`required\`. \`nullable\` declares that the **model** accepts \`null\`; \`required\` is a **validation** constraint. Angular's \`Validators.required\` treats \`null\` as invalid, so a field that is both \`nullable\` and \`required\` will fail required-validation when the value is \`null\` \u2014 the two flags describe different layers (data shape vs. validation), not conflicting semantics.
2311
+ - Map OpenAPI \`nullable: true\` (3.0) or \`type: [T, null]\` (3.1) to this flag.
2312
+
2313
+ \`\`\`typescript
2314
+ {
2315
+ key: 'middleName',
2316
+ type: 'input',
2317
+ label: 'Middle Name',
2318
+ nullable: true,
2319
+ value: null, // valid; default-resolves to null
2320
+ }
2321
+ \`\`\`
2322
+
2323
+ Read-side caveat: a user clearing a text input reads back as \`""\`, not \`null\` \u2014 this is a DOM/Web IDL contract, identical to classic Reactive Forms. \`nullable\` is a contract for accepted values, not a guarantee of emitted ones.
2324
+
2017
2325
  ### Validation Messages
2018
2326
 
2019
2327
  ALWAYS provide validation messages. Use template variables:
@@ -2228,7 +2536,8 @@ Different UI libraries support different properties. Always validate against the
2228
2536
  |----------|----------|-----------|---------|-------|
2229
2537
  | \`appearance\` | \u2713 (fill, outline) | \u2717 | \u2717 | \u2713 (fill, outline) |
2230
2538
  | \`subscriptSizing\` | \u2713 | \u2717 | \u2717 | \u2717 |
2231
- | \`floatLabel\` | \u2713 | \u2717 | \u2713 | \u2717 |
2539
+ | \`floatLabel\` | \u2713 (auto, always, never) | \u2717 | \u2717 | \u2717 |
2540
+ | \`hideRequiredMarker\` | \u2713 | \u2717 | \u2717 | \u2717 |
2232
2541
  | \`hint\` | \u2713 | \u2713 (as \`helpText\`) | \u2713 | \u2713 |
2233
2542
 
2234
2543
  ### Container Fields
@@ -2315,7 +2624,9 @@ var examples_default = [
2315
2624
  key: "title",
2316
2625
  type: "text",
2317
2626
  label: "Sign In",
2318
- props: { elementType: "h2" }
2627
+ props: {
2628
+ elementType: "h2"
2629
+ }
2319
2630
  },
2320
2631
  {
2321
2632
  key: "email",
@@ -2323,8 +2634,13 @@ var examples_default = [
2323
2634
  label: "Email Address",
2324
2635
  required: true,
2325
2636
  email: true,
2326
- validationMessages: { email: "Please enter a valid email address" },
2327
- props: { type: "email", placeholder: "your@email.com" }
2637
+ validationMessages: {
2638
+ email: "Please enter a valid email address"
2639
+ },
2640
+ props: {
2641
+ type: "email"
2642
+ },
2643
+ placeholder: "your@email.com"
2328
2644
  },
2329
2645
  {
2330
2646
  key: "password",
@@ -2332,7 +2648,10 @@ var examples_default = [
2332
2648
  label: "Password",
2333
2649
  required: true,
2334
2650
  minLength: 8,
2335
- props: { type: "password", placeholder: "Enter your password" }
2651
+ props: {
2652
+ type: "password"
2653
+ },
2654
+ placeholder: "Enter your password"
2336
2655
  },
2337
2656
  {
2338
2657
  key: "remember",
@@ -2343,7 +2662,9 @@ var examples_default = [
2343
2662
  key: "submit",
2344
2663
  type: "submit",
2345
2664
  label: "Sign In",
2346
- props: { color: "primary" }
2665
+ props: {
2666
+ color: "primary"
2667
+ }
2347
2668
  }
2348
2669
  ]
2349
2670
  }
@@ -2365,7 +2686,7 @@ var examples_default = [
2365
2686
  required: "First name is required",
2366
2687
  minLength: "Must be at least {{requiredLength}} characters"
2367
2688
  },
2368
- props: { placeholder: "Enter your first name" }
2689
+ placeholder: "Enter your first name"
2369
2690
  },
2370
2691
  {
2371
2692
  key: "lastName",
@@ -2377,7 +2698,7 @@ var examples_default = [
2377
2698
  required: "Last name is required",
2378
2699
  minLength: "Must be at least {{requiredLength}} characters"
2379
2700
  },
2380
- props: { placeholder: "Enter your last name" }
2701
+ placeholder: "Enter your last name"
2381
2702
  },
2382
2703
  {
2383
2704
  key: "email",
@@ -2389,7 +2710,10 @@ var examples_default = [
2389
2710
  required: "Email is required",
2390
2711
  email: "Please enter a valid email address"
2391
2712
  },
2392
- props: { type: "email", placeholder: "user@example.com" }
2713
+ props: {
2714
+ type: "email"
2715
+ },
2716
+ placeholder: "user@example.com"
2393
2717
  },
2394
2718
  {
2395
2719
  key: "age",
@@ -2403,22 +2727,42 @@ var examples_default = [
2403
2727
  min: "Must be at least {{min}}",
2404
2728
  max: "Must not exceed {{max}}"
2405
2729
  },
2406
- props: { type: "number", placeholder: "18" }
2730
+ props: {
2731
+ type: "number"
2732
+ },
2733
+ placeholder: "18"
2407
2734
  },
2408
2735
  {
2409
2736
  key: "country",
2410
2737
  type: "select",
2411
2738
  label: "Country",
2412
2739
  required: true,
2413
- validationMessages: { required: "Please select a country" },
2740
+ validationMessages: {
2741
+ required: "Please select a country"
2742
+ },
2414
2743
  options: [
2415
- { value: "us", label: "United States" },
2416
- { value: "uk", label: "United Kingdom" },
2417
- { value: "ca", label: "Canada" },
2418
- { value: "au", label: "Australia" },
2419
- { value: "de", label: "Germany" }
2744
+ {
2745
+ value: "us",
2746
+ label: "United States"
2747
+ },
2748
+ {
2749
+ value: "uk",
2750
+ label: "United Kingdom"
2751
+ },
2752
+ {
2753
+ value: "ca",
2754
+ label: "Canada"
2755
+ },
2756
+ {
2757
+ value: "au",
2758
+ label: "Australia"
2759
+ },
2760
+ {
2761
+ value: "de",
2762
+ label: "Germany"
2763
+ }
2420
2764
  ],
2421
- props: { placeholder: "Select your country" }
2765
+ placeholder: "Select your country"
2422
2766
  },
2423
2767
  {
2424
2768
  key: "newsletter",
@@ -2430,13 +2774,17 @@ var examples_default = [
2430
2774
  type: "checkbox",
2431
2775
  label: "I agree to the terms and conditions",
2432
2776
  required: true,
2433
- validationMessages: { required: "You must accept the terms" }
2777
+ validationMessages: {
2778
+ required: "You must accept the terms"
2779
+ }
2434
2780
  },
2435
2781
  {
2436
2782
  key: "submit",
2437
2783
  type: "submit",
2438
2784
  label: "Create Account",
2439
- props: { color: "primary" }
2785
+ props: {
2786
+ color: "primary"
2787
+ }
2440
2788
  }
2441
2789
  ]
2442
2790
  }
@@ -2461,7 +2809,7 @@ var examples_default = [
2461
2809
  label: "First Name",
2462
2810
  required: true,
2463
2811
  col: 6,
2464
- props: { placeholder: "Your first name" }
2812
+ placeholder: "Your first name"
2465
2813
  },
2466
2814
  {
2467
2815
  key: "lastName",
@@ -2469,7 +2817,7 @@ var examples_default = [
2469
2817
  label: "Last Name",
2470
2818
  required: true,
2471
2819
  col: 6,
2472
- props: { placeholder: "Your last name" }
2820
+ placeholder: "Your last name"
2473
2821
  }
2474
2822
  ]
2475
2823
  },
@@ -2479,8 +2827,13 @@ var examples_default = [
2479
2827
  label: "Email Address",
2480
2828
  required: true,
2481
2829
  email: true,
2482
- validationMessages: { email: "Please enter a valid email" },
2483
- props: { type: "email", placeholder: "email@example.com" }
2830
+ validationMessages: {
2831
+ email: "Please enter a valid email"
2832
+ },
2833
+ props: {
2834
+ type: "email"
2835
+ },
2836
+ placeholder: "email@example.com"
2484
2837
  },
2485
2838
  {
2486
2839
  key: "subject",
@@ -2488,12 +2841,24 @@ var examples_default = [
2488
2841
  label: "Subject",
2489
2842
  required: true,
2490
2843
  options: [
2491
- { value: "general", label: "General Inquiry" },
2492
- { value: "support", label: "Technical Support" },
2493
- { value: "billing", label: "Billing Question" },
2494
- { value: "feedback", label: "Feedback" }
2844
+ {
2845
+ value: "general",
2846
+ label: "General Inquiry"
2847
+ },
2848
+ {
2849
+ value: "support",
2850
+ label: "Technical Support"
2851
+ },
2852
+ {
2853
+ value: "billing",
2854
+ label: "Billing Question"
2855
+ },
2856
+ {
2857
+ value: "feedback",
2858
+ label: "Feedback"
2859
+ }
2495
2860
  ],
2496
- props: { placeholder: "Select a subject" }
2861
+ placeholder: "Select a subject"
2497
2862
  },
2498
2863
  {
2499
2864
  key: "message",
@@ -2506,13 +2871,18 @@ var examples_default = [
2506
2871
  minLength: "Message must be at least {{requiredLength}} characters",
2507
2872
  maxLength: "Message cannot exceed {{requiredLength}} characters"
2508
2873
  },
2509
- props: { rows: 5, placeholder: "How can we help you?" }
2874
+ props: {
2875
+ rows: 5
2876
+ },
2877
+ placeholder: "How can we help you?"
2510
2878
  },
2511
2879
  {
2512
2880
  key: "submit",
2513
2881
  type: "submit",
2514
2882
  label: "Send Message",
2515
- props: { color: "primary" }
2883
+ props: {
2884
+ color: "primary"
2885
+ }
2516
2886
  }
2517
2887
  ]
2518
2888
  }
@@ -2539,13 +2909,17 @@ var examples_default = [
2539
2909
  label: "Email",
2540
2910
  required: true,
2541
2911
  email: true,
2542
- props: { type: "email" }
2912
+ props: {
2913
+ type: "email"
2914
+ }
2543
2915
  },
2544
2916
  {
2545
2917
  key: "addressTitle",
2546
2918
  type: "text",
2547
2919
  label: "Shipping Address",
2548
- props: { elementType: "h4" }
2920
+ props: {
2921
+ elementType: "h4"
2922
+ }
2549
2923
  },
2550
2924
  {
2551
2925
  key: "address",
@@ -2561,8 +2935,20 @@ var examples_default = [
2561
2935
  key: "cityStateRow",
2562
2936
  type: "row",
2563
2937
  fields: [
2564
- { key: "city", type: "input", label: "City", required: true, col: 6 },
2565
- { key: "state", type: "input", label: "State", required: true, col: 3 },
2938
+ {
2939
+ key: "city",
2940
+ type: "input",
2941
+ label: "City",
2942
+ required: true,
2943
+ col: 6
2944
+ },
2945
+ {
2946
+ key: "state",
2947
+ type: "input",
2948
+ label: "State",
2949
+ required: true,
2950
+ col: 3
2951
+ },
2566
2952
  {
2567
2953
  key: "zip",
2568
2954
  type: "input",
@@ -2570,7 +2956,9 @@ var examples_default = [
2570
2956
  required: true,
2571
2957
  col: 3,
2572
2958
  pattern: "^\\d{5}$",
2573
- validationMessages: { pattern: "ZIP must be 5 digits" }
2959
+ validationMessages: {
2960
+ pattern: "ZIP must be 5 digits"
2961
+ }
2574
2962
  }
2575
2963
  ]
2576
2964
  },
@@ -2580,8 +2968,14 @@ var examples_default = [
2580
2968
  label: "Country",
2581
2969
  required: true,
2582
2970
  options: [
2583
- { value: "us", label: "United States" },
2584
- { value: "ca", label: "Canada" }
2971
+ {
2972
+ value: "us",
2973
+ label: "United States"
2974
+ },
2975
+ {
2976
+ value: "ca",
2977
+ label: "Canada"
2978
+ }
2585
2979
  ]
2586
2980
  }
2587
2981
  ]
@@ -2612,12 +3006,37 @@ var examples_default = [
2612
3006
  key: "stepTitle1",
2613
3007
  type: "text",
2614
3008
  label: "Step 1: Personal Information",
2615
- props: { elementType: "h3" }
3009
+ props: {
3010
+ elementType: "h3"
3011
+ }
2616
3012
  },
2617
- { key: "firstName", type: "input", label: "First Name", required: true },
2618
- { key: "lastName", type: "input", label: "Last Name", required: true },
2619
- { key: "email", type: "input", label: "Email", required: true, email: true, props: { type: "email" } },
2620
- { key: "next1", type: "next", label: "Continue" }
3013
+ {
3014
+ key: "firstName",
3015
+ type: "input",
3016
+ label: "First Name",
3017
+ required: true
3018
+ },
3019
+ {
3020
+ key: "lastName",
3021
+ type: "input",
3022
+ label: "Last Name",
3023
+ required: true
3024
+ },
3025
+ {
3026
+ key: "email",
3027
+ type: "input",
3028
+ label: "Email",
3029
+ required: true,
3030
+ email: true,
3031
+ props: {
3032
+ type: "email"
3033
+ }
3034
+ },
3035
+ {
3036
+ key: "next1",
3037
+ type: "next",
3038
+ label: "Continue"
3039
+ }
2621
3040
  ]
2622
3041
  },
2623
3042
  {
@@ -2628,17 +3047,44 @@ var examples_default = [
2628
3047
  key: "stepTitle2",
2629
3048
  type: "text",
2630
3049
  label: "Step 2: Address",
2631
- props: { elementType: "h3" }
3050
+ props: {
3051
+ elementType: "h3"
3052
+ }
3053
+ },
3054
+ {
3055
+ key: "street",
3056
+ type: "input",
3057
+ label: "Street Address",
3058
+ required: true
3059
+ },
3060
+ {
3061
+ key: "city",
3062
+ type: "input",
3063
+ label: "City",
3064
+ required: true
3065
+ },
3066
+ {
3067
+ key: "state",
3068
+ type: "input",
3069
+ label: "State",
3070
+ required: true
2632
3071
  },
2633
- { key: "street", type: "input", label: "Street Address", required: true },
2634
- { key: "city", type: "input", label: "City", required: true },
2635
- { key: "state", type: "input", label: "State", required: true },
2636
3072
  {
2637
3073
  key: "navRow2",
2638
3074
  type: "row",
2639
3075
  fields: [
2640
- { key: "prev2", type: "previous", label: "Back", col: 6 },
2641
- { key: "next2", type: "next", label: "Continue", col: 6 }
3076
+ {
3077
+ key: "prev2",
3078
+ type: "previous",
3079
+ label: "Back",
3080
+ col: 6
3081
+ },
3082
+ {
3083
+ key: "next2",
3084
+ type: "next",
3085
+ label: "Continue",
3086
+ col: 6
3087
+ }
2642
3088
  ]
2643
3089
  }
2644
3090
  ]
@@ -2651,21 +3097,35 @@ var examples_default = [
2651
3097
  key: "stepTitle3",
2652
3098
  type: "text",
2653
3099
  label: "Step 3: Review & Submit",
2654
- props: { elementType: "h3" }
3100
+ props: {
3101
+ elementType: "h3"
3102
+ }
2655
3103
  },
2656
3104
  {
2657
3105
  key: "confirm",
2658
3106
  type: "checkbox",
2659
3107
  label: "I confirm all information is correct",
2660
3108
  required: true,
2661
- validationMessages: { required: "Please confirm before submitting" }
3109
+ validationMessages: {
3110
+ required: "Please confirm before submitting"
3111
+ }
2662
3112
  },
2663
3113
  {
2664
3114
  key: "navRow3",
2665
3115
  type: "row",
2666
3116
  fields: [
2667
- { key: "prev3", type: "previous", label: "Back", col: 6 },
2668
- { key: "submit", type: "submit", label: "Submit", col: 6 }
3117
+ {
3118
+ key: "prev3",
3119
+ type: "previous",
3120
+ label: "Back",
3121
+ col: 6
3122
+ },
3123
+ {
3124
+ key: "submit",
3125
+ type: "submit",
3126
+ label: "Submit",
3127
+ col: 6
3128
+ }
2669
3129
  ]
2670
3130
  }
2671
3131
  ]
@@ -2686,8 +3146,14 @@ var examples_default = [
2686
3146
  label: "Account Type",
2687
3147
  required: true,
2688
3148
  options: [
2689
- { value: "personal", label: "Personal" },
2690
- { value: "business", label: "Business" }
3149
+ {
3150
+ value: "personal",
3151
+ label: "Personal"
3152
+ },
3153
+ {
3154
+ value: "business",
3155
+ label: "Business"
3156
+ }
2691
3157
  ]
2692
3158
  },
2693
3159
  {
@@ -2714,7 +3180,9 @@ var examples_default = [
2714
3180
  }
2715
3181
  }
2716
3182
  ],
2717
- validationMessages: { required: "Business name is required" }
3183
+ validationMessages: {
3184
+ required: "Business name is required"
3185
+ }
2718
3186
  },
2719
3187
  {
2720
3188
  key: "taxId",
@@ -2731,7 +3199,7 @@ var examples_default = [
2731
3199
  }
2732
3200
  }
2733
3201
  ],
2734
- props: { placeholder: "XX-XXXXXXX" }
3202
+ placeholder: "XX-XXXXXXX"
2735
3203
  },
2736
3204
  {
2737
3205
  key: "newsletter",
@@ -2743,9 +3211,18 @@ var examples_default = [
2743
3211
  type: "select",
2744
3212
  label: "Email Frequency",
2745
3213
  options: [
2746
- { value: "daily", label: "Daily" },
2747
- { value: "weekly", label: "Weekly" },
2748
- { value: "monthly", label: "Monthly" }
3214
+ {
3215
+ value: "daily",
3216
+ label: "Daily"
3217
+ },
3218
+ {
3219
+ value: "weekly",
3220
+ label: "Weekly"
3221
+ },
3222
+ {
3223
+ value: "monthly",
3224
+ label: "Monthly"
3225
+ }
2749
3226
  ],
2750
3227
  logic: [
2751
3228
  {
@@ -2787,7 +3264,9 @@ var examples_default = [
2787
3264
  key: "contactsTitle",
2788
3265
  type: "text",
2789
3266
  label: "Emergency Contacts",
2790
- props: { elementType: "h4" }
3267
+ props: {
3268
+ elementType: "h4"
3269
+ }
2791
3270
  },
2792
3271
  {
2793
3272
  key: "contacts",
@@ -2802,19 +3281,49 @@ var examples_default = [
2802
3281
  key: "contactRow",
2803
3282
  type: "row",
2804
3283
  fields: [
2805
- { key: "name", type: "input", label: "Contact Name", required: true, col: 4 },
2806
- { key: "phone", type: "input", label: "Phone", required: true, col: 4, props: { type: "tel" } },
3284
+ {
3285
+ key: "name",
3286
+ type: "input",
3287
+ label: "Contact Name",
3288
+ required: true,
3289
+ col: 4
3290
+ },
3291
+ {
3292
+ key: "phone",
3293
+ type: "input",
3294
+ label: "Phone",
3295
+ required: true,
3296
+ col: 4,
3297
+ props: {
3298
+ type: "tel"
3299
+ }
3300
+ },
2807
3301
  {
2808
3302
  key: "relationship",
2809
3303
  type: "select",
2810
3304
  label: "Relationship",
2811
3305
  col: 4,
2812
3306
  options: [
2813
- { value: "spouse", label: "Spouse" },
2814
- { value: "parent", label: "Parent" },
2815
- { value: "sibling", label: "Sibling" },
2816
- { value: "friend", label: "Friend" },
2817
- { value: "other", label: "Other" }
3307
+ {
3308
+ value: "spouse",
3309
+ label: "Spouse"
3310
+ },
3311
+ {
3312
+ value: "parent",
3313
+ label: "Parent"
3314
+ },
3315
+ {
3316
+ value: "sibling",
3317
+ label: "Sibling"
3318
+ },
3319
+ {
3320
+ value: "friend",
3321
+ label: "Friend"
3322
+ },
3323
+ {
3324
+ value: "other",
3325
+ label: "Other"
3326
+ }
2818
3327
  ]
2819
3328
  }
2820
3329
  ]
@@ -2842,15 +3351,23 @@ var examples_default = [
2842
3351
  key: "title",
2843
3352
  type: "text",
2844
3353
  label: "Customer Feedback",
2845
- props: { elementType: "h2" }
3354
+ props: {
3355
+ elementType: "h2"
3356
+ }
2846
3357
  },
2847
3358
  {
2848
3359
  key: "satisfaction",
2849
3360
  type: "slider",
2850
3361
  label: "Overall Satisfaction (1-10)",
2851
3362
  required: true,
2852
- props: { min: 1, max: 10, step: 1 },
2853
- validationMessages: { required: "Please rate your satisfaction" }
3363
+ props: {
3364
+ min: 1,
3365
+ max: 10,
3366
+ step: 1
3367
+ },
3368
+ validationMessages: {
3369
+ required: "Please rate your satisfaction"
3370
+ }
2854
3371
  },
2855
3372
  {
2856
3373
  key: "recommend",
@@ -2858,30 +3375,62 @@ var examples_default = [
2858
3375
  label: "Would you recommend us?",
2859
3376
  required: true,
2860
3377
  options: [
2861
- { value: "yes", label: "Yes, definitely" },
2862
- { value: "maybe", label: "Maybe" },
2863
- { value: "no", label: "No" }
3378
+ {
3379
+ value: "yes",
3380
+ label: "Yes, definitely"
3381
+ },
3382
+ {
3383
+ value: "maybe",
3384
+ label: "Maybe"
3385
+ },
3386
+ {
3387
+ value: "no",
3388
+ label: "No"
3389
+ }
2864
3390
  ],
2865
- validationMessages: { required: "Please select an option" }
3391
+ validationMessages: {
3392
+ required: "Please select an option"
3393
+ }
2866
3394
  },
2867
3395
  {
2868
3396
  key: "improvements",
2869
3397
  type: "select",
2870
3398
  label: "What could we improve?",
2871
- props: { multiple: true, placeholder: "Select all that apply" },
3399
+ props: {
3400
+ multiple: true
3401
+ },
2872
3402
  options: [
2873
- { value: "speed", label: "Response Time" },
2874
- { value: "quality", label: "Product Quality" },
2875
- { value: "price", label: "Pricing" },
2876
- { value: "support", label: "Customer Support" },
2877
- { value: "ui", label: "User Interface" }
2878
- ]
3403
+ {
3404
+ value: "speed",
3405
+ label: "Response Time"
3406
+ },
3407
+ {
3408
+ value: "quality",
3409
+ label: "Product Quality"
3410
+ },
3411
+ {
3412
+ value: "price",
3413
+ label: "Pricing"
3414
+ },
3415
+ {
3416
+ value: "support",
3417
+ label: "Customer Support"
3418
+ },
3419
+ {
3420
+ value: "ui",
3421
+ label: "User Interface"
3422
+ }
3423
+ ],
3424
+ placeholder: "Select all that apply"
2879
3425
  },
2880
3426
  {
2881
3427
  key: "comments",
2882
3428
  type: "textarea",
2883
3429
  label: "Additional Comments",
2884
- props: { rows: 4, placeholder: "Share any additional feedback..." }
3430
+ props: {
3431
+ rows: 4
3432
+ },
3433
+ placeholder: "Share any additional feedback..."
2885
3434
  },
2886
3435
  {
2887
3436
  key: "followUp",
@@ -2893,7 +3442,9 @@ var examples_default = [
2893
3442
  type: "input",
2894
3443
  label: "Email Address",
2895
3444
  email: true,
2896
- props: { type: "email", placeholder: "your@email.com" },
3445
+ props: {
3446
+ type: "email"
3447
+ },
2897
3448
  logic: [
2898
3449
  {
2899
3450
  type: "hidden",
@@ -2917,7 +3468,8 @@ var examples_default = [
2917
3468
  validationMessages: {
2918
3469
  required: "Email required for follow-up",
2919
3470
  email: "Please enter a valid email"
2920
- }
3471
+ },
3472
+ placeholder: "your@email.com"
2921
3473
  },
2922
3474
  {
2923
3475
  key: "submit",
@@ -3366,7 +3918,7 @@ var MatButtonPropsSchema = z12.object({
3366
3918
  });
3367
3919
 
3368
3920
  // internal/dynamic-forms-zod/material/src/fields/mat-input-field.schema.ts
3369
- import { z as z22 } from "zod";
3921
+ import { z as z23 } from "zod";
3370
3922
 
3371
3923
  // internal/dynamic-forms-zod/src/lib/schemas/field/field-def.schema.ts
3372
3924
  import { z as z14 } from "zod";
@@ -3828,16 +4380,31 @@ var FieldWithValidationSchema = z21.object({
3828
4380
  schemas: z21.array(SchemaApplicationConfigSchema).optional()
3829
4381
  });
3830
4382
 
4383
+ // internal/dynamic-forms-zod/src/lib/schemas/field/nullable-value.refinement.ts
4384
+ import { z as z22 } from "zod";
4385
+ var nullableValueRefine = (data, ctx) => {
4386
+ if (!data || typeof data !== "object") return;
4387
+ const field = data;
4388
+ if (field.value === null && field.nullable !== true) {
4389
+ ctx.addIssue({
4390
+ code: z22.ZodIssueCode.custom,
4391
+ path: ["value"],
4392
+ message: "value: null is only allowed when nullable is true. Add `nullable: true` or remove the null value."
4393
+ });
4394
+ }
4395
+ };
4396
+
3831
4397
  // internal/dynamic-forms-zod/material/src/fields/mat-input-field.schema.ts
3832
- var MatInputFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
4398
+ var MatInputFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
3833
4399
  /**
3834
4400
  * Field type discriminant.
3835
4401
  */
3836
- type: z22.literal("input"),
4402
+ type: z23.literal("input"),
4403
+ nullable: z23.boolean().optional(),
3837
4404
  /**
3838
4405
  * Initial value for the input.
3839
4406
  */
3840
- value: z22.string().optional(),
4407
+ value: z23.string().nullable().optional(),
3841
4408
  /**
3842
4409
  * Placeholder text (can also be in props).
3843
4410
  */
@@ -3847,18 +4414,20 @@ var MatInputFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).ex
3847
4414
  */
3848
4415
  props: MatInputPropsSchema.optional()
3849
4416
  });
4417
+ var MatInputFieldSchema = MatInputFieldSchemaObject.superRefine(nullableValueRefine);
3850
4418
 
3851
4419
  // internal/dynamic-forms-zod/material/src/fields/mat-textarea-field.schema.ts
3852
- import { z as z23 } from "zod";
3853
- var MatTextareaFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
4420
+ import { z as z24 } from "zod";
4421
+ var MatTextareaFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
3854
4422
  /**
3855
4423
  * Field type discriminant.
3856
4424
  */
3857
- type: z23.literal("textarea"),
4425
+ type: z24.literal("textarea"),
4426
+ nullable: z24.boolean().optional(),
3858
4427
  /**
3859
4428
  * Initial value for the textarea.
3860
4429
  */
3861
- value: z23.string().optional(),
4430
+ value: z24.string().nullable().optional(),
3862
4431
  /**
3863
4432
  * Placeholder text (can also be in props).
3864
4433
  */
@@ -3868,13 +4437,14 @@ var MatTextareaFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema)
3868
4437
  */
3869
4438
  props: MatTextareaPropsSchema.optional()
3870
4439
  });
4440
+ var MatTextareaFieldSchema = MatTextareaFieldSchemaObject.superRefine(nullableValueRefine);
3871
4441
 
3872
4442
  // internal/dynamic-forms-zod/material/src/fields/mat-select-field.schema.ts
3873
- import { z as z25 } from "zod";
4443
+ import { z as z26 } from "zod";
3874
4444
 
3875
4445
  // internal/dynamic-forms-zod/src/lib/schemas/common/field-option.schema.ts
3876
- import { z as z24 } from "zod";
3877
- var FieldOptionSchema = z24.object({
4446
+ import { z as z25 } from "zod";
4447
+ var FieldOptionSchema = z25.object({
3878
4448
  /**
3879
4449
  * Display text for the option.
3880
4450
  */
@@ -3883,25 +4453,26 @@ var FieldOptionSchema = z24.object({
3883
4453
  * The actual value stored when this option is selected.
3884
4454
  * Can be any JSON-serializable value.
3885
4455
  */
3886
- value: z24.unknown(),
4456
+ value: z25.unknown(),
3887
4457
  /**
3888
4458
  * Whether this option is disabled and cannot be selected.
3889
4459
  */
3890
- disabled: z24.boolean().optional()
4460
+ disabled: z25.boolean().optional()
3891
4461
  }).passthrough();
3892
- var FieldOptionsSchema = z24.array(FieldOptionSchema);
4462
+ var FieldOptionsSchema = z25.array(FieldOptionSchema);
3893
4463
 
3894
4464
  // internal/dynamic-forms-zod/material/src/fields/mat-select-field.schema.ts
3895
- var MatSelectFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
4465
+ var MatSelectFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
3896
4466
  /**
3897
4467
  * Field type discriminant.
3898
4468
  */
3899
- type: z25.literal("select"),
4469
+ type: z26.literal("select"),
4470
+ nullable: z26.boolean().optional(),
3900
4471
  /**
3901
4472
  * Initial value for the select.
3902
4473
  * Can be single value or array if multiple is enabled.
3903
4474
  */
3904
- value: z25.unknown().optional(),
4475
+ value: z26.unknown().nullable().optional(),
3905
4476
  /**
3906
4477
  * Placeholder text (can also be in props).
3907
4478
  */
@@ -3915,18 +4486,19 @@ var MatSelectFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).e
3915
4486
  */
3916
4487
  props: MatSelectPropsSchema.optional()
3917
4488
  });
4489
+ var MatSelectFieldSchema = MatSelectFieldSchemaObject.superRefine(nullableValueRefine);
3918
4490
 
3919
4491
  // internal/dynamic-forms-zod/material/src/fields/mat-checkbox-field.schema.ts
3920
- import { z as z26 } from "zod";
4492
+ import { z as z27 } from "zod";
3921
4493
  var MatCheckboxFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
3922
4494
  /**
3923
4495
  * Field type discriminant.
3924
4496
  */
3925
- type: z26.literal("checkbox"),
4497
+ type: z27.literal("checkbox"),
3926
4498
  /**
3927
4499
  * Initial checked state.
3928
4500
  */
3929
- value: z26.boolean().optional(),
4501
+ value: z27.boolean().optional(),
3930
4502
  /**
3931
4503
  * Placeholder/helper text.
3932
4504
  */
@@ -3938,16 +4510,17 @@ var MatCheckboxFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema)
3938
4510
  });
3939
4511
 
3940
4512
  // internal/dynamic-forms-zod/material/src/fields/mat-radio-field.schema.ts
3941
- import { z as z27 } from "zod";
3942
- var MatRadioFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
4513
+ import { z as z28 } from "zod";
4514
+ var MatRadioFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
3943
4515
  /**
3944
4516
  * Field type discriminant.
3945
4517
  */
3946
- type: z27.literal("radio"),
4518
+ type: z28.literal("radio"),
4519
+ nullable: z28.boolean().optional(),
3947
4520
  /**
3948
4521
  * Initial selected value.
3949
4522
  */
3950
- value: z27.unknown().optional(),
4523
+ value: z28.unknown().nullable().optional(),
3951
4524
  /**
3952
4525
  * Placeholder/helper text.
3953
4526
  */
@@ -3961,18 +4534,20 @@ var MatRadioFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).ex
3961
4534
  */
3962
4535
  props: MatRadioPropsSchema.optional()
3963
4536
  });
4537
+ var MatRadioFieldSchema = MatRadioFieldSchemaObject.superRefine(nullableValueRefine);
3964
4538
 
3965
4539
  // internal/dynamic-forms-zod/material/src/fields/mat-multi-checkbox-field.schema.ts
3966
- import { z as z28 } from "zod";
3967
- var MatMultiCheckboxFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
4540
+ import { z as z29 } from "zod";
4541
+ var MatMultiCheckboxFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
3968
4542
  /**
3969
4543
  * Field type discriminant.
3970
4544
  */
3971
- type: z28.literal("multi-checkbox"),
4545
+ type: z29.literal("multi-checkbox"),
4546
+ nullable: z29.boolean().optional(),
3972
4547
  /**
3973
4548
  * Initial selected values (array).
3974
4549
  */
3975
- value: z28.array(z28.unknown()).optional(),
4550
+ value: z29.array(z29.unknown()).nullable().optional(),
3976
4551
  /**
3977
4552
  * Placeholder/helper text.
3978
4553
  */
@@ -3986,18 +4561,19 @@ var MatMultiCheckboxFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSc
3986
4561
  */
3987
4562
  props: MatMultiCheckboxPropsSchema.optional()
3988
4563
  });
4564
+ var MatMultiCheckboxFieldSchema = MatMultiCheckboxFieldSchemaObject.superRefine(nullableValueRefine);
3989
4565
 
3990
4566
  // internal/dynamic-forms-zod/material/src/fields/mat-toggle-field.schema.ts
3991
- import { z as z29 } from "zod";
4567
+ import { z as z30 } from "zod";
3992
4568
  var MatToggleFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
3993
4569
  /**
3994
4570
  * Field type discriminant.
3995
4571
  */
3996
- type: z29.literal("toggle"),
4572
+ type: z30.literal("toggle"),
3997
4573
  /**
3998
4574
  * Initial toggle state.
3999
4575
  */
4000
- value: z29.boolean().optional(),
4576
+ value: z30.boolean().optional(),
4001
4577
  /**
4002
4578
  * Placeholder/helper text.
4003
4579
  */
@@ -4009,28 +4585,29 @@ var MatToggleFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).e
4009
4585
  });
4010
4586
 
4011
4587
  // internal/dynamic-forms-zod/material/src/fields/mat-slider-field.schema.ts
4012
- import { z as z30 } from "zod";
4013
- var MatSliderFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
4588
+ import { z as z31 } from "zod";
4589
+ var MatSliderFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
4014
4590
  /**
4015
4591
  * Field type discriminant.
4016
4592
  */
4017
- type: z30.literal("slider"),
4593
+ type: z31.literal("slider"),
4594
+ nullable: z31.boolean().optional(),
4018
4595
  /**
4019
4596
  * Initial slider value.
4020
4597
  */
4021
- value: z30.number().optional(),
4598
+ value: z31.number().nullable().optional(),
4022
4599
  /**
4023
4600
  * Minimum slider value.
4024
4601
  */
4025
- minValue: z30.number().optional(),
4602
+ minValue: z31.number().optional(),
4026
4603
  /**
4027
4604
  * Maximum slider value.
4028
4605
  */
4029
- maxValue: z30.number().optional(),
4606
+ maxValue: z31.number().optional(),
4030
4607
  /**
4031
4608
  * Step increment.
4032
4609
  */
4033
- step: z30.number().positive().optional(),
4610
+ step: z31.number().positive().optional(),
4034
4611
  /**
4035
4612
  * Placeholder/helper text.
4036
4613
  */
@@ -4040,19 +4617,21 @@ var MatSliderFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).e
4040
4617
  */
4041
4618
  props: MatSliderPropsSchema.optional()
4042
4619
  });
4620
+ var MatSliderFieldSchema = MatSliderFieldSchemaObject.superRefine(nullableValueRefine);
4043
4621
 
4044
4622
  // internal/dynamic-forms-zod/material/src/fields/mat-datepicker-field.schema.ts
4045
- import { z as z31 } from "zod";
4046
- var DateValueSchema = z31.union([z31.string(), z31.null()]);
4047
- var MatDatepickerFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
4623
+ import { z as z32 } from "zod";
4624
+ var DateValueSchema = z32.union([z32.string(), z32.null()]);
4625
+ var MatDatepickerFieldSchemaObject = BaseFieldDefSchema.merge(FieldWithValidationSchema).extend({
4048
4626
  /**
4049
4627
  * Field type discriminant.
4050
4628
  */
4051
- type: z31.literal("datepicker"),
4629
+ type: z32.literal("datepicker"),
4630
+ nullable: z32.boolean().optional(),
4052
4631
  /**
4053
4632
  * Initial date value (ISO string in JSON configs).
4054
4633
  */
4055
- value: DateValueSchema.optional(),
4634
+ value: DateValueSchema.nullable().optional(),
4056
4635
  /**
4057
4636
  * Minimum selectable date.
4058
4637
  */
@@ -4074,24 +4653,25 @@ var MatDatepickerFieldSchema = BaseFieldDefSchema.merge(FieldWithValidationSchem
4074
4653
  */
4075
4654
  props: MatDatepickerPropsSchema.optional()
4076
4655
  });
4656
+ var MatDatepickerFieldSchema = MatDatepickerFieldSchemaObject.superRefine(nullableValueRefine);
4077
4657
 
4078
4658
  // internal/dynamic-forms-zod/material/src/fields/mat-button-field.schema.ts
4079
- import { z as z32 } from "zod";
4080
- var EventArgSchema = z32.union([z32.string(), z32.number(), z32.boolean(), z32.null(), z32.undefined()]);
4659
+ import { z as z33 } from "zod";
4660
+ var EventArgSchema = z33.union([z33.string(), z33.number(), z33.boolean(), z33.null(), z33.undefined()]);
4081
4661
  var MatButtonFieldSchema = BaseFieldDefSchema.extend({
4082
4662
  /**
4083
4663
  * Field type discriminant.
4084
4664
  */
4085
- type: z32.literal("button"),
4665
+ type: z33.literal("button"),
4086
4666
  /**
4087
4667
  * Event type name (string reference to registered event).
4088
4668
  * Note: Full event configuration requires runtime setup.
4089
4669
  */
4090
- event: z32.string().optional(),
4670
+ event: z33.string().optional(),
4091
4671
  /**
4092
4672
  * Arguments passed to the event constructor.
4093
4673
  */
4094
- eventArgs: z32.array(EventArgSchema).optional(),
4674
+ eventArgs: z33.array(EventArgSchema).optional(),
4095
4675
  /**
4096
4676
  * Material-specific button properties.
4097
4677
  */
@@ -4102,45 +4682,45 @@ var MatButtonFieldSchema = BaseFieldDefSchema.extend({
4102
4682
  logic: LogicArraySchema.optional()
4103
4683
  });
4104
4684
  var MatSubmitButtonFieldSchema = BaseFieldDefSchema.extend({
4105
- type: z32.literal("submit"),
4685
+ type: z33.literal("submit"),
4106
4686
  props: MatButtonPropsSchema.optional(),
4107
4687
  logic: LogicArraySchema.optional()
4108
4688
  });
4109
4689
  var MatNextButtonFieldSchema = BaseFieldDefSchema.extend({
4110
- type: z32.literal("next"),
4690
+ type: z33.literal("next"),
4111
4691
  props: MatButtonPropsSchema.optional(),
4112
4692
  logic: LogicArraySchema.optional()
4113
4693
  });
4114
4694
  var MatPreviousButtonFieldSchema = BaseFieldDefSchema.extend({
4115
- type: z32.literal("previous"),
4695
+ type: z33.literal("previous"),
4116
4696
  props: MatButtonPropsSchema.optional()
4117
4697
  });
4118
4698
  var MatAddArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
4119
- type: z32.literal("addArrayItem"),
4699
+ type: z33.literal("addArrayItem"),
4120
4700
  /**
4121
4701
  * Key of the array field to add items to.
4122
4702
  * If omitted, uses the parent array context.
4123
4703
  */
4124
- arrayKey: z32.string().optional(),
4704
+ arrayKey: z33.string().optional(),
4125
4705
  props: MatButtonPropsSchema.optional()
4126
4706
  });
4127
4707
  var MatRemoveArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
4128
- type: z32.literal("removeArrayItem"),
4708
+ type: z33.literal("removeArrayItem"),
4129
4709
  /**
4130
4710
  * Key of the array field to remove items from.
4131
4711
  * If omitted, uses the parent array context.
4132
4712
  */
4133
- arrayKey: z32.string().optional(),
4713
+ arrayKey: z33.string().optional(),
4134
4714
  props: MatButtonPropsSchema.optional()
4135
4715
  });
4136
4716
 
4137
4717
  // internal/dynamic-forms-zod/material/src/mat-leaf-field.schema.ts
4138
- import { z as z35 } from "zod";
4718
+ import { z as z36 } from "zod";
4139
4719
 
4140
4720
  // internal/dynamic-forms-zod/src/lib/schemas/leaves/text-field.schema.ts
4141
- import { z as z33 } from "zod";
4142
- var TextElementTypeSchema = z33.enum(["p", "h1", "h2", "h3", "h4", "h5", "h6", "span"]);
4143
- var TextPropsSchema = z33.object({
4721
+ import { z as z34 } from "zod";
4722
+ var TextElementTypeSchema = z34.enum(["p", "h1", "h2", "h3", "h4", "h5", "h6", "span"]);
4723
+ var TextPropsSchema = z34.object({
4144
4724
  /**
4145
4725
  * HTML element type to render the text.
4146
4726
  */
@@ -4150,7 +4730,7 @@ var TextFieldSchema = BaseFieldDefSchema.extend({
4150
4730
  /**
4151
4731
  * Field type discriminant.
4152
4732
  */
4153
- type: z33.literal("text"),
4733
+ type: z34.literal("text"),
4154
4734
  /**
4155
4735
  * Text-specific properties.
4156
4736
  */
@@ -4162,9 +4742,9 @@ var TextFieldSchema = BaseFieldDefSchema.extend({
4162
4742
  });
4163
4743
 
4164
4744
  // internal/dynamic-forms-zod/src/lib/schemas/leaves/hidden-field.schema.ts
4165
- import { z as z34 } from "zod";
4166
- var HiddenScalarSchema = z34.union([z34.string(), z34.number(), z34.boolean()]);
4167
- var HiddenValueSchema = z34.union([HiddenScalarSchema, z34.array(HiddenScalarSchema)]);
4745
+ import { z as z35 } from "zod";
4746
+ var HiddenScalarSchema = z35.union([z35.string(), z35.number(), z35.boolean()]);
4747
+ var HiddenValueSchema = z35.union([HiddenScalarSchema, z35.array(HiddenScalarSchema)]);
4168
4748
  var HiddenFieldSchema = BaseFieldDefSchema.omit({
4169
4749
  label: true,
4170
4750
  meta: true,
@@ -4180,7 +4760,7 @@ var HiddenFieldSchema = BaseFieldDefSchema.omit({
4180
4760
  /**
4181
4761
  * Field type discriminant.
4182
4762
  */
4183
- type: z34.literal("hidden"),
4763
+ type: z35.literal("hidden"),
4184
4764
  /**
4185
4765
  * The value to store. Required for hidden fields.
4186
4766
  */
@@ -4188,20 +4768,20 @@ var HiddenFieldSchema = BaseFieldDefSchema.omit({
4188
4768
  });
4189
4769
 
4190
4770
  // internal/dynamic-forms-zod/material/src/mat-leaf-field.schema.ts
4191
- var MatLeafFieldSchema = z35.discriminatedUnion("type", [
4771
+ var MatLeafFieldSchema = z36.discriminatedUnion("type", [
4192
4772
  // Default fields
4193
4773
  TextFieldSchema,
4194
4774
  HiddenFieldSchema,
4195
4775
  // Material value fields
4196
- MatInputFieldSchema,
4197
- MatTextareaFieldSchema,
4198
- MatSelectFieldSchema,
4776
+ MatInputFieldSchemaObject,
4777
+ MatTextareaFieldSchemaObject,
4778
+ MatSelectFieldSchemaObject,
4199
4779
  MatCheckboxFieldSchema,
4200
- MatRadioFieldSchema,
4201
- MatMultiCheckboxFieldSchema,
4780
+ MatRadioFieldSchemaObject,
4781
+ MatMultiCheckboxFieldSchemaObject,
4202
4782
  MatToggleFieldSchema,
4203
- MatSliderFieldSchema,
4204
- MatDatepickerFieldSchema,
4783
+ MatSliderFieldSchemaObject,
4784
+ MatDatepickerFieldSchemaObject,
4205
4785
  // Material button fields
4206
4786
  MatButtonFieldSchema,
4207
4787
  MatSubmitButtonFieldSchema,
@@ -4209,18 +4789,18 @@ var MatLeafFieldSchema = z35.discriminatedUnion("type", [
4209
4789
  MatPreviousButtonFieldSchema,
4210
4790
  MatAddArrayItemButtonFieldSchema,
4211
4791
  MatRemoveArrayItemButtonFieldSchema
4212
- ]);
4792
+ ]).superRefine(nullableValueRefine);
4213
4793
 
4214
4794
  // internal/dynamic-forms-zod/src/lib/schemas/containers/factories.ts
4215
- import { z as z36 } from "zod";
4216
- var ContainerLogicSchema = z36.object({
4217
- type: z36.literal("hidden"),
4218
- condition: z36.union([ConditionalExpressionSchema, z36.boolean()])
4795
+ import { z as z37 } from "zod";
4796
+ var ContainerLogicSchema = z37.object({
4797
+ type: z37.literal("hidden"),
4798
+ condition: z37.union([ConditionalExpressionSchema, z37.boolean()])
4219
4799
  });
4220
4800
  function createContainerSchemas(options) {
4221
4801
  const { leafFieldSchema } = options;
4222
- const AnyFieldSchema = z36.lazy(
4223
- () => z36.union([
4802
+ const AnyFieldSchema = z37.lazy(
4803
+ () => z37.union([
4224
4804
  leafFieldSchema,
4225
4805
  PageFieldSchema,
4226
4806
  RowFieldSchema,
@@ -4234,67 +4814,67 @@ function createContainerSchemas(options) {
4234
4814
  }).extend({
4235
4815
  // Explicitly forbid label on container fields
4236
4816
  // This makes Zod reject any value for these properties
4237
- label: z36.never().optional(),
4238
- meta: z36.never().optional()
4817
+ label: z37.never().optional(),
4818
+ meta: z37.never().optional()
4239
4819
  });
4240
4820
  const PageFieldSchema = ContainerBaseSchema.extend({
4241
- type: z36.literal("page"),
4242
- fields: z36.array(AnyFieldSchema),
4243
- logic: z36.array(ContainerLogicSchema).optional(),
4821
+ type: z37.literal("page"),
4822
+ fields: z37.array(AnyFieldSchema),
4823
+ logic: z37.array(ContainerLogicSchema).optional(),
4244
4824
  // Also forbid title (common mistake)
4245
- title: z36.never().optional()
4825
+ title: z37.never().optional()
4246
4826
  });
4247
4827
  const RowFieldSchema = ContainerBaseSchema.extend({
4248
- type: z36.literal("row"),
4249
- fields: z36.array(AnyFieldSchema),
4828
+ type: z37.literal("row"),
4829
+ fields: z37.array(AnyFieldSchema),
4250
4830
  // Container logic - only 'hidden' type allowed (same as pages)
4251
- logic: z36.array(ContainerLogicSchema).optional()
4831
+ logic: z37.array(ContainerLogicSchema).optional()
4252
4832
  });
4253
4833
  const GroupFieldSchema = ContainerBaseSchema.extend({
4254
- type: z36.literal("group"),
4255
- fields: z36.array(AnyFieldSchema),
4834
+ type: z37.literal("group"),
4835
+ fields: z37.array(AnyFieldSchema),
4256
4836
  // Container logic - only 'hidden' type allowed (same as pages)
4257
- logic: z36.array(ContainerLogicSchema).optional()
4837
+ logic: z37.array(ContainerLogicSchema).optional()
4258
4838
  });
4259
- const ArrayButtonConfigSchema = z36.object({
4260
- label: z36.string().optional(),
4261
- props: z36.record(z36.unknown()).optional()
4839
+ const ArrayButtonConfigSchema = z37.object({
4840
+ label: z37.string().optional(),
4841
+ props: z37.record(z37.unknown()).optional()
4262
4842
  });
4263
4843
  const FullArrayFieldSchema = ContainerBaseSchema.extend({
4264
- type: z36.literal("array"),
4265
- fields: z36.array(AnyFieldSchema),
4266
- logic: z36.array(ContainerLogicSchema).optional(),
4844
+ type: z37.literal("array"),
4845
+ fields: z37.array(AnyFieldSchema),
4846
+ logic: z37.array(ContainerLogicSchema).optional(),
4267
4847
  // Full API does not use template
4268
- template: z36.never().optional(),
4848
+ template: z37.never().optional(),
4269
4849
  // Array length validation
4270
- minLength: z36.number().int().min(0).optional(),
4271
- maxLength: z36.number().int().min(0).optional()
4850
+ minLength: z37.number().int().min(0).optional(),
4851
+ maxLength: z37.number().int().min(0).optional()
4272
4852
  });
4273
- const ArrayAllowedChildSchema = z36.lazy(
4853
+ const ArrayAllowedChildSchema = z37.lazy(
4274
4854
  () => AnyFieldSchema.refine((field) => field.type !== "page" && field.type !== "array", {
4275
4855
  message: "Array templates cannot contain page or array fields. Only leaf fields, rows, and groups are allowed."
4276
4856
  })
4277
4857
  );
4278
4858
  const SimplifiedArrayFieldSchema = ContainerBaseSchema.extend({
4279
- type: z36.literal("array"),
4859
+ type: z37.literal("array"),
4280
4860
  // Template: single field (primitive array) or array of fields (object array)
4281
4861
  // Only ArrayAllowedChildren (leaf fields, rows, groups) are valid — no pages or nested arrays.
4282
- template: z36.union([ArrayAllowedChildSchema, z36.array(ArrayAllowedChildSchema)]),
4862
+ template: z37.union([ArrayAllowedChildSchema, z37.array(ArrayAllowedChildSchema)]),
4283
4863
  // Initial values for the array
4284
- value: z36.array(z36.unknown()).optional(),
4864
+ value: z37.array(z37.unknown()).optional(),
4285
4865
  // Button customization or opt-out (false to disable)
4286
- addButton: z36.union([ArrayButtonConfigSchema, z36.literal(false)]).optional(),
4287
- removeButton: z36.union([ArrayButtonConfigSchema, z36.literal(false)]).optional(),
4288
- logic: z36.array(ContainerLogicSchema).optional(),
4866
+ addButton: z37.union([ArrayButtonConfigSchema, z37.literal(false)]).optional(),
4867
+ removeButton: z37.union([ArrayButtonConfigSchema, z37.literal(false)]).optional(),
4868
+ logic: z37.array(ContainerLogicSchema).optional(),
4289
4869
  // Array length validation
4290
- minLength: z36.number().int().min(0).optional(),
4291
- maxLength: z36.number().int().min(0).optional(),
4870
+ minLength: z37.number().int().min(0).optional(),
4871
+ maxLength: z37.number().int().min(0).optional(),
4292
4872
  // Simplified API does not use fields
4293
- fields: z36.never().optional(),
4294
- minItems: z36.never().optional(),
4295
- maxItems: z36.never().optional()
4873
+ fields: z37.never().optional(),
4874
+ minItems: z37.never().optional(),
4875
+ maxItems: z37.never().optional()
4296
4876
  });
4297
- const ArrayFieldSchema = z36.union([FullArrayFieldSchema, SimplifiedArrayFieldSchema]);
4877
+ const ArrayFieldSchema = z37.union([FullArrayFieldSchema, SimplifiedArrayFieldSchema]);
4298
4878
  const AllFieldsSchema = AnyFieldSchema;
4299
4879
  return {
4300
4880
  PageFieldSchema,
@@ -4316,48 +4896,48 @@ var MatArrayFieldSchema = containerSchemas.ArrayFieldSchema;
4316
4896
  var MatFieldSchema = containerSchemas.AllFieldsSchema;
4317
4897
 
4318
4898
  // internal/dynamic-forms-zod/material/src/mat-form-config.schema.ts
4319
- import { z as z40 } from "zod";
4899
+ import { z as z41 } from "zod";
4320
4900
 
4321
4901
  // internal/dynamic-forms-zod/src/lib/schemas/form/form-config.schema.ts
4322
- import { z as z39 } from "zod";
4902
+ import { z as z40 } from "zod";
4323
4903
 
4324
4904
  // internal/dynamic-forms-zod/src/lib/schemas/form/form-options.schema.ts
4325
- import { z as z37 } from "zod";
4326
- var SubmitButtonOptionsSchema = z37.object({
4905
+ import { z as z38 } from "zod";
4906
+ var SubmitButtonOptionsSchema = z38.object({
4327
4907
  /**
4328
4908
  * Whether to disable the submit button when the form is invalid.
4329
4909
  * Defaults to true.
4330
4910
  */
4331
- disableWhenInvalid: z37.boolean().optional(),
4911
+ disableWhenInvalid: z38.boolean().optional(),
4332
4912
  /**
4333
4913
  * Whether to disable the submit button while the form is submitting.
4334
4914
  * Defaults to true.
4335
4915
  */
4336
- disableWhileSubmitting: z37.boolean().optional()
4916
+ disableWhileSubmitting: z38.boolean().optional()
4337
4917
  });
4338
- var NextButtonOptionsSchema = z37.object({
4918
+ var NextButtonOptionsSchema = z38.object({
4339
4919
  /**
4340
4920
  * Whether to disable the next button when the current page is invalid.
4341
4921
  * Defaults to true.
4342
4922
  */
4343
- disableWhenPageInvalid: z37.boolean().optional(),
4923
+ disableWhenPageInvalid: z38.boolean().optional(),
4344
4924
  /**
4345
4925
  * Whether to disable the next button while the form is submitting.
4346
4926
  * Defaults to true.
4347
4927
  */
4348
- disableWhileSubmitting: z37.boolean().optional()
4928
+ disableWhileSubmitting: z38.boolean().optional()
4349
4929
  });
4350
- var FormOptionsSchema = z37.object({
4930
+ var FormOptionsSchema = z38.object({
4351
4931
  /**
4352
4932
  * Whether the entire form is disabled.
4353
4933
  */
4354
- disabled: z37.boolean().optional(),
4934
+ disabled: z38.boolean().optional(),
4355
4935
  /**
4356
4936
  * Maximum number of derivation iterations before stopping.
4357
4937
  * Prevents infinite loops in circular derivations.
4358
4938
  * Defaults to 10.
4359
4939
  */
4360
- maxDerivationIterations: z37.number().positive().optional(),
4940
+ maxDerivationIterations: z38.number().positive().optional(),
4361
4941
  /**
4362
4942
  * Options for the submit button behavior.
4363
4943
  */
@@ -4370,36 +4950,36 @@ var FormOptionsSchema = z37.object({
4370
4950
  * Whether to exclude values of hidden fields from submission output.
4371
4951
  * Overrides the global withValueExclusionDefaults() setting for this form.
4372
4952
  */
4373
- excludeValueIfHidden: z37.boolean().optional(),
4953
+ excludeValueIfHidden: z38.boolean().optional(),
4374
4954
  /**
4375
4955
  * Whether to exclude values of disabled fields from submission output.
4376
4956
  * Overrides the global withValueExclusionDefaults() setting for this form.
4377
4957
  */
4378
- excludeValueIfDisabled: z37.boolean().optional(),
4958
+ excludeValueIfDisabled: z38.boolean().optional(),
4379
4959
  /**
4380
4960
  * Whether to exclude values of readonly fields from submission output.
4381
4961
  * Overrides the global withValueExclusionDefaults() setting for this form.
4382
4962
  */
4383
- excludeValueIfReadonly: z37.boolean().optional()
4963
+ excludeValueIfReadonly: z38.boolean().optional()
4384
4964
  });
4385
4965
 
4386
4966
  // internal/dynamic-forms-zod/src/lib/schemas/form/schema-definition.schema.ts
4387
- import { z as z38 } from "zod";
4388
- var SchemaDefinitionSchema = z38.object({
4967
+ import { z as z39 } from "zod";
4968
+ var SchemaDefinitionSchema = z39.object({
4389
4969
  /**
4390
4970
  * Unique identifier for the schema.
4391
4971
  * Used to reference the schema in SchemaApplicationConfig.
4392
4972
  */
4393
- name: z38.string(),
4973
+ name: z39.string(),
4394
4974
  /**
4395
4975
  * Human-readable description of what this schema validates.
4396
4976
  */
4397
- description: z38.string().optional(),
4977
+ description: z39.string().optional(),
4398
4978
  /**
4399
4979
  * Field path pattern for automatic schema application.
4400
4980
  * Supports glob-like patterns.
4401
4981
  */
4402
- pathPattern: z38.string().optional(),
4982
+ pathPattern: z39.string().optional(),
4403
4983
  /**
4404
4984
  * Validators to apply to fields using this schema.
4405
4985
  */
@@ -4411,17 +4991,17 @@ var SchemaDefinitionSchema = z38.object({
4411
4991
  /**
4412
4992
  * Nested schema applications for composing schemas.
4413
4993
  */
4414
- subSchemas: z38.array(SchemaApplicationConfigSchema).optional()
4994
+ subSchemas: z39.array(SchemaApplicationConfigSchema).optional()
4415
4995
  });
4416
- var SchemaDefinitionsArraySchema = z38.array(SchemaDefinitionSchema);
4996
+ var SchemaDefinitionsArraySchema = z39.array(SchemaDefinitionSchema);
4417
4997
 
4418
4998
  // internal/dynamic-forms-zod/src/lib/schemas/form/form-config.schema.ts
4419
4999
  function createFormConfigSchema(fieldSchema, propsSchema) {
4420
- const baseSchema = z39.object({
5000
+ const baseSchema = z40.object({
4421
5001
  /**
4422
5002
  * Array of field definitions that make up the form.
4423
5003
  */
4424
- fields: z39.array(fieldSchema),
5004
+ fields: z40.array(fieldSchema),
4425
5005
  /**
4426
5006
  * Form-level options controlling behavior.
4427
5007
  */
@@ -4461,15 +5041,15 @@ function createFormConfigSchema(fieldSchema, propsSchema) {
4461
5041
  }
4462
5042
  return baseSchema;
4463
5043
  }
4464
- var BaseFormConfigSchema = z39.object({
4465
- fields: z39.array(z39.any()),
5044
+ var BaseFormConfigSchema = z40.object({
5045
+ fields: z40.array(z40.any()),
4466
5046
  options: FormOptionsSchema.optional(),
4467
5047
  schemas: SchemaDefinitionsArraySchema.optional(),
4468
5048
  defaultValidationMessages: ValidationMessagesSchema.optional()
4469
5049
  });
4470
5050
 
4471
5051
  // internal/dynamic-forms-zod/material/src/mat-form-config.schema.ts
4472
- var MatFormDefaultPropsSchema = z40.object({
5052
+ var MatFormDefaultPropsSchema = z41.object({
4473
5053
  /**
4474
5054
  * Default form field appearance for all fields.
4475
5055
  */
@@ -4486,15 +5066,15 @@ var MatFormDefaultPropsSchema = z40.object({
4486
5066
  var MatFormConfigSchema = createFormConfigSchema(MatFieldSchema, MatFormDefaultPropsSchema);
4487
5067
 
4488
5068
  // internal/dynamic-forms-zod/bootstrap/src/props/index.ts
4489
- import { z as z42 } from "zod";
5069
+ import { z as z43 } from "zod";
4490
5070
 
4491
5071
  // internal/dynamic-forms-zod/bootstrap/src/props/bs-common-props.schema.ts
4492
- import { z as z41 } from "zod";
4493
- var BsSizeSchema = z41.enum(["sm", "lg"]);
4494
- var BsButtonVariantSchema = z41.enum(["primary", "secondary", "success", "danger", "warning", "info", "light", "dark", "link"]);
4495
- var BsFormFieldPropsSchema = z41.object({
5072
+ import { z as z42 } from "zod";
5073
+ var BsSizeSchema = z42.enum(["sm", "lg"]);
5074
+ var BsButtonVariantSchema = z42.enum(["primary", "secondary", "success", "danger", "warning", "info", "light", "dark", "link"]);
5075
+ var BsFormFieldPropsSchema = z42.object({
4496
5076
  size: BsSizeSchema.optional(),
4497
- floatingLabel: z41.boolean().optional(),
5077
+ floatingLabel: z42.boolean().optional(),
4498
5078
  hint: DynamicTextSchema.optional(),
4499
5079
  validFeedback: DynamicTextSchema.optional(),
4500
5080
  invalidFeedback: DynamicTextSchema.optional()
@@ -4502,194 +5082,208 @@ var BsFormFieldPropsSchema = z41.object({
4502
5082
 
4503
5083
  // internal/dynamic-forms-zod/bootstrap/src/props/index.ts
4504
5084
  var BsInputPropsSchema = BsFormFieldPropsSchema.extend({
4505
- type: z42.enum(["text", "email", "password", "number", "tel", "url"]).optional(),
5085
+ type: z43.enum(["text", "email", "password", "number", "tel", "url"]).optional(),
4506
5086
  placeholder: DynamicTextSchema.optional(),
4507
- plaintext: z42.boolean().optional()
5087
+ plaintext: z43.boolean().optional()
4508
5088
  });
4509
5089
  var BsTextareaPropsSchema = BsFormFieldPropsSchema.extend({
4510
- rows: z42.number().positive().optional(),
5090
+ rows: z43.number().positive().optional(),
4511
5091
  placeholder: DynamicTextSchema.optional()
4512
5092
  });
4513
5093
  var BsSelectPropsSchema = BsFormFieldPropsSchema.extend({
4514
- multiple: z42.boolean().optional(),
4515
- htmlSize: z42.number().positive().optional(),
5094
+ multiple: z43.boolean().optional(),
5095
+ htmlSize: z43.number().positive().optional(),
4516
5096
  placeholder: DynamicTextSchema.optional()
4517
5097
  });
4518
- var BsCheckboxPropsSchema = z42.object({
4519
- switch: z42.boolean().optional(),
4520
- inline: z42.boolean().optional(),
4521
- reverse: z42.boolean().optional(),
4522
- indeterminate: z42.boolean().optional(),
5098
+ var BsCheckboxPropsSchema = z43.object({
5099
+ switch: z43.boolean().optional(),
5100
+ inline: z43.boolean().optional(),
5101
+ reverse: z43.boolean().optional(),
5102
+ indeterminate: z43.boolean().optional(),
4523
5103
  hint: DynamicTextSchema.optional()
4524
5104
  });
4525
- var BsRadioPropsSchema = z42.object({
4526
- inline: z42.boolean().optional(),
4527
- reverse: z42.boolean().optional(),
4528
- buttonGroup: z42.boolean().optional(),
5105
+ var BsRadioPropsSchema = z43.object({
5106
+ inline: z43.boolean().optional(),
5107
+ reverse: z43.boolean().optional(),
5108
+ buttonGroup: z43.boolean().optional(),
4529
5109
  buttonSize: BsSizeSchema.optional(),
4530
5110
  hint: DynamicTextSchema.optional()
4531
5111
  });
4532
- var BsMultiCheckboxPropsSchema = z42.object({
4533
- switch: z42.boolean().optional(),
4534
- inline: z42.boolean().optional(),
4535
- reverse: z42.boolean().optional(),
5112
+ var BsMultiCheckboxPropsSchema = z43.object({
5113
+ switch: z43.boolean().optional(),
5114
+ inline: z43.boolean().optional(),
5115
+ reverse: z43.boolean().optional(),
4536
5116
  hint: DynamicTextSchema.optional()
4537
5117
  });
4538
- var BsTogglePropsSchema = z42.object({
5118
+ var BsTogglePropsSchema = z43.object({
4539
5119
  size: BsSizeSchema.optional(),
4540
- reverse: z42.boolean().optional(),
4541
- inline: z42.boolean().optional(),
5120
+ reverse: z43.boolean().optional(),
5121
+ inline: z43.boolean().optional(),
4542
5122
  hint: DynamicTextSchema.optional()
4543
5123
  });
4544
5124
  var BsDatepickerPropsSchema = BsFormFieldPropsSchema.extend({
4545
- useNgBootstrap: z42.boolean().optional(),
4546
- displayMonths: z42.number().positive().optional(),
4547
- navigation: z42.enum(["select", "arrows", "none"]).optional(),
4548
- outsideDays: z42.enum(["visible", "collapsed", "hidden"]).optional(),
4549
- showWeekNumbers: z42.boolean().optional(),
5125
+ useNgBootstrap: z43.boolean().optional(),
5126
+ displayMonths: z43.number().positive().optional(),
5127
+ navigation: z43.enum(["select", "arrows", "none"]).optional(),
5128
+ outsideDays: z43.enum(["visible", "collapsed", "hidden"]).optional(),
5129
+ showWeekNumbers: z43.boolean().optional(),
4550
5130
  placeholder: DynamicTextSchema.optional()
4551
5131
  });
4552
- var BsSliderPropsSchema = z42.object({
4553
- showValue: z42.boolean().optional(),
4554
- valuePrefix: z42.string().optional(),
4555
- valueSuffix: z42.string().optional(),
5132
+ var BsSliderPropsSchema = z43.object({
5133
+ showValue: z43.boolean().optional(),
5134
+ valuePrefix: z43.string().optional(),
5135
+ valueSuffix: z43.string().optional(),
4556
5136
  hint: DynamicTextSchema.optional(),
4557
- min: z42.number().optional(),
4558
- max: z42.number().optional(),
4559
- step: z42.number().positive().optional()
5137
+ min: z43.number().optional(),
5138
+ max: z43.number().optional(),
5139
+ step: z43.number().positive().optional()
4560
5140
  });
4561
- var BsButtonPropsSchema = z42.object({
5141
+ var BsButtonPropsSchema = z43.object({
4562
5142
  variant: BsButtonVariantSchema.optional(),
4563
- outline: z42.boolean().optional(),
5143
+ outline: z43.boolean().optional(),
4564
5144
  size: BsSizeSchema.optional(),
4565
- block: z42.boolean().optional(),
4566
- active: z42.boolean().optional(),
4567
- type: z42.enum(["button", "submit", "reset"]).optional()
5145
+ block: z43.boolean().optional(),
5146
+ active: z43.boolean().optional(),
5147
+ type: z43.enum(["button", "submit", "reset"]).optional()
4568
5148
  });
4569
5149
 
4570
5150
  // internal/dynamic-forms-zod/bootstrap/src/fields/index.ts
4571
- import { z as z43 } from "zod";
5151
+ import { z as z44 } from "zod";
4572
5152
  var BsValueFieldBase = BaseFieldDefSchema.merge(FieldWithValidationSchema);
4573
- var BsInputFieldSchema = BsValueFieldBase.extend({
4574
- type: z43.literal("input"),
4575
- value: z43.string().optional(),
5153
+ var BsInputFieldSchemaObject = BsValueFieldBase.extend({
5154
+ type: z44.literal("input"),
5155
+ nullable: z44.boolean().optional(),
5156
+ value: z44.string().nullable().optional(),
4576
5157
  placeholder: DynamicTextSchema.optional(),
4577
5158
  props: BsInputPropsSchema.optional()
4578
5159
  });
4579
- var BsTextareaFieldSchema = BsValueFieldBase.extend({
4580
- type: z43.literal("textarea"),
4581
- value: z43.string().optional(),
5160
+ var BsInputFieldSchema = BsInputFieldSchemaObject.superRefine(nullableValueRefine);
5161
+ var BsTextareaFieldSchemaObject = BsValueFieldBase.extend({
5162
+ type: z44.literal("textarea"),
5163
+ nullable: z44.boolean().optional(),
5164
+ value: z44.string().nullable().optional(),
4582
5165
  placeholder: DynamicTextSchema.optional(),
4583
5166
  props: BsTextareaPropsSchema.optional()
4584
5167
  });
4585
- var BsSelectFieldSchema = BsValueFieldBase.extend({
4586
- type: z43.literal("select"),
4587
- value: z43.string().optional(),
5168
+ var BsTextareaFieldSchema = BsTextareaFieldSchemaObject.superRefine(nullableValueRefine);
5169
+ var BsSelectFieldSchemaObject = BsValueFieldBase.extend({
5170
+ type: z44.literal("select"),
5171
+ nullable: z44.boolean().optional(),
5172
+ value: z44.string().nullable().optional(),
4588
5173
  // Bootstrap select only supports strings
4589
5174
  placeholder: DynamicTextSchema.optional(),
4590
5175
  options: FieldOptionsSchema,
4591
5176
  props: BsSelectPropsSchema.optional()
4592
5177
  });
5178
+ var BsSelectFieldSchema = BsSelectFieldSchemaObject.superRefine(nullableValueRefine);
4593
5179
  var BsCheckboxFieldSchema = BsValueFieldBase.extend({
4594
- type: z43.literal("checkbox"),
4595
- value: z43.boolean().optional(),
5180
+ type: z44.literal("checkbox"),
5181
+ value: z44.boolean().optional(),
4596
5182
  placeholder: DynamicTextSchema.optional(),
4597
5183
  props: BsCheckboxPropsSchema.optional()
4598
5184
  });
4599
- var BsRadioFieldSchema = BsValueFieldBase.extend({
4600
- type: z43.literal("radio"),
4601
- value: z43.unknown().optional(),
5185
+ var BsRadioFieldSchemaObject = BsValueFieldBase.extend({
5186
+ type: z44.literal("radio"),
5187
+ nullable: z44.boolean().optional(),
5188
+ value: z44.unknown().nullable().optional(),
4602
5189
  placeholder: DynamicTextSchema.optional(),
4603
5190
  options: FieldOptionsSchema,
4604
5191
  props: BsRadioPropsSchema.optional()
4605
5192
  });
4606
- var BsMultiCheckboxFieldSchema = BsValueFieldBase.extend({
4607
- type: z43.literal("multi-checkbox"),
4608
- value: z43.array(z43.unknown()).optional(),
5193
+ var BsRadioFieldSchema = BsRadioFieldSchemaObject.superRefine(nullableValueRefine);
5194
+ var BsMultiCheckboxFieldSchemaObject = BsValueFieldBase.extend({
5195
+ type: z44.literal("multi-checkbox"),
5196
+ nullable: z44.boolean().optional(),
5197
+ value: z44.array(z44.unknown()).nullable().optional(),
4609
5198
  placeholder: DynamicTextSchema.optional(),
4610
5199
  options: FieldOptionsSchema,
4611
5200
  props: BsMultiCheckboxPropsSchema.optional()
4612
5201
  });
5202
+ var BsMultiCheckboxFieldSchema = BsMultiCheckboxFieldSchemaObject.superRefine(nullableValueRefine);
4613
5203
  var BsToggleFieldSchema = BsValueFieldBase.extend({
4614
- type: z43.literal("toggle"),
4615
- value: z43.boolean().optional(),
5204
+ type: z44.literal("toggle"),
5205
+ value: z44.boolean().optional(),
4616
5206
  placeholder: DynamicTextSchema.optional(),
4617
5207
  props: BsTogglePropsSchema.optional()
4618
5208
  });
4619
- var BsDatepickerFieldSchema = BsValueFieldBase.extend({
4620
- type: z43.literal("datepicker"),
4621
- value: z43.union([z43.string(), z43.null()]).optional(),
4622
- minDate: z43.union([z43.string(), z43.null()]).optional(),
4623
- maxDate: z43.union([z43.string(), z43.null()]).optional(),
4624
- startAt: z43.union([z43.string(), z43.null()]).optional(),
5209
+ var BsDatepickerFieldSchemaObject = BsValueFieldBase.extend({
5210
+ type: z44.literal("datepicker"),
5211
+ nullable: z44.boolean().optional(),
5212
+ value: z44.union([z44.string(), z44.null()]).optional(),
5213
+ minDate: z44.union([z44.string(), z44.null()]).optional(),
5214
+ maxDate: z44.union([z44.string(), z44.null()]).optional(),
5215
+ startAt: z44.union([z44.string(), z44.null()]).optional(),
4625
5216
  placeholder: DynamicTextSchema.optional(),
4626
5217
  props: BsDatepickerPropsSchema.optional()
4627
5218
  });
4628
- var BsSliderFieldSchema = BsValueFieldBase.extend({
4629
- type: z43.literal("slider"),
4630
- value: z43.number().optional(),
4631
- minValue: z43.number().optional(),
4632
- maxValue: z43.number().optional(),
4633
- step: z43.number().positive().optional(),
5219
+ var BsDatepickerFieldSchema = BsDatepickerFieldSchemaObject.superRefine(nullableValueRefine);
5220
+ var BsSliderFieldSchemaObject = BsValueFieldBase.extend({
5221
+ type: z44.literal("slider"),
5222
+ nullable: z44.boolean().optional(),
5223
+ value: z44.number().nullable().optional(),
5224
+ minValue: z44.number().optional(),
5225
+ maxValue: z44.number().optional(),
5226
+ step: z44.number().positive().optional(),
4634
5227
  placeholder: DynamicTextSchema.optional(),
4635
5228
  props: BsSliderPropsSchema.optional()
4636
5229
  });
5230
+ var BsSliderFieldSchema = BsSliderFieldSchemaObject.superRefine(nullableValueRefine);
4637
5231
  var BsButtonFieldSchema = BaseFieldDefSchema.extend({
4638
- type: z43.literal("button"),
4639
- event: z43.string().optional(),
4640
- eventArgs: z43.array(z43.union([z43.string(), z43.number(), z43.boolean(), z43.null(), z43.undefined()])).optional(),
5232
+ type: z44.literal("button"),
5233
+ event: z44.string().optional(),
5234
+ eventArgs: z44.array(z44.union([z44.string(), z44.number(), z44.boolean(), z44.null(), z44.undefined()])).optional(),
4641
5235
  props: BsButtonPropsSchema.optional(),
4642
5236
  logic: LogicArraySchema.optional()
4643
5237
  });
4644
5238
  var BsSubmitButtonFieldSchema = BaseFieldDefSchema.extend({
4645
- type: z43.literal("submit"),
5239
+ type: z44.literal("submit"),
4646
5240
  props: BsButtonPropsSchema.optional(),
4647
5241
  logic: LogicArraySchema.optional()
4648
5242
  });
4649
5243
  var BsNextButtonFieldSchema = BaseFieldDefSchema.extend({
4650
- type: z43.literal("next"),
5244
+ type: z44.literal("next"),
4651
5245
  props: BsButtonPropsSchema.optional(),
4652
5246
  logic: LogicArraySchema.optional()
4653
5247
  });
4654
5248
  var BsPreviousButtonFieldSchema = BaseFieldDefSchema.extend({
4655
- type: z43.literal("previous"),
5249
+ type: z44.literal("previous"),
4656
5250
  props: BsButtonPropsSchema.optional()
4657
5251
  });
4658
5252
  var BsAddArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
4659
- type: z43.literal("addArrayItem"),
4660
- arrayKey: z43.string().optional(),
5253
+ type: z44.literal("addArrayItem"),
5254
+ arrayKey: z44.string().optional(),
4661
5255
  props: BsButtonPropsSchema.optional()
4662
5256
  });
4663
5257
  var BsRemoveArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
4664
- type: z43.literal("removeArrayItem"),
4665
- arrayKey: z43.string().optional(),
5258
+ type: z44.literal("removeArrayItem"),
5259
+ arrayKey: z44.string().optional(),
4666
5260
  props: BsButtonPropsSchema.optional()
4667
5261
  });
4668
5262
 
4669
5263
  // internal/dynamic-forms-zod/bootstrap/src/bs-leaf-field.schema.ts
4670
- import { z as z44 } from "zod";
4671
- var BsLeafFieldSchema = z44.discriminatedUnion("type", [
5264
+ import { z as z45 } from "zod";
5265
+ var BsLeafFieldSchema = z45.discriminatedUnion("type", [
4672
5266
  TextFieldSchema,
4673
5267
  HiddenFieldSchema,
4674
- BsInputFieldSchema,
4675
- BsTextareaFieldSchema,
4676
- BsSelectFieldSchema,
5268
+ BsInputFieldSchemaObject,
5269
+ BsTextareaFieldSchemaObject,
5270
+ BsSelectFieldSchemaObject,
4677
5271
  BsCheckboxFieldSchema,
4678
- BsRadioFieldSchema,
4679
- BsMultiCheckboxFieldSchema,
5272
+ BsRadioFieldSchemaObject,
5273
+ BsMultiCheckboxFieldSchemaObject,
4680
5274
  BsToggleFieldSchema,
4681
- BsDatepickerFieldSchema,
4682
- BsSliderFieldSchema,
5275
+ BsDatepickerFieldSchemaObject,
5276
+ BsSliderFieldSchemaObject,
4683
5277
  BsButtonFieldSchema,
4684
5278
  BsSubmitButtonFieldSchema,
4685
5279
  BsNextButtonFieldSchema,
4686
5280
  BsPreviousButtonFieldSchema,
4687
5281
  BsAddArrayItemButtonFieldSchema,
4688
5282
  BsRemoveArrayItemButtonFieldSchema
4689
- ]);
5283
+ ]).superRefine(nullableValueRefine);
4690
5284
 
4691
5285
  // internal/dynamic-forms-zod/bootstrap/src/bs-form-config.schema.ts
4692
- import { z as z45 } from "zod";
5286
+ import { z as z46 } from "zod";
4693
5287
  var containerSchemas2 = createContainerSchemas({
4694
5288
  leafFieldSchema: BsLeafFieldSchema
4695
5289
  });
@@ -4698,186 +5292,200 @@ var BsRowFieldSchema = containerSchemas2.RowFieldSchema;
4698
5292
  var BsGroupFieldSchema = containerSchemas2.GroupFieldSchema;
4699
5293
  var BsArrayFieldSchema = containerSchemas2.ArrayFieldSchema;
4700
5294
  var BsFieldSchema = containerSchemas2.AllFieldsSchema;
4701
- var BsFormDefaultPropsSchema = z45.object({
5295
+ var BsFormDefaultPropsSchema = z46.object({
4702
5296
  size: BsSizeSchema.optional(),
4703
- floatingLabel: z45.boolean().optional()
5297
+ floatingLabel: z46.boolean().optional()
4704
5298
  });
4705
5299
  var BsFormConfigSchema = createFormConfigSchema(BsFieldSchema, BsFormDefaultPropsSchema);
4706
5300
 
4707
5301
  // internal/dynamic-forms-zod/primeng/src/props/index.ts
4708
- import { z as z46 } from "zod";
4709
- var PrimeSeveritySchema = z46.enum(["primary", "secondary", "success", "info", "warn", "danger", "help", "contrast"]);
4710
- var PrimeCommonPropsSchema = z46.object({
4711
- styleClass: z46.string().optional(),
5302
+ import { z as z47 } from "zod";
5303
+ var PrimeSeveritySchema = z47.enum(["primary", "secondary", "success", "info", "warn", "danger", "help", "contrast"]);
5304
+ var PrimeCommonPropsSchema = z47.object({
5305
+ styleClass: z47.string().optional(),
4712
5306
  hint: DynamicTextSchema.optional()
4713
5307
  });
4714
5308
  var PrimeInputPropsSchema = PrimeCommonPropsSchema.extend({
4715
- type: z46.enum(["text", "email", "password", "number", "tel", "url"]).optional(),
5309
+ type: z47.enum(["text", "email", "password", "number", "tel", "url"]).optional(),
4716
5310
  placeholder: DynamicTextSchema.optional(),
4717
- size: z46.enum(["small", "large"]).optional(),
4718
- variant: z46.enum(["outlined", "filled"]).optional()
5311
+ size: z47.enum(["small", "large"]).optional(),
5312
+ variant: z47.enum(["outlined", "filled"]).optional()
4719
5313
  });
4720
5314
  var PrimeCheckboxPropsSchema = PrimeCommonPropsSchema.extend({
4721
- binary: z46.boolean().optional(),
4722
- trueValue: z46.unknown().optional(),
4723
- falseValue: z46.unknown().optional()
5315
+ binary: z47.boolean().optional(),
5316
+ trueValue: z47.unknown().optional(),
5317
+ falseValue: z47.unknown().optional()
4724
5318
  });
4725
5319
  var PrimeRadioPropsSchema = PrimeCommonPropsSchema.extend({
4726
- name: z46.string().optional()
5320
+ name: z47.string().optional()
4727
5321
  });
4728
5322
  var PrimeSelectPropsSchema = PrimeCommonPropsSchema.extend({
4729
- multiple: z46.boolean().optional(),
4730
- filter: z46.boolean().optional(),
5323
+ multiple: z47.boolean().optional(),
5324
+ filter: z47.boolean().optional(),
4731
5325
  placeholder: DynamicTextSchema.optional(),
4732
- showClear: z46.boolean().optional()
5326
+ showClear: z47.boolean().optional()
4733
5327
  });
4734
5328
  var PrimeMultiCheckboxPropsSchema = PrimeCommonPropsSchema;
4735
5329
  var PrimeDatepickerPropsSchema = PrimeCommonPropsSchema.extend({
4736
- dateFormat: z46.string().optional(),
4737
- inline: z46.boolean().optional(),
4738
- showIcon: z46.boolean().optional(),
4739
- showButtonBar: z46.boolean().optional(),
4740
- selectionMode: z46.enum(["single", "multiple", "range"]).optional(),
4741
- touchUI: z46.boolean().optional(),
4742
- view: z46.enum(["date", "month", "year"]).optional(),
5330
+ dateFormat: z47.string().optional(),
5331
+ inline: z47.boolean().optional(),
5332
+ showIcon: z47.boolean().optional(),
5333
+ showButtonBar: z47.boolean().optional(),
5334
+ selectionMode: z47.enum(["single", "multiple", "range"]).optional(),
5335
+ touchUI: z47.boolean().optional(),
5336
+ view: z47.enum(["date", "month", "year"]).optional(),
4743
5337
  placeholder: DynamicTextSchema.optional()
4744
5338
  });
4745
5339
  var PrimeTextareaPropsSchema = PrimeCommonPropsSchema.extend({
4746
- rows: z46.number().positive().optional(),
4747
- autoResize: z46.boolean().optional(),
4748
- maxlength: z46.number().positive().optional(),
5340
+ rows: z47.number().positive().optional(),
5341
+ autoResize: z47.boolean().optional(),
5342
+ maxlength: z47.number().positive().optional(),
4749
5343
  placeholder: DynamicTextSchema.optional()
4750
5344
  });
4751
5345
  var PrimeSliderPropsSchema = PrimeCommonPropsSchema.extend({
4752
- min: z46.number().optional(),
4753
- max: z46.number().optional(),
4754
- step: z46.number().positive().optional(),
4755
- range: z46.boolean().optional(),
4756
- orientation: z46.enum(["horizontal", "vertical"]).optional()
5346
+ min: z47.number().optional(),
5347
+ max: z47.number().optional(),
5348
+ step: z47.number().positive().optional(),
5349
+ range: z47.boolean().optional(),
5350
+ orientation: z47.enum(["horizontal", "vertical"]).optional()
4757
5351
  });
4758
5352
  var PrimeTogglePropsSchema = PrimeCommonPropsSchema;
4759
- var PrimeButtonPropsSchema = z46.object({
5353
+ var PrimeButtonPropsSchema = z47.object({
4760
5354
  severity: PrimeSeveritySchema.optional(),
4761
- text: z46.boolean().optional(),
4762
- outlined: z46.boolean().optional(),
4763
- raised: z46.boolean().optional(),
4764
- rounded: z46.boolean().optional(),
4765
- icon: z46.string().optional(),
4766
- iconPos: z46.enum(["left", "right", "top", "bottom"]).optional(),
4767
- type: z46.enum(["button", "submit", "reset"]).optional()
5355
+ text: z47.boolean().optional(),
5356
+ outlined: z47.boolean().optional(),
5357
+ raised: z47.boolean().optional(),
5358
+ rounded: z47.boolean().optional(),
5359
+ icon: z47.string().optional(),
5360
+ iconPos: z47.enum(["left", "right", "top", "bottom"]).optional(),
5361
+ type: z47.enum(["button", "submit", "reset"]).optional()
4768
5362
  });
4769
5363
 
4770
5364
  // internal/dynamic-forms-zod/primeng/src/fields/index.ts
4771
- import { z as z47 } from "zod";
5365
+ import { z as z48 } from "zod";
4772
5366
  var PrimeValueFieldBase = BaseFieldDefSchema.merge(FieldWithValidationSchema);
4773
- var PrimeInputFieldSchema = PrimeValueFieldBase.extend({
4774
- type: z47.literal("input"),
4775
- value: z47.string().optional(),
5367
+ var PrimeInputFieldSchemaObject = PrimeValueFieldBase.extend({
5368
+ type: z48.literal("input"),
5369
+ nullable: z48.boolean().optional(),
5370
+ value: z48.string().nullable().optional(),
4776
5371
  placeholder: DynamicTextSchema.optional(),
4777
5372
  props: PrimeInputPropsSchema.optional()
4778
5373
  });
5374
+ var PrimeInputFieldSchema = PrimeInputFieldSchemaObject.superRefine(nullableValueRefine);
4779
5375
  var PrimeCheckboxFieldSchema = PrimeValueFieldBase.extend({
4780
- type: z47.literal("checkbox"),
4781
- value: z47.boolean().optional(),
5376
+ type: z48.literal("checkbox"),
5377
+ value: z48.boolean().optional(),
4782
5378
  placeholder: DynamicTextSchema.optional(),
4783
5379
  props: PrimeCheckboxPropsSchema.optional()
4784
5380
  });
4785
- var PrimeRadioFieldSchema = PrimeValueFieldBase.extend({
4786
- type: z47.literal("radio"),
4787
- value: z47.unknown().optional(),
5381
+ var PrimeRadioFieldSchemaObject = PrimeValueFieldBase.extend({
5382
+ type: z48.literal("radio"),
5383
+ nullable: z48.boolean().optional(),
5384
+ value: z48.unknown().nullable().optional(),
4788
5385
  placeholder: DynamicTextSchema.optional(),
4789
5386
  options: FieldOptionsSchema,
4790
5387
  props: PrimeRadioPropsSchema.optional()
4791
5388
  });
4792
- var PrimeSelectFieldSchema = PrimeValueFieldBase.extend({
4793
- type: z47.literal("select"),
4794
- value: z47.unknown().optional(),
5389
+ var PrimeRadioFieldSchema = PrimeRadioFieldSchemaObject.superRefine(nullableValueRefine);
5390
+ var PrimeSelectFieldSchemaObject = PrimeValueFieldBase.extend({
5391
+ type: z48.literal("select"),
5392
+ nullable: z48.boolean().optional(),
5393
+ value: z48.unknown().nullable().optional(),
4795
5394
  placeholder: DynamicTextSchema.optional(),
4796
5395
  options: FieldOptionsSchema,
4797
5396
  props: PrimeSelectPropsSchema.optional()
4798
5397
  });
4799
- var PrimeMultiCheckboxFieldSchema = PrimeValueFieldBase.extend({
4800
- type: z47.literal("multi-checkbox"),
4801
- value: z47.array(z47.unknown()).optional(),
5398
+ var PrimeSelectFieldSchema = PrimeSelectFieldSchemaObject.superRefine(nullableValueRefine);
5399
+ var PrimeMultiCheckboxFieldSchemaObject = PrimeValueFieldBase.extend({
5400
+ type: z48.literal("multi-checkbox"),
5401
+ nullable: z48.boolean().optional(),
5402
+ value: z48.array(z48.unknown()).nullable().optional(),
4802
5403
  placeholder: DynamicTextSchema.optional(),
4803
5404
  options: FieldOptionsSchema,
4804
5405
  props: PrimeMultiCheckboxPropsSchema.optional()
4805
5406
  });
4806
- var PrimeDatepickerFieldSchema = PrimeValueFieldBase.extend({
4807
- type: z47.literal("datepicker"),
4808
- value: z47.union([z47.string(), z47.null()]).optional(),
4809
- minDate: z47.union([z47.string(), z47.null()]).optional(),
4810
- maxDate: z47.union([z47.string(), z47.null()]).optional(),
4811
- startAt: z47.union([z47.string(), z47.null()]).optional(),
5407
+ var PrimeMultiCheckboxFieldSchema = PrimeMultiCheckboxFieldSchemaObject.superRefine(nullableValueRefine);
5408
+ var PrimeDatepickerFieldSchemaObject = PrimeValueFieldBase.extend({
5409
+ type: z48.literal("datepicker"),
5410
+ nullable: z48.boolean().optional(),
5411
+ value: z48.union([z48.string(), z48.null()]).optional(),
5412
+ minDate: z48.union([z48.string(), z48.null()]).optional(),
5413
+ maxDate: z48.union([z48.string(), z48.null()]).optional(),
5414
+ startAt: z48.union([z48.string(), z48.null()]).optional(),
4812
5415
  placeholder: DynamicTextSchema.optional(),
4813
5416
  props: PrimeDatepickerPropsSchema.optional()
4814
5417
  });
4815
- var PrimeTextareaFieldSchema = PrimeValueFieldBase.extend({
4816
- type: z47.literal("textarea"),
4817
- value: z47.string().optional(),
5418
+ var PrimeDatepickerFieldSchema = PrimeDatepickerFieldSchemaObject.superRefine(nullableValueRefine);
5419
+ var PrimeTextareaFieldSchemaObject = PrimeValueFieldBase.extend({
5420
+ type: z48.literal("textarea"),
5421
+ nullable: z48.boolean().optional(),
5422
+ value: z48.string().nullable().optional(),
4818
5423
  placeholder: DynamicTextSchema.optional(),
4819
5424
  props: PrimeTextareaPropsSchema.optional()
4820
5425
  });
4821
- var PrimeSliderFieldSchema = PrimeValueFieldBase.extend({
4822
- type: z47.literal("slider"),
4823
- value: z47.number().optional(),
4824
- minValue: z47.number().optional(),
4825
- maxValue: z47.number().optional(),
4826
- step: z47.number().positive().optional(),
5426
+ var PrimeTextareaFieldSchema = PrimeTextareaFieldSchemaObject.superRefine(nullableValueRefine);
5427
+ var PrimeSliderFieldSchemaObject = PrimeValueFieldBase.extend({
5428
+ type: z48.literal("slider"),
5429
+ nullable: z48.boolean().optional(),
5430
+ value: z48.number().nullable().optional(),
5431
+ minValue: z48.number().optional(),
5432
+ maxValue: z48.number().optional(),
5433
+ step: z48.number().positive().optional(),
4827
5434
  placeholder: DynamicTextSchema.optional(),
4828
5435
  props: PrimeSliderPropsSchema.optional()
4829
5436
  });
5437
+ var PrimeSliderFieldSchema = PrimeSliderFieldSchemaObject.superRefine(nullableValueRefine);
4830
5438
  var PrimeToggleFieldSchema = PrimeValueFieldBase.extend({
4831
- type: z47.literal("toggle"),
4832
- value: z47.boolean().optional(),
5439
+ type: z48.literal("toggle"),
5440
+ value: z48.boolean().optional(),
4833
5441
  placeholder: DynamicTextSchema.optional(),
4834
5442
  props: PrimeTogglePropsSchema.optional()
4835
5443
  });
4836
5444
  var PrimeButtonFieldSchema = BaseFieldDefSchema.extend({
4837
- type: z47.literal("button"),
4838
- event: z47.string().optional(),
4839
- eventArgs: z47.array(z47.union([z47.string(), z47.number(), z47.boolean(), z47.null(), z47.undefined()])).optional(),
5445
+ type: z48.literal("button"),
5446
+ event: z48.string().optional(),
5447
+ eventArgs: z48.array(z48.union([z48.string(), z48.number(), z48.boolean(), z48.null(), z48.undefined()])).optional(),
4840
5448
  props: PrimeButtonPropsSchema.optional(),
4841
5449
  logic: LogicArraySchema.optional()
4842
5450
  });
4843
5451
  var PrimeSubmitButtonFieldSchema = BaseFieldDefSchema.extend({
4844
- type: z47.literal("submit"),
5452
+ type: z48.literal("submit"),
4845
5453
  props: PrimeButtonPropsSchema.optional(),
4846
5454
  logic: LogicArraySchema.optional()
4847
5455
  });
4848
5456
  var PrimeNextButtonFieldSchema = BaseFieldDefSchema.extend({
4849
- type: z47.literal("next"),
5457
+ type: z48.literal("next"),
4850
5458
  props: PrimeButtonPropsSchema.optional(),
4851
5459
  logic: LogicArraySchema.optional()
4852
5460
  });
4853
5461
  var PrimePreviousButtonFieldSchema = BaseFieldDefSchema.extend({
4854
- type: z47.literal("previous"),
5462
+ type: z48.literal("previous"),
4855
5463
  props: PrimeButtonPropsSchema.optional()
4856
5464
  });
4857
5465
  var PrimeAddArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
4858
- type: z47.literal("addArrayItem"),
4859
- arrayKey: z47.string().optional(),
5466
+ type: z48.literal("addArrayItem"),
5467
+ arrayKey: z48.string().optional(),
4860
5468
  props: PrimeButtonPropsSchema.optional()
4861
5469
  });
4862
5470
  var PrimeRemoveArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
4863
- type: z47.literal("removeArrayItem"),
4864
- arrayKey: z47.string().optional(),
5471
+ type: z48.literal("removeArrayItem"),
5472
+ arrayKey: z48.string().optional(),
4865
5473
  props: PrimeButtonPropsSchema.optional()
4866
5474
  });
4867
5475
 
4868
5476
  // internal/dynamic-forms-zod/primeng/src/prime-leaf-field.schema.ts
4869
- import { z as z48 } from "zod";
4870
- var PrimeLeafFieldSchema = z48.discriminatedUnion("type", [
5477
+ import { z as z49 } from "zod";
5478
+ var PrimeLeafFieldSchema = z49.discriminatedUnion("type", [
4871
5479
  TextFieldSchema,
4872
5480
  HiddenFieldSchema,
4873
- PrimeInputFieldSchema,
5481
+ PrimeInputFieldSchemaObject,
4874
5482
  PrimeCheckboxFieldSchema,
4875
- PrimeRadioFieldSchema,
4876
- PrimeSelectFieldSchema,
4877
- PrimeMultiCheckboxFieldSchema,
4878
- PrimeDatepickerFieldSchema,
4879
- PrimeTextareaFieldSchema,
4880
- PrimeSliderFieldSchema,
5483
+ PrimeRadioFieldSchemaObject,
5484
+ PrimeSelectFieldSchemaObject,
5485
+ PrimeMultiCheckboxFieldSchemaObject,
5486
+ PrimeDatepickerFieldSchemaObject,
5487
+ PrimeTextareaFieldSchemaObject,
5488
+ PrimeSliderFieldSchemaObject,
4881
5489
  PrimeToggleFieldSchema,
4882
5490
  PrimeButtonFieldSchema,
4883
5491
  PrimeSubmitButtonFieldSchema,
@@ -4885,10 +5493,10 @@ var PrimeLeafFieldSchema = z48.discriminatedUnion("type", [
4885
5493
  PrimePreviousButtonFieldSchema,
4886
5494
  PrimeAddArrayItemButtonFieldSchema,
4887
5495
  PrimeRemoveArrayItemButtonFieldSchema
4888
- ]);
5496
+ ]).superRefine(nullableValueRefine);
4889
5497
 
4890
5498
  // internal/dynamic-forms-zod/primeng/src/prime-form-config.schema.ts
4891
- import { z as z49 } from "zod";
5499
+ import { z as z50 } from "zod";
4892
5500
  var containerSchemas3 = createContainerSchemas({
4893
5501
  leafFieldSchema: PrimeLeafFieldSchema
4894
5502
  });
@@ -4897,240 +5505,254 @@ var PrimeRowFieldSchema = containerSchemas3.RowFieldSchema;
4897
5505
  var PrimeGroupFieldSchema = containerSchemas3.GroupFieldSchema;
4898
5506
  var PrimeArrayFieldSchema = containerSchemas3.ArrayFieldSchema;
4899
5507
  var PrimeFieldSchema = containerSchemas3.AllFieldsSchema;
4900
- var PrimeFormDefaultPropsSchema = z49.object({
4901
- styleClass: z49.string().optional()
5508
+ var PrimeFormDefaultPropsSchema = z50.object({
5509
+ styleClass: z50.string().optional()
4902
5510
  });
4903
5511
  var PrimeFormConfigSchema = createFormConfigSchema(PrimeFieldSchema, PrimeFormDefaultPropsSchema);
4904
5512
 
4905
5513
  // internal/dynamic-forms-zod/ionic/src/props/index.ts
4906
- import { z as z50 } from "zod";
4907
- var IonicColorSchema = z50.enum(["primary", "secondary", "tertiary", "success", "warning", "danger", "light", "medium", "dark"]);
4908
- var IonicLabelPlacementSchema = z50.enum(["start", "end", "fixed", "stacked", "floating"]);
4909
- var IonicJustifySchema = z50.enum(["start", "end", "space-between"]);
4910
- var IonicFillSchema = z50.enum(["solid", "outline", "clear", "default"]);
4911
- var IonicInputPropsSchema = z50.object({
4912
- fill: z50.enum(["solid", "outline"]).optional(),
4913
- shape: z50.literal("round").optional(),
5514
+ import { z as z51 } from "zod";
5515
+ var IonicColorSchema = z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger", "light", "medium", "dark"]);
5516
+ var IonicLabelPlacementSchema = z51.enum(["start", "end", "fixed", "stacked", "floating"]);
5517
+ var IonicJustifySchema = z51.enum(["start", "end", "space-between"]);
5518
+ var IonicFillSchema = z51.enum(["solid", "outline", "clear", "default"]);
5519
+ var IonicInputPropsSchema = z51.object({
5520
+ fill: z51.enum(["solid", "outline"]).optional(),
5521
+ shape: z51.literal("round").optional(),
4914
5522
  labelPlacement: IonicLabelPlacementSchema.optional(),
4915
5523
  color: IonicColorSchema.optional(),
4916
5524
  hint: DynamicTextSchema.optional(),
4917
5525
  errorText: DynamicTextSchema.optional(),
4918
- counter: z50.boolean().optional(),
4919
- maxlength: z50.number().positive().optional(),
4920
- clearInput: z50.boolean().optional(),
4921
- type: z50.enum(["text", "email", "password", "number", "tel", "url"]).optional(),
5526
+ counter: z51.boolean().optional(),
5527
+ maxlength: z51.number().positive().optional(),
5528
+ clearInput: z51.boolean().optional(),
5529
+ type: z51.enum(["text", "email", "password", "number", "tel", "url"]).optional(),
4922
5530
  placeholder: DynamicTextSchema.optional()
4923
5531
  });
4924
- var IonicCheckboxPropsSchema = z50.object({
4925
- labelPlacement: z50.enum(["start", "end", "fixed", "stacked"]).optional(),
5532
+ var IonicCheckboxPropsSchema = z51.object({
5533
+ labelPlacement: z51.enum(["start", "end", "fixed", "stacked"]).optional(),
4926
5534
  justify: IonicJustifySchema.optional(),
4927
- color: z50.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
4928
- indeterminate: z50.boolean().optional(),
5535
+ color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
5536
+ indeterminate: z51.boolean().optional(),
4929
5537
  hint: DynamicTextSchema.optional()
4930
5538
  });
4931
- var IonicRadioPropsSchema = z50.object({
4932
- labelPlacement: z50.enum(["start", "end", "fixed", "stacked"]).optional(),
5539
+ var IonicRadioPropsSchema = z51.object({
5540
+ labelPlacement: z51.enum(["start", "end", "fixed", "stacked"]).optional(),
4933
5541
  justify: IonicJustifySchema.optional(),
4934
- color: z50.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
5542
+ color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
4935
5543
  hint: DynamicTextSchema.optional()
4936
5544
  });
4937
- var IonicTogglePropsSchema = z50.object({
4938
- labelPlacement: z50.enum(["start", "end", "fixed", "stacked"]).optional(),
5545
+ var IonicTogglePropsSchema = z51.object({
5546
+ labelPlacement: z51.enum(["start", "end", "fixed", "stacked"]).optional(),
4939
5547
  justify: IonicJustifySchema.optional(),
4940
- color: z50.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
4941
- enableOnOffLabels: z50.boolean().optional(),
5548
+ color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
5549
+ enableOnOffLabels: z51.boolean().optional(),
4942
5550
  hint: DynamicTextSchema.optional()
4943
5551
  });
4944
- var IonicSliderPropsSchema = z50.object({
4945
- min: z50.number().optional(),
4946
- max: z50.number().optional(),
4947
- step: z50.number().positive().optional(),
4948
- dualKnobs: z50.boolean().optional(),
4949
- pin: z50.boolean().optional(),
4950
- ticks: z50.boolean().optional(),
4951
- snaps: z50.boolean().optional(),
4952
- color: z50.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
4953
- labelPlacement: z50.enum(["start", "end", "fixed", "stacked"]).optional(),
5552
+ var IonicSliderPropsSchema = z51.object({
5553
+ min: z51.number().optional(),
5554
+ max: z51.number().optional(),
5555
+ step: z51.number().positive().optional(),
5556
+ dualKnobs: z51.boolean().optional(),
5557
+ pin: z51.boolean().optional(),
5558
+ ticks: z51.boolean().optional(),
5559
+ snaps: z51.boolean().optional(),
5560
+ color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
5561
+ labelPlacement: z51.enum(["start", "end", "fixed", "stacked"]).optional(),
4954
5562
  hint: DynamicTextSchema.optional()
4955
5563
  });
4956
- var IonicDatepickerPropsSchema = z50.object({
4957
- presentation: z50.enum(["date", "date-time", "time", "time-date", "month", "month-year", "year"]).optional(),
4958
- multiple: z50.boolean().optional(),
4959
- preferWheel: z50.boolean().optional(),
4960
- showDefaultButtons: z50.boolean().optional(),
4961
- showDefaultTitle: z50.boolean().optional(),
4962
- showDefaultTimeLabel: z50.boolean().optional(),
4963
- showClearButton: z50.boolean().optional(),
4964
- doneText: z50.string().optional(),
4965
- cancelText: z50.string().optional(),
4966
- size: z50.enum(["cover", "fixed"]).optional(),
4967
- color: z50.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
5564
+ var IonicDatepickerPropsSchema = z51.object({
5565
+ presentation: z51.enum(["date", "date-time", "time", "time-date", "month", "month-year", "year"]).optional(),
5566
+ multiple: z51.boolean().optional(),
5567
+ preferWheel: z51.boolean().optional(),
5568
+ showDefaultButtons: z51.boolean().optional(),
5569
+ showDefaultTitle: z51.boolean().optional(),
5570
+ showDefaultTimeLabel: z51.boolean().optional(),
5571
+ showClearButton: z51.boolean().optional(),
5572
+ doneText: z51.string().optional(),
5573
+ cancelText: z51.string().optional(),
5574
+ size: z51.enum(["cover", "fixed"]).optional(),
5575
+ color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
4968
5576
  hint: DynamicTextSchema.optional(),
4969
5577
  placeholder: DynamicTextSchema.optional()
4970
5578
  });
4971
- var IonicSelectPropsSchema = z50.object({
4972
- multiple: z50.boolean().optional(),
4973
- interface: z50.enum(["action-sheet", "popover", "alert"]).optional(),
4974
- cancelText: z50.string().optional(),
4975
- okText: z50.string().optional(),
5579
+ var IonicSelectPropsSchema = z51.object({
5580
+ multiple: z51.boolean().optional(),
5581
+ interface: z51.enum(["action-sheet", "popover", "alert"]).optional(),
5582
+ cancelText: z51.string().optional(),
5583
+ okText: z51.string().optional(),
4976
5584
  placeholder: DynamicTextSchema.optional(),
4977
- fill: z50.enum(["solid", "outline"]).optional(),
4978
- shape: z50.literal("round").optional(),
5585
+ fill: z51.enum(["solid", "outline"]).optional(),
5586
+ shape: z51.literal("round").optional(),
4979
5587
  labelPlacement: IonicLabelPlacementSchema.optional(),
4980
- color: z50.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
5588
+ color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
4981
5589
  hint: DynamicTextSchema.optional()
4982
5590
  });
4983
- var IonicTextareaPropsSchema = z50.object({
4984
- rows: z50.number().positive().optional(),
4985
- autoGrow: z50.boolean().optional(),
4986
- maxlength: z50.number().positive().optional(),
4987
- counter: z50.boolean().optional(),
4988
- fill: z50.enum(["solid", "outline"]).optional(),
4989
- shape: z50.literal("round").optional(),
5591
+ var IonicTextareaPropsSchema = z51.object({
5592
+ rows: z51.number().positive().optional(),
5593
+ autoGrow: z51.boolean().optional(),
5594
+ maxlength: z51.number().positive().optional(),
5595
+ counter: z51.boolean().optional(),
5596
+ fill: z51.enum(["solid", "outline"]).optional(),
5597
+ shape: z51.literal("round").optional(),
4990
5598
  labelPlacement: IonicLabelPlacementSchema.optional(),
4991
5599
  hint: DynamicTextSchema.optional(),
4992
5600
  errorText: DynamicTextSchema.optional(),
4993
5601
  color: IonicColorSchema.optional(),
4994
5602
  placeholder: DynamicTextSchema.optional()
4995
5603
  });
4996
- var IonicMultiCheckboxPropsSchema = z50.object({
4997
- labelPlacement: z50.enum(["start", "end", "fixed", "stacked"]).optional(),
5604
+ var IonicMultiCheckboxPropsSchema = z51.object({
5605
+ labelPlacement: z51.enum(["start", "end", "fixed", "stacked"]).optional(),
4998
5606
  justify: IonicJustifySchema.optional(),
4999
- color: z50.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
5607
+ color: z51.enum(["primary", "secondary", "tertiary", "success", "warning", "danger"]).optional(),
5000
5608
  hint: DynamicTextSchema.optional()
5001
5609
  });
5002
- var IonicButtonPropsSchema = z50.object({
5003
- expand: z50.enum(["full", "block"]).optional(),
5610
+ var IonicButtonPropsSchema = z51.object({
5611
+ expand: z51.enum(["full", "block"]).optional(),
5004
5612
  fill: IonicFillSchema.optional(),
5005
- shape: z50.literal("round").optional(),
5006
- size: z50.enum(["small", "default", "large"]).optional(),
5613
+ shape: z51.literal("round").optional(),
5614
+ size: z51.enum(["small", "default", "large"]).optional(),
5007
5615
  color: IonicColorSchema.optional(),
5008
- strong: z50.boolean().optional(),
5009
- type: z50.enum(["button", "submit", "reset"]).optional()
5616
+ strong: z51.boolean().optional(),
5617
+ type: z51.enum(["button", "submit", "reset"]).optional()
5010
5618
  });
5011
5619
 
5012
5620
  // internal/dynamic-forms-zod/ionic/src/fields/index.ts
5013
- import { z as z51 } from "zod";
5621
+ import { z as z52 } from "zod";
5014
5622
  var IonicValueFieldBase = BaseFieldDefSchema.merge(FieldWithValidationSchema);
5015
- var IonicInputFieldSchema = IonicValueFieldBase.extend({
5016
- type: z51.literal("input"),
5017
- value: z51.string().optional(),
5623
+ var IonicInputFieldSchemaObject = IonicValueFieldBase.extend({
5624
+ type: z52.literal("input"),
5625
+ nullable: z52.boolean().optional(),
5626
+ value: z52.string().nullable().optional(),
5018
5627
  placeholder: DynamicTextSchema.optional(),
5019
5628
  props: IonicInputPropsSchema.optional()
5020
5629
  });
5630
+ var IonicInputFieldSchema = IonicInputFieldSchemaObject.superRefine(nullableValueRefine);
5021
5631
  var IonicCheckboxFieldSchema = IonicValueFieldBase.extend({
5022
- type: z51.literal("checkbox"),
5023
- value: z51.boolean().optional(),
5632
+ type: z52.literal("checkbox"),
5633
+ value: z52.boolean().optional(),
5024
5634
  placeholder: DynamicTextSchema.optional(),
5025
5635
  props: IonicCheckboxPropsSchema.optional()
5026
5636
  });
5027
- var IonicRadioFieldSchema = IonicValueFieldBase.extend({
5028
- type: z51.literal("radio"),
5029
- value: z51.unknown().optional(),
5637
+ var IonicRadioFieldSchemaObject = IonicValueFieldBase.extend({
5638
+ type: z52.literal("radio"),
5639
+ nullable: z52.boolean().optional(),
5640
+ value: z52.unknown().nullable().optional(),
5030
5641
  placeholder: DynamicTextSchema.optional(),
5031
5642
  options: FieldOptionsSchema,
5032
5643
  props: IonicRadioPropsSchema.optional()
5033
5644
  });
5645
+ var IonicRadioFieldSchema = IonicRadioFieldSchemaObject.superRefine(nullableValueRefine);
5034
5646
  var IonicToggleFieldSchema = IonicValueFieldBase.extend({
5035
- type: z51.literal("toggle"),
5036
- value: z51.boolean().optional(),
5647
+ type: z52.literal("toggle"),
5648
+ value: z52.boolean().optional(),
5037
5649
  placeholder: DynamicTextSchema.optional(),
5038
5650
  props: IonicTogglePropsSchema.optional()
5039
5651
  });
5040
- var IonicSliderFieldSchema = IonicValueFieldBase.extend({
5041
- type: z51.literal("slider"),
5042
- value: z51.number().optional(),
5043
- minValue: z51.number().optional(),
5044
- maxValue: z51.number().optional(),
5045
- step: z51.number().positive().optional(),
5652
+ var IonicSliderFieldSchemaObject = IonicValueFieldBase.extend({
5653
+ type: z52.literal("slider"),
5654
+ nullable: z52.boolean().optional(),
5655
+ value: z52.number().nullable().optional(),
5656
+ minValue: z52.number().optional(),
5657
+ maxValue: z52.number().optional(),
5658
+ step: z52.number().positive().optional(),
5046
5659
  placeholder: DynamicTextSchema.optional(),
5047
5660
  props: IonicSliderPropsSchema.optional()
5048
5661
  });
5049
- var IonicDatepickerFieldSchema = IonicValueFieldBase.extend({
5050
- type: z51.literal("datepicker"),
5051
- value: z51.union([z51.string(), z51.null()]).optional(),
5052
- minDate: z51.union([z51.string(), z51.null()]).optional(),
5053
- maxDate: z51.union([z51.string(), z51.null()]).optional(),
5054
- startAt: z51.union([z51.string(), z51.null()]).optional(),
5662
+ var IonicSliderFieldSchema = IonicSliderFieldSchemaObject.superRefine(nullableValueRefine);
5663
+ var IonicDatepickerFieldSchemaObject = IonicValueFieldBase.extend({
5664
+ type: z52.literal("datepicker"),
5665
+ nullable: z52.boolean().optional(),
5666
+ value: z52.union([z52.string(), z52.null()]).optional(),
5667
+ minDate: z52.union([z52.string(), z52.null()]).optional(),
5668
+ maxDate: z52.union([z52.string(), z52.null()]).optional(),
5669
+ startAt: z52.union([z52.string(), z52.null()]).optional(),
5055
5670
  placeholder: DynamicTextSchema.optional(),
5056
5671
  props: IonicDatepickerPropsSchema.optional()
5057
5672
  });
5058
- var IonicSelectFieldSchema = IonicValueFieldBase.extend({
5059
- type: z51.literal("select"),
5060
- value: z51.unknown().optional(),
5673
+ var IonicDatepickerFieldSchema = IonicDatepickerFieldSchemaObject.superRefine(nullableValueRefine);
5674
+ var IonicSelectFieldSchemaObject = IonicValueFieldBase.extend({
5675
+ type: z52.literal("select"),
5676
+ nullable: z52.boolean().optional(),
5677
+ value: z52.unknown().nullable().optional(),
5061
5678
  placeholder: DynamicTextSchema.optional(),
5062
5679
  options: FieldOptionsSchema,
5063
5680
  props: IonicSelectPropsSchema.optional()
5064
5681
  });
5065
- var IonicTextareaFieldSchema = IonicValueFieldBase.extend({
5066
- type: z51.literal("textarea"),
5067
- value: z51.string().optional(),
5682
+ var IonicSelectFieldSchema = IonicSelectFieldSchemaObject.superRefine(nullableValueRefine);
5683
+ var IonicTextareaFieldSchemaObject = IonicValueFieldBase.extend({
5684
+ type: z52.literal("textarea"),
5685
+ nullable: z52.boolean().optional(),
5686
+ value: z52.string().nullable().optional(),
5068
5687
  placeholder: DynamicTextSchema.optional(),
5069
5688
  props: IonicTextareaPropsSchema.optional()
5070
5689
  });
5071
- var IonicMultiCheckboxFieldSchema = IonicValueFieldBase.extend({
5072
- type: z51.literal("multi-checkbox"),
5073
- value: z51.array(z51.unknown()).optional(),
5690
+ var IonicTextareaFieldSchema = IonicTextareaFieldSchemaObject.superRefine(nullableValueRefine);
5691
+ var IonicMultiCheckboxFieldSchemaObject = IonicValueFieldBase.extend({
5692
+ type: z52.literal("multi-checkbox"),
5693
+ nullable: z52.boolean().optional(),
5694
+ value: z52.array(z52.unknown()).nullable().optional(),
5074
5695
  placeholder: DynamicTextSchema.optional(),
5075
5696
  options: FieldOptionsSchema,
5076
5697
  props: IonicMultiCheckboxPropsSchema.optional()
5077
5698
  });
5699
+ var IonicMultiCheckboxFieldSchema = IonicMultiCheckboxFieldSchemaObject.superRefine(nullableValueRefine);
5078
5700
  var IonicButtonFieldSchema = BaseFieldDefSchema.extend({
5079
- type: z51.literal("button"),
5080
- event: z51.string().optional(),
5081
- eventArgs: z51.array(z51.union([z51.string(), z51.number(), z51.boolean(), z51.null(), z51.undefined()])).optional(),
5701
+ type: z52.literal("button"),
5702
+ event: z52.string().optional(),
5703
+ eventArgs: z52.array(z52.union([z52.string(), z52.number(), z52.boolean(), z52.null(), z52.undefined()])).optional(),
5082
5704
  props: IonicButtonPropsSchema.optional(),
5083
5705
  logic: LogicArraySchema.optional()
5084
5706
  });
5085
5707
  var IonicSubmitButtonFieldSchema = BaseFieldDefSchema.extend({
5086
- type: z51.literal("submit"),
5708
+ type: z52.literal("submit"),
5087
5709
  props: IonicButtonPropsSchema.optional(),
5088
5710
  logic: LogicArraySchema.optional()
5089
5711
  });
5090
5712
  var IonicNextButtonFieldSchema = BaseFieldDefSchema.extend({
5091
- type: z51.literal("next"),
5713
+ type: z52.literal("next"),
5092
5714
  props: IonicButtonPropsSchema.optional(),
5093
5715
  logic: LogicArraySchema.optional()
5094
5716
  });
5095
5717
  var IonicPreviousButtonFieldSchema = BaseFieldDefSchema.extend({
5096
- type: z51.literal("previous"),
5718
+ type: z52.literal("previous"),
5097
5719
  props: IonicButtonPropsSchema.optional()
5098
5720
  });
5099
5721
  var IonicAddArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
5100
- type: z51.literal("addArrayItem"),
5101
- arrayKey: z51.string().optional(),
5722
+ type: z52.literal("addArrayItem"),
5723
+ arrayKey: z52.string().optional(),
5102
5724
  props: IonicButtonPropsSchema.optional()
5103
5725
  });
5104
5726
  var IonicRemoveArrayItemButtonFieldSchema = BaseFieldDefSchema.extend({
5105
- type: z51.literal("removeArrayItem"),
5106
- arrayKey: z51.string().optional(),
5727
+ type: z52.literal("removeArrayItem"),
5728
+ arrayKey: z52.string().optional(),
5107
5729
  props: IonicButtonPropsSchema.optional()
5108
5730
  });
5109
5731
 
5110
5732
  // internal/dynamic-forms-zod/ionic/src/ionic-leaf-field.schema.ts
5111
- import { z as z52 } from "zod";
5112
- var IonicLeafFieldSchema = z52.discriminatedUnion("type", [
5733
+ import { z as z53 } from "zod";
5734
+ var IonicLeafFieldSchema = z53.discriminatedUnion("type", [
5113
5735
  TextFieldSchema,
5114
5736
  HiddenFieldSchema,
5115
- IonicInputFieldSchema,
5737
+ IonicInputFieldSchemaObject,
5116
5738
  IonicCheckboxFieldSchema,
5117
- IonicRadioFieldSchema,
5739
+ IonicRadioFieldSchemaObject,
5118
5740
  IonicToggleFieldSchema,
5119
- IonicSliderFieldSchema,
5120
- IonicDatepickerFieldSchema,
5121
- IonicSelectFieldSchema,
5122
- IonicTextareaFieldSchema,
5123
- IonicMultiCheckboxFieldSchema,
5741
+ IonicSliderFieldSchemaObject,
5742
+ IonicDatepickerFieldSchemaObject,
5743
+ IonicSelectFieldSchemaObject,
5744
+ IonicTextareaFieldSchemaObject,
5745
+ IonicMultiCheckboxFieldSchemaObject,
5124
5746
  IonicButtonFieldSchema,
5125
5747
  IonicSubmitButtonFieldSchema,
5126
5748
  IonicNextButtonFieldSchema,
5127
5749
  IonicPreviousButtonFieldSchema,
5128
5750
  IonicAddArrayItemButtonFieldSchema,
5129
5751
  IonicRemoveArrayItemButtonFieldSchema
5130
- ]);
5752
+ ]).superRefine(nullableValueRefine);
5131
5753
 
5132
5754
  // internal/dynamic-forms-zod/ionic/src/ionic-form-config.schema.ts
5133
- import { z as z53 } from "zod";
5755
+ import { z as z54 } from "zod";
5134
5756
  var containerSchemas4 = createContainerSchemas({
5135
5757
  leafFieldSchema: IonicLeafFieldSchema
5136
5758
  });
@@ -5139,7 +5761,7 @@ var IonicRowFieldSchema = containerSchemas4.RowFieldSchema;
5139
5761
  var IonicGroupFieldSchema = containerSchemas4.GroupFieldSchema;
5140
5762
  var IonicArrayFieldSchema = containerSchemas4.ArrayFieldSchema;
5141
5763
  var IonicFieldSchema = containerSchemas4.AllFieldsSchema;
5142
- var IonicFormDefaultPropsSchema = z53.object({
5764
+ var IonicFormDefaultPropsSchema = z54.object({
5143
5765
  color: IonicColorSchema.optional(),
5144
5766
  labelPlacement: IonicLabelPlacementSchema.optional()
5145
5767
  });
@@ -5870,6 +6492,110 @@ ${fieldTypes.map((ft) => `- ${ft}`).join("\n")}
5870
6492
  });
5871
6493
  }
5872
6494
 
6495
+ // packages/dynamic-form-mcp/src/resources/wrappers.resource.ts
6496
+ function registerWrappersResource(server) {
6497
+ server.resource("ng-forge Wrappers", "ng-forge://wrappers", async () => {
6498
+ const wrappers = getWrappers();
6499
+ return {
6500
+ contents: [
6501
+ {
6502
+ uri: "ng-forge://wrappers",
6503
+ mimeType: "application/json",
6504
+ text: JSON.stringify(
6505
+ {
6506
+ description: 'Available ng-forge field wrappers. Wrappers decorate the rendered output of a field or container without changing form data. Compose via `wrappers: [{ type: "...", ...props }]`.',
6507
+ categories: {
6508
+ core: "Ships from @ng-forge/dynamic-forms \u2014 always importable.",
6509
+ demo: "Ships from @internal/examples-shared-ui for the docs sandbox \u2014 NOT a library primitive.",
6510
+ adapter: "Ships from a UI adapter library (reserved)."
6511
+ },
6512
+ authoringContract: WRAPPER_AUTHORING_CONTRACT,
6513
+ wrappers: wrappers.map((w) => ({
6514
+ type: w.type,
6515
+ category: w.category,
6516
+ availability: w.availability,
6517
+ package: w.package,
6518
+ description: w.description,
6519
+ autoAppliesTo: w.autoAppliesTo
6520
+ }))
6521
+ },
6522
+ null,
6523
+ 2
6524
+ )
6525
+ }
6526
+ ]
6527
+ };
6528
+ });
6529
+ server.resource("Wrapper Details", "ng-forge://wrappers/{type}", async (uri) => {
6530
+ const match = uri.href.match(/ng-forge:\/\/wrappers\/(.+)/);
6531
+ const typeName = match?.[1];
6532
+ if (!typeName) {
6533
+ return {
6534
+ contents: [
6535
+ {
6536
+ uri: uri.href,
6537
+ mimeType: "text/plain",
6538
+ text: "Wrapper type not specified in URI"
6539
+ }
6540
+ ]
6541
+ };
6542
+ }
6543
+ const wrapper = getWrapper(typeName);
6544
+ if (!wrapper) {
6545
+ return {
6546
+ contents: [
6547
+ {
6548
+ uri: uri.href,
6549
+ mimeType: "text/plain",
6550
+ text: `Wrapper type '${typeName}' not found. Available types: ${getWrappers().map((w) => w.type).join(", ")}`
6551
+ }
6552
+ ]
6553
+ };
6554
+ }
6555
+ return {
6556
+ contents: [
6557
+ {
6558
+ uri: uri.href,
6559
+ mimeType: "application/json",
6560
+ text: JSON.stringify(wrapper, null, 2)
6561
+ }
6562
+ ]
6563
+ };
6564
+ });
6565
+ server.resource("Wrappers by Category", "ng-forge://wrappers/category/{category}", async (uri) => {
6566
+ const match = uri.href.match(/ng-forge:\/\/wrappers\/category\/(.+)/);
6567
+ const category = match?.[1];
6568
+ if (!category || !["core", "demo", "adapter"].includes(category)) {
6569
+ return {
6570
+ contents: [
6571
+ {
6572
+ uri: uri.href,
6573
+ mimeType: "text/plain",
6574
+ text: "Valid categories: core, demo, adapter"
6575
+ }
6576
+ ]
6577
+ };
6578
+ }
6579
+ const wrappers = getWrappersByCategory(category);
6580
+ return {
6581
+ contents: [
6582
+ {
6583
+ uri: uri.href,
6584
+ mimeType: "application/json",
6585
+ text: JSON.stringify(
6586
+ {
6587
+ category,
6588
+ wrappers
6589
+ },
6590
+ null,
6591
+ 2
6592
+ )
6593
+ }
6594
+ ]
6595
+ };
6596
+ });
6597
+ }
6598
+
5873
6599
  // packages/dynamic-form-mcp/src/resources/index.ts
5874
6600
  function registerResources(server) {
5875
6601
  registerInstructionsResource(server);
@@ -5877,22 +6603,24 @@ function registerResources(server) {
5877
6603
  registerFieldTypesResource(server);
5878
6604
  registerValidatorsResource(server);
5879
6605
  registerUIAdaptersResource(server);
6606
+ registerWrappersResource(server);
5880
6607
  registerDocumentationResource(server);
5881
6608
  registerSchemasResource(server);
5882
6609
  }
5883
6610
 
5884
6611
  // packages/dynamic-form-mcp/src/tools/lookup.tool.ts
5885
- import { z as z54 } from "zod";
6612
+ import { z as z55 } from "zod";
5886
6613
 
5887
6614
  // packages/dynamic-form-mcp/src/tools/data/lookup-topics.ts
5888
6615
  var TOPICS = {
5889
6616
  // ========== FIELD TYPES ==========
5890
6617
  input: {
5891
6618
  brief: `\`\`\`typescript
5892
- { key: 'email', type: 'input', label: 'Email', required: true, email: true, props: { type: 'email', placeholder: 'you@example.com' } }
6619
+ { key: 'email', type: 'input', label: 'Email', required: true, email: true, placeholder: 'you@example.com', props: { type: 'email' } }
5893
6620
  \`\`\`
5894
6621
  **Shorthand:** required, email, min, max, minLength, maxLength, pattern
5895
- **Props:** type (text|email|password|number|tel|url), placeholder, appearance (Material)`,
6622
+ **Field-level:** placeholder
6623
+ **Props:** type (text|email|password|number|tel|url), appearance (Material)`,
5896
6624
  full: `# Input Field
5897
6625
 
5898
6626
  \`\`\`typescript
@@ -5902,9 +6630,9 @@ var TOPICS = {
5902
6630
  label: 'Email',
5903
6631
  required: true,
5904
6632
  email: true,
6633
+ placeholder: 'you@example.com',
5905
6634
  props: {
5906
6635
  type: 'email', // 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'
5907
- placeholder: 'you@example.com',
5908
6636
  appearance: 'outline' // Material: 'outline' | 'fill'
5909
6637
  }
5910
6638
  }
@@ -5912,7 +6640,8 @@ var TOPICS = {
5912
6640
 
5913
6641
  **Validation shorthand:** \`required\`, \`email\`, \`min\`, \`max\`, \`minLength\`, \`maxLength\`, \`pattern\`
5914
6642
 
5915
- **Props:** \`type\`, \`placeholder\`, \`appearance\` (Material), \`hint\` (Material)
6643
+ **Field-level:** \`placeholder\`
6644
+ **Props:** \`type\`, \`appearance\` (Material), \`hint\` (Material)
5916
6645
 
5917
6646
  **Value Type:** \`string | number\`
5918
6647
 
@@ -5920,7 +6649,7 @@ var TOPICS = {
5920
6649
  },
5921
6650
  select: {
5922
6651
  brief: `\`\`\`typescript
5923
- { key: 'country', type: 'select', label: 'Country', options: [{ label: 'USA', value: 'us' }], props: { placeholder: 'Choose...' } }
6652
+ { key: 'country', type: 'select', label: 'Country', placeholder: 'Choose...', options: [{ label: 'USA', value: 'us' }] }
5924
6653
  \`\`\`
5925
6654
  \u26A0\uFE0F **options at FIELD level, NOT in props!**`,
5926
6655
  full: `# Select Field
@@ -5935,8 +6664,8 @@ var TOPICS = {
5935
6664
  { label: 'USA', value: 'us' },
5936
6665
  { label: 'Canada', value: 'ca' }
5937
6666
  ],
6667
+ placeholder: 'Choose...',
5938
6668
  props: {
5939
- placeholder: 'Choose...',
5940
6669
  multiple: false // Allow multiple selection
5941
6670
  }
5942
6671
  }
@@ -6029,7 +6758,7 @@ For multiple selections, use **multi-checkbox** type.`,
6029
6758
  },
6030
6759
  textarea: {
6031
6760
  brief: `\`\`\`typescript
6032
- { key: 'bio', type: 'textarea', label: 'Bio', maxLength: 500, props: { rows: 4, placeholder: 'Tell us about yourself...' } }
6761
+ { key: 'bio', type: 'textarea', label: 'Bio', maxLength: 500, placeholder: 'Tell us about yourself...', props: { rows: 4 } }
6033
6762
  \`\`\``,
6034
6763
  full: `# Textarea Field
6035
6764
 
@@ -6039,9 +6768,9 @@ For multiple selections, use **multi-checkbox** type.`,
6039
6768
  type: 'textarea',
6040
6769
  label: 'Biography',
6041
6770
  maxLength: 500,
6771
+ placeholder: 'Tell us about yourself...',
6042
6772
  props: {
6043
6773
  rows: 4,
6044
- placeholder: 'Tell us about yourself...'
6045
6774
  }
6046
6775
  }
6047
6776
  \`\`\`
@@ -8304,7 +9033,13 @@ var TOPIC_DESCRIPTIONS = {
8304
9033
  conditions: "Condition operators and types for logic rules",
8305
9034
  "common-expressions": "Frequently used derivation expressions (age, math, concatenation)",
8306
9035
  "type-narrowing": "TypeScript type safety with as const satisfies FormConfig",
8307
- workflow: "Recommended tool usage guide \u2014 start here"
9036
+ workflow: "Recommended tool usage guide \u2014 start here",
9037
+ // Wrappers
9038
+ wrappers: "Overview of the wrapper chain: how to apply, compose, and author wrappers",
9039
+ wrapper: "Overview of the wrapper chain (alias of `wrappers`)",
9040
+ css: "Built-in CSS wrapper \u2014 applies DynamicText class names to the host element",
9041
+ arraySection: "Demo wrapper \u2014 array card whose header owns the Add button (examples-shared-ui)",
9042
+ section: "Demo wrapper \u2014 titled card around any field or container (examples-shared-ui)"
8308
9043
  };
8309
9044
  var TOPIC_ALIASES = {
8310
9045
  // Field type aliases
@@ -8431,7 +9166,21 @@ var TOPIC_ALIASES = {
8431
9166
  // Workflow aliases
8432
9167
  "how-to": "workflow",
8433
9168
  guide: "workflow",
8434
- "getting-started": "workflow"
9169
+ "getting-started": "workflow",
9170
+ // Wrapper aliases
9171
+ wrapper: "wrappers",
9172
+ "field-wrapper": "wrappers",
9173
+ "field-wrappers": "wrappers",
9174
+ decorator: "wrappers",
9175
+ decorators: "wrappers",
9176
+ "wrapper-chain": "wrappers",
9177
+ "css-wrapper": "css",
9178
+ csswrapper: "css",
9179
+ cssclasses: "css",
9180
+ "array-section": "arraySection",
9181
+ arraysection: "arraySection",
9182
+ "section-wrapper": "section",
9183
+ sectionwrapper: "section"
8435
9184
  };
8436
9185
 
8437
9186
  // packages/dynamic-form-mcp/src/services/topic-mapper.ts
@@ -8528,6 +9277,7 @@ function formatTopicItem(key) {
8528
9277
  function getTopicList() {
8529
9278
  const fieldTypes = ["input", "select", "slider", "radio", "checkbox", "textarea", "datepicker", "toggle", "text", "hidden"];
8530
9279
  const containers = ["group", "row", "array", "simplified-array", "page"];
9280
+ const wrappers = ["wrappers", ...getWrappers().map((w) => w.type)];
8531
9281
  const concepts = [
8532
9282
  "validation",
8533
9283
  "validation-messages",
@@ -8563,6 +9313,9 @@ ${fieldTypes.map(formatTopicItem).join("\n")}
8563
9313
  ## Containers
8564
9314
  ${containers.map(formatTopicItem).join("\n")}
8565
9315
 
9316
+ ## Wrappers
9317
+ ${wrappers.map(formatTopicItem).join("\n")}
9318
+
8566
9319
  ## Concepts
8567
9320
  ${concepts.map(formatTopicItem).join("\n")}
8568
9321
 
@@ -8629,7 +9382,144 @@ function formatFieldInfoFull(field, uiFieldType) {
8629
9382
  lines.push("```");
8630
9383
  return lines.join("\n");
8631
9384
  }
9385
+ function formatWrapperInfo(wrapper) {
9386
+ const lines = [];
9387
+ lines.push(`# ${wrapper.type} wrapper`);
9388
+ lines.push("");
9389
+ lines.push(`**Category:** ${wrapper.category}`);
9390
+ lines.push(`**Availability:** ${wrapper.availability}`);
9391
+ lines.push(`**Package:** \`${wrapper.package}\``);
9392
+ lines.push(`**Component:** \`${wrapper.componentName}\``);
9393
+ lines.push(`**Description:** ${wrapper.description}`);
9394
+ if (wrapper.availability === "demo-only") {
9395
+ lines.push("");
9396
+ lines.push(
9397
+ "> **Note:** This is a demo wrapper that ships with the docs sandbox, not a library primitive. Use it as a pattern/template and author your own wrapper (or copy the component out of `internal/examples-shared-ui/src/lib/demo-wrappers/`) when adopting the idea in production."
9398
+ );
9399
+ }
9400
+ if (wrapper.autoAppliesTo.length > 0) {
9401
+ lines.push("");
9402
+ lines.push(`**Auto-applies to:** ${wrapper.autoAppliesTo.join(", ")}`);
9403
+ lines.push(
9404
+ "_(Injected automatically into these field types. Can be overridden via `FormConfig.defaultWrappers` or per-field `wrappers: [...]`; clear entirely with `wrappers: null`.)_"
9405
+ );
9406
+ } else {
9407
+ lines.push("");
9408
+ lines.push("**Auto-applies to:** _(none \u2014 opt-in via the field's `wrappers` array)_");
9409
+ }
9410
+ if (Object.keys(wrapper.props).length > 0) {
9411
+ lines.push("");
9412
+ lines.push("### Config Props");
9413
+ for (const prop of Object.values(wrapper.props)) {
9414
+ const req = prop.required ? " **(required)**" : "";
9415
+ const def = prop.default !== void 0 ? ` (default: ${JSON.stringify(prop.default)})` : "";
9416
+ lines.push(`- \`${prop.name}\`: ${prop.type}${req}${def} \u2014 ${prop.description}`);
9417
+ }
9418
+ } else {
9419
+ lines.push("");
9420
+ lines.push("### Config Props");
9421
+ lines.push("_(none \u2014 no configurable inputs on this wrapper)_");
9422
+ }
9423
+ if (wrapper.minimalExample) {
9424
+ lines.push("");
9425
+ lines.push("### Minimal Config");
9426
+ lines.push("```typescript");
9427
+ lines.push(wrapper.minimalExample);
9428
+ lines.push("```");
9429
+ }
9430
+ lines.push("");
9431
+ lines.push("### Full Example");
9432
+ lines.push("```typescript");
9433
+ lines.push(wrapper.example);
9434
+ lines.push("```");
9435
+ lines.push("");
9436
+ lines.push("### Authoring Contract");
9437
+ lines.push(wrapper.contract);
9438
+ return lines.join("\n");
9439
+ }
9440
+ function formatWrappersOverview() {
9441
+ const wrappers = getWrappers();
9442
+ const lines = [];
9443
+ lines.push("# Wrappers");
9444
+ lines.push("");
9445
+ lines.push(
9446
+ "Wrappers decorate the rendered output of a field (or container) without changing the form data structure. They are composed as a chain: each wrapper exposes a `#fieldComponent` `ViewContainerRef` slot where the next wrapper \u2014 or the field itself \u2014 is rendered."
9447
+ );
9448
+ lines.push("");
9449
+ lines.push("## Applying a wrapper");
9450
+ lines.push("");
9451
+ lines.push("```typescript");
9452
+ lines.push(`// Per-field wrapper chain (outer-most first)
9453
+ {
9454
+ key: 'email',
9455
+ type: 'input',
9456
+ label: 'Email',
9457
+ wrappers: [
9458
+ { type: 'section', title: 'Account' }, // outer
9459
+ { type: 'css', cssClasses: 'pad-lg' } // inner
9460
+ ]
9461
+ }
9462
+
9463
+ // Form-level defaults applied to every field
9464
+ const config = {
9465
+ defaultWrappers: [{ type: 'css', cssClasses: 'field-default' }],
9466
+ fields: [...]
9467
+ } as const satisfies FormConfig;
9468
+
9469
+ // Clear all wrappers on a specific field (overrides defaults + auto)
9470
+ { key: 'id', type: 'hidden', value: 'abc', wrappers: null }`);
9471
+ lines.push("```");
9472
+ lines.push("");
9473
+ lines.push("## Registered Wrappers");
9474
+ lines.push("");
9475
+ for (const w of wrappers) {
9476
+ const flag = w.availability === "demo-only" ? " _(demo-only)_" : "";
9477
+ lines.push(`- **${w.type}** (${w.category}, \`${w.package}\`)${flag} \u2014 ${w.description.split(".")[0]}.`);
9478
+ }
9479
+ lines.push("");
9480
+ lines.push('Use `ngforge_lookup topic="<name>"` for full details on any individual wrapper.');
9481
+ lines.push("");
9482
+ lines.push("## Authoring Contract");
9483
+ lines.push("");
9484
+ lines.push(wrappers[0]?.contract ?? "");
9485
+ return lines.join("\n");
9486
+ }
8632
9487
  async function resolveTopicContent(resolvedTopic, depth, uiIntegration) {
9488
+ if (resolvedTopic === "wrappers" || resolvedTopic === "wrapper") {
9489
+ if (depth === "brief") {
9490
+ const wrappers = getWrappers();
9491
+ return [
9492
+ "**Wrappers** decorate a field's rendered output without changing form data.",
9493
+ "",
9494
+ "Registered:",
9495
+ ...wrappers.map((w) => `- \`${w.type}\` (${w.category}${w.availability === "demo-only" ? ", demo-only" : ""})`),
9496
+ "",
9497
+ 'Use `wrappers: [{ type: "css", cssClasses: "..." }]` on any field. See `ngforge_lookup topic="wrappers"` for the full overview.'
9498
+ ].join("\n");
9499
+ }
9500
+ return formatWrappersOverview();
9501
+ }
9502
+ const wrapperInfo = getWrapper(resolvedTopic);
9503
+ if (wrapperInfo) {
9504
+ const formatted = formatWrapperInfo(wrapperInfo);
9505
+ if (depth === "brief") {
9506
+ const lines = [
9507
+ `# ${wrapperInfo.type} wrapper`,
9508
+ "",
9509
+ `${wrapperInfo.description.split(".")[0]}.`,
9510
+ "",
9511
+ "```typescript",
9512
+ wrapperInfo.minimalExample ?? `{ type: '${wrapperInfo.type}' }`,
9513
+ "```"
9514
+ ];
9515
+ if (wrapperInfo.availability === "demo-only") {
9516
+ lines.push("");
9517
+ lines.push(`**Demo-only** \u2014 ships from \`${wrapperInfo.package}\`, not \`@ng-forge/dynamic-forms\`.`);
9518
+ }
9519
+ return lines.join("\n");
9520
+ }
9521
+ return formatted;
9522
+ }
8633
9523
  if (depth === "brief") {
8634
9524
  const topicContent2 = TOPICS[resolvedTopic];
8635
9525
  if (topicContent2) {
@@ -8717,7 +9607,12 @@ var NEXT_STEPS = {
8717
9607
  "logic-matrix": '**Next:** `ngforge_lookup topic="conditional"` for condition syntax \xB7 `ngforge_lookup topic="derivation"` for derivation syntax',
8718
9608
  "field-placement": '**Next:** `ngforge_lookup topic="containers"` for container overview',
8719
9609
  conditions: '**Next:** `ngforge_lookup topic="conditional"` for full conditional logic docs \xB7 `ngforge_examples pattern="minimal-conditional"` for working example',
8720
- workflow: '**Next:** `ngforge_lookup topic="golden-path"` for form structure templates \xB7 `ngforge_examples pattern="complete"` for a full working example'
9610
+ workflow: '**Next:** `ngforge_lookup topic="golden-path"` for form structure templates \xB7 `ngforge_examples pattern="complete"` for a full working example',
9611
+ // Wrappers
9612
+ wrappers: '**Next:** `ngforge_lookup topic="css"` for the shipping CSS wrapper \xB7 `ngforge_lookup topic="section"` or `ngforge_lookup topic="arraySection"` for demo wrappers \xB7 `ngforge_examples pattern="wrapper-array-actions"` for a working array-section example',
9613
+ css: '**Next:** `ngforge_lookup topic="wrappers"` for the full wrapper overview \xB7 `ngforge_lookup topic="field-placement"` for where wrappers can apply',
9614
+ arraySection: '**Next:** `ngforge_lookup topic="wrappers"` for the wrapper overview \xB7 `ngforge_lookup topic="array"` for array field docs \xB7 `ngforge_lookup topic="array-buttons"` for the button-field alternative',
9615
+ section: '**Next:** `ngforge_lookup topic="wrappers"` for the wrapper overview \xB7 `ngforge_lookup topic="css"` for the shipping CSS wrapper'
8721
9616
  };
8722
9617
  function getNextSteps(topic) {
8723
9618
  return NEXT_STEPS[topic];
@@ -8738,6 +9633,8 @@ Field types: input, select, slider, radio, checkbox, textarea, datepicker, toggl
8738
9633
 
8739
9634
  Containers: group, row, array, simplified-array, page
8740
9635
 
9636
+ Wrappers: wrappers (overview), css (shipping), section, arraySection (demo-only)
9637
+
8741
9638
  Concepts: validation, conditional, derivation, property-derivation, options-format, expression-variables, async-validators
8742
9639
 
8743
9640
  Patterns: field-placement, logic-matrix, context-api, containers, multi-page-gotchas
@@ -8745,11 +9642,11 @@ Patterns: field-placement, logic-matrix, context-api, containers, multi-page-got
8745
9642
  Use topic="list" to see all available topics with descriptions.
8746
9643
  Use ngforge_search query="your question" to find topics by keyword.`,
8747
9644
  {
8748
- topic: z54.string().describe(
8749
- 'Topic to look up: field types (input, select, hidden, group, row, array, page), concepts (validation, conditional, derivation, property-derivation, options-format), patterns (golden-path, pitfalls, multi-page-gotchas), or "list" to see all topics'
9645
+ topic: z55.string().describe(
9646
+ 'Topic to look up: field types (input, select, hidden, group, row, array, page), wrappers (wrappers, css, section, arraySection), concepts (validation, conditional, derivation, property-derivation, options-format), patterns (golden-path, pitfalls, multi-page-gotchas), or "list" to see all topics'
8750
9647
  ),
8751
- depth: z54.enum(["brief", "full", "schema"]).default("full").describe("brief=quick syntax (~20 lines), full=complete docs with examples, schema=include JSON schema"),
8752
- uiIntegration: z54.enum(UI_INTEGRATIONS2).optional().describe("Filter UI-specific info (only with depth=schema). material, bootstrap, primeng, ionic")
9648
+ depth: z55.enum(["brief", "full", "schema"]).default("full").describe("brief=quick syntax (~20 lines), full=complete docs with examples, schema=include JSON schema"),
9649
+ uiIntegration: z55.enum(UI_INTEGRATIONS2).optional().describe("Filter UI-specific info (only with depth=schema). material, bootstrap, primeng, ionic")
8753
9650
  },
8754
9651
  async ({ topic, depth, uiIntegration }) => {
8755
9652
  const normalizedTopic = topic.toLowerCase().trim();
@@ -8797,7 +9694,7 @@ ${nextSteps}`;
8797
9694
  }
8798
9695
 
8799
9696
  // packages/dynamic-form-mcp/src/tools/examples.tool.ts
8800
- import { z as z55 } from "zod";
9697
+ import { z as z56 } from "zod";
8801
9698
  var PATTERNS = {
8802
9699
  // ========== MINIMAL PATTERNS (NEW) ==========
8803
9700
  "minimal-multipage": {
@@ -10780,7 +11677,7 @@ const megaFormConfig = {
10780
11677
  { key: 'pageHeader', type: 'text', label: 'All Field Types Demo', props: { elementType: 'h1' } },
10781
11678
 
10782
11679
  // TEXT INPUTS
10783
- { key: 'textInput', type: 'input', label: 'Text Input', props: { placeholder: 'Type here' } },
11680
+ { key: 'textInput', type: 'input', label: 'Text Input', placeholder: 'Type here' },
10784
11681
  { key: 'emailInput', type: 'input', label: 'Email', email: true, props: { type: 'email' } },
10785
11682
  { key: 'passwordInput', type: 'input', label: 'Password', minLength: 8, props: { type: 'password' } },
10786
11683
  { key: 'numberInput', type: 'input', label: 'Number', min: 0, max: 100, props: { type: 'number' } },
@@ -11023,10 +11920,10 @@ Standard patterns: derivation, property-derivation, multi-page, conditional, val
11023
11920
  Use pattern="list" to see all available patterns.
11024
11921
  Use depth="minimal" for code-only output (no markdown).`,
11025
11922
  {
11026
- pattern: z55.string().optional().describe(
11923
+ pattern: z56.string().optional().describe(
11027
11924
  'Pattern to get: minimal-multipage, minimal-array, minimal-simplified-array, minimal-conditional, minimal-validation, minimal-hidden, derivation, property-derivation, multi-page, conditional, validation, complete, mega. Use "list" to see all.'
11028
11925
  ),
11029
- depth: z55.enum(["minimal", "brief", "full", "explained"]).default("full").describe(
11926
+ depth: z56.enum(["minimal", "brief", "full", "explained"]).default("full").describe(
11030
11927
  "minimal=code only (~20-50 lines), brief=code+summary, full=code+comments (default), explained=code+detailed explanation"
11031
11928
  )
11032
11929
  },
@@ -11103,7 +12000,7 @@ function extractCode(markdown) {
11103
12000
  }
11104
12001
 
11105
12002
  // packages/dynamic-form-mcp/src/tools/validate.tool.ts
11106
- import { z as z56 } from "zod";
12003
+ import { z as z57 } from "zod";
11107
12004
  import { readFile } from "fs/promises";
11108
12005
 
11109
12006
  // packages/dynamic-form-mcp/src/utils/ast-extractor.ts
@@ -11717,10 +12614,10 @@ Example errors you'll see:
11717
12614
  - "options MUST be at FIELD level, NOT inside props"
11718
12615
  - "containers only support 'hidden' logic type"`,
11719
12616
  {
11720
- config: z56.union([z56.string(), z56.object({}).passthrough()]).describe(
12617
+ config: z57.union([z57.string(), z57.object({}).passthrough()]).describe(
11721
12618
  "File path (.ts/.js) OR JSON string OR JSON object. Auto-detects: paths ending in .ts/.js or starting with / are treated as files."
11722
12619
  ),
11723
- uiIntegration: z56.enum(UI_INTEGRATIONS3).default("material").describe("UI library to validate against (material, bootstrap, primeng, ionic). Defaults to material.")
12620
+ uiIntegration: z57.enum(UI_INTEGRATIONS3).default("material").describe("UI library to validate against (material, bootstrap, primeng, ionic). Defaults to material.")
11724
12621
  },
11725
12622
  async ({ config, uiIntegration }) => {
11726
12623
  try {
@@ -11826,7 +12723,7 @@ If validating JSON, ensure:
11826
12723
  }
11827
12724
 
11828
12725
  // packages/dynamic-form-mcp/src/tools/scaffold.tool.ts
11829
- import { z as z57 } from "zod";
12726
+ import { z as z58 } from "zod";
11830
12727
  var UI_INTEGRATIONS4 = ["material", "bootstrap", "primeng", "ionic"];
11831
12728
  function parseFieldDefs(fields) {
11832
12729
  return fields.map((f) => {
@@ -12081,12 +12978,12 @@ Examples:
12081
12978
  - With groups: pages=0 groups=["address","billing"]
12082
12979
  - With hidden: hidden=["userId:abc123","source:web"]`,
12083
12980
  {
12084
- pages: z57.number().min(0).max(10).default(0).describe("Number of pages (0 = single-page form, 1-10 = multi-page wizard)"),
12085
- arrays: z57.array(z57.string()).optional().describe('Array field names for dynamic lists, e.g., ["contacts", "addresses"]'),
12086
- groups: z57.array(z57.string()).optional().describe('Group field names for nested objects, e.g., ["address", "billing"]'),
12087
- hidden: z57.array(z57.string()).optional().describe('Hidden fields as "name:value" pairs, e.g., ["userId:abc", "version:1"]'),
12088
- fields: z57.array(z57.string()).optional().describe('Basic fields as "name:type" pairs, e.g., ["email:input", "country:select", "age:slider"]'),
12089
- uiIntegration: z57.enum(UI_INTEGRATIONS4).default("material").describe("UI library (for future UI-specific props). Defaults to material.")
12981
+ pages: z58.number().min(0).max(10).default(0).describe("Number of pages (0 = single-page form, 1-10 = multi-page wizard)"),
12982
+ arrays: z58.array(z58.string()).optional().describe('Array field names for dynamic lists, e.g., ["contacts", "addresses"]'),
12983
+ groups: z58.array(z58.string()).optional().describe('Group field names for nested objects, e.g., ["address", "billing"]'),
12984
+ hidden: z58.array(z58.string()).optional().describe('Hidden fields as "name:value" pairs, e.g., ["userId:abc", "version:1"]'),
12985
+ fields: z58.array(z58.string()).optional().describe('Basic fields as "name:type" pairs, e.g., ["email:input", "country:select", "age:slider"]'),
12986
+ uiIntegration: z58.enum(UI_INTEGRATIONS4).default("material").describe("UI library (for future UI-specific props). Defaults to material.")
12090
12987
  },
12091
12988
  async ({ pages, arrays = [], groups = [], hidden = [], fields = [] }) => {
12092
12989
  const fieldDefs = parseFieldDefs(fields);
@@ -12128,7 +13025,7 @@ Examples:
12128
13025
  }
12129
13026
 
12130
13027
  // packages/dynamic-form-mcp/src/tools/search.tool.ts
12131
- import { z as z58 } from "zod";
13028
+ import { z as z59 } from "zod";
12132
13029
  var searchIndex = null;
12133
13030
  function getTopicSubcategory(key) {
12134
13031
  const fieldTypes = ["input", "select", "slider", "radio", "checkbox", "textarea", "datepicker", "toggle", "text", "hidden"];
@@ -12183,6 +13080,18 @@ function buildIndex() {
12183
13080
  toolCall: `ngforge_examples pattern="${key}"`
12184
13081
  });
12185
13082
  }
13083
+ for (const wrapper of getWrappers()) {
13084
+ const subcategory = wrapper.availability === "demo-only" ? `Wrapper (demo, ${wrapper.category})` : `Wrapper (${wrapper.category})`;
13085
+ entries.push({
13086
+ id: wrapper.type,
13087
+ category: "wrapper",
13088
+ subcategory,
13089
+ description: wrapper.description,
13090
+ aliases: [],
13091
+ content: `${wrapper.type} wrapper ${wrapper.description} ${wrapper.package}`.toLowerCase(),
13092
+ toolCall: `ngforge_lookup topic="${wrapper.type}"`
13093
+ });
13094
+ }
12186
13095
  searchIndex = entries;
12187
13096
  return entries;
12188
13097
  }
@@ -12225,7 +13134,7 @@ Try broader terms or check available topics:
12225
13134
  const lines = ["# Search Results", ""];
12226
13135
  for (let i = 0; i < results.length; i++) {
12227
13136
  const { entry } = results[i];
12228
- const categoryLabel = entry.category === "topic" ? `Topic \xB7 ${entry.subcategory}` : `Example \xB7 ${entry.subcategory}`;
13137
+ const categoryLabel = entry.category === "topic" ? `Topic \xB7 ${entry.subcategory}` : entry.category === "wrapper" ? entry.subcategory : `Example \xB7 ${entry.subcategory}`;
12229
13138
  lines.push(`${i + 1}. **${entry.id}** (${categoryLabel})`);
12230
13139
  lines.push(` ${entry.description}`);
12231
13140
  lines.push(` \u2192 \`${entry.toolCall}\``);
@@ -12252,7 +13161,7 @@ Use this when you don't know the exact topic name.
12252
13161
 
12253
13162
  New to ng-forge? Start with: ngforge_lookup topic="workflow"`,
12254
13163
  {
12255
- query: z58.string().describe("Natural language or keywords to search for")
13164
+ query: z59.string().describe("Natural language or keywords to search for")
12256
13165
  },
12257
13166
  async ({ query }) => {
12258
13167
  const index = buildIndex();