@dotcms/angular 26.8.3-1 → 26.8.3-1-next.2478

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 (71) hide show
  1. package/fesm2022/dotcms-angular.mjs +195 -157
  2. package/fesm2022/dotcms-angular.mjs.map +1 -1
  3. package/package.json +7 -6
  4. package/types/dotcms-angular.d.ts +484 -0
  5. package/types/dotcms-angular.d.ts.map +1 -0
  6. package/dotcms-angular.d.ts.map +0 -1
  7. package/index.d.ts +0 -6
  8. package/lib/components/dotcms-block-editor-renderer/blocks/audio.component.d.ts +0 -12
  9. package/lib/components/dotcms-block-editor-renderer/blocks/audio.component.d.ts.map +0 -1
  10. package/lib/components/dotcms-block-editor-renderer/blocks/code.component.d.ts +0 -10
  11. package/lib/components/dotcms-block-editor-renderer/blocks/code.component.d.ts.map +0 -1
  12. package/lib/components/dotcms-block-editor-renderer/blocks/dot-contentlet.component.d.ts +0 -34
  13. package/lib/components/dotcms-block-editor-renderer/blocks/dot-contentlet.component.d.ts.map +0 -1
  14. package/lib/components/dotcms-block-editor-renderer/blocks/grid-block.component.d.ts +0 -13
  15. package/lib/components/dotcms-block-editor-renderer/blocks/grid-block.component.d.ts.map +0 -1
  16. package/lib/components/dotcms-block-editor-renderer/blocks/image.component.d.ts +0 -25
  17. package/lib/components/dotcms-block-editor-renderer/blocks/image.component.d.ts.map +0 -1
  18. package/lib/components/dotcms-block-editor-renderer/blocks/list.component.d.ts +0 -14
  19. package/lib/components/dotcms-block-editor-renderer/blocks/list.component.d.ts.map +0 -1
  20. package/lib/components/dotcms-block-editor-renderer/blocks/table.component.d.ts +0 -15
  21. package/lib/components/dotcms-block-editor-renderer/blocks/table.component.d.ts.map +0 -1
  22. package/lib/components/dotcms-block-editor-renderer/blocks/text.component.d.ts +0 -28
  23. package/lib/components/dotcms-block-editor-renderer/blocks/text.component.d.ts.map +0 -1
  24. package/lib/components/dotcms-block-editor-renderer/blocks/unknown.component.d.ts +0 -18
  25. package/lib/components/dotcms-block-editor-renderer/blocks/unknown.component.d.ts.map +0 -1
  26. package/lib/components/dotcms-block-editor-renderer/blocks/video.component.d.ts +0 -10
  27. package/lib/components/dotcms-block-editor-renderer/blocks/video.component.d.ts.map +0 -1
  28. package/lib/components/dotcms-block-editor-renderer/dotcms-block-editor-renderer.component.d.ts +0 -48
  29. package/lib/components/dotcms-block-editor-renderer/dotcms-block-editor-renderer.component.d.ts.map +0 -1
  30. package/lib/components/dotcms-block-editor-renderer/item/dotcms-block-editor-item.component.d.ts +0 -12
  31. package/lib/components/dotcms-block-editor-renderer/item/dotcms-block-editor-item.component.d.ts.map +0 -1
  32. package/lib/components/dotcms-block-editor-renderer-semantic/blocks/semantic-blocks.component.d.ts +0 -40
  33. package/lib/components/dotcms-block-editor-renderer-semantic/blocks/semantic-blocks.component.d.ts.map +0 -1
  34. package/lib/components/dotcms-block-editor-renderer-semantic/dotcms-block-editor-renderer-native.component.d.ts +0 -73
  35. package/lib/components/dotcms-block-editor-renderer-semantic/dotcms-block-editor-renderer-native.component.d.ts.map +0 -1
  36. package/lib/components/dotcms-editable-text/dotcms-editable-text.component.d.ts +0 -143
  37. package/lib/components/dotcms-editable-text/dotcms-editable-text.component.d.ts.map +0 -1
  38. package/lib/components/dotcms-editable-text/utils.d.ts +0 -7
  39. package/lib/components/dotcms-editable-text/utils.d.ts.map +0 -1
  40. package/lib/components/dotcms-layout-body/components/column/column.component.d.ts +0 -21
  41. package/lib/components/dotcms-layout-body/components/column/column.component.d.ts.map +0 -1
  42. package/lib/components/dotcms-layout-body/components/container/components/container-not-found/container-not-found.component.d.ts +0 -27
  43. package/lib/components/dotcms-layout-body/components/container/components/container-not-found/container-not-found.component.d.ts.map +0 -1
  44. package/lib/components/dotcms-layout-body/components/container/components/empty-container/empty-container.component.d.ts +0 -23
  45. package/lib/components/dotcms-layout-body/components/container/components/empty-container/empty-container.component.d.ts.map +0 -1
  46. package/lib/components/dotcms-layout-body/components/container/container.component.d.ts +0 -28
  47. package/lib/components/dotcms-layout-body/components/container/container.component.d.ts.map +0 -1
  48. package/lib/components/dotcms-layout-body/components/contentlet/contentlet.component.d.ts +0 -43
  49. package/lib/components/dotcms-layout-body/components/contentlet/contentlet.component.d.ts.map +0 -1
  50. package/lib/components/dotcms-layout-body/components/fallback-component/fallback-component.component.d.ts +0 -16
  51. package/lib/components/dotcms-layout-body/components/fallback-component/fallback-component.component.d.ts.map +0 -1
  52. package/lib/components/dotcms-layout-body/components/page-error-message/page-error-message.component.d.ts +0 -13
  53. package/lib/components/dotcms-layout-body/components/page-error-message/page-error-message.component.d.ts.map +0 -1
  54. package/lib/components/dotcms-layout-body/components/row/row.component.d.ts +0 -24
  55. package/lib/components/dotcms-layout-body/components/row/row.component.d.ts.map +0 -1
  56. package/lib/components/dotcms-layout-body/dotcms-layout-body.component.d.ts +0 -30
  57. package/lib/components/dotcms-layout-body/dotcms-layout-body.component.d.ts.map +0 -1
  58. package/lib/directives/dotcms-show-when/dotcms-show-when.directive.d.ts +0 -21
  59. package/lib/directives/dotcms-show-when/dotcms-show-when.directive.d.ts.map +0 -1
  60. package/lib/models/index.d.ts +0 -39
  61. package/lib/models/index.d.ts.map +0 -1
  62. package/lib/providers/dotcms-client/dotcms-client.provider.d.ts +0 -109
  63. package/lib/providers/dotcms-client/dotcms-client.provider.d.ts.map +0 -1
  64. package/lib/providers/dotcms-image-loader/dotcms-image_loader.d.ts +0 -21
  65. package/lib/providers/dotcms-image-loader/dotcms-image_loader.d.ts.map +0 -1
  66. package/lib/services/dotcms-editable-page.service.d.ts +0 -40
  67. package/lib/services/dotcms-editable-page.service.d.ts.map +0 -1
  68. package/lib/store/dotcms.store.d.ts +0 -51
  69. package/lib/store/dotcms.store.d.ts.map +0 -1
  70. package/public_api.d.ts +0 -10
  71. package/public_api.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotcms/angular",
