@webiny/mcp 6.3.0-beta.2 → 6.3.0-beta.3

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.
@@ -5,10 +5,19 @@ description: >
5
5
  Creating Headless CMS content models via code using the ModelFactory pattern.
6
6
  Use this skill when the developer wants to create, modify, or understand content model
7
7
  definitions, define fields and validators, set up reference fields between models,
8
- configure field layouts, or work with the ModelFactory builder API. Also covers field types
9
- (text, number, boolean, datetime, file, ref, object, richText) and validation (required,
10
- unique, email, pattern, minLength, maxLength, gte, predefinedValues),
8
+ configure field layouts (including nested layouts inside object or dynamicZone fields),
9
+ pick the correct Admin UI renderer for a field type (textInput/textInputs,
10
+ lexicalEditor/lexicalEditors, file/files, objectAccordionSingle/objectAccordionMultiple, etc.),
11
+ or work with the ModelFactory builder API. Also covers field types
12
+ (text, longText, number, boolean, datetime, file, ref, object, richText, dynamicZone),
13
+ list (array) fields via .list() and the singular-vs-plural renderer rule,
14
+ validation (required, unique, email, pattern, minLength, maxLength, gte, predefinedValues),
11
15
  single-entry (singleton) models via .singleEntry(), and model/field tags via .tags().
16
+ Includes the correct `fields` projection syntax when querying entries via the SDK:
17
+ `ref` fields use double-`values.` nesting (e.g. `values.author.values.name`) because
18
+ they resolve to another entry, while `object` and `dynamicZone` sub-fields are inline
19
+ and use a single `values.` (e.g. `values.author.name`) — getting this wrong silently
20
+ returns null.
12
21
  ---
13
22
 
14
23
  # Creating Content Models via Code
@@ -74,19 +83,183 @@ Register in `webiny.config.tsx`:
74
83
  | `.singleEntry()` | Makes the model a singleton (only one entry can exist). Automatically adds the `"singleEntry"` tag. |
75
84
  | `.tags(["tag1", "tag2"])` | Assign custom tags to the model. The tag `"type:model"` is always added automatically. Duplicates are removed. |
76
85
 
77
- ## Field Types
86
+ ## Layout
78
87
 
