@ng-forge/dynamic-form-mcp 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/bin/ng-forge-mcp.js +1146 -536
  2. package/package.json +6 -6
  3. package/src/index.js +1146 -537
  4. package/src/registry/documentation.d.ts +14 -0
  5. package/src/registry/documentation.d.ts.map +1 -0
  6. package/src/registry/field-types.d.ts +9 -0
  7. package/src/registry/field-types.d.ts.map +1 -0
  8. package/src/registry/index.d.ts +10 -16
  9. package/src/registry/index.d.ts.map +1 -1
  10. package/src/registry/instructions.d.ts +1 -1
  11. package/src/registry/instructions.d.ts.map +1 -1
  12. package/src/registry/ui-adapters.d.ts +9 -0
  13. package/src/registry/ui-adapters.d.ts.map +1 -0
  14. package/src/registry/validators.d.ts +9 -0
  15. package/src/registry/validators.d.ts.map +1 -0
  16. package/src/resources/documentation.resource.d.ts +2 -1
  17. package/src/resources/documentation.resource.d.ts.map +1 -1
  18. package/src/services/doc-fetcher.d.ts +34 -0
  19. package/src/services/doc-fetcher.d.ts.map +1 -0
  20. package/src/services/topic-mapper.d.ts +18 -0
  21. package/src/services/topic-mapper.d.ts.map +1 -0
  22. package/src/tools/data/lookup-topics.d.ts +5 -0
  23. package/src/tools/data/lookup-topics.d.ts.map +1 -1
  24. package/src/tools/examples.tool.d.ts +18 -0
  25. package/src/tools/examples.tool.d.ts.map +1 -1
  26. package/src/tools/index.d.ts +8 -6
  27. package/src/tools/index.d.ts.map +1 -1
  28. package/src/tools/lookup.tool.d.ts.map +1 -1
  29. package/src/tools/search.tool.d.ts +9 -0
  30. package/src/tools/search.tool.d.ts.map +1 -0
  31. package/src/tools/validate.tool.d.ts.map +1 -1
  32. package/src/registry/api-reference.json +0 -561
  33. package/src/registry/docs.json +0 -266
  34. package/src/registry/field-types.json +0 -502
  35. package/src/registry/ui-adapters.json +0 -225
  36. package/src/registry/validators.json +0 -210