3
- "version": "26.08.03-01",
3
+ "version": "26.8.3-1-next.2478",
4
4
  "peerDependencies": {
5
5
  "rxjs": ">=7.0.0",
6
6
  "@angular/common": ">=17.0.0",
@@ -9,8 +9,8 @@
9
9
  },
10
10
  "dependencies": {
11
11
  "@tinymce/tinymce-angular": "9.0.0",
12
- "@dotcms/client": "26.08.03-01",
13
- "@dotcms/uve": "26.08.03-01",
12
+ "@dotcms/client": "26.8.3-1-next.2478",
13
+ "@dotcms/uve": "26.8.3-1-next.2478",
14
14
  "tslib": "^2.3.0"
15
15
  },
16
16
  "description": "Official Angular Components library to render a dotCMS page.",
@@ -34,15 +34,16 @@
34
34
  },
35
35
  "homepage": "https://github.com/dotCMS/core/tree/main/core-web/libs/sdk/angular/README.md",
36
36
  "module": "fesm2022/dotcms-angular.mjs",
37
- "typings": "index.d.ts",
37
+ "typings": "types/dotcms-angular.d.ts",
38
38
  "exports": {
39
39
  "./package.json": {
40
40
  "default": "./package.json"
41
41
  },
42
42
  ".": {
43
- "types": "./index.d.ts",
43
+ "types": "./types/dotcms-angular.d.ts",
44
44
  "default": "./fesm2022/dotcms-angular.mjs"
45
45
  }
46
46
  },
47
- "sideEffects": false
47
+ "sideEffects": false,
48
+ "type": "module"
48
49
  }
