@dotcms/angular 1.5.2-next.28 → 1.5.3-next.2118
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.
- package/README.md +17 -15
- package/fesm2022/dotcms-angular.mjs +244 -1
- package/fesm2022/dotcms-angular.mjs.map +1 -1
- package/lib/components/dotcms-block-editor-renderer/dotcms-block-editor-renderer.component.d.ts +9 -0
- package/lib/components/dotcms-block-editor-renderer/dotcms-block-editor-renderer.component.d.ts.map +1 -1
- package/lib/components/dotcms-block-editor-renderer-semantic/blocks/semantic-blocks.component.d.ts +40 -0
- package/lib/components/dotcms-block-editor-renderer-semantic/blocks/semantic-blocks.component.d.ts.map +1 -0
- package/lib/components/dotcms-block-editor-renderer-semantic/dotcms-block-editor-renderer-native.component.d.ts +73 -0
- package/lib/components/dotcms-block-editor-renderer-semantic/dotcms-block-editor-renderer-native.component.d.ts.map +1 -0
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/public_api.d.ts.map +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ The `@dotcms/angular` SDK is the DotCMS official Angular library. It empowers An
|
|
|
17
17
|
- [SDK Reference](#sdk-reference)
|
|
18
18
|
- [DotCMSLayoutBody](#dotcmslayoutbody)
|
|
19
19
|
- [DotCMSEditableText](#dotcmseditabletext)
|
|
20
|
-
- [
|
|
20
|
+
- [DotCMSBlockEditorRendererNative](#dotcmsblockeditorrenderernative)
|
|
21
21
|
- [DotCMSShowWhen](#dotcmsshowwhen)
|
|
22
22
|
- [DotCMSEditablePageService](#dotcmseditablepageservice)
|
|
23
23
|
- [Troubleshooting](#troubleshooting)
|
|
@@ -537,22 +537,28 @@ export class MyBannerComponent {
|
|
|
537
537
|
- Detects UVE edit mode and enables inline TinyMCE editing
|
|
538
538
|
- Triggers a `Save` [workflow action](https://dev.dotcms.com/docs/workflows) on blur without needing full content dialog.
|
|
539
539
|
|
|
540
|
-
###
|
|
540
|
+
### DotCMSBlockEditorRendererNative
|
|
541
541
|
|
|
542
|
-
`
|
|
542
|
+
`DotCMSBlockEditorRendererNative` is the recommended renderer for [Block Editor](https://dev.dotcms.com/docs/block-editor) content. It emits **clean semantic HTML** — `<ul><li><p>…</p></li></ul>` — with no custom wrapper elements between semantic tags.
|
|
543
|
+
|
|
544
|
+
> The original `DotCMSBlockEditorRenderer` is deprecated and retained for backward compatibility. See the component's TSDoc and [`MIGRATION.md`](./MIGRATION.md#migrating-to-the-semantic-block-editor-renderer) for the migration path — it's a one-line swap.
|
|
545
|
+
|
|
546
|
+
#### Why it matters
|
|
547
|
+
|
|
548
|
+
The host element is the real semantic tag (`<ul>`, `<li>`, `<p>`, `<h1>`–`<h6>`, ...) and recursion is done through `ng-template` outlets that render as HTML comment nodes (invisible to the accessibility tree), so `<li>` stays a true DOM child of `<ul>` — the relationship the HTML spec and assistive technology require, and that accessibility scanners flag when broken. This applies inside table cells and grid columns too: `<td><ul><li>…` stays intact.
|
|
543
549
|
|
|
544
550
|
| Input | Type | Required | Description |
|
|
545
551
|
|-------------------|----------------------|----------|------------------------------------------------------------------------------------------------------------|
|
|
546
|
-
| `blocks` | `
|
|
547
|
-
| `customRenderers` | `CustomRenderer`
|
|
548
|
-
| `
|
|
549
|
-
| `style` | `
|
|
552
|
+
| `blocks` | `BlockEditorNode` | ✅ | The [Block Editor](https://dev.dotcms.com/docs/block-editor) content to render |
|
|
553
|
+
| `customRenderers` | `CustomRenderer` | ❌ | Custom rendering functions for specific [block types](https://dev.dotcms.com/docs/block-editor#BlockTypes) |
|
|
554
|
+
| `class` | `string` | ❌ | CSS class to apply to the container |
|
|
555
|
+
| `style` | `string \| Record<string, string>` | ❌ | Inline styles for the container |
|
|
550
556
|
|
|
551
557
|
#### Usage
|
|
552
558
|
|
|
553
559
|
```typescript
|
|
554
560
|
import { DotCMSBasicContentlet } from '@dotcms/types';
|
|
555
|
-
import {
|
|
561
|
+
import { DotCMSBlockEditorRendererNativeComponent } from '@dotcms/angular';
|
|
556
562
|
|
|
557
563
|
const CUSTOM_RENDERERS = {
|
|
558
564
|
customBlock: import('./custom-block.component').then((c) => c.CustomBlockComponent),
|
|
@@ -561,9 +567,9 @@ const CUSTOM_RENDERERS = {
|
|
|
561
567
|
|
|
562
568
|
@Component({
|
|
563
569
|
selector: 'app-your-component',
|
|
564
|
-
imports: [
|
|
570
|
+
imports: [DotCMSBlockEditorRendererNativeComponent],
|
|
565
571
|
template: `
|
|
566
|
-
<dotcms-block-editor-renderer
|
|
572
|
+
<dotcms-block-editor-renderer-native
|
|
567
573
|
[blocks]="contentlet.myBlockEditorField"
|
|
568
574
|
[customRenderers]="customRenderers()" />
|
|
569
575
|
`
|
|
@@ -576,12 +582,8 @@ export class MyBannerComponent {
|
|
|
576
582
|
|
|
577
583
|
#### Recommendations
|
|
578
584
|
|
|
579
|
-
- Should not be used with [`DotCMSEditableText`](#dotcmseditabletext)
|
|
585
|
+
- Should not be used with [`DotCMSEditableText`](#dotcmseditabletext).
|
|
580
586
|
- Take into account the CSS cascade can affect the look and feel of your blocks.
|
|
581
|
-
- `DotCMSBlockEditorRenderer` only works with [Block Editor fields](https://dev.dotcms.com/docs/block-editor). For other fields, use [`DotCMSEditableText`](#dotcmseditabletext).
|
|
582
|
-
|
|
583
|
-
📘 For advanced examples, customization options, and best practices, refer to the [DotCMSBlockEditorRenderer README](https://github.com/dotCMS/core/tree/master/core-web/libs/sdk/angular/src/lib/components/DotCMSBlockEditorRenderer).
|
|
584
|
-
|
|
585
587
|
|
|
586
588
|
### DotCMSShowWhen
|
|
587
589
|
|
|
@@ -1261,6 +1261,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
1261
1261
|
* [customRenderers]="myCustomRenderers">
|
|
1262
1262
|
* </dotcms-block-editor-renderer>
|
|
1263
1263
|
* ```
|
|
1264
|
+
*
|
|
1265
|
+
* @deprecated Use {@link DotCMSBlockEditorRendererNativeComponent}
|
|
1266
|
+
* (`<dotcms-block-editor-renderer-native>`) for accessible, semantic DOM output.
|
|
1267
|
+
* This component wraps every semantic tag in a custom element (e.g. a dispatcher
|
|
1268
|
+
* element sits between `<ul>` and its `<li>` children), which breaks the
|
|
1269
|
+
* `list → listitem` relationship required by the HTML spec and assistive technology.
|
|
1270
|
+
* The native renderer keeps the identical public input API — migration is just
|
|
1271
|
+
* swapping the tag and import. This component is retained for backward compatibility
|
|
1272
|
+
* and will be removed in a future major version.
|
|
1264
1273
|
*/
|
|
1265
1274
|
class DotCMSBlockEditorRendererComponent {
|
|
1266
1275
|
constructor() {
|
|
@@ -1290,6 +1299,240 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
1290
1299
|
type: Input
|
|
1291
1300
|
}] } });
|
|
1292
1301
|
|
|
1302
|
+
/**
|
|
1303
|
+
* Internal semantic block components for the accessible Block Editor renderer.
|
|
1304
|
+
*
|
|
1305
|
+
* Each component uses an **attribute selector** so the host element *is* the real
|
|
1306
|
+
* semantic tag (`<ul>`, `<ol>`, `<li>`, ...). The template is just `<ng-content />`,
|
|
1307
|
+
* so no extra wrapper element is added to the DOM and the
|
|
1308
|
+
* `list → listitem` relationship required by the HTML spec and assistive
|
|
1309
|
+
* technology is preserved.
|
|
1310
|
+
*
|
|
1311
|
+
* These are not exported from the SDK; they are an implementation detail of
|
|
1312
|
+
* {@link DotCMSBlockEditorRendererNativeComponent}.
|
|
1313
|
+
*
|
|
1314
|
+
* @internal
|
|
1315
|
+
*/
|
|
1316
|
+
class DotSemanticBulletList {
|
|
1317
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticBulletList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1318
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: DotSemanticBulletList, isStandalone: true, selector: "ul[dotBulletList]", ngImport: i0, template: `
|
|
1319
|
+
<ng-content />
|
|
1320
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1321
|
+
}
|
|
1322
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticBulletList, decorators: [{
|
|
1323
|
+
type: Component,
|
|
1324
|
+
args: [{
|
|
1325
|
+
selector: 'ul[dotBulletList]',
|
|
1326
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1327
|
+
template: `
|
|
1328
|
+
<ng-content />
|
|
1329
|
+
`
|
|
1330
|
+
}]
|
|
1331
|
+
}] });
|
|
1332
|
+
class DotSemanticOrderedList {
|
|
1333
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticOrderedList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1334
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: DotSemanticOrderedList, isStandalone: true, selector: "ol[dotOrderedList]", ngImport: i0, template: `
|
|
1335
|
+
<ng-content />
|
|
1336
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1337
|
+
}
|
|
1338
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticOrderedList, decorators: [{
|
|
1339
|
+
type: Component,
|
|
1340
|
+
args: [{
|
|
1341
|
+
selector: 'ol[dotOrderedList]',
|
|
1342
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1343
|
+
template: `
|
|
1344
|
+
<ng-content />
|
|
1345
|
+
`
|
|
1346
|
+
}]
|
|
1347
|
+
}] });
|
|
1348
|
+
class DotSemanticListItem {
|
|
1349
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticListItem, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1350
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: DotSemanticListItem, isStandalone: true, selector: "li[dotListItem]", ngImport: i0, template: `
|
|
1351
|
+
<ng-content />
|
|
1352
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1353
|
+
}
|
|
1354
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticListItem, decorators: [{
|
|
1355
|
+
type: Component,
|
|
1356
|
+
args: [{
|
|
1357
|
+
selector: 'li[dotListItem]',
|
|
1358
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1359
|
+
template: `
|
|
1360
|
+
<ng-content />
|
|
1361
|
+
`
|
|
1362
|
+
}]
|
|
1363
|
+
}] });
|
|
1364
|
+
class DotSemanticParagraph {
|
|
1365
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticParagraph, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1366
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: DotSemanticParagraph, isStandalone: true, selector: "p[dotParagraph]", ngImport: i0, template: `
|
|
1367
|
+
<ng-content />
|
|
1368
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1369
|
+
}
|
|
1370
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticParagraph, decorators: [{
|
|
1371
|
+
type: Component,
|
|
1372
|
+
args: [{
|
|
1373
|
+
selector: 'p[dotParagraph]',
|
|
1374
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1375
|
+
template: `
|
|
1376
|
+
<ng-content />
|
|
1377
|
+
`
|
|
1378
|
+
}]
|
|
1379
|
+
}] });
|
|
1380
|
+
class DotSemanticBlockQuote {
|
|
1381
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticBlockQuote, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1382
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: DotSemanticBlockQuote, isStandalone: true, selector: "blockquote[dotBlockQuote]", ngImport: i0, template: `
|
|
1383
|
+
<ng-content />
|
|
1384
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1385
|
+
}
|
|
1386
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticBlockQuote, decorators: [{
|
|
1387
|
+
type: Component,
|
|
1388
|
+
args: [{
|
|
1389
|
+
selector: 'blockquote[dotBlockQuote]',
|
|
1390
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1391
|
+
template: `
|
|
1392
|
+
<ng-content />
|
|
1393
|
+
`
|
|
1394
|
+
}]
|
|
1395
|
+
}] });
|
|
1396
|
+
class DotSemanticCodeBlock {
|
|
1397
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticCodeBlock, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1398
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.1", type: DotSemanticCodeBlock, isStandalone: true, selector: "pre[dotCodeBlock]", ngImport: i0, template: `
|
|
1399
|
+
<code><ng-content /></code>
|
|
1400
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1401
|
+
}
|
|
1402
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotSemanticCodeBlock, decorators: [{
|
|
1403
|
+
type: Component,
|
|
1404
|
+
args: [{
|
|
1405
|
+
selector: 'pre[dotCodeBlock]',
|
|
1406
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1407
|
+
template: `
|
|
1408
|
+
<code><ng-content /></code>
|
|
1409
|
+
`
|
|
1410
|
+
}]
|
|
1411
|
+
}] });
|
|
1412
|
+
|
|
1413
|
+
/**
|
|
1414
|
+
* An accessible component that renders content from DotCMS's Block Editor field.
|
|
1415
|
+
*
|
|
1416
|
+
* This is the semantic-DOM successor to {@link DotCMSBlockEditorRendererComponent}.
|
|
1417
|
+
* It emits clean semantic HTML — `<ul><li><p>…</p></li></ul>` — with no custom
|
|
1418
|
+
* wrapper elements between semantic tags, so the `list → listitem` relationship
|
|
1419
|
+
* required by the HTML spec and assistive technology is preserved. The recursive
|
|
1420
|
+
* dispatch is performed with `ng-template` outlets, whose host `<ng-container>`s
|
|
1421
|
+
* render as HTML comment nodes (invisible to the accessibility tree).
|
|
1422
|
+
*
|
|
1423
|
+
* It exposes the **identical public input API** and the same `customRenderers`
|
|
1424
|
+
* contract as the deprecated renderer, so migration is just swapping the tag and
|
|
1425
|
+
* import.
|
|
1426
|
+
*
|
|
1427
|
+
* For more information about Block Editor, see {@link https://dev.dotcms.com/docs/block-editor}
|
|
1428
|
+
*
|
|
1429
|
+
* @example
|
|
1430
|
+
* ```html
|
|
1431
|
+
* <dotcms-block-editor-renderer-native
|
|
1432
|
+
* [blocks]="myBlockEditorContent"
|
|
1433
|
+
* [customRenderers]="myCustomRenderers">
|
|
1434
|
+
* </dotcms-block-editor-renderer-native>
|
|
1435
|
+
* ```
|
|
1436
|
+
*/
|
|
1437
|
+
class DotCMSBlockEditorRendererNativeComponent {
|
|
1438
|
+
constructor() {
|
|
1439
|
+
/** The Block Editor `doc` node to render. */
|
|
1440
|
+
this.blocks = input(...(ngDevMode ? [undefined, { debugName: "blocks" }] : []));
|
|
1441
|
+
/** Map of `node.type` → component to override the built-in render path. */
|
|
1442
|
+
this.customRenderers = input(undefined, ...(ngDevMode ? [{ debugName: "customRenderers" }] : []));
|
|
1443
|
+
/**
|
|
1444
|
+
* CSS class on the wrapper element. Aliased as `class` so consumers can
|
|
1445
|
+
* pass `[class]="…"` like a normal Angular class binding.
|
|
1446
|
+
*/
|
|
1447
|
+
this.cssClass = input(undefined, { ...(ngDevMode ? { debugName: "cssClass" } : {}), alias: 'class' });
|
|
1448
|
+
/** Inline style on the wrapper element. */
|
|
1449
|
+
this.style = input(undefined, ...(ngDevMode ? [{ debugName: "style" }] : []));
|
|
1450
|
+
this.$blockEditorState = signal({ error: null }, ...(ngDevMode ? [{ debugName: "$blockEditorState" }] : []));
|
|
1451
|
+
this.$isInEditMode = signal(getUVEState()?.mode === UVE_MODE.EDIT, ...(ngDevMode ? [{ debugName: "$isInEditMode" }] : []));
|
|
1452
|
+
this.BLOCKS = BlockEditorDefaultBlocks;
|
|
1453
|
+
}
|
|
1454
|
+
ngOnInit() {
|
|
1455
|
+
// `isValidBlocks` declares `blocks: BlockEditorNode` but its first guard
|
|
1456
|
+
// handles `undefined` — the cast lines up the types without changing the
|
|
1457
|
+
// published `@dotcms/uve` signature.
|
|
1458
|
+
const state = isValidBlocks(this.blocks());
|
|
1459
|
+
if (state.error) {
|
|
1460
|
+
console.error('Error in dotcms-block-editor-renderer-native: ', state.error);
|
|
1461
|
+
}
|
|
1462
|
+
this.$blockEditorState.set(state);
|
|
1463
|
+
}
|
|
1464
|
+
/**
|
|
1465
|
+
* Normalizes a heading `level` attribute (which may be a number such as `6`
|
|
1466
|
+
* or a string such as `'6'`) to a string for use in the heading `@switch`.
|
|
1467
|
+
* Returns `''` for missing or out-of-range levels so the template falls
|
|
1468
|
+
* through to the safe `@default` case (`<h2>`).
|
|
1469
|
+
*/
|
|
1470
|
+
asLevel(level) {
|
|
1471
|
+
const normalized = level != null ? String(level) : '';
|
|
1472
|
+
return /^[1-6]$/.test(normalized) ? normalized : '';
|
|
1473
|
+
}
|
|
1474
|
+
/** The marks after the current (outermost) one — used to recurse inward. */
|
|
1475
|
+
restMarks(marks) {
|
|
1476
|
+
return marks?.slice(1) ?? [];
|
|
1477
|
+
}
|
|
1478
|
+
/** The attributes of the current (outermost) mark. */
|
|
1479
|
+
markAttrs(marks) {
|
|
1480
|
+
return marks?.[0]?.attrs ?? {};
|
|
1481
|
+
}
|
|
1482
|
+
/**
|
|
1483
|
+
* Wrapper style for a `dotImage` `<figure>`, derived from the node's
|
|
1484
|
+
* `textWrap` (float left/right) or `textAlign` attribute.
|
|
1485
|
+
*/
|
|
1486
|
+
imageStyle(attrs) {
|
|
1487
|
+
const textWrap = attrs?.['textWrap'];
|
|
1488
|
+
const textAlign = attrs?.['textAlign'];
|
|
1489
|
+
if (textWrap === 'left') {
|
|
1490
|
+
return { float: 'left', width: '50%', margin: '0 1rem 1rem 0' };
|
|
1491
|
+
}
|
|
1492
|
+
if (textWrap === 'right') {
|
|
1493
|
+
return { float: 'right', width: '50%', margin: '0 0 1rem 1rem' };
|
|
1494
|
+
}
|
|
1495
|
+
if (textAlign) {
|
|
1496
|
+
return { 'text-align': textAlign };
|
|
1497
|
+
}
|
|
1498
|
+
return {};
|
|
1499
|
+
}
|
|
1500
|
+
/** Poster URL for a `dotVideo` `<video>` (from `attrs.data.thumbnail`). */
|
|
1501
|
+
videoPoster(attrs) {
|
|
1502
|
+
return attrs?.['data']?.['thumbnail'];
|
|
1503
|
+
}
|
|
1504
|
+
/**
|
|
1505
|
+
* The column span (1–12) for a grid column. Falls back to `6` for malformed
|
|
1506
|
+
* `columns` attrs or for an out-of-range column index, matching the legacy
|
|
1507
|
+
* renderer.
|
|
1508
|
+
*/
|
|
1509
|
+
columnSpan(attrs, index) {
|
|
1510
|
+
const rawCols = Array.isArray(attrs?.['columns']) ? attrs['columns'] : [6, 6];
|
|
1511
|
+
const valid = rawCols.length === 2 &&
|
|
1512
|
+
rawCols.every((v) => typeof v === 'number' && Number.isFinite(v));
|
|
1513
|
+
const span = valid ? rawCols[index] : 6;
|
|
1514
|
+
return typeof span === 'number' ? span : 6;
|
|
1515
|
+
}
|
|
1516
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotCMSBlockEditorRendererNativeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1517
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: DotCMSBlockEditorRendererNativeComponent, isStandalone: true, selector: "dotcms-block-editor-renderer-native", inputs: { blocks: { classPropertyName: "blocks", publicName: "blocks", isSignal: true, isRequired: false, transformFunction: null }, customRenderers: { classPropertyName: "customRenderers", publicName: "customRenderers", isSignal: true, isRequired: false, transformFunction: null }, cssClass: { classPropertyName: "cssClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if ($blockEditorState().error && $isInEditMode()) {\n <div data-testid=\"invalid-blocks-message\">\n {{ $blockEditorState().error }}\n </div>\n} @else if (!$blockEditorState().error) {\n <div [class]=\"cssClass()\" [style]=\"style()\">\n <ng-container *ngTemplateOutlet=\"nodeList; context: { $implicit: blocks()?.content }\" />\n </div>\n}\n\n<!-- Renders a list of nodes by dispatching each one. -->\n<ng-template #nodeList let-content>\n @for (node of content; track node) {\n <ng-container *ngTemplateOutlet=\"dispatch; context: { $implicit: node }\" />\n }\n</ng-template>\n\n<!--\n Dispatches a single node to its semantic tag. The host ng-container of each\n ngTemplateOutlet renders as an HTML comment node, so a list item stays a true\n DOM child of its list element \u2014 the property that makes this AT-proof.\n-->\n<ng-template #dispatch let-node>\n @if (customRenderers()?.[node.type]) {\n <ng-container\n *ngTemplateOutlet=\"\n customRender;\n context: { customRender: customRenderers()?.[node.type], node: node }\n \" />\n } @else {\n @switch (node.type) {\n @case (BLOCKS.PARAGRAPH) {\n <p dotParagraph [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" />\n </p>\n }\n\n @case (BLOCKS.TEXT) {\n <ng-container\n *ngTemplateOutlet=\"\n textRun;\n context: { marks: node.marks, text: node.text || '' }\n \" />\n }\n\n @case (BLOCKS.HEADING) {\n @switch (asLevel(node.attrs?.['level'])) {\n @case ('1') {\n <h1 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h1>\n }\n @case ('2') {\n <h2 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h2>\n }\n @case ('3') {\n <h3 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h3>\n }\n @case ('4') {\n <h4 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h4>\n }\n @case ('5') {\n <h5 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h5>\n }\n @case ('6') {\n <h6 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h6>\n }\n @default {\n <!--\n Unknown level: fall back to <h2>, not <h1>. An\n unexpected <h1> in an article tanks the heading\n outline that assistive technology relies on, and\n articles typically already have a page <h1>.\n -->\n <h2 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h2>\n }\n }\n }\n\n @case (BLOCKS.BULLET_LIST) {\n <ul dotBulletList>\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" />\n </ul>\n }\n\n @case (BLOCKS.ORDERED_LIST) {\n <ol dotOrderedList>\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" />\n </ol>\n }\n\n @case (BLOCKS.LIST_ITEM) {\n <li dotListItem>\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" />\n </li>\n }\n\n @case (BLOCKS.BLOCK_QUOTE) {\n <blockquote dotBlockQuote>\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" />\n </blockquote>\n }\n\n @case (BLOCKS.CODE_BLOCK) {\n <pre dotCodeBlock>\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" /></pre>\n }\n\n @case (BLOCKS.HARDBREAK) {\n <br />\n }\n\n @case (BLOCKS.HORIZONTAL_RULE) {\n <hr />\n }\n\n @case (BLOCKS.DOT_IMAGE) {\n <figure [style]=\"imageStyle(node.attrs)\">\n <img\n [alt]=\"node.attrs?.['alt']\"\n [src]=\"node.attrs?.['src']\"\n style=\"max-width: 100%; height: auto\" />\n </figure>\n }\n\n @case (BLOCKS.DOT_VIDEO) {\n <video\n [controls]=\"true\"\n preload=\"metadata\"\n [poster]=\"videoPoster(node.attrs)\"\n [width]=\"node.attrs?.['width']\"\n [height]=\"node.attrs?.['height']\">\n <track default kind=\"captions\" srclang=\"en\" />\n <source [src]=\"node.attrs?.['src']\" [type]=\"node.attrs?.['mimeType']\" />\n Your browser does not support the\n <code>video</code>\n element.\n </video>\n }\n\n @case (BLOCKS.TABLE) {\n <table>\n <thead>\n @for (rowNode of node.content?.slice(0, 1); track $index) {\n <tr>\n @for (cellNode of rowNode.content; track $index) {\n <th\n [attr.colspan]=\"cellNode.attrs?.['colspan'] || 1\"\n [attr.rowspan]=\"cellNode.attrs?.['rowspan'] || 1\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: cellNode.content }\n \" />\n </th>\n }\n </tr>\n }\n </thead>\n <tbody>\n @for (rowNode of node.content?.slice(1); track $index) {\n <tr>\n @for (cellNode of rowNode.content; track $index) {\n <td\n [attr.colspan]=\"cellNode.attrs?.['colspan'] || 1\"\n [attr.rowspan]=\"cellNode.attrs?.['rowspan'] || 1\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: cellNode.content }\n \" />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n @case (BLOCKS.GRID_BLOCK) {\n <div\n data-type=\"gridBlock\"\n class=\"grid-block\"\n style=\"display: grid; grid-template-columns: repeat(12, 1fr); gap: 1rem\">\n @for (column of node.content; track $index) {\n <div\n data-type=\"gridColumn\"\n class=\"grid-block__column\"\n [style.grid-column]=\"'span ' + columnSpan(node.attrs, $index)\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: column.content }\n \" />\n </div>\n }\n </div>\n }\n\n @case (BLOCKS.DOT_CONTENT) {\n <dotcms-block-editor-renderer-contentlet\n [node]=\"node\"\n [customRenderers]=\"customRenderers()\" />\n }\n\n @default {\n <dotcms-block-editor-renderer-unknown [node]=\"node\" />\n }\n }\n }\n</ng-template>\n\n<ng-template #customRender let-customRender=\"customRender\" let-node=\"node\">\n <ng-container *ngComponentOutlet=\"customRender | async; inputs: { node: node }\" />\n</ng-template>\n\n<!--\n Renders a text node and its marks as native inline elements (<strong>, <u>,\n <em>, <a>, ...) with no wrapper element. Recurses through itself (rendered as a\n comment node) one mark at a time, so stacked marks nest directly:\n <u><strong>text</strong></u>.\n-->\n<ng-template #textRun let-marks=\"marks\" let-text=\"text\">\n @switch (marks?.[0]?.type) {\n @case ('link') {\n @if (markAttrs(marks)['href']) {\n <a\n [attr.href]=\"markAttrs(marks)['href']\"\n [attr.target]=\"markAttrs(marks)['target'] || null\"\n [attr.title]=\"markAttrs(marks)['title'] || null\"\n [attr.aria-label]=\"markAttrs(marks)['aria-label'] || null\"\n [attr.rel]=\"\n markAttrs(marks)['rel'] ||\n (markAttrs(marks)['target'] === '_blank' ? 'noopener noreferrer' : null)\n \"\n [class]=\"markAttrs(marks)['class'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n textRun;\n context: { marks: restMarks(marks), text: text }\n \" />\n </a>\n } @else {\n <!--\n Malformed link mark with no href: a hrefless <a> isn't a\n link to assistive tech (no role, not focusable). Skip the\n element and recurse \u2014 any remaining marks (bold, etc.)\n still render around the text.\n -->\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n }\n }\n @case ('bold') {\n <strong>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </strong>\n }\n @case ('underline') {\n <u>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </u>\n }\n @case ('italic') {\n <em>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </em>\n }\n @case ('strike') {\n <s>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </s>\n }\n @case ('superscript') {\n <sup>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </sup>\n }\n @case ('subscript') {\n <sub>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </sub>\n }\n @default {\n @if (marks?.length) {\n <!-- Unknown mark type: skip it but keep rendering any marks beneath. -->\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n } @else {\n {{ text }}\n }\n }\n }\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: DotSemanticParagraph, selector: "p[dotParagraph]" }, { kind: "component", type: DotSemanticBulletList, selector: "ul[dotBulletList]" }, { kind: "component", type: DotSemanticOrderedList, selector: "ol[dotOrderedList]" }, { kind: "component", type: DotSemanticListItem, selector: "li[dotListItem]" }, { kind: "component", type: DotSemanticBlockQuote, selector: "blockquote[dotBlockQuote]" }, { kind: "component", type: DotSemanticCodeBlock, selector: "pre[dotCodeBlock]" }, { kind: "component", type: DotContentletBlock, selector: "dotcms-block-editor-renderer-contentlet", inputs: ["customRenderers", "node"] }, { kind: "component", type: DotUnknownBlockComponent, selector: "dotcms-block-editor-renderer-unknown", inputs: ["node"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1518
|
+
}
|
|
1519
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: DotCMSBlockEditorRendererNativeComponent, decorators: [{
|
|
1520
|
+
type: Component,
|
|
1521
|
+
args: [{ selector: 'dotcms-block-editor-renderer-native', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
1522
|
+
NgTemplateOutlet,
|
|
1523
|
+
NgComponentOutlet,
|
|
1524
|
+
AsyncPipe,
|
|
1525
|
+
DotSemanticParagraph,
|
|
1526
|
+
DotSemanticBulletList,
|
|
1527
|
+
DotSemanticOrderedList,
|
|
1528
|
+
DotSemanticListItem,
|
|
1529
|
+
DotSemanticBlockQuote,
|
|
1530
|
+
DotSemanticCodeBlock,
|
|
1531
|
+
DotContentletBlock,
|
|
1532
|
+
DotUnknownBlockComponent
|
|
1533
|
+
], template: "@if ($blockEditorState().error && $isInEditMode()) {\n <div data-testid=\"invalid-blocks-message\">\n {{ $blockEditorState().error }}\n </div>\n} @else if (!$blockEditorState().error) {\n <div [class]=\"cssClass()\" [style]=\"style()\">\n <ng-container *ngTemplateOutlet=\"nodeList; context: { $implicit: blocks()?.content }\" />\n </div>\n}\n\n<!-- Renders a list of nodes by dispatching each one. -->\n<ng-template #nodeList let-content>\n @for (node of content; track node) {\n <ng-container *ngTemplateOutlet=\"dispatch; context: { $implicit: node }\" />\n }\n</ng-template>\n\n<!--\n Dispatches a single node to its semantic tag. The host ng-container of each\n ngTemplateOutlet renders as an HTML comment node, so a list item stays a true\n DOM child of its list element \u2014 the property that makes this AT-proof.\n-->\n<ng-template #dispatch let-node>\n @if (customRenderers()?.[node.type]) {\n <ng-container\n *ngTemplateOutlet=\"\n customRender;\n context: { customRender: customRenderers()?.[node.type], node: node }\n \" />\n } @else {\n @switch (node.type) {\n @case (BLOCKS.PARAGRAPH) {\n <p dotParagraph [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" />\n </p>\n }\n\n @case (BLOCKS.TEXT) {\n <ng-container\n *ngTemplateOutlet=\"\n textRun;\n context: { marks: node.marks, text: node.text || '' }\n \" />\n }\n\n @case (BLOCKS.HEADING) {\n @switch (asLevel(node.attrs?.['level'])) {\n @case ('1') {\n <h1 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h1>\n }\n @case ('2') {\n <h2 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h2>\n }\n @case ('3') {\n <h3 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h3>\n }\n @case ('4') {\n <h4 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h4>\n }\n @case ('5') {\n <h5 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h5>\n }\n @case ('6') {\n <h6 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h6>\n }\n @default {\n <!--\n Unknown level: fall back to <h2>, not <h1>. An\n unexpected <h1> in an article tanks the heading\n outline that assistive technology relies on, and\n articles typically already have a page <h1>.\n -->\n <h2 [style.text-align]=\"node.attrs?.['textAlign'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: node.content }\n \" />\n </h2>\n }\n }\n }\n\n @case (BLOCKS.BULLET_LIST) {\n <ul dotBulletList>\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" />\n </ul>\n }\n\n @case (BLOCKS.ORDERED_LIST) {\n <ol dotOrderedList>\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" />\n </ol>\n }\n\n @case (BLOCKS.LIST_ITEM) {\n <li dotListItem>\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" />\n </li>\n }\n\n @case (BLOCKS.BLOCK_QUOTE) {\n <blockquote dotBlockQuote>\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" />\n </blockquote>\n }\n\n @case (BLOCKS.CODE_BLOCK) {\n <pre dotCodeBlock>\n <ng-container\n *ngTemplateOutlet=\"nodeList; context: { $implicit: node.content }\" /></pre>\n }\n\n @case (BLOCKS.HARDBREAK) {\n <br />\n }\n\n @case (BLOCKS.HORIZONTAL_RULE) {\n <hr />\n }\n\n @case (BLOCKS.DOT_IMAGE) {\n <figure [style]=\"imageStyle(node.attrs)\">\n <img\n [alt]=\"node.attrs?.['alt']\"\n [src]=\"node.attrs?.['src']\"\n style=\"max-width: 100%; height: auto\" />\n </figure>\n }\n\n @case (BLOCKS.DOT_VIDEO) {\n <video\n [controls]=\"true\"\n preload=\"metadata\"\n [poster]=\"videoPoster(node.attrs)\"\n [width]=\"node.attrs?.['width']\"\n [height]=\"node.attrs?.['height']\">\n <track default kind=\"captions\" srclang=\"en\" />\n <source [src]=\"node.attrs?.['src']\" [type]=\"node.attrs?.['mimeType']\" />\n Your browser does not support the\n <code>video</code>\n element.\n </video>\n }\n\n @case (BLOCKS.TABLE) {\n <table>\n <thead>\n @for (rowNode of node.content?.slice(0, 1); track $index) {\n <tr>\n @for (cellNode of rowNode.content; track $index) {\n <th\n [attr.colspan]=\"cellNode.attrs?.['colspan'] || 1\"\n [attr.rowspan]=\"cellNode.attrs?.['rowspan'] || 1\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: cellNode.content }\n \" />\n </th>\n }\n </tr>\n }\n </thead>\n <tbody>\n @for (rowNode of node.content?.slice(1); track $index) {\n <tr>\n @for (cellNode of rowNode.content; track $index) {\n <td\n [attr.colspan]=\"cellNode.attrs?.['colspan'] || 1\"\n [attr.rowspan]=\"cellNode.attrs?.['rowspan'] || 1\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: cellNode.content }\n \" />\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n\n @case (BLOCKS.GRID_BLOCK) {\n <div\n data-type=\"gridBlock\"\n class=\"grid-block\"\n style=\"display: grid; grid-template-columns: repeat(12, 1fr); gap: 1rem\">\n @for (column of node.content; track $index) {\n <div\n data-type=\"gridColumn\"\n class=\"grid-block__column\"\n [style.grid-column]=\"'span ' + columnSpan(node.attrs, $index)\">\n <ng-container\n *ngTemplateOutlet=\"\n nodeList;\n context: { $implicit: column.content }\n \" />\n </div>\n }\n </div>\n }\n\n @case (BLOCKS.DOT_CONTENT) {\n <dotcms-block-editor-renderer-contentlet\n [node]=\"node\"\n [customRenderers]=\"customRenderers()\" />\n }\n\n @default {\n <dotcms-block-editor-renderer-unknown [node]=\"node\" />\n }\n }\n }\n</ng-template>\n\n<ng-template #customRender let-customRender=\"customRender\" let-node=\"node\">\n <ng-container *ngComponentOutlet=\"customRender | async; inputs: { node: node }\" />\n</ng-template>\n\n<!--\n Renders a text node and its marks as native inline elements (<strong>, <u>,\n <em>, <a>, ...) with no wrapper element. Recurses through itself (rendered as a\n comment node) one mark at a time, so stacked marks nest directly:\n <u><strong>text</strong></u>.\n-->\n<ng-template #textRun let-marks=\"marks\" let-text=\"text\">\n @switch (marks?.[0]?.type) {\n @case ('link') {\n @if (markAttrs(marks)['href']) {\n <a\n [attr.href]=\"markAttrs(marks)['href']\"\n [attr.target]=\"markAttrs(marks)['target'] || null\"\n [attr.title]=\"markAttrs(marks)['title'] || null\"\n [attr.aria-label]=\"markAttrs(marks)['aria-label'] || null\"\n [attr.rel]=\"\n markAttrs(marks)['rel'] ||\n (markAttrs(marks)['target'] === '_blank' ? 'noopener noreferrer' : null)\n \"\n [class]=\"markAttrs(marks)['class'] || null\">\n <ng-container\n *ngTemplateOutlet=\"\n textRun;\n context: { marks: restMarks(marks), text: text }\n \" />\n </a>\n } @else {\n <!--\n Malformed link mark with no href: a hrefless <a> isn't a\n link to assistive tech (no role, not focusable). Skip the\n element and recurse \u2014 any remaining marks (bold, etc.)\n still render around the text.\n -->\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n }\n }\n @case ('bold') {\n <strong>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </strong>\n }\n @case ('underline') {\n <u>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </u>\n }\n @case ('italic') {\n <em>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </em>\n }\n @case ('strike') {\n <s>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </s>\n }\n @case ('superscript') {\n <sup>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </sup>\n }\n @case ('subscript') {\n <sub>\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n </sub>\n }\n @default {\n @if (marks?.length) {\n <!-- Unknown mark type: skip it but keep rendering any marks beneath. -->\n <ng-container\n *ngTemplateOutlet=\"textRun; context: { marks: restMarks(marks), text: text }\" />\n } @else {\n {{ text }}\n }\n }\n }\n</ng-template>\n" }]
|
|
1534
|
+
}], propDecorators: { blocks: [{ type: i0.Input, args: [{ isSignal: true, alias: "blocks", required: false }] }], customRenderers: [{ type: i0.Input, args: [{ isSignal: true, alias: "customRenderers", required: false }] }], cssClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }] } });
|
|
1535
|
+
|
|
1293
1536
|
/**
|
|
1294
1537
|
* @description This component is used to display a message when a page is missing the required `layout.body` property.
|
|
1295
1538
|
* @internal
|
|
@@ -2008,5 +2251,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
|
|
|
2008
2251
|
* Generated bundle index. Do not edit.
|
|
2009
2252
|
*/
|
|
2010
2253
|
|
|
2011
|
-
export { DotCMSBlockEditorRendererComponent, DotCMSClient, DotCMSEditablePageService, DotCMSEditableTextComponent, DotCMSLayoutBodyComponent, DotCMSShowWhenDirective, provideDotCMSClient, provideDotCMSImageLoader };
|
|
2254
|
+
export { DotCMSBlockEditorRendererComponent, DotCMSBlockEditorRendererNativeComponent, DotCMSClient, DotCMSEditablePageService, DotCMSEditableTextComponent, DotCMSLayoutBodyComponent, DotCMSShowWhenDirective, provideDotCMSClient, provideDotCMSImageLoader };
|
|
2012
2255
|
//# sourceMappingURL=dotcms-angular.mjs.map
|