@flogeez/angular-tiptap-editor 3.1.3 → 3.1.5

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 (117) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +2 -2
  3. package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
  4. package/esm2022/lib/ate-editor.provider.mjs +38 -0
  5. package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
  6. package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +137 -0
  7. package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
  8. package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +309 -0
  9. package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
  10. package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +126 -0
  11. package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +271 -0
  12. package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +272 -0
  13. package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +123 -0
  14. package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
  15. package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +1032 -0
  16. package/esm2022/lib/components/editor/ate-block-controls.component.mjs +256 -0
  17. package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +328 -0
  18. package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
  19. package/esm2022/lib/components/ui/ate-button.component.mjs +91 -0
  20. package/esm2022/lib/components/ui/ate-separator.component.mjs +11 -0
  21. package/esm2022/lib/config/ate-editor.config.mjs +133 -0
  22. package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
  23. package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
  24. package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
  25. package/esm2022/lib/directives/ate-tooltip.directive.mjs +138 -0
  26. package/esm2022/lib/extensions/ate-block-controls.extension.mjs +156 -0
  27. package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
  28. package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +277 -0
  29. package/esm2022/lib/extensions/ate-table.extension.mjs +27 -0
  30. package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
  31. package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
  32. package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
  33. package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
  34. package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
  35. package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
  36. package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
  37. package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
  38. package/esm2022/lib/models/ate-bubble-menu.model.mjs +53 -0
  39. package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
  40. package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
  41. package/esm2022/lib/models/ate-image.model.mjs +2 -0
  42. package/esm2022/lib/models/ate-slash-command.model.mjs +2 -0
  43. package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
  44. package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
  45. package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
  46. package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
  47. package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
  48. package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
  49. package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
  50. package/esm2022/lib/services/ate-color-picker.service.mjs +194 -0
  51. package/esm2022/lib/services/ate-editor-commands.service.mjs +507 -0
  52. package/esm2022/lib/services/ate-export.service.mjs +71 -0
  53. package/esm2022/lib/services/ate-i18n.service.mjs +449 -0
  54. package/esm2022/lib/services/ate-image.service.mjs +459 -0
  55. package/esm2022/lib/services/ate-link.service.mjs +99 -0
  56. package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
  57. package/esm2022/lib/utils/ate-markdown.utils.mjs +179 -0
  58. package/esm2022/public-api.mjs +41 -0
  59. package/fesm2022/flogeez-angular-tiptap-editor.mjs +627 -354
  60. package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
  61. package/index.d.ts +3 -1734
  62. package/lib/ate-editor.provider.d.ts +21 -0
  63. package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
  64. package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
  65. package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
  66. package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +49 -0
  67. package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
  68. package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +16 -0
  69. package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +25 -0
  70. package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
  71. package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
  72. package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
  73. package/lib/components/editor/angular-tiptap-editor.component.d.ts +242 -0
  74. package/lib/components/editor/ate-block-controls.component.d.ts +44 -0
  75. package/lib/components/slash-commands/ate-slash-commands.component.d.ts +34 -0
  76. package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
  77. package/lib/components/ui/ate-button.component.d.ts +25 -0
  78. package/lib/components/ui/ate-separator.component.d.ts +5 -0
  79. package/lib/config/ate-editor.config.d.ts +19 -0
  80. package/lib/config/ate-global-config.token.d.ts +6 -0
  81. package/lib/config/ate-slash-commands.config.d.ts +41 -0
  82. package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
  83. package/lib/directives/ate-tooltip.directive.d.ts +30 -0
  84. package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
  85. package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
  86. package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
  87. package/lib/extensions/ate-table.extension.d.ts +2 -0
  88. package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
  89. package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
  90. package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
  91. package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
  92. package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
  93. package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
  94. package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
  95. package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
  96. package/lib/models/ate-bubble-menu.model.d.ts +33 -0
  97. package/lib/models/ate-editor-config.model.d.ts +113 -0
  98. package/lib/models/ate-editor-state.model.d.ts +109 -0
  99. package/lib/models/ate-image.model.d.ts +104 -0
  100. package/lib/models/ate-slash-command.model.d.ts +17 -0
  101. package/lib/models/ate-toolbar.model.d.ts +18 -0
  102. package/lib/node-view/ate-angular-node-view.d.ts +115 -0
  103. package/lib/node-view/ate-injector.registry.d.ts +3 -0
  104. package/lib/node-view/ate-node-view.factory.d.ts +10 -0
  105. package/lib/node-view/ate-node-view.models.d.ts +138 -0
  106. package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
  107. package/lib/node-view/ate-register-angular-component.d.ts +35 -0
  108. package/lib/services/ate-color-picker.service.d.ts +65 -0
  109. package/lib/services/ate-editor-commands.service.d.ts +89 -0
  110. package/lib/services/ate-export.service.d.ts +27 -0
  111. package/lib/services/ate-i18n.service.d.ts +432 -0
  112. package/lib/services/ate-image.service.d.ts +82 -0
  113. package/lib/services/ate-link.service.d.ts +42 -0
  114. package/lib/utils/ate-color.utils.d.ts +12 -0
  115. package/lib/utils/ate-markdown.utils.d.ts +4 -0
  116. package/package.json +3 -1
  117. package/public-api.d.ts +32 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Normalizes color values (rgb/rgba to hex).