@@ -1,502 +0,0 @@
1
- [
2
- {
3
- "type": "input",
4
- "category": "value",
5
- "description": "Text-based input field with HTML5 type support (text, email, password, number, tel, url)",
6
- "valueType": "string | number",
7
- "baseInterface": "BaseValueField",
8
- "props": {
9
- "type": {
10
- "name": "type",
11
- "type": "'text' | 'email' | 'password' | 'number' | 'tel' | 'url'",
12
- "description": "HTML input type",
13
- "required": false,
14
- "default": "text"
15
- },
16
- "placeholder": {
17
- "name": "placeholder",
18
- "type": "DynamicText",
19
- "description": "Placeholder text displayed when field is empty",
20
- "required": false
21
- }
22
- },
23
- "validationSupported": true,
24
- "source": "adapter",
25
- "allowedIn": ["top-level", "page", "row", "group", "array"],
26
- "example": "{\n key: 'email',\n type: 'input',\n label: 'Email Address',\n required: true,\n email: true,\n props: { type: 'email', placeholder: 'user@example.com' }\n}",
27
- "minimalExample": "{ key: 'name', type: 'input', label: 'Name' }"
28
- },
29
- {
30
- "type": "textarea",
31
- "category": "value",
32
- "description": "Multi-line text input field for longer content",
33
- "valueType": "string",
34
- "baseInterface": "BaseValueField",
35
- "props": {
36
- "rows": {
37
- "name": "rows",
38
- "type": "number",
39
- "description": "Number of visible text lines",
40
- "required": false,
41
- "default": 3
42
- },
43
- "placeholder": {
44
- "name": "placeholder",
45
- "type": "DynamicText",
46
- "description": "Placeholder text displayed when field is empty",
47
- "required": false
48
- }
49
- },
50
- "validationSupported": true,
51
- "source": "adapter",
52
- "allowedIn": ["top-level", "page", "row", "group", "array"],
53
- "example": "{\n key: 'description',\n type: 'textarea',\n label: 'Description',\n props: { rows: 5, placeholder: 'Enter description...' }\n}",
54
- "minimalExample": "{ key: 'bio', type: 'textarea', label: 'Bio' }"
55
- },
56
- {
57
- "type": "select",
58
- "category": "value",
59
- "description": "Dropdown selection field with single or multiple selection",
60
- "valueType": "T | T[]",
61
- "baseInterface": "BaseValueField",
62
- "props": {
63
- "options": {
64
- "name": "options",
65
- "type": "FieldOption[]",
66
- "description": "Array of selectable options with label and value. IMPORTANT: options goes at FIELD level, NOT inside props",
67
- "required": true
68
- },
69
- "multiple": {
70
- "name": "multiple",
71
- "type": "boolean",
72
- "description": "Allow multiple selections",
73
- "required": false,
74
- "default": false
75
- },
76
- "placeholder": {
77
- "name": "placeholder",
78
- "type": "DynamicText",
79
- "description": "Placeholder text for empty selection",
80
- "required": false
81
- }
82
- },
83
- "validationSupported": true,
84
- "source": "adapter",
85
- "allowedIn": ["top-level", "page", "row", "group", "array"],
86
- "example": "{\n key: 'country',\n type: 'select',\n label: 'Country',\n required: true,\n options: [\n { label: 'United States', value: 'us' },\n { label: 'Canada', value: 'ca' }\n ]\n}",
87
- "minimalExample": "{ key: 'status', type: 'select', label: 'Status', options: [{ label: 'Active', value: 'active' }] }"
88
- },
89
- {
90
- "type": "checkbox",
91
- "category": "value",
92
- "description": "Boolean toggle checkbox field",
93
- "valueType": "boolean",
94
- "baseInterface": "BaseCheckedField",
95
- "props": {},
96
- "validationSupported": true,
97
- "source": "adapter",
98
- "allowedIn": ["top-level", "page", "row", "group", "array"],
99
- "example": "{\n key: 'acceptTerms',\n type: 'checkbox',\n label: 'I accept the terms and conditions',\n required: true\n}",
100
- "minimalExample": "{ key: 'agree', type: 'checkbox', label: 'I agree' }"
101
- },
102
- {
103
- "type": "multi-checkbox",
104
- "category": "value",
105
- "description": "Multiple checkbox group for selecting multiple values from options",
106
- "valueType": "T[]",
107
- "baseInterface": "BaseValueField",
108
- "props": {
109
- "options": {
110
- "name": "options",
111
- "type": "FieldOption[]",
112
- "description": "Array of selectable options. IMPORTANT: options goes at FIELD level, NOT inside props",
113
- "required": true
114
- }
115
- },
116
- "validationSupported": true,
117
- "source": "adapter",
118
- "allowedIn": ["top-level", "page", "row", "group", "array"],
119
- "example": "{\n key: 'interests',\n type: 'multi-checkbox',\n label: 'Select your interests',\n options: [\n { label: 'Sports', value: 'sports' },\n { label: 'Music', value: 'music' },\n { label: 'Art', value: 'art' },\n { label: 'Technology', value: 'tech' }\n ]\n}",
120
- "minimalExample": "{ key: 'tags', type: 'multi-checkbox', label: 'Tags', options: [{ label: 'A', value: 'a' }] }"
121
- },
122
- {
123
- "type": "radio",
124
- "category": "value",
125
- "description": "Radio button group for single selection from options",
126
- "valueType": "T",
127
- "baseInterface": "BaseValueField",
128
- "props": {
129
- "options": {
130
- "name": "options",
131
- "type": "FieldOption[]",
132
- "description": "Array of selectable options. IMPORTANT: options goes at FIELD level, NOT inside props",
133
- "required": true
134
- }
135
- },
136
- "validationSupported": true,
137
- "source": "adapter",
138
- "allowedIn": ["top-level", "page", "row", "group", "array"],
139
- "example": "{\n key: 'gender',\n type: 'radio',\n label: 'Gender',\n options: [\n { label: 'Male', value: 'male' },\n { label: 'Female', value: 'female' },\n { label: 'Other', value: 'other' }\n ]\n}",
140
- "minimalExample": "{ key: 'choice', type: 'radio', label: 'Choice', options: [{ label: 'Yes', value: 'yes' }, { label: 'No', value: 'no' }] }"
141
- },
142
- {
143
- "type": "datepicker",
144
- "category": "value",
145
- "description": "Date selection field with calendar picker",
146
- "valueType": "Date | string",
147
- "baseInterface": "BaseValueField",
148
- "props": {
149
- "minDate": {
150
- "name": "minDate",
151
- "type": "Date | string",
152
- "description": "Minimum selectable date",
153
- "required": false
154
- },
155
- "maxDate": {
156
- "name": "maxDate",
157
- "type": "Date | string",
158
- "description": "Maximum selectable date",
159
- "required": false
160
- }
161
- },
162
- "validationSupported": true,
163
- "source": "adapter",
164
- "allowedIn": ["top-level", "page", "row", "group", "array"],
165
- "example": "{\n key: 'birthDate',\n type: 'datepicker',\n label: 'Date of Birth',\n required: true,\n props: { maxDate: new Date() }\n}",
166
- "minimalExample": "{ key: 'date', type: 'datepicker', label: 'Date' }"
167
- },
168
- {
169
- "type": "toggle",
170
- "category": "value",
171
- "description": "Switch/toggle control for boolean values",
172
- "valueType": "boolean",
173
- "baseInterface": "BaseCheckedField",
174
- "props": {},
175
- "validationSupported": true,
176
- "source": "adapter",
177
- "allowedIn": ["top-level", "page", "row", "group", "array"],
178
- "example": "{\n key: 'notifications',\n type: 'toggle',\n label: 'Enable notifications'\n}",
179
- "minimalExample": "{ key: 'enabled', type: 'toggle', label: 'Enable' }"
180
- },
181
- {
182
- "type": "slider",
183
- "category": "value",
184
- "description": "Numeric range slider for value selection",
185
- "valueType": "number",
186
- "baseInterface": "BaseValueField",
187
- "props": {
188
- "minValue": {
189
- "name": "minValue",
190
- "type": "number",
191
- "description": "Minimum value. IMPORTANT: This is at FIELD level, NOT inside props",
192
- "required": false,
193
- "default": 0
194
- },
195
- "maxValue": {
196
- "name": "maxValue",
197
- "type": "number",
198
- "description": "Maximum value. IMPORTANT: This is at FIELD level, NOT inside props",
199
- "required": false,
200
- "default": 100
201
- },
202
- "step": {
203
- "name": "step",
204
- "type": "number",
205
- "description": "Step increment. IMPORTANT: This is at FIELD level, NOT inside props",
206
- "required": false,
207
- "default": 1
208
- }
209
- },
210
- "validationSupported": true,
211
- "source": "adapter",
212
- "allowedIn": ["top-level", "page", "row", "group", "array"],
213
- "example": "{\n key: 'volume',\n type: 'slider',\n label: 'Volume',\n value: 50,\n minValue: 0,\n maxValue: 100,\n step: 5\n}",
214
- "minimalExample": "{ key: 'rating', type: 'slider', label: 'Rating' }"
215
- },
216
- {
217
- "type": "hidden",
218
- "category": "value",
219
- "description": "Hidden field that participates in form values without rendering. REQUIRED: The \"value\" property MUST be provided (string, number, boolean, or array). FORBIDDEN: label, logic, validators, required, props, disabled, readonly, hidden, col, tabIndex, meta - hidden fields are purely for passing values through the form. IMPORTANT: In multi-page forms, hidden fields must go INSIDE a page, not at the root level.",
220
- "valueType": "string | number | boolean | (string | number | boolean)[]",
221
- "baseInterface": "FieldDef",
222
- "props": {},
223
- "validationSupported": false,
224
- "source": "core",
225
- "allowedIn": ["top-level (single-page forms only)", "page.fields", "group.fields", "array.fields"],
226
- "notAllowedIn": ["row", "top-level when using pages"],
227
- "example": "// Hidden field - value is REQUIRED!\n{\n key: 'userId',\n type: 'hidden',\n value: 'abc123' // REQUIRED: string, number, boolean, or array\n}\n\n// Valid value types:\n{ key: 'count', type: 'hidden', value: 42 } // number\n{ key: 'active', type: 'hidden', value: true } // boolean\n{ key: 'tags', type: 'hidden', value: [1, 2, 3] } // array\n\n// ❌ FORBIDDEN (will cause validation error):\n// - label, logic, validators, required, props\n// - disabled, readonly, hidden, col, tabIndex, meta\n// - Validation shorthand: email, min, max, minLength, maxLength, pattern",
228
- "minimalExample": "{ key: 'id', type: 'hidden', value: 'abc123' }"
229
- },
230
- {
231
- "type": "text",
232
- "category": "display",
233
- "description": "Static text display element (headings, paragraphs, spans). The text content comes from the label property.",
234
- "baseInterface": "FieldDef",
235
- "props": {
236
- "elementType": {
237
- "name": "elementType",
238
- "type": "'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span'",
239
- "description": "HTML element type for rendering",
240
- "required": false,
241
- "default": "p"
242
- }
243
- },
244
- "validationSupported": false,
245
- "source": "core",
246
- "allowedIn": ["top-level", "page", "row", "group", "array"],
247
- "example": "{\n key: 'sectionTitle',\n type: 'text',\n label: 'Personal Information',\n props: { elementType: 'h2' }\n}",
248
- "minimalExample": "{ key: 'header', type: 'text', label: 'Section Title' }"
249
- },
250
- {
251
- "type": "row",
252
- "category": "container",
253
- "description": "Horizontal layout container for grouping fields in columns. Rows do NOT have a label property. Supports only 'hidden' logic type for conditional visibility.",
254
- "baseInterface": "FieldDef",
255
- "props": {
256
- "fields": {
257
- "name": "fields",
258
- "type": "RowAllowedChildren[]",
259
- "description": "Child fields to render horizontally. Allowed: groups, arrays, VALUE fields (input, select, etc). NOT ALLOWED: pages, rows, hidden fields",
260
- "required": true
261
- }
262
- },
263
- "validationSupported": false,
264
- "source": "core",
265
- "allowedIn": ["top-level", "page", "group", "array"],
266
- "notAllowedIn": ["row"],
267
- "canContain": [
268
- "group",
269
- "array",
270
- "input",
271
- "textarea",
272
- "select",
273
- "checkbox",
274
- "multi-checkbox",
275
- "radio",
276
- "datepicker",
277
- "toggle",
278
- "slider",
279
- "text",
280
- "button",
281
- "submit",
282
- "next",
283
- "previous"
284
- ],
285
- "cannotContain": ["page", "row", "hidden"],
286
- "example": "{\n key: 'nameRow',\n type: 'row',\n // NOTE: Rows do NOT have a label property\n // Rows support only 'hidden' logic type for conditional visibility\n fields: [\n { key: 'firstName', type: 'input', label: 'First Name', col: 6 },\n { key: 'lastName', type: 'input', label: 'Last Name', col: 6 }\n ]\n}\n// NOT ALLOWED in rows:\n// - type: 'hidden' (hidden fields cannot be inside rows)\n// - type: 'page' (pages are top-level only)\n// - type: 'row' (no nested rows)",
287
- "minimalExample": "{ key: 'row1', type: 'row', fields: [...] }"
288
- },
289
- {
290
- "type": "group",
291
- "category": "container",
292
- "description": "Nested form group container creating a sub-object in form values. Groups are logical containers only and do NOT have a label property. Supports only 'hidden' logic type for conditional visibility.",
293
- "valueType": "object",
294
- "baseInterface": "FieldDef",
295
- "props": {
296
- "fields": {
297
- "name": "fields",
298
- "type": "GroupAllowedChildren[]",
299
- "description": "Child fields in the group. Allowed: rows, leaf fields (NOT pages or other groups)",
300
- "required": true
301
- }
302
- },
303
- "validationSupported": true,
304
- "source": "core",
305
- "allowedIn": ["top-level", "page", "row", "array"],
306
- "notAllowedIn": ["group"],
307
- "canContain": [
308
- "row",
309
- "input",
310
- "textarea",
311
- "select",
312
- "checkbox",
313
- "multi-checkbox",
314
- "radio",
315
- "datepicker",
316
- "toggle",
317
- "slider",
318
- "hidden",
319
- "text",
320
- "button",
321
- "submit",
322
- "next",
323
- "previous"
324
- ],
325
- "cannotContain": ["page", "group"],
326
- "example": "{\n key: 'address',\n type: 'group',\n // NOTE: Groups do NOT have a label property\n fields: [\n { key: 'street', type: 'input', label: 'Street' },\n { key: 'city', type: 'input', label: 'City' },\n { key: 'zip', type: 'input', label: 'ZIP Code' }\n ]\n}",
327
- "minimalExample": "{ key: 'address', type: 'group', fields: [...] }"
328
- },
329
- {
330
- "type": "array",
331
- "category": "container",
332
- "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.",
333
- "valueType": "T[]",
334
- "baseInterface": "FieldDef",
335
- "props": {
336
- "fields": {
337
- "name": "fields",
338
- "type": "ArrayAllowedChildren[]",
339
- "description": "Template field(s) for each array item. Allowed: rows, groups, leaf fields (NOT pages or other arrays)",
340
- "required": true
341
- },
342
- "minLength": {
343
- "name": "minLength",
344
- "type": "number",
345
- "description": "Minimum number of items required in the array. Validation fails if fewer items.",
346
- "required": false
347
- },
348
- "maxLength": {
349
- "name": "maxLength",
350
- "type": "number",
351
- "description": "Maximum number of items allowed in the array. Validation fails if more items.",
352
- "required": false
353
- }
354
- },
355
- "validationSupported": true,
356
- "source": "core",
357
- "allowedIn": ["top-level", "page", "row", "group"],
358
- "notAllowedIn": ["array"],
359
- "canContain": [
360
- "row",
361
- "group",
362
- "input",
363
- "textarea",
364
- "select",
365
- "checkbox",
366
- "multi-checkbox",
367
- "radio",
368
- "datepicker",
369
- "toggle",
370
- "slider",
371
- "hidden",
372
- "text",
373
- "button",
374
- "submit",
375
- "next",
376
- "previous"
377
- ],
378
- "cannotContain": ["page", "array"],
379
- "example": "// Flat array with length validation\n{\n key: 'tags',\n type: 'array',\n minLength: 1, // At least one tag required\n maxLength: 5, // No more than 5 tags\n fields: [\n { key: 'tag', type: 'input', label: 'Tag' }\n ]\n}\n// Result: { tags: ['value1', 'value2'] }\n\n// Object array (nested groups)\n{\n key: 'contacts',\n type: 'array',\n minLength: 1,\n fields: [{\n type: 'group',\n fields: [\n { key: 'name', type: 'input', label: 'Name' },\n { key: 'email', type: 'input', label: 'Email' }\n ]\n }]\n}\n// Result: { contacts: [{name: '', email: ''}, ...] }",
380
- "minimalExample": "{ key: 'items', type: 'array', fields: [...] }"
381
- },
382
- {
383
- "type": "page",
384
- "category": "container",
385
- "description": "Multi-step form page container for wizard-style forms. Pages do NOT have label or title properties. ALL top-level fields must be pages if using multi-page mode. IMPORTANT: Navigation buttons (next, previous) must be added as fields WITHIN each page that needs them.",
386
- "baseInterface": "FieldDef",
387
- "props": {
388
- "fields": {
389
- "name": "fields",
390
- "type": "PageAllowedChildren[]",
391
- "description": "Fields in this page. Allowed: rows, groups, arrays, leaf fields (NOT other pages). Include next/previous buttons as needed.",
392
- "required": true
393
- }
394
- },
395
- "validationSupported": false,
396
- "source": "core",
397
- "allowedIn": ["top-level"],
398
- "notAllowedIn": ["page", "row", "group", "array"],
399
- "canContain": [
400
- "row",
401
- "group",
402
- "array",
403
- "input",
404
- "textarea",
405
- "select",
406
- "checkbox",
407
- "multi-checkbox",
408
- "radio",
409
- "datepicker",
410
- "toggle",
411
- "slider",
412
- "hidden",
413
- "text",
414
- "button",
415
- "submit",
416
- "next",
417
- "previous"
418
- ],
419
- "cannotContain": ["page"],
420
- "example": "{\n key: 'step1',\n type: 'page',\n // NOTE: Pages do NOT have label or title properties\n // Navigation buttons are fields WITHIN the page\n fields: [\n { key: 'firstName', type: 'input', label: 'First Name' },\n { key: 'lastName', type: 'input', label: 'Last Name' },\n { key: 'next', type: 'next', label: 'Next' }\n ]\n}",
421
- "minimalExample": "{ key: 'step1', type: 'page', fields: [...] }"
422
- },
423
- {
424
- "type": "next",
425
- "category": "button",
426
- "description": "Navigation button to go to next page in multi-step forms. Must be placed INSIDE a page's fields array.",
427
- "baseInterface": "FieldDef",
428
- "props": {},
429
- "validationSupported": false,
430
- "source": "adapter",
431
- "allowedIn": ["top-level", "page", "row", "group", "array"],
432
- "example": "{\n key: 'next',\n type: 'next',\n label: 'Next'\n}",
433
- "minimalExample": "{ key: 'next', type: 'next', label: 'Next' }"
434
- },
435
- {
436
- "type": "previous",
437
- "category": "button",
438
- "description": "Navigation button to go to previous page in multi-step forms. Must be placed INSIDE a page's fields array.",
439
- "baseInterface": "FieldDef",
440
- "props": {},
441
- "validationSupported": false,
442
- "source": "adapter",
443
- "allowedIn": ["top-level", "page", "row", "group", "array"],
444
- "example": "{\n key: 'back',\n type: 'previous',\n label: 'Back'\n}",
445
- "minimalExample": "{ key: 'back', type: 'previous', label: 'Back' }"
446
- },
447
- {
448
- "type": "button",
449
- "category": "button",
450
- "description": "Generic button for custom actions. IMPORTANT: The generic 'button' type REQUIRES the 'event' property with a FormEventConstructor. For simple use cases, prefer 'submit', 'next', or 'previous' which don't require event configuration.",
451
- "baseInterface": "FieldDef",
452
- "props": {
453
- "event": {
454
- "name": "event",
455
- "type": "FormEventConstructor<TEvent>",
456
- "description": "REQUIRED. Event constructor that will be emitted when button is clicked. Must be registered with provideFormEvents().",
457
- "required": true
458
- }
459
- },
460
- "validationSupported": false,
461
- "source": "adapter",
462
- "allowedIn": ["top-level", "page", "row", "group", "array"],
463
- "example": "// RECOMMENDED: Use pre-defined button types for common actions\n{ key: 'submit', type: 'submit', label: 'Submit Form' }\n{ key: 'next', type: 'next', label: 'Next' }\n{ key: 'back', type: 'previous', label: 'Back' }\n\n// ADVANCED: Generic button with custom event (requires setup)\n// 1. Create event class: class MyCustomEvent extends FormEvent {}\n// 2. Register with: provideFormEvents([MyCustomEvent])\n// 3. Use in config:\n{\n key: 'customAction',\n type: 'button',\n label: 'Custom Action',\n event: MyCustomEvent // Must be the class reference\n}",
464
- "minimalExample": "{ key: 'action', type: 'button', label: 'Action', event: MyEvent }"
465
- },
466
- {
467
- "type": "submit",
468
- "category": "button",
469
- "description": "Form submit button",
470
- "baseInterface": "FieldDef",
471
- "props": {},
472
- "validationSupported": false,
473
- "source": "adapter",
474
- "allowedIn": ["top-level", "page", "row", "group", "array"],
475
- "example": "{\n key: 'submit',\n type: 'submit',\n label: 'Submit Form'\n}",
476
- "minimalExample": "{ key: 'submit', type: 'submit', label: 'Submit' }"
477
- },
478
- {
479
- "type": "addArrayItem",
480
- "category": "button",
481
- "description": "Button to add a new item to an array field. Must be placed within or near the array container.",
482
- "baseInterface": "FieldDef",
483
- "props": {},
484
- "validationSupported": false,
485
- "source": "adapter",
486
- "allowedIn": ["array", "row", "group"],
487
- "example": "{\n key: 'addContact',\n type: 'addArrayItem',\n label: 'Add Contact'\n}",
488
- "minimalExample": "{ key: 'add', type: 'addArrayItem', label: 'Add Item' }"
489
- },
490
- {
491
- "type": "removeArrayItem",
492
- "category": "button",
493
- "description": "Button to remove the current item from an array field. Typically placed within each array item template.",
494
- "baseInterface": "FieldDef",
495
- "props": {},
496
- "validationSupported": false,
497
- "source": "adapter",
498
- "allowedIn": ["array", "row", "group"],
499
- "example": "{\n key: 'removeContact',\n type: 'removeArrayItem',\n label: 'Remove'\n}",
500
- "minimalExample": "{ key: 'remove', type: 'removeArrayItem', label: 'Remove' }"
501
- }
502
- ]