@marimo-team/islands 0.23.10-dev3 → 0.23.10-dev30

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 (165) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CyV83R2m.js → ConnectedDataExplorerComponent-DmBropAy.js} +31 -31
  2. package/dist/{ErrorBoundary-rULOrC_p.js → ErrorBoundary-DpbaKVv7.js} +1 -1
  3. package/dist/{any-language-editor-DfdpyDv_.js → any-language-editor-DNmoSiWL.js} +20 -20
  4. package/dist/assets/__vite-browser-external-eshhtsgZ.js +1 -0
  5. package/dist/assets/worker-CC0Oul9k.js +73 -0
  6. package/dist/{chat-ui-C1tL1pML.js → chat-ui-D6oraHT2.js} +76 -76
  7. package/dist/{check-DTbrK0zt.js → check-BCaJeT-J.js} +1 -1
  8. package/dist/{code-visibility-DfnO0DcH.js → code-visibility-wR7WSQ4c.js} +2166 -1292
  9. package/dist/{copy-BuQpJEzp.js → copy-UqRYxiOg.js} +33 -33
  10. package/dist/dist-7QfXoMdB.js +5 -0
  11. package/dist/{dist-DgnE8F-r.js → dist-A2846XWO.js} +1 -1
  12. package/dist/dist-BEXXyZig.js +5 -0
  13. package/dist/{dist-B3pZ0Ab6.js → dist-BR_gyG9L.js} +3 -3
  14. package/dist/{dist-CcXxepx6.js → dist-BSAt6RhH.js} +27 -27
  15. package/dist/{dist-Bde4a2kU.js → dist-BY018Paw.js} +8 -8
  16. package/dist/dist-BYj57OV4.js +5 -0
  17. package/dist/{dist-CUCNs1ja.js → dist-BaoDKvdy.js} +2 -2
  18. package/dist/{dist-Cy1WxgBD.js → dist-Bf7SHuNp.js} +5 -5
  19. package/dist/{dist-Bz_sYWbr.js → dist-Bk75fBZA.js} +2 -2
  20. package/dist/dist-BlSvQzNr.js +5 -0
  21. package/dist/{dist-C5VC_yzu.js → dist-BzEzfugY.js} +1 -1
  22. package/dist/dist-CCBlxAgS.js +8 -0
  23. package/dist/dist-CIDTVIUf.js +5 -0
  24. package/dist/{dist-CLUtPrdy.js → dist-CIYBwstr.js} +1 -1
  25. package/dist/{dist-BotSqB48.js → dist-C_Y3oV3C.js} +12 -12
  26. package/dist/{dist-BTfv03uy.js → dist-CcWX6tmx.js} +2 -2
  27. package/dist/{dist-BhM8gdSO.js → dist-CoXAujgg.js} +4 -4
  28. package/dist/{dist-4j4c7bjm.js → dist-CpxNdDkw.js} +3 -3
  29. package/dist/dist-CqQyhAM8.js +8 -0
  30. package/dist/dist-CwRu2Xzh.js +5 -0
  31. package/dist/{dist-BcuoonNH.js → dist-CxJDU6Bh.js} +9 -9
  32. package/dist/{dist-DxvORzUR.js → dist-D-W5ny5a.js} +8 -8
  33. package/dist/dist-D8CDTVgf.js +6 -0
  34. package/dist/dist-D8DNB0nO.js +8 -0
  35. package/dist/dist-DL6N_q-A.js +5 -0
  36. package/dist/{dist-BbbIBDiQ.js → dist-DMjWuVs8.js} +1 -1
  37. package/dist/dist-DOFbNV_b.js +8 -0
  38. package/dist/dist-DPrYzMY0.js +6 -0
  39. package/dist/{dist-h2c8sZvT.js → dist-DZORgqKY.js} +1 -1
  40. package/dist/{dist-B3P2fFpz.js → dist-DZo4nSS0.js} +14 -14
  41. package/dist/{dist-D4CewLk6.js → dist-Dax--nl9.js} +1 -1
  42. package/dist/{dist-DRfcqpxJ.js → dist-DgGbNavJ.js} +2 -2
  43. package/dist/{dist-C1BYNeCR.js → dist-Dk6PV_d3.js} +10 -10
  44. package/dist/{dist-fQ0ViXGs.js → dist-Dv_Y15yk.js} +107 -107
  45. package/dist/{dist-Bfwsv11D.js → dist-DyyjKEYf.js} +2 -2
  46. package/dist/{dist-p2qyWijU.js → dist-GZXUmt0b.js} +2 -2
  47. package/dist/{dist-CLJWPTX2.js → dist-LTU8Hdvn.js} +3 -3
  48. package/dist/{dist-DqAWR3CS.js → dist-M9Vag9Y0.js} +20 -20
  49. package/dist/{dist-DNdhYsgW.js → dist-U4F-tbMs.js} +79 -62
  50. package/dist/{dist-RqXTaiir.js → dist-abid3KgM.js} +11 -11
  51. package/dist/dist-cdmMjgsn.js +5 -0
  52. package/dist/dist-hT4QzYX-.js +1247 -0
  53. package/dist/{dist-luvabDEB.js → dist-t9Kf7xqC.js} +2 -2
  54. package/dist/{error-banner-5bz0L9hS.js → error-banner-Cc0I3C9e.js} +1 -1
  55. package/dist/esm-BaH2eg5-.js +1171 -0
  56. package/dist/{esm-Duie8iU-.js → esm-ga2Bf3O2.js} +43 -43
  57. package/dist/{extends-BgdxCfYu.js → extends-D_hDsj6R.js} +4 -4
  58. package/dist/{formats-DHxc-FdY.js → formats-C4wO47tk.js} +1 -1
  59. package/dist/{glide-data-editor-BOmK9ETQ.js → glide-data-editor-Qhu8oCX-.js} +12 -12
  60. package/dist/{html-to-image-CNa5ok96.js → html-to-image-UEH5lFDZ.js} +2318 -2275
  61. package/dist/{input-_2sjvfne.js → input-CMYy4hzj.js} +187 -185
  62. package/dist/{label-LWtdw5i8.js → label-CC4ytI1X.js} +1 -1
  63. package/dist/main.js +6941 -6913
  64. package/dist/{mermaid-lXOw5Py9.js → mermaid-zuLgJ8J8.js} +4 -4
  65. package/dist/{process-output-DKr4f1di.js → process-output-CyMLTogj.js} +3 -3
  66. package/dist/{reveal-component-UdMnCK5U.js → reveal-component-BjnkUAZ9.js} +697 -619
  67. package/dist/{spec-B96zNUEA.js → spec-X7FwLJni.js} +4 -4
  68. package/dist/{strings-Bu3vlb6W.js → strings-J57tzLr3.js} +47 -46
  69. package/dist/style.css +1 -1
  70. package/dist/{toDate-x-WRDCH7.js → toDate-d8RCRrRd.js} +2 -2
  71. package/dist/{tooltip-C5FYOpQc.js → tooltip-DpcyNkQ2.js} +2 -2
  72. package/dist/{types-CVvp1fKr.js → types-ChtMFmZ2.js} +1 -1
  73. package/dist/{useAsyncData-iRgKDT5s.js → useAsyncData-PonK__yh.js} +1 -1
  74. package/dist/{useDateFormatter-BA4FCquG.js → useDateFormatter-QB-3MpYr.js} +2 -2
  75. package/dist/{useDeepCompareMemoize-CkQ57VS2.js → useDeepCompareMemoize-D3NGWke6.js} +1 -1
  76. package/dist/{useLifecycle-BBO9PIph.js → useLifecycle-00mO3OSS.js} +2 -2
  77. package/dist/{useTheme-DHIrRQOe.js → useTheme-DEhDzATN.js} +1 -1
  78. package/dist/{vega-component-Dq-SH463.js → vega-component-9h1ACS78.js} +8 -8
  79. package/dist/{zod-CoBiJ5v4.js → zod-aLSua2NL.js} +24 -23
  80. package/package.json +3 -3
  81. package/src/components/data-table/TableBottomBar.tsx +1 -15
  82. package/src/components/data-table/TableTopBar.tsx +8 -13
  83. package/src/components/data-table/__tests__/TableBottomBar.test.tsx +6 -12
  84. package/src/components/data-table/__tests__/column-visibility-dropdown.test.tsx +227 -0
  85. package/src/components/data-table/__tests__/data-table.test.tsx +154 -12
  86. package/src/components/data-table/column-visibility-dropdown.tsx +204 -0
  87. package/src/components/data-table/data-table.tsx +1 -1
  88. package/src/components/data-table/filter-by-values-picker.tsx +39 -17
  89. package/src/components/data-table/filter-pills.tsx +1 -1
  90. package/src/components/data-table/hover-tooltip/__tests__/content.test.ts +60 -0
  91. package/src/components/data-table/hover-tooltip/content.ts +44 -0
  92. package/src/components/data-table/hover-tooltip/hover-tooltip.tsx +55 -0
  93. package/src/components/data-table/hover-tooltip/use-table-hover-tooltip.ts +159 -0
  94. package/src/components/data-table/renderers.tsx +27 -43
  95. package/src/components/datasources/__tests__/filter-empty.test.ts +183 -0
  96. package/src/components/datasources/datasources.tsx +92 -3
  97. package/src/components/editor/cell/cell-context-menu.tsx +15 -2
  98. package/src/components/editor/cell/code/language-toggle.tsx +7 -1
  99. package/src/components/editor/chrome/wrapper/app-chrome.tsx +97 -52
  100. package/src/components/editor/chrome/wrapper/lazy-panels.ts +91 -0
  101. package/src/components/editor/chrome/wrapper/sidebar.tsx +2 -0
  102. package/src/components/editor/documentation.css +35 -0
  103. package/src/components/editor/file-tree/file-explorer.tsx +8 -18
  104. package/src/components/editor/file-tree/tree-actions.tsx +46 -1
  105. package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +20 -0
  106. package/src/components/editor/renderers/slides-layout/types.ts +1 -0
  107. package/src/components/slides/__tests__/minimap-actions.test.tsx +166 -0
  108. package/src/components/slides/__tests__/reveal-component.test.ts +425 -0
  109. package/src/components/slides/minimap.tsx +127 -10
  110. package/src/components/slides/reveal-component.tsx +287 -61
  111. package/src/components/slides/slide-cell-view.tsx +26 -2
  112. package/src/components/slides/slide-form.tsx +26 -4
  113. package/src/components/storage/__tests__/storage-inspector.test.ts +53 -0
  114. package/src/components/storage/storage-inspector.tsx +68 -48
  115. package/src/components/ui/__tests__/use-toast.test.ts +75 -0
  116. package/src/components/ui/combobox.tsx +51 -32
  117. package/src/components/ui/reorderable-list.tsx +13 -0
  118. package/src/components/ui/select-core/__tests__/use-select-list.test.ts +294 -0
  119. package/src/components/ui/select-core/__tests__/utils.test.ts +222 -0
  120. package/src/components/ui/select-core/index.ts +16 -0
  121. package/src/components/ui/select-core/option-row.tsx +33 -0
  122. package/src/components/ui/select-core/render-slot.ts +20 -0
  123. package/src/components/ui/select-core/select-list.tsx +248 -0
  124. package/src/components/ui/select-core/types.ts +44 -0
  125. package/src/components/ui/select-core/use-select-list.ts +347 -0
  126. package/src/components/ui/select-core/utils.ts +121 -0
  127. package/src/components/ui/use-toast.ts +33 -13
  128. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +0 -28
  129. package/src/core/cells/__tests__/cell.test.ts +29 -2
  130. package/src/core/cells/cell.ts +5 -1
  131. package/src/core/codemirror/go-to-definition/commands.ts +4 -3
  132. package/src/core/codemirror/language/languages/python.ts +2 -0
  133. package/src/core/codemirror/language/languages/sql/utils.ts +3 -1
  134. package/src/core/codemirror/lsp/__tests__/markdown-renderer.test.ts +41 -0
  135. package/src/core/codemirror/lsp/markdown-renderer.ts +59 -0
  136. package/src/core/datasets/data-source-connections.ts +2 -0
  137. package/src/core/network/__tests__/requests-static.test.ts +30 -0
  138. package/src/core/network/requests-static.ts +14 -10
  139. package/src/core/wasm/worker/bootstrap.ts +12 -4
  140. package/src/plugins/impl/MultiselectPlugin.tsx +19 -142
  141. package/src/plugins/impl/SearchableSelect.tsx +16 -97
  142. package/src/plugins/impl/__tests__/DropdownPlugin.test.tsx +5 -2
  143. package/src/plugins/impl/__tests__/MultiSelectPlugin.test.ts +1 -1
  144. package/src/plugins/layout/DownloadPlugin.tsx +1 -1
  145. package/src/utils/lazy.ts +6 -1
  146. package/dist/assets/__vite-browser-external-Ci2ZQfXU.js +0 -1
  147. package/dist/assets/worker-ip3AI_sN.js +0 -73
  148. package/dist/dist-0Fif7jnk.js +0 -5
  149. package/dist/dist-B5h_9sHB.js +0 -6
  150. package/dist/dist-B9M6R5ye.js +0 -5
  151. package/dist/dist-BCt3tnck.js +0 -8
  152. package/dist/dist-BUIJwMwn.js +0 -8
  153. package/dist/dist-BpquMd3k.js +0 -5
  154. package/dist/dist-BzJsqYfz.js +0 -5
  155. package/dist/dist-CA5ELXAf.js +0 -6
  156. package/dist/dist-CLBRs6Uv.js +0 -5
  157. package/dist/dist-CStVCMbq.js +0 -5
  158. package/dist/dist-CZRIEY3Y.js +0 -8
  159. package/dist/dist-CuUHbFD0.js +0 -5
  160. package/dist/dist-DV7Iabxb.js +0 -8
  161. package/dist/dist-DhHh0jLg.js +0 -1247
  162. package/dist/dist-DuEeHMvL.js +0 -5
  163. package/dist/esm-BfhQmZjp.js +0 -1171
  164. package/src/plugins/impl/multiselectFilterFn.tsx +0 -22
  165. /package/src/components/{data-table → ui}/value-chips.tsx +0 -0