@@ -0,0 +1,484 @@
1
+ import { UVE_MODE, DotCMSClientConfig, DotHttpClient, DotCMSBasicContentlet, BlockEditorNode, BlockEditorMark, DotCMSPageAsset, DotCMSPageRendererMode, DotPageAssetLayoutRow, DotCMSExtendedPageResponse, DotCMSComposedPageResponse } from '@dotcms/types';
2
+ import * as i0 from '@angular/core';
3
+ import { Provider, EnvironmentProviders, OnInit, OnChanges, Type } from '@angular/core';
4
+ import { HttpClient } from '@angular/common/http';
5
+ import { createDotCMSClient } from '@dotcms/client';
6
+ import { EditorComponent } from '@tinymce/tinymce-angular';
7
+ import { BlockEditorState, BlockEditorDefaultBlocks } from '@dotcms/types/internal';
8
+ import { Observable } from 'rxjs';
9
+
10
+ /**
11
+ * Directive to show a template when the UVE is in a specific mode.
12
+ *
13
+ * @example
14
+ * <div *dotCMSShowWhen="UVE_MODE.EDIT">
15
+ * This will be shown when the UVE is in edit mode.
16
+ * </div>
17
+ *
18
+ * @export
19
+ * @class DotCMSShowWhenDirective
20
+ */
21
+ declare class DotCMSShowWhenDirective {
22
+ #private;
23
+ set dotCMSShowWhen(value: UVE_MODE);
24
+ private updateViewContainer;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<DotCMSShowWhenDirective, never>;
26
+ static ɵdir: i0.ɵɵDirectiveDeclaration<DotCMSShowWhenDirective, "[dotCMSShowWhen]", never, { "dotCMSShowWhen": { "alias": "dotCMSShowWhen"; "required": false; }; }, {}, never, never, true, never>;
27
+ }
28
+
29
+ /**
30
+ * Provides a DotCMS image loader configuration for the Angular Image directive
31
+ *
32
+ * @param path - The base URL path to the DotCMS instance, or empty to use current site
33
+ * @returns An array of providers for the IMAGE_LOADER token
34
+ * @throws Error if the provided path is invalid
35
+ * @example
36
+ * ```typescript
37
+ * // In your app.config.ts
38
+ * export const appConfig: ApplicationConfig = {
39
+ * providers: [
40
+ * provideDotCMSImageLoader('https://demo.dotcms.com')
41
+ * // Or use current site:
42
+ * // provideDotCMSImageLoader()
43
+ * ]
44
+ * };
45
+ * ```
46
+ */
47
+ declare function provideDotCMSImageLoader(path?: string): Provider[];
48
+
49
+ /**
50
+ * Type alias for the return type of createDotCMSClient function.
51
+ * Used to ensure type consistency across the DotCMSClient interface and class.
52
+ */
53
+ type ClientType = ReturnType<typeof createDotCMSClient>;
54
+ /**
55
+ * Interface that extends the client type created by createDotCMSClient.
56
+ * This interface provides type safety and IntelliSense support for the DotCMS client
57
+ * when used as a dependency injection token in Angular applications.
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * dotcmsClient = inject(DotCMSClient);
62
+ * ```
63
+ */
64
+ interface DotCMSClient extends ClientType {
65
+ }
66
+ declare class DotCMSClient {
67
+ constructor(client: ClientType);
68
+ }
69
+ /**
70
+ * Provides Angular environment providers for the DotCMS client.
71
+ *
72
+ * Registers a singleton DotCMS client instance in the Angular dependency injection system,
73
+ * configured with the given options. This allows you to inject `DotCMSClient` anywhere
74
+ * in your app using Angular's `inject()` function.
75
+ *
76
+ * Should be added to the application's providers (e.g., in `main.ts` or `app.config.ts`).
77
+ *
78
+ * @param options - Configuration for the DotCMS client.
79
+ * @param options.dotcmsUrl - The base URL for the DotCMS instance (required).
80
+ * @param options.authToken - Authentication token for API requests (required).
81
+ * @param options.siteId - The site identifier (optional).
82
+ * @param options.requestOptions - Additional fetch options (optional).
83
+ * @param options.httpClient - Optional factory for a custom HTTP client, receives Angular's HttpClient.
84
+ * @returns Angular environment providers for the DotCMS client.
85
+ *
86
+ * @example
87
+ * import { provideDotCMSClient } from '@dotcms/angular';
88
+ *
89
+ * bootstrapApplication(AppComponent, {
90
+ * providers: [
91
+ * provideDotCMSClient({
92
+ * dotcmsUrl: 'https://demo.dotcms.com',
93
+ * authToken: 'your-auth-token',
94
+ * siteId: 'your-site-id',
95
+ * httpClient: (http) => new AngularHttpClient(http)
96
+ * })
97
+ * ]
98
+ * });
99
+ */
100
+ declare function provideDotCMSClient(options: DotCMSAngularProviderConfig): EnvironmentProviders;
101
+ /**
102
+ * Configuration interface for the DotCMS Angular provider.
103
+ *
104
+ * Extends the base `DotCMSClientConfig` but replaces the `httpClient` property
105
+ * with an Angular-specific factory function that receives Angular's `HttpClient`
106
+ * and returns a `DotHttpClient` implementation.
107
+ *
108
+ * This interface is designed to work seamlessly with Angular's dependency injection
109
+ * system, allowing you to leverage Angular's built-in HTTP client while maintaining
110
+ * compatibility with the DotCMS client's expected interface.
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const config: DotCMSAngularProviderConfig = {
115
+ * dotcmsUrl: 'https://demo.dotcms.com',
116
+ * authToken: 'your-auth-token',
117
+ * siteId: 'your-site-id',
118
+ * httpClient: (http: HttpClient) => new AngularHttpClient(http)
119
+ * };
120
+ * ```
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * // Using with provideDotCMSClient
125
+ * provideDotCMSClient({
126
+ * dotcmsUrl: 'https://demo.dotcms.com',
127
+ * authToken: 'your-auth-token',
128
+ * httpClient: (http) => new AngularHttpClient(http)
129
+ * })
130
+ * ```
131
+ */
132
+ interface DotCMSAngularProviderConfig extends Omit<DotCMSClientConfig, 'httpClient'> {
133
+ /**
134
+ * Optional factory function that creates a custom HTTP client implementation.
135
+ *
136
+ * This function receives Angular's `HttpClient` instance and should return
137
+ * a `DotHttpClient` implementation. If not provided, the DotCMS client will
138
+ * use its default HTTP client implementation.
139
+ *
140
+ * @param http - Angular's HttpClient instance from dependency injection
141
+ * @returns A DotHttpClient implementation
142
+ *
143
+ * @example
144
+ * ```typescript
145
+ * httpClient: (http: HttpClient) => {
146
+ * return new AngularHttpClient(http);
147
+ * }
148
+ * ```
149
+ */
150
+ httpClient?: (http: HttpClient) => DotHttpClient;
151
+ }
152
+
153
+ type DOT_EDITABLE_TEXT_MODE = 'minimal' | 'full' | 'plain';
154
+ type DOT_EDITABLE_TEXT_FORMAT = 'html' | 'text';
155
+
156
+ /** Minimal TinyMCE editor API used by this component (avoids non-portable reference to nested tinymce types). */
157
+ interface DotEditableTextEditor {
158
+ getContent(options?: {
159
+ format?: string;
160
+ }): string;
161
+ isDirty(): boolean;
162
+ setContent(content: string, options?: {
163
+ format?: string;
164
+ }): void;
165
+ focus(): void;
166
+ hasFocus(): boolean;
167
+ }
168
+ /**
169
+ * Dot editable text component.
170
+ * This component is responsible to render a text field that can be edited inline.
171
+ *
172
+ * @export
173
+ * @class DotCMSEditableTextComponent
174
+ * @implements {OnInit}
175
+ * @implements {OnChanges}
176
+ */
177
+ declare class DotCMSEditableTextComponent<T extends DotCMSBasicContentlet> implements OnInit, OnChanges {
178
+ #private;
179
+ editorComponent: EditorComponent;
180
+ /**
181
+ * Represents the mode of the editor which can be `plain`, `minimal`, or `full`
182
+ *
183
+ * @type {DOT_EDITABLE_TEXT_MODE}
184
+ * @memberof DotCMSEditableTextComponent
185
+ */
186
+ mode: DOT_EDITABLE_TEXT_MODE;
187
+ /**
188
+ * Represents the format of the editor which can be `text` or `html`
189
+ *
190
+ * @type {DOT_EDITABLE_TEXT_FORMAT}
191
+ * @memberof DotCMSEditableTextComponent
192
+ */
193
+ format: DOT_EDITABLE_TEXT_FORMAT;
194
+ /**
195
+ * Represents the `contentlet` that can be inline edited
196
+ *
197
+ * @type {DotCMSContentlet}
198
+ * @memberof DotCMSEditableTextComponent
199
+ */
200
+ contentlet: T;
201
+ /**
202
+ * Represents the field name of the `contentlet` that can be edited
203
+ *
204
+ * @memberof DotCMSEditableTextComponent
205
+ */
206
+ fieldName: keyof T;
207
+ /**
208
+ * Represents the content of the `contentlet` that can be edited
209
+ *
210
+ * @protected
211
+ * @memberof DotCMSEditableTextComponent
212
+ */
213
+ protected content: string;
214
+ /**
215
+ * Represents the configuration of the editor
216
+ *
217
+ * @protected
218
+ * @type {EditorComponent['init']}
219
+ * @memberof DotCMSEditableTextComponent
220
+ */
221
+ protected init: EditorComponent['init'];
222
+ /**
223
+ * The TinyMCE editor
224
+ *
225
+ * @readonly
226
+ * @memberof DotCMSEditableTextComponent
227
+ */
228
+ get editor(): DotEditableTextEditor | undefined;
229
+ /**
230
+ * Represents if the component is inside the editor
231
+ *
232
+ * @protected
233
+ * @type {boolean}
234
+ * @memberof DotCMSEditableTextComponent
235
+ */
236
+ protected get isEditMode(): string | false | null | undefined;
237
+ /**
238
+ * Returns the number of pages the contentlet is on
239
+ *
240
+ * @readonly
241
+ * @memberof DotCMSEditableTextComponent
242
+ */
243
+ get onNumberOfPages(): string | 1;
244
+ /**
245
+ * Handle copy contentlet inline editing success event
246
+ *
247
+ * @param {MessageEvent} { data }
248
+ * @return {*}
249
+ * @memberof DotCMSEditableTextComponent
250
+ */
251
+ onMessage({ data }: MessageEvent): void;
252
+ ngOnInit(): void;
253
+ ngOnChanges(): void;
254
+ /**
255
+ * Handle mouse down event
256
+ *
257
+ * @param {{ event: MouseEvent }} { event }
258
+ * @return {*}
259
+ * @memberof DotCMSEditableTextComponent
260
+ */
261
+ onMouseDown({ event }: {
262
+ event: MouseEvent;
263
+ }): void;
264
+ /**
265
+ * Handle focus out event
266
+ *
267
+ * @return {*}
268
+ * @memberof DotCMSEditableTextComponent
269
+ */
270
+ onFocusOut(): void;
271
+ /**
272
+ * inner HTML to element
273
+ *
274
+ * @private
275
+ * @param {string} editedContent
276
+ * @return {*}
277
+ * @memberof DotCMSEditableTextComponent
278
+ */
279
+ private innerHTMLToElement;
280
+ /**
281
+ * Check if the content has changed
282
+ *
283
+ * @private
284
+ * @param {string} editedContent
285
+ * @return {*}
286
+ * @memberof DotCMSEditableTextComponent
287
+ */
288
+ private didContentChange;
289
+ static ɵfac: i0.ɵɵFactoryDeclaration<DotCMSEditableTextComponent<any>, never>;
290
+ static ɵcmp: i0.ɵɵComponentDeclaration<DotCMSEditableTextComponent<any>, "dotcms-editable-text", never, { "mode": { "alias": "mode"; "required": false; }; "format": { "alias": "format"; "required": false; }; "contentlet": { "alias": "contentlet"; "required": false; }; "fieldName": { "alias": "fieldName"; "required": false; }; }, {}, never, never, true, never>;
291
+ }
292
+
293
+ /**
294
+ * Represents a dynamic component entity.
295
+ * @typedef {Promise<Type<any>>} DynamicComponentEntity
296
+ * @memberof @dotcms/angular
297
+ */
298
+ type DynamicComponentEntity = Promise<Type<any>>;
299
+ /**
300
+ * Represents a DotCMS page component.
301
+ * Used to store the dynamic components of a DotCMS page.
302
+ * @typedef {Record<string, DynamicComponentEntity>} DotCMSPageComponent
303
+ * @memberof @dotcms/angular
304
+ */
305
+ type DotCMSPageComponent = Record<string, DynamicComponentEntity>;
306
+
307
+ /**
308
+ * Represents a Custom Renderer used by the Block Editor Component
309
+ *
310
+ * @export
311
+ * @interface CustomRenderer
312
+ */
313
+ type CustomRenderer = Record<string, DynamicComponentEntity>;
314
+ /**
315
+ * A component that renders content from DotCMS's Block Editor field.
316
+ *
317
+ * This component provides an easy way to render Block Editor content in your Angular applications.
318
+ * It handles the rendering of standard blocks and allows customization through custom renderers.
319
+ *
320
+ * For more information about Block Editor, see {@link https://dev.dotcms.com/docs/block-editor}
321
+ *
322
+ * @example
323
+ * ```html
324
+ * <dotcms-block-editor-renderer
325
+ * [blocks]="myBlockEditorContent"
326
+ * [customRenderers]="myCustomRenderers">
327
+ * </dotcms-block-editor-renderer>
328
+ * ```
329
+ *
330
+ * @deprecated Use {@link DotCMSBlockEditorRendererNativeComponent}
331
+ * (`<dotcms-block-editor-renderer-native>`) for accessible, semantic DOM output.
332
+ * This component wraps every semantic tag in a custom element (e.g. a dispatcher
333
+ * element sits between `<ul>` and its `<li>` children), which breaks the
334
+ * `list → listitem` relationship required by the HTML spec and assistive technology.
335
+ * The native renderer keeps the identical public input API — migration is just
336
+ * swapping the tag and import. This component is retained for backward compatibility
337
+ * and will be removed in a future major version.
338
+ */
339
+ declare class DotCMSBlockEditorRendererComponent {
340
+ blocks: BlockEditorNode;
341
+ customRenderers: CustomRenderer | undefined;
342
+ class: string | undefined;
343
+ style: string | Record<string, string> | undefined;
344
+ $blockEditorState: i0.WritableSignal<BlockEditorState>;
345
+ $isInEditMode: i0.WritableSignal<boolean>;
346
+ ngOnInit(): void;
347
+ static ɵfac: i0.ɵɵFactoryDeclaration<DotCMSBlockEditorRendererComponent, never>;
348
+ static ɵcmp: i0.ɵɵComponentDeclaration<DotCMSBlockEditorRendererComponent, "dotcms-block-editor-renderer", never, { "blocks": { "alias": "blocks"; "required": false; }; "customRenderers": { "alias": "customRenderers"; "required": false; }; "class": { "alias": "class"; "required": false; }; "style": { "alias": "style"; "required": false; }; }, {}, never, never, true, never>;
349
+ }
350
+
351
+ /**
352
+ * An accessible component that renders content from DotCMS's Block Editor field.
353
+ *
354
+ * This is the semantic-DOM successor to {@link DotCMSBlockEditorRendererComponent}.
355
+ * It emits clean semantic HTML — `<ul><li><p>…</p></li></ul>` — with no custom
356
+ * wrapper elements between semantic tags, so the `list → listitem` relationship
357
+ * required by the HTML spec and assistive technology is preserved. The recursive
358
+ * dispatch is performed with `ng-template` outlets, whose host `<ng-container>`s
359
+ * render as HTML comment nodes (invisible to the accessibility tree).
360
+ *
361
+ * It exposes the **identical public input API** and the same `customRenderers`
362
+ * contract as the deprecated renderer, so migration is just swapping the tag and
363
+ * import.
364
+ *
365
+ * For more information about Block Editor, see {@link https://dev.dotcms.com/docs/block-editor}
366
+ *
367
+ * @example
368
+ * ```html
369
+ * <dotcms-block-editor-renderer-native
370
+ * [blocks]="myBlockEditorContent"
371
+ * [customRenderers]="myCustomRenderers">
372
+ * </dotcms-block-editor-renderer-native>
373
+ * ```
374
+ */
375
+ declare class DotCMSBlockEditorRendererNativeComponent implements OnInit {
376
+ /** The Block Editor `doc` node to render. */
377
+ readonly blocks: i0.InputSignal<BlockEditorNode | undefined>;
378
+ /** Map of `node.type` → component to override the built-in render path. */
379
+ readonly customRenderers: i0.InputSignal<CustomRenderer | undefined>;
380
+ /**
381
+ * CSS class on the wrapper element. Aliased as `class` so consumers can
382
+ * pass `[class]="…"` like a normal Angular class binding.
383
+ */
384
+ readonly cssClass: i0.InputSignal<string | undefined>;
385
+ /** Inline style on the wrapper element. */
386
+ readonly style: i0.InputSignal<string | Record<string, string> | undefined>;
387
+ $blockEditorState: i0.WritableSignal<BlockEditorState>;
388
+ $isInEditMode: i0.WritableSignal<boolean>;
389
+ protected readonly BLOCKS: typeof BlockEditorDefaultBlocks;
390
+ ngOnInit(): void;
391
+ /**
392
+ * Normalizes a heading `level` attribute (which may be a number such as `6`
393
+ * or a string such as `'6'`) to a string for use in the heading `@switch`.
394
+ * Returns `''` for missing or out-of-range levels so the template falls
395
+ * through to the safe `@default` case (`<h2>`).
396
+ */
397
+ asLevel(level: number | string | undefined): string;
398
+ /** The marks after the current (outermost) one — used to recurse inward. */
399
+ restMarks(marks: BlockEditorMark[] | undefined): BlockEditorMark[];
400
+ /** The attributes of the current (outermost) mark. */
401
+ markAttrs(marks: BlockEditorMark[] | undefined): Record<string, string>;
402
+ /**
403
+ * Wrapper style for a `dotImage` `<figure>`, derived from the node's
404
+ * `textWrap` (float left/right) or `textAlign` attribute.
405
+ */
406
+ imageStyle(attrs: BlockEditorNode['attrs']): Record<string, string>;
407
+ /** Poster URL for a `dotVideo` `<video>` (from `attrs.data.thumbnail`). */
408
+ videoPoster(attrs: BlockEditorNode['attrs']): string | undefined;
409
+ /**
410
+ * The column span (1–12) for a grid column. Falls back to `6` for malformed
411
+ * `columns` attrs or for an out-of-range column index, matching the legacy
412
+ * renderer.
413
+ */
414
+ columnSpan(attrs: BlockEditorNode['attrs'], index: number): number;
415
+ static ɵfac: i0.ɵɵFactoryDeclaration<DotCMSBlockEditorRendererNativeComponent, never>;
416
+ static ɵcmp: i0.ɵɵComponentDeclaration<DotCMSBlockEditorRendererNativeComponent, "dotcms-block-editor-renderer-native", never, { "blocks": { "alias": "blocks"; "required": false; "isSignal": true; }; "customRenderers": { "alias": "customRenderers"; "required": false; "isSignal": true; }; "cssClass": { "alias": "class"; "required": false; "isSignal": true; }; "style": { "alias": "style"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
417
+ }
418
+
419
+ /**
420
+ * @description This component is used to render the layout for a DotCMS page.
421
+ * @param {DotCMSPageAsset} page - The page to render the layout for
422
+ * @param {DotCMSPageComponent} components - The components to render the layout for
423
+ * @param {DotCMSPageRendererMode} mode - The mode to render the layout for
424
+ *
425
+ * @example
426
+ * <dotcms-layout-body [page]="page" [components]="components" [mode]="'development'" />
427
+ *
428
+ * @export
429
+ * @implements {OnChanges}
430
+ * @class DotCMSLayoutBodyComponent
431
+ */
432
+ declare class DotCMSLayoutBodyComponent implements OnChanges {
433
+ #private;
434
+ page: DotCMSPageAsset;
435
+ components: DotCMSPageComponent;
436
+ mode: DotCMSPageRendererMode;
437
+ $isDevMode: i0.Signal<boolean>;
438
+ $rows: i0.WritableSignal<DotPageAssetLayoutRow[]>;
439
+ $isEmpty: i0.WritableSignal<boolean>;
440
+ ngOnChanges(): void;
441
+ static ɵfac: i0.ɵɵFactoryDeclaration<DotCMSLayoutBodyComponent, never>;
442
+ static ɵcmp: i0.ɵɵComponentDeclaration<DotCMSLayoutBodyComponent, "dotcms-layout-body", never, { "page": { "alias": "page"; "required": true; }; "components": { "alias": "components"; "required": true; }; "mode": { "alias": "mode"; "required": false; }; }, {}, never, never, true, never>;
443
+ }
444
+
445
+ declare class DotCMSEditablePageService {
446
+ #private;
447
+ /**
448
+ * Listens for changes to an editable page and returns an Observable that emits the updated page data.
449
+ * This method initializes the UVE (Universal Visual Editor) and sets up subscriptions to track content changes.
450
+ *
451
+ * @example
452
+ * ```ts
453
+ * // Import the service
454
+ * import { DotCMSEditablePageService } from '@dotcms/angular';
455
+ *
456
+ * // Inject the service
457
+ * constructor(private editablePageService: DotCMSEditablePageService) {}
458
+ *
459
+ * // Get the page data from your API call
460
+ * const page = await client.page.get('/');
461
+ *
462
+ * // Listen for changes
463
+ * const subscription = this.editablePageService.listen(page).subscribe(updatedPage => {
464
+ * if (updatedPage) {
465
+ * // Handle updated page data
466
+ * console.log('Page updated:', updatedPage);
467
+ * }
468
+ * });
469
+ *
470
+ * // When done listening, unsubscribe
471
+ * subscription.unsubscribe();
472
+ * ```
473
+ *
474
+ * @param response Optional initial page data
475
+ * @returns Observable that emits the updated page data or undefined
476
+ */
477
+ listen<T extends DotCMSExtendedPageResponse>(response?: DotCMSComposedPageResponse<T>): Observable<DotCMSComposedPageResponse<T> | undefined>;
478
+ static ɵfac: i0.ɵɵFactoryDeclaration<DotCMSEditablePageService, never>;
479
+ static ɵprov: i0.ɵɵInjectableDeclaration<DotCMSEditablePageService>;
480
+ }
481
+
482
+ export { DotCMSBlockEditorRendererComponent, DotCMSBlockEditorRendererNativeComponent, DotCMSClient, DotCMSEditablePageService, DotCMSEditableTextComponent, DotCMSLayoutBodyComponent, DotCMSShowWhenDirective, provideDotCMSClient, provideDotCMSImageLoader };
483
+ export type { DynamicComponentEntity };
484
+ //# sourceMappingURL=dotcms-angular.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotcms-angular.d.ts","sources":["../../../../../libs/sdk/angular/src/lib/directives/dotcms-show-when/dotcms-show-when.directive.ts","../../../../../libs/sdk/angular/src/lib/providers/dotcms-image-loader/dotcms-image_loader.ts","../../../../../libs/sdk/angular/src/lib/providers/dotcms-client/dotcms-client.provider.ts","../../../../../libs/sdk/angular/src/lib/components/dotcms-editable-text/utils.ts","../../../../../libs/sdk/angular/src/lib/components/dotcms-editable-text/dotcms-editable-text.component.ts","../../../../../libs/sdk/angular/src/lib/models/index.ts","../../../../../libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/dotcms-block-editor-renderer.component.ts","../../../../../libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer-semantic/dotcms-block-editor-renderer-native.component.ts","../../../../../libs/sdk/angular/src/lib/components/dotcms-layout-body/dotcms-layout-body.component.ts","../../../../../libs/sdk/angular/src/lib/services/dotcms-editable-page.service.ts"],"mappings":";;;;;;;;;AAKA;;;;;;;;;;AAUG;AACH,cAGa,uBAAuB;;AAIhC,8BAAmC,QAAQ;AAQ3C;yCAZS,uBAAuB;2CAAvB,uBAAuB;AAyBnC;;ACRD;;;;;;;;;;;;;;;;;AAiBG;AACH,iBAAgB,wBAAwB,iBAAiB,QAAQ;;AChDjE;;;AAGG;AACH,KAAK,UAAU,GAAG,UAAU,QAAQ,kBAAkB;AAItD;;;;;;;;;AASG;AAEG,UAAW,YAAa,SAAQ,UAAU;AAAG;AAGnD,cAAa,YAAY;AACT,wBAAQ,UAAU;AAGjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;AACH,iBAAgB,mBAAmB,UAAU,2BAA2B,GAAG,oBAAoB;AAsB/F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;AACG,UAAW,2BAA4B,SAAQ,IAAI,CAAC,kBAAkB;AACxE;;;;;;;;;;;;;;;;AAgBG;wBACiB,UAAU,KAAK,aAAa;AACnD;;AClIK,KAAM,sBAAsB;KAEtB,wBAAwB;;ACepC;AACA,UAAU,qBAAqB;;;AACa;;AAExC;;AAAyD;;;AAG5D;AAED;;;;;;;;AAQG;AACH,cAiBa,2BAA2B,WAAW,qBAAqB,aACzD,MAAM,EAAE,SAAS;;qBAEkB,eAAe;AAE7D;;;;;AAKG;UACY,sBAAsB;AACrC;;;;;AAKG;YACc,wBAAwB;AACzC;;;;;AAKG;;AAEH;;;;AAIG;;AAGH;;;;;AAKG;;AAEH;;;;;;AAMG;AACH,oBAAiB,eAAe;AAShC;;;;;AAKG;AACH,kBAAc,qBAAqB;AAInC;;;;;;AAMG;;AAOH;;;;;AAKG;AACH;AAIA;;;;;;AAMG;AAEH,wBAAoB,YAAY;;;AA8ChC;;;;;;AAMG;AACH;eAAgC,UAAU;AAAE;AAyB5C;;;;;AAKG;;AA+BH;;;;;;;AAOG;AACH;AAQA;;;;;;;AAOG;AACH;yCA3OS,2BAA2B;2CAA3B,2BAA2B;AA8OvC;;ACnSD;;;;AAIG;AACG,KAAM,sBAAsB,GAAG,OAAO,CAAC,IAAI;AA4BjD;;;;;AAKG;AACG,KAAM,mBAAmB,GAAG,MAAM,SAAS,sBAAsB;;AClCvE;;;;;AAKG;AACG,KAAM,cAAc,GAAG,MAAM,SAAS,sBAAsB;AAElE;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;AACH,cAOa,kCAAkC;YACzB,eAAe;AACxB,qBAAiB,cAAc;AAC/B;oBACgB,MAAM;AAE/B,uBAAiBA,EAAA,CAAA,cAAA,CAAA,gBAAA;AACjB,mBAAaA,EAAA,CAAA,cAAA;;yCAPJ,kCAAkC;2CAAlC,kCAAkC;AAkB9C;;AChDD;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACH,cAkBa,wCAAyC,YAAW,MAAM;;qBAEpDA,EAAA,CAAA,WAAA,CAAA,eAAA;;8BAESA,EAAA,CAAA,WAAA,CAAA,cAAA;AACxB;;;AAGG;uBACcA,EAAA,CAAA,WAAA;;oBAEHA,EAAA,CAAA,WAAA,UAAA,MAAA;AAEd,uBAAiBA,EAAA,CAAA,cAAA,CAAA,gBAAA;AACjB,mBAAaA,EAAA,CAAA,cAAA;AAEb,sCAAyB,wBAAA;;AAezB;;;;;AAKG;;;qBAOc,eAAe,iBAAiB,eAAe;;AAKhE,qBAAiB,eAAe,iBAAiB,MAAM;AAIvD;;;AAGG;AACH,sBAAkB,eAAe,YAAY,MAAM;;uBAkBhC,eAAe;AAIlC;;;;AAIG;AACH,sBAAkB,eAAe;yCAnFxB,wCAAwC;2CAAxC,wCAAwC;AA2FpD;;AC1ID;;;;;;;;;;;;AAYG;AACH,cAgBa,yBAA0B,YAAW,SAAS;;UACrB,eAAe;gBACV,mBAAmB;UAC3C,sBAAsB;AAIrC,gBAAUA,EAAA,CAAA,MAAA;AAEV,WAAKA,EAAA,CAAA,cAAA,CAAA,qBAAA;AAEL,cAAQA,EAAA,CAAA,cAAA;;yCAXC,yBAAyB;2CAAzB,yBAAyB;AAwBrC;;ACtDD,cAGa,yBAAyB;;AAmBlC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BG;qBACc,0BAA0B,aAC5B,0BAA0B,MACtC,UAAU,CAAC,0BAA0B;yCAnD/B,yBAAyB;6CAAzB,yBAAyB;AA8FrC;;;;","names":["_angular_core"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dotcms-angular.d.ts","sourceRoot":"","sources":["../../../../libs/sdk/angular/src/dotcms-angular.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,cAAc,cAAc,CAAC"}
package/index.d.ts DELETED
@@ -1,6 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="@dotcms/angular" />
5
- export * from './public_api';
6
- //# sourceMappingURL=dotcms-angular.d.ts.map
@@ -1,12 +0,0 @@
1
- import { BlockEditorNode } from '@dotcms/types';
2
- import * as i0 from "@angular/core";
3
- /**
4
- * Renders a dotCMS audio block as a native `<audio>` element. Mirrors {@link DotVideoBlock}
5
- * but without poster/width/height, which are not meaningful for audio.
6
- */
7
- export declare class DotAudioBlock {
8
- attrs: BlockEditorNode['attrs'];
9
- static ɵfac: i0.ɵɵFactoryDeclaration<DotAudioBlock, never>;
10
- static ɵcmp: i0.ɵɵComponentDeclaration<DotAudioBlock, "dotcms-block-editor-renderer-audio", never, { "attrs": { "alias": "attrs"; "required": false; }; }, {}, never, never, true, never>;
11
- }
12
- //# sourceMappingURL=audio.component.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audio.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/audio.component.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;;AAEhD;;;GAGG;AACH,qBAYa,aAAa;IACb,KAAK,EAAG,eAAe,CAAC,OAAO,CAAC,CAAC;yCADjC,aAAa;2CAAb,aAAa;CAEzB"}
@@ -1,10 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- export declare class DotCodeBlock {
3
- static ɵfac: i0.ɵɵFactoryDeclaration<DotCodeBlock, never>;
4
- static ɵcmp: i0.ɵɵComponentDeclaration<DotCodeBlock, "dotcms-block-editor-renderer-code-block", never, {}, {}, never, ["*"], true, never>;
5
- }
6
- export declare class DotBlockQuote {
7
- static ɵfac: i0.ɵɵFactoryDeclaration<DotBlockQuote, never>;
8
- static ɵcmp: i0.ɵɵComponentDeclaration<DotBlockQuote, "dotcms-block-editor-renderer-block-quote", never, {}, {}, never, ["*"], true, never>;
9
- }
10
- //# sourceMappingURL=code.component.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"code.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/code.component.ts"],"names":[],"mappings":";AAEA,qBAWa,YAAY;yCAAZ,YAAY;2CAAZ,YAAY;CAAG;AAE5B,qBASa,aAAa;yCAAb,aAAa;2CAAb,aAAa;CAAG"}
@@ -1,34 +0,0 @@
1
- import { BlockEditorNode } from '@dotcms/types';
2
- import { DynamicComponentEntity } from '../../../models';
3
- import { CustomRenderer } from '../dotcms-block-editor-renderer.component';
4
- import * as i0 from "@angular/core";
5
- export declare class NoComponentProvided {
6
- contentType: string | undefined;
7
- protected readonly style: {
8
- backgroundColor: string;
9
- color: string;
10
- padding: string;
11
- borderRadius: string;
12
- marginBottom: string;
13
- marginTop: string;
14
- border: string;
15
- };
16
- static ɵfac: i0.ɵɵFactoryDeclaration<NoComponentProvided, never>;
17
- static ɵcmp: i0.ɵɵComponentDeclaration<NoComponentProvided, "dotcms-no-component-provided", never, { "contentType": { "alias": "contentType"; "required": false; }; }, {}, never, never, true, never>;
18
- }
19
- /**
20
- * DotContent component that renders content based on content type
21
- */
22
- export declare class DotContentletBlock {
23
- customRenderers: CustomRenderer | undefined;
24
- node: BlockEditorNode | undefined;
25
- contentComponent: DynamicComponentEntity | undefined;
26
- protected readonly $data: import("@angular/core").Signal<any>;
27
- private readonly DOT_CONTENT_NO_DATA_MESSAGE;
28
- private readonly DOT_CONTENT_NO_MATCHING_COMPONENT_MESSAGE;
29
- protected get isDevMode(): boolean;
30
- ngOnInit(): void;
31
- static ɵfac: i0.ɵɵFactoryDeclaration<DotContentletBlock, never>;
32
- static ɵcmp: i0.ɵɵComponentDeclaration<DotContentletBlock, "dotcms-block-editor-renderer-contentlet", never, { "customRenderers": { "alias": "customRenderers"; "required": false; }; "node": { "alias": "node"; "required": false; }; }, {}, never, never, true, never>;
33
- }
34
- //# sourceMappingURL=dot-contentlet.component.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dot-contentlet.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/dot-contentlet.component.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAY,MAAM,eAAe,CAAC;AAG1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;;AAE3E,qBAqBa,mBAAmB;IACnB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,SAAS,CAAC,QAAQ,CAAC,KAAK;;;;;;;;MAQtB;yCAVO,mBAAmB;2CAAnB,mBAAmB;CAW/B;AAED;;GAEG;AACH,qBAYa,kBAAkB;IAClB,eAAe,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;IAE3C,gBAAgB,EAAE,sBAAsB,GAAG,SAAS,CAAC;IACrD,SAAS,CAAC,QAAQ,CAAC,KAAK,sCAA8C;IAEtE,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAC0I;IACtL,OAAO,CAAC,QAAQ,CAAC,yCAAyC,CAC0G;IACpK,SAAS,KAAK,SAAS,YAEtB;IAED,QAAQ;yCAfC,kBAAkB;2CAAlB,kBAAkB;CA6B9B"}
@@ -1,13 +0,0 @@
1
- import { BlockEditorNode } from '@dotcms/types';
2
- import { CustomRenderer } from '../dotcms-block-editor-renderer.component';
3
- import { DotCMSBlockEditorItemComponent } from '../item/dotcms-block-editor-item.component';
4
- import * as i0 from "@angular/core";
5
- export declare class DotGridBlock {
6
- node: BlockEditorNode | undefined;
7
- customRenderers: CustomRenderer | undefined;
8
- blockEditorItem: typeof DotCMSBlockEditorItemComponent;
9
- get columnSpans(): number[];
10
- static ɵfac: i0.ɵɵFactoryDeclaration<DotGridBlock, never>;
11
- static ɵcmp: i0.ɵɵComponentDeclaration<DotGridBlock, "dotcms-block-editor-renderer-grid-block", never, { "node": { "alias": "node"; "required": false; }; "customRenderers": { "alias": "customRenderers"; "required": false; }; }, {}, never, never, true, never>;
12
- }
13
- //# sourceMappingURL=grid-block.component.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"grid-block.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/grid-block.component.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAC3E,OAAO,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAC;;AAE5F,qBAyBa,YAAY;IACZ,IAAI,EAAE,eAAe,GAAG,SAAS,CAAC;IAClC,eAAe,EAAE,cAAc,GAAG,SAAS,CAAC;IAErD,eAAe,wCAAkC;IAEjD,IAAI,WAAW,IAAI,MAAM,EAAE,CAS1B;yCAfQ,YAAY;2CAAZ,YAAY;CAgBxB"}
@@ -1,25 +0,0 @@
1
- import { BlockEditorNode } from '@dotcms/types';
2
- import * as i0 from "@angular/core";
3
- export declare class DotImageBlock {
4
- attrs: BlockEditorNode['attrs'];
5
- protected readonly $srcURL: import("@angular/core").Signal<any>;
6
- protected readonly $wrapperStyle: import("@angular/core").Signal<{
7
- float: string;
8
- width: string;
9
- margin: string;
10
- 'text-align'?: undefined;
11
- } | {
12
- 'text-align': any;
13
- float?: undefined;
14
- width?: undefined;
15
- margin?: undefined;
16
- } | {
17
- float?: undefined;
18
- width?: undefined;
19
- margin?: undefined;
20
- 'text-align'?: undefined;
21
- }>;
22
- static ɵfac: i0.ɵɵFactoryDeclaration<DotImageBlock, never>;
23
- static ɵcmp: i0.ɵɵComponentDeclaration<DotImageBlock, "dotcms-block-editor-renderer-image", never, { "attrs": { "alias": "attrs"; "required": false; }; }, {}, never, never, true, never>;
24
- }
25
- //# sourceMappingURL=image.component.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"image.component.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/sdk/angular/src/lib/components/dotcms-block-editor-renderer/blocks/image.component.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;;AAEhD,qBAUa,aAAa;IACb,KAAK,EAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE1C,SAAS,CAAC,QAAQ,CAAC,OAAO,sCAAuC;IAEjE,SAAS,CAAC,QAAQ,CAAC,aAAa;;;;;;;;;;;;;;;OAa7B;yCAlBM,aAAa;2CAAb,aAAa;CAmBzB"}