@lucca-front/ng 21.0.0 → 21.0.1

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 (39) hide show
  1. package/fesm2022/lucca-front-ng-box.mjs +4 -2
  2. package/fesm2022/lucca-front-ng-box.mjs.map +1 -1
  3. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-markdown.mjs +23 -2
  4. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-markdown.mjs.map +1 -1
  5. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-plain-text.mjs +57 -10
  6. package/fesm2022/lucca-front-ng-forms-rich-text-input-formatters-plain-text.mjs.map +1 -1
  7. package/fesm2022/lucca-front-ng-forms-rich-text-input.mjs +1 -22
  8. package/fesm2022/lucca-front-ng-forms-rich-text-input.mjs.map +1 -1
  9. package/fesm2022/lucca-front-ng-loading.mjs.map +1 -1
  10. package/package.json +3 -19
  11. package/schematics/alignment-utilities/index.js +21 -0
  12. package/schematics/alignment-utilities/migration.spec.js +50 -0
  13. package/schematics/alignment-utilities/schema.json +23 -0
  14. package/schematics/collection.json +10 -0
  15. package/schematics/component-path/index.js +22 -0
  16. package/schematics/component-path/migration.spec.js +50 -0
  17. package/schematics/component-path/schema.json +23 -0
  18. package/schematics/lib/component-mapper.js +54 -0
  19. package/schematics/lib/css-mapper.js +9 -32
  20. package/schematics/lib/html-ast.js +1 -1
  21. package/schematics/lib/schematic.utils.js +29 -0
  22. package/schematics/palettes/index.js +4 -2
  23. package/types/lucca-front-ng-box.d.ts +2 -1
  24. package/types/lucca-front-ng-forms-rich-text-input-formatters-markdown.d.ts +11 -2
  25. package/types/lucca-front-ng-forms-rich-text-input-formatters-plain-text.d.ts +18 -6
  26. package/types/lucca-front-ng-forms-rich-text-input.d.ts +36 -12
  27. package/types/lucca-front-ng-loading.d.ts +4 -1
  28. package/fesm2022/lucca-front-ng-scrollBox.mjs +0 -6
  29. package/fesm2022/lucca-front-ng-scrollBox.mjs.map +0 -1
  30. package/fesm2022/lucca-front-ng-segmentedControl.mjs +0 -6
  31. package/fesm2022/lucca-front-ng-segmentedControl.mjs.map +0 -1
  32. package/fesm2022/lucca-front-ng-segmentedControlTabs.mjs +0 -6
  33. package/fesm2022/lucca-front-ng-segmentedControlTabs.mjs.map +0 -1
  34. package/fesm2022/lucca-front-ng-statusBadge.mjs +0 -6
  35. package/fesm2022/lucca-front-ng-statusBadge.mjs.map +0 -1
  36. package/types/lucca-front-ng-scrollBox.d.ts +0 -1
  37. package/types/lucca-front-ng-segmentedControl.d.ts +0 -1
  38. package/types/lucca-front-ng-segmentedControlTabs.d.ts +0 -1
  39. package/types/lucca-front-ng-statusBadge.d.ts +0 -1
@@ -8,9 +8,10 @@ class BoxComponent {
8
8
  this.toggle = input(false, { ...(ngDevMode ? { debugName: "toggle" } : {}), transform: booleanAttribute });
9
9
  this.neutral = input(false, { ...(ngDevMode ? { debugName: "neutral" } : {}), transform: booleanAttribute });
10
10
  this.killable = input(false, { ...(ngDevMode ? { debugName: "killable" } : {}), transform: booleanAttribute });
11
+ this.withArrow = input(false, { ...(ngDevMode ? { debugName: "withArrow" } : {}), transform: booleanAttribute });
11
12
  }