@@ -0,0 +1,1247 @@
1
+ import { $ as EditorView, At as Facet, Bt as codePointAt, Ct as Annotation, Et as CharCategory, Ft as RangeValue, Gt as fromCodePoint, Ht as combineConfig, I as syntaxTree, It as StateEffect, Lt as StateField, Mt as Prec, Nt as RangeSet, Ot as EditorSelection, Q as Direction, Rt as Text, Vt as codePointSize, Z as Decoration, ht as logException, j as indentUnit, jt as MapMode, nt as WidgetType, pt as keymap, st as getTooltip, tt as ViewPlugin, xt as showTooltip, zt as Transaction } from "./dist-U4F-tbMs.js";
2
+ var CompletionContext = class {
3
+ constructor(r8, M, N, P) {
4
+ this.state = r8, this.pos = M, this.explicit = N, this.view = P, this.abortListeners = [], this.abortOnDocChange = false;
5
+ }
6
+ tokenBefore(r8) {
7
+ let M = syntaxTree(this.state).resolveInner(this.pos, -1);
8
+ for (; M && r8.indexOf(M.name) < 0; ) M = M.parent;
9
+ return M ? {
10
+ from: M.from,
11
+ to: this.pos,
12
+ text: this.state.sliceDoc(M.from, this.pos),
13
+ type: M.type
14
+ } : null;
15
+ }
16
+ matchBefore(r8) {
17
+ let M = this.state.doc.lineAt(this.pos), N = Math.max(M.from, this.pos - 250), P = M.text.slice(N - M.from, this.pos - M.from), F = P.search(ensureAnchor(r8, false));
18
+ return F < 0 ? null : {
19
+ from: N + F,
20
+ to: this.pos,
21
+ text: P.slice(F)
22
+ };
23
+ }
24
+ get aborted() {
25
+ return this.abortListeners == null;
26
+ }
27
+ addEventListener(r8, M, N) {
28
+ r8 == "abort" && this.abortListeners && (this.abortListeners.push(M), N && N.onDocChange && (this.abortOnDocChange = true));
29
+ }
30
+ };
31
+ function toSet(r8) {
32
+ let M = Object.keys(r8).join(""), N = /\w/.test(M);
33
+ return N && (M = M.replace(/\w/g, "")), `[${N ? "\\w" : ""}${M.replace(/[^\w\s]/g, "\\$&")}]`;
34
+ }
35
+ function prefixMatch(r8) {
36
+ let M = /* @__PURE__ */ Object.create(null), N = /* @__PURE__ */ Object.create(null);
37
+ for (let { label: P2 } of r8) {
38
+ M[P2[0]] = true;
39
+ for (let r9 = 1; r9 < P2.length; r9++) N[P2[r9]] = true;
40
+ }
41
+ let P = toSet(M) + toSet(N) + "*$";
42
+ return [/* @__PURE__ */ RegExp("^" + P), new RegExp(P)];
43
+ }
44
+ function completeFromList(r8) {
45
+ let M = r8.map((r9) => typeof r9 == "string" ? { label: r9 } : r9), [N, P] = M.every((r9) => /^\w+$/.test(r9.label)) ? [/\w*$/, /\w+$/] : prefixMatch(M);
46
+ return (r9) => {
47
+ let F = r9.matchBefore(P);
48
+ return F || r9.explicit ? {
49
+ from: F ? F.from : r9.pos,
50
+ options: M,
51
+ validFor: N
52
+ } : null;
53
+ };
54
+ }
55
+ function ifNotIn(r8, M) {
56
+ return (N) => {
57
+ for (let M2 = syntaxTree(N.state).resolveInner(N.pos, -1); M2; M2 = M2.parent) {
58
+ if (r8.indexOf(M2.name) > -1) return null;
59
+ if (M2.type.isTop) break;
60
+ }
61
+ return M(N);
62
+ };
63
+ }
64
+ var Option = class {
65
+ constructor(r8, M, N, P) {
66
+ this.completion = r8, this.source = M, this.match = N, this.score = P;
67
+ }
68
+ };
69
+ function cur(r8) {
70
+ return r8.selection.main.from;
71
+ }
72
+ function ensureAnchor(r8, M) {
73
+ let { source: N } = r8, P = M && N[0] != "^", F = N[N.length - 1] != "$";
74
+ return !P && !F ? r8 : RegExp(`${P ? "^" : ""}(?:${N})${F ? "$" : ""}`, r8.flags ?? (r8.ignoreCase ? "i" : ""));
75
+ }
76
+ var pickedCompletion = /* @__PURE__ */ Annotation.define();
77
+ function insertCompletionText(r8, M, N, P) {
78
+ let { main: F } = r8.selection, I = N - F.from, L = P - F.from;
79
+ return {
80
+ ...r8.changeByRange((R) => {
81
+ if (R != F && N != P && r8.sliceDoc(R.from + I, R.from + L) != r8.sliceDoc(N, P)) return { range: R };
82
+ let z = r8.toText(M);
83
+ return {
84
+ changes: {
85
+ from: R.from + I,
86
+ to: P == F.from ? R.to : R.from + L,
87
+ insert: z
88
+ },
89
+ range: EditorSelection.cursor(R.from + I + z.length)
90
+ };
91
+ }),
92
+ scrollIntoView: true,
93
+ userEvent: "input.complete"
94
+ };
95
+ }
96
+ var SourceCache = /* @__PURE__ */ new WeakMap();
97
+ function asSource(r8) {
98
+ if (!Array.isArray(r8)) return r8;
99
+ let M = SourceCache.get(r8);
100
+ return M || SourceCache.set(r8, M = completeFromList(r8)), M;
101
+ }
102
+ var startCompletionEffect = /* @__PURE__ */ StateEffect.define(), closeCompletionEffect = /* @__PURE__ */ StateEffect.define(), FuzzyMatcher = class {
103
+ constructor(r8) {
104
+ this.pattern = r8, this.chars = [], this.folded = [], this.any = [], this.precise = [], this.byWord = [], this.score = 0, this.matched = [];
105
+ for (let M = 0; M < r8.length; ) {
106
+ let P = codePointAt(r8, M), F = codePointSize(P);
107
+ this.chars.push(P);
108
+ let I = r8.slice(M, M + F), L = I.toUpperCase();
109
+ this.folded.push(codePointAt(L == I ? I.toLowerCase() : L, 0)), M += F;
110
+ }
111
+ this.astral = r8.length != this.chars.length;
112
+ }
113
+ ret(r8, M) {
114
+ return this.score = r8, this.matched = M, this;
115
+ }
116
+ match(r8) {
117
+ if (this.pattern.length == 0) return this.ret(-100, []);
118
+ if (r8.length < this.pattern.length) return null;
119
+ let { chars: M, folded: P, any: F, precise: I, byWord: R } = this;
120
+ if (M.length == 1) {
121
+ let F2 = codePointAt(r8, 0), I2 = codePointSize(F2), L = I2 == r8.length ? 0 : -100;
122
+ if (F2 != M[0]) if (F2 == P[0]) L += -200;
123
+ else return null;
124
+ return this.ret(L, [0, I2]);
125
+ }
126
+ let z = r8.indexOf(this.pattern);
127
+ if (z == 0) return this.ret(r8.length == this.pattern.length ? 0 : -100, [0, this.pattern.length]);
128
+ let B = M.length, V = 0;
129
+ if (z < 0) {
130
+ for (let I2 = 0, L = Math.min(r8.length, 200); I2 < L && V < B; ) {
131
+ let L2 = codePointAt(r8, I2);
132
+ (L2 == M[V] || L2 == P[V]) && (F[V++] = I2), I2 += codePointSize(L2);
133
+ }
134
+ if (V < B) return null;
135
+ }
136
+ let H = 0, U = 0, W = false, G = 0, K = -1, J = -1, Y = /[a-z]/.test(r8), X = true;
137
+ for (let F2 = 0, V2 = Math.min(r8.length, 200), Z = 0; F2 < V2 && U < B; ) {
138
+ let V3 = codePointAt(r8, F2);
139
+ z < 0 && (H < B && V3 == M[H] && (I[H++] = F2), G < B && (V3 == M[G] || V3 == P[G] ? (G == 0 && (K = F2), J = F2 + 1, G++) : G = 0));
140
+ let Q, $ = V3 < 255 ? V3 >= 48 && V3 <= 57 || V3 >= 97 && V3 <= 122 ? 2 : V3 >= 65 && V3 <= 90 ? 1 : 0 : (Q = fromCodePoint(V3)) == Q.toLowerCase() ? Q == Q.toUpperCase() ? 0 : 2 : 1;
141
+ (!F2 || $ == 1 && Y || Z == 0 && $ != 0) && (M[U] == V3 || P[U] == V3 && (W = true) ? R[U++] = F2 : R.length && (X = false)), Z = $, F2 += codePointSize(V3);
142
+ }
143
+ return U == B && R[0] == 0 && X ? this.result(-100 + (W ? -200 : 0), R, r8) : G == B && K == 0 ? this.ret(-200 - r8.length + (J == r8.length ? 0 : -100), [0, J]) : z > -1 ? this.ret(-700 - r8.length, [z, z + this.pattern.length]) : G == B ? this.ret(-900 - r8.length, [K, J]) : U == B ? this.result(-100 + (W ? -200 : 0) + -700 + (X ? 0 : -1100), R, r8) : M.length == 2 ? null : this.result((F[0] ? -700 : 0) + -200 + -1100, F, r8);
144
+ }
145
+ result(r8, M, P) {
146
+ let F = [], I = 0;
147
+ for (let r9 of M) {
148
+ let M2 = r9 + (this.astral ? codePointSize(codePointAt(P, r9)) : 1);
149
+ I && F[I - 1] == r9 ? F[I - 1] = M2 : (F[I++] = r9, F[I++] = M2);
150
+ }
151
+ return this.ret(r8 - P.length, F);
152
+ }
153
+ }, StrictMatcher = class {
154
+ constructor(r8) {
155
+ this.pattern = r8, this.matched = [], this.score = 0, this.folded = r8.toLowerCase();
156
+ }
157
+ match(r8) {
158
+ if (r8.length < this.pattern.length) return null;
159
+ let M = r8.slice(0, this.pattern.length), N = M == this.pattern ? 0 : M.toLowerCase() == this.folded ? -200 : null;
160
+ return N == null ? null : (this.matched = [0, M.length], this.score = N + (r8.length == this.pattern.length ? 0 : -100), this);
161
+ }
162
+ }, completionConfig = /* @__PURE__ */ Facet.define({ combine(r8) {
163
+ return combineConfig(r8, {
164
+ activateOnTyping: true,
165
+ activateOnCompletion: () => false,
166
+ activateOnTypingDelay: 100,
167
+ selectOnOpen: true,
168
+ override: null,
169
+ closeOnBlur: true,
170
+ maxRenderedOptions: 100,
171
+ defaultKeymap: true,
172
+ tooltipClass: () => "",
173
+ optionClass: () => "",
174
+ aboveCursor: false,
175
+ icons: true,
176
+ addToOptions: [],
177
+ positionInfo: defaultPositionInfo,
178
+ filterStrict: false,
179
+ compareCompletions: (r9, M) => (r9.sortText || r9.label).localeCompare(M.sortText || M.label),
180
+ interactionDelay: 75,
181
+ updateSyncTime: 100
182
+ }, {
183
+ defaultKeymap: (r9, M) => r9 && M,
184
+ closeOnBlur: (r9, M) => r9 && M,
185
+ icons: (r9, M) => r9 && M,
186
+ tooltipClass: (r9, M) => (N) => joinClass(r9(N), M(N)),
187
+ optionClass: (r9, M) => (N) => joinClass(r9(N), M(N)),
188
+ addToOptions: (r9, M) => r9.concat(M),
189
+ filterStrict: (r9, M) => r9 || M
190
+ });
191
+ } });
192
+ function joinClass(r8, M) {
193
+ return r8 ? M ? r8 + " " + M : r8 : M;
194
+ }
195
+ function defaultPositionInfo(r8, M, N, P, F, I) {
196
+ let L = r8.textDirection == Direction.RTL, R = L, z = false, B = "top", V, H, U = M.left - F.left, W = F.right - M.right, K = P.right - P.left, q = P.bottom - P.top;
197
+ if (R && U < Math.min(K, W) ? R = false : !R && W < Math.min(K, U) && (R = true), K <= (R ? U : W)) V = Math.max(F.top, Math.min(N.top, F.bottom - q)) - M.top, H = Math.min(400, R ? U : W);
198
+ else {
199
+ z = true, H = Math.min(400, (L ? M.right : F.right - M.left) - 30);
200
+ let r9 = F.bottom - M.bottom;
201
+ r9 >= q || r9 > M.top ? V = N.bottom - M.top : (B = "bottom", V = M.bottom - N.top);
202
+ }
203
+ let J = (M.bottom - M.top) / I.offsetHeight, Y = (M.right - M.left) / I.offsetWidth;
204
+ return {
205
+ style: `${B}: ${V / J}px; max-width: ${H / Y}px`,
206
+ class: "cm-completionInfo-" + (z ? L ? "left-narrow" : "right-narrow" : R ? "left" : "right")
207
+ };
208
+ }
209
+ var setSelectedEffect = /* @__PURE__ */ StateEffect.define();
210
+ function optionContent(r8) {
211
+ let M = r8.addToOptions.slice();
212
+ return r8.icons && M.push({
213
+ render(r9) {
214
+ let M2 = document.createElement("div");
215
+ return M2.classList.add("cm-completionIcon"), r9.type && M2.classList.add(...r9.type.split(/\s+/g).map((r10) => "cm-completionIcon-" + r10)), M2.setAttribute("aria-hidden", "true"), M2;
216
+ },
217
+ position: 20
218
+ }), M.push({
219
+ render(r9, M2, N, P) {
220
+ let F = document.createElement("span");
221
+ F.className = "cm-completionLabel";
222
+ let I = r9.displayLabel || r9.label, L = 0;
223
+ for (let r10 = 0; r10 < P.length; ) {
224
+ let M3 = P[r10++], N2 = P[r10++];
225
+ M3 > L && F.appendChild(document.createTextNode(I.slice(L, M3)));
226
+ let R = F.appendChild(document.createElement("span"));
227
+ R.appendChild(document.createTextNode(I.slice(M3, N2))), R.className = "cm-completionMatchedText", L = N2;
228
+ }
229
+ return L < I.length && F.appendChild(document.createTextNode(I.slice(L))), F;
230
+ },
231
+ position: 50
232
+ }, {
233
+ render(r9) {
234
+ if (!r9.detail) return null;
235
+ let M2 = document.createElement("span");
236
+ return M2.className = "cm-completionDetail", M2.textContent = r9.detail, M2;
237
+ },
238
+ position: 80
239
+ }), M.sort((r9, M2) => r9.position - M2.position).map((r9) => r9.render);
240
+ }
241
+ function rangeAroundSelected(r8, M, N) {
242
+ if (r8 <= N) return {
243
+ from: 0,
244
+ to: r8
245
+ };
246
+ if (M < 0 && (M = 0), M <= r8 >> 1) {
247
+ let r9 = Math.floor(M / N);
248
+ return {
249
+ from: r9 * N,
250
+ to: (r9 + 1) * N
251
+ };
252
+ }
253
+ let P = Math.floor((r8 - M) / N);
254
+ return {
255
+ from: r8 - (P + 1) * N,
256
+ to: r8 - P * N
257
+ };
258
+ }
259
+ var CompletionTooltip = class {
260
+ constructor(r8, M, N) {
261
+ this.view = r8, this.stateField = M, this.applyCompletion = N, this.info = null, this.infoDestroy = null, this.placeInfoReq = {
262
+ read: () => this.measureInfo(),
263
+ write: (r9) => this.placeInfo(r9),
264
+ key: this
265
+ }, this.space = null, this.currentClass = "";
266
+ let P = r8.state.field(M), { options: F, selected: I } = P.open, L = r8.state.facet(completionConfig);
267
+ this.optionContent = optionContent(L), this.optionClass = L.optionClass, this.tooltipClass = L.tooltipClass, this.range = rangeAroundSelected(F.length, I, L.maxRenderedOptions), this.dom = document.createElement("div"), this.dom.className = "cm-tooltip-autocomplete", this.updateTooltipClass(r8.state), this.dom.addEventListener("mousedown", (N2) => {
268
+ let { options: P2 } = r8.state.field(M).open;
269
+ for (let M2 = N2.target, F2; M2 && M2 != this.dom; M2 = M2.parentNode) if (M2.nodeName == "LI" && (F2 = /-(\d+)$/.exec(M2.id)) && +F2[1] < P2.length) {
270
+ this.applyCompletion(r8, P2[+F2[1]]), N2.preventDefault();
271
+ return;
272
+ }
273
+ if (N2.target == this.list) {
274
+ let M2 = this.list.classList.contains("cm-completionListIncompleteTop") && N2.clientY < this.list.firstChild.getBoundingClientRect().top ? this.range.from - 1 : this.list.classList.contains("cm-completionListIncompleteBottom") && N2.clientY > this.list.lastChild.getBoundingClientRect().bottom ? this.range.to : null;
275
+ M2 != null && (r8.dispatch({ effects: setSelectedEffect.of(M2) }), N2.preventDefault());
276
+ }
277
+ }), this.dom.addEventListener("focusout", (M2) => {
278
+ let N2 = r8.state.field(this.stateField, false);
279
+ N2 && N2.tooltip && r8.state.facet(completionConfig).closeOnBlur && M2.relatedTarget != r8.contentDOM && r8.dispatch({ effects: closeCompletionEffect.of(null) });
280
+ }), this.showOptions(F, P.id);
281
+ }
282
+ mount() {
283
+ this.updateSel();
284
+ }
285
+ showOptions(r8, M) {
286
+ this.list && this.list.remove(), this.list = this.dom.appendChild(this.createListBox(r8, M, this.range)), this.list.addEventListener("scroll", () => {
287
+ this.info && this.view.requestMeasure(this.placeInfoReq);
288
+ });
289
+ }
290
+ update(r8) {
291
+ var _a;
292
+ let M = r8.state.field(this.stateField), N = r8.startState.field(this.stateField);
293
+ if (this.updateTooltipClass(r8.state), M != N) {
294
+ let { options: P, selected: F, disabled: I } = M.open;
295
+ (!N.open || N.open.options != P) && (this.range = rangeAroundSelected(P.length, F, r8.state.facet(completionConfig).maxRenderedOptions), this.showOptions(P, M.id)), this.updateSel(), I != ((_a = N.open) == null ? void 0 : _a.disabled) && this.dom.classList.toggle("cm-tooltip-autocomplete-disabled", !!I);
296
+ }
297
+ }
298
+ updateTooltipClass(r8) {
299
+ let M = this.tooltipClass(r8);
300
+ if (M != this.currentClass) {
301
+ for (let r9 of this.currentClass.split(" ")) r9 && this.dom.classList.remove(r9);
302
+ for (let r9 of M.split(" ")) r9 && this.dom.classList.add(r9);
303
+ this.currentClass = M;
304
+ }
305
+ }
306
+ positioned(r8) {
307
+ this.space = r8, this.info && this.view.requestMeasure(this.placeInfoReq);
308
+ }
309
+ updateSel() {
310
+ let r8 = this.view.state.field(this.stateField), M = r8.open;
311
+ (M.selected > -1 && M.selected < this.range.from || M.selected >= this.range.to) && (this.range = rangeAroundSelected(M.options.length, M.selected, this.view.state.facet(completionConfig).maxRenderedOptions), this.showOptions(M.options, r8.id));
312
+ let N = this.updateSelectedOption(M.selected);
313
+ if (N) {
314
+ this.destroyInfo();
315
+ let { completion: P } = M.options[M.selected], { info: F } = P;
316
+ if (!F) return;
317
+ let I = typeof F == "string" ? document.createTextNode(F) : F(P);
318
+ if (!I) return;
319
+ "then" in I ? I.then((M2) => {
320
+ M2 && this.view.state.field(this.stateField, false) == r8 && this.addInfoPane(M2, P);
321
+ }).catch((r9) => logException(this.view.state, r9, "completion info")) : (this.addInfoPane(I, P), N.setAttribute("aria-describedby", this.info.id));
322
+ }
323
+ }
324
+ addInfoPane(r8, M) {
325
+ this.destroyInfo();
326
+ let N = this.info = document.createElement("div");
327
+ if (N.className = "cm-tooltip cm-completionInfo", N.id = "cm-completionInfo-" + Math.floor(Math.random() * 65535).toString(16), r8.nodeType != null) N.appendChild(r8), this.infoDestroy = null;
328
+ else {
329
+ let { dom: M2, destroy: P } = r8;
330
+ N.appendChild(M2), this.infoDestroy = P || null;
331
+ }
332
+ this.dom.appendChild(N), this.view.requestMeasure(this.placeInfoReq);
333
+ }
334
+ updateSelectedOption(r8) {
335
+ let M = null;
336
+ for (let N = this.list.firstChild, P = this.range.from; N; N = N.nextSibling, P++) N.nodeName != "LI" || !N.id ? P-- : P == r8 ? N.hasAttribute("aria-selected") || (N.setAttribute("aria-selected", "true"), M = N) : N.hasAttribute("aria-selected") && (N.removeAttribute("aria-selected"), N.removeAttribute("aria-describedby"));
337
+ return M && scrollIntoView(this.list, M), M;
338
+ }
339
+ measureInfo() {
340
+ let r8 = this.dom.querySelector("[aria-selected]");
341
+ if (!r8 || !this.info) return null;
342
+ let M = this.dom.getBoundingClientRect(), N = this.info.getBoundingClientRect(), P = r8.getBoundingClientRect(), F = this.space;
343
+ if (!F) {
344
+ let r9 = this.dom.ownerDocument.documentElement;
345
+ F = {
346
+ left: 0,
347
+ top: 0,
348
+ right: r9.clientWidth,
349
+ bottom: r9.clientHeight
350
+ };
351
+ }
352
+ return P.top > Math.min(F.bottom, M.bottom) - 10 || P.bottom < Math.max(F.top, M.top) + 10 ? null : this.view.state.facet(completionConfig).positionInfo(this.view, M, P, N, F, this.dom);
353
+ }
354
+ placeInfo(r8) {
355
+ this.info && (r8 ? (r8.style && (this.info.style.cssText = r8.style), this.info.className = "cm-tooltip cm-completionInfo " + (r8.class || "")) : this.info.style.cssText = "top: -1e6px");
356
+ }
357
+ createListBox(r8, M, N) {
358
+ let P = document.createElement("ul");
359
+ P.id = M, P.setAttribute("role", "listbox"), P.setAttribute("aria-expanded", "true"), P.setAttribute("aria-label", this.view.state.phrase("Completions")), P.addEventListener("mousedown", (r9) => {
360
+ r9.target == P && r9.preventDefault();
361
+ });
362
+ let F = null;
363
+ for (let I = N.from; I < N.to; I++) {
364
+ let { completion: L, match: R } = r8[I], { section: z } = L;
365
+ if (z) {
366
+ let r9 = typeof z == "string" ? z : z.name;
367
+ if (r9 != F && (I > N.from || N.from == 0)) if (F = r9, typeof z != "string" && z.header) P.appendChild(z.header(z));
368
+ else {
369
+ let M2 = P.appendChild(document.createElement("completion-section"));
370
+ M2.textContent = r9;
371
+ }
372
+ }
373
+ let B = P.appendChild(document.createElement("li"));
374
+ B.id = M + "-" + I, B.setAttribute("role", "option");
375
+ let V = this.optionClass(L);
376
+ V && (B.className = V);
377
+ for (let r9 of this.optionContent) {
378
+ let M2 = r9(L, this.view.state, this.view, R);
379
+ M2 && B.appendChild(M2);
380
+ }
381
+ }
382
+ return N.from && P.classList.add("cm-completionListIncompleteTop"), N.to < r8.length && P.classList.add("cm-completionListIncompleteBottom"), P;
383
+ }
384
+ destroyInfo() {
385
+ this.info && (this.info = (this.infoDestroy && this.infoDestroy(), this.info.remove(), null));
386
+ }
387
+ destroy() {
388
+ this.destroyInfo();
389
+ }
390
+ };
391
+ function completionTooltip(r8, M) {
392
+ return (N) => new CompletionTooltip(N, r8, M);
393
+ }
394
+ function scrollIntoView(r8, M) {
395
+ let N = r8.getBoundingClientRect(), P = M.getBoundingClientRect(), F = N.height / r8.offsetHeight;
396
+ P.top < N.top ? r8.scrollTop -= (N.top - P.top) / F : P.bottom > N.bottom && (r8.scrollTop += (P.bottom - N.bottom) / F);
397
+ }
398
+ function score(r8) {
399
+ return (r8.boost || 0) * 100 + (r8.apply ? 10 : 0) + (r8.info ? 5 : 0) + (r8.type ? 1 : 0);
400
+ }
401
+ function sortOptions(r8, M) {
402
+ let N = [], P = null, F = null, I = (r9) => {
403
+ N.push(r9);
404
+ let { section: M2 } = r9.completion;
405
+ if (M2) {
406
+ P || (P = []);
407
+ let r10 = typeof M2 == "string" ? M2 : M2.name;
408
+ P.some((M3) => M3.name == r10) || P.push(typeof M2 == "string" ? { name: r10 } : M2);
409
+ }
410
+ }, L = M.facet(completionConfig);
411
+ for (let P2 of r8) if (P2.hasResult()) {
412
+ let r9 = P2.result.getMatch;
413
+ if (P2.result.filter === false) for (let M2 of P2.result.options) I(new Option(M2, P2.source, r9 ? r9(M2) : [], 1e9 - N.length));
414
+ else {
415
+ let N2 = M.sliceDoc(P2.from, P2.to), R2, z2 = L.filterStrict ? new StrictMatcher(N2) : new FuzzyMatcher(N2);
416
+ for (let M2 of P2.result.options) if (R2 = z2.match(M2.label)) {
417
+ let N3 = M2.displayLabel ? r9 ? r9(M2, R2.matched) : [] : R2.matched, L2 = R2.score + (M2.boost || 0);
418
+ if (I(new Option(M2, P2.source, N3, L2)), typeof M2.section == "object" && M2.section.rank === "dynamic") {
419
+ let { name: r10 } = M2.section;
420
+ F || (F = /* @__PURE__ */ Object.create(null)), F[r10] = Math.max(L2, F[r10] || -1e9);
421
+ }
422
+ }
423
+ }
424
+ }
425
+ if (P) {
426
+ let r9 = /* @__PURE__ */ Object.create(null), M2 = 0, I2 = (r10, M3) => (r10.rank === "dynamic" && M3.rank === "dynamic" ? F[M3.name] - F[r10.name] : 0) || (typeof r10.rank == "number" ? r10.rank : 1e9) - (typeof M3.rank == "number" ? M3.rank : 1e9) || (r10.name < M3.name ? -1 : 1);
427
+ for (let N2 of P.sort(I2)) M2 -= 1e5, r9[N2.name] = M2;
428
+ for (let M3 of N) {
429
+ let { section: N2 } = M3.completion;
430
+ N2 && (M3.score += r9[typeof N2 == "string" ? N2 : N2.name]);
431
+ }
432
+ }
433
+ let R = [], z = null, B = L.compareCompletions;
434
+ for (let r9 of N.sort((r10, M2) => M2.score - r10.score || B(r10.completion, M2.completion))) {
435
+ let M2 = r9.completion;
436
+ !z || z.label != M2.label || z.detail != M2.detail || z.type != null && M2.type != null && z.type != M2.type || z.apply != M2.apply || z.boost != M2.boost ? R.push(r9) : score(r9.completion) > score(z) && (R[R.length - 1] = r9), z = r9.completion;
437
+ }
438
+ return R;
439
+ }
440
+ var CompletionDialog = class r {
441
+ constructor(r8, M, N, P, F, I) {
442
+ this.options = r8, this.attrs = M, this.tooltip = N, this.timestamp = P, this.selected = F, this.disabled = I;
443
+ }
444
+ setSelected(M, N) {
445
+ return M == this.selected || M >= this.options.length ? this : new r(this.options, makeAttrs(N, M), this.tooltip, this.timestamp, M, this.disabled);
446
+ }
447
+ static build(M, N, P, F, I, L) {
448
+ if (F && !L && M.some((r8) => r8.isPending)) return F.setDisabled();
449
+ let R = sortOptions(M, N);
450
+ if (!R.length) return F && M.some((r8) => r8.isPending) ? F.setDisabled() : null;
451
+ let z = N.facet(completionConfig).selectOnOpen ? 0 : -1;
452
+ if (F && F.selected != z && F.selected != -1) {
453
+ let r8 = F.options[F.selected].completion;
454
+ for (let M2 = 0; M2 < R.length; M2++) if (R[M2].completion == r8) {
455
+ z = M2;
456
+ break;
457
+ }
458
+ }
459
+ return new r(R, makeAttrs(P, z), {
460
+ pos: M.reduce((r8, M2) => M2.hasResult() ? Math.min(r8, M2.from) : r8, 1e8),
461
+ create: createTooltip,
462
+ above: I.aboveCursor
463
+ }, F ? F.timestamp : Date.now(), z, false);
464
+ }
465
+ map(M) {
466
+ return new r(this.options, this.attrs, {
467
+ ...this.tooltip,
468
+ pos: M.mapPos(this.tooltip.pos)
469
+ }, this.timestamp, this.selected, this.disabled);
470
+ }
471
+ setDisabled() {
472
+ return new r(this.options, this.attrs, this.tooltip, this.timestamp, this.selected, true);
473
+ }
474
+ }, CompletionState = class r2 {
475
+ constructor(r8, M, N) {
476
+ this.active = r8, this.id = M, this.open = N;
477
+ }
478
+ static start() {
479
+ return new r2(none, "cm-ac-" + Math.floor(Math.random() * 2e6).toString(36), null);
480
+ }
481
+ update(M) {
482
+ let { state: N } = M, P = N.facet(completionConfig), F = (P.override || N.languageDataAt("autocomplete", cur(N)).map(asSource)).map((r8) => (this.active.find((M2) => M2.source == r8) || new ActiveSource(r8, this.active.some((r9) => r9.state != 0) ? 1 : 0)).update(M, P));
483
+ F.length == this.active.length && F.every((r8, M2) => r8 == this.active[M2]) && (F = this.active);
484
+ let I = this.open, L = M.effects.some((r8) => r8.is(setActiveEffect));
485
+ I && M.docChanged && (I = I.map(M.changes)), M.selection || F.some((r8) => r8.hasResult() && M.changes.touchesRange(r8.from, r8.to)) || !sameResults(F, this.active) || L ? I = CompletionDialog.build(F, N, this.id, I, P, L) : I && I.disabled && !F.some((r8) => r8.isPending) && (I = null), !I && F.every((r8) => !r8.isPending) && F.some((r8) => r8.hasResult()) && (F = F.map((r8) => r8.hasResult() ? new ActiveSource(r8.source, 0) : r8));
486
+ for (let r8 of M.effects) r8.is(setSelectedEffect) && (I && (I = I.setSelected(r8.value, this.id)));
487
+ return F == this.active && I == this.open ? this : new r2(F, this.id, I);
488
+ }
489
+ get tooltip() {
490
+ return this.open ? this.open.tooltip : null;
491
+ }
492
+ get attrs() {
493
+ return this.open ? this.open.attrs : this.active.length ? baseAttrs : noAttrs;
494
+ }
495
+ };
496
+ function sameResults(r8, M) {
497
+ if (r8 == M) return true;
498
+ for (let N = 0, P = 0; ; ) {
499
+ for (; N < r8.length && !r8[N].hasResult(); ) N++;
500
+ for (; P < M.length && !M[P].hasResult(); ) P++;
501
+ let F = N == r8.length, I = P == M.length;
502
+ if (F || I) return F == I;
503
+ if (r8[N++].result != M[P++].result) return false;
504
+ }
505
+ }
506
+ var baseAttrs = { "aria-autocomplete": "list" }, noAttrs = {};
507
+ function makeAttrs(r8, M) {
508
+ let N = {
509
+ "aria-autocomplete": "list",
510
+ "aria-haspopup": "listbox",
511
+ "aria-controls": r8
512
+ };
513
+ return M > -1 && (N["aria-activedescendant"] = r8 + "-" + M), N;
514
+ }
515
+ var none = [];
516
+ function getUpdateType(r8, M) {
517
+ if (r8.isUserEvent("input.complete")) {
518
+ let N2 = r8.annotation(pickedCompletion);
519
+ if (N2 && M.activateOnCompletion(N2)) return 12;
520
+ }
521
+ let N = r8.isUserEvent("input.type");
522
+ return N && M.activateOnTyping ? 5 : N ? 1 : r8.isUserEvent("delete.backward") ? 2 : r8.selection ? 8 : r8.docChanged ? 16 : 0;
523
+ }
524
+ var ActiveSource = class r3 {
525
+ constructor(r8, M, N = false) {
526
+ this.source = r8, this.state = M, this.explicit = N;
527
+ }
528
+ hasResult() {
529
+ return false;
530
+ }
531
+ get isPending() {
532
+ return this.state == 1;
533
+ }
534
+ update(M, N) {
535
+ let P = getUpdateType(M, N), F = this;
536
+ (P & 8 || P & 16 && this.touches(M)) && (F = new r3(F.source, 0)), P & 4 && F.state == 0 && (F = new r3(this.source, 1)), F = F.updateFor(M, P);
537
+ for (let N2 of M.effects) if (N2.is(startCompletionEffect)) F = new r3(F.source, 1, N2.value);
538
+ else if (N2.is(closeCompletionEffect)) F = new r3(F.source, 0);
539
+ else if (N2.is(setActiveEffect)) for (let r8 of N2.value) r8.source == F.source && (F = r8);
540
+ return F;
541
+ }
542
+ updateFor(r8, M) {
543
+ return this.map(r8.changes);
544
+ }
545
+ map(r8) {
546
+ return this;
547
+ }
548
+ touches(r8) {
549
+ return r8.changes.touchesRange(cur(r8.state));
550
+ }
551
+ }, ActiveResult = class r4 extends ActiveSource {
552
+ constructor(r8, M, N, P, F, I) {
553
+ super(r8, 3, M), this.limit = N, this.result = P, this.from = F, this.to = I;
554
+ }
555
+ hasResult() {
556
+ return true;
557
+ }
558
+ updateFor(M, N) {
559
+ if (!(N & 3)) return this.map(M.changes);
560
+ let P = this.result;
561
+ P.map && !M.changes.empty && (P = P.map(P, M.changes));
562
+ let F = M.changes.mapPos(this.from), I = M.changes.mapPos(this.to, 1), L = cur(M.state);
563
+ if (L > I || !P || N & 2 && (cur(M.startState) == this.from || L < this.limit)) return new ActiveSource(this.source, N & 4 ? 1 : 0);
564
+ let R = M.changes.mapPos(this.limit);
565
+ return checkValid(P.validFor, M.state, F, I) ? new r4(this.source, this.explicit, R, P, F, I) : P.update && (P = P.update(P, F, I, new CompletionContext(M.state, L, false))) ? new r4(this.source, this.explicit, R, P, P.from, P.to ?? cur(M.state)) : new ActiveSource(this.source, 1, this.explicit);
566
+ }
567
+ map(M) {
568
+ return M.empty ? this : (this.result.map ? this.result.map(this.result, M) : this.result) ? new r4(this.source, this.explicit, M.mapPos(this.limit), this.result, M.mapPos(this.from), M.mapPos(this.to, 1)) : new ActiveSource(this.source, 0);
569
+ }
570
+ touches(r8) {
571
+ return r8.changes.touchesRange(this.from, this.to);
572
+ }
573
+ };
574
+ function checkValid(r8, M, N, P) {
575
+ if (!r8) return false;
576
+ let F = M.sliceDoc(N, P);
577
+ return typeof r8 == "function" ? r8(F, N, P, M) : ensureAnchor(r8, true).test(F);
578
+ }
579
+ var setActiveEffect = /* @__PURE__ */ StateEffect.define({ map(r8, M) {
580
+ return r8.map((r9) => r9.map(M));
581
+ } }), completionState = /* @__PURE__ */ StateField.define({
582
+ create() {
583
+ return CompletionState.start();
584
+ },
585
+ update(r8, M) {
586
+ return r8.update(M);
587
+ },
588
+ provide: (M) => [showTooltip.from(M, (r8) => r8.tooltip), EditorView.contentAttributes.from(M, (r8) => r8.attrs)]
589
+ });
590
+ function applyCompletion(r8, M) {
591
+ let N = M.completion.apply || M.completion.label, P = r8.state.field(completionState).active.find((r9) => r9.source == M.source);
592
+ return P instanceof ActiveResult ? (typeof N == "string" ? r8.dispatch({
593
+ ...insertCompletionText(r8.state, N, P.from, P.to),
594
+ annotations: pickedCompletion.of(M.completion)
595
+ }) : N(r8, M.completion, P.from, P.to), true) : false;
596
+ }
597
+ var createTooltip = /* @__PURE__ */ completionTooltip(completionState, applyCompletion);
598
+ function moveCompletionSelection(r8, M = "option") {
599
+ return (N) => {
600
+ let P = N.state.field(completionState, false);
601
+ if (!P || !P.open || P.open.disabled || Date.now() - P.open.timestamp < N.state.facet(completionConfig).interactionDelay) return false;
602
+ let F = 1, I;
603
+ M == "page" && (I = getTooltip(N, P.open.tooltip)) && (F = Math.max(2, Math.floor(I.dom.offsetHeight / I.dom.querySelector("li").offsetHeight) - 1));
604
+ let { length: L } = P.open.options, R = P.open.selected > -1 ? P.open.selected + F * (r8 ? 1 : -1) : r8 ? 0 : L - 1;
605
+ return R < 0 ? R = M == "page" ? 0 : L - 1 : R >= L && (R = M == "page" ? L - 1 : 0), N.dispatch({ effects: setSelectedEffect.of(R) }), true;
606
+ };
607
+ }
608
+ var acceptCompletion = (r8) => {
609
+ let M = r8.state.field(completionState, false);
610
+ return r8.state.readOnly || !M || !M.open || M.open.selected < 0 || M.open.disabled || Date.now() - M.open.timestamp < r8.state.facet(completionConfig).interactionDelay ? false : applyCompletion(r8, M.open.options[M.open.selected]);
611
+ }, startCompletion = (r8) => r8.state.field(completionState, false) ? (r8.dispatch({ effects: startCompletionEffect.of(true) }), true) : false, closeCompletion = (r8) => {
612
+ let M = r8.state.field(completionState, false);
613
+ return !M || !M.active.some((r9) => r9.state != 0) ? false : (r8.dispatch({ effects: closeCompletionEffect.of(null) }), true);
614
+ }, RunningQuery = class {
615
+ constructor(r8, M) {
616
+ this.active = r8, this.context = M, this.time = Date.now(), this.updates = [], this.done = void 0;
617
+ }
618
+ }, MaxUpdateCount = 50, MinAbortTime = 1e3, completionPlugin = /* @__PURE__ */ ViewPlugin.fromClass(class {
619
+ constructor(r8) {
620
+ this.view = r8, this.debounceUpdate = -1, this.running = [], this.debounceAccept = -1, this.pendingStart = false, this.composing = 0;
621
+ for (let M of r8.state.field(completionState).active) M.isPending && this.startQuery(M);
622
+ }
623
+ update(r8) {
624
+ let M = r8.state.field(completionState), N = r8.state.facet(completionConfig);
625
+ if (!r8.selectionSet && !r8.docChanged && r8.startState.field(completionState) == M) return;
626
+ let P = r8.transactions.some((r9) => {
627
+ let M2 = getUpdateType(r9, N);
628
+ return M2 & 8 || (r9.selection || r9.docChanged) && !(M2 & 3);
629
+ });
630
+ for (let M2 = 0; M2 < this.running.length; M2++) {
631
+ let N2 = this.running[M2];
632
+ if (P || N2.context.abortOnDocChange && r8.docChanged || N2.updates.length + r8.transactions.length > MaxUpdateCount && Date.now() - N2.time > MinAbortTime) {
633
+ for (let r9 of N2.context.abortListeners) try {
634
+ r9();
635
+ } catch (r10) {
636
+ logException(this.view.state, r10);
637
+ }
638
+ N2.context.abortListeners = null, this.running.splice(M2--, 1);
639
+ } else N2.updates.push(...r8.transactions);
640
+ }
641
+ this.debounceUpdate > -1 && clearTimeout(this.debounceUpdate), r8.transactions.some((r9) => r9.effects.some((r10) => r10.is(startCompletionEffect))) && (this.pendingStart = true);
642
+ let F = this.pendingStart ? 50 : N.activateOnTypingDelay;
643
+ if (this.debounceUpdate = M.active.some((r9) => r9.isPending && !this.running.some((M2) => M2.active.source == r9.source)) ? setTimeout(() => this.startUpdate(), F) : -1, this.composing != 0) for (let M2 of r8.transactions) M2.isUserEvent("input.type") ? this.composing = 2 : this.composing == 2 && M2.selection && (this.composing = 3);
644
+ }
645
+ startUpdate() {
646
+ this.debounceUpdate = -1, this.pendingStart = false;
647
+ let { state: r8 } = this.view, M = r8.field(completionState);
648
+ for (let r9 of M.active) r9.isPending && !this.running.some((M2) => M2.active.source == r9.source) && this.startQuery(r9);
649
+ this.running.length && M.open && M.open.disabled && (this.debounceAccept = setTimeout(() => this.accept(), this.view.state.facet(completionConfig).updateSyncTime));
650
+ }
651
+ startQuery(r8) {
652
+ let { state: M } = this.view, N = new CompletionContext(M, cur(M), r8.explicit, this.view), P = new RunningQuery(r8, N);
653
+ this.running.push(P), Promise.resolve(r8.source(N)).then((r9) => {
654
+ P.context.aborted || (P.done = r9 || null, this.scheduleAccept());
655
+ }, (r9) => {
656
+ this.view.dispatch({ effects: closeCompletionEffect.of(null) }), logException(this.view.state, r9);
657
+ });
658
+ }
659
+ scheduleAccept() {
660
+ this.running.every((r8) => r8.done !== void 0) ? this.accept() : this.debounceAccept < 0 && (this.debounceAccept = setTimeout(() => this.accept(), this.view.state.facet(completionConfig).updateSyncTime));
661
+ }
662
+ accept() {
663
+ this.debounceAccept > -1 && clearTimeout(this.debounceAccept), this.debounceAccept = -1;
664
+ let r8 = [], M = this.view.state.facet(completionConfig), N = this.view.state.field(completionState);
665
+ for (let P = 0; P < this.running.length; P++) {
666
+ let F = this.running[P];
667
+ if (F.done === void 0) continue;
668
+ if (this.running.splice(P--, 1), F.done) {
669
+ let N2 = cur(F.updates.length ? F.updates[0].startState : this.view.state), P2 = Math.min(N2, F.done.from + (F.active.explicit ? 0 : 1)), I2 = new ActiveResult(F.active.source, F.active.explicit, P2, F.done, F.done.from, F.done.to ?? N2);
670
+ for (let r9 of F.updates) I2 = I2.update(r9, M);
671
+ if (I2.hasResult()) {
672
+ r8.push(I2);
673
+ continue;
674
+ }
675
+ }
676
+ let I = N.active.find((r9) => r9.source == F.active.source);
677
+ if (I && I.isPending) if (F.done == null) {
678
+ let N2 = new ActiveSource(F.active.source, 0);
679
+ for (let r9 of F.updates) N2 = N2.update(r9, M);
680
+ N2.isPending || r8.push(N2);
681
+ } else this.startQuery(I);
682
+ }
683
+ (r8.length || N.open && N.open.disabled) && this.view.dispatch({ effects: setActiveEffect.of(r8) });
684
+ }
685
+ }, { eventHandlers: {
686
+ blur(r8) {
687
+ let M = this.view.state.field(completionState, false);
688
+ if (M && M.tooltip && this.view.state.facet(completionConfig).closeOnBlur) {
689
+ let N = M.open && getTooltip(this.view, M.open.tooltip);
690
+ (!N || !N.dom.contains(r8.relatedTarget)) && setTimeout(() => this.view.dispatch({ effects: closeCompletionEffect.of(null) }), 10);
691
+ }
692
+ },
693
+ compositionstart() {
694
+ this.composing = 1;
695
+ },
696
+ compositionend() {
697
+ this.composing == 3 && setTimeout(() => this.view.dispatch({ effects: startCompletionEffect.of(false) }), 20), this.composing = 0;
698
+ }
699
+ } }), windows = typeof navigator == "object" && /* @__PURE__ */ /Win/.test(navigator.platform), commitCharacters = /* @__PURE__ */ Prec.highest(/* @__PURE__ */ EditorView.domEventHandlers({ keydown(r8, M) {
700
+ let N = M.state.field(completionState, false);
701
+ if (!N || !N.open || N.open.disabled || N.open.selected < 0 || r8.key.length > 1 || r8.ctrlKey && !(windows && r8.altKey) || r8.metaKey) return false;
702
+ let P = N.open.options[N.open.selected], F = N.active.find((r9) => r9.source == P.source), I = P.completion.commitCharacters || F.result.commitCharacters;
703
+ return I && I.indexOf(r8.key) > -1 && applyCompletion(M, P), false;
704
+ } })), baseTheme = /* @__PURE__ */ EditorView.baseTheme({
705
+ ".cm-tooltip.cm-tooltip-autocomplete": { "& > ul": {
706
+ fontFamily: "monospace",
707
+ whiteSpace: "nowrap",
708
+ overflow: "hidden auto",
709
+ maxWidth_fallback: "700px",
710
+ maxWidth: "min(700px, 95vw)",
711
+ minWidth: "250px",
712
+ maxHeight: "10em",
713
+ height: "100%",
714
+ listStyle: "none",
715
+ margin: 0,
716
+ padding: 0,
717
+ "& > li, & > completion-section": {
718
+ padding: "1px 3px",
719
+ lineHeight: 1.2
720
+ },
721
+ "& > li": {
722
+ overflowX: "hidden",
723
+ textOverflow: "ellipsis",
724
+ cursor: "pointer"
725
+ },
726
+ "& > completion-section": {
727
+ display: "list-item",
728
+ borderBottom: "1px solid silver",
729
+ paddingLeft: "0.5em",
730
+ opacity: 0.7
731
+ }
732
+ } },
733
+ "&light .cm-tooltip-autocomplete ul li[aria-selected]": {
734
+ background: "#17c",
735
+ color: "white"
736
+ },
737
+ "&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]": { background: "#777" },
738
+ "&dark .cm-tooltip-autocomplete ul li[aria-selected]": {
739
+ background: "#347",
740
+ color: "white"
741
+ },
742
+ "&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]": { background: "#444" },
743
+ ".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after": {
744
+ content: '"\xB7\xB7\xB7"',
745
+ opacity: 0.5,
746
+ display: "block",
747
+ textAlign: "center"
748
+ },
749
+ ".cm-tooltip.cm-completionInfo": {
750
+ position: "absolute",
751
+ padding: "3px 9px",
752
+ width: "max-content",
753
+ maxWidth: "400px",
754
+ boxSizing: "border-box",
755
+ whiteSpace: "pre-line"
756
+ },
757
+ ".cm-completionInfo.cm-completionInfo-left": { right: "100%" },
758
+ ".cm-completionInfo.cm-completionInfo-right": { left: "100%" },
759
+ ".cm-completionInfo.cm-completionInfo-left-narrow": { right: "30px" },
760
+ ".cm-completionInfo.cm-completionInfo-right-narrow": { left: "30px" },
761
+ "&light .cm-snippetField": { backgroundColor: "#00000022" },
762
+ "&dark .cm-snippetField": { backgroundColor: "#ffffff22" },
763
+ ".cm-snippetFieldPosition": {
764
+ verticalAlign: "text-top",
765
+ width: 0,
766
+ height: "1.15em",
767
+ display: "inline-block",
768
+ margin: "0 -0.7px -.7em",
769
+ borderLeft: "1.4px dotted #888"
770
+ },
771
+ ".cm-completionMatchedText": { textDecoration: "underline" },
772
+ ".cm-completionDetail": {
773
+ marginLeft: "0.5em",
774
+ fontStyle: "italic"
775
+ },
776
+ ".cm-completionIcon": {
777
+ fontSize: "90%",
778
+ width: ".8em",
779
+ display: "inline-block",
780
+ textAlign: "center",
781
+ paddingRight: ".6em",
782
+ opacity: "0.6",
783
+ boxSizing: "content-box"
784
+ },
785
+ ".cm-completionIcon-function, .cm-completionIcon-method": { "&:after": { content: "'\u0192'" } },
786
+ ".cm-completionIcon-class": { "&:after": { content: "'\u25CB'" } },
787
+ ".cm-completionIcon-interface": { "&:after": { content: "'\u25CC'" } },
788
+ ".cm-completionIcon-variable": { "&:after": { content: "'\u{1D465}'" } },
789
+ ".cm-completionIcon-constant": { "&:after": { content: "'\u{1D436}'" } },
790
+ ".cm-completionIcon-type": { "&:after": { content: "'\u{1D461}'" } },
791
+ ".cm-completionIcon-enum": { "&:after": { content: "'\u222A'" } },
792
+ ".cm-completionIcon-property": { "&:after": { content: "'\u25A1'" } },
793
+ ".cm-completionIcon-keyword": { "&:after": { content: "'\u{1F511}\uFE0E'" } },
794
+ ".cm-completionIcon-namespace": { "&:after": { content: "'\u25A2'" } },
795
+ ".cm-completionIcon-text": { "&:after": {
796
+ content: "'abc'",
797
+ fontSize: "50%",
798
+ verticalAlign: "middle"
799
+ } }
800
+ }), FieldPos = class {
801
+ constructor(r8, M, N, P) {
802
+ this.field = r8, this.line = M, this.from = N, this.to = P;
803
+ }
804
+ }, FieldRange = class r5 {
805
+ constructor(r8, M, N) {
806
+ this.field = r8, this.from = M, this.to = N;
807
+ }
808
+ map(M) {
809
+ let N = M.mapPos(this.from, -1, MapMode.TrackDel), P = M.mapPos(this.to, 1, MapMode.TrackDel);
810
+ return N == null || P == null ? null : new r5(this.field, N, P);
811
+ }
812
+ }, Snippet = class r6 {
813
+ constructor(r8, M) {
814
+ this.lines = r8, this.fieldPositions = M;
815
+ }
816
+ instantiate(r8, M) {
817
+ let N = [], P = [M], F = r8.doc.lineAt(M), I = /^\s*/.exec(F.text)[0];
818
+ for (let F2 of this.lines) {
819
+ if (N.length) {
820
+ let N2 = I, L = /^\t*/.exec(F2)[0].length;
821
+ for (let M2 = 0; M2 < L; M2++) N2 += r8.facet(indentUnit);
822
+ P.push(M + N2.length - L), F2 = N2 + F2.slice(L);
823
+ }
824
+ N.push(F2), M += F2.length + 1;
825
+ }
826
+ return {
827
+ text: N,
828
+ ranges: this.fieldPositions.map((r9) => new FieldRange(r9.field, P[r9.line] + r9.from, P[r9.line] + r9.to))
829
+ };
830
+ }
831
+ static parse(M) {
832
+ let N = [], P = [], F = [], I;
833
+ for (let r8 of M.split(/\r\n?|\n/)) {
834
+ for (; I = /[#$]\{(?:(\d+)(?::([^{}]*))?|((?:\\[{}]|[^{}])*))\}/.exec(r8); ) {
835
+ let M2 = I[1] ? +I[1] : null, L = I[2] || I[3] || "", R = -1, z = L.replace(/\\[{}]/g, (r9) => r9[1]);
836
+ for (let r9 = 0; r9 < N.length; r9++) (M2 == null ? z && N[r9].name == z : N[r9].seq == M2) && (R = r9);
837
+ if (R < 0) {
838
+ let r9 = 0;
839
+ for (; r9 < N.length && (M2 == null || N[r9].seq != null && N[r9].seq < M2); ) r9++;
840
+ N.splice(r9, 0, {
841
+ seq: M2,
842
+ name: z
843
+ }), R = r9;
844
+ for (let r10 of F) r10.field >= R && r10.field++;
845
+ }
846
+ for (let r9 of F) if (r9.line == P.length && r9.from > I.index) {
847
+ let M3 = I[2] ? 3 + (I[1] || "").length : 2;
848
+ r9.from -= M3, r9.to -= M3;
849
+ }
850
+ F.push(new FieldPos(R, P.length, I.index, I.index + z.length)), r8 = r8.slice(0, I.index) + L + r8.slice(I.index + I[0].length);
851
+ }
852
+ r8 = r8.replace(/\\([{}])/g, (r9, M2, N2) => {
853
+ for (let r10 of F) r10.line == P.length && r10.from > N2 && (r10.from--, r10.to--);
854
+ return M2;
855
+ }), P.push(r8);
856
+ }
857
+ return new r6(P, F);
858
+ }
859
+ }, fieldMarker = /* @__PURE__ */ Decoration.widget({ widget: /* @__PURE__ */ new class extends WidgetType {
860
+ toDOM() {
861
+ let r8 = document.createElement("span");
862
+ return r8.className = "cm-snippetFieldPosition", r8;
863
+ }
864
+ ignoreEvent() {
865
+ return false;
866
+ }
867
+ }() }), fieldRange = /* @__PURE__ */ Decoration.mark({ class: "cm-snippetField" }), ActiveSnippet = class r7 {
868
+ constructor(r8, M) {
869
+ this.ranges = r8, this.active = M, this.deco = Decoration.set(r8.map((r9) => (r9.from == r9.to ? fieldMarker : fieldRange).range(r9.from, r9.to)), true);
870
+ }
871
+ map(M) {
872
+ let N = [];
873
+ for (let r8 of this.ranges) {
874
+ let P = r8.map(M);
875
+ if (!P) return null;
876
+ N.push(P);
877
+ }
878
+ return new r7(N, this.active);
879
+ }
880
+ selectionInsideField(r8) {
881
+ return r8.ranges.every((r9) => this.ranges.some((M) => M.field == this.active && M.from <= r9.from && M.to >= r9.to));
882
+ }
883
+ }, setActive = /* @__PURE__ */ StateEffect.define({ map(r8, M) {
884
+ return r8 && r8.map(M);
885
+ } }), moveToField = /* @__PURE__ */ StateEffect.define(), snippetState = /* @__PURE__ */ StateField.define({
886
+ create() {
887
+ return null;
888
+ },
889
+ update(r8, M) {
890
+ for (let N of M.effects) {
891
+ if (N.is(setActive)) return N.value;
892
+ if (N.is(moveToField) && r8) return new ActiveSnippet(r8.ranges, N.value);
893
+ }
894
+ return r8 && M.docChanged && (r8 = r8.map(M.changes)), r8 && M.selection && !r8.selectionInsideField(M.selection) && (r8 = null), r8;
895
+ },
896
+ provide: (M) => EditorView.decorations.from(M, (r8) => r8 ? r8.deco : Decoration.none)
897
+ });
898
+ function fieldSelection(r8, M) {
899
+ return EditorSelection.create(r8.filter((r9) => r9.field == M).map((r9) => EditorSelection.range(r9.from, r9.to)));
900
+ }
901
+ function snippet(r8) {
902
+ let M = Snippet.parse(r8);
903
+ return (r9, N, P, F) => {
904
+ let { text: I, ranges: L } = M.instantiate(r9.state, P), { main: R } = r9.state.selection, z = {
905
+ changes: {
906
+ from: P,
907
+ to: F == R.from ? R.to : F,
908
+ insert: Text.of(I)
909
+ },
910
+ scrollIntoView: true,
911
+ annotations: N ? [pickedCompletion.of(N), Transaction.userEvent.of("input.complete")] : void 0
912
+ };
913
+ if (L.length && (z.selection = fieldSelection(L, 0)), L.some((r10) => r10.field > 0)) {
914
+ let M2 = new ActiveSnippet(L, 0), N2 = z.effects = [setActive.of(M2)];
915
+ r9.state.field(snippetState, false) === void 0 && N2.push(StateEffect.appendConfig.of([
916
+ snippetState,
917
+ addSnippetKeymap,
918
+ snippetPointerHandler,
919
+ baseTheme
920
+ ]));
921
+ }
922
+ r9.dispatch(r9.state.update(z));
923
+ };
924
+ }
925
+ function moveField(r8) {
926
+ return ({ state: M, dispatch: N }) => {
927
+ let P = M.field(snippetState, false);
928
+ if (!P || r8 < 0 && P.active == 0) return false;
929
+ let F = P.active + r8, I = r8 > 0 && !P.ranges.some((M2) => M2.field == F + r8);
930
+ return N(M.update({
931
+ selection: fieldSelection(P.ranges, F),
932
+ effects: setActive.of(I ? null : new ActiveSnippet(P.ranges, F)),
933
+ scrollIntoView: true
934
+ })), true;
935
+ };
936
+ }
937
+ var defaultSnippetKeymap = [{
938
+ key: "Tab",
939
+ run: /* @__PURE__ */ moveField(1),
940
+ shift: /* @__PURE__ */ moveField(-1)
941
+ }, {
942
+ key: "Escape",
943
+ run: ({ state: r8, dispatch: M }) => r8.field(snippetState, false) ? (M(r8.update({ effects: setActive.of(null) })), true) : false
944
+ }], snippetKeymap = /* @__PURE__ */ Facet.define({ combine(r8) {
945
+ return r8.length ? r8[0] : defaultSnippetKeymap;
946
+ } }), addSnippetKeymap = /* @__PURE__ */ Prec.highest(/* @__PURE__ */ keymap.compute([snippetKeymap], (r8) => r8.facet(snippetKeymap)));
947
+ function snippetCompletion(r8, M) {
948
+ return {
949
+ ...M,
950
+ apply: snippet(r8)
951
+ };
952
+ }
953
+ var snippetPointerHandler = /* @__PURE__ */ EditorView.domEventHandlers({ mousedown(r8, M) {
954
+ let N = M.state.field(snippetState, false), P;
955
+ if (!N || (P = M.posAtCoords({
956
+ x: r8.clientX,
957
+ y: r8.clientY
958
+ })) == null) return false;
959
+ let F = N.ranges.find((r9) => r9.from <= P && r9.to >= P);
960
+ return !F || F.field == N.active ? false : (M.dispatch({
961
+ selection: fieldSelection(N.ranges, F.field),
962
+ effects: setActive.of(N.ranges.some((r9) => r9.field > F.field) ? new ActiveSnippet(N.ranges, F.field) : null),
963
+ scrollIntoView: true
964
+ }), true);
965
+ } }), defaults = {
966
+ brackets: [
967
+ "(",
968
+ "[",
969
+ "{",
970
+ "'",
971
+ '"'
972
+ ],
973
+ before: ")]}:;>",
974
+ stringPrefixes: []
975
+ }, closeBracketEffect = /* @__PURE__ */ StateEffect.define({ map(r8, M) {
976
+ return M.mapPos(r8, -1, MapMode.TrackAfter) ?? void 0;
977
+ } }), closedBracket = /* @__PURE__ */ new class extends RangeValue {
978
+ }();
979
+ closedBracket.startSide = 1, closedBracket.endSide = -1;
980
+ var bracketState = /* @__PURE__ */ StateField.define({
981
+ create() {
982
+ return RangeSet.empty;
983
+ },
984
+ update(r8, M) {
985
+ if (r8 = r8.map(M.changes), M.selection) {
986
+ let N = M.state.doc.lineAt(M.selection.main.head);
987
+ r8 = r8.update({ filter: (r9) => r9 >= N.from && r9 <= N.to });
988
+ }
989
+ for (let N of M.effects) N.is(closeBracketEffect) && (r8 = r8.update({ add: [closedBracket.range(N.value, N.value + 1)] }));
990
+ return r8;
991
+ }
992
+ });
993
+ function closeBrackets() {
994
+ return [inputHandler, bracketState];
995
+ }
996
+ var definedClosing = "()[]{}<>\xAB\xBB\xBB\xAB\uFF3B\uFF3D\uFF5B\uFF5D";
997
+ function closing(r8) {
998
+ for (let M = 0; M < 16; M += 2) if (definedClosing.charCodeAt(M) == r8) return definedClosing.charAt(M + 1);
999
+ return fromCodePoint(r8 < 128 ? r8 : r8 + 1);
1000
+ }
1001
+ function config(r8, M) {
1002
+ return r8.languageDataAt("closeBrackets", M)[0] || defaults;
1003
+ }
1004
+ var android = typeof navigator == "object" && /* @__PURE__ */ /Android\b/.test(navigator.userAgent), inputHandler = /* @__PURE__ */ EditorView.inputHandler.of((r8, M, P, F) => {
1005
+ if ((android ? r8.composing : r8.compositionStarted) || r8.state.readOnly) return false;
1006
+ let I = r8.state.selection.main;
1007
+ if (F.length > 2 || F.length == 2 && codePointSize(codePointAt(F, 0)) == 1 || M != I.from || P != I.to) return false;
1008
+ let L = insertBracket(r8.state, F);
1009
+ return L ? (r8.dispatch(L), true) : false;
1010
+ }), closeBracketsKeymap = [{
1011
+ key: "Backspace",
1012
+ run: ({ state: r8, dispatch: M }) => {
1013
+ if (r8.readOnly) return false;
1014
+ let P = config(r8, r8.selection.main.head).brackets || defaults.brackets, F = null, I = r8.changeByRange((M2) => {
1015
+ if (M2.empty) {
1016
+ let F2 = prevChar(r8.doc, M2.head);
1017
+ for (let I2 of P) if (I2 == F2 && nextChar(r8.doc, M2.head) == closing(codePointAt(I2, 0))) return {
1018
+ changes: {
1019
+ from: M2.head - I2.length,
1020
+ to: M2.head + I2.length
1021
+ },
1022
+ range: EditorSelection.cursor(M2.head - I2.length)
1023
+ };
1024
+ }
1025
+ return { range: F = M2 };
1026
+ });
1027
+ return F || M(r8.update(I, {
1028
+ scrollIntoView: true,
1029
+ userEvent: "delete.backward"
1030
+ })), !F;
1031
+ }
1032
+ }];
1033
+ function insertBracket(r8, M) {
1034
+ let P = config(r8, r8.selection.main.head), F = P.brackets || defaults.brackets;
1035
+ for (let I of F) {
1036
+ let L = closing(codePointAt(I, 0));
1037
+ if (M == I) return L == I ? handleSame(r8, I, F.indexOf(I + I + I) > -1, P) : handleOpen(r8, I, L, P.before || defaults.before);
1038
+ if (M == L && closedBracketAt(r8, r8.selection.main.from)) return handleClose(r8, I, L);
1039
+ }
1040
+ return null;
1041
+ }
1042
+ function closedBracketAt(r8, M) {
1043
+ let N = false;
1044
+ return r8.field(bracketState).between(0, r8.doc.length, (r9) => {
1045
+ r9 == M && (N = true);
1046
+ }), N;
1047
+ }
1048
+ function nextChar(r8, M) {
1049
+ let P = r8.sliceString(M, M + 2);
1050
+ return P.slice(0, codePointSize(codePointAt(P, 0)));
1051
+ }
1052
+ function prevChar(r8, M) {
1053
+ let P = r8.sliceString(M - 2, M);
1054
+ return codePointSize(codePointAt(P, 0)) == P.length ? P : P.slice(1);
1055
+ }
1056
+ function handleOpen(r8, M, N, P) {
1057
+ let F = null, I = r8.changeByRange((I2) => {
1058
+ if (!I2.empty) return {
1059
+ changes: [{
1060
+ insert: M,
1061
+ from: I2.from
1062
+ }, {
1063
+ insert: N,
1064
+ from: I2.to
1065
+ }],
1066
+ effects: closeBracketEffect.of(I2.to + M.length),
1067
+ range: EditorSelection.range(I2.anchor + M.length, I2.head + M.length)
1068
+ };
1069
+ let L = nextChar(r8.doc, I2.head);
1070
+ return !L || /\s/.test(L) || P.indexOf(L) > -1 ? {
1071
+ changes: {
1072
+ insert: M + N,
1073
+ from: I2.head
1074
+ },
1075
+ effects: closeBracketEffect.of(I2.head + M.length),
1076
+ range: EditorSelection.cursor(I2.head + M.length)
1077
+ } : { range: F = I2 };
1078
+ });
1079
+ return F ? null : r8.update(I, {
1080
+ scrollIntoView: true,
1081
+ userEvent: "input.type"
1082
+ });
1083
+ }
1084
+ function handleClose(r8, M, N) {
1085
+ let P = null, F = r8.changeByRange((M2) => M2.empty && nextChar(r8.doc, M2.head) == N ? {
1086
+ changes: {
1087
+ from: M2.head,
1088
+ to: M2.head + N.length,
1089
+ insert: N
1090
+ },
1091
+ range: EditorSelection.cursor(M2.head + N.length)
1092
+ } : P = { range: M2 });
1093
+ return P ? null : r8.update(F, {
1094
+ scrollIntoView: true,
1095
+ userEvent: "input.type"
1096
+ });
1097
+ }
1098
+ function handleSame(r8, M, N, P) {
1099
+ let I = P.stringPrefixes || defaults.stringPrefixes, L = null, R = r8.changeByRange((P2) => {
1100
+ if (!P2.empty) return {
1101
+ changes: [{
1102
+ insert: M,
1103
+ from: P2.from
1104
+ }, {
1105
+ insert: M,
1106
+ from: P2.to
1107
+ }],
1108
+ effects: closeBracketEffect.of(P2.to + M.length),
1109
+ range: EditorSelection.range(P2.anchor + M.length, P2.head + M.length)
1110
+ };
1111
+ let R2 = P2.head, z = nextChar(r8.doc, R2), B;
1112
+ if (z == M) {
1113
+ if (nodeStart(r8, R2)) return {
1114
+ changes: {
1115
+ insert: M + M,
1116
+ from: R2
1117
+ },
1118
+ effects: closeBracketEffect.of(R2 + M.length),
1119
+ range: EditorSelection.cursor(R2 + M.length)
1120
+ };
1121
+ if (closedBracketAt(r8, R2)) {
1122
+ let P3 = N && r8.sliceDoc(R2, R2 + M.length * 3) == M + M + M ? M + M + M : M;
1123
+ return {
1124
+ changes: {
1125
+ from: R2,
1126
+ to: R2 + P3.length,
1127
+ insert: P3
1128
+ },
1129
+ range: EditorSelection.cursor(R2 + P3.length)
1130
+ };
1131
+ }
1132
+ } else if (N && r8.sliceDoc(R2 - 2 * M.length, R2) == M + M && (B = canStartStringAt(r8, R2 - 2 * M.length, I)) > -1 && nodeStart(r8, B)) return {
1133
+ changes: {
1134
+ insert: M + M + M + M,
1135
+ from: R2
1136
+ },
1137
+ effects: closeBracketEffect.of(R2 + M.length),
1138
+ range: EditorSelection.cursor(R2 + M.length)
1139
+ };
1140
+ else if (r8.charCategorizer(R2)(z) != CharCategory.Word && canStartStringAt(r8, R2, I) > -1 && !probablyInString(r8, R2, M, I)) return {
1141
+ changes: {
1142
+ insert: M + M,
1143
+ from: R2
1144
+ },
1145
+ effects: closeBracketEffect.of(R2 + M.length),
1146
+ range: EditorSelection.cursor(R2 + M.length)
1147
+ };
1148
+ return { range: L = P2 };
1149
+ });
1150
+ return L ? null : r8.update(R, {
1151
+ scrollIntoView: true,
1152
+ userEvent: "input.type"
1153
+ });
1154
+ }
1155
+ function nodeStart(r8, M) {
1156
+ let N = syntaxTree(r8).resolveInner(M + 1);
1157
+ return N.parent && N.from == M;
1158
+ }
1159
+ function probablyInString(r8, M, N, P) {
1160
+ let F = syntaxTree(r8).resolveInner(M, -1), I = P.reduce((r9, M2) => Math.max(r9, M2.length), 0);
1161
+ for (let L = 0; L < 5; L++) {
1162
+ let L2 = r8.sliceDoc(F.from, Math.min(F.to, F.from + N.length + I)), R = L2.indexOf(N);
1163
+ if (!R || R > -1 && P.indexOf(L2.slice(0, R)) > -1) {
1164
+ let M2 = F.firstChild;
1165
+ for (; M2 && M2.from == F.from && M2.to - M2.from > N.length + R; ) {
1166
+ if (r8.sliceDoc(M2.to - N.length, M2.to) == N) return false;
1167
+ M2 = M2.firstChild;
1168
+ }
1169
+ return true;
1170
+ }
1171
+ let z = F.to == M && F.parent;
1172
+ if (!z) break;
1173
+ F = z;
1174
+ }
1175
+ return false;
1176
+ }
1177
+ function canStartStringAt(r8, M, N) {
1178
+ let P = r8.charCategorizer(M);
1179
+ if (P(r8.sliceDoc(M - 1, M)) != CharCategory.Word) return M;
1180
+ for (let I of N) {
1181
+ let N2 = M - I.length;
1182
+ if (r8.sliceDoc(N2, M) == I && P(r8.sliceDoc(N2 - 1, N2)) != CharCategory.Word) return N2;
1183
+ }
1184
+ return -1;
1185
+ }
1186
+ function autocompletion(r8 = {}) {
1187
+ return [
1188
+ commitCharacters,
1189
+ completionState,
1190
+ completionConfig.of(r8),
1191
+ completionPlugin,
1192
+ completionKeymapExt,
1193
+ baseTheme
1194
+ ];
1195
+ }
1196
+ var completionKeymap = [
1197
+ {
1198
+ key: "Ctrl-Space",
1199
+ run: startCompletion
1200
+ },
1201
+ {
1202
+ mac: "Alt-`",
1203
+ run: startCompletion
1204
+ },
1205
+ {
1206
+ mac: "Alt-i",
1207
+ run: startCompletion
1208
+ },
1209
+ {
1210
+ key: "Escape",
1211
+ run: closeCompletion
1212
+ },
1213
+ {
1214
+ key: "ArrowDown",
1215
+ run: /* @__PURE__ */ moveCompletionSelection(true)
1216
+ },
1217
+ {
1218
+ key: "ArrowUp",
1219
+ run: /* @__PURE__ */ moveCompletionSelection(false)
1220
+ },
1221
+ {
1222
+ key: "PageDown",
1223
+ run: /* @__PURE__ */ moveCompletionSelection(true, "page")
1224
+ },
1225
+ {
1226
+ key: "PageUp",
1227
+ run: /* @__PURE__ */ moveCompletionSelection(false, "page")
1228
+ },
1229
+ {
1230
+ key: "Enter",
1231
+ run: acceptCompletion
1232
+ }
1233
+ ], completionKeymapExt = /* @__PURE__ */ Prec.highest(/* @__PURE__ */ keymap.computeN([completionConfig], (r8) => r8.facet(completionConfig).defaultKeymap ? [completionKeymap] : []));
1234
+ export {
1235
+ closeBracketsKeymap as a,
1236
+ completionKeymap as c,
1237
+ snippet as d,
1238
+ snippetCompletion as f,
1239
+ closeBrackets as i,
1240
+ ifNotIn as l,
1241
+ acceptCompletion as n,
1242
+ closeCompletion as o,
1243
+ autocompletion as r,
1244
+ completeFromList as s,
1245
+ CompletionContext as t,
1246
+ insertCompletionText as u
1247
+ };