@clevertask/scribe 0.1.13 → 0.1.15

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 (90) hide show
  1. package/README.md +52 -0
  2. package/dist/{BarMenu-O2IVhHXx.js → BarMenu-x4sf3ECS.js} +1 -1
  3. package/dist/components/Menu/BarMenu.js +1 -1
  4. package/dist/components/Menu/BubbleMenu.js +2 -2
  5. package/dist/components/Menu/CalloutBubbleMenu.js +2 -2
  6. package/dist/components/Menu/ExternalLinkDisplayOptions.d.ts +13 -0
  7. package/dist/components/Menu/ExternalLinkDisplayOptions.d.ts.map +1 -0
  8. package/dist/components/Menu/ExternalLinkDisplayOptions.js +90 -0
  9. package/dist/components/Menu/LinkBubbleMenu.d.ts.map +1 -1
  10. package/dist/components/Menu/LinkBubbleMenu.js +161 -61
  11. package/dist/components/Menu/LinkEditor.d.ts +9 -0
  12. package/dist/components/Menu/LinkEditor.d.ts.map +1 -1
  13. package/dist/components/Menu/LinkEditor.js +117 -64
  14. package/dist/components/Menu/Mobile/ListOptionBar.js +1 -1
  15. package/dist/components/Menu/TableBubbleMenu.js +2 -2
  16. package/dist/components/Menu/contextualMenuOwner.d.ts +1 -1
  17. package/dist/components/Menu/contextualMenuOwner.d.ts.map +1 -1
  18. package/dist/components/Menu/contextualMenuOwner.js +9 -6
  19. package/dist/components/Menu/linkBubbleMenuPlugin.d.ts +24 -1
  20. package/dist/components/Menu/linkBubbleMenuPlugin.d.ts.map +1 -1
  21. package/dist/components/Menu/linkBubbleMenuPlugin.js +43 -6
  22. package/dist/components/Scribe/extension/callout.js +1 -1
  23. package/dist/components/Scribe/extension/emoji/suggest.js +1 -1
  24. package/dist/components/Scribe/extension/extension-link.js +1 -1
  25. package/dist/components/Scribe/extension/extension-markdown-paste.js +2 -2
  26. package/dist/components/Scribe/extension/extension-selectedText.js +1 -1
  27. package/dist/components/Scribe/extension/external-link-preview/attributes.d.ts +18 -0
  28. package/dist/components/Scribe/extension/external-link-preview/attributes.d.ts.map +1 -0
  29. package/dist/components/Scribe/extension/external-link-preview/attributes.js +82 -0
  30. package/dist/components/Scribe/extension/external-link-preview/commands.d.ts +53 -0
  31. package/dist/components/Scribe/extension/external-link-preview/commands.d.ts.map +1 -0
  32. package/dist/components/Scribe/extension/external-link-preview/commands.js +134 -0
  33. package/dist/components/Scribe/extension/external-link-preview/index.d.ts +13 -0
  34. package/dist/components/Scribe/extension/external-link-preview/index.d.ts.map +1 -0
  35. package/dist/components/Scribe/extension/external-link-preview/index.js +140 -0
  36. package/dist/components/Scribe/extension/external-link-preview/node-view.d.ts +3 -0
  37. package/dist/components/Scribe/extension/external-link-preview/node-view.d.ts.map +1 -0
  38. package/dist/components/Scribe/extension/external-link-preview/node-view.js +97 -0
  39. package/dist/components/Scribe/extension/external-link-preview/normalization.d.ts +7 -0
  40. package/dist/components/Scribe/extension/external-link-preview/normalization.d.ts.map +1 -0
  41. package/dist/components/Scribe/extension/external-link-preview/normalization.js +21 -0
  42. package/dist/components/Scribe/extension/external-link-preview/paste.d.ts +9 -0
  43. package/dist/components/Scribe/extension/external-link-preview/paste.d.ts.map +1 -0
  44. package/dist/components/Scribe/extension/external-link-preview/paste.js +54 -0
  45. package/dist/components/Scribe/extension/external-link-preview/policy.d.ts +7 -0
  46. package/dist/components/Scribe/extension/external-link-preview/policy.d.ts.map +1 -0
  47. package/dist/components/Scribe/extension/external-link-preview/policy.js +38 -0
  48. package/dist/components/Scribe/extension/external-link-preview/render-html.d.ts +7 -0
  49. package/dist/components/Scribe/extension/external-link-preview/render-html.d.ts.map +1 -0
  50. package/dist/components/Scribe/extension/external-link-preview/render-html.js +62 -0
  51. package/dist/components/Scribe/extension/external-link-preview/resolver.d.ts +23 -0
  52. package/dist/components/Scribe/extension/external-link-preview/resolver.d.ts.map +1 -0
  53. package/dist/components/Scribe/extension/external-link-preview/resolver.js +118 -0
  54. package/dist/components/Scribe/extension/external-link-preview/serialization.d.ts +10 -0
  55. package/dist/components/Scribe/extension/external-link-preview/serialization.d.ts.map +1 -0
  56. package/dist/components/Scribe/extension/external-link-preview/serialization.js +69 -0
  57. package/dist/components/Scribe/extension/external-link-preview/types.d.ts +58 -0
  58. package/dist/components/Scribe/extension/external-link-preview/types.d.ts.map +1 -0
  59. package/dist/components/Scribe/extension/external-link-preview/types.js +4 -0
  60. package/dist/components/Scribe/extension/index.d.ts +1 -1
  61. package/dist/components/Scribe/extension/index.d.ts.map +1 -1
  62. package/dist/components/Scribe/extension/index.js +1 -1
  63. package/dist/components/Scribe/extension/resizable-table.js +1 -1
  64. package/dist/components/Scribe/extension/slashCommand/index.js +1 -1
  65. package/dist/components/Scribe/extension/slashCommand/renderItems.js +1 -1
  66. package/dist/components/Scribe/extension/tableOfContents.js +1 -1
  67. package/dist/components/Scribe/index.d.ts +14 -0
  68. package/dist/components/Scribe/index.d.ts.map +1 -1
  69. package/dist/components/Scribe/index.js +5 -5
  70. package/dist/{dist-BoYfa2nz.js → dist-DDjaA1Pn.js} +309 -150
  71. package/dist/{dist-W9E-K577.js → dist-tNcpTcFT.js} +738 -637
  72. package/dist/{extension-D5WIAWhc.js → extension-dRUfQQo6.js} +1940 -1938
  73. package/dist/{extension-link-D8Zi7OSa.js → extension-link-RYtPpHwt.js} +28 -27
  74. package/dist/{html-to-markdown-C920nQtn.js → html-to-markdown-nbQ6qHyO.js} +173 -162
  75. package/dist/main.css +148 -0
  76. package/dist/main.d.ts +1 -0
  77. package/dist/main.d.ts.map +1 -1
  78. package/dist/main.js +12 -9
  79. package/dist/{markdown-to-html-CW0Nb9Ye.js → markdown-to-html-B-KKCZRs.js} +115 -111
  80. package/dist/{menus-B1Zz0GjH.js → menus-U2HdvQnu.js} +11 -11
  81. package/dist/{resizable-table-Bf-fb9iv.js → resizable-table-m0AzovsZ.js} +14 -14
  82. package/dist/{slashCommand-47omO4ob.js → slashCommand-CtvgnL0Z.js} +1 -1
  83. package/dist/utils/create-scribe-editor.d.ts +4 -1
  84. package/dist/utils/create-scribe-editor.d.ts.map +1 -1
  85. package/dist/utils/html-to-markdown.d.ts.map +1 -1
  86. package/dist/utils/html-to-markdown.js +1 -1
  87. package/dist/utils/index.js +7 -7
  88. package/dist/utils/markdown-to-html.d.ts.map +1 -1
  89. package/dist/utils/markdown-to-html.js +1 -1
  90. package/package.json +1 -1