79
- | Builder Method | Description | Common Renderers |
80
- | ------------------- | ----------------------------- | -------------------------------------------- |
81
- | `fields.text()` | Single-line text | `"textInput"` |
82
- | `fields.longText()` | Multi-line text | `"textarea"` |
83
- | `fields.richText()` | Rich text (Lexical) | `"lexicalTextInput"` |
84
- | `fields.number()` | Numeric value | `"numberInput"` |
85
- | `fields.boolean()` | True/false toggle | `"boolean"` |
86
- | `fields.datetime()` | Date/time picker | `"dateTimeInput"` |
87
- | `fields.file()` | File/image attachment | `"fileInput"` |
88
- | `fields.ref()` | Reference to another model | `"refDialogSingle"`, `"refAdvancedMultiple"` |
89
- | `fields.object()` | Nested object with sub-fields | `"objectInput"` |
88
+ `.layout()` takes a two-dimensional array of field IDs. Each inner array is one row in
89
+ the Admin editor, and each entry within a row is a column cell. Field IDs must exactly
90
+ match the keys used in `.fields()`.
91
+
92
+ ### Top-level layout
93
+
94
+ ```typescript
95
+ .layout([
96
+ ["name", "slug"], // row 1: two columns
97
+ ["description"], // row 2: one column, full width
98
+ ["category", "price"]
99
+ ])
100
+ ```
101
+
102
+ ### Nested layout inside an `object` field
103
+
104
+ `object` fields have their own `.fields()` and `.layout()` that only reference the
105
+ object's own sub-fields. The outer model layout should refer to the object field as a
106
+ whole; its internal arrangement is owned by the object itself.
107
+
108
+ ```typescript
109
+ .fields((fields) => ({
110
+ name: fields.text().renderer("textInput").label("Name"),
111
+ address: fields
112
+ .object()
113
+ .renderer("objectAccordionSingle")
114
+ .label("Address")
115
+ .fields((sub) => ({
116
+ street: sub.text().renderer("textInput").label("Street"),
117
+ city: sub.text().renderer("textInput").label("City"),
118
+ zip: sub.text().renderer("textInput").label("ZIP")
119
+ }))
120
+ .layout([
121
+ ["street"], // inner layout — only uses sub-field IDs
122
+ ["city", "zip"]
123
+ ])
124
+ }))
125
+ .layout([
126
+ ["name"],
127
+ ["address"] // outer layout just references the object field
128
+ ])
129
+ ```
130
+
131
+ ### Nested layout inside a `dynamicZone` field
132
+
133
+ `dynamicZone` is an array field where each entry is one of several named templates.
134
+ Every template declares its own fields **and** its own layout, scoped to that template.
135
+ The outer model layout simply references the dynamicZone field by its ID.
136
+
137
+ ```typescript
138
+ .fields((fields) => ({
139
+ blocks: fields
140
+ .dynamicZone()
141
+ .label("Content blocks")
142
+ .template("hero", {
143
+ name: "Hero",
144
+ gqlTypeName: "HeroBlock",
145
+ fields: (t) => ({
146
+ heading: t.text().renderer("textInput").label("Heading"),
147
+ image: t.file().renderer("file").label("Image")
148
+ }),
149
+ layout: [
150
+ ["heading"], // layout inside the "hero" template only
151
+ ["image"]
152
+ ]
153
+ })
154
+ .template("quote", {
155
+ name: "Quote",
156
+ gqlTypeName: "QuoteBlock",
157
+ fields: (t) => ({
158
+ text: t.longText().renderer("textarea").label("Quote text"),
159
+ author: t.text().renderer("textInput").label("Author")
160
+ }),
161
+ layout: [
162
+ ["text"],
163
+ ["author"]
164
+ ]
165
+ })
166
+ }))
167
+ .layout([
168
+ ["blocks"] // outer layout references the dynamicZone as a whole
169
+ ])
170
+ ```
171
+
172
+ Rule of thumb: **a layout can only reference field IDs in the same scope it's declared
173
+ in.** Model layout references model fields. Object layout references that object's
174
+ sub-fields. Each dynamicZone template's layout references only that template's fields.
175
+
176
+ ## Field Types and Renderers
177
+
178
+ Every field type exposes two renderer variants: a **single-value** renderer (used by
179
+ default) and a **multi-value** renderer (used when the field is marked as a list via
180
+ `.list()`). You **MUST** pair the renderer with the cardinality: calling `.list()`
181
+ requires a renderer from the `list: true` column, and omitting `.list()` requires one
182
+ from the `list: false` column. Using the wrong variant will render incorrectly in the
183
+ Admin UI and the field may fail to save values. Invented names (e.g. `"fileInput"`,
184
+ `"lexicalTextInput"`, `"objectInput"`, `"boolean"`) will silently misbehave the same way.
185
+
186
+ Exception: `fields.boolean()` has no multi-value variant — do not call `.list()` on
187
+ boolean fields.
188
+
189
+ The authoritative source for this list is
190
+ `@webiny/api-headless-cms/features/modelBuilder/fields/DataFieldBuilder.d.ts` (in the
191
+ project's `node_modules`) — if you're unsure, grep there first.
192
+
193
+ | Builder Method | Description | Single (`list: false`) | Multiple (`list: true`) |
194
+ | ---------------------- | ---------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------- |
195
+ | `fields.text()` | Single-line text | `"textInput"` | `"textInputs"` |
196
+ | `fields.longText()` | Multi-line text | `"textarea"` | `"textareas"` |
197
+ | `fields.richText()` | Rich text (Lexical) | `"lexicalEditor"` | `"lexicalEditors"` |
198
+ | `fields.number()` | Numeric value | `"numberInput"` | `"numberInputs"` |
199
+ | `fields.boolean()` | True/false toggle | `"switch"` | — (not supported) |
200
+ | `fields.datetime()` | Date/time picker | `"dateTimeInput"` | `"dateTimeInputs"` |
201
+ | `fields.file()` | File/image attachment | `"file"` | `"files"` |
202
+ | `fields.ref()` | Reference to another model | `"refDialogSingle"`, `"refAutocompleteSingle"`, `"refRadioButtons"` | `"refDialogMultiple"`, `"refAutocompleteMultiple"`, `"refCheckboxes"` |
203
+ | `fields.object()` | Nested object with sub-fields | `"objectAccordionSingle"` | `"objectAccordionMultiple"` |
204
+ | `fields.dynamicZone()` | Dynamic zone (choose-one-of-N templates) | `"dynamicZone"` | _(implicitly a list; see below)_ |
205
+
206
+ ### Ref renderer families
207
+
208
+ The three `ref` renderer families look and behave very differently in the Admin UI —
209
+ pick the one that fits your UX:
210
+
211
+ - **Dialog** (`refDialogSingle` / `refDialogMultiple`) — opens a modal with a searchable,
212
+ filterable picker. Best for large reference sets.
213
+ - **Autocomplete** (`refAutocompleteSingle` / `refAutocompleteMultiple`) — inline
214
+ typeahead input. Best for moderate reference sets.
215
+ - **Inline** (`refRadioButtons` / `refCheckboxes`) — renders all referenced entries as
216
+ inline controls. Best for small, fixed reference sets.
217
+
218
+ ### Alternative text/number renderers (with `predefinedValues`)
219
+
220
+ When a `text` or `number` field uses `.predefinedValues([...])`, additional renderers
221
+ become available:
222
+
223
+ - `"radioButtons"` — single-value; requires `list: false` and `predefinedValues`.
224
+ - `"dropdown"` — single-value; requires `list: false` and `predefinedValues`.
225
+ - `"checkboxes"` — multi-value; requires `list: true` and `predefinedValues`.
226
+ - `"tags"` — multi-value free-form entry; `text` only, requires `list: true` and NO
227
+ `predefinedValues`.
228
+
229
+ ### List fields and renderer pluralization
230
+
231
+ When a field uses `.list()` (i.e. stores an array of values), the renderer **must** be the
232
+ plural variant from the right-hand column above. Pairing `.list()` with the singular
233
+ renderer causes the Admin UI to render the wrong component and the field will fail to
234
+ save correctly.
235
+
236
+ **Correct** — list of tags uses the plural `"textInputs"` renderer:
237
+
238
+ ```typescript
239
+ tags: fields
240
+ .text()
241
+ .list()
242
+ .renderer("textInputs") // plural, because .list() is chained
243
+ .label("Tags");
244
+ ```
245
+
246
+ **Wrong** — singular renderer on a list field (this is the pattern that breaks silently):
247
+
248
+ ```typescript
249
+ tags: fields
250
+ .text()
251
+ .list()
252
+ .renderer("textInput") // WRONG: should be "textInputs"
253
+ .label("Tags");
254
+ ```
255
+
256
+ The same rule applies to every field type that has both variants:
257
+ `richText().list()` → `"lexicalEditors"`, `file().list()` → `"files"`,
258
+ `longText().list()` → `"textareas"`, `number().list()` → `"numberInputs"`,
259
+ `object().list()` → `"objectAccordionMultiple"`, and so on.
260
+
261
+ For `ref()` fields the pluralization rule is the same but the singular/multiple renderers
262
+ have distinct names (e.g. `refDialogSingle` → `refDialogMultiple`) — see the table.
90
263
 
91
264
  ## Field Validators (Chainable)
92
265
 
@@ -103,14 +276,79 @@ Register in `webiny.config.tsx`:
103
276
 
104
277
  ## Field Configuration (Chainable)
105
278
 
106
- | Method | Description |
107
- | ------------------------------- | -------------------------------------------------- |
108
- | `.renderer("rendererName")` | Set the Admin UI renderer |
109
- | `.label("Display Name")` | Field label in the editor |
110
- | `.help("Helper text")` | Helper text shown below the field |
111
- | `.list()` | Make the field accept multiple values (arrays) |
112
- | `.models([{ modelId: "..." }])` | For `ref()` fields: which models can be referenced |
113
- | `.tags(["tag1"])` | Assign tags to a field (e.g., `"$bulk-edit"`) |
279
+ | Method | Description |
280
+ | ------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
281
+ | `.renderer("rendererName")` | Set the Admin UI renderer |
282
+ | `.label("Display Name")` | Field label in the editor |
283
+ | `.help("Helper text")` | Helper text shown below the field |
284
+ | `.list()` | Make the field accept multiple values (arrays). Requires a multi-value renderer variant — see Field Types table. |
285
+ | `.models([{ modelId: "..." }])` | For `ref()` fields: which models can be referenced |
286
+ | `.tags(["tag1"])` | Assign tags to a field (e.g., `"$bulk-edit"`) |
287
+
288
+ ## Querying `ref`, `object`, and `dynamicZone` fields
289
+
290
+ When you read entries via the Webiny SDK (or GraphQL), the `fields` array tells the API
291
+ which fields to return. **The nesting syntax depends on the field type**, and getting it
292
+ wrong silently returns `null` for the nested value.
293
+
294
+ ### `ref` fields — double `values.` nesting
295
+
296
+ A reference field returns the **referenced entry**, which itself has its own `values`
297
+ wrapper around its fields. To project a sub-field of a referenced entry, you must
298
+ include the inner `values.` segment.
299
+
300
+ ```typescript
301
+ // article model has: author: fields.ref().models([{ modelId: "author" }])
302
+ const { result } = await cms.articles.list({
303
+ fields: [
304
+ "id",
305
+ "values.title",
306
+ "values.author.values.name" // ref → double "values."
307
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^
308
+ ]
309
+ });
310
+ ```
311
+
312
+ If `author` is a `.list()` ref field, the same rule applies — each item in the returned
313
+ array is an entry with its own `values` wrapper, so you still write
314
+ `values.authors.values.name`.
315
+
316
+ ### `object` and `dynamicZone` fields — no inner `values.`
317
+
318
+ Object and dynamicZone sub-fields are stored **inline** on the parent entry, with no
319
+ intermediate `values` wrapper. Access sub-fields with a plain dotted path.
320
+
321
+ ```typescript
322
+ // article model has:
323
+ // author: fields.object().fields(sub => ({ name: sub.text(), bio: sub.longText() }))
324
+ const { result } = await cms.articles.list({
325
+ fields: [
326
+ "id",
327
+ "values.title",
328
+ "values.author.name", // object → single "values."
329
+ "values.author.bio"
330
+ // ^^^^^^^^^^^^^^^^^
331
+ ]
332
+ });
333
+ ```
334
+
335
+ For `dynamicZone`, address sub-fields through the template name (still no inner
336
+ `values.`):
337
+
338
+ ```typescript
339
+ // blocks: fields.dynamicZone().template("hero", { fields: t => ({ heading: t.text() }) })
340
+ fields: ["values.blocks.hero.heading"];
341
+ ```
342
+
343
+ ### Rule of thumb
344
+
345
+ - **`fields.ref()`** → the field resolves to another entry, so its sub-path goes through
346
+ `.values.` (e.g. `values.author.values.name`).
347
+ - **`fields.object()` / `fields.dynamicZone()`** → the field is inline, so its sub-path
348
+ is plain (e.g. `values.author.name`).
349
+
350
+ Mixing the two up is the most common cause of "the query worked but the field is
351
+ `null`" bugs. If you're unsure, cross-check the field definition in the model file.
114
352
 
115
353
  ## Full Examples
116
354
 
@@ -2,7 +2,7 @@
2
2
  name: webiny-admin-catalog
3
3
  context: webiny-api
4
4
  description: >
5
- admin — 19 abstractions.
5
+ admin — 22 abstractions.
6
6
  ---
7
7
 
8
8
  # admin
@@ -70,6 +70,16 @@ Renders nothing — purely a data registration side-effect.
70
70
  When the component unmounts (e.g., route change), the section
71
71
  is automatically removed from DevTools.
72
72
 
73
+ ---
74
+ **Name:** `FormModelFactory`
75
+ **Import:** `import { FormModelFactory } from "webiny/admin"`
76
+ **Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
77
+
78
+ ---
79
+ **Name:** `LexicalContext`
80
+ **Import:** `import { LexicalContext } from "webiny/admin"`
81
+ **Source:** `@webiny/app-admin/features/tools/index.ts`
82
+
73
83
  ---
74
84
  **Name:** `MainGraphQLClient`
75
85
  **Import:** `import { MainGraphQLClient } from "webiny/admin"`
@@ -116,6 +126,11 @@ is automatically removed from DevTools.
116
126
  **Import:** `import { ToolsFeature } from "webiny/admin"`
117
127
  **Source:** `@webiny/app-admin/features/tools/index.ts`
118
128
 
129
+ ---
130
+ **Name:** `useBuildParams`
131
+ **Import:** `import { useBuildParams } from "webiny/admin"`
132
+ **Source:** `@webiny/app-admin/presentation/buildParams/useBuildParams.ts`
133
+
119
134
  ---
120
135
  **Name:** `useFeature`
121
136
  **Import:** `import { useFeature } from "webiny/admin"`
@@ -2,7 +2,7 @@
2
2
  name: webiny-admin-cms-catalog
3
3
  context: webiny-api
4
4
  description: >
5
- admin/cms — 69 abstractions.
5
+ admin/cms — 74 abstractions.
6
6
  ---
7
7
 
8
8
  # admin/cms
@@ -173,6 +173,11 @@ description: >
173
173
  **Import:** `import type { EntryAfterUpdatePayload } from "webiny/admin/cms"`
174
174
  **Source:** `@webiny/app-headless-cms/features/contentEntry/events/index.ts`
175
175
 
176
+ ---
177
+ **Name:** `Fields`
178
+ **Import:** `import { Fields } from "webiny/admin/cms/field-renderers/common"`
179
+ **Source:** `@webiny/app-headless-cms-common/index.ts`
180
+
176
181
  ---
177
182
  **Name:** `getNodeFromSelection`
178
183
  **Import:** `import { getNodeFromSelection } from "webiny/admin/cms/lexical"`
@@ -230,6 +235,16 @@ description: >
230
235
  **Import:** `import { MultiValueItemContainer } from "webiny/admin/cms/field-renderers/object"`
231
236
  **Source:** `@webiny/app-headless-cms/admin/plugins/fieldRenderers/object/MultiValueItemContainer.tsx`
232
237
 
238
+ ---
239
+ **Name:** `ParentFieldProvider`
240
+ **Import:** `import { ParentFieldProvider } from "webiny/admin/cms/field-renderers/common"`
241
+ **Source:** `@webiny/app-headless-cms/admin/components/ContentEntryForm/ParentValue.tsx`
242
+
243
+ ---
244
+ **Name:** `ParentValueIndexProvider`
245
+ **Import:** `import { ParentValueIndexProvider } from "webiny/admin/cms/field-renderers/common"`
246
+ **Source:** `@webiny/app-headless-cms-common/index.ts`
247
+
233
248
  ---
234
249
  **Name:** `PermissionsEditor`
235
250
  **Import:** `import { PermissionsEditor } from "webiny/admin/cms/model"`
@@ -262,6 +277,16 @@ description: >
262
277
  **Description:** We're wrapping each component with `withShouldRender`, because they're all decoratable, and `withShouldRender` attaches a
263
278
  conditional decorator, which optionally takes a `modelIds` prop, so you can control on which models that component will be decorated.
264
279
 
280
+ ---
281
+ **Name:** `TemplateIcon`
282
+ **Import:** `import { TemplateIcon } from "webiny/admin/cms/field-renderers/dynamic-zone"`
283
+ **Source:** `@webiny/app-headless-cms/admin/plugins/fieldRenderers/dynamicZone/TemplateIcon.tsx`
284
+
285
+ ---
286
+ **Name:** `TemplateProvider`
287
+ **Import:** `import { TemplateProvider } from "webiny/admin/cms/field-renderers/dynamic-zone"`
288
+ **Source:** `@webiny/app-headless-cms/admin/plugins/fieldRenderers/dynamicZone/index.tsx`
289
+
265
290
  ---
266
291
  **Name:** `useCms`
267
292
  **Import:** `import { useCms } from "webiny/admin/cms"`
@@ -2,7 +2,7 @@
2
2
  name: webiny-admin-form-catalog
3
3
  context: webiny-api
4
4
  description: >
5
- admin/form — 13 abstractions.
5
+ admin/form — 23 abstractions.
6
6
  ---
7
7
 
8
8
  # admin/form
@@ -20,6 +20,28 @@ description: >
20
20
  **Import:** `import { Bind } from "webiny/admin/form"`
21
21
  **Source:** `@webiny/form/index.ts`
22
22
 
23
+ ---
24
+ **Name:** `createFieldRenderer`
25
+ **Import:** `import { createFieldRenderer } from "webiny/admin/form"`
26
+ **Source:** `@webiny/app-admin/features/formModel/createFieldRenderer.tsx`
27
+
28
+ ---
29
+ **Name:** `createObjectFieldRenderer`
30
+ **Import:** `import { createObjectFieldRenderer } from "webiny/admin/form"`
31
+ **Source:** `@webiny/app-admin/features/formModel/createFieldRenderer.tsx`
32
+
33
+ ---
34
+ **Name:** `FieldBuilder`
35
+ **Import:** `import { FieldBuilder } from "webiny/admin/form"`
36
+ **Source:** `@webiny/app-admin/features/formModel/FieldBuilder.ts`
37
+ **Description:** Base FieldBuilder with fluent API.
38
+ Each method mutates `this` and returns `this` for chaining.
39
+
40
+ ---
41
+ **Name:** `FieldType`
42
+ **Import:** `import { FieldType } from "webiny/admin/form"`
43
+ **Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
44
+
23
45
  ---
24
46
  **Name:** `Form`
25
47
  **Import:** `import { Form } from "webiny/admin/form"`
@@ -31,6 +53,11 @@ description: >
31
53
  **Import:** `import type { FormAPI } from "webiny/admin/form"`
32
54
  **Source:** `@webiny/form/index.ts`
33
55
 
56
+ ---
57
+ **Name:** `FormModelFactory`
58
+ **Import:** `import { FormModelFactory } from "webiny/admin/form"`
59
+ **Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
60
+
34
61
  ---
35
62
  **Name:** `FormOnSubmit`
36
63
  **Kind:** type
@@ -43,6 +70,36 @@ description: >
43
70
  **Import:** `import type { GenericFormData } from "webiny/admin/form"`
44
71
  **Source:** `@webiny/form/index.ts`
45
72
 
73
+ ---
74
+ **Name:** `IFieldBuilderRegistry`
75
+ **Kind:** type
76
+ **Import:** `import type { IFieldBuilderRegistry } from "webiny/admin/form"`
77
+ **Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
78
+
79
+ ---
80
+ **Name:** `IFieldRendererRegistry`
81
+ **Kind:** type
82
+ **Import:** `import type { IFieldRendererRegistry } from "webiny/admin/form"`
83
+ **Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
84
+
85
+ ---
86
+ **Name:** `IFieldVM`
87
+ **Kind:** type
88
+ **Import:** `import type { IFieldVM } from "webiny/admin/form"`
89
+ **Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
90
+
91
+ ---
92
+ **Name:** `IObjectFieldItemVM`
93
+ **Kind:** type
94
+ **Import:** `import type { IObjectFieldItemVM } from "webiny/admin/form"`
95
+ **Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
96
+
97
+ ---
98
+ **Name:** `IObjectFieldVM`
99
+ **Kind:** type
100
+ **Import:** `import type { IObjectFieldVM } from "webiny/admin/form"`
101
+ **Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
102
+
46
103
  ---
47
104
  **Name:** `UnsetOnUnmount`
48
105
  **Import:** `import { UnsetOnUnmount } from "webiny/admin/form"`
@@ -2,7 +2,7 @@
2
2
  name: webiny-admin-ui-catalog
3
3
  context: webiny-api
4
4
  description: >
5
- admin/ui — 94 abstractions.
5
+ admin/ui — 99 abstractions.
6
6
  ---
7
7
 
8
8
  # admin/ui
@@ -20,6 +20,11 @@ description: >
20
20
  **Import:** `import { Accordion } from "webiny/admin/ui"`
21
21
  **Source:** `@webiny/admin-ui/Accordion/index.ts`
22
22
 
23
+ ---
24
+ **Name:** `AdminLayout`
25
+ **Import:** `import { AdminLayout } from "webiny/admin/ui"`
26
+ **Source:** `@webiny/app-admin/components/AdminLayout.tsx`
27
+
23
28
  ---
24
29
  **Name:** `Alert`
25
30
  **Import:** `import { Alert } from "webiny/admin/ui"`
@@ -170,6 +175,26 @@ description: >
170
175
  **Import:** `import { FolderTree } from "webiny/admin/ui"`
171
176
  **Source:** `@webiny/app-aco/components/FolderTree/index.tsx`
172
177
 
178
+ ---
179
+ **Name:** `FormComponentDescription`
180
+ **Import:** `import { FormComponentDescription } from "webiny/admin/ui"`
181
+ **Source:** `@webiny/admin-ui/FormComponent/index.ts`
182
+
183
+ ---
184
+ **Name:** `FormComponentErrorMessage`
185
+ **Import:** `import { FormComponentErrorMessage } from "webiny/admin/ui"`
186
+ **Source:** `@webiny/admin-ui/FormComponent/index.ts`
187
+
188
+ ---
189
+ **Name:** `FormComponentLabel`
190
+ **Import:** `import { FormComponentLabel } from "webiny/admin/ui"`
191
+ **Source:** `@webiny/admin-ui/FormComponent/index.ts`
192
+
193
+ ---
194
+ **Name:** `FormComponentNote`
195
+ **Import:** `import { FormComponentNote } from "webiny/admin/ui"`
196
+ **Source:** `@webiny/admin-ui/FormComponent/index.ts`
197
+
173
198
  ---
174
199
  **Name:** `generateId`
175
200
  **Import:** `import { generateId } from "webiny/admin/ui"`
@@ -2,7 +2,7 @@
2
2
  name: webiny-admin-website-builder-catalog
3
3
  context: webiny-api
4
4
  description: >
5
- admin/website-builder — 61 abstractions.
5
+ admin/website-builder — 63 abstractions.
6
6
  ---
7
7
 
8
8
  # admin/website-builder
@@ -192,6 +192,16 @@ which can be mutated in place.
192
192
  **Import:** `import { pagePathFromTitle } from "webiny/admin/website-builder"`
193
193
  **Source:** `@webiny/app-website-builder/index.ts`
194
194
 
195
+ ---
196
+ **Name:** `PageSettingsGroup`
197
+ **Import:** `import { PageSettingsGroup } from "webiny/admin/website-builder/page/editor"`
198
+ **Source:** `@webiny/app-website-builder/modules/pages/PageEditor/PageSettings/index.ts`
199
+
200
+ ---
201
+ **Name:** `PageSettingsGroupModifier`
202
+ **Import:** `import { PageSettingsGroupModifier } from "webiny/admin/website-builder/page/editor"`
203
+ **Source:** `@webiny/app-website-builder/modules/pages/PageEditor/PageSettings/index.ts`
204
+
195
205
  ---
196
206
  **Name:** `PageType`
197
207
  **Import:** `import { PageType } from "webiny/admin/website-builder"`
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: webiny-api-mailer-catalog
3
+ context: webiny-api
4
+ description: >
5
+ api/mailer — 11 abstractions.
6
+ ---
7
+
8
+ # api/mailer
9
+
10
+ ## How to Use
11
+
12
+ 1. Find the abstraction you need below
13
+ 2. You MUST read the source file to get the exact interface and types!
14
+ 3. Import: `import { Name } from "<importPath>";`
15
+ 4. See `webiny-use-case-pattern` or `webiny-event-handler-pattern` skills for implementation patterns
16
+
17
+ ## Abstractions
18
+
19
+ ---
20
+ **Name:** `GetSettingsRepository`
21
+ **Import:** `import { GetSettingsRepository } from "webiny/api/mailer"`
22
+ **Source:** `@webiny/api-mailer/features/GetSettings/index.ts`
23
+
24
+ ---
25
+ **Name:** `GetSettingsUseCase`
26
+ **Import:** `import { GetSettingsUseCase } from "webiny/api/mailer"`
27
+ **Source:** `@webiny/api-mailer/features/GetSettings/index.ts`
28
+
29
+ ---
30
+ **Name:** `MailAfterSendEventHandler`
31
+ **Import:** `import { MailAfterSendEventHandler } from "webiny/api/mailer"`
32
+ **Source:** `@webiny/api-mailer/features/SendMail/index.ts`
33
+
34
+ ---
35
+ **Name:** `MailBeforeSendEventHandler`
36
+ **Import:** `import { MailBeforeSendEventHandler } from "webiny/api/mailer"`
37
+ **Source:** `@webiny/api-mailer/features/SendMail/index.ts`
38
+
39
+ ---
40
+ **Name:** `MailerService`
41
+ **Import:** `import { MailerService } from "webiny/api/mailer"`
42
+ **Source:** `@webiny/api-mailer/domain/MailerService/abstractions.ts`
43
+
44
+ ---
45
+ **Name:** `MailerSettingsAfterSaveEventHandler`
46
+ **Import:** `import { MailerSettingsAfterSaveEventHandler } from "webiny/api/mailer"`
47
+ **Source:** `@webiny/api-mailer/features/SaveSettings/index.ts`
48
+
49
+ ---
50
+ **Name:** `MailerSettingsBeforeSaveEventHandler`
51
+ **Import:** `import { MailerSettingsBeforeSaveEventHandler } from "webiny/api/mailer"`
52
+ **Source:** `@webiny/api-mailer/features/SaveSettings/index.ts`
53
+
54
+ ---
55
+ **Name:** `MailSendErrorEventHandler`
56
+ **Import:** `import { MailSendErrorEventHandler } from "webiny/api/mailer"`
57
+ **Source:** `@webiny/api-mailer/features/SendMail/index.ts`
58
+
59
+ ---
60
+ **Name:** `SaveSettingsRepository`
61
+ **Import:** `import { SaveSettingsRepository } from "webiny/api/mailer"`
62
+ **Source:** `@webiny/api-mailer/features/SaveSettings/index.ts`
63
+
64
+ ---
65
+ **Name:** `SaveSettingsUseCase`
66
+ **Import:** `import { SaveSettingsUseCase } from "webiny/api/mailer"`
67
+ **Source:** `@webiny/api-mailer/features/SaveSettings/index.ts`
68
+
69
+ ---
70
+ **Name:** `SendMailUseCase`
71
+ **Import:** `import { SendMailUseCase } from "webiny/api/mailer"`
72
+ **Source:** `@webiny/api-mailer/features/SendMail/index.ts`
73
+
74
+ ---