@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.
- package/CHANGELOG.md +24 -0
- package/README.md +2 -2
- package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
- package/esm2022/lib/ate-editor.provider.mjs +38 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +137 -0
- package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
- package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +309 -0
- package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
- package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +126 -0
- package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +271 -0
- package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +272 -0
- package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +123 -0
- package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
- package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +1032 -0
- package/esm2022/lib/components/editor/ate-block-controls.component.mjs +256 -0
- package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +328 -0
- package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
- package/esm2022/lib/components/ui/ate-button.component.mjs +91 -0
- package/esm2022/lib/components/ui/ate-separator.component.mjs +11 -0
- package/esm2022/lib/config/ate-editor.config.mjs +133 -0
- package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
- package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
- package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
- package/esm2022/lib/directives/ate-tooltip.directive.mjs +138 -0
- package/esm2022/lib/extensions/ate-block-controls.extension.mjs +156 -0
- package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
- package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +277 -0
- package/esm2022/lib/extensions/ate-table.extension.mjs +27 -0
- package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
- package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
- package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
- package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
- package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
- package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
- package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
- package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
- package/esm2022/lib/models/ate-bubble-menu.model.mjs +53 -0
- package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
- package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
- package/esm2022/lib/models/ate-image.model.mjs +2 -0
- package/esm2022/lib/models/ate-slash-command.model.mjs +2 -0
- package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
- package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
- package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
- package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
- package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
- package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
- package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
- package/esm2022/lib/services/ate-color-picker.service.mjs +194 -0
- package/esm2022/lib/services/ate-editor-commands.service.mjs +507 -0
- package/esm2022/lib/services/ate-export.service.mjs +71 -0
- package/esm2022/lib/services/ate-i18n.service.mjs +449 -0
- package/esm2022/lib/services/ate-image.service.mjs +459 -0
- package/esm2022/lib/services/ate-link.service.mjs +99 -0
- package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
- package/esm2022/lib/utils/ate-markdown.utils.mjs +179 -0
- package/esm2022/public-api.mjs +41 -0
- package/fesm2022/flogeez-angular-tiptap-editor.mjs +627 -354
- package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
- package/index.d.ts +3 -1734
- package/lib/ate-editor.provider.d.ts +21 -0
- package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
- package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
- package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
- package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +49 -0
- package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
- package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +16 -0
- package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +25 -0
- package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
- package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
- package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
- package/lib/components/editor/angular-tiptap-editor.component.d.ts +242 -0
- package/lib/components/editor/ate-block-controls.component.d.ts +44 -0
- package/lib/components/slash-commands/ate-slash-commands.component.d.ts +34 -0
- package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
- package/lib/components/ui/ate-button.component.d.ts +25 -0
- package/lib/components/ui/ate-separator.component.d.ts +5 -0
- package/lib/config/ate-editor.config.d.ts +19 -0
- package/lib/config/ate-global-config.token.d.ts +6 -0
- package/lib/config/ate-slash-commands.config.d.ts +41 -0
- package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
- package/lib/directives/ate-tooltip.directive.d.ts +30 -0
- package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
- package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
- package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
- package/lib/extensions/ate-table.extension.d.ts +2 -0
- package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
- package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
- package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
- package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
- package/lib/models/ate-bubble-menu.model.d.ts +33 -0
- package/lib/models/ate-editor-config.model.d.ts +113 -0
- package/lib/models/ate-editor-state.model.d.ts +109 -0
- package/lib/models/ate-image.model.d.ts +104 -0
- package/lib/models/ate-slash-command.model.d.ts +17 -0
- package/lib/models/ate-toolbar.model.d.ts +18 -0
- package/lib/node-view/ate-angular-node-view.d.ts +115 -0
- package/lib/node-view/ate-injector.registry.d.ts +3 -0
- package/lib/node-view/ate-node-view.factory.d.ts +10 -0
- package/lib/node-view/ate-node-view.models.d.ts +138 -0
- package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
- package/lib/node-view/ate-register-angular-component.d.ts +35 -0
- package/lib/services/ate-color-picker.service.d.ts +65 -0
- package/lib/services/ate-editor-commands.service.d.ts +89 -0
- package/lib/services/ate-export.service.d.ts +27 -0
- package/lib/services/ate-i18n.service.d.ts +432 -0
- package/lib/services/ate-image.service.d.ts +82 -0
- package/lib/services/ate-link.service.d.ts +42 -0
- package/lib/utils/ate-color.utils.d.ts +12 -0
- package/lib/utils/ate-markdown.utils.d.ts +4 -0
- package/package.json +3 -1
- 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 ``;
|
|
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=
|