@@ -1,132 +1,185 @@
1
- import { normalizeLinkUrl as e } from "./linkUrl.js";
2
- import { Box as t, Button as n, Flex as r, Text as i, TextField as a } from "@radix-ui/themes";
3
- import { useCallback as o, useEffect as s, useId as c, useState as l } from "react";
4
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
1
+ import e from "./ExternalLinkDisplayOptions.js";
2
+ import { normalizeLinkUrl as t } from "./linkUrl.js";
3
+ import { Box as n, Button as r, Flex as i, Text as a, TextField as o } from "@radix-ui/themes";
4
+ import { useCallback as s, useEffect as c, useId as l, useState as u } from "react";
5
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
5
6
  //#region lib/components/Menu/LinkEditor.tsx
6
- var f = ({ editor: f, existingHref: p, inputRef: m, onClose: h, onValueChange: g, selectTextblockEndAfterSave: _ = !1, value: v }) => {
7
- let [y, b] = l(null), x = c(), S = e(v), C = o(() => {
8
- b(null), h();
9
- }, [h]);
10
- s(() => {
11
- b(null);
12
- }, [p]);
13
- let w = o((e) => {
14
- b(null), g(e);
15
- }, [g]), T = o((t) => {
16
- t.preventDefault();
17
- let n = e(v);
7
+ var p = ({ canRefreshPreview: p = !1, currentDisplay: m = "plain", editor: h, existingHref: g, inputRef: _, onClose: v, onRefreshPreview: y, onValueChange: b, previewStatus: x = "idle", previewStatusLabel: S, resetToken: C, selectTextblockEndAfterSave: w = !1, targetPosition: T, value: E }) => {
8
+ let [D, O] = u(null), k = l(), A = t(E), j = s(() => {
9
+ O(null), v();
10
+ }, [v]);
11
+ c(() => {
12
+ O(null);
13
+ }, [g, C]);
14
+ let M = s((e) => {
15
+ O(null), b(e);
16
+ }, [b]), N = s((e) => {
17
+ e.preventDefault();
18
+ let n = m !== "plain" && E === g ? g : t(E);
18
19
  if (!n) {
19
- b("Enter a valid web address or root-relative path.");
20
+ O("Enter a valid web address or root-relative path.");
20
21
  return;
21
22
  }
22
- let r = f.chain().focus().extendMarkRange("link").setLink({ href: n });
23
- if (_ && r.selectTextblockEnd(), !r.run()) {
24
- b("Scribe could not save this link.");
23
+ if (m !== "plain") {
24
+ if (!(h.can().updateExternalLinkPreview({ href: n }, T) && h.chain().focus().updateExternalLinkPreview({ href: n }, T).run())) {
25
+ O("This URL can't be used as a preview. Choose Plain link to keep this destination.");
26
+ return;
27
+ }
28
+ j();
25
29
  return;
26
30
  }
27
- C();
31
+ let r = h.chain().focus().extendMarkRange("link").setLink({ href: n });
32
+ if (w && r.selectTextblockEnd(), !r.run()) {
33
+ O("Scribe could not save this link.");
34
+ return;
35
+ }
36
+ j();
28
37
  }, [
29
- f,
30
- C,
31
- _,
32
- v
33
- ]), E = o(() => {
34
- if (!f.chain().focus().extendMarkRange("link").unsetLink().run()) {
35
- b("Scribe could not remove this link.");
38
+ m,
39
+ h,
40
+ g,
41
+ j,
42
+ w,
43
+ T,
44
+ E
45
+ ]), P = s(() => {
46
+ if (!h.chain().focus().extendMarkRange("link").unsetLink().run()) {
47
+ O("Scribe could not remove this link.");
36
48
  return;
37
49
  }
38
- C();
39
- }, [f, C]), D = o((e) => {
40
- e.key === "Escape" && (e.preventDefault(), e.stopPropagation(), C());
41
- }, [C]);
42
- return /* @__PURE__ */ u("form", {
43
- onKeyDown: D,
44
- onSubmit: T,
45
- children: /* @__PURE__ */ d(r, {
50
+ j();
51
+ }, [h, j]), F = E !== g, I = x === "loading" || F, L = s(() => {
52
+ I || y?.();
53
+ }, [I, y]), R = s((e) => {
54
+ let n = t(E);
55
+ if (!n) return O("Enter a valid external web address before changing its display."), !1;
56
+ let r = !1;
57
+ return r = m === "plain" ? h.chain().focus().extendMarkRange("link").setLink({ href: n }).setExternalLinkDisplay(e).run() : e === "plain" ? h.commands.convertExternalLinkPreviewToPlain(n, T) : h.can().updateExternalLinkPreview({ href: n }, T) && h.chain().focus().updateExternalLinkPreview({ href: n }, T).setExternalLinkDisplay(e, T).run(), r ? !0 : (O(e === "plain" ? "Scribe could not update this link." : "This link can't use Compact or Preview card."), !1);
58
+ }, [
59
+ m,
60
+ h,
61
+ T,
62
+ E
63
+ ]), z = s((e) => {
64
+ e.key === "Escape" && (e.preventDefault(), e.stopPropagation(), j());
65
+ }, [j]);
66
+ return /* @__PURE__ */ d("form", {
67
+ onKeyDown: z,
68
+ onSubmit: N,
69
+ children: /* @__PURE__ */ f(i, {
46
70
  direction: "column",
47
71
  gap: "4",
48
72
  children: [
49
- /* @__PURE__ */ d(t, { children: [/* @__PURE__ */ u(i, {
73
+ /* @__PURE__ */ f(n, { children: [/* @__PURE__ */ d(a, {
50
74
  as: "p",
51
75
  size: "3",
52
76
  weight: "medium",
53
77
  children: "Link"
54
- }), /* @__PURE__ */ u(i, {
78
+ }), /* @__PURE__ */ d(a, {
55
79
  as: "p",
56
80
  size: "2",
57
81
  color: "gray",
58
82
  children: "Add or update a link for the current selection."
59
83
  })] }),
60
- /* @__PURE__ */ u("label", { children: /* @__PURE__ */ d(r, {
84
+ /* @__PURE__ */ d("label", { children: /* @__PURE__ */ f(i, {
61
85
  direction: "column",
62
86
  gap: "2",
63
- children: [/* @__PURE__ */ u(i, {
87
+ children: [/* @__PURE__ */ d(a, {
64
88
  as: "span",
65
89
  size: "2",
66
90
  weight: "medium",
67
91
  children: "URL"
68
- }), /* @__PURE__ */ u(a.Root, {
69
- ref: m,
70
- "aria-describedby": y ? x : void 0,
71
- "aria-invalid": !!y,
72
- autoFocus: !m,
92
+ }), /* @__PURE__ */ d(o.Root, {
93
+ ref: _,
94
+ "aria-describedby": D ? k : void 0,
95
+ "aria-invalid": !!D,
96
+ autoFocus: !_,
73
97
  placeholder: "https://example.com",
74
- value: v,
75
- onChange: (e) => w(e.target.value)
98
+ value: E,
99
+ onChange: (e) => M(e.target.value)
76
100
  })]
77
101
  }) }),
78
- y ? /* @__PURE__ */ u(i, {
79
- id: x,
102
+ D ? /* @__PURE__ */ d(a, {
103
+ id: k,
80
104
  as: "p",
81
105
  role: "alert",
82
106
  size: "2",
83
107
  color: "red",
84
- children: y
108
+ children: D
85
109
  }) : null,
86
- /* @__PURE__ */ d(r, {
110
+ /* @__PURE__ */ d(e, {
111
+ currentDisplay: m,
112
+ editor: h,
113
+ executeDisplayChange: F ? R : void 0,
114
+ onDisplayChange: j,
115
+ targetPosition: T
116
+ }),
117
+ m === "plain" ? null : /* @__PURE__ */ f(i, {
118
+ align: "center",
119
+ justify: "between",
120
+ gap: "2",
121
+ wrap: "wrap",
122
+ children: [/* @__PURE__ */ d(a, {
123
+ as: "span",
124
+ role: "status",
125
+ "aria-live": "polite",
126
+ size: "1",
127
+ color: x === "error" ? "red" : "gray",
128
+ children: x === "loading" ? "Loading preview…" : x === "error" ? "Preview unavailable" : S
129
+ }), p && y ? /* @__PURE__ */ d(r, {
130
+ type: "button",
131
+ color: "gray",
132
+ variant: "soft",
133
+ "aria-disabled": I,
134
+ "data-disabled": I ? "" : void 0,
135
+ onClick: L,
136
+ children: "Refresh preview"
137
+ }) : null]
138
+ }),
139
+ /* @__PURE__ */ f(i, {
87
140
  justify: "between",
88
141
  gap: "3",
89
142
  wrap: "wrap",
90
- children: [/* @__PURE__ */ u(n, {
143
+ children: [m === "plain" ? /* @__PURE__ */ d(r, {
91
144
  type: "button",
92
145
  color: "red",
93
146
  variant: "soft",
94
- disabled: !p,
95
- onClick: E,
147
+ disabled: !g,
148
+ onClick: P,
96
149
  children: "Remove link"
97
- }), /* @__PURE__ */ d(r, {
150
+ }) : null, /* @__PURE__ */ f(i, {
98
151
  gap: "2",
99
152
  justify: "end",
100
153
  style: { marginLeft: "auto" },
101
154
  wrap: "wrap",
102
155
  children: [
103
- S ? /* @__PURE__ */ u(n, {
156
+ A ? /* @__PURE__ */ d(r, {
104
157
  asChild: !0,
105
158
  variant: "soft",
106
159
  color: "gray",
107
- children: /* @__PURE__ */ u("a", {
108
- href: S,
160
+ children: /* @__PURE__ */ d("a", {
161
+ href: A,
109
162
  target: "_blank",
110
163
  rel: "noopener noreferrer",
111
164
  children: "Open link"
112
165
  })
113
- }) : /* @__PURE__ */ u(n, {
166
+ }) : /* @__PURE__ */ d(r, {
114
167
  type: "button",
115
168
  variant: "soft",
116
169
  color: "gray",
117
170
  disabled: !0,
118
171
  children: "Open link"
119
172
  }),
120
- /* @__PURE__ */ u(n, {
173
+ /* @__PURE__ */ d(r, {
121
174
  type: "button",
122
175
  variant: "soft",
123
176
  color: "gray",
124
- onClick: C,
177
+ onClick: j,
125
178
  children: "Cancel"
126
179
  }),
127
- /* @__PURE__ */ u(n, {
180
+ /* @__PURE__ */ d(r, {
128
181
  type: "submit",
129
- disabled: v.trim().length === 0,
182
+ disabled: E.trim().length === 0,
130
183
  children: "Save"
131
184
  })
132
185
  ]
@@ -137,4 +190,4 @@ var f = ({ editor: f, existingHref: p, inputRef: m, onClose: h, onValueChange: g
137
190
  });
138
191
  };
139
192
  //#endregion
140
- export { f as default };
193
+ export { p as default };
@@ -1,4 +1,4 @@
1
- import { a as e } from "../../../dist-BoYfa2nz.js";
1
+ import { s as e } from "../../../dist-DDjaA1Pn.js";
2
2
  import { Button as t, Flex as n } from "@radix-ui/themes";
3
3
  import { useCallback as r } from "react";
4
4
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
@@ -1,6 +1,6 @@
1
- import { a as e } from "../../dist-BoYfa2nz.js";
1
+ import { s as e } from "../../dist-DDjaA1Pn.js";
2
2
  import { getPopupMountTarget as t } from "../Scribe/extension/getPopupMountTarget.js";
3
- import { t as n } from "../../menus-B1Zz0GjH.js";
3
+ import { t as n } from "../../menus-U2HdvQnu.js";
4
4
  import { getSelectionTableContext as r, tableBubbleMenuPluginKey as i } from "./tableBubbleMenuPlugin.js";
5
5
  import { getSelectionContextualMenuOwner as a } from "./contextualMenuOwner.js";
6
6
  import { Flex as o, IconButton as s, Separator as c } from "@radix-ui/themes";
@@ -1,4 +1,4 @@
1
1
  import type { EditorState } from "@tiptap/pm/state";
2
- export type ContextualMenuOwner = "callout" | "table";
2
+ export type ContextualMenuOwner = "callout" | "link" | "table";
3
3
  export declare const getSelectionContextualMenuOwner: (state: EditorState) => ContextualMenuOwner | null;
4
4
  //# sourceMappingURL=contextualMenuOwner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contextualMenuOwner.d.ts","sourceRoot":"","sources":["../../../lib/components/Menu/contextualMenuOwner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtD,eAAO,MAAM,+BAA+B,UAAW,WAAW,KAAG,mBAAmB,GAAG,IAa1F,CAAC"}
1
+ {"version":3,"file":"contextualMenuOwner.d.ts","sourceRoot":"","sources":["../../../lib/components/Menu/contextualMenuOwner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/D,eAAO,MAAM,+BAA+B,UAAW,WAAW,KAAG,mBAAmB,GAAG,IAyB1F,CAAC"}
@@ -1,9 +1,12 @@
1
- import { getSelectionCalloutContext as e } from "./calloutBubbleMenuPlugin.js";
2
- import { getSelectionTableContext as t } from "./tableBubbleMenuPlugin.js";
1
+ import { getSelectionLinkContext as e } from "./linkBubbleMenuPlugin.js";
2
+ import { getSelectionCalloutContext as t } from "./calloutBubbleMenuPlugin.js";
3
+ import { getSelectionTableContext as n } from "./tableBubbleMenuPlugin.js";
3
4
  //#region lib/components/Menu/contextualMenuOwner.ts
4
- var n = (n) => {
5
- let r = e(n), i = t(n);
6
- return r ? i ? r.position > i.position ? "callout" : "table" : "callout" : i ? "table" : null;
5
+ var r = (r) => {
6
+ let i = e(r);
7
+ if (i?.kind === "preview" || i?.kind === "plain" && !r.selection.empty && r.selection.from === i.from && r.selection.to === i.to) return "link";
8
+ let a = t(r), o = n(r);
9
+ return a ? o ? a.position > o.position ? "callout" : "table" : "callout" : o ? "table" : null;
7
10
  };
8
11
  //#endregion
9
- export { n as getSelectionContextualMenuOwner };
12
+ export { r as getSelectionContextualMenuOwner };
@@ -1,6 +1,29 @@
1
+ import type { EditorState } from "@tiptap/pm/state";
1
2
  import { PluginKey } from "@tiptap/pm/state";
2
3
  import { Editor } from "@tiptap/react";
4
+ import type { ExternalLinkPreviewAttributes, ExternalLinkPreviewDisplay } from "../Scribe/extension/external-link-preview/types";
5
+ export type LinkBubbleMenuFocusTarget = "dialog" | "url";
6
+ export type LinkBubbleMenuContext = {
7
+ display: "plain";
8
+ from: number;
9
+ href: string;
10
+ kind: "plain";
11
+ to: number;
12
+ } | {
13
+ attributes: ExternalLinkPreviewAttributes;
14
+ display: ExternalLinkPreviewDisplay;
15
+ from: number;
16
+ href: string;
17
+ kind: "preview";
18
+ position: number;
19
+ to: number;
20
+ };
3
21
  export declare const linkBubbleMenuPluginKey: PluginKey<any>;
4
- export declare const showLinkBubbleMenu: (editor: Editor) => void;
22
+ export declare const getPlainLinkContextAtPosition: (state: EditorState, position: number) => Extract<LinkBubbleMenuContext, {
23
+ kind: "plain";
24
+ }> | null;
25
+ export declare const getSelectionLinkContext: (state: EditorState) => LinkBubbleMenuContext | null;
26
+ export declare const consumeLinkBubbleMenuFocusTarget: (editor: Editor) => LinkBubbleMenuFocusTarget;
27
+ export declare const showLinkBubbleMenu: (editor: Editor, focusTarget?: LinkBubbleMenuFocusTarget) => void;
5
28
  export declare const hideLinkBubbleMenu: (editor: Editor) => void;
6
29
  //# sourceMappingURL=linkBubbleMenuPlugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"linkBubbleMenuPlugin.d.ts","sourceRoot":"","sources":["../../../lib/components/Menu/linkBubbleMenuPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,eAAO,MAAM,uBAAuB,gBAAwC,CAAC;AAE7E,eAAO,MAAM,kBAAkB,WAAY,MAAM,SAahD,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAAY,MAAM,SAMhD,CAAC"}
1
+ {"version":3,"file":"linkBubbleMenuPlugin.d.ts","sourceRoot":"","sources":["../../../lib/components/Menu/linkBubbleMenuPlugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAiB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAKvC,OAAO,KAAK,EACV,6BAA6B,EAC7B,0BAA0B,EAC3B,MAAM,iDAAiD,CAAC;AAEzD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEzD,MAAM,MAAM,qBAAqB,GAC7B;IACE,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ,GACD;IACE,UAAU,EAAE,6BAA6B,CAAC;IAC1C,OAAO,EAAE,0BAA0B,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEN,eAAO,MAAM,uBAAuB,gBAAwC,CAAC;AAG7E,eAAO,MAAM,6BAA6B,UACjC,WAAW,YACR,MAAM,KACf,OAAO,CAAC,qBAAqB,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,IAqCtD,CAAC;AAEF,eAAO,MAAM,uBAAuB,UAAW,WAAW,KAAG,qBAAqB,GAAG,IAiCpF,CAAC;AAEF,eAAO,MAAM,gCAAgC,WAAY,MAAM,8BAM9D,CAAC;AAEF,eAAO,MAAM,kBAAkB,WACrB,MAAM,gBACD,yBAAyB,SAevC,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAAY,MAAM,SAMhD,CAAC"}
@@ -1,9 +1,46 @@
1
- import { PluginKey as e } from "@tiptap/pm/state";
1
+ import { v as e } from "../../dist-tNcpTcFT.js";
2
+ import { normalizeExternalLinkPreviewAttributes as t } from "../Scribe/extension/external-link-preview/attributes.js";
3
+ import { NodeSelection as n, PluginKey as r } from "@tiptap/pm/state";
2
4
  //#region lib/components/Menu/linkBubbleMenuPlugin.ts
3
- var t = new e("scribeLinkBubbleMenu"), n = (e) => {
4
- e.isDestroyed || (e.view.dispatch(e.state.tr.setMeta(t, "show")), !e.isDestroyed && e.view.dispatch(e.state.tr.setMeta(t, "updatePosition")));
5
- }, r = (e) => {
6
- e.isDestroyed || e.view.dispatch(e.state.tr.setMeta(t, "hide"));
5
+ var i = new r("scribeLinkBubbleMenu"), a = /* @__PURE__ */ new WeakMap(), o = (t, n) => {
6
+ let r = t.schema.marks.link;
7
+ if (!r || !Number.isInteger(n) || n < 0 || n > t.doc.content.size) return null;
8
+ let i = t.doc.resolve(n);
9
+ if (!i.parent.isTextblock) return null;
10
+ let a = e(i, r);
11
+ if (!a) return null;
12
+ let o = t.doc.nodeAt(a.from)?.marks.find((e) => e.type === r), s = typeof o?.attrs.href == "string" ? o.attrs.href : "";
13
+ return s ? {
14
+ display: "plain",
15
+ from: a.from,
16
+ href: s,
17
+ kind: "plain",
18
+ to: a.to
19
+ } : null;
20
+ }, s = (e) => {
21
+ let { selection: r } = e;
22
+ if (r instanceof n && r.node.type.name === "externalLinkPreview") {
23
+ let e = t(r.node.attrs);
24
+ return e ? {
25
+ attributes: e,
26
+ display: e.display,
27
+ from: r.from,
28
+ href: e.href,
29
+ kind: "preview",
30
+ position: r.from,
31
+ to: r.to
32
+ } : null;
33
+ }
34
+ if (!r.$from.sameParent(r.$to)) return null;
35
+ let i = o(e, r.from);
36
+ return !i || r.from < i.from || r.to > i.to ? null : i;
37
+ }, c = (e) => {
38
+ let t = a.get(e) ?? "url";
39
+ return a.delete(e), t;
40
+ }, l = (e, t = "url") => {
41
+ e.isDestroyed || (a.set(e, t), e.view.dispatch(e.state.tr.setMeta(i, "show")), !e.isDestroyed && e.view.dispatch(e.state.tr.setMeta(i, "updatePosition")));
42
+ }, u = (e) => {
43
+ e.isDestroyed || e.view.dispatch(e.state.tr.setMeta(i, "hide"));
7
44
  };
8
45
  //#endregion
9
- export { r as hideLinkBubbleMenu, t as linkBubbleMenuPluginKey, n as showLinkBubbleMenu };
46
+ export { c as consumeLinkBubbleMenuFocusTarget, o as getPlainLinkContextAtPosition, s as getSelectionLinkContext, u as hideLinkBubbleMenu, i as linkBubbleMenuPluginKey, l as showLinkBubbleMenu };
@@ -1,4 +1,4 @@
1
- import { O as e, P as t, a as n } from "../../../dist-W9E-K577.js";
1
+ import { A as e, L as t, a as n } from "../../../dist-tNcpTcFT.js";
2
2
  import { TextSelection as r } from "@tiptap/pm/state";
3
3
  //#region lib/components/Scribe/extension/callout.ts
4
4
  var i = [
@@ -1,4 +1,4 @@
1
- import { n as e } from "../../../../dist-BoYfa2nz.js";
1
+ import { i as e } from "../../../../dist-DDjaA1Pn.js";
2
2
  import { getPopupMountTarget as t } from "../getPopupMountTarget.js";
3
3
  import { t as n } from "../../../../tippy.esm-DOXqN1Qm.js";
4
4
  import { EmojiList as r } from "./EmojiList.js";
@@ -1,2 +1,2 @@
1
- import { t as e } from "../../../extension-link-D8Zi7OSa.js";
1
+ import { t as e } from "../../../extension-link-RYtPpHwt.js";
2
2
  export { e as default };
@@ -1,5 +1,5 @@
1
- import { n as e } from "../../../dist-W9E-K577.js";
2
- import { n as t, t as n } from "../../../markdown-to-html-CW0Nb9Ye.js";
1
+ import { n as e } from "../../../dist-tNcpTcFT.js";
2
+ import { n as t, t as n } from "../../../markdown-to-html-B-KKCZRs.js";
3
3
  import { Plugin as r, PluginKey as i } from "@tiptap/pm/state";
4
4
  //#region lib/components/Scribe/extension/extension-markdown-paste.ts
5
5
  var a = new i("markdownPaste"), o = /* @__PURE__ */ new Set([
@@ -1,4 +1,4 @@
1
- import { n as e } from "../../../dist-W9E-K577.js";
1
+ import { n as e } from "../../../dist-tNcpTcFT.js";
2
2
  //#region lib/components/Scribe/extension/extension-selectedText.ts
3
3
  var t = e.create({
4
4
  name: "SelectedText",
@@ -0,0 +1,18 @@
1
+ import { type ExternalLinkPreviewAttributes, type ExternalLinkPreviewDisplay, type ExternalLinkPreviewMetadata } from "./types";
2
+ /** @experimental Part of Scribe's evolving external-link-preview contract. */
3
+ export declare const EXTERNAL_LINK_PREVIEW_NODE_NAME = "externalLinkPreview";
4
+ export declare const EXTERNAL_LINK_PREVIEW_SELECTOR = "span[data-type=\"external-link-preview\"]";
5
+ export declare const EXTERNAL_LINK_PREVIEW_TARGET_SELECTOR = "a[data-link-preview-target]";
6
+ export declare const isExternalLinkPreviewDisplay: (value: unknown) => value is ExternalLinkPreviewDisplay;
7
+ export declare const normalizeExternalLinkPreviewLinkText: (value: unknown) => string | null;
8
+ /** Validate an authored preview destination without canonicalizing or removing query parameters. */
9
+ export declare const normalizeExternalLinkPreviewHref: (value: unknown) => string | null;
10
+ /** Preview media may be proxied by a consumer through a strict root-relative path. */
11
+ export declare const normalizeExternalLinkPreviewMediaUrl: (value: unknown) => string | null;
12
+ export declare const normalizeExternalLinkPreviewMetadata: (metadata: ExternalLinkPreviewMetadata | Record<string, unknown> | null | undefined) => Required<ExternalLinkPreviewMetadata>;
13
+ /** Normalize only metadata fields that a resolver deliberately returned. */
14
+ export declare const normalizeExternalLinkPreviewMetadataPatch: (metadata: ExternalLinkPreviewMetadata) => Partial<Required<ExternalLinkPreviewMetadata>>;
15
+ export declare const normalizeExternalLinkPreviewAttributes: (input: Partial<Record<keyof ExternalLinkPreviewAttributes, unknown>>) => ExternalLinkPreviewAttributes | null;
16
+ export declare const getExternalLinkPreviewHostname: (href: string) => string;
17
+ export declare const getExternalLinkPreviewTitle: (attributes: Pick<ExternalLinkPreviewAttributes, "href" | "pageTitle" | "siteName">) => string;
18
+ //# sourceMappingURL=attributes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/attributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EACjC,MAAM,SAAS,CAAC;AA8CjB,8EAA8E;AAC9E,eAAO,MAAM,+BAA+B,wBAAwB,CAAC;AACrE,eAAO,MAAM,8BAA8B,8CAA4C,CAAC;AACxF,eAAO,MAAM,qCAAqC,gCAAgC,CAAC;AAEnF,eAAO,MAAM,4BAA4B,UAAW,OAAO,KAAG,KAAK,IAAI,0BAC2B,CAAC;AAwBnG,eAAO,MAAM,oCAAoC,UAAW,OAAO,KAAG,MAAM,GAAG,IACE,CAAC;AAElF,oGAAoG;AACpG,eAAO,MAAM,gCAAgC,UAAW,OAAO,KAAG,MAAM,GAAG,IAuB1E,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,oCAAoC,UAAW,OAAO,KAAG,MAAM,GAAG,IAwB9E,CAAC;AAcF,eAAO,MAAM,oCAAoC,aACrC,2BAA2B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,KACjF,QAAQ,CAAC,2BAA2B,CAOrC,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,yCAAyC,aAC1C,2BAA2B,KACpC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAW/C,CAAC;AAEF,eAAO,MAAM,sCAAsC,UAC1C,OAAO,CAAC,MAAM,CAAC,MAAM,6BAA6B,EAAE,OAAO,CAAC,CAAC,KACnE,6BAA6B,GAAG,IAgBlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,SAAU,MAAM,WAM1D,CAAC;AAEF,eAAO,MAAM,2BAA2B,eAC1B,IAAI,CAAC,6BAA6B,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC,WACe,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { EXTERNAL_LINK_PREVIEW_DISPLAYS as e } from "./types.js";
2
+ //#region lib/components/Scribe/extension/external-link-preview/attributes.ts
3
+ var t = /^\/(?![\\/])/, n = /^https?:\/\//i, r = 16384, i = 16384, a = 512, o = 2048, s = 256, c = 16384, l = 128, u = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/, d = [
4
+ "pageTitle",
5
+ "description",
6
+ "siteName",
7
+ "faviconUrl",
8
+ "imageUrl",
9
+ "fetchedAt"
10
+ ], f = (e) => {
11
+ for (let t of e) {
12
+ let e = t.charCodeAt(0);
13
+ if (e <= 31 || e === 127) return !0;
14
+ }
15
+ return !1;
16
+ }, p = (e) => {
17
+ let t = e.indexOf("//") + 2, n = [
18
+ "/",
19
+ "?",
20
+ "#"
21
+ ].map((n) => e.indexOf(n, t)).filter((e) => e >= 0), r = n.length ? Math.min(...n) : e.length;
22
+ return e.slice(t, r).includes("@");
23
+ }, m = "externalLinkPreview", h = "span[data-type=\"external-link-preview\"]", g = "a[data-link-preview-target]", _ = (t) => typeof t == "string" && e.some((e) => e === t), v = (e, t, { preserveWhitespace: n = !1 } = {}) => {
24
+ if (typeof e != "string") return null;
25
+ let r = n ? e : e.trim();
26
+ return !r.trim() || r.length > t || f(r) ? null : r;
27
+ }, y = (e) => v(e, i, { preserveWhitespace: !0 }), b = (e) => {
28
+ let t = v(e, r);
29
+ if (!t || t.includes("\\") || !n.test(t) || p(t)) return null;
30
+ try {
31
+ let e = new URL(t);
32
+ return e.protocol !== "http:" && e.protocol !== "https:" || e.username || e.password ? null : t;
33
+ } catch {
34
+ return null;
35
+ }
36
+ }, x = (e) => {
37
+ let r = v(e, c);
38
+ if (!r || r.includes("\\")) return null;
39
+ if (t.test(r)) return r;
40
+ if (!n.test(r) || p(r)) return null;
41
+ try {
42
+ let e = new URL(r);
43
+ return (e.protocol === "http:" || e.protocol === "https:") && !e.username && !e.password ? r : null;
44
+ } catch {
45
+ return null;
46
+ }
47
+ }, S = (e) => {
48
+ let t = v(e, l);
49
+ if (!t || !u.test(t)) return null;
50
+ let n = new Date(t);
51
+ return Number.isNaN(n.getTime()) ? null : n.toISOString();
52
+ }, C = (e) => ({
53
+ pageTitle: v(e?.pageTitle, a),
54
+ description: v(e?.description, o),
55
+ siteName: v(e?.siteName, s),
56
+ faviconUrl: x(e?.faviconUrl),
57
+ imageUrl: x(e?.imageUrl),
58
+ fetchedAt: S(e?.fetchedAt)
59
+ }), w = (e) => {
60
+ let t = C(e), n = {};
61
+ return d.forEach((r) => {
62
+ Object.prototype.hasOwnProperty.call(e, r) && e[r] !== void 0 && (n[r] = t[r]);
63
+ }), n;
64
+ }, T = (e) => {
65
+ let t = b(e.href);
66
+ if (!t) return null;
67
+ let n = C(e);
68
+ return {
69
+ href: t,
70
+ linkText: y(e.linkText) ?? t,
71
+ display: _(e.display) ? e.display : "compact",
72
+ ...n
73
+ };
74
+ }, E = (e) => {
75
+ try {
76
+ return new URL(e).hostname;
77
+ } catch {
78
+ return e;
79
+ }
80
+ }, D = (e) => e.pageTitle || e.siteName || E(e.href);
81
+ //#endregion
82
+ export { m as EXTERNAL_LINK_PREVIEW_NODE_NAME, h as EXTERNAL_LINK_PREVIEW_SELECTOR, g as EXTERNAL_LINK_PREVIEW_TARGET_SELECTOR, E as getExternalLinkPreviewHostname, D as getExternalLinkPreviewTitle, _ as isExternalLinkPreviewDisplay, T as normalizeExternalLinkPreviewAttributes, b as normalizeExternalLinkPreviewHref, y as normalizeExternalLinkPreviewLinkText, x as normalizeExternalLinkPreviewMediaUrl, C as normalizeExternalLinkPreviewMetadata, w as normalizeExternalLinkPreviewMetadataPatch };
@@ -0,0 +1,53 @@
1
+ import type { Node as ProseMirrorNode } from "@tiptap/pm/model";
2
+ import type { Transaction } from "@tiptap/pm/state";
3
+ import type { ExternalLinkDisplay, ExternalLinkPreviewAttributes, InsertExternalLinkPreviewOptions, UpdateExternalLinkPreviewOptions } from "./types";
4
+ declare module "@tiptap/core" {
5
+ interface Commands<ReturnType> {
6
+ externalLinkPreview: {
7
+ /** Insert an enhanced external link at the current selection. */
8
+ insertExternalLinkPreview: (options: InsertExternalLinkPreviewOptions) => ReturnType;
9
+ /** Convert the selected enhanced link or full-line Link mark to another presentation. */
10
+ setExternalLinkDisplay: (display: ExternalLinkDisplay, targetPosition?: number) => ReturnType;
11
+ /** Atomically convert a preview to a Plain link while applying its edited destination. */
12
+ convertExternalLinkPreviewToPlain: (href: string, targetPosition?: number) => ReturnType;
13
+ /** Explicitly refresh metadata for the selected enhanced link. */
14
+ refreshExternalLinkPreview: (targetPosition?: number) => ReturnType;
15
+ /** Safely update the selected preview's destination, fallback text, or metadata. */
16
+ updateExternalLinkPreview: (options: UpdateExternalLinkPreviewOptions, targetPosition?: number) => ReturnType;
17
+ };
18
+ }
19
+ }
20
+ interface PreviewContext {
21
+ attributes: ExternalLinkPreviewAttributes;
22
+ node: ProseMirrorNode;
23
+ position: number;
24
+ isSoleTextblockContent: boolean;
25
+ }
26
+ export declare const getSelectedExternalLinkPreview: (transaction: Transaction, targetPosition?: number) => PreviewContext | null;
27
+ export declare const createExternalLinkPreviewCommands: ({ resolveMetadata, shouldPreview, }: {
28
+ resolveMetadata: boolean;
29
+ shouldPreview?: (href: string) => boolean;
30
+ }) => {
31
+ insertExternalLinkPreview: (options: InsertExternalLinkPreviewOptions) => ({ dispatch, tr }: {
32
+ dispatch?: (args?: unknown) => unknown;
33
+ tr: Transaction;
34
+ }) => boolean;
35
+ setExternalLinkDisplay: (display: ExternalLinkDisplay, targetPosition?: number) => ({ dispatch, tr }: {
36
+ dispatch?: (args?: unknown) => unknown;
37
+ tr: Transaction;
38
+ }) => boolean;
39
+ convertExternalLinkPreviewToPlain: (requestedHref: string, targetPosition?: number) => ({ dispatch, tr }: {
40
+ dispatch?: (args?: unknown) => unknown;
41
+ tr: Transaction;
42
+ }) => boolean;
43
+ refreshExternalLinkPreview: (targetPosition?: number) => ({ dispatch, tr }: {
44
+ dispatch?: (args?: unknown) => unknown;
45
+ tr: Transaction;
46
+ }) => boolean;
47
+ updateExternalLinkPreview: (options: UpdateExternalLinkPreviewOptions, targetPosition?: number) => ({ dispatch, tr }: {
48
+ dispatch?: (args?: unknown) => unknown;
49
+ tr: Transaction;
50
+ }) => boolean;
51
+ };
52
+ export {};
53
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../lib/components/Scribe/extension/external-link-preview/commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,IAAI,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AASpD,OAAO,KAAK,EACV,mBAAmB,EACnB,6BAA6B,EAE7B,gCAAgC,EAChC,gCAAgC,EACjC,MAAM,SAAS,CAAC;AAEjB,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,mBAAmB,EAAE;YACnB,iEAAiE;YACjE,yBAAyB,EAAE,CAAC,OAAO,EAAE,gCAAgC,KAAK,UAAU,CAAC;YACrF,yFAAyF;YACzF,sBAAsB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;YAC9F,0FAA0F;YAC1F,iCAAiC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;YACzF,kEAAkE;YAClE,0BAA0B,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC;YACpE,oFAAoF;YACpF,yBAAyB,EAAE,CACzB,OAAO,EAAE,gCAAgC,EACzC,cAAc,CAAC,EAAE,MAAM,KACpB,UAAU,CAAC;SACjB,CAAC;KACH;CACF;AAED,UAAU,cAAc;IACtB,UAAU,EAAE,6BAA6B,CAAC;IAC1C,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,OAAO,CAAC;CACjC;AAWD,eAAO,MAAM,8BAA8B,gBAC5B,WAAW,mBACP,MAAM,KACtB,cAAc,GAAG,IAyCnB,CAAC;AAkHF,eAAO,MAAM,iCAAiC,wCAG3C;IACD,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C;IACC,yBAAyB,YACb,gCAAgC,wBACvB;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE;IA4ChF,sBAAsB,YACV,mBAAmB,mBAAmB,MAAM,wBACnC;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE;IAiFhF,iCAAiC,kBACf,MAAM,mBAAmB,MAAM,wBAC5B;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE;IA+BhF,0BAA0B,oBACN,MAAM,wBACL;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE;IAqBhF,yBAAyB,YACb,gCAAgC,mBAAmB,MAAM,wBAChD;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,WAAW,CAAA;KAAE;CAsEhF,CAAC"}