12
13
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: BoxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: BoxComponent, isStandalone: true, selector: "lu-box", inputs: { toggle: { classPropertyName: "toggle", publicName: "toggle", isSignal: true, isRequired: false, transformFunction: null }, neutral: { classPropertyName: "neutral", publicName: "neutral", isSignal: true, isRequired: false, transformFunction: null }, killable: { classPropertyName: "killable", publicName: "killable", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.mod-toggle": "toggle()", "class.mod-neutral": "neutral()" }, classAttribute: "box" }, ngImport: i0, template: "@if (killable()) {\n\t<div class=\"box-close\">\n\t\t<button luButton=\"ghost\" type=\"button\">\n\t\t\t<lu-icon icon=\"signClose\" alt=\"Close\" />\n\t\t</button>\n\t</div>\n}\n<ng-content />\n", styles: ["@layer components{.box{--components-box-background: var(--pr-t-elevation-surface-raised);--components-box-margin: 0 0 var(--pr-t-spacings-200);--components-box-padding: var(--pr-t-spacings-300);--components-box-borderRadius: var(--pr-t-border-radius-structure);--components-box-toggle-arrow-size: .8rem;--components-box-toggle-arrow-left: 2.5rem;border-radius:var(--components-box-borderRadius);padding:var(--components-box-padding);background-color:var(--components-box-background, var(--pr-t-elevation-surface-raised));display:block;position:relative}.box-close{position:absolute;font-size:var(--pr-t-font-body-M-fontSize);inset-inline-end:var(--pr-t-spacings-50);inset-block-start:var(--pr-t-spacings-50);z-index:1}}@layer mods{.box.mod-neutral,.box.mod-grey{--components-box-background: var(--palettes-neutral-25)}.box.mod-withArrow{--components-box-padding: var(--pr-t-spacings-200);--components-box-borderRadius: var(--pr-t-border-radius-small) var(--pr-t-border-radius-structure) var(--pr-t-border-radius-structure)}.box.mod-withArrow .box-arrow{--components-box-arrow-bottom: 100%;--components-box-arrow-left: var(--pr-t-spacings-75)}.box.mod-toggle{margin-block-start:var(--components-box-toggle-arrow-size)}.box.mod-toggle:before{inset-inline-start:var(--components-box-toggle-arrow-left);border-color:transparent;border-style:solid;border-width:var(--components-box-toggle-arrow-size);border-block-end-color:var(--components-box-background, var(--pr-t-elevation-surface-raised));border-block-start:0;block-size:0;inset-block-end:100%;inline-size:0;position:absolute;content:\"\"}}@layer components{.box-arrow{--components-box-arrow-background: var(--pr-t-elevation-surface-raised);--components-box-arrow-left: 0;--components-box-arrow-bottom: 0;background-color:var(--components-box-arrow-background);margin-block:0;margin-inline:var(--pr-t-spacings-50);inline-size:12px;block-size:8px;clip-path:path(\"M4.66415 0.494638C5.43093 -0.164881 6.56907 -0.164879 7.33586 0.49464L12 8H0L4.66415 0.494638Z\");position:absolute;inset-block-end:var(--components-box-arrow-bottom);inset-inline-start:var(--components-box-arrow-left)}.box-arrow.mod-neutral,.box-arrow.mod-grey{--components-box-arrow-background: var(--palettes-neutral-25)}}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "lu-icon", inputs: ["icon", "alt", "size", "color", "AI"] }, { kind: "component", type: ButtonComponent, selector: "button[luButton],a[luButton]", inputs: ["size", "block", "critical", "delete", "disclosure", "palette", "state", "luButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
14
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: BoxComponent, isStandalone: true, selector: "lu-box", inputs: { toggle: { classPropertyName: "toggle", publicName: "toggle", isSignal: true, isRequired: false, transformFunction: null }, neutral: { classPropertyName: "neutral", publicName: "neutral", isSignal: true, isRequired: false, transformFunction: null }, killable: { classPropertyName: "killable", publicName: "killable", isSignal: true, isRequired: false, transformFunction: null }, withArrow: { classPropertyName: "withArrow", publicName: "withArrow", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.mod-toggle": "toggle()", "class.mod-neutral": "neutral()", "class.mod-withArrow": "withArrow()" }, classAttribute: "box" }, ngImport: i0, template: "@if (killable()) {\n\t<div class=\"box-close\">\n\t\t<button luButton=\"ghost\" type=\"button\">\n\t\t\t<lu-icon icon=\"signClose\" alt=\"Close\" />\n\t\t</button>\n\t</div>\n}\n<ng-content />\n", styles: ["@layer components{.box{--components-box-background: var(--pr-t-elevation-surface-raised);--components-box-margin: 0 0 var(--pr-t-spacings-200);--components-box-padding: var(--pr-t-spacings-300);--components-box-borderRadius: var(--pr-t-border-radius-structure);--components-box-toggle-arrow-size: .8rem;--components-box-toggle-arrow-left: 2.5rem;border-radius:var(--components-box-borderRadius);padding:var(--components-box-padding);background-color:var(--components-box-background, var(--pr-t-elevation-surface-raised));display:block;position:relative}.box-close{position:absolute;font-size:var(--pr-t-font-body-M-fontSize);inset-inline-end:var(--pr-t-spacings-50);inset-block-start:var(--pr-t-spacings-50);z-index:1}}@layer mods{.box.mod-neutral,.box.mod-grey{--components-box-background: var(--palettes-neutral-25)}.box.mod-withArrow{--components-box-padding: var(--pr-t-spacings-200);--components-box-borderRadius: var(--pr-t-border-radius-small) var(--pr-t-border-radius-structure) var(--pr-t-border-radius-structure)}.box.mod-withArrow .box-arrow{--components-box-arrow-bottom: 100%;--components-box-arrow-left: var(--pr-t-spacings-75)}.box.mod-toggle{margin-block-start:var(--components-box-toggle-arrow-size)}.box.mod-toggle:before{inset-inline-start:var(--components-box-toggle-arrow-left);border-color:transparent;border-style:solid;border-width:var(--components-box-toggle-arrow-size);border-block-end-color:var(--components-box-background, var(--pr-t-elevation-surface-raised));border-block-start:0;block-size:0;inset-block-end:100%;inline-size:0;position:absolute;content:\"\"}}@layer components{.box-arrow{--components-box-arrow-background: var(--pr-t-elevation-surface-raised);--components-box-arrow-left: 0;--components-box-arrow-bottom: 0;background-color:var(--components-box-arrow-background);margin-block:0;margin-inline:var(--pr-t-spacings-50);inline-size:12px;block-size:8px;clip-path:path(\"M4.66415 0.494638C5.43093 -0.164881 6.56907 -0.164879 7.33586 0.49464L12 8H0L4.66415 0.494638Z\");position:absolute;inset-block-end:var(--components-box-arrow-bottom);inset-inline-start:var(--components-box-arrow-left)}.box-arrow.mod-neutral,.box-arrow.mod-grey{--components-box-arrow-background: var(--palettes-neutral-25)}}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "lu-icon", inputs: ["icon", "alt", "size", "color", "AI"] }, { kind: "component", type: ButtonComponent, selector: "button[luButton],a[luButton]", inputs: ["size", "block", "critical", "delete", "disclosure", "palette", "state", "luButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
14
15
  }
15
16
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: BoxComponent, decorators: [{
16
17
  type: Component,
@@ -18,8 +19,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
18
19
  class: 'box',
19
20
  '[class.mod-toggle]': 'toggle()',
20
21
  '[class.mod-neutral]': 'neutral()',
22
+ '[class.mod-withArrow]': 'withArrow()',
21
23
  }, template: "@if (killable()) {\n\t<div class=\"box-close\">\n\t\t<button luButton=\"ghost\" type=\"button\">\n\t\t\t<lu-icon icon=\"signClose\" alt=\"Close\" />\n\t\t</button>\n\t</div>\n}\n<ng-content />\n", styles: ["@layer components{.box{--components-box-background: var(--pr-t-elevation-surface-raised);--components-box-margin: 0 0 var(--pr-t-spacings-200);--components-box-padding: var(--pr-t-spacings-300);--components-box-borderRadius: var(--pr-t-border-radius-structure);--components-box-toggle-arrow-size: .8rem;--components-box-toggle-arrow-left: 2.5rem;border-radius:var(--components-box-borderRadius);padding:var(--components-box-padding);background-color:var(--components-box-background, var(--pr-t-elevation-surface-raised));display:block;position:relative}.box-close{position:absolute;font-size:var(--pr-t-font-body-M-fontSize);inset-inline-end:var(--pr-t-spacings-50);inset-block-start:var(--pr-t-spacings-50);z-index:1}}@layer mods{.box.mod-neutral,.box.mod-grey{--components-box-background: var(--palettes-neutral-25)}.box.mod-withArrow{--components-box-padding: var(--pr-t-spacings-200);--components-box-borderRadius: var(--pr-t-border-radius-small) var(--pr-t-border-radius-structure) var(--pr-t-border-radius-structure)}.box.mod-withArrow .box-arrow{--components-box-arrow-bottom: 100%;--components-box-arrow-left: var(--pr-t-spacings-75)}.box.mod-toggle{margin-block-start:var(--components-box-toggle-arrow-size)}.box.mod-toggle:before{inset-inline-start:var(--components-box-toggle-arrow-left);border-color:transparent;border-style:solid;border-width:var(--components-box-toggle-arrow-size);border-block-end-color:var(--components-box-background, var(--pr-t-elevation-surface-raised));border-block-start:0;block-size:0;inset-block-end:100%;inline-size:0;position:absolute;content:\"\"}}@layer components{.box-arrow{--components-box-arrow-background: var(--pr-t-elevation-surface-raised);--components-box-arrow-left: 0;--components-box-arrow-bottom: 0;background-color:var(--components-box-arrow-background);margin-block:0;margin-inline:var(--pr-t-spacings-50);inline-size:12px;block-size:8px;clip-path:path(\"M4.66415 0.494638C5.43093 -0.164881 6.56907 -0.164879 7.33586 0.49464L12 8H0L4.66415 0.494638Z\");position:absolute;inset-block-end:var(--components-box-arrow-bottom);inset-inline-start:var(--components-box-arrow-left)}.box-arrow.mod-neutral,.box-arrow.mod-grey{--components-box-arrow-background: var(--palettes-neutral-25)}}\n"] }]
22
- }], propDecorators: { toggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggle", required: false }] }], neutral: [{ type: i0.Input, args: [{ isSignal: true, alias: "neutral", required: false }] }], killable: [{ type: i0.Input, args: [{ isSignal: true, alias: "killable", required: false }] }] } });
24
+ }], propDecorators: { toggle: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggle", required: false }] }], neutral: [{ type: i0.Input, args: [{ isSignal: true, alias: "neutral", required: false }] }], killable: [{ type: i0.Input, args: [{ isSignal: true, alias: "killable", required: false }] }], withArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "withArrow", required: false }] }] } });
23
25
 
24
26
  /**
25
27
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"lucca-front-ng-box.mjs","sources":["../../../packages/ng/box/box.component.ts","../../../packages/ng/box/box.component.html","../../../packages/ng/box/lucca-front-ng-box.ts"],"sourcesContent":["import { booleanAttribute, ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { ButtonComponent } from '@lucca-front/ng/button';\nimport { IconComponent } from '@lucca-front/ng/icon';\n\n@Component({\n\tselector: 'lu-box',\n\ttemplateUrl: './box.component.html',\n\tstyleUrl: './box.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tencapsulation: ViewEncapsulation.None,\n\timports: [IconComponent, ButtonComponent],\n\thost: {\n\t\tclass: 'box',\n\t\t'[class.mod-toggle]': 'toggle()',\n\t\t'[class.mod-neutral]': 'neutral()',\n\t},\n})\nexport class BoxComponent {\n\treadonly toggle = input(false, { transform: booleanAttribute });\n\treadonly neutral = input(false, { transform: booleanAttribute });\n\treadonly killable = input(false, { transform: booleanAttribute });\n}\n","@if (killable()) {\n\t<div class=\"box-close\">\n\t\t<button luButton=\"ghost\" type=\"button\">\n\t\t\t<lu-icon icon=\"signClose\" alt=\"Close\" />\n\t\t</button>\n\t</div>\n}\n<ng-content />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;MAiBa,YAAY,CAAA;AAbzB,IAAA,WAAA,GAAA;QAcU,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,mDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;QACtD,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,oDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;QACvD,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,qDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACjE,IAAA;8GAJY,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,EAAA,cAAA,EAAA,KAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjBzB,oMAQA,EAAA,MAAA,EAAA,CAAA,msEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDEW,aAAa,oGAAE,eAAe,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAO5B,YAAY,EAAA,UAAA,EAAA,CAAA;kBAbxB,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,QAAQ,EAAA,eAAA,EAGD,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,aAAa,EAAE,eAAe,CAAC,EAAA,IAAA,EACnC;AACL,wBAAA,KAAK,EAAE,KAAK;AACZ,wBAAA,oBAAoB,EAAE,UAAU;AAChC,wBAAA,qBAAqB,EAAE,WAAW;AAClC,qBAAA,EAAA,QAAA,EAAA,oMAAA,EAAA,MAAA,EAAA,CAAA,msEAAA,CAAA,EAAA;;;AEfF;;AAEG;;;;"}
1
+ {"version":3,"file":"lucca-front-ng-box.mjs","sources":["../../../packages/ng/box/box.component.ts","../../../packages/ng/box/box.component.html","../../../packages/ng/box/lucca-front-ng-box.ts"],"sourcesContent":["import { booleanAttribute, ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { ButtonComponent } from '@lucca-front/ng/button';\nimport { IconComponent } from '@lucca-front/ng/icon';\n\n@Component({\n\tselector: 'lu-box',\n\ttemplateUrl: './box.component.html',\n\tstyleUrl: './box.component.scss',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tencapsulation: ViewEncapsulation.None,\n\timports: [IconComponent, ButtonComponent],\n\thost: {\n\t\tclass: 'box',\n\t\t'[class.mod-toggle]': 'toggle()',\n\t\t'[class.mod-neutral]': 'neutral()',\n\t\t'[class.mod-withArrow]': 'withArrow()',\n\t},\n})\nexport class BoxComponent {\n\treadonly toggle = input(false, { transform: booleanAttribute });\n\treadonly neutral = input(false, { transform: booleanAttribute });\n\treadonly killable = input(false, { transform: booleanAttribute });\n\treadonly withArrow = input(false, { transform: booleanAttribute });\n}\n","@if (killable()) {\n\t<div class=\"box-close\">\n\t\t<button luButton=\"ghost\" type=\"button\">\n\t\t\t<lu-icon icon=\"signClose\" alt=\"Close\" />\n\t\t</button>\n\t</div>\n}\n<ng-content />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;MAkBa,YAAY,CAAA;AAdzB,IAAA,WAAA,GAAA;QAeU,IAAA,CAAA,MAAM,GAAG,KAAK,CAAC,KAAK,mDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;QACtD,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,oDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;QACvD,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,qDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;QACxD,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,sDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAClE,IAAA;8GALY,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAZ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,aAAA,EAAA,EAAA,cAAA,EAAA,KAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClBzB,oMAQA,EAAA,MAAA,EAAA,CAAA,msEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDEW,aAAa,oGAAE,eAAe,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAQ5B,YAAY,EAAA,UAAA,EAAA,CAAA;kBAdxB,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,QAAQ,EAAA,eAAA,EAGD,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,aAAa,EAAE,eAAe,CAAC,EAAA,IAAA,EACnC;AACL,wBAAA,KAAK,EAAE,KAAK;AACZ,wBAAA,oBAAoB,EAAE,UAAU;AAChC,wBAAA,qBAAqB,EAAE,WAAW;AAClC,wBAAA,uBAAuB,EAAE,aAAa;AACtC,qBAAA,EAAA,QAAA,EAAA,oMAAA,EAAA,MAAA,EAAA,CAAA,msEAAA,CAAA,EAAA;;;AEhBF;;AAEG;;;;"}
@@ -1,7 +1,7 @@
1
1
  import { UNORDERED_LIST, HEADING, ORDERED_LIST, BOLD_ITALIC_STAR, BOLD_ITALIC_UNDERSCORE, BOLD_STAR, BOLD_UNDERSCORE, INLINE_CODE, ITALIC_STAR, ITALIC_UNDERSCORE, STRIKETHROUGH, LINK, registerMarkdownShortcuts, $convertFromMarkdownString, $convertToMarkdownString } from '@lexical/markdown';
2
2
  import { registerRichText } from '@lexical/rich-text';
3
3
  import { mergeRegister } from '@lexical/utils';
4
- import { RichTextFormatter, RICH_TEXT_FORMATTER } from '@lucca-front/ng/forms/rich-text-input';
4
+ import { RichTextFormatter, RICH_TEXT_FORMATTER, $createTagNode, TagNode } from '@lucca-front/ng/forms/rich-text-input';
5
5
  import DOMPurify from 'isomorphic-dompurify';
6
6
 
7
7
  const DEFAULT_MARKDOWN_TRANSFORMERS = [
@@ -47,9 +47,30 @@ function provideLuRichTextMarkdownFormatter(transformers) {
47
47
  };
48
48
  }
49
49
 
50
+ /**
51
+ * Transformer for tag nodes
52
+ * It will match the following pattern `{{Tag}}` and create a TagNode (using `replace` function).
53
+ * It will export the tag node to markdown (as `{{Tag}}`) using the `export` function.
54
+ *
55
+ * @docs https://github.com/facebook/lexical/tree/main/packages/lexical-markdown#transformers
56
+ */
57
+ const TAGS = {
58
+ dependencies: [TagNode],
59
+ export: (node) => (node instanceof TagNode ? `{{${node.getTagKey()}}}` : null),
60
+ importRegExp: /{{(\w+)}}/,
61
+ regExp: /{{(\w+)}}/,
62
+ replace: (textNode, match) => {
63
+ if (match[1]) {
64
+ textNode.replace($createTagNode(match[1].trim()));
65
+ }
66
+ },
67
+ type: 'text-match',
68
+ trigger: '{{',
69
+ };
70
+
50
71
  /**
51
72
  * Generated bundle index. Do not edit.
52
73
  */
53
74
 
54
- export { DEFAULT_MARKDOWN_TRANSFORMERS, MarkdownFormatter, provideLuRichTextMarkdownFormatter };
75
+ export { DEFAULT_MARKDOWN_TRANSFORMERS, MarkdownFormatter, TAGS, provideLuRichTextMarkdownFormatter };
55
76
  //# sourceMappingURL=lucca-front-ng-forms-rich-text-input-formatters-markdown.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"lucca-front-ng-forms-rich-text-input-formatters-markdown.mjs","sources":["../../../packages/ng/forms/rich-text-input/formatters/markdown/markdown-formatter.ts","../../../packages/ng/forms/rich-text-input/formatters/markdown/lucca-front-ng-forms-rich-text-input-formatters-markdown.ts"],"sourcesContent":["import { Provider } from '@angular/core';\nimport {\n\t$convertFromMarkdownString,\n\t$convertToMarkdownString,\n\tBOLD_ITALIC_STAR,\n\tBOLD_ITALIC_UNDERSCORE,\n\tBOLD_STAR,\n\tBOLD_UNDERSCORE,\n\tHEADING,\n\tINLINE_CODE,\n\tITALIC_STAR,\n\tITALIC_UNDERSCORE,\n\tLINK,\n\tORDERED_LIST,\n\tregisterMarkdownShortcuts,\n\tSTRIKETHROUGH,\n\tTransformer,\n\tUNORDERED_LIST,\n} from '@lexical/markdown';\nimport { registerRichText } from '@lexical/rich-text';\nimport { mergeRegister } from '@lexical/utils';\nimport { RICH_TEXT_FORMATTER, RichTextFormatter } from '@lucca-front/ng/forms/rich-text-input';\nimport DOMPurify from 'isomorphic-dompurify';\nimport { LexicalEditor } from 'lexical';\n\nexport const DEFAULT_MARKDOWN_TRANSFORMERS: Transformer[] = [\n\tUNORDERED_LIST,\n\tHEADING,\n\tORDERED_LIST,\n\tBOLD_ITALIC_STAR,\n\tBOLD_ITALIC_UNDERSCORE,\n\tBOLD_STAR,\n\tBOLD_UNDERSCORE,\n\tINLINE_CODE,\n\tITALIC_STAR,\n\tITALIC_UNDERSCORE,\n\tSTRIKETHROUGH,\n\tLINK,\n];\n\nexport class MarkdownFormatter extends RichTextFormatter {\n\t#transformers: Transformer[] = DEFAULT_MARKDOWN_TRANSFORMERS;\n\n\tconstructor(transformers?: Transformer[]) {\n\t\tsuper();\n\t\tif (transformers) {\n\t\t\tthis.#transformers = transformers;\n\t\t}\n\t}\n\n\toverride registerTextPlugin(editor: LexicalEditor): () => void {\n\t\treturn mergeRegister(registerMarkdownShortcuts(editor, this.#transformers), registerRichText(editor));\n\t}\n\n\toverride parse(editor: LexicalEditor, markdown?: string | null): void {\n\t\teditor.update(() => {\n\t\t\t$convertFromMarkdownString(DOMPurify.sanitize(markdown ?? ''), this.#transformers, null, true);\n\t\t});\n\t}\n\n\toverride format(editor: LexicalEditor): string {\n\t\tlet result = '';\n\t\teditor.getEditorState().read(() => (result = $convertToMarkdownString(this.#transformers, null, true)));\n\t\treturn DOMPurify.sanitize(result);\n\t}\n}\n\nexport function provideLuRichTextMarkdownFormatter(transformers?: Transformer[]): Provider {\n\treturn {\n\t\tprovide: RICH_TEXT_FORMATTER,\n\t\tuseFactory: () => new MarkdownFormatter(transformers),\n\t};\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAyBO,MAAM,6BAA6B,GAAkB;IAC3D,cAAc;IACd,OAAO;IACP,YAAY;IACZ,gBAAgB;IAChB,sBAAsB;IACtB,SAAS;IACT,eAAe;IACf,WAAW;IACX,WAAW;IACX,iBAAiB;IACjB,aAAa;IACb,IAAI;;AAGC,MAAO,iBAAkB,SAAQ,iBAAiB,CAAA;IACvD,aAAa,GAAkB,6BAA6B;AAE5D,IAAA,WAAA,CAAY,YAA4B,EAAA;AACvC,QAAA,KAAK,EAAE;QACP,IAAI,YAAY,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,GAAG,YAAY;QAClC;IACD;AAES,IAAA,kBAAkB,CAAC,MAAqB,EAAA;AAChD,QAAA,OAAO,aAAa,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtG;IAES,KAAK,CAAC,MAAqB,EAAE,QAAwB,EAAA;AAC7D,QAAA,MAAM,CAAC,MAAM,CAAC,MAAK;AAClB,YAAA,0BAA0B,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC;AAC/F,QAAA,CAAC,CAAC;IACH;AAES,IAAA,MAAM,CAAC,MAAqB,EAAA;QACpC,IAAI,MAAM,GAAG,EAAE;QACf,MAAM,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,OAAO,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACvG,QAAA,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAClC;AACA;AAEK,SAAU,kCAAkC,CAAC,YAA4B,EAAA;IAC9E,OAAO;AACN,QAAA,OAAO,EAAE,mBAAmB;QAC5B,UAAU,EAAE,MAAM,IAAI,iBAAiB,CAAC,YAAY,CAAC;KACrD;AACF;;ACxEA;;AAEG;;;;"}
1
+ {"version":3,"file":"lucca-front-ng-forms-rich-text-input-formatters-markdown.mjs","sources":["../../../packages/ng/forms/rich-text-input/formatters/markdown/markdown-formatter.ts","../../../packages/ng/forms/rich-text-input/formatters/markdown/transformers/tag.transformers.ts","../../../packages/ng/forms/rich-text-input/formatters/markdown/lucca-front-ng-forms-rich-text-input-formatters-markdown.ts"],"sourcesContent":["import { Provider } from '@angular/core';\nimport {\n\t$convertFromMarkdownString,\n\t$convertToMarkdownString,\n\tBOLD_ITALIC_STAR,\n\tBOLD_ITALIC_UNDERSCORE,\n\tBOLD_STAR,\n\tBOLD_UNDERSCORE,\n\tHEADING,\n\tINLINE_CODE,\n\tITALIC_STAR,\n\tITALIC_UNDERSCORE,\n\tLINK,\n\tORDERED_LIST,\n\tregisterMarkdownShortcuts,\n\tSTRIKETHROUGH,\n\tTransformer,\n\tUNORDERED_LIST,\n} from '@lexical/markdown';\nimport { registerRichText } from '@lexical/rich-text';\nimport { mergeRegister } from '@lexical/utils';\nimport { RICH_TEXT_FORMATTER, RichTextFormatter } from '@lucca-front/ng/forms/rich-text-input';\nimport DOMPurify from 'isomorphic-dompurify';\nimport { LexicalEditor } from 'lexical';\n\nexport const DEFAULT_MARKDOWN_TRANSFORMERS: Transformer[] = [\n\tUNORDERED_LIST,\n\tHEADING,\n\tORDERED_LIST,\n\tBOLD_ITALIC_STAR,\n\tBOLD_ITALIC_UNDERSCORE,\n\tBOLD_STAR,\n\tBOLD_UNDERSCORE,\n\tINLINE_CODE,\n\tITALIC_STAR,\n\tITALIC_UNDERSCORE,\n\tSTRIKETHROUGH,\n\tLINK,\n];\n\nexport class MarkdownFormatter extends RichTextFormatter {\n\t#transformers: Transformer[] = DEFAULT_MARKDOWN_TRANSFORMERS;\n\n\tconstructor(transformers?: Transformer[]) {\n\t\tsuper();\n\t\tif (transformers) {\n\t\t\tthis.#transformers = transformers;\n\t\t}\n\t}\n\n\toverride registerTextPlugin(editor: LexicalEditor): () => void {\n\t\treturn mergeRegister(registerMarkdownShortcuts(editor, this.#transformers), registerRichText(editor));\n\t}\n\n\toverride parse(editor: LexicalEditor, markdown?: string | null): void {\n\t\teditor.update(() => {\n\t\t\t$convertFromMarkdownString(DOMPurify.sanitize(markdown ?? ''), this.#transformers, null, true);\n\t\t});\n\t}\n\n\toverride format(editor: LexicalEditor): string {\n\t\tlet result = '';\n\t\teditor.getEditorState().read(() => (result = $convertToMarkdownString(this.#transformers, null, true)));\n\t\treturn DOMPurify.sanitize(result);\n\t}\n}\n\nexport function provideLuRichTextMarkdownFormatter(transformers?: Transformer[]): Provider {\n\treturn {\n\t\tprovide: RICH_TEXT_FORMATTER,\n\t\tuseFactory: () => new MarkdownFormatter(transformers),\n\t};\n}\n","import { TextMatchTransformer } from '@lexical/markdown';\nimport { $createTagNode, TagNode } from '@lucca-front/ng/forms/rich-text-input';\n\n/**\n * Transformer for tag nodes\n * It will match the following pattern `{{Tag}}` and create a TagNode (using `replace` function).\n * It will export the tag node to markdown (as `{{Tag}}`) using the `export` function.\n *\n * @docs https://github.com/facebook/lexical/tree/main/packages/lexical-markdown#transformers\n */\nexport const TAGS: TextMatchTransformer = {\n\tdependencies: [TagNode],\n\texport: (node) => (node instanceof TagNode ? `{{${node.getTagKey()}}}` : null),\n\timportRegExp: /{{(\\w+)}}/,\n\tregExp: /{{(\\w+)}}/,\n\treplace: (textNode, match) => {\n\t\tif (match[1]) {\n\t\t\ttextNode.replace($createTagNode(match[1].trim()));\n\t\t}\n\t},\n\ttype: 'text-match',\n\ttrigger: '{{',\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAyBO,MAAM,6BAA6B,GAAkB;IAC3D,cAAc;IACd,OAAO;IACP,YAAY;IACZ,gBAAgB;IAChB,sBAAsB;IACtB,SAAS;IACT,eAAe;IACf,WAAW;IACX,WAAW;IACX,iBAAiB;IACjB,aAAa;IACb,IAAI;;AAGC,MAAO,iBAAkB,SAAQ,iBAAiB,CAAA;IACvD,aAAa,GAAkB,6BAA6B;AAE5D,IAAA,WAAA,CAAY,YAA4B,EAAA;AACvC,QAAA,KAAK,EAAE;QACP,IAAI,YAAY,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,GAAG,YAAY;QAClC;IACD;AAES,IAAA,kBAAkB,CAAC,MAAqB,EAAA;AAChD,QAAA,OAAO,aAAa,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtG;IAES,KAAK,CAAC,MAAqB,EAAE,QAAwB,EAAA;AAC7D,QAAA,MAAM,CAAC,MAAM,CAAC,MAAK;AAClB,YAAA,0BAA0B,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC;AAC/F,QAAA,CAAC,CAAC;IACH;AAES,IAAA,MAAM,CAAC,MAAqB,EAAA;QACpC,IAAI,MAAM,GAAG,EAAE;QACf,MAAM,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,OAAO,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACvG,QAAA,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAClC;AACA;AAEK,SAAU,kCAAkC,CAAC,YAA4B,EAAA;IAC9E,OAAO;AACN,QAAA,OAAO,EAAE,mBAAmB;QAC5B,UAAU,EAAE,MAAM,IAAI,iBAAiB,CAAC,YAAY,CAAC;KACrD;AACF;;ACrEA;;;;;;AAMG;AACI,MAAM,IAAI,GAAyB;IACzC,YAAY,EAAE,CAAC,OAAO,CAAC;IACvB,MAAM,EAAE,CAAC,IAAI,MAAM,IAAI,YAAY,OAAO,GAAG,CAAA,EAAA,EAAK,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;AAC9E,IAAA,YAAY,EAAE,WAAW;AACzB,IAAA,MAAM,EAAE,WAAW;AACnB,IAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAI;AAC5B,QAAA,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;AACb,YAAA,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD;IACD,CAAC;AACD,IAAA,IAAI,EAAE,YAAY;AAClB,IAAA,OAAO,EAAE,IAAI;;;ACrBd;;AAEG;;;;"}
@@ -1,11 +1,24 @@
1
- import { $convertFromMarkdownString, $convertToMarkdownString } from '@lexical/markdown';
1
+ import { $createTagNode, RichTextFormatter, RICH_TEXT_FORMATTER } from '@lucca-front/ng/forms/rich-text-input';
2
+ import { $getRoot, $createParagraphNode, $createTextNode } from 'lexical';
3
+ import { $rootTextContent } from '@lexical/text';
2
4
  import { registerPlainText } from '@lexical/plain-text';
3
- import { RichTextFormatter, RICH_TEXT_FORMATTER } from '@lucca-front/ng/forms/rich-text-input';
4
5
 
5
- const DEFAULT_PLAIN_TEXT_MD_TRANSFORMERS = [];
6
+ /**
7
+ * Transformer for tag nodes
8
+ * It will match the following pattern `{{Tag}}` and create a TagNode (using `replace` function).
9
+ *
10
+ */
11
+ const PLAINTEXT_TAGS = {
12
+ regExp: /{{(\w+)}}/,
13
+ replace: (textNode, match) => {
14
+ if (match[1]) {
15
+ textNode.replace($createTagNode(match[1].trim()));
16
+ }
17
+ },
18
+ };
19
+
6
20
  class PlainTextFormatter extends RichTextFormatter {
7
- #transformers = DEFAULT_PLAIN_TEXT_MD_TRANSFORMERS;
8
- #shouldPreserveNewLinesInMarkdown = true;
21
+ #transformers = [PLAINTEXT_TAGS];
9
22
  constructor(transformers) {
10
23
  super();
11
24
  if (transformers) {
@@ -15,17 +28,51 @@ class PlainTextFormatter extends RichTextFormatter {
15
28
  registerTextPlugin(editor) {
16
29
  return registerPlainText(editor);
17
30
  }
18
- parse(editor, markdown) {
31
+ parse(editor, text) {
19
32
  editor.update(() => {
20
- $convertFromMarkdownString(markdown ?? '', this.#transformers, undefined, this.#shouldPreserveNewLinesInMarkdown);
33
+ const rootNode = $getRoot();
34
+ rootNode.clear();
35
+ if (text) {
36
+ const paragraphNode = $createParagraphNode();
37
+ const textNode = $createTextNode(text);
38
+ paragraphNode.append(textNode);
39
+ rootNode.append(paragraphNode);
40
+ this.#applyTransformers(textNode);
41
+ }
21
42
  });
22
- $convertFromMarkdownString(markdown ?? '', this.#transformers, undefined, this.#shouldPreserveNewLinesInMarkdown);
23
43
  }
24
44
  format(editor) {
25
45
  let result = '';
26
- editor.getEditorState().read(() => (result = $convertToMarkdownString(this.#transformers, undefined, this.#shouldPreserveNewLinesInMarkdown)));
46
+ editor.getEditorState().read(() => (result = $rootTextContent()));
27
47
  return result;
28
48
  }
49
+ #applyTransformers(textNode) {
50
+ for (const t of this.#transformers) {
51
+ const match = textNode.getTextContent().match(t.regExp);
52
+ if (!match) {
53
+ continue;
54
+ }
55
+ const startIndex = match.index || 0;
56
+ const endIndex = startIndex + match[0].length;
57
+ let transformedNode, nodeAfter, nodeBefore;
58
+ if (startIndex === 0) {
59
+ [transformedNode, nodeAfter] = textNode.splitText(endIndex);
60
+ }
61
+ else {
62
+ [nodeBefore, transformedNode, nodeAfter] = textNode.splitText(startIndex, endIndex);
63
+ }
64
+ if (transformedNode) {
65
+ t.replace(transformedNode, match);
66
+ }
67
+ if (nodeAfter) {
68
+ this.#applyTransformers(nodeAfter);
69
+ }
70
+ if (nodeBefore) {
71
+ this.#applyTransformers(nodeBefore);
72
+ }
73
+ break;
74
+ }
75
+ }
29
76
  }
30
77
  function provideLuRichTextPlainTextFormatter(transformers) {
31
78
  return {
@@ -38,5 +85,5 @@ function provideLuRichTextPlainTextFormatter(transformers) {
38
85
  * Generated bundle index. Do not edit.
39
86
  */
40
87
 
41
- export { PlainTextFormatter, provideLuRichTextPlainTextFormatter };
88
+ export { PLAINTEXT_TAGS, PlainTextFormatter, provideLuRichTextPlainTextFormatter };
42
89
  //# sourceMappingURL=lucca-front-ng-forms-rich-text-input-formatters-plain-text.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"lucca-front-ng-forms-rich-text-input-formatters-plain-text.mjs","sources":["../../../packages/ng/forms/rich-text-input/formatters/plain-text/plain-text-formatter.ts","../../../packages/ng/forms/rich-text-input/formatters/plain-text/lucca-front-ng-forms-rich-text-input-formatters-plain-text.ts"],"sourcesContent":["import { Provider } from '@angular/core';\nimport { $convertFromMarkdownString, $convertToMarkdownString, Transformer } from '@lexical/markdown';\nimport { registerPlainText } from '@lexical/plain-text';\nimport { RICH_TEXT_FORMATTER, RichTextFormatter } from '@lucca-front/ng/forms/rich-text-input';\nimport { LexicalEditor } from 'lexical';\n\nconst DEFAULT_PLAIN_TEXT_MD_TRANSFORMERS: Transformer[] = [];\n\nexport class PlainTextFormatter extends RichTextFormatter {\n\t#transformers: Transformer[] = DEFAULT_PLAIN_TEXT_MD_TRANSFORMERS;\n\treadonly #shouldPreserveNewLinesInMarkdown = true;\n\n\tconstructor(transformers?: Transformer[]) {\n\t\tsuper();\n\t\tif (transformers) {\n\t\t\tthis.#transformers = transformers;\n\t\t}\n\t}\n\n\toverride registerTextPlugin(editor: LexicalEditor) {\n\t\treturn registerPlainText(editor);\n\t}\n\n\toverride parse(editor: LexicalEditor, markdown?: string | null): void {\n\t\teditor.update(() => {\n\t\t\t$convertFromMarkdownString(markdown ?? '', this.#transformers, undefined, this.#shouldPreserveNewLinesInMarkdown);\n\t\t});\n\t\t$convertFromMarkdownString(markdown ?? '', this.#transformers, undefined, this.#shouldPreserveNewLinesInMarkdown);\n\t}\n\n\toverride format(editor: LexicalEditor): string {\n\t\tlet result = '';\n\t\teditor.getEditorState().read(() => (result = $convertToMarkdownString(this.#transformers, undefined, this.#shouldPreserveNewLinesInMarkdown)));\n\t\treturn result;\n\t}\n}\n\nexport function provideLuRichTextPlainTextFormatter(transformers?: Transformer[]): Provider {\n\treturn {\n\t\tprovide: RICH_TEXT_FORMATTER,\n\t\tuseFactory: () => new PlainTextFormatter(transformers),\n\t};\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAMA,MAAM,kCAAkC,GAAkB,EAAE;AAEtD,MAAO,kBAAmB,SAAQ,iBAAiB,CAAA;IACxD,aAAa,GAAkB,kCAAkC;IACxD,iCAAiC,GAAG,IAAI;AAEjD,IAAA,WAAA,CAAY,YAA4B,EAAA;AACvC,QAAA,KAAK,EAAE;QACP,IAAI,YAAY,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,GAAG,YAAY;QAClC;IACD;AAES,IAAA,kBAAkB,CAAC,MAAqB,EAAA;AAChD,QAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC;IACjC;IAES,KAAK,CAAC,MAAqB,EAAE,QAAwB,EAAA;AAC7D,QAAA,MAAM,CAAC,MAAM,CAAC,MAAK;AAClB,YAAA,0BAA0B,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,iCAAiC,CAAC;AAClH,QAAA,CAAC,CAAC;AACF,QAAA,0BAA0B,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,iCAAiC,CAAC;IAClH;AAES,IAAA,MAAM,CAAC,MAAqB,EAAA;QACpC,IAAI,MAAM,GAAG,EAAE;QACf,MAAM,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,OAAO,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;AAC9I,QAAA,OAAO,MAAM;IACd;AACA;AAEK,SAAU,mCAAmC,CAAC,YAA4B,EAAA;IAC/E,OAAO;AACN,QAAA,OAAO,EAAE,mBAAmB;QAC5B,UAAU,EAAE,MAAM,IAAI,kBAAkB,CAAC,YAAY,CAAC;KACtD;AACF;;AC1CA;;AAEG;;;;"}
1
+ {"version":3,"file":"lucca-front-ng-forms-rich-text-input-formatters-plain-text.mjs","sources":["../../../packages/ng/forms/rich-text-input/formatters/plain-text/transformers/tag.transformers.ts","../../../packages/ng/forms/rich-text-input/formatters/plain-text/plain-text-formatter.ts","../../../packages/ng/forms/rich-text-input/formatters/plain-text/lucca-front-ng-forms-rich-text-input-formatters-plain-text.ts"],"sourcesContent":["import { $createTagNode } from '@lucca-front/ng/forms/rich-text-input';\nimport { PlainTextTransformer } from './plain-text-transformer';\n\n/**\n * Transformer for tag nodes\n * It will match the following pattern `{{Tag}}` and create a TagNode (using `replace` function).\n *\n */\nexport const PLAINTEXT_TAGS: PlainTextTransformer = {\n\tregExp: /{{(\\w+)}}/,\n\treplace: (textNode, match) => {\n\t\tif (match[1]) {\n\t\t\ttextNode.replace($createTagNode(match[1].trim()));\n\t\t}\n\t},\n};\n","import { Provider } from '@angular/core';\nimport { RICH_TEXT_FORMATTER, RichTextFormatter } from '@lucca-front/ng/forms/rich-text-input';\nimport { $createParagraphNode, $createTextNode, $getRoot, LexicalEditor, TextNode } from 'lexical';\nimport { $rootTextContent } from '@lexical/text';\nimport { PLAINTEXT_TAGS, PlainTextTransformer } from './transformers';\nimport { registerPlainText } from '@lexical/plain-text';\n\nexport class PlainTextFormatter extends RichTextFormatter {\n\t#transformers: PlainTextTransformer[] = [PLAINTEXT_TAGS];\n\n\tconstructor(transformers?: PlainTextTransformer[]) {\n\t\tsuper();\n\t\tif (transformers) {\n\t\t\tthis.#transformers = transformers;\n\t\t}\n\t}\n\n\toverride registerTextPlugin(editor: LexicalEditor) {\n\t\treturn registerPlainText(editor);\n\t}\n\n\toverride parse(editor: LexicalEditor, text?: string | null): void {\n\t\teditor.update(() => {\n\t\t\tconst rootNode = $getRoot();\n\t\t\trootNode.clear();\n\t\t\tif (text) {\n\t\t\t\tconst paragraphNode = $createParagraphNode();\n\t\t\t\tconst textNode = $createTextNode(text);\n\t\t\t\tparagraphNode.append(textNode);\n\t\t\t\trootNode.append(paragraphNode);\n\t\t\t\tthis.#applyTransformers(textNode);\n\t\t\t}\n\t\t});\n\t}\n\n\toverride format(editor: LexicalEditor): string {\n\t\tlet result = '';\n\t\teditor.getEditorState().read(() => (result = $rootTextContent()));\n\t\treturn result;\n\t}\n\n\t#applyTransformers(textNode: TextNode): void {\n\t\tfor (const t of this.#transformers) {\n\t\t\tconst match = textNode.getTextContent().match(t.regExp);\n\n\t\t\tif (!match) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst startIndex = match.index || 0;\n\t\t\tconst endIndex = startIndex + match[0].length;\n\n\t\t\tlet transformedNode: TextNode, nodeAfter: TextNode, nodeBefore: TextNode;\n\t\t\tif (startIndex === 0) {\n\t\t\t\t[transformedNode, nodeAfter] = textNode.splitText(endIndex);\n\t\t\t} else {\n\t\t\t\t[nodeBefore, transformedNode, nodeAfter] = textNode.splitText(startIndex, endIndex);\n\t\t\t}\n\t\t\tif (transformedNode) {\n\t\t\t\tt.replace(transformedNode, match);\n\t\t\t}\n\t\t\tif (nodeAfter) {\n\t\t\t\tthis.#applyTransformers(nodeAfter);\n\t\t\t}\n\t\t\tif (nodeBefore) {\n\t\t\t\tthis.#applyTransformers(nodeBefore);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nexport function provideLuRichTextPlainTextFormatter(transformers?: PlainTextTransformer[]): Provider {\n\treturn {\n\t\tprovide: RICH_TEXT_FORMATTER,\n\t\tuseFactory: () => new PlainTextFormatter(transformers),\n\t};\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAGA;;;;AAIG;AACI,MAAM,cAAc,GAAyB;AACnD,IAAA,MAAM,EAAE,WAAW;AACnB,IAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAI;AAC5B,QAAA,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;AACb,YAAA,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD;IACD,CAAC;;;ACPI,MAAO,kBAAmB,SAAQ,iBAAiB,CAAA;AACxD,IAAA,aAAa,GAA2B,CAAC,cAAc,CAAC;AAExD,IAAA,WAAA,CAAY,YAAqC,EAAA;AAChD,QAAA,KAAK,EAAE;QACP,IAAI,YAAY,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,GAAG,YAAY;QAClC;IACD;AAES,IAAA,kBAAkB,CAAC,MAAqB,EAAA;AAChD,QAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC;IACjC;IAES,KAAK,CAAC,MAAqB,EAAE,IAAoB,EAAA;AACzD,QAAA,MAAM,CAAC,MAAM,CAAC,MAAK;AAClB,YAAA,MAAM,QAAQ,GAAG,QAAQ,EAAE;YAC3B,QAAQ,CAAC,KAAK,EAAE;YAChB,IAAI,IAAI,EAAE;AACT,gBAAA,MAAM,aAAa,GAAG,oBAAoB,EAAE;AAC5C,gBAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC;AACtC,gBAAA,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC9B,gBAAA,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC;AAC9B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;YAClC;AACD,QAAA,CAAC,CAAC;IACH;AAES,IAAA,MAAM,CAAC,MAAqB,EAAA;QACpC,IAAI,MAAM,GAAG,EAAE;AACf,QAAA,MAAM,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,OAAO,MAAM,GAAG,gBAAgB,EAAE,CAAC,CAAC;AACjE,QAAA,OAAO,MAAM;IACd;AAEA,IAAA,kBAAkB,CAAC,QAAkB,EAAA;AACpC,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YAEvD,IAAI,CAAC,KAAK,EAAE;gBACX;YACD;AAEA,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC;YACnC,MAAM,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;AAE7C,YAAA,IAAI,eAAyB,EAAE,SAAmB,EAAE,UAAoB;AACxE,YAAA,IAAI,UAAU,KAAK,CAAC,EAAE;gBACrB,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;YAC5D;iBAAO;AACN,gBAAA,CAAC,UAAU,EAAE,eAAe,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC;YACpF;YACA,IAAI,eAAe,EAAE;AACpB,gBAAA,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC;YAClC;YACA,IAAI,SAAS,EAAE;AACd,gBAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC;YACnC;YACA,IAAI,UAAU,EAAE;AACf,gBAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC;YACpC;YACA;QACD;IACD;AACA;AAEK,SAAU,mCAAmC,CAAC,YAAqC,EAAA;IACxF,OAAO;AACN,QAAA,OAAO,EAAE,mBAAmB;QAC5B,UAAU,EAAE,MAAM,IAAI,kBAAkB,CAAC,YAAY,CAAC;KACtD;AACF;;AC7EA;;AAEG;;;;"}
@@ -1247,27 +1247,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
1247
1247
  ], template: "<div class=\"richTextField-toolbar-chips\" (keydown.arrowleft)=\"focusTag($event, -1)\" (keydown.arrowRight)=\"focusTag($event, 1)\">\n\t<span aria-hidden=\"true\">{{ intl.insertTag }}</span>\n\t@for (tag of tags(); track tag) {\n\t\t<lu-chip\n\t\t\t[attr.tabindex]=\"isDisabled() ? null : $first ? 0 : -1\"\n\t\t\t[disabled]=\"isDisabled()\"\n\t\t\t(click)=\"!isDisabled() ? insertTag(tag) : null\"\n\t\t\t(keyup.space)=\"!isDisabled() ? insertTag(tag) : null\"\n\t\t\t(keyup.enter)=\"!isDisabled() ? insertTag(tag) : null\"\n\t\t\tclass=\"richTextField-toolbar-chips-chip\"\n\t\t\tpalette=\"product\"\n\t\t\t#tagButton\n\t\t\tunkillable\n\t\t>\n\t\t\t<span class=\"pr-u-mask\">{{ intl.insertTag }}</span>\n\t\t\t{{ tag.description }}\n\t\t</lu-chip>\n\t}\n</div>\n", styles: ["@layer components{.chip{--components-chip-font: var(--pr-t-font-body-S);--components-chip-backgroundColor: var(--palettes-100, var(--palettes-neutral-100));--components-chip-color: var(--palettes-800, var(--pr-t-color-text));--components-chip-borderRadius: var(--pr-t-border-radius-default);--components-chip-kill-size: .75rem;--components-chip-kill-disk-color: var(--palettes-800, var(--palettes-neutral-800));--components-chip-kill-cross-color: var(--palettes-text, var(--palettes-neutral-text));--components-chip-kill-background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='16' width='16' fill='none'%3E%3Cpath d='M5.80473 4.86192C5.54438 4.60157 5.12227 4.60157 4.86192 4.86192C4.60157 5.12227 4.60157 5.54438 4.86192 5.80473L7.05718 7.99999L4.86192 10.1953C4.60157 10.4556 4.60157 10.8777 4.86192 11.1381C5.12227 11.3984 5.54438 11.3984 5.80473 11.1381L7.99999 8.9428L10.1953 11.1381C10.4556 11.3984 10.8777 11.3984 11.1381 11.1381C11.3984 10.8777 11.3984 10.4556 11.1381 10.1953L8.9428 7.99999L11.1381 5.80473C11.3984 5.54438 11.3984 5.12227 11.1381 4.86192C10.8777 4.60157 10.4556 4.60157 10.1953 4.86192L7.99999 7.05718L5.80473 4.86192Z' fill='currentColor'/%3E%3C/svg%3E\");--components-chip-fontSize: var(--pr-t-font-body-S-fontSize);--components-chip-lineHeight: var(--pr-t-font-body-S-lineHeight);background-color:var(--components-chip-backgroundColor);border:none;border-radius:var(--components-chip-borderRadius);color:var(--components-chip-color);display:inline-flex;align-items:center;position:relative;vertical-align:middle;padding-block:calc(var(--pr-t-spacings-50) / 2);padding-inline:var(--pr-t-spacings-100);font:var(--components-chip-font);max-inline-size:100%}.chip .lucca-icon{--icon-size: 1rem;margin-inline-end:var(--pr-t-spacings-50)}.chip-content{outline:none}.chip-kill{padding:0;border:0;inline-size:100%;background-color:transparent;color:inherit;text-align:start;display:block;font:inherit;display:grid;grid-template-columns:1fr;grid-template-rows:1fr;grid-template-areas:\"main\";place-items:center;inline-size:var(--pr-t-spacings-300);block-size:var(--pr-t-spacings-300);margin:calc(var(--pr-t-spacings-75) * -1);margin-inline-start:var(--pr-t-spacings-25);flex-shrink:0;cursor:pointer}.chip-kill:before,.chip-kill:after{content:\"\";grid-area:main;inline-size:var(--components-chip-kill-size);block-size:var(--components-chip-kill-size)}.chip-kill:before{border-radius:var(--pr-t-border-radius-full);background-color:var(--components-chip-kill-disk-color)}.chip-kill:after{-webkit-mask-image:var(--components-chip-kill-background-image);mask-image:var(--components-chip-kill-background-image);-webkit-mask-size:var(--components-chip-kill-size);mask-size:var(--components-chip-kill-size);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;background-color:var(--components-chip-kill-cross-color)}.chip-kill:hover{--components-chip-kill-disk-color: var(--palettes-700, var(--palettes-neutral-700))}.chip-kill:focus-visible{outline:2px solid var(--palettes-product-700);outline-offset:-4px;border-radius:var(--pr-t-border-radius-full)}.chip-kill:active{--components-chip-kill-disk-color: var(--palettes-900, var(--palettes-neutral-900))}}@layer mods{.chip.mod-S{--components-chip-font: var(--pr-t-font-body-XS);--components-chip-borderRadius: var(--pr-t-border-radius-small)}.chip.mod-S .lucca-icon{--icon-size: .75rem}.chip.mod-unkillable .chip-kill{display:none}.chip.mod-clickable{cursor:pointer;text-decoration:none}.chip.is-disabled{--components-chip-backgroundColor: var(--palettes-neutral-200);--components-chip-color: var(--pr-t-color-text-subtle)}.chip.is-disabled .chip-kill{display:none}.chip:has(.chip-content:focus-visible){outline:2px solid var(--palettes-product-700);outline-offset:2px}}\n"] }]
1248
1248
  }], ctorParameters: () => [], propDecorators: { tags: [{ type: i0.Input, args: [{ isSignal: true, alias: "tags", required: true }] }], focusableElements: [{ type: i0.ViewChildren, args: ['tagButton', { ...{ read: ElementRef }, isSignal: true }] }] } });
1249
1249
 
1250
- /**
1251
- * Transformer for tag nodes
1252
- * It will match the following pattern `{{Tag}}` and create a TagNode (using `replace` function).
1253
- * It will export the tag node to markdown (as `{{Tag}}`) using the `export` function.
1254
- *
1255
- * @docs https://github.com/facebook/lexical/tree/main/packages/lexical-markdown#transformers
1256
- */
1257
- const TAGS = {
1258
- dependencies: [TagNode],
1259
- export: (node) => (node instanceof TagNode ? `{{${node.getTagKey()}}}` : null),
1260
- importRegExp: /{{(\w+)}}/,
1261
- regExp: /{{(\w+)}}/,
1262
- replace: (textNode, match) => {
1263
- if (match[1]) {
1264
- textNode.replace($createTagNode(match[1].trim()));
1265
- }
1266
- },
1267
- type: 'text-match',
1268
- trigger: '{{',
1269
- };
1270
-
1271
1250
  function registerFormatSelectionChange(editor, format, onselectionchange) {
1272
1251
  return editor.registerCommand(SELECTION_CHANGE_COMMAND, () => {
1273
1252
  const selection = $getSelection();
@@ -1397,5 +1376,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
1397
1376
  * Generated bundle index. Do not edit.
1398
1377
  */
1399
1378
 
1400
- export { ClearFormatComponent, HeadingsComponent, INITIAL_UPDATE_TAG, LinkComponent, ListStyleToolbarComponent, RICH_TEXT_FORMATTER, RICH_TEXT_PLUGIN_COMPONENT, RichTextFormatter, RichTextInputComponent, RichTextInputToolbarComponent, RichTextPluginTagComponent, SKIP_DOM_SELECTION_TAG, TAGS, TextStyleComponent, TextStyleToolbarComponent };
1379
+ export { $createTagNode, $isTagNode, ClearFormatComponent, HeadingsComponent, INITIAL_UPDATE_TAG, LinkComponent, ListStyleToolbarComponent, RICH_TEXT_FORMATTER, RICH_TEXT_PLUGIN_COMPONENT, RichTextFormatter, RichTextInputComponent, RichTextInputToolbarComponent, RichTextPluginTagComponent, SKIP_DOM_SELECTION_TAG, TagNode, TextStyleComponent, TextStyleToolbarComponent };
1401
1380
  //# sourceMappingURL=lucca-front-ng-forms-rich-text-input.mjs.map