3
+ */
4
+ export function normalizeColor(color) {
5
+ if (!color || color === "transparent" || color === "rgba(0, 0, 0, 0)") {
6
+ return null;
7
+ }
8
+ if (color.startsWith("#")) {
9
+ return color;
10
+ }
11
+ // Support both comma-separated (legacy) and space-separated (modern) rgb/rgba
12
+ const rgbMatch = color
13
+ .trim()
14
+ .match(/^rgba?\(\s*([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)(?:[,\s/]+([\d.]+))?\s*\)$/i);
15
+ // If it's a named color or something else we don't recognize,
16
+ // we can't easily normalize it to hex without a heavy dictionary.
17
+ // However, getComputedStyle usually returns rgb() which we handle above.
18
+ if (!rgbMatch) {
19
+ // Simple fallback for common named colors if getComputedStyle fails to return rgb
20
+ const named = { black: "#000000", white: "#ffffff", red: "#ff0000" };
21
+ if (named[color.toLowerCase()]) {
22
+ return named[color.toLowerCase()];
23
+ }
24
+ return null;
25
+ }
26
+ const r = Math.max(0, Math.min(255, Math.round(parseFloat(rgbMatch[1]))));
27
+ const g = Math.max(0, Math.min(255, Math.round(parseFloat(rgbMatch[2]))));
28
+ const b = Math.max(0, Math.min(255, Math.round(parseFloat(rgbMatch[3]))));
29
+ const a = rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1;
30
+ // If completely transparent, return null
31
+ if (a === 0) {
32
+ return null;
33
+ }
34
+ return ("#" +
35
+ [r, g, b]
36
+ .map(n => n.toString(16).padStart(2, "0"))
37
+ .join("")
38
+ .toLowerCase());
39
+ }
40
+ /**
41
+ * Calculate luminance (0-255).
42
+ */
43
+ export function getLuminance(color) {
44
+ const normalized = normalizeColor(color);
45
+ if (!normalized) {
46
+ return 0;
47
+ } // Default to dark (luminance 0) if no color
48
+ const hex = normalized.replace("#", "");
49
+ const r = parseInt(hex.substring(0, 2), 16);
50
+ const g = parseInt(hex.substring(2, 4), 16);
51
+ const b = parseInt(hex.substring(4, 6), 16);
52
+ return (r * 299 + g * 587 + b * 114) / 1000;
53
+ }
54
+ /**
55
+ * Returns contrast color for readability.
56
+ */
57
+ export function getContrastColor(color) {
58
+ return getLuminance(color) > 128 ? "black" : "white";
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWNvbG9yLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvdXRpbHMvYXRlLWNvbG9yLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUFnQztJQUM3RCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssS0FBSyxhQUFhLElBQUksS0FBSyxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDdEUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLE1BQU0sUUFBUSxHQUFHLEtBQUs7U0FDbkIsSUFBSSxFQUFFO1NBQ04sS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7SUFFdkYsOERBQThEO0lBQzlELGtFQUFrRTtJQUNsRSx5RUFBeUU7SUFDekUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2Qsa0ZBQWtGO1FBQ2xGLE1BQU0sS0FBSyxHQUEyQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDN0YsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUUsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0UsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0UsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0UsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVwRCx5Q0FBeUM7SUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDWixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLENBQ0wsR0FBRztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDTixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDekMsSUFBSSxDQUFDLEVBQUUsQ0FBQzthQUNSLFdBQVcsRUFBRSxDQUNqQixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFnQztJQUMzRCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLDRDQUE0QztJQUM5QyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4QyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1QyxPQUFPLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDOUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWE7SUFDNUMsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBOb3JtYWxpemVzIGNvbG9yIHZhbHVlcyAocmdiL3JnYmEgdG8gaGV4KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbG9yKGNvbG9yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghY29sb3IgfHwgY29sb3IgPT09IFwidHJhbnNwYXJlbnRcIiB8fCBjb2xvciA9PT0gXCJyZ2JhKDAsIDAsIDAsIDApXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoY29sb3Iuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICByZXR1cm4gY29sb3I7XG4gIH1cblxuICAvLyBTdXBwb3J0IGJvdGggY29tbWEtc2VwYXJhdGVkIChsZWdhY3kpIGFuZCBzcGFjZS1zZXBhcmF0ZWQgKG1vZGVybikgcmdiL3JnYmFcbiAgY29uc3QgcmdiTWF0Y2ggPSBjb2xvclxuICAgIC50cmltKClcbiAgICAubWF0Y2goL15yZ2JhP1xcKFxccyooW1xcZC5dKylbLFxcc10rKFtcXGQuXSspWyxcXHNdKyhbXFxkLl0rKSg/OlssXFxzL10rKFtcXGQuXSspKT9cXHMqXFwpJC9pKTtcblxuICAvLyBJZiBpdCdzIGEgbmFtZWQgY29sb3Igb3Igc29tZXRoaW5nIGVsc2Ugd2UgZG9uJ3QgcmVjb2duaXplLFxuICAvLyB3ZSBjYW4ndCBlYXNpbHkgbm9ybWFsaXplIGl0IHRvIGhleCB3aXRob3V0IGEgaGVhdnkgZGljdGlvbmFyeS5cbiAgLy8gSG93ZXZlciwgZ2V0Q29tcHV0ZWRTdHlsZSB1c3VhbGx5IHJldHVybnMgcmdiKCkgd2hpY2ggd2UgaGFuZGxlIGFib3ZlLlxuICBpZiAoIXJnYk1hdGNoKSB7XG4gICAgLy8gU2ltcGxlIGZhbGxiYWNrIGZvciBjb21tb24gbmFtZWQgY29sb3JzIGlmIGdldENvbXB1dGVkU3R5bGUgZmFpbHMgdG8gcmV0dXJuIHJnYlxuICAgIGNvbnN0IG5hbWVkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBibGFjazogXCIjMDAwMDAwXCIsIHdoaXRlOiBcIiNmZmZmZmZcIiwgcmVkOiBcIiNmZjAwMDBcIiB9O1xuICAgIGlmIChuYW1lZFtjb2xvci50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgcmV0dXJuIG5hbWVkW2NvbG9yLnRvTG93ZXJDYXNlKCldITtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCByID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHBhcnNlRmxvYXQocmdiTWF0Y2hbMV0hKSkpKTtcbiAgY29uc3QgZyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZChwYXJzZUZsb2F0KHJnYk1hdGNoWzJdISkpKSk7XG4gIGNvbnN0IGIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQocGFyc2VGbG9hdChyZ2JNYXRjaFszXSEpKSkpO1xuICBjb25zdCBhID0gcmdiTWF0Y2hbNF0gPyBwYXJzZUZsb2F0KHJnYk1hdGNoWzRdKSA6IDE7XG5cbiAgLy8gSWYgY29tcGxldGVseSB0cmFuc3BhcmVudCwgcmV0dXJuIG51bGxcbiAgaWYgKGEgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgXCIjXCIgK1xuICAgIFtyLCBnLCBiXVxuICAgICAgLm1hcChuID0+IG4udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSlcbiAgICAgIC5qb2luKFwiXCIpXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICApO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBsdW1pbmFuY2UgKDAtMjU1KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEx1bWluYW5jZShjb2xvcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVDb2xvcihjb2xvcik7XG4gIGlmICghbm9ybWFsaXplZCkge1xuICAgIHJldHVybiAwO1xuICB9IC8vIERlZmF1bHQgdG8gZGFyayAobHVtaW5hbmNlIDApIGlmIG5vIGNvbG9yXG4gIGNvbnN0IGhleCA9IG5vcm1hbGl6ZWQucmVwbGFjZShcIiNcIiwgXCJcIik7XG4gIGNvbnN0IHIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDAsIDIpLCAxNik7XG4gIGNvbnN0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XG4gIGNvbnN0IGIgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDQsIDYpLCAxNik7XG4gIHJldHVybiAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XG59XG5cbi8qKlxuICogUmV0dXJucyBjb250cmFzdCBjb2xvciBmb3IgcmVhZGFiaWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cmFzdENvbG9yKGNvbG9yOiBzdHJpbmcpOiBcImJsYWNrXCIgfCBcIndoaXRlXCIge1xuICByZXR1cm4gZ2V0THVtaW5hbmNlKGNvbG9yKSA+IDEyOCA/IFwiYmxhY2tcIiA6IFwid2hpdGVcIjtcbn1cbiJdfQ==
@@ -0,0 +1,179 @@
1
+ /**
2
+ * HTML to Markdown converter utility (no external dependencies).
3
+ */
4
+ export function htmlToMarkdown(html) {
5
+ const parser = new DOMParser();
6
+ const doc = parser.parseFromString(html, "text/html");
7
+ const result = convertNode(doc.body, { listDepth: 0, listType: null });
8
+ // Normalize multiple blank lines to max two
9
+ return result.replace(/\n{3,}/g, "\n\n").trim();
10
+ }
11
+ function convertNode(node, ctx) {
12
+ if (node.nodeType === Node.TEXT_NODE) {
13
+ return node.textContent || "";
14
+ }
15
+ if (node.nodeType !== Node.ELEMENT_NODE) {
16
+ return "";
17
+ }
18
+ const el = node;
19
+ const tag = el.tagName.toLowerCase();
20
+ const children = Array.from(el.childNodes);
21
+ const inner = (overrideCtx) => children.map(c => convertNode(c, { ...ctx, ...overrideCtx })).join("");
22
+ // ── Block-level elements ──────────────────────────────────
23
+ if (tag === "br") {
24
+ return "\n";
25
+ }
26
+ if (tag === "hr") {
27
+ return "\n\n---\n\n";
28
+ }
29
+ if (/^h[1-6]$/.test(tag)) {
30
+ const level = parseInt(tag[1], 10);
31
+ const prefix = "#".repeat(level);
32
+ return `\n\n${prefix} ${inner().trim()}\n\n`;
33
+ }
34
+ if (tag === "p") {
35
+ const content = inner().trim();
36
+ if (!content) {
37
+ return "";
38
+ }
39
+ return `\n\n${content}\n\n`;
40
+ }
41
+ if (tag === "blockquote") {
42
+ const content = inner()
43
+ .trim()
44
+ .split("\n")
45
+ .map(line => `> ${line}`)
46
+ .join("\n");
47
+ return `\n\n${content}\n\n`;
48
+ }
49
+ if (tag === "pre") {
50
+ // Extract language from code class e.g. "language-typescript"
51
+ const codeEl = el.querySelector("code");
52
+ const lang = codeEl
53
+ ? (codeEl.className.match(/language-(\S+)/) || [])[1] || ""
54
+ : "";
55
+ const code = codeEl ? codeEl.textContent || "" : el.textContent || "";
56
+ return `\n\n\`\`\`${lang}\n${code}\n\`\`\`\n\n`;
57
+ }
58
+ if (tag === "ul" || tag === "ol") {
59
+ const isTaskList = el.getAttribute("data-type") === "taskList";
60
+ const items = children
61
+ .filter(c => c.tagName?.toLowerCase() === "li")
62
+ .map((li, idx) => convertListItem(li, {
63
+ listDepth: ctx.listDepth + 1,
64
+ listType: tag === "ul" ? "ul" : "ol",
65
+ orderedIndex: idx + 1,
66
+ isTaskList,
67
+ }))
68
+ .join("\n");
69
+ const block = `\n\n${items}\n\n`;
70
+ // Only add surrounding newlines for root-level lists
71
+ return ctx.listDepth === 0 ? block : `\n${items}`;
72
+ }
73
+ if (tag === "table") {
74
+ return convertTable(el);
75
+ }
76
+ // ── Inline elements ──────────────────────────────────────
77
+ if (tag === "strong" || tag === "b") {
78
+ const content = inner();
79
+ return content ? `**${content}**` : "";
80
+ }
81
+ if (tag === "em" || tag === "i") {
82
+ const content = inner();
83
+ return content ? `*${content}*` : "";
84
+ }
85
+ if (tag === "s" || tag === "del" || tag === "strike") {
86
+ const content = inner();
87
+ return content ? `~~${content}~~` : "";
88
+ }
89
+ if (tag === "u") {
90
+ // No standard Markdown for underline — use HTML passthrough
91
+ const content = inner();
92
+ return content ? `<u>${content}</u>` : "";
93
+ }
94
+ if (tag === "code") {
95
+ // Inline code (not inside pre)
96
+ const content = el.textContent || "";
97
+ return content ? `\`${content}\`` : "";
98
+ }
99
+ if (tag === "a") {
100
+ const href = el.getAttribute("href") || "";
101
+ const content = inner().trim();
102
+ if (!content && !href) {
103
+ return "";
104
+ }
105
+ if (!content) {
106
+ return href;
107
+ }
108
+ return `[${content}](${href})`;
109
+ }
110
+ if (tag === "img") {
111
+ const src = el.getAttribute("src") || "";
112
+ const alt = el.getAttribute("alt") || "";
113
+ return `![${alt}](${src})`;
114
+ }
115
+ // ── Wrapper / Unknown elements → recurse ─────────────────
116
+ return inner();
117
+ }
118
+ function convertListItem(li, ctx) {
119
+ const indent = " ".repeat(ctx.listDepth - 1);
120
+ // Task list item
121
+ if (ctx.isTaskList) {
122
+ const checked = li.getAttribute("data-checked") === "true";
123
+ const checkMark = checked ? "[x]" : "[ ]";
124
+ const content = Array.from(li.childNodes)
125
+ .map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))
126
+ .join("")
127
+ .trim();
128
+ return `${indent}- ${checkMark} ${content}`;
129
+ }
130
+ // Normal list item
131
+ const bullet = ctx.listType === "ol" ? `${ctx.orderedIndex}.` : "-";
132
+ // Check if li contains nested lists
133
+ const nestedListNodes = Array.from(li.childNodes).filter(c => c.tagName?.toLowerCase() === "ul" ||
134
+ c.tagName?.toLowerCase() === "ol");
135
+ const textNodes = Array.from(li.childNodes).filter(c => !["ul", "ol"].includes(c.tagName?.toLowerCase()));
136
+ const textContent = textNodes
137
+ .map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))
138
+ .join("")
139
+ .trim();
140
+ const nestedContent = nestedListNodes
141
+ .map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))
142
+ .join("")
143
+ .trimEnd();
144
+ return `${indent}${bullet} ${textContent}${nestedContent}`;
145
+ }
146
+ function convertTable(table) {
147
+ const rows = Array.from(table.querySelectorAll("tr"));
148
+ if (rows.length === 0) {
149
+ return "";
150
+ }
151
+ const tableData = rows.map(row => Array.from(row.querySelectorAll("th, td")).map(cell => cell.textContent?.replace(/\n/g, " ").trim() || ""));
152
+ if (tableData.length === 0) {
153
+ return "";
154
+ }
155
+ const colCount = Math.max(...tableData.map(r => r.length));
156
+ // Pad rows to same width
157
+ const normalized = tableData.map(row => {
158
+ while (row.length < colCount) {
159
+ row.push("");
160
+ }
161
+ return row;
162
+ });
163
+ // Calculate column widths
164
+ const colWidths = Array.from({ length: colCount }, (_, i) => Math.max(...normalized.map(r => (r[i] || "").length), 3));
165
+ const pad = (str, len) => str.padEnd(len, " ");
166
+ const separator = colWidths.map(w => "-".repeat(w)).join(" | ");
167
+ // Build rows
168
+ const lines = [];
169
+ normalized.forEach((row, rowIdx) => {
170
+ const line = row.map((cell, i) => pad(cell, colWidths[i])).join(" | ");
171
+ lines.push(`| ${line} |`);
172
+ // Add separator after header row (first row)
173
+ if (rowIdx === 0) {
174
+ lines.push(`| ${separator} |`);
175
+ }
176
+ });
177
+ return `\n\n${lines.join("\n")}\n\n`;
178
+ }
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLW1hcmtkb3duLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvdXRpbHMvYXRlLW1hcmtkb3duLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUFZO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLDRDQUE0QztJQUM1QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2xELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDbEIsSUFBVSxFQUNWLEdBQStFO0lBRS9FLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLEVBQUUsR0FBRyxJQUFtQixDQUFDO0lBQy9CLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFB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QUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUN6RCxDQUFDO0lBRUYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFXLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVoRSxhQUFhO0lBQ2IsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDakMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7UUFDMUIsNkNBQTZDO1FBQzdDLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSFRNTCB0byBNYXJrZG93biBjb252ZXJ0ZXIgdXRpbGl0eSAobm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzKS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaHRtbFRvTWFya2Rvd24oaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsIFwidGV4dC9odG1sXCIpO1xuICBjb25zdCByZXN1bHQgPSBjb252ZXJ0Tm9kZShkb2MuYm9keSwgeyBsaXN0RGVwdGg6IDAsIGxpc3RUeXBlOiBudWxsIH0pO1xuICAvLyBOb3JtYWxpemUgbXVsdGlwbGUgYmxhbmsgbGluZXMgdG8gbWF4IHR3b1xuICByZXR1cm4gcmVzdWx0LnJlcGxhY2UoL1xcbnszLH0vZywgXCJcXG5cXG5cIikudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Tm9kZShcbiAgbm9kZTogTm9kZSxcbiAgY3R4OiB7IGxpc3REZXB0aDogbnVtYmVyOyBsaXN0VHlwZTogXCJ1bFwiIHwgXCJvbFwiIHwgbnVsbDsgb3JkZXJlZEluZGV4PzogbnVtYmVyIH1cbik6IHN0cmluZyB7XG4gIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgIHJldHVybiBub2RlLnRleHRDb250ZW50IHx8IFwiXCI7XG4gIH1cblxuICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGNvbnN0IGVsID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGROb2Rlcyk7XG5cbiAgY29uc3QgaW5uZXIgPSAob3ZlcnJpZGVDdHg/OiBQYXJ0aWFsPHR5cGVvZiBjdHg+KSA9PlxuICAgIGNoaWxkcmVuLm1hcChjID0+IGNvbnZlcnROb2RlKGMsIHsgLi4uY3R4LCAuLi5vdmVycmlkZUN0eCB9KSkuam9pbihcIlwiKTtcblxuICAvLyDilIDilIAgQmxvY2stbGV2ZWwgZWxlbWVudHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgaWYgKHRhZyA9PT0gXCJiclwiKSB7XG4gICAgcmV0dXJuIFwiXFxuXCI7XG4gIH1cblxuICBpZiAodGFnID09PSBcImhyXCIpIHtcbiAgICByZXR1cm4gXCJcXG5cXG4tLS1cXG5cXG5cIjtcbiAgfVxuXG4gIGlmICgvXmhbMS02XSQvLnRlc3QodGFnKSkge1xuICAgIGNvbnN0IGxldmVsID0gcGFyc2VJbnQodGFnWzFdLCAxMCk7XG4gICAgY29uc3QgcHJlZml4ID0gXCIjXCIucmVwZWF0KGxldmVsKTtcbiAgICByZXR1cm4gYFxcblxcbiR7cHJlZml4fSAke2lubmVyKCkudHJpbSgpfVxcblxcbmA7XG4gIH1cblxuICBpZiAodGFnID09PSBcInBcIikge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBpbm5lcigpLnRyaW0oKTtcbiAgICBpZiAoIWNvbnRlbnQpIHtyZXR1cm4gXCJcIjt9XG4gICAgcmV0dXJuIGBcXG5cXG4ke2NvbnRlbnR9XFxuXFxuYDtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwiYmxvY2txdW90ZVwiKSB7XG4gICAgY29uc3QgY29udGVudCA9IGlubmVyKClcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgLm1hcChsaW5lID0+IGA+ICR7bGluZX1gKVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgcmV0dXJuIGBcXG5cXG4ke2NvbnRlbnR9XFxuXFxuYDtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwicHJlXCIpIHtcbiAgICAvLyBFeHRyYWN0IGxhbmd1YWdlIGZyb20gY29kZSBjbGFzcyBlLmcuIFwibGFuZ3VhZ2UtdHlwZXNjcmlwdFwiXG4gICAgY29uc3QgY29kZUVsID0gZWwucXVlcnlTZWxlY3RvcihcImNvZGVcIik7XG4gICAgY29uc3QgbGFuZyA9IGNvZGVFbFxuICAgICAgPyAoY29kZUVsLmNsYXNzTmFtZS5tYXRjaCgvbGFuZ3VhZ2UtKFxcUyspLykgfHwgW10pWzFdIHx8IFwiXCJcbiAgICAgIDogXCJcIjtcbiAgICBjb25zdCBjb2RlID0gY29kZUVsID8gY29kZUVsLnRleHRDb250ZW50IHx8IFwiXCIgOiBlbC50ZXh0Q29udGVudCB8fCBcIlwiO1xuICAgIHJldHVybiBgXFxuXFxuXFxgXFxgXFxgJHtsYW5nfVxcbiR7Y29kZX1cXG5cXGBcXGBcXGBcXG5cXG5gO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJ1bFwiIHx8IHRhZyA9PT0gXCJvbFwiKSB7XG4gICAgY29uc3QgaXNUYXNrTGlzdCA9IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtdHlwZVwiKSA9PT0gXCJ0YXNrTGlzdFwiO1xuICAgIGNvbnN0IGl0ZW1zID0gY2hpbGRyZW5cbiAgICAgIC5maWx0ZXIoYyA9PiAoYyBhcyBIVE1MRWxlbWVudCkudGFnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJsaVwiKVxuICAgICAgLm1hcCgobGksIGlkeCkgPT5cbiAgICAgICAgY29udmVydExpc3RJdGVtKGxpIGFzIEhUTUxFbGVtZW50LCB7XG4gICAgICAgICAgbGlzdERlcHRoOiBjdHgubGlzdERlcHRoICsgMSxcbiAgICAgICAgICBsaXN0VHlwZTogdGFnID09PSBcInVsXCIgPyBcInVsXCIgOiBcIm9sXCIsXG4gICAgICAgICAgb3JkZXJlZEluZGV4OiBpZHggKyAxLFxuICAgICAgICAgIGlzVGFza0xpc3QsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBibG9jayA9IGBcXG5cXG4ke2l0ZW1zfVxcblxcbmA7XG4gICAgLy8gT25seSBhZGQgc3Vycm91bmRpbmcgbmV3bGluZXMgZm9yIHJvb3QtbGV2ZWwgbGlzdHNcbiAgICByZXR1cm4gY3R4Lmxpc3REZXB0aCA9PT0gMCA/IGJsb2NrIDogYFxcbiR7aXRlbXN9YDtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwidGFibGVcIikge1xuICAgIHJldHVybiBjb252ZXJ0VGFibGUoZWwpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElubGluZSBlbGVtZW50cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBpZiAodGFnID09PSBcInN0cm9uZ1wiIHx8IHRhZyA9PT0gXCJiXCIpIHtcbiAgICBjb25zdCBjb250ZW50ID0gaW5uZXIoKTtcbiAgICByZXR1cm4gY29udGVudCA/IGAqKiR7Y29udGVudH0qKmAgOiBcIlwiO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJlbVwiIHx8IHRhZyA9PT0gXCJpXCIpIHtcbiAgICBjb25zdCBjb250ZW50ID0gaW5uZXIoKTtcbiAgICByZXR1cm4gY29udGVudCA/IGAqJHtjb250ZW50fSpgIDogXCJcIjtcbiAgfVxuXG4gIGlmICh0YWcgPT09IFwic1wiIHx8IHRhZyA9PT0gXCJkZWxcIiB8fCB0YWcgPT09IFwic3RyaWtlXCIpIHtcbiAgICBjb25zdCBjb250ZW50ID0gaW5uZXIoKTtcbiAgICByZXR1cm4gY29udGVudCA/IGB+fiR7Y29udGVudH1+fmAgOiBcIlwiO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJ1XCIpIHtcbiAgICAvLyBObyBzdGFuZGFyZCBNYXJrZG93biBmb3IgdW5kZXJsaW5lIOKAlCB1c2UgSFRNTCBwYXNzdGhyb3VnaFxuICAgIGNvbnN0IGNvbnRlbnQgPSBpbm5lcigpO1xuICAgIHJldHVybiBjb250ZW50ID8gYDx1PiR7Y29udGVudH08L3U+YCA6IFwiXCI7XG4gIH1cblxuICBpZiAodGFnID09PSBcImNvZGVcIikge1xuICAgIC8vIElubGluZSBjb2RlIChub3QgaW5zaWRlIHByZSlcbiAgICBjb25zdCBjb250ZW50ID0gZWwudGV4dENvbnRlbnQgfHwgXCJcIjtcbiAgICByZXR1cm4gY29udGVudCA/IGBcXGAke2NvbnRlbnR9XFxgYCA6IFwiXCI7XG4gIH1cblxuICBpZiAodGFnID09PSBcImFcIikge1xuICAgIGNvbnN0IGhyZWYgPSBlbC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpIHx8IFwiXCI7XG4gICAgY29uc3QgY29udGVudCA9IGlubmVyKCkudHJpbSgpO1xuICAgIGlmICghY29udGVudCAmJiAhaHJlZikge3JldHVybiBcIlwiO31cbiAgICBpZiAoIWNvbnRlbnQpIHtyZXR1cm4gaHJlZjt9XG4gICAgcmV0dXJuIGBbJHtjb250ZW50fV0oJHtocmVmfSlgO1xuICB9XG5cbiAgaWYgKHRhZyA9PT0gXCJpbWdcIikge1xuICAgIGNvbnN0IHNyYyA9IGVsLmdldEF0dHJpYnV0ZShcInNyY1wiKSB8fCBcIlwiO1xuICAgIGNvbnN0IGFsdCA9IGVsLmdldEF0dHJpYnV0ZShcImFsdFwiKSB8fCBcIlwiO1xuICAgIHJldHVybiBgIVske2FsdH1dKCR7c3JjfSlgO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdyYXBwZXIgLyBVbmtub3duIGVsZW1lbnRzIOKGkiByZWN1cnNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICByZXR1cm4gaW5uZXIoKTtcbn1cblxuZnVuY3Rpb24gY29udmVydExpc3RJdGVtKFxuICBsaTogSFRNTEVsZW1lbnQsXG4gIGN0eDoge1xuICAgIGxpc3REZXB0aDogbnVtYmVyO1xuICAgIGxpc3RUeXBlOiBcInVsXCIgfCBcIm9sXCI7XG4gICAgb3JkZXJlZEluZGV4OiBudW1iZXI7XG4gICAgaXNUYXNrTGlzdDogYm9vbGVhbjtcbiAgfVxuKTogc3RyaW5nIHtcbiAgY29uc3QgaW5kZW50ID0gXCIgIFwiLnJlcGVhdChjdHgubGlzdERlcHRoIC0gMSk7XG5cbiAgLy8gVGFzayBsaXN0IGl0ZW1cbiAgaWYgKGN0eC5pc1Rhc2tMaXN0KSB7XG4gICAgY29uc3QgY2hlY2tlZCA9IGxpLmdldEF0dHJpYnV0ZShcImRhdGEtY2hlY2tlZFwiKSA9PT0gXCJ0cnVlXCI7XG4gICAgY29uc3QgY2hlY2tNYXJrID0gY2hlY2tlZCA/IFwiW3hdXCIgOiBcIlsgXVwiO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBBcnJheS5mcm9tKGxpLmNoaWxkTm9kZXMpXG4gICAgICAubWFwKGMgPT4gY29udmVydE5vZGUoYywgeyBsaXN0RGVwdGg6IGN0eC5saXN0RGVwdGgsIGxpc3RUeXBlOiBjdHgubGlzdFR5cGUgfSkpXG4gICAgICAuam9pbihcIlwiKVxuICAgICAgLnRyaW0oKTtcbiAgICByZXR1cm4gYCR7aW5kZW50fS0gJHtjaGVja01hcmt9ICR7Y29udGVudH1gO1xuICB9XG5cbiAgLy8gTm9ybWFsIGxpc3QgaXRlbVxuICBjb25zdCBidWxsZXQgPSBjdHgubGlzdFR5cGUgPT09IFwib2xcIiA/IGAke2N0eC5vcmRlcmVkSW5kZXh9LmAgOiBcIi1cIjtcblxuICAvLyBDaGVjayBpZiBsaSBjb250YWlucyBuZXN0ZWQgbGlzdHNcbiAgY29uc3QgbmVzdGVkTGlzdE5vZGVzID0gQXJyYXkuZnJvbShsaS5jaGlsZE5vZGVzKS5maWx0ZXIoXG4gICAgYyA9PiAoYyBhcyBIVE1MRWxlbWVudCkudGFnTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJ1bFwiIHx8XG4gICAgICAgICAgKGMgYXMgSFRNTEVsZW1lbnQpLnRhZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwib2xcIlxuICApO1xuICBjb25zdCB0ZXh0Tm9kZXMgPSBBcnJheS5mcm9tKGxpLmNoaWxkTm9kZXMpLmZpbHRlcihcbiAgICBjID0+ICFbXCJ1bFwiLCBcIm9sXCJdLmluY2x1ZGVzKChjIGFzIEhUTUxFbGVtZW50KS50YWdOYW1lPy50b0xvd2VyQ2FzZSgpKVxuICApO1xuXG4gIGNvbnN0IHRleHRDb250ZW50ID0gdGV4dE5vZGVzXG4gICAgLm1hcChjID0+IGNvbnZlcnROb2RlKGMsIHsgbGlzdERlcHRoOiBjdHgubGlzdERlcHRoLCBsaXN0VHlwZTogY3R4Lmxpc3RUeXBlIH0pKVxuICAgIC5qb2luKFwiXCIpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBuZXN0ZWRDb250ZW50ID0gbmVzdGVkTGlzdE5vZGVzXG4gICAgLm1hcChjID0+IGNvbnZlcnROb2RlKGMsIHsgbGlzdERlcHRoOiBjdHgubGlzdERlcHRoLCBsaXN0VHlwZTogY3R4Lmxpc3RUeXBlIH0pKVxuICAgIC5qb2luKFwiXCIpXG4gICAgLnRyaW1FbmQoKTtcblxuICByZXR1cm4gYCR7aW5kZW50fSR7YnVsbGV0fSAke3RleHRDb250ZW50fSR7bmVzdGVkQ29udGVudH1gO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VGFibGUodGFibGU6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20odGFibGUucXVlcnlTZWxlY3RvckFsbChcInRyXCIpKTtcbiAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSB7cmV0dXJuIFwiXCI7fVxuXG4gIGNvbnN0IHRhYmxlRGF0YTogc3RyaW5nW11bXSA9IHJvd3MubWFwKHJvdyA9PlxuICAgIEFycmF5LmZyb20ocm93LnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0aCwgdGRcIikpLm1hcChcbiAgICAgIGNlbGwgPT4gY2VsbC50ZXh0Q29udGVudD8ucmVwbGFjZSgvXFxuL2csIFwiIFwiKS50cmltKCkgfHwgXCJcIlxuICAgIClcbiAgKTtcblxuICBpZiAodGFibGVEYXRhLmxlbmd0aCA9PT0gMCkge3JldHVybiBcIlwiO31cblxuICBjb25zdCBjb2xDb3VudCA9IE1hdGgubWF4KC4uLnRhYmxlRGF0YS5tYXAociA9PiByLmxlbmd0aCkpO1xuXG4gIC8vIFBhZCByb3dzIHRvIHNhbWUgd2lkdGhcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHRhYmxlRGF0YS5tYXAocm93ID0+IHtcbiAgICB3aGlsZSAocm93Lmxlbmd0aCA8IGNvbENvdW50KSB7cm93LnB1c2goXCJcIik7fVxuICAgIHJldHVybiByb3c7XG4gIH0pO1xuXG4gIC8vIENhbGN1bGF0ZSBjb2x1bW4gd2lkdGhzXG4gIGNvbnN0IGNvbFdpZHRocyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvbENvdW50IH0sIChfLCBpKSA9PlxuICAgIE1hdGgubWF4KC4uLm5vcm1hbGl6ZWQubWFwKHIgPT4gKHJbaV0gfHwgXCJcIikubGVuZ3RoKSwgMylcbiAgKTtcblxuICBjb25zdCBwYWQgPSAoc3RyOiBzdHJpbmcsIGxlbjogbnVtYmVyKSA9PiBzdHIucGFkRW5kKGxlbiwgXCIgXCIpO1xuICBjb25zdCBzZXBhcmF0b3IgPSBjb2xXaWR0aHMubWFwKHcgPT4gXCItXCIucmVwZWF0KHcpKS5qb2luKFwiIHwgXCIpO1xuXG4gIC8vIEJ1aWxkIHJvd3NcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIG5vcm1hbGl6ZWQuZm9yRWFjaCgocm93LCByb3dJZHgpID0+IHtcbiAgICBjb25zdCBsaW5lID0gcm93Lm1hcCgoY2VsbCwgaSkgPT4gcGFkKGNlbGwsIGNvbFdpZHRoc1tpXSkpLmpvaW4oXCIgfCBcIik7XG4gICAgbGluZXMucHVzaChgfCAke2xpbmV9IHxgKTtcbiAgICAvLyBBZGQgc2VwYXJhdG9yIGFmdGVyIGhlYWRlciByb3cgKGZpcnN0IHJvdylcbiAgICBpZiAocm93SWR4ID09PSAwKSB7XG4gICAgICBsaW5lcy5wdXNoKGB8ICR7c2VwYXJhdG9yfSB8YCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYFxcblxcbiR7bGluZXMuam9pbihcIlxcblwiKX1cXG5cXG5gO1xufVxuIl19
@@ -0,0 +1,41 @@
1
+ /*
2
+ * Public API Surface of tiptap-editor
3
+ */
4
+ // Main component & Provider
5
+ export * from "./lib/components/editor/angular-tiptap-editor.component";
6
+ export * from "./lib/ate-editor.provider";
7
+ // Directives
8
+ export * from "./lib/directives/ate-noop-value-accessor.directive";
9
+ export * from "./lib/directives/ate-tooltip.directive";
10
+ // Services
11
+ export * from "./lib/services/ate-i18n.service";
12
+ export * from "./lib/services/ate-editor-commands.service";
13
+ export * from "./lib/services/ate-image.service";
14
+ export * from "./lib/services/ate-color-picker.service";
15
+ export * from "./lib/services/ate-link.service";
16
+ export * from "./lib/services/ate-export.service";
17
+ // State & Calculators (Essential for custom plugins)
18
+ export * from "./lib/models/ate-editor-state.model";
19
+ export * from "./lib/extensions/calculators/ate-discovery.calculator";
20
+ export * from "./lib/extensions/calculators/ate-image.calculator";
21
+ export * from "./lib/extensions/calculators/ate-marks.calculator";
22
+ export * from "./lib/extensions/calculators/ate-selection.calculator";
23
+ export * from "./lib/extensions/calculators/ate-structure.calculator";
24
+ export * from "./lib/extensions/calculators/ate-table.calculator";
25
+ // Types and interfaces for configuration
26
+ export * from "./lib/models/ate-toolbar.model";
27
+ export * from "./lib/models/ate-image.model";
28
+ export * from "./lib/models/ate-bubble-menu.model";
29
+ export * from "./lib/models/ate-editor-config.model";
30
+ export * from "./lib/models/ate-slash-command.model";
31
+ // Default configurations
32
+ export * from "./lib/config/ate-editor.config";
33
+ export * from "./lib/config/ate-global-config.token";
34
+ // Utility functions for slash commands
35
+ export * from "./lib/config/ate-slash-commands.config";
36
+ // Angular NodeView Integration
37
+ export { AteAngularNodeView } from "./lib/node-view/ate-angular-node-view";
38
+ export { AteNodeViewRenderer } from "./lib/node-view/ate-node-view.renderer";
39
+ export { createAngularComponentExtension } from "./lib/node-view/ate-node-view.factory";
40
+ export { registerAngularComponent } from "./lib/node-view/ate-register-angular-component";
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdGlwdGFwLWVkaXRvci9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILDRCQUE0QjtBQUM1QixjQUFjLHlEQUF5RCxDQUFDO0FBQ3hFLGNBQWMsMkJBQTJCLENBQUM7QUFFMUMsYUFBYTtBQUNiLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyx3Q0FBd0MsQ0FBQztBQUV2RCxXQUFXO0FBQ1gsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsbUNBQW1DLENBQUM7QUFFbEQscURBQXFEO0FBQ3JELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyx1REFBdUQsQ0FBQztBQUN0RSxjQUFjLG1EQUFtRCxDQUFDO0FBQ2xFLGNBQWMsbURBQW1ELENBQUM7QUFDbEUsY0FBYyx1REFBdUQsQ0FBQztBQUN0RSxjQUFjLHVEQUF1RCxDQUFDO0FBQ3RFLGNBQWMsbURBQW1ELENBQUM7QUFFbEUseUNBQXlDO0FBQ3pDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyxzQ0FBc0MsQ0FBQztBQUVyRCx5QkFBeUI7QUFDekIsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHNDQUFzQyxDQUFDO0FBRXJELHVDQUF1QztBQUN2QyxjQUFjLHdDQUF3QyxDQUFDO0FBS3ZELCtCQUErQjtBQUMvQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgdGlwdGFwLWVkaXRvclxuICovXG5cbi8vIE1haW4gY29tcG9uZW50ICYgUHJvdmlkZXJcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9jb21wb25lbnRzL2VkaXRvci9hbmd1bGFyLXRpcHRhcC1lZGl0b3IuY29tcG9uZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvYXRlLWVkaXRvci5wcm92aWRlclwiO1xuXG4vLyBEaXJlY3RpdmVzXG5leHBvcnQgKiBmcm9tIFwiLi9saWIvZGlyZWN0aXZlcy9hdGUtbm9vcC12YWx1ZS1hY2Nlc3Nvci5kaXJlY3RpdmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9kaXJlY3RpdmVzL2F0ZS10b29sdGlwLmRpcmVjdGl2ZVwiO1xuXG4vLyBTZXJ2aWNlc1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL3NlcnZpY2VzL2F0ZS1pMThuLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9zZXJ2aWNlcy9hdGUtZWRpdG9yLWNvbW1hbmRzLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9zZXJ2aWNlcy9hdGUtaW1hZ2Uuc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL3NlcnZpY2VzL2F0ZS1jb2xvci1waWNrZXIuc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL3NlcnZpY2VzL2F0ZS1saW5rLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9zZXJ2aWNlcy9hdGUtZXhwb3J0LnNlcnZpY2VcIjtcblxuLy8gU3RhdGUgJiBDYWxjdWxhdG9ycyAoRXNzZW50aWFsIGZvciBjdXN0b20gcGx1Z2lucylcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9tb2RlbHMvYXRlLWVkaXRvci1zdGF0ZS5tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2V4dGVuc2lvbnMvY2FsY3VsYXRvcnMvYXRlLWRpc2NvdmVyeS5jYWxjdWxhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvZXh0ZW5zaW9ucy9jYWxjdWxhdG9ycy9hdGUtaW1hZ2UuY2FsY3VsYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2V4dGVuc2lvbnMvY2FsY3VsYXRvcnMvYXRlLW1hcmtzLmNhbGN1bGF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9leHRlbnNpb25zL2NhbGN1bGF0b3JzL2F0ZS1zZWxlY3Rpb24uY2FsY3VsYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2V4dGVuc2lvbnMvY2FsY3VsYXRvcnMvYXRlLXN0cnVjdHVyZS5jYWxjdWxhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvZXh0ZW5zaW9ucy9jYWxjdWxhdG9ycy9hdGUtdGFibGUuY2FsY3VsYXRvclwiO1xuXG4vLyBUeXBlcyBhbmQgaW50ZXJmYWNlcyBmb3IgY29uZmlndXJhdGlvblxuZXhwb3J0ICogZnJvbSBcIi4vbGliL21vZGVscy9hdGUtdG9vbGJhci5tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL21vZGVscy9hdGUtaW1hZ2UubW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9tb2RlbHMvYXRlLWJ1YmJsZS1tZW51Lm1vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvbW9kZWxzL2F0ZS1lZGl0b3ItY29uZmlnLm1vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvbW9kZWxzL2F0ZS1zbGFzaC1jb21tYW5kLm1vZGVsXCI7XG5cbi8vIERlZmF1bHQgY29uZmlndXJhdGlvbnNcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9jb25maWcvYXRlLWVkaXRvci5jb25maWdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9jb25maWcvYXRlLWdsb2JhbC1jb25maWcudG9rZW5cIjtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHNsYXNoIGNvbW1hbmRzXG5leHBvcnQgKiBmcm9tIFwiLi9saWIvY29uZmlnL2F0ZS1zbGFzaC1jb21tYW5kcy5jb25maWdcIjtcblxuLy8gVHJhbnNsYXRpb25zXG5leHBvcnQgdHlwZSB7IFN1cHBvcnRlZExvY2FsZSB9IGZyb20gXCIuL2xpYi9zZXJ2aWNlcy9hdGUtaTE4bi5zZXJ2aWNlXCI7XG5cbi8vIEFuZ3VsYXIgTm9kZVZpZXcgSW50ZWdyYXRpb25cbmV4cG9ydCB7IEF0ZUFuZ3VsYXJOb2RlVmlldyB9IGZyb20gXCIuL2xpYi9ub2RlLXZpZXcvYXRlLWFuZ3VsYXItbm9kZS12aWV3XCI7XG5leHBvcnQgeyBBdGVOb2RlVmlld1JlbmRlcmVyIH0gZnJvbSBcIi4vbGliL25vZGUtdmlldy9hdGUtbm9kZS12aWV3LnJlbmRlcmVyXCI7XG5leHBvcnQgeyBjcmVhdGVBbmd1bGFyQ29tcG9uZW50RXh0ZW5zaW9uIH0gZnJvbSBcIi4vbGliL25vZGUtdmlldy9hdGUtbm9kZS12aWV3LmZhY3RvcnlcIjtcbmV4cG9ydCB7IHJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudCB9IGZyb20gXCIuL2xpYi9ub2RlLXZpZXcvYXRlLXJlZ2lzdGVyLWFuZ3VsYXItY29tcG9uZW50XCI7XG5cbi8vIE5vZGUgVmlldyBUeXBlcyAtIEF0ZUFuZ3VsYXJOb2RlIGlzIHRoZSBwcmltYXJ5IHB1YmxpYyB0eXBlXG5leHBvcnQgdHlwZSB7IEF0ZUFuZ3VsYXJOb2RlIH0gZnJvbSBcIi4vbGliL21vZGVscy9hdGUtZWRpdG9yLWNvbmZpZy5tb2RlbFwiO1xuLy8gQWR2YW5jZWQ6IExvdy1sZXZlbCBvcHRpb25zIGZvciBmdWxsIGNvbnRyb2wgb3ZlciBub2RlIHJlZ2lzdHJhdGlvblxuZXhwb3J0IHR5cGUge1xuICBSZWdpc3RlckFuZ3VsYXJDb21wb25lbnRPcHRpb25zLFxuICBBdGVDb21wb25lbnRSZW5kZXJPcHRpb25zLFxufSBmcm9tIFwiLi9saWIvbm9kZS12aWV3L2F0ZS1ub2RlLXZpZXcubW9kZWxzXCI7XG4iXX0=