markdown-flow-ui 0.2.26 → 0.2.28-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/escaping.cjs +2 -0
- package/dist/_virtual/escaping.cjs.map +1 -0
- package/dist/_virtual/escaping.es.js +5 -0
- package/dist/_virtual/escaping.es.js.map +1 -0
- package/dist/_virtual/index.es3.js +5 -4
- package/dist/_virtual/index.es3.js.map +1 -1
- package/dist/_virtual/index.es4.js +4 -5
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/_virtual/index.es9.js +2 -2
- package/dist/_virtual/index3.cjs +1 -1
- package/dist/_virtual/index4.cjs +1 -1
- package/dist/_virtual/index8.cjs +1 -1
- package/dist/_virtual/index9.cjs +1 -1
- package/dist/components/ContentRender/locales/contentRender.json.cjs +1 -1
- package/dist/components/ContentRender/locales/contentRender.json.d.ts +17 -0
- package/dist/components/ContentRender/locales/contentRender.json.es.js +2 -1
- package/dist/components/ContentRender/locales/contentRender.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +27 -26
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.d.ts +139 -0
- package/dist/components/MarkdownFlowEditor/editorI18n.es.js +16 -14
- package/dist/components/MarkdownFlowEditor/editorI18n.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs +2 -0
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs.map +1 -0
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.d.ts +72 -0
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js +140 -0
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js.map +1 -0
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs +3 -3
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js +131 -117
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js.map +1 -1
- package/dist/components/Slide/locales/slide.json.cjs +1 -1
- package/dist/components/Slide/locales/slide.json.d.ts +42 -0
- package/dist/components/Slide/locales/slide.json.es.js +2 -1
- package/dist/components/Slide/locales/slide.json.es.js.map +1 -1
- package/dist/components/ui/inputGroup/textarea.cjs +1 -1
- package/dist/components/ui/inputGroup/textarea.es.js +1 -1
- package/dist/lib/interaction-defaults.cjs +1 -1
- package/dist/lib/interaction-defaults.cjs.map +1 -1
- package/dist/lib/interaction-defaults.es.js +25 -23
- package/dist/lib/interaction-defaults.es.js.map +1 -1
- package/dist/lib/locale.cjs +1 -1
- package/dist/lib/locale.cjs.map +1 -1
- package/dist/lib/locale.d.ts +1 -1
- package/dist/lib/locale.es.js +14 -12
- package/dist/lib/locale.es.js.map +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
- package/dist/node_modules/classnames/index.cjs +1 -1
- package/dist/node_modules/classnames/index.es.js +1 -1
- package/dist/node_modules/rc-input/es/BaseInput.cjs +1 -1
- package/dist/node_modules/rc-input/es/BaseInput.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/ResizableTextArea.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/TextArea.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/TextArea.es.js +1 -1
- package/dist/node_modules/rc-textarea/es/index.cjs +1 -1
- package/dist/node_modules/rc-textarea/es/index.es.js +1 -1
- package/dist/node_modules/remark-flow/dist/escaping.cjs +3 -0
- package/dist/node_modules/remark-flow/dist/escaping.cjs.map +1 -0
- package/dist/node_modules/remark-flow/dist/escaping.es.js +96 -0
- package/dist/node_modules/remark-flow/dist/escaping.es.js.map +1 -0
- package/dist/node_modules/remark-flow/dist/index.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/index.cjs.map +1 -1
- package/dist/node_modules/remark-flow/dist/index.es.js +46 -25
- package/dist/node_modules/remark-flow/dist/index.es.js.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-parser.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-parser.cjs.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-parser.es.js +123 -106
- package/dist/node_modules/remark-flow/dist/interaction-parser.es.js.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.cjs.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js +19 -18
- package/dist/node_modules/remark-flow/dist/interaction-plugin-core.es.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import { ViewPlugin as
|
|
2
|
-
import { RangeSetBuilder as
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { ViewPlugin as H, Decoration as A } from "../../../node_modules/@codemirror/view/dist/index.es.js";
|
|
2
|
+
import { RangeSetBuilder as D } from "../../../node_modules/@codemirror/state/dist/index.es.js";
|
|
3
|
+
import { d as M } from "../../../_virtual/index.es.js";
|
|
4
|
+
import { createVariableExpressionRegexp as P } from "../utils.es.js";
|
|
5
|
+
const V = /\{\{.*?\}\}/g, E = /<!--[\s\S]*?-->/g, O = new RegExp(
|
|
6
|
+
`\\?\\[(${M.INTERACTION_CONTENT_SOURCE})\\](?!\\()`,
|
|
7
|
+
"g"
|
|
8
|
+
);
|
|
9
|
+
function T(e) {
|
|
6
10
|
const l = [];
|
|
7
11
|
let c = null, f = 0;
|
|
8
|
-
for (; f <=
|
|
9
|
-
const s =
|
|
10
|
-
`, f),
|
|
11
|
-
if (
|
|
12
|
+
for (; f <= e.length; ) {
|
|
13
|
+
const s = e.indexOf(`
|
|
14
|
+
`, f), n = s === -1 ? e.length : s;
|
|
15
|
+
if (e.slice(f, n).trim() === "!===" && (c === null ? c = f : (l.push({
|
|
12
16
|
from: c,
|
|
13
|
-
to:
|
|
17
|
+
to: n,
|
|
14
18
|
className: "syntax-fixed"
|
|
15
19
|
}), c = null)), s === -1)
|
|
16
20
|
break;
|
|
@@ -18,26 +22,26 @@ function L(t) {
|
|
|
18
22
|
}
|
|
19
23
|
return l;
|
|
20
24
|
}
|
|
21
|
-
function
|
|
25
|
+
function _(e, l) {
|
|
22
26
|
const c = [];
|
|
23
27
|
let f = 0;
|
|
24
|
-
const s = (
|
|
25
|
-
for (; f < l.length && l[f].to <=
|
|
28
|
+
const s = (h) => {
|
|
29
|
+
for (; f < l.length && l[f].to <= h; )
|
|
26
30
|
f++;
|
|
27
31
|
const m = l[f];
|
|
28
|
-
return !!m &&
|
|
32
|
+
return !!m && h >= m.from && h < m.to;
|
|
29
33
|
};
|
|
30
|
-
let
|
|
31
|
-
for (;
|
|
32
|
-
const
|
|
33
|
-
`,
|
|
34
|
-
let
|
|
35
|
-
for (;
|
|
36
|
-
const a =
|
|
34
|
+
let n = 0;
|
|
35
|
+
for (; n <= e.length; ) {
|
|
36
|
+
const h = e.indexOf(`
|
|
37
|
+
`, n), m = h === -1 ? e.length : h, o = e.slice(n, m), r = [];
|
|
38
|
+
let u = 0;
|
|
39
|
+
for (; u < o.length; ) {
|
|
40
|
+
const a = o.indexOf("===", u);
|
|
37
41
|
if (a === -1)
|
|
38
42
|
break;
|
|
39
|
-
const
|
|
40
|
-
!(
|
|
43
|
+
const x = n + a;
|
|
44
|
+
!(x > 0 && e[x - 1] === "!") && !s(x) && r.push(x), u = a + 3;
|
|
41
45
|
}
|
|
42
46
|
for (let a = 0; a + 1 < r.length; a += 2)
|
|
43
47
|
c.push({
|
|
@@ -45,16 +49,16 @@ function j(t, l) {
|
|
|
45
49
|
to: r[a + 1] + 3,
|
|
46
50
|
className: "syntax-fixed"
|
|
47
51
|
});
|
|
48
|
-
if (
|
|
52
|
+
if (h === -1)
|
|
49
53
|
break;
|
|
50
|
-
|
|
54
|
+
n = h + 1;
|
|
51
55
|
}
|
|
52
56
|
return c;
|
|
53
57
|
}
|
|
54
|
-
function
|
|
58
|
+
function L(e) {
|
|
55
59
|
const l = [];
|
|
56
60
|
let c;
|
|
57
|
-
for (
|
|
61
|
+
for (E.lastIndex = 0; (c = E.exec(e)) !== null; )
|
|
58
62
|
l.push({
|
|
59
63
|
from: c.index,
|
|
60
64
|
to: c.index + c[0].length,
|
|
@@ -62,138 +66,148 @@ function q(t) {
|
|
|
62
66
|
});
|
|
63
67
|
return l;
|
|
64
68
|
}
|
|
65
|
-
function
|
|
66
|
-
const l =
|
|
67
|
-
...
|
|
68
|
-
...
|
|
69
|
+
function U(e) {
|
|
70
|
+
const l = L(e), c = [
|
|
71
|
+
...T(e),
|
|
72
|
+
..._(e, l),
|
|
69
73
|
...l
|
|
70
|
-
].sort((s,
|
|
74
|
+
].sort((s, n) => s.from !== n.from ? s.from - n.from : n.to - s.to), f = [];
|
|
71
75
|
for (const s of c) {
|
|
72
|
-
const
|
|
73
|
-
(!
|
|
76
|
+
const n = f[f.length - 1];
|
|
77
|
+
(!n || s.from >= n.to) && f.push(s);
|
|
74
78
|
}
|
|
75
79
|
return f;
|
|
76
80
|
}
|
|
77
|
-
function
|
|
81
|
+
function $(e, l = () => !1) {
|
|
78
82
|
const c = [], f = [];
|
|
79
83
|
O.lastIndex = 0;
|
|
80
|
-
const s = (
|
|
81
|
-
if (!
|
|
82
|
-
const a =
|
|
84
|
+
const s = (o, r) => f.some((u) => !(r <= u.from || o >= u.to)), n = (o, r, u) => o >= r || s(o, r) ? !1 : (f.push({ from: o, to: r }), c.push({ from: o, to: r, className: u }), !0), h = (o) => {
|
|
85
|
+
if (!o.slice(2, -2).trim()) return { className: "syntax-variable-invalid", valid: !1 };
|
|
86
|
+
const a = P().exec(o), x = !!a && a.index === 0 && a[0] === o;
|
|
83
87
|
return {
|
|
84
|
-
className:
|
|
85
|
-
valid:
|
|
88
|
+
className: x ? "syntax-variable" : "syntax-variable-invalid",
|
|
89
|
+
valid: x
|
|
86
90
|
};
|
|
87
91
|
};
|
|
88
92
|
let m;
|
|
89
|
-
for (const
|
|
90
|
-
|
|
91
|
-
for (; (m = O.exec(
|
|
92
|
-
const
|
|
93
|
-
if (!s(
|
|
94
|
-
if (
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
let
|
|
98
|
-
if (
|
|
99
|
-
const
|
|
100
|
-
|
|
93
|
+
for (const o of U(e))
|
|
94
|
+
n(o.from, o.to, o.className);
|
|
95
|
+
for (; (m = O.exec(e)) !== null; ) {
|
|
96
|
+
const o = m.index, r = m.index + m[0].length, u = m[1], a = o + 2;
|
|
97
|
+
if (!s(o, r))
|
|
98
|
+
if (n(o, o + 1, "syntax-keyword"), n(o + 1, o + 2, "syntax-bracket"), n(r - 1, r, "syntax-bracket"), u.startsWith("%")) {
|
|
99
|
+
const x = /\{\{.*?\}\}/g, y = x.exec(u);
|
|
100
|
+
x.lastIndex = 0;
|
|
101
|
+
let b = "syntax-percent-invalid";
|
|
102
|
+
if (y) {
|
|
103
|
+
const t = h(y[0]), d = a + y.index, W = d + y[0].length, B = l(d, W);
|
|
104
|
+
b = t.valid && !B ? "syntax-percent-valid" : "syntax-percent-invalid";
|
|
101
105
|
}
|
|
102
|
-
|
|
103
|
-
const
|
|
104
|
-
let
|
|
105
|
-
for (;
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
106
|
+
n(a, a + 1, b);
|
|
107
|
+
const R = [], w = [], k = [];
|
|
108
|
+
let g = 0;
|
|
109
|
+
for (; g < u.length; ) {
|
|
110
|
+
if (M.isEscape(u, g)) {
|
|
111
|
+
g += 2;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const t = u.startsWith("||", g) ? "||" : u[g] === "|" ? "|" : u.startsWith("...", g) ? "..." : null;
|
|
115
|
+
if (!t) {
|
|
116
|
+
g += 1;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
114
119
|
R.push({
|
|
115
|
-
from: a +
|
|
116
|
-
to: a +
|
|
117
|
-
|
|
120
|
+
from: a + g,
|
|
121
|
+
to: a + g + t.length
|
|
122
|
+
}), g += t.length;
|
|
123
|
+
}
|
|
124
|
+
let p;
|
|
125
|
+
const i = /\{\{.*?\}\}/g;
|
|
126
|
+
for (; (p = i.exec(u)) !== null; ) {
|
|
127
|
+
const t = p[0], d = h(t);
|
|
128
|
+
w.push({
|
|
129
|
+
from: a + p.index,
|
|
130
|
+
to: a + p.index + t.length,
|
|
131
|
+
className: d.className
|
|
118
132
|
});
|
|
119
133
|
}
|
|
120
|
-
const
|
|
121
|
-
...
|
|
122
|
-
...
|
|
134
|
+
const N = [
|
|
135
|
+
...R.map((t) => ({
|
|
136
|
+
...t,
|
|
123
137
|
className: "syntax-keyword"
|
|
124
138
|
})),
|
|
125
|
-
...
|
|
126
|
-
...
|
|
127
|
-
className:
|
|
139
|
+
...w.map((t) => ({
|
|
140
|
+
...t,
|
|
141
|
+
className: t.className
|
|
128
142
|
}))
|
|
129
|
-
].sort((
|
|
130
|
-
for (const
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
let v =
|
|
134
|
-
const
|
|
135
|
-
for (const
|
|
136
|
-
v <
|
|
137
|
-
v < S &&
|
|
143
|
+
].sort((t, d) => t.from !== d.from ? t.from - d.from : t.to - d.to);
|
|
144
|
+
for (const t of N)
|
|
145
|
+
t.className.startsWith("syntax-variable") && l(t.from, t.to) || n(t.from, t.to, t.className) && k.push({ from: t.from, to: t.to });
|
|
146
|
+
const C = a + 1, S = r - 1;
|
|
147
|
+
let v = C;
|
|
148
|
+
const F = k.sort((t, d) => t.from !== d.from ? t.from - d.from : t.to - d.to);
|
|
149
|
+
for (const t of F)
|
|
150
|
+
v < t.from && n(v, t.from, "syntax-string"), v = Math.max(v, t.to);
|
|
151
|
+
v < S && n(v, S, "syntax-string");
|
|
138
152
|
} else {
|
|
139
|
-
const
|
|
140
|
-
let
|
|
141
|
-
const
|
|
142
|
-
for (; (
|
|
143
|
-
const i =
|
|
144
|
-
|
|
145
|
-
from: a +
|
|
146
|
-
to: a +
|
|
147
|
-
className:
|
|
153
|
+
const x = [], y = [];
|
|
154
|
+
let b;
|
|
155
|
+
const R = /\{\{.*?\}\}/g;
|
|
156
|
+
for (; (b = R.exec(u)) !== null; ) {
|
|
157
|
+
const i = b[0], N = h(i);
|
|
158
|
+
x.push({
|
|
159
|
+
from: a + b.index,
|
|
160
|
+
to: a + b.index + i.length,
|
|
161
|
+
className: N.className
|
|
148
162
|
});
|
|
149
163
|
}
|
|
150
|
-
const
|
|
151
|
-
for (const i of
|
|
152
|
-
i.className.startsWith("syntax-variable") && l(i.from, i.to) ||
|
|
153
|
-
const k = a,
|
|
154
|
-
let
|
|
155
|
-
for (const i of
|
|
156
|
-
|
|
157
|
-
|
|
164
|
+
const w = x.sort((i, N) => i.from !== N.from ? i.from - N.from : i.to - N.to);
|
|
165
|
+
for (const i of w)
|
|
166
|
+
i.className.startsWith("syntax-variable") && l(i.from, i.to) || n(i.from, i.to, i.className) && y.push({ from: i.from, to: i.to });
|
|
167
|
+
const k = a, g = r - 1;
|
|
168
|
+
let p = k;
|
|
169
|
+
for (const i of y)
|
|
170
|
+
p < i.from && n(p, i.from, "syntax-button-text"), p = Math.max(p, i.to);
|
|
171
|
+
p < g && n(p, g, "syntax-button-text");
|
|
158
172
|
}
|
|
159
173
|
}
|
|
160
|
-
for (V.lastIndex = 0; (m = V.exec(
|
|
161
|
-
const
|
|
162
|
-
r.valid && !l(m.index, m.index + m[0].length) &&
|
|
174
|
+
for (V.lastIndex = 0; (m = V.exec(e)) !== null; ) {
|
|
175
|
+
const o = m[0], r = h(o);
|
|
176
|
+
r.valid && !l(m.index, m.index + m[0].length) && n(
|
|
163
177
|
m.index,
|
|
164
178
|
m.index + m[0].length,
|
|
165
179
|
r.className
|
|
166
180
|
);
|
|
167
181
|
}
|
|
168
|
-
return c.sort((
|
|
182
|
+
return c.sort((o, r) => o.from !== r.from ? o.from - r.from : r.to - o.to), c;
|
|
169
183
|
}
|
|
170
|
-
function I(
|
|
171
|
-
const l = new
|
|
184
|
+
function I(e) {
|
|
185
|
+
const l = new D(), c = e.state.doc.toString(), f = $(c, (s, n) => e.state.selection.ranges.some((h) => h.from >= s && h.to <= n));
|
|
172
186
|
for (const s of f)
|
|
173
187
|
if (s.from < s.to)
|
|
174
188
|
try {
|
|
175
|
-
l.add(s.from, s.to,
|
|
176
|
-
} catch (
|
|
177
|
-
console.warn("SyntaxHighlighter: Failed to add decoration", s,
|
|
189
|
+
l.add(s.from, s.to, A.mark({ class: s.className }));
|
|
190
|
+
} catch (n) {
|
|
191
|
+
console.warn("SyntaxHighlighter: Failed to add decoration", s, n);
|
|
178
192
|
}
|
|
179
193
|
return l.finish();
|
|
180
194
|
}
|
|
181
|
-
const
|
|
195
|
+
const J = H.fromClass(
|
|
182
196
|
class {
|
|
183
|
-
constructor(
|
|
184
|
-
this.decorations = I(
|
|
197
|
+
constructor(e) {
|
|
198
|
+
this.decorations = I(e);
|
|
185
199
|
}
|
|
186
|
-
update(
|
|
187
|
-
(
|
|
200
|
+
update(e) {
|
|
201
|
+
(e.docChanged || e.viewportChanged || e.selectionSet) && (this.decorations = I(e.view));
|
|
188
202
|
}
|
|
189
203
|
},
|
|
190
204
|
{
|
|
191
|
-
decorations: (
|
|
205
|
+
decorations: (e) => e.decorations
|
|
192
206
|
}
|
|
193
207
|
);
|
|
194
208
|
export {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
209
|
+
U as collectOuterBlockRanges,
|
|
210
|
+
$ as collectSyntaxHighlightRanges,
|
|
211
|
+
J as default
|
|
198
212
|
};
|
|
199
213
|
//# sourceMappingURL=SyntaxHighlighter.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyntaxHighlighter.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.ts"],"sourcesContent":["import {\n Decoration,\n DecorationSet,\n EditorView,\n ViewPlugin,\n ViewUpdate,\n} from \"@codemirror/view\";\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport { createVariableExpressionRegexp } from \"../utils\";\n\nconst broadVariableRegex = /\\{\\{.*?\\}\\}/g;\nconst commentRegex = /<!--[\\s\\S]*?-->/g;\nconst controlBlockRegex = /\\?\\[(.*?)\\]/g;\n\nexport interface SyntaxHighlightRange {\n from: number;\n to: number;\n className: string;\n}\n\nfunction collectMultilineFixedOutputRanges(\n docText: string\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let pendingStart: number | null = null;\n let lineStart = 0;\n\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n\n if (lineText.trim() === \"!===\") {\n if (pendingStart === null) {\n pendingStart = lineStart;\n } else {\n ranges.push({\n from: pendingStart,\n to: lineEnd,\n className: \"syntax-fixed\",\n });\n pendingStart = null;\n }\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectSingleLineFixedOutputRanges(\n docText: string,\n commentRanges: SyntaxHighlightRange[]\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let commentIndex = 0;\n\n const isInsideComment = (index: number) => {\n while (\n commentIndex < commentRanges.length &&\n commentRanges[commentIndex].to <= index\n ) {\n commentIndex++;\n }\n\n const range = commentRanges[commentIndex];\n return !!range && index >= range.from && index < range.to;\n };\n\n let lineStart = 0;\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n const markerPositions: number[] = [];\n let searchFrom = 0;\n\n while (searchFrom < lineText.length) {\n const markerOffset = lineText.indexOf(\"===\", searchFrom);\n if (markerOffset === -1) {\n break;\n }\n\n const markerIndex = lineStart + markerOffset;\n const isNegated = markerIndex > 0 && docText[markerIndex - 1] === \"!\";\n if (!isNegated && !isInsideComment(markerIndex)) {\n markerPositions.push(markerIndex);\n }\n\n searchFrom = markerOffset + 3;\n }\n\n for (let i = 0; i + 1 < markerPositions.length; i += 2) {\n ranges.push({\n from: markerPositions[i],\n to: markerPositions[i + 1] + 3,\n className: \"syntax-fixed\",\n });\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectCommentRanges(docText: string): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let match;\n\n commentRegex.lastIndex = 0;\n while ((match = commentRegex.exec(docText)) !== null) {\n ranges.push({\n from: match.index,\n to: match.index + match[0].length,\n className: \"syntax-comment\",\n });\n }\n\n return ranges;\n}\n\n/**\n * Collects non-overlapping fixed-output and comment wrapper ranges.\n *\n * @param docText - Document text to scan.\n * @returns Outer syntax highlight ranges sorted by document position.\n */\nexport function collectOuterBlockRanges(\n docText: string\n): SyntaxHighlightRange[] {\n const commentRanges = collectCommentRanges(docText);\n const blockRanges = [\n ...collectMultilineFixedOutputRanges(docText),\n ...collectSingleLineFixedOutputRanges(docText, commentRanges),\n ...commentRanges,\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n const outerRanges: SyntaxHighlightRange[] = [];\n\n for (const range of blockRanges) {\n const lastOuter = outerRanges[outerRanges.length - 1];\n if (!lastOuter || range.from >= lastOuter.to) {\n outerRanges.push(range);\n }\n }\n\n return outerRanges;\n}\n\n/**\n * Collects all custom syntax highlight ranges for editor decorations.\n *\n * @param docText - Document text to scan.\n * @param isCursorInside - Returns true when the current cursor is inside a range.\n * @returns Non-overlapping syntax highlight ranges sorted by document position.\n */\nexport function collectSyntaxHighlightRanges(\n docText: string,\n isCursorInside: (from: number, to: number) => boolean = () => false\n): SyntaxHighlightRange[] {\n const matches: SyntaxHighlightRange[] = [];\n const occupied: { from: number; to: number }[] = [];\n\n controlBlockRegex.lastIndex = 0;\n\n // Prevent overlapping decorations so styling stays deterministic\n const isOverlapping = (from: number, to: number) =>\n occupied.some((range) => !(to <= range.from || from >= range.to));\n\n const addMatch = (from: number, to: number, className: string) => {\n if (from >= to) return false;\n if (isOverlapping(from, to)) return false;\n occupied.push({ from, to });\n matches.push({ from, to, className });\n return true;\n };\n\n const classifyVariable = (raw: string) => {\n const inner = raw.slice(2, -2).trim();\n if (!inner) return { className: \"syntax-variable-invalid\", valid: false };\n const strict = createVariableExpressionRegexp();\n const strictMatch = strict.exec(raw);\n const valid =\n !!strictMatch && strictMatch.index === 0 && strictMatch[0] === raw;\n return {\n className: valid ? \"syntax-variable\" : \"syntax-variable-invalid\",\n valid,\n };\n };\n\n let match;\n\n // 1. Outer block ranges win over any syntax inside them.\n for (const range of collectOuterBlockRanges(docText)) {\n addMatch(range.from, range.to, range.className);\n }\n\n // 2. Control Blocks\n while ((match = controlBlockRegex.exec(docText)) !== null) {\n const fullStart = match.index;\n const fullEnd = match.index + match[0].length;\n const content = match[1];\n const contentStart = fullStart + 2; // after ?[\n if (isOverlapping(fullStart, fullEnd)) {\n continue;\n }\n\n // Outer brackets and question mark\n addMatch(fullStart, fullStart + 1, \"syntax-keyword\"); // ?\n addMatch(fullStart + 1, fullStart + 2, \"syntax-bracket\"); // [\n addMatch(fullEnd - 1, fullEnd, \"syntax-bracket\"); // ]\n\n if (content.startsWith(\"%\")) {\n // Input / Select\n const contentVariableRegex = /\\{\\{.*?\\}\\}/g;\n const firstVariableMatch = contentVariableRegex.exec(content);\n contentVariableRegex.lastIndex = 0;\n let percentClass = \"syntax-percent-invalid\";\n if (firstVariableMatch) {\n const classification = classifyVariable(firstVariableMatch[0]);\n const varFrom = contentStart + firstVariableMatch.index;\n const varTo = varFrom + firstVariableMatch[0].length;\n const cursorInsideVar = isCursorInside(varFrom, varTo);\n percentClass =\n classification.valid && !cursorInsideVar\n ? \"syntax-percent-valid\"\n : \"syntax-percent-invalid\";\n }\n addMatch(contentStart, contentStart + 1, percentClass); // %\n\n const operatorRanges: { from: number; to: number }[] = [];\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedTokenRanges: { from: number; to: number }[] = [];\n\n // Inner operators | || ...\n const innerRegex = /(\\|\\||\\||\\.\\.\\.)/g;\n let innerMatch;\n while ((innerMatch = innerRegex.exec(content)) !== null) {\n operatorRanges.push({\n from: contentStart + innerMatch.index,\n to: contentStart + innerMatch.index + innerMatch[0].length,\n });\n }\n\n // Variables inside control block content\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const allTokens = [\n ...operatorRanges.map((range) => ({\n ...range,\n className: \"syntax-keyword\",\n })),\n ...variableRanges.map((range) => ({\n ...range,\n className: range.className,\n })),\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of allTokens) {\n if (\n token.className.startsWith(\"syntax-variable\") &&\n isCursorInside(token.from, token.to)\n ) {\n continue;\n }\n if (addMatch(token.from, token.to, token.className)) {\n appliedTokenRanges.push({ from: token.from, to: token.to });\n }\n }\n\n // Content (Dark Blue) for remaining text segments\n const stringStart = contentStart + 1;\n const stringEnd = fullEnd - 1;\n let cursor = stringStart;\n const sortedApplied = appliedTokenRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of sortedApplied) {\n if (cursor < token.from) {\n addMatch(cursor, token.from, \"syntax-string\");\n }\n cursor = Math.max(cursor, token.to);\n }\n if (cursor < stringEnd) {\n addMatch(cursor, stringEnd, \"syntax-string\");\n }\n } else {\n // Button ?[text]\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedVariableRanges: { from: number; to: number }[] = [];\n\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const sortedVariables = variableRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const variable of sortedVariables) {\n if (\n variable.className.startsWith(\"syntax-variable\") &&\n isCursorInside(variable.from, variable.to)\n ) {\n continue;\n }\n if (addMatch(variable.from, variable.to, variable.className)) {\n appliedVariableRanges.push({ from: variable.from, to: variable.to });\n }\n }\n\n const buttonTextStart = contentStart;\n const buttonTextEnd = fullEnd - 1;\n let cursor = buttonTextStart;\n\n for (const variable of appliedVariableRanges) {\n if (cursor < variable.from) {\n addMatch(cursor, variable.from, \"syntax-button-text\");\n }\n cursor = Math.max(cursor, variable.to);\n }\n if (cursor < buttonTextEnd) {\n addMatch(cursor, buttonTextEnd, \"syntax-button-text\");\n }\n }\n }\n\n // 3. Variables (only if not already decorated; invalid ones stay default outside control blocks)\n broadVariableRegex.lastIndex = 0;\n while ((match = broadVariableRegex.exec(docText)) !== null) {\n const text = match[0];\n const classification = classifyVariable(text);\n if (\n classification.valid &&\n !isCursorInside(match.index, match.index + match[0].length)\n ) {\n addMatch(\n match.index,\n match.index + match[0].length,\n classification.className\n );\n }\n }\n\n // Sort matches by 'from' asc, then 'to' desc (longest first)\n matches.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n return matches;\n}\n\nfunction buildDecorations(view: EditorView): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n const docText = view.state.doc.toString();\n const matches = collectSyntaxHighlightRanges(docText, (from, to) => {\n return view.state.selection.ranges.some((range) => {\n return range.from >= from && range.to <= to;\n });\n });\n\n for (const m of matches) {\n if (m.from < m.to) {\n try {\n builder.add(m.from, m.to, Decoration.mark({ class: m.className }));\n } catch (e) {\n console.warn(\"SyntaxHighlighter: Failed to add decoration\", m, e);\n }\n }\n }\n\n return builder.finish();\n}\n\nconst SyntaxHighlighter = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view);\n }\n }\n },\n {\n decorations: (instance) => instance.decorations,\n }\n);\n\nexport default SyntaxHighlighter;\n"],"names":["broadVariableRegex","commentRegex","controlBlockRegex","collectMultilineFixedOutputRanges","docText","ranges","pendingStart","lineStart","newlineIndex","lineEnd","collectSingleLineFixedOutputRanges","commentRanges","commentIndex","isInsideComment","index","range","lineText","markerPositions","searchFrom","markerOffset","markerIndex","i","collectCommentRanges","match","collectOuterBlockRanges","blockRanges","a","b","outerRanges","lastOuter","collectSyntaxHighlightRanges","isCursorInside","matches","occupied","isOverlapping","from","to","addMatch","className","classifyVariable","raw","strictMatch","createVariableExpressionRegexp","valid","fullStart","fullEnd","content","contentStart","contentVariableRegex","firstVariableMatch","percentClass","classification","varFrom","varTo","cursorInsideVar","operatorRanges","variableRanges","appliedTokenRanges","innerRegex","innerMatch","innerVariableMatch","innerVariableRegex","rawVariable","allTokens","token","stringStart","stringEnd","cursor","sortedApplied","appliedVariableRanges","sortedVariables","variable","buttonTextStart","buttonTextEnd","text","buildDecorations","view","builder","RangeSetBuilder","m","Decoration","SyntaxHighlighter","ViewPlugin","update","instance"],"mappings":";;;AAUA,MAAMA,IAAqB,gBACrBC,IAAe,oBACfC,IAAoB;AAQ1B,SAASC,EACPC,GACwB;AACxB,QAAMC,IAAiC,CAAA;AACvC,MAAIC,IAA8B,MAC9BC,IAAY;AAEhB,SAAOA,KAAaH,EAAQ,UAAQ;AAClC,UAAMI,IAAeJ,EAAQ,QAAQ;AAAA,GAAMG,CAAS,GAC9CE,IAAUD,MAAiB,KAAKJ,EAAQ,SAASI;AAgBvD,QAfiBJ,EAAQ,MAAMG,GAAWE,CAAO,EAEpC,KAAA,MAAW,WAClBH,MAAiB,OACnBA,IAAeC,KAEfF,EAAO,KAAK;AAAA,MACV,MAAMC;AAAA,MACN,IAAIG;AAAA,MACJ,WAAW;AAAA,IAAA,CACZ,GACDH,IAAe,QAIfE,MAAiB;AACnB;AAGF,IAAAD,IAAYC,IAAe;AAAA,EAC7B;AAEA,SAAOH;AACT;AAEA,SAASK,EACPN,GACAO,GACwB;AACxB,QAAMN,IAAiC,CAAA;AACvC,MAAIO,IAAe;AAEnB,QAAMC,IAAkB,CAACC,MAAkB;AACzC,WACEF,IAAeD,EAAc,UAC7BA,EAAcC,CAAY,EAAE,MAAME;AAElC,MAAAF;AAGF,UAAMG,IAAQJ,EAAcC,CAAY;AACxC,WAAO,CAAC,CAACG,KAASD,KAASC,EAAM,QAAQD,IAAQC,EAAM;AAAA,EACzD;AAEA,MAAIR,IAAY;AAChB,SAAOA,KAAaH,EAAQ,UAAQ;AAClC,UAAMI,IAAeJ,EAAQ,QAAQ;AAAA,GAAMG,CAAS,GAC9CE,IAAUD,MAAiB,KAAKJ,EAAQ,SAASI,GACjDQ,IAAWZ,EAAQ,MAAMG,GAAWE,CAAO,GAC3CQ,IAA4B,CAAA;AAClC,QAAIC,IAAa;AAEjB,WAAOA,IAAaF,EAAS,UAAQ;AACnC,YAAMG,IAAeH,EAAS,QAAQ,OAAOE,CAAU;AACvD,UAAIC,MAAiB;AACnB;AAGF,YAAMC,IAAcb,IAAYY;AAEhC,MAAI,EADcC,IAAc,KAAKhB,EAAQgB,IAAc,CAAC,MAAM,QAChD,CAACP,EAAgBO,CAAW,KAC5CH,EAAgB,KAAKG,CAAW,GAGlCF,IAAaC,IAAe;AAAA,IAC9B;AAEA,aAASE,IAAI,GAAGA,IAAI,IAAIJ,EAAgB,QAAQI,KAAK;AACnD,MAAAhB,EAAO,KAAK;AAAA,QACV,MAAMY,EAAgBI,CAAC;AAAA,QACvB,IAAIJ,EAAgBI,IAAI,CAAC,IAAI;AAAA,QAC7B,WAAW;AAAA,MAAA,CACZ;AAGH,QAAIb,MAAiB;AACnB;AAGF,IAAAD,IAAYC,IAAe;AAAA,EAC7B;AAEA,SAAOH;AACT;AAEA,SAASiB,EAAqBlB,GAAyC;AACrE,QAAMC,IAAiC,CAAA;AACvC,MAAIkB;AAGJ,OADAtB,EAAa,YAAY,IACjBsB,IAAQtB,EAAa,KAAKG,CAAO,OAAO;AAC9C,IAAAC,EAAO,KAAK;AAAA,MACV,MAAMkB,EAAM;AAAA,MACZ,IAAIA,EAAM,QAAQA,EAAM,CAAC,EAAE;AAAA,MAC3B,WAAW;AAAA,IAAA,CACZ;AAGH,SAAOlB;AACT;AAQO,SAASmB,EACdpB,GACwB;AACxB,QAAMO,IAAgBW,EAAqBlB,CAAO,GAC5CqB,IAAc;AAAA,IAClB,GAAGtB,EAAkCC,CAAO;AAAA,IAC5C,GAAGM,EAAmCN,GAASO,CAAa;AAAA,IAC5D,GAAGA;AAAA,EAAA,EACH,KAAK,CAACe,GAAGC,MACLD,EAAE,SAASC,EAAE,OAAaD,EAAE,OAAOC,EAAE,OAClCA,EAAE,KAAKD,EAAE,EACjB,GAEKE,IAAsC,CAAA;AAE5C,aAAWb,KAASU,GAAa;AAC/B,UAAMI,IAAYD,EAAYA,EAAY,SAAS,CAAC;AACpD,KAAI,CAACC,KAAad,EAAM,QAAQc,EAAU,OACxCD,EAAY,KAAKb,CAAK;AAAA,EAE1B;AAEA,SAAOa;AACT;AASO,SAASE,EACd1B,GACA2B,IAAwD,MAAM,IACtC;AACxB,QAAMC,IAAkC,CAAA,GAClCC,IAA2C,CAAA;AAEjD,EAAA/B,EAAkB,YAAY;AAG9B,QAAMgC,IAAgB,CAACC,GAAcC,MACnCH,EAAS,KAAK,CAAClB,MAAU,EAAEqB,KAAMrB,EAAM,QAAQoB,KAAQpB,EAAM,GAAG,GAE5DsB,IAAW,CAACF,GAAcC,GAAYE,MACtCH,KAAQC,KACRF,EAAcC,GAAMC,CAAE,IAAU,MACpCH,EAAS,KAAK,EAAE,MAAAE,GAAM,IAAAC,EAAA,CAAI,GAC1BJ,EAAQ,KAAK,EAAE,MAAAG,GAAM,IAAAC,GAAI,WAAAE,GAAW,GAC7B,KAGHC,IAAmB,CAACC,MAAgB;AAExC,QAAI,CADUA,EAAI,MAAM,GAAG,EAAE,EAAE,KAAA,EACnB,QAAO,EAAE,WAAW,2BAA2B,OAAO,GAAA;AAElE,UAAMC,IADSC,EAAA,EACY,KAAKF,CAAG,GAC7BG,IACJ,CAAC,CAACF,KAAeA,EAAY,UAAU,KAAKA,EAAY,CAAC,MAAMD;AACjE,WAAO;AAAA,MACL,WAAWG,IAAQ,oBAAoB;AAAA,MACvC,OAAAA;AAAA,IAAA;AAAA,EAEJ;AAEA,MAAIpB;AAGJ,aAAWR,KAASS,EAAwBpB,CAAO;AACjD,IAAAiC,EAAStB,EAAM,MAAMA,EAAM,IAAIA,EAAM,SAAS;AAIhD,UAAQQ,IAAQrB,EAAkB,KAAKE,CAAO,OAAO,QAAM;AACzD,UAAMwC,IAAYrB,EAAM,OAClBsB,IAAUtB,EAAM,QAAQA,EAAM,CAAC,EAAE,QACjCuB,IAAUvB,EAAM,CAAC,GACjBwB,IAAeH,IAAY;AACjC,QAAI,CAAAV,EAAcU,GAAWC,CAAO;AASpC,UAJAR,EAASO,GAAWA,IAAY,GAAG,gBAAgB,GACnDP,EAASO,IAAY,GAAGA,IAAY,GAAG,gBAAgB,GACvDP,EAASQ,IAAU,GAAGA,GAAS,gBAAgB,GAE3CC,EAAQ,WAAW,GAAG,GAAG;AAE3B,cAAME,IAAuB,gBACvBC,IAAqBD,EAAqB,KAAKF,CAAO;AAC5D,QAAAE,EAAqB,YAAY;AACjC,YAAIE,IAAe;AACnB,YAAID,GAAoB;AACtB,gBAAME,IAAiBZ,EAAiBU,EAAmB,CAAC,CAAC,GACvDG,IAAUL,IAAeE,EAAmB,OAC5CI,IAAQD,IAAUH,EAAmB,CAAC,EAAE,QACxCK,IAAkBvB,EAAeqB,GAASC,CAAK;AACrD,UAAAH,IACEC,EAAe,SAAS,CAACG,IACrB,yBACA;AAAA,QACR;AACA,QAAAjB,EAASU,GAAcA,IAAe,GAAGG,CAAY;AAErD,cAAMK,IAAiD,CAAA,GACjDC,IACJ,CAAA,GACIC,IAAqD,CAAA,GAGrDC,IAAa;AACnB,YAAIC;AACJ,gBAAQA,IAAaD,EAAW,KAAKZ,CAAO,OAAO;AACjD,UAAAS,EAAe,KAAK;AAAA,YAClB,MAAMR,IAAeY,EAAW;AAAA,YAChC,IAAIZ,IAAeY,EAAW,QAAQA,EAAW,CAAC,EAAE;AAAA,UAAA,CACrD;AAIH,YAAIC;AACJ,cAAMC,IAAqB;AAC3B,gBAAQD,IAAqBC,EAAmB,KAAKf,CAAO,OAAO,QAAM;AACvE,gBAAMgB,IAAcF,EAAmB,CAAC,GAClCT,IAAiBZ,EAAiBuB,CAAW;AACnD,UAAAN,EAAe,KAAK;AAAA,YAClB,MAAMT,IAAea,EAAmB;AAAA,YACxC,IAAIb,IAAea,EAAmB,QAAQE,EAAY;AAAA,YAC1D,WAAWX,EAAe;AAAA,UAAA,CAC3B;AAAA,QACH;AAEA,cAAMY,IAAY;AAAA,UAChB,GAAGR,EAAe,IAAI,CAACxC,OAAW;AAAA,YAChC,GAAGA;AAAA,YACH,WAAW;AAAA,UAAA,EACX;AAAA,UACF,GAAGyC,EAAe,IAAI,CAACzC,OAAW;AAAA,YAChC,GAAGA;AAAA,YACH,WAAWA,EAAM;AAAA,UAAA,EACjB;AAAA,QAAA,EACF,KAAK,CAACW,GAAGC,MACLD,EAAE,SAASC,EAAE,OAAaD,EAAE,OAAOC,EAAE,OAClCD,EAAE,KAAKC,EAAE,EACjB;AAED,mBAAWqC,KAASD;AAClB,UACEC,EAAM,UAAU,WAAW,iBAAiB,KAC5CjC,EAAeiC,EAAM,MAAMA,EAAM,EAAE,KAIjC3B,EAAS2B,EAAM,MAAMA,EAAM,IAAIA,EAAM,SAAS,KAChDP,EAAmB,KAAK,EAAE,MAAMO,EAAM,MAAM,IAAIA,EAAM,IAAI;AAK9D,cAAMC,IAAclB,IAAe,GAC7BmB,IAAYrB,IAAU;AAC5B,YAAIsB,IAASF;AACb,cAAMG,IAAgBX,EAAmB,KAAK,CAAC/B,GAAGC,MAC5CD,EAAE,SAASC,EAAE,OAAaD,EAAE,OAAOC,EAAE,OAClCD,EAAE,KAAKC,EAAE,EACjB;AAED,mBAAWqC,KAASI;AAClB,UAAID,IAASH,EAAM,QACjB3B,EAAS8B,GAAQH,EAAM,MAAM,eAAe,GAE9CG,IAAS,KAAK,IAAIA,GAAQH,EAAM,EAAE;AAEpC,QAAIG,IAASD,KACX7B,EAAS8B,GAAQD,GAAW,eAAe;AAAA,MAE/C,OAAO;AAEL,cAAMV,IACJ,CAAA,GACIa,IAAwD,CAAA;AAE9D,YAAIT;AACJ,cAAMC,IAAqB;AAC3B,gBAAQD,IAAqBC,EAAmB,KAAKf,CAAO,OAAO,QAAM;AACvE,gBAAMgB,IAAcF,EAAmB,CAAC,GAClCT,IAAiBZ,EAAiBuB,CAAW;AACnD,UAAAN,EAAe,KAAK;AAAA,YAClB,MAAMT,IAAea,EAAmB;AAAA,YACxC,IAAIb,IAAea,EAAmB,QAAQE,EAAY;AAAA,YAC1D,WAAWX,EAAe;AAAA,UAAA,CAC3B;AAAA,QACH;AAEA,cAAMmB,IAAkBd,EAAe,KAAK,CAAC9B,GAAG,MAC1CA,EAAE,SAAS,EAAE,OAAaA,EAAE,OAAO,EAAE,OAClCA,EAAE,KAAK,EAAE,EACjB;AAED,mBAAW6C,KAAYD;AACrB,UACEC,EAAS,UAAU,WAAW,iBAAiB,KAC/CxC,EAAewC,EAAS,MAAMA,EAAS,EAAE,KAIvClC,EAASkC,EAAS,MAAMA,EAAS,IAAIA,EAAS,SAAS,KACzDF,EAAsB,KAAK,EAAE,MAAME,EAAS,MAAM,IAAIA,EAAS,IAAI;AAIvE,cAAMC,IAAkBzB,GAClB0B,IAAgB5B,IAAU;AAChC,YAAIsB,IAASK;AAEb,mBAAWD,KAAYF;AACrB,UAAIF,IAASI,EAAS,QACpBlC,EAAS8B,GAAQI,EAAS,MAAM,oBAAoB,GAEtDJ,IAAS,KAAK,IAAIA,GAAQI,EAAS,EAAE;AAEvC,QAAIJ,IAASM,KACXpC,EAAS8B,GAAQM,GAAe,oBAAoB;AAAA,MAExD;AAAA,EACF;AAIA,OADAzE,EAAmB,YAAY,IACvBuB,IAAQvB,EAAmB,KAAKI,CAAO,OAAO,QAAM;AAC1D,UAAMsE,IAAOnD,EAAM,CAAC,GACd4B,IAAiBZ,EAAiBmC,CAAI;AAC5C,IACEvB,EAAe,SACf,CAACpB,EAAeR,EAAM,OAAOA,EAAM,QAAQA,EAAM,CAAC,EAAE,MAAM,KAE1Dc;AAAA,MACEd,EAAM;AAAA,MACNA,EAAM,QAAQA,EAAM,CAAC,EAAE;AAAA,MACvB4B,EAAe;AAAA,IAAA;AAAA,EAGrB;AAGA,SAAAnB,EAAQ,KAAK,CAACN,GAAGC,MACXD,EAAE,SAASC,EAAE,OAAaD,EAAE,OAAOC,EAAE,OAClCA,EAAE,KAAKD,EAAE,EACjB,GAEMM;AACT;AAEA,SAAS2C,EAAiBC,GAAiC;AACzD,QAAMC,IAAU,IAAIC,EAAA,GACd1E,IAAUwE,EAAK,MAAM,IAAI,SAAA,GACzB5C,IAAUF,EAA6B1B,GAAS,CAAC+B,GAAMC,MACpDwC,EAAK,MAAM,UAAU,OAAO,KAAK,CAAC7D,MAChCA,EAAM,QAAQoB,KAAQpB,EAAM,MAAMqB,CAC1C,CACF;AAED,aAAW2C,KAAK/C;AACd,QAAI+C,EAAE,OAAOA,EAAE;AACb,UAAI;AACF,QAAAF,EAAQ,IAAIE,EAAE,MAAMA,EAAE,IAAIC,EAAW,KAAK,EAAE,OAAOD,EAAE,UAAA,CAAW,CAAC;AAAA,MACnE,SAAS,GAAG;AACV,gBAAQ,KAAK,+CAA+CA,GAAG,CAAC;AAAA,MAClE;AAIJ,SAAOF,EAAQ,OAAA;AACjB;AAEA,MAAMI,IAAoBC,EAAW;AAAA,EACnC,MAAM;AAAA,IAGJ,YAAYN,GAAkB;AAC5B,WAAK,cAAcD,EAAiBC,CAAI;AAAA,IAC1C;AAAA,IAEA,OAAOO,GAAoB;AACzB,OAAIA,EAAO,cAAcA,EAAO,mBAAmBA,EAAO,kBACxD,KAAK,cAAcR,EAAiBQ,EAAO,IAAI;AAAA,IAEnD;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,aAAa,CAACC,MAAaA,EAAS;AAAA,EAAA;AAExC;"}
|
|
1
|
+
{"version":3,"file":"SyntaxHighlighter.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.ts"],"sourcesContent":["import {\n Decoration,\n DecorationSet,\n EditorView,\n ViewPlugin,\n ViewUpdate,\n} from \"@codemirror/view\";\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport { INTERACTION_CONTENT_SOURCE, isEscape } from \"remark-flow\";\n\nimport { createVariableExpressionRegexp } from \"../utils\";\n\nconst broadVariableRegex = /\\{\\{.*?\\}\\}/g;\nconst commentRegex = /<!--[\\s\\S]*?-->/g;\n// The grammar's own definition of where an interaction ends, so a `\\]` an option escaped does\n// not cut the highlight short, and the same `(?!\\()` the parser uses, so `?[text](url)` stays a\n// markdown link. Taken from remark-flow rather than written again here: the editor and the\n// parser have to agree about what they are looking at.\nconst controlBlockRegex = new RegExp(\n `\\\\?\\\\[(${INTERACTION_CONTENT_SOURCE})\\\\](?!\\\\()`,\n \"g\"\n);\n\nexport interface SyntaxHighlightRange {\n from: number;\n to: number;\n className: string;\n}\n\nfunction collectMultilineFixedOutputRanges(\n docText: string\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let pendingStart: number | null = null;\n let lineStart = 0;\n\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n\n if (lineText.trim() === \"!===\") {\n if (pendingStart === null) {\n pendingStart = lineStart;\n } else {\n ranges.push({\n from: pendingStart,\n to: lineEnd,\n className: \"syntax-fixed\",\n });\n pendingStart = null;\n }\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectSingleLineFixedOutputRanges(\n docText: string,\n commentRanges: SyntaxHighlightRange[]\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let commentIndex = 0;\n\n const isInsideComment = (index: number) => {\n while (\n commentIndex < commentRanges.length &&\n commentRanges[commentIndex].to <= index\n ) {\n commentIndex++;\n }\n\n const range = commentRanges[commentIndex];\n return !!range && index >= range.from && index < range.to;\n };\n\n let lineStart = 0;\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n const markerPositions: number[] = [];\n let searchFrom = 0;\n\n while (searchFrom < lineText.length) {\n const markerOffset = lineText.indexOf(\"===\", searchFrom);\n if (markerOffset === -1) {\n break;\n }\n\n const markerIndex = lineStart + markerOffset;\n const isNegated = markerIndex > 0 && docText[markerIndex - 1] === \"!\";\n if (!isNegated && !isInsideComment(markerIndex)) {\n markerPositions.push(markerIndex);\n }\n\n searchFrom = markerOffset + 3;\n }\n\n for (let i = 0; i + 1 < markerPositions.length; i += 2) {\n ranges.push({\n from: markerPositions[i],\n to: markerPositions[i + 1] + 3,\n className: \"syntax-fixed\",\n });\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectCommentRanges(docText: string): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let match;\n\n commentRegex.lastIndex = 0;\n while ((match = commentRegex.exec(docText)) !== null) {\n ranges.push({\n from: match.index,\n to: match.index + match[0].length,\n className: \"syntax-comment\",\n });\n }\n\n return ranges;\n}\n\n/**\n * Collects non-overlapping fixed-output and comment wrapper ranges.\n *\n * @param docText - Document text to scan.\n * @returns Outer syntax highlight ranges sorted by document position.\n */\nexport function collectOuterBlockRanges(\n docText: string\n): SyntaxHighlightRange[] {\n const commentRanges = collectCommentRanges(docText);\n const blockRanges = [\n ...collectMultilineFixedOutputRanges(docText),\n ...collectSingleLineFixedOutputRanges(docText, commentRanges),\n ...commentRanges,\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n const outerRanges: SyntaxHighlightRange[] = [];\n\n for (const range of blockRanges) {\n const lastOuter = outerRanges[outerRanges.length - 1];\n if (!lastOuter || range.from >= lastOuter.to) {\n outerRanges.push(range);\n }\n }\n\n return outerRanges;\n}\n\n/**\n * Collects all custom syntax highlight ranges for editor decorations.\n *\n * @param docText - Document text to scan.\n * @param isCursorInside - Returns true when the current cursor is inside a range.\n * @returns Non-overlapping syntax highlight ranges sorted by document position.\n */\nexport function collectSyntaxHighlightRanges(\n docText: string,\n isCursorInside: (from: number, to: number) => boolean = () => false\n): SyntaxHighlightRange[] {\n const matches: SyntaxHighlightRange[] = [];\n const occupied: { from: number; to: number }[] = [];\n\n controlBlockRegex.lastIndex = 0;\n\n // Prevent overlapping decorations so styling stays deterministic\n const isOverlapping = (from: number, to: number) =>\n occupied.some((range) => !(to <= range.from || from >= range.to));\n\n const addMatch = (from: number, to: number, className: string) => {\n if (from >= to) return false;\n if (isOverlapping(from, to)) return false;\n occupied.push({ from, to });\n matches.push({ from, to, className });\n return true;\n };\n\n const classifyVariable = (raw: string) => {\n const inner = raw.slice(2, -2).trim();\n if (!inner) return { className: \"syntax-variable-invalid\", valid: false };\n const strict = createVariableExpressionRegexp();\n const strictMatch = strict.exec(raw);\n const valid =\n !!strictMatch && strictMatch.index === 0 && strictMatch[0] === raw;\n return {\n className: valid ? \"syntax-variable\" : \"syntax-variable-invalid\",\n valid,\n };\n };\n\n let match;\n\n // 1. Outer block ranges win over any syntax inside them.\n for (const range of collectOuterBlockRanges(docText)) {\n addMatch(range.from, range.to, range.className);\n }\n\n // 2. Control Blocks\n while ((match = controlBlockRegex.exec(docText)) !== null) {\n const fullStart = match.index;\n const fullEnd = match.index + match[0].length;\n const content = match[1];\n const contentStart = fullStart + 2; // after ?[\n if (isOverlapping(fullStart, fullEnd)) {\n continue;\n }\n\n // Outer brackets and question mark\n addMatch(fullStart, fullStart + 1, \"syntax-keyword\"); // ?\n addMatch(fullStart + 1, fullStart + 2, \"syntax-bracket\"); // [\n addMatch(fullEnd - 1, fullEnd, \"syntax-bracket\"); // ]\n\n if (content.startsWith(\"%\")) {\n // Input / Select\n const contentVariableRegex = /\\{\\{.*?\\}\\}/g;\n const firstVariableMatch = contentVariableRegex.exec(content);\n contentVariableRegex.lastIndex = 0;\n let percentClass = \"syntax-percent-invalid\";\n if (firstVariableMatch) {\n const classification = classifyVariable(firstVariableMatch[0]);\n const varFrom = contentStart + firstVariableMatch.index;\n const varTo = varFrom + firstVariableMatch[0].length;\n const cursorInsideVar = isCursorInside(varFrom, varTo);\n percentClass =\n classification.valid && !cursorInsideVar\n ? \"syntax-percent-valid\"\n : \"syntax-percent-invalid\";\n }\n addMatch(contentStart, contentStart + 1, percentClass); // %\n\n const operatorRanges: { from: number; to: number }[] = [];\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedTokenRanges: { from: number; to: number }[] = [];\n\n // Inner operators | || ... -- skipping any an option escaped, the way the parser does.\n // Painted as separators, they told the author the grammar had split an option that it\n // had in fact left whole.\n let scanIndex = 0;\n while (scanIndex < content.length) {\n if (isEscape(content, scanIndex)) {\n scanIndex += 2;\n continue;\n }\n const operator = content.startsWith(\"||\", scanIndex)\n ? \"||\"\n : content[scanIndex] === \"|\"\n ? \"|\"\n : content.startsWith(\"...\", scanIndex)\n ? \"...\"\n : null;\n if (!operator) {\n scanIndex += 1;\n continue;\n }\n operatorRanges.push({\n from: contentStart + scanIndex,\n to: contentStart + scanIndex + operator.length,\n });\n scanIndex += operator.length;\n }\n\n // Variables inside control block content\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const allTokens = [\n ...operatorRanges.map((range) => ({\n ...range,\n className: \"syntax-keyword\",\n })),\n ...variableRanges.map((range) => ({\n ...range,\n className: range.className,\n })),\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of allTokens) {\n if (\n token.className.startsWith(\"syntax-variable\") &&\n isCursorInside(token.from, token.to)\n ) {\n continue;\n }\n if (addMatch(token.from, token.to, token.className)) {\n appliedTokenRanges.push({ from: token.from, to: token.to });\n }\n }\n\n // Content (Dark Blue) for remaining text segments\n const stringStart = contentStart + 1;\n const stringEnd = fullEnd - 1;\n let cursor = stringStart;\n const sortedApplied = appliedTokenRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of sortedApplied) {\n if (cursor < token.from) {\n addMatch(cursor, token.from, \"syntax-string\");\n }\n cursor = Math.max(cursor, token.to);\n }\n if (cursor < stringEnd) {\n addMatch(cursor, stringEnd, \"syntax-string\");\n }\n } else {\n // Button ?[text]\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedVariableRanges: { from: number; to: number }[] = [];\n\n let innerVariableMatch;\n const innerVariableRegex = /\\{\\{.*?\\}\\}/g;\n while ((innerVariableMatch = innerVariableRegex.exec(content)) !== null) {\n const rawVariable = innerVariableMatch[0];\n const classification = classifyVariable(rawVariable);\n variableRanges.push({\n from: contentStart + innerVariableMatch.index,\n to: contentStart + innerVariableMatch.index + rawVariable.length,\n className: classification.className,\n });\n }\n\n const sortedVariables = variableRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const variable of sortedVariables) {\n if (\n variable.className.startsWith(\"syntax-variable\") &&\n isCursorInside(variable.from, variable.to)\n ) {\n continue;\n }\n if (addMatch(variable.from, variable.to, variable.className)) {\n appliedVariableRanges.push({ from: variable.from, to: variable.to });\n }\n }\n\n const buttonTextStart = contentStart;\n const buttonTextEnd = fullEnd - 1;\n let cursor = buttonTextStart;\n\n for (const variable of appliedVariableRanges) {\n if (cursor < variable.from) {\n addMatch(cursor, variable.from, \"syntax-button-text\");\n }\n cursor = Math.max(cursor, variable.to);\n }\n if (cursor < buttonTextEnd) {\n addMatch(cursor, buttonTextEnd, \"syntax-button-text\");\n }\n }\n }\n\n // 3. Variables (only if not already decorated; invalid ones stay default outside control blocks)\n broadVariableRegex.lastIndex = 0;\n while ((match = broadVariableRegex.exec(docText)) !== null) {\n const text = match[0];\n const classification = classifyVariable(text);\n if (\n classification.valid &&\n !isCursorInside(match.index, match.index + match[0].length)\n ) {\n addMatch(\n match.index,\n match.index + match[0].length,\n classification.className\n );\n }\n }\n\n // Sort matches by 'from' asc, then 'to' desc (longest first)\n matches.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n return matches;\n}\n\nfunction buildDecorations(view: EditorView): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n const docText = view.state.doc.toString();\n const matches = collectSyntaxHighlightRanges(docText, (from, to) => {\n return view.state.selection.ranges.some((range) => {\n return range.from >= from && range.to <= to;\n });\n });\n\n for (const m of matches) {\n if (m.from < m.to) {\n try {\n builder.add(m.from, m.to, Decoration.mark({ class: m.className }));\n } catch (e) {\n console.warn(\"SyntaxHighlighter: Failed to add decoration\", m, e);\n }\n }\n }\n\n return builder.finish();\n}\n\nconst SyntaxHighlighter = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view);\n }\n }\n },\n {\n decorations: (instance) => instance.decorations,\n }\n);\n\nexport default SyntaxHighlighter;\n"],"names":["broadVariableRegex","commentRegex","controlBlockRegex","INTERACTION_CONTENT_SOURCE","collectMultilineFixedOutputRanges","docText","ranges","pendingStart","lineStart","newlineIndex","lineEnd","collectSingleLineFixedOutputRanges","commentRanges","commentIndex","isInsideComment","index","range","lineText","markerPositions","searchFrom","markerOffset","markerIndex","i","collectCommentRanges","match","collectOuterBlockRanges","blockRanges","a","b","outerRanges","lastOuter","collectSyntaxHighlightRanges","isCursorInside","matches","occupied","isOverlapping","from","to","addMatch","className","classifyVariable","raw","strictMatch","createVariableExpressionRegexp","valid","fullStart","fullEnd","content","contentStart","contentVariableRegex","firstVariableMatch","percentClass","classification","varFrom","varTo","cursorInsideVar","operatorRanges","variableRanges","appliedTokenRanges","scanIndex","isEscape","operator","innerVariableMatch","innerVariableRegex","rawVariable","allTokens","token","stringStart","stringEnd","cursor","sortedApplied","appliedVariableRanges","sortedVariables","variable","buttonTextStart","buttonTextEnd","text","buildDecorations","view","builder","RangeSetBuilder","m","Decoration","e","SyntaxHighlighter","ViewPlugin","update","instance"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e={"en-US":{bufferingText:{waitingForAudio:"Waiting for current slide audio...",loadingAudio:"Loading audio...",waitingForMoreAudio:"Waiting for more audio..."},fullscreenBackAriaLabel:"Back to non-full screen",slideProgressAriaLabel:"Lesson slide progress",slideProgressGeneratingLabel:"Generating",interactionTexts:{title:"Submit the content below to continue.",confirmButtonText:"Submit",copyButtonText:"Copy",copiedButtonText:"Copied",dragHandleAriaLabel:"Move interaction"},playerTexts:{closeSettingsLabel:"Close settings",enterFullscreenLabel:"Enter fullscreen",exitFullscreenLabel:"Exit fullscreen",moreOptionsAriaLabel:"More options",nextLabel:"Next page",nextSubtitleLabel:"Next sentence",notesLabel:"Notes",pauseAutoplayLabel:"Pause autoplay",pauseLabel:"Pause",playAutoplayLabel:"Play autoplay",playLabel:"Play",playbackShortcutLabel:"Space",previousLabel:"Previous page",previousSubtitleLabel:"Previous sentence",screenModeLabel:"Screen mode",settingsTitle:"Settings",subtitleLabel:"Subtitles",subtitleToggleAriaLabel:"Toggle subtitles",volumeAriaLabel:"Volume",screenLabel:"Screen",nonFullscreenLabel:"Non-fullscreen",fullscreenLabel:"Fullscreen",fullscreenHintText:"Please rotate your screen for the best experience"}},"fr-FR":{bufferingText:{waitingForAudio:"En attente de l'audio de la diapositive actuelle...",loadingAudio:"Chargement audio...",waitingForMoreAudio:"En attente de plus d'audio..."},fullscreenBackAriaLabel:"Retour au mode non plein écran",slideProgressAriaLabel:"Progression des diapositives de la leçon",slideProgressGeneratingLabel:"Génération en cours",interactionTexts:{title:"Soumettez le contenu ci-dessous pour continuer.",confirmButtonText:"Soumettre",copyButtonText:"Copier",copiedButtonText:"Copié",dragHandleAriaLabel:"Déplacer le panneau d’interaction"},playerTexts:{closeSettingsLabel:"Fermer les paramètres",enterFullscreenLabel:"Passer en plein écran",exitFullscreenLabel:"Quitter le plein écran",moreOptionsAriaLabel:"Plus d'options",nextLabel:"Page suivante",nextSubtitleLabel:"Phrase suivante",notesLabel:"Notes",pauseAutoplayLabel:"Suspendre la lecture automatique",pauseLabel:"Pause",playAutoplayLabel:"Lancer la lecture automatique",playLabel:"Lecture",playbackShortcutLabel:"Barre d’espace",previousLabel:"Page précédente",previousSubtitleLabel:"Phrase précédente",screenModeLabel:"Mode d'affichage",settingsTitle:"Paramètres",subtitleLabel:"Sous-titres",subtitleToggleAriaLabel:"Afficher ou masquer les sous-titres",volumeAriaLabel:"Volume",screenLabel:"Écran",nonFullscreenLabel:"Hors plein écran",fullscreenLabel:"Plein écran",fullscreenHintText:"Veuillez tourner votre écran pour une meilleure expérience"}},"zh-CN":{bufferingText:{waitingForAudio:"正在等待当前页音频...",loadingAudio:"正在加载音频",waitingForMoreAudio:"正在等待音频"},fullscreenBackAriaLabel:"返回非全屏",slideProgressAriaLabel:"课程页面进度",slideProgressGeneratingLabel:"生成中",interactionTexts:{title:"提交下面的内容以继续",confirmButtonText:"提交",copyButtonText:"复制",copiedButtonText:"已复制",dragHandleAriaLabel:"移动交互面板"},playerTexts:{closeSettingsLabel:"关闭设置",enterFullscreenLabel:"进入全屏",exitFullscreenLabel:"退出全屏",moreOptionsAriaLabel:"更多选项",nextLabel:"下一页",nextSubtitleLabel:"下一句",notesLabel:"笔记",pauseAutoplayLabel:"暂停自动播放",pauseLabel:"暂停",playAutoplayLabel:"开始自动播放",playLabel:"播放",playbackShortcutLabel:"空格键",previousLabel:"上一页",previousSubtitleLabel:"上一句",screenModeLabel:"屏幕模式",settingsTitle:"设置",subtitleLabel:"字幕",subtitleToggleAriaLabel:"切换字幕",volumeAriaLabel:"音量",screenLabel:"屏幕",nonFullscreenLabel:"非全屏",fullscreenLabel:"全屏",fullscreenHintText:"请旋转屏幕以获得最佳体验"}},"ar-SA":{bufferingText:{waitingForAudio:"في انتظار صوت الشريحة الحالية...",loadingAudio:"جارٍ تحميل الصوت...",waitingForMoreAudio:"في انتظار المزيد من الصوت..."},fullscreenBackAriaLabel:"العودة إلى العرض العادي",slideProgressAriaLabel:"تقدم شرائح الدرس",slideProgressGeneratingLabel:"جارٍ الإنشاء",interactionTexts:{title:"أرسل المحتوى أدناه للمتابعة.",confirmButtonText:"إرسال",copyButtonText:"نسخ",copiedButtonText:"تم النسخ",dragHandleAriaLabel:"تحريك لوحة التفاعل"},playerTexts:{closeSettingsLabel:"إغلاق الإعدادات",enterFullscreenLabel:"الدخول إلى ملء الشاشة",exitFullscreenLabel:"الخروج من ملء الشاشة",moreOptionsAriaLabel:"مزيد من الخيارات",nextLabel:"الصفحة التالية",nextSubtitleLabel:"الجملة التالية",notesLabel:"الملاحظات",pauseAutoplayLabel:"إيقاف التشغيل التلقائي مؤقتًا",pauseLabel:"إيقاف مؤقت",playAutoplayLabel:"بدء التشغيل التلقائي",playLabel:"تشغيل",playbackShortcutLabel:"مفتاح المسافة",previousLabel:"الصفحة السابقة",previousSubtitleLabel:"الجملة السابقة",screenModeLabel:"وضع الشاشة",settingsTitle:"الإعدادات",subtitleLabel:"الترجمة النصية",subtitleToggleAriaLabel:"تبديل الترجمة النصية",volumeAriaLabel:"مستوى الصوت",screenLabel:"الشاشة",nonFullscreenLabel:"الوضع العادي",fullscreenLabel:"ملء الشاشة",fullscreenHintText:"يرجى تدوير الشاشة للحصول على أفضل تجربة"}},"th-TH":{bufferingText:{waitingForAudio:"กำลังรอเสียงของสไลด์ปัจจุบัน...",loadingAudio:"กำลังโหลดเสียง...",waitingForMoreAudio:"กำลังรอเสียงเพิ่มเติม..."},fullscreenBackAriaLabel:"กลับสู่โหมดปกติ",slideProgressAriaLabel:"ความคืบหน้าของสไลด์บทเรียน",slideProgressGeneratingLabel:"กำลังสร้าง",interactionTexts:{title:"ส่งเนื้อหาด้านล่างเพื่อดำเนินการต่อ",confirmButtonText:"ส่งคำตอบ",copyButtonText:"คัดลอก",copiedButtonText:"คัดลอกแล้ว",dragHandleAriaLabel:"ย้ายแผงโต้ตอบ"},playerTexts:{closeSettingsLabel:"ปิดการตั้งค่า",enterFullscreenLabel:"เข้าสู่โหมดเต็มหน้าจอ",exitFullscreenLabel:"ออกจากโหมดเต็มหน้าจอ",moreOptionsAriaLabel:"ตัวเลือกเพิ่มเติม",nextLabel:"หน้าถัดไป",nextSubtitleLabel:"ประโยคถัดไป",notesLabel:"บันทึกย่อ",pauseAutoplayLabel:"หยุดเล่นอัตโนมัติชั่วคราว",pauseLabel:"หยุดชั่วคราว",playAutoplayLabel:"เริ่มเล่นอัตโนมัติ",playLabel:"เล่น",playbackShortcutLabel:"แป้นเว้นวรรค",previousLabel:"หน้าก่อนหน้า",previousSubtitleLabel:"ประโยคก่อนหน้า",screenModeLabel:"โหมดหน้าจอ",settingsTitle:"การตั้งค่า",subtitleLabel:"คำบรรยาย",subtitleToggleAriaLabel:"สลับคำบรรยาย",volumeAriaLabel:"ระดับเสียง",screenLabel:"หน้าจอ",nonFullscreenLabel:"โหมดไม่เต็มหน้าจอ",fullscreenLabel:"เต็มหน้าจอ",fullscreenHintText:"โปรดหมุนหน้าจอเพื่อประสบการณ์การใช้งานที่ดีที่สุด"}}};exports.default=e;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e={"en-US":{bufferingText:{waitingForAudio:"Waiting for current slide audio...",loadingAudio:"Loading audio...",waitingForMoreAudio:"Waiting for more audio..."},fullscreenBackAriaLabel:"Back to non-full screen",slideProgressAriaLabel:"Lesson slide progress",slideProgressGeneratingLabel:"Generating",interactionTexts:{title:"Submit the content below to continue.",confirmButtonText:"Submit",copyButtonText:"Copy",copiedButtonText:"Copied",dragHandleAriaLabel:"Move interaction"},playerTexts:{closeSettingsLabel:"Close settings",enterFullscreenLabel:"Enter fullscreen",exitFullscreenLabel:"Exit fullscreen",moreOptionsAriaLabel:"More options",nextLabel:"Next page",nextSubtitleLabel:"Next sentence",notesLabel:"Notes",pauseAutoplayLabel:"Pause autoplay",pauseLabel:"Pause",playAutoplayLabel:"Play autoplay",playLabel:"Play",playbackShortcutLabel:"Space",previousLabel:"Previous page",previousSubtitleLabel:"Previous sentence",screenModeLabel:"Screen mode",settingsTitle:"Settings",subtitleLabel:"Subtitles",subtitleToggleAriaLabel:"Toggle subtitles",volumeAriaLabel:"Volume",screenLabel:"Screen",nonFullscreenLabel:"Non-fullscreen",fullscreenLabel:"Fullscreen",fullscreenHintText:"Please rotate your screen for the best experience"}},"fr-FR":{bufferingText:{waitingForAudio:"En attente de l'audio de la diapositive actuelle...",loadingAudio:"Chargement audio...",waitingForMoreAudio:"En attente de plus d'audio..."},fullscreenBackAriaLabel:"Retour au mode non plein écran",slideProgressAriaLabel:"Progression des diapositives de la leçon",slideProgressGeneratingLabel:"Génération en cours",interactionTexts:{title:"Soumettez le contenu ci-dessous pour continuer.",confirmButtonText:"Soumettre",copyButtonText:"Copier",copiedButtonText:"Copié",dragHandleAriaLabel:"Déplacer le panneau d’interaction"},playerTexts:{closeSettingsLabel:"Fermer les paramètres",enterFullscreenLabel:"Passer en plein écran",exitFullscreenLabel:"Quitter le plein écran",moreOptionsAriaLabel:"Plus d'options",nextLabel:"Page suivante",nextSubtitleLabel:"Phrase suivante",notesLabel:"Notes",pauseAutoplayLabel:"Suspendre la lecture automatique",pauseLabel:"Pause",playAutoplayLabel:"Lancer la lecture automatique",playLabel:"Lecture",playbackShortcutLabel:"Barre d’espace",previousLabel:"Page précédente",previousSubtitleLabel:"Phrase précédente",screenModeLabel:"Mode d'affichage",settingsTitle:"Paramètres",subtitleLabel:"Sous-titres",subtitleToggleAriaLabel:"Afficher ou masquer les sous-titres",volumeAriaLabel:"Volume",screenLabel:"Écran",nonFullscreenLabel:"Hors plein écran",fullscreenLabel:"Plein écran",fullscreenHintText:"Veuillez tourner votre écran pour une meilleure expérience"}},"zh-CN":{bufferingText:{waitingForAudio:"正在等待当前页音频...",loadingAudio:"正在加载音频",waitingForMoreAudio:"正在等待音频"},fullscreenBackAriaLabel:"返回非全屏",slideProgressAriaLabel:"课程页面进度",slideProgressGeneratingLabel:"生成中",interactionTexts:{title:"提交下面的内容以继续",confirmButtonText:"提交",copyButtonText:"复制",copiedButtonText:"已复制",dragHandleAriaLabel:"移动交互面板"},playerTexts:{closeSettingsLabel:"关闭设置",enterFullscreenLabel:"进入全屏",exitFullscreenLabel:"退出全屏",moreOptionsAriaLabel:"更多选项",nextLabel:"下一页",nextSubtitleLabel:"下一句",notesLabel:"笔记",pauseAutoplayLabel:"暂停自动播放",pauseLabel:"暂停",playAutoplayLabel:"开始自动播放",playLabel:"播放",playbackShortcutLabel:"空格键",previousLabel:"上一页",previousSubtitleLabel:"上一句",screenModeLabel:"屏幕模式",settingsTitle:"设置",subtitleLabel:"字幕",subtitleToggleAriaLabel:"切换字幕",volumeAriaLabel:"音量",screenLabel:"屏幕",nonFullscreenLabel:"非全屏",fullscreenLabel:"全屏",fullscreenHintText:"请旋转屏幕以获得最佳体验"}},"ar-SA":{bufferingText:{waitingForAudio:"في انتظار صوت الشريحة الحالية...",loadingAudio:"جارٍ تحميل الصوت...",waitingForMoreAudio:"في انتظار المزيد من الصوت..."},fullscreenBackAriaLabel:"العودة إلى العرض العادي",slideProgressAriaLabel:"تقدم شرائح الدرس",slideProgressGeneratingLabel:"جارٍ الإنشاء",interactionTexts:{title:"أرسل المحتوى أدناه للمتابعة.",confirmButtonText:"إرسال",copyButtonText:"نسخ",copiedButtonText:"تم النسخ",dragHandleAriaLabel:"تحريك لوحة التفاعل"},playerTexts:{closeSettingsLabel:"إغلاق الإعدادات",enterFullscreenLabel:"الدخول إلى ملء الشاشة",exitFullscreenLabel:"الخروج من ملء الشاشة",moreOptionsAriaLabel:"مزيد من الخيارات",nextLabel:"الصفحة التالية",nextSubtitleLabel:"الجملة التالية",notesLabel:"الملاحظات",pauseAutoplayLabel:"إيقاف التشغيل التلقائي مؤقتًا",pauseLabel:"إيقاف مؤقت",playAutoplayLabel:"بدء التشغيل التلقائي",playLabel:"تشغيل",playbackShortcutLabel:"مفتاح المسافة",previousLabel:"الصفحة السابقة",previousSubtitleLabel:"الجملة السابقة",screenModeLabel:"وضع الشاشة",settingsTitle:"الإعدادات",subtitleLabel:"الترجمة النصية",subtitleToggleAriaLabel:"تبديل الترجمة النصية",volumeAriaLabel:"مستوى الصوت",screenLabel:"الشاشة",nonFullscreenLabel:"الوضع العادي",fullscreenLabel:"ملء الشاشة",fullscreenHintText:"يرجى تدوير الشاشة للحصول على أفضل تجربة"}},"th-TH":{bufferingText:{waitingForAudio:"กำลังรอเสียงของสไลด์ปัจจุบัน...",loadingAudio:"กำลังโหลดเสียง...",waitingForMoreAudio:"กำลังรอเสียงเพิ่มเติม..."},fullscreenBackAriaLabel:"กลับสู่โหมดปกติ",slideProgressAriaLabel:"ความคืบหน้าของสไลด์บทเรียน",slideProgressGeneratingLabel:"กำลังสร้าง",interactionTexts:{title:"ส่งเนื้อหาด้านล่างเพื่อดำเนินการต่อ",confirmButtonText:"ส่งคำตอบ",copyButtonText:"คัดลอก",copiedButtonText:"คัดลอกแล้ว",dragHandleAriaLabel:"ย้ายแผงโต้ตอบ"},playerTexts:{closeSettingsLabel:"ปิดการตั้งค่า",enterFullscreenLabel:"เข้าสู่โหมดเต็มหน้าจอ",exitFullscreenLabel:"ออกจากโหมดเต็มหน้าจอ",moreOptionsAriaLabel:"ตัวเลือกเพิ่มเติม",nextLabel:"หน้าถัดไป",nextSubtitleLabel:"ประโยคถัดไป",notesLabel:"บันทึกย่อ",pauseAutoplayLabel:"หยุดเล่นอัตโนมัติชั่วคราว",pauseLabel:"หยุดชั่วคราว",playAutoplayLabel:"เริ่มเล่นอัตโนมัติ",playLabel:"เล่น",playbackShortcutLabel:"แป้นเว้นวรรค",previousLabel:"หน้าก่อนหน้า",previousSubtitleLabel:"ประโยคก่อนหน้า",screenModeLabel:"โหมดหน้าจอ",settingsTitle:"การตั้งค่า",subtitleLabel:"คำบรรยาย",subtitleToggleAriaLabel:"สลับคำบรรยาย",volumeAriaLabel:"ระดับเสียง",screenLabel:"หน้าจอ",nonFullscreenLabel:"โหมดไม่เต็มหน้าจอ",fullscreenLabel:"เต็มหน้าจอ",fullscreenHintText:"โปรดหมุนหน้าจอเพื่อประสบการณ์การใช้งานที่ดีที่สุด"}},"es-ES":{bufferingText:{waitingForAudio:"Esperando el audio de la diapositiva actual...",loadingAudio:"Cargando audio...",waitingForMoreAudio:"Esperando más audio..."},fullscreenBackAriaLabel:"Volver a la vista normal",slideProgressAriaLabel:"Progreso de las diapositivas de la lección",slideProgressGeneratingLabel:"Generando",interactionTexts:{title:"Envía el contenido siguiente para continuar.",confirmButtonText:"Enviar",copyButtonText:"Copiar",copiedButtonText:"Copiado",dragHandleAriaLabel:"Mover el panel de interacción"},playerTexts:{closeSettingsLabel:"Cerrar ajustes",enterFullscreenLabel:"Entrar en pantalla completa",exitFullscreenLabel:"Salir de pantalla completa",moreOptionsAriaLabel:"Más opciones",nextLabel:"Página siguiente",nextSubtitleLabel:"Frase siguiente",notesLabel:"Notas",pauseAutoplayLabel:"Pausar la reproducción automática",pauseLabel:"Pausar",playAutoplayLabel:"Iniciar la reproducción automática",playLabel:"Reproducir",playbackShortcutLabel:"Barra espaciadora",previousLabel:"Página anterior",previousSubtitleLabel:"Frase anterior",screenModeLabel:"Modo de pantalla",settingsTitle:"Ajustes",subtitleLabel:"Subtítulos",subtitleToggleAriaLabel:"Mostrar u ocultar los subtítulos",volumeAriaLabel:"Volumen",screenLabel:"Pantalla",nonFullscreenLabel:"Vista normal",fullscreenLabel:"Pantalla completa",fullscreenHintText:"Gira la pantalla para disfrutar de una mejor experiencia"}}};exports.default=e;
|
|
2
2
|
//# sourceMappingURL=slide.json.cjs.map
|
|
@@ -208,6 +208,48 @@ declare const _default: {
|
|
|
208
208
|
"fullscreenLabel": "เต็มหน้าจอ",
|
|
209
209
|
"fullscreenHintText": "โปรดหมุนหน้าจอเพื่อประสบการณ์การใช้งานที่ดีที่สุด"
|
|
210
210
|
}
|
|
211
|
+
},
|
|
212
|
+
"es-ES": {
|
|
213
|
+
"bufferingText": {
|
|
214
|
+
"waitingForAudio": "Esperando el audio de la diapositiva actual...",
|
|
215
|
+
"loadingAudio": "Cargando audio...",
|
|
216
|
+
"waitingForMoreAudio": "Esperando más audio..."
|
|
217
|
+
},
|
|
218
|
+
"fullscreenBackAriaLabel": "Volver a la vista normal",
|
|
219
|
+
"slideProgressAriaLabel": "Progreso de las diapositivas de la lección",
|
|
220
|
+
"slideProgressGeneratingLabel": "Generando",
|
|
221
|
+
"interactionTexts": {
|
|
222
|
+
"title": "Envía el contenido siguiente para continuar.",
|
|
223
|
+
"confirmButtonText": "Enviar",
|
|
224
|
+
"copyButtonText": "Copiar",
|
|
225
|
+
"copiedButtonText": "Copiado",
|
|
226
|
+
"dragHandleAriaLabel": "Mover el panel de interacción"
|
|
227
|
+
},
|
|
228
|
+
"playerTexts": {
|
|
229
|
+
"closeSettingsLabel": "Cerrar ajustes",
|
|
230
|
+
"enterFullscreenLabel": "Entrar en pantalla completa",
|
|
231
|
+
"exitFullscreenLabel": "Salir de pantalla completa",
|
|
232
|
+
"moreOptionsAriaLabel": "Más opciones",
|
|
233
|
+
"nextLabel": "Página siguiente",
|
|
234
|
+
"nextSubtitleLabel": "Frase siguiente",
|
|
235
|
+
"notesLabel": "Notas",
|
|
236
|
+
"pauseAutoplayLabel": "Pausar la reproducción automática",
|
|
237
|
+
"pauseLabel": "Pausar",
|
|
238
|
+
"playAutoplayLabel": "Iniciar la reproducción automática",
|
|
239
|
+
"playLabel": "Reproducir",
|
|
240
|
+
"playbackShortcutLabel": "Barra espaciadora",
|
|
241
|
+
"previousLabel": "Página anterior",
|
|
242
|
+
"previousSubtitleLabel": "Frase anterior",
|
|
243
|
+
"screenModeLabel": "Modo de pantalla",
|
|
244
|
+
"settingsTitle": "Ajustes",
|
|
245
|
+
"subtitleLabel": "Subtítulos",
|
|
246
|
+
"subtitleToggleAriaLabel": "Mostrar u ocultar los subtítulos",
|
|
247
|
+
"volumeAriaLabel": "Volumen",
|
|
248
|
+
"screenLabel": "Pantalla",
|
|
249
|
+
"nonFullscreenLabel": "Vista normal",
|
|
250
|
+
"fullscreenLabel": "Pantalla completa",
|
|
251
|
+
"fullscreenHintText": "Gira la pantalla para disfrutar de una mejor experiencia"
|
|
252
|
+
}
|
|
211
253
|
}
|
|
212
254
|
}
|
|
213
255
|
;
|
|
@@ -3,7 +3,8 @@ const e = {
|
|
|
3
3
|
"fr-FR": { bufferingText: { waitingForAudio: "En attente de l'audio de la diapositive actuelle...", loadingAudio: "Chargement audio...", waitingForMoreAudio: "En attente de plus d'audio..." }, fullscreenBackAriaLabel: "Retour au mode non plein écran", slideProgressAriaLabel: "Progression des diapositives de la leçon", slideProgressGeneratingLabel: "Génération en cours", interactionTexts: { title: "Soumettez le contenu ci-dessous pour continuer.", confirmButtonText: "Soumettre", copyButtonText: "Copier", copiedButtonText: "Copié", dragHandleAriaLabel: "Déplacer le panneau d’interaction" }, playerTexts: { closeSettingsLabel: "Fermer les paramètres", enterFullscreenLabel: "Passer en plein écran", exitFullscreenLabel: "Quitter le plein écran", moreOptionsAriaLabel: "Plus d'options", nextLabel: "Page suivante", nextSubtitleLabel: "Phrase suivante", notesLabel: "Notes", pauseAutoplayLabel: "Suspendre la lecture automatique", pauseLabel: "Pause", playAutoplayLabel: "Lancer la lecture automatique", playLabel: "Lecture", playbackShortcutLabel: "Barre d’espace", previousLabel: "Page précédente", previousSubtitleLabel: "Phrase précédente", screenModeLabel: "Mode d'affichage", settingsTitle: "Paramètres", subtitleLabel: "Sous-titres", subtitleToggleAriaLabel: "Afficher ou masquer les sous-titres", volumeAriaLabel: "Volume", screenLabel: "Écran", nonFullscreenLabel: "Hors plein écran", fullscreenLabel: "Plein écran", fullscreenHintText: "Veuillez tourner votre écran pour une meilleure expérience" } },
|
|
4
4
|
"zh-CN": { bufferingText: { waitingForAudio: "正在等待当前页音频...", loadingAudio: "正在加载音频", waitingForMoreAudio: "正在等待音频" }, fullscreenBackAriaLabel: "返回非全屏", slideProgressAriaLabel: "课程页面进度", slideProgressGeneratingLabel: "生成中", interactionTexts: { title: "提交下面的内容以继续", confirmButtonText: "提交", copyButtonText: "复制", copiedButtonText: "已复制", dragHandleAriaLabel: "移动交互面板" }, playerTexts: { closeSettingsLabel: "关闭设置", enterFullscreenLabel: "进入全屏", exitFullscreenLabel: "退出全屏", moreOptionsAriaLabel: "更多选项", nextLabel: "下一页", nextSubtitleLabel: "下一句", notesLabel: "笔记", pauseAutoplayLabel: "暂停自动播放", pauseLabel: "暂停", playAutoplayLabel: "开始自动播放", playLabel: "播放", playbackShortcutLabel: "空格键", previousLabel: "上一页", previousSubtitleLabel: "上一句", screenModeLabel: "屏幕模式", settingsTitle: "设置", subtitleLabel: "字幕", subtitleToggleAriaLabel: "切换字幕", volumeAriaLabel: "音量", screenLabel: "屏幕", nonFullscreenLabel: "非全屏", fullscreenLabel: "全屏", fullscreenHintText: "请旋转屏幕以获得最佳体验" } },
|
|
5
5
|
"ar-SA": { bufferingText: { waitingForAudio: "في انتظار صوت الشريحة الحالية...", loadingAudio: "جارٍ تحميل الصوت...", waitingForMoreAudio: "في انتظار المزيد من الصوت..." }, fullscreenBackAriaLabel: "العودة إلى العرض العادي", slideProgressAriaLabel: "تقدم شرائح الدرس", slideProgressGeneratingLabel: "جارٍ الإنشاء", interactionTexts: { title: "أرسل المحتوى أدناه للمتابعة.", confirmButtonText: "إرسال", copyButtonText: "نسخ", copiedButtonText: "تم النسخ", dragHandleAriaLabel: "تحريك لوحة التفاعل" }, playerTexts: { closeSettingsLabel: "إغلاق الإعدادات", enterFullscreenLabel: "الدخول إلى ملء الشاشة", exitFullscreenLabel: "الخروج من ملء الشاشة", moreOptionsAriaLabel: "مزيد من الخيارات", nextLabel: "الصفحة التالية", nextSubtitleLabel: "الجملة التالية", notesLabel: "الملاحظات", pauseAutoplayLabel: "إيقاف التشغيل التلقائي مؤقتًا", pauseLabel: "إيقاف مؤقت", playAutoplayLabel: "بدء التشغيل التلقائي", playLabel: "تشغيل", playbackShortcutLabel: "مفتاح المسافة", previousLabel: "الصفحة السابقة", previousSubtitleLabel: "الجملة السابقة", screenModeLabel: "وضع الشاشة", settingsTitle: "الإعدادات", subtitleLabel: "الترجمة النصية", subtitleToggleAriaLabel: "تبديل الترجمة النصية", volumeAriaLabel: "مستوى الصوت", screenLabel: "الشاشة", nonFullscreenLabel: "الوضع العادي", fullscreenLabel: "ملء الشاشة", fullscreenHintText: "يرجى تدوير الشاشة للحصول على أفضل تجربة" } },
|
|
6
|
-
"th-TH": { bufferingText: { waitingForAudio: "กำลังรอเสียงของสไลด์ปัจจุบัน...", loadingAudio: "กำลังโหลดเสียง...", waitingForMoreAudio: "กำลังรอเสียงเพิ่มเติม..." }, fullscreenBackAriaLabel: "กลับสู่โหมดปกติ", slideProgressAriaLabel: "ความคืบหน้าของสไลด์บทเรียน", slideProgressGeneratingLabel: "กำลังสร้าง", interactionTexts: { title: "ส่งเนื้อหาด้านล่างเพื่อดำเนินการต่อ", confirmButtonText: "ส่งคำตอบ", copyButtonText: "คัดลอก", copiedButtonText: "คัดลอกแล้ว", dragHandleAriaLabel: "ย้ายแผงโต้ตอบ" }, playerTexts: { closeSettingsLabel: "ปิดการตั้งค่า", enterFullscreenLabel: "เข้าสู่โหมดเต็มหน้าจอ", exitFullscreenLabel: "ออกจากโหมดเต็มหน้าจอ", moreOptionsAriaLabel: "ตัวเลือกเพิ่มเติม", nextLabel: "หน้าถัดไป", nextSubtitleLabel: "ประโยคถัดไป", notesLabel: "บันทึกย่อ", pauseAutoplayLabel: "หยุดเล่นอัตโนมัติชั่วคราว", pauseLabel: "หยุดชั่วคราว", playAutoplayLabel: "เริ่มเล่นอัตโนมัติ", playLabel: "เล่น", playbackShortcutLabel: "แป้นเว้นวรรค", previousLabel: "หน้าก่อนหน้า", previousSubtitleLabel: "ประโยคก่อนหน้า", screenModeLabel: "โหมดหน้าจอ", settingsTitle: "การตั้งค่า", subtitleLabel: "คำบรรยาย", subtitleToggleAriaLabel: "สลับคำบรรยาย", volumeAriaLabel: "ระดับเสียง", screenLabel: "หน้าจอ", nonFullscreenLabel: "โหมดไม่เต็มหน้าจอ", fullscreenLabel: "เต็มหน้าจอ", fullscreenHintText: "โปรดหมุนหน้าจอเพื่อประสบการณ์การใช้งานที่ดีที่สุด" } }
|
|
6
|
+
"th-TH": { bufferingText: { waitingForAudio: "กำลังรอเสียงของสไลด์ปัจจุบัน...", loadingAudio: "กำลังโหลดเสียง...", waitingForMoreAudio: "กำลังรอเสียงเพิ่มเติม..." }, fullscreenBackAriaLabel: "กลับสู่โหมดปกติ", slideProgressAriaLabel: "ความคืบหน้าของสไลด์บทเรียน", slideProgressGeneratingLabel: "กำลังสร้าง", interactionTexts: { title: "ส่งเนื้อหาด้านล่างเพื่อดำเนินการต่อ", confirmButtonText: "ส่งคำตอบ", copyButtonText: "คัดลอก", copiedButtonText: "คัดลอกแล้ว", dragHandleAriaLabel: "ย้ายแผงโต้ตอบ" }, playerTexts: { closeSettingsLabel: "ปิดการตั้งค่า", enterFullscreenLabel: "เข้าสู่โหมดเต็มหน้าจอ", exitFullscreenLabel: "ออกจากโหมดเต็มหน้าจอ", moreOptionsAriaLabel: "ตัวเลือกเพิ่มเติม", nextLabel: "หน้าถัดไป", nextSubtitleLabel: "ประโยคถัดไป", notesLabel: "บันทึกย่อ", pauseAutoplayLabel: "หยุดเล่นอัตโนมัติชั่วคราว", pauseLabel: "หยุดชั่วคราว", playAutoplayLabel: "เริ่มเล่นอัตโนมัติ", playLabel: "เล่น", playbackShortcutLabel: "แป้นเว้นวรรค", previousLabel: "หน้าก่อนหน้า", previousSubtitleLabel: "ประโยคก่อนหน้า", screenModeLabel: "โหมดหน้าจอ", settingsTitle: "การตั้งค่า", subtitleLabel: "คำบรรยาย", subtitleToggleAriaLabel: "สลับคำบรรยาย", volumeAriaLabel: "ระดับเสียง", screenLabel: "หน้าจอ", nonFullscreenLabel: "โหมดไม่เต็มหน้าจอ", fullscreenLabel: "เต็มหน้าจอ", fullscreenHintText: "โปรดหมุนหน้าจอเพื่อประสบการณ์การใช้งานที่ดีที่สุด" } },
|
|
7
|
+
"es-ES": { bufferingText: { waitingForAudio: "Esperando el audio de la diapositiva actual...", loadingAudio: "Cargando audio...", waitingForMoreAudio: "Esperando más audio..." }, fullscreenBackAriaLabel: "Volver a la vista normal", slideProgressAriaLabel: "Progreso de las diapositivas de la lección", slideProgressGeneratingLabel: "Generando", interactionTexts: { title: "Envía el contenido siguiente para continuar.", confirmButtonText: "Enviar", copyButtonText: "Copiar", copiedButtonText: "Copiado", dragHandleAriaLabel: "Mover el panel de interacción" }, playerTexts: { closeSettingsLabel: "Cerrar ajustes", enterFullscreenLabel: "Entrar en pantalla completa", exitFullscreenLabel: "Salir de pantalla completa", moreOptionsAriaLabel: "Más opciones", nextLabel: "Página siguiente", nextSubtitleLabel: "Frase siguiente", notesLabel: "Notas", pauseAutoplayLabel: "Pausar la reproducción automática", pauseLabel: "Pausar", playAutoplayLabel: "Iniciar la reproducción automática", playLabel: "Reproducir", playbackShortcutLabel: "Barra espaciadora", previousLabel: "Página anterior", previousSubtitleLabel: "Frase anterior", screenModeLabel: "Modo de pantalla", settingsTitle: "Ajustes", subtitleLabel: "Subtítulos", subtitleToggleAriaLabel: "Mostrar u ocultar los subtítulos", volumeAriaLabel: "Volumen", screenLabel: "Pantalla", nonFullscreenLabel: "Vista normal", fullscreenLabel: "Pantalla completa", fullscreenHintText: "Gira la pantalla para disfrutar de una mejor experiencia" } }
|
|
7
8
|
};
|
|
8
9
|
export {
|
|
9
10
|
e as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slide.json.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slide.json.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),d=require("react"),u=require("../../../node_modules/rc-textarea/es/TextArea.cjs");require("../../../_virtual/
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),d=require("react"),u=require("../../../node_modules/rc-textarea/es/TextArea.cjs");require("../../../_virtual/index3.cjs");require("../../../node_modules/rc-resize-observer/es/index.cjs");require("../../../node_modules/rc-util/es/hooks/useLayoutEffect.cjs");require("../../../node_modules/rc-util/es/raf.cjs");const s=require("../../../lib/utils.cjs");function c(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const l=c(d),i=l.forwardRef(({className:e,autoSize:t={minRows:1},style:r,...a},n)=>o.jsx(u.default,{ref:n,autoSize:t,className:s.cn("border-input placeholder:text-muted-foreground aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 w-full rounded-md border bg-transparent pl-3 py-1.5 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:cursor-not-allowed disabled:opacity-50","resize-none",e),style:{whiteSpace:"pre-wrap",wordBreak:"break-word",...r},...a}));i.displayName="Textarea";exports.Textarea=i;
|
|
2
2
|
//# sourceMappingURL=textarea.cjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as i } from "react/jsx-runtime";
|
|
2
2
|
import * as d from "react";
|
|
3
3
|
import n from "../../../node_modules/rc-textarea/es/TextArea.es.js";
|
|
4
|
-
import "../../../_virtual/index.
|
|
4
|
+
import "../../../_virtual/index.es3.js";
|
|
5
5
|
import "../../../node_modules/rc-resize-observer/es/index.es.js";
|
|
6
6
|
import "../../../node_modules/rc-util/es/hooks/useLayoutEffect.es.js";
|
|
7
7
|
import "../../../node_modules/rc-util/es/raf.es.js";
|