kindy-editor 3.2.7 → 3.2.9
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-lib/assets/{worker-pUzyeoiR.js → worker-Du8hmveE.js} +2232 -2218
- package/dist-lib/builder.js +4 -4
- package/dist-lib/events.js +9 -120
- package/dist-lib/export.js +7 -7
- package/dist-lib/generate-toc.js +3 -3
- package/dist-lib/import.js +2 -2
- package/dist-lib/index-D5dkvB0x.js +490 -0
- package/dist-lib/{editorApp-BtDzRfJq.js → kindy-editor-Bo4FnkLV.js} +13102 -10850
- package/dist-lib/kindy-editor.js +4 -4
- package/dist-lib/measure.js +3 -4
- package/dist-lib/{measureHost-CpqJsipA.js → measureHost-BG9FPivu.js} +17 -18
- package/dist-lib/{paintStyle-Cb7IGKPW.js → metrics-D7Ma2xlj.js} +175 -148
- package/dist-lib/{parse-CpGoMQ_v.js → parse-BsUkqk-n.js} +3 -3
- package/dist-lib/{pipeline-CCwWMjhw.js → pipeline-CX_Hc5BD.js} +1 -1
- package/dist-lib/{qrcode-BCaJLV1G.js → qrcode--5MhVNEZ.js} +1 -1
- package/dist-lib/{qrcode-B-JKix2T.js → qrcode-CR8i1-w0.js} +6 -6
- package/dist-lib/recalc-docx.js +1 -1
- package/dist-lib/{recalcToc-CaiTn2IJ.js → recalcToc-zAFS4S6S.js} +755 -742
- package/dist-lib/{stylesheet-BPIJJMlK.js → stylesheet-BfxJTGA5.js} +1 -1
- package/dist-lib/{webmcp-B0swfp0T.js → webmcp-CpWvhcrz.js} +2 -2
- package/docs/table-editing.md +14 -1
- package/docs/table-form-integration.md +50 -1
- package/package.json +1 -1
- package/types/kindy-editor.d.ts +4 -0
- package/dist-lib/changeAggregator-DEuynIcV.js +0 -376
- package/dist-lib/kindy-editor---oVGhZU.js +0 -2190
- package/dist-lib/metrics-CdfHD-8y.js +0 -31
|
@@ -1,2190 +0,0 @@
|
|
|
1
|
-
import "./qrcode-B-JKix2T.js";
|
|
2
|
-
import { m as x } from "./stylesheet-BPIJJMlK.js";
|
|
3
|
-
import { H as m, A as f, C as v, b as y, I as w, T as C, F as T, d as S, e as L, E as D, D as A } from "./paintStyle-Cb7IGKPW.js";
|
|
4
|
-
import { E as P } from "./changeAggregator-DEuynIcV.js";
|
|
5
|
-
const z = 1.1, B = 0.25, R = 5, M = 36, c = {
|
|
6
|
-
canvasBackground: "#e8eaed",
|
|
7
|
-
grid: A,
|
|
8
|
-
gridMesh: "rgba(0,0,0,0.08)",
|
|
9
|
-
externalLink: D,
|
|
10
|
-
accent: L,
|
|
11
|
-
footnoteRule: S,
|
|
12
|
-
formattingMark: T,
|
|
13
|
-
tocLeader: C,
|
|
14
|
-
imagePlaceholder: w,
|
|
15
|
-
columnSeparator: y,
|
|
16
|
-
caret: "#1a1a2e",
|
|
17
|
-
searchHighlight: "rgba(251, 188, 4, 0.45)",
|
|
18
|
-
reviewPinResolved: "#9aa0a6",
|
|
19
|
-
reviewPinStroke: "#fff",
|
|
20
|
-
pageGapPx: 24,
|
|
21
|
-
ruler: {
|
|
22
|
-
bg: "#c7cdd6",
|
|
23
|
-
content: "#ffffff",
|
|
24
|
-
line: "#8a8f98",
|
|
25
|
-
label: "#605e5c",
|
|
26
|
-
font: "9px 'Segoe UI', sans-serif"
|
|
27
|
-
}
|
|
28
|
-
}, g = {
|
|
29
|
-
zoomStep: z,
|
|
30
|
-
zoomMin: B,
|
|
31
|
-
zoomMax: R,
|
|
32
|
-
indentStepPx: M,
|
|
33
|
-
gridSpacingPx: 24
|
|
34
|
-
}, q = {
|
|
35
|
-
canvasBackground: "#202124",
|
|
36
|
-
ruler: { bg: "#2a2d31", content: "#3c4043", line: "#5f6368", label: "#bdc1c6" }
|
|
37
|
-
};
|
|
38
|
-
function E(r) {
|
|
39
|
-
return r ? {
|
|
40
|
-
...c,
|
|
41
|
-
...l(r),
|
|
42
|
-
ruler: { ...c.ruler, ...r.ruler ? l(r.ruler) : {} }
|
|
43
|
-
} : c;
|
|
44
|
-
}
|
|
45
|
-
function F(r) {
|
|
46
|
-
return r ? { ...g, ...l(r) } : g;
|
|
47
|
-
}
|
|
48
|
-
function I(r) {
|
|
49
|
-
return r ? {
|
|
50
|
-
disableBuiltin: r.disableBuiltin ? [...r.disableBuiltin] : [],
|
|
51
|
-
fonts: r.fonts ? r.fonts.map((e) => ({ ...e, faces: { ...e.faces }, sizing: { ...e.sizing } })) : [],
|
|
52
|
-
...r.baseUrl ? { baseUrl: r.baseUrl } : {},
|
|
53
|
-
...r.manifests ? { manifests: r.manifests.map((e) => typeof e == "string" ? { url: e } : { ...e }) } : {},
|
|
54
|
-
...r.loader ? { loader: r.loader } : {}
|
|
55
|
-
} : { disableBuiltin: [], fonts: [] };
|
|
56
|
-
}
|
|
57
|
-
function Q(r = {}) {
|
|
58
|
-
const e = r.overrideDefaultStyles ? l(r.overrideDefaultStyles) : {};
|
|
59
|
-
return {
|
|
60
|
-
theme: E(r.theme),
|
|
61
|
-
behavior: F(r.behavior),
|
|
62
|
-
typography: e,
|
|
63
|
-
stylesheet: x(e),
|
|
64
|
-
fonts: I(r.fonts),
|
|
65
|
-
cjk: N(r.cjk),
|
|
66
|
-
develop: r.develop ?? !1
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
function N(r) {
|
|
70
|
-
const e = r ? l(r) : {};
|
|
71
|
-
return {
|
|
72
|
-
...e,
|
|
73
|
-
fallbackFont: e.fallbackFont ?? v,
|
|
74
|
-
arabicFallbackFont: e.arabicFallbackFont ?? f,
|
|
75
|
-
hebrewFallbackFont: e.hebrewFallbackFont ?? m
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
function l(r) {
|
|
79
|
-
const e = {};
|
|
80
|
-
for (const [t, o] of Object.entries(r)) o !== void 0 && (e[t] = o);
|
|
81
|
-
return e;
|
|
82
|
-
}
|
|
83
|
-
const O = "kindy-editor-styles", H = `
|
|
84
|
-
/* ===== Design tokens (Office 365 / Fluent-inspired palette) ========= */
|
|
85
|
-
.kindy-editor-root {
|
|
86
|
-
/* Brand blues */
|
|
87
|
-
--ked-blue: #2b579a;
|
|
88
|
-
--ked-blue-dark: #1e3f73;
|
|
89
|
-
--ked-blue-mid: #3a6bbf;
|
|
90
|
-
--ked-blue-light: #dce9f8;
|
|
91
|
-
--ked-blue-xlight: #eef4fc;
|
|
92
|
-
|
|
93
|
-
/* Neutrals */
|
|
94
|
-
--ked-bg: #f5f4f2;
|
|
95
|
-
--ked-surface: #ffffff;
|
|
96
|
-
--ked-border: #dedad8;
|
|
97
|
-
--ked-border-mid: #c8c6c4;
|
|
98
|
-
--ked-hover: #e9e7e5;
|
|
99
|
-
--ked-active: #d8d6d3;
|
|
100
|
-
--ked-canvas: #e4e6eb;
|
|
101
|
-
|
|
102
|
-
/* Text */
|
|
103
|
-
--ked-text: #201f1e;
|
|
104
|
-
--ked-text-muted: #605e5c;
|
|
105
|
-
--ked-text-subtle: #8a8886;
|
|
106
|
-
|
|
107
|
-
/* Semantic */
|
|
108
|
-
--ked-accent-btn: #cfe3fb;
|
|
109
|
-
--ked-accent-text: #0b57d0;
|
|
110
|
-
--ked-accent-bdr: #a8ccf0;
|
|
111
|
-
--ked-danger: #a4262c;
|
|
112
|
-
--ked-success: #107c41;
|
|
113
|
-
|
|
114
|
-
/* Shadow */
|
|
115
|
-
--ked-shadow-sm: 0 1px 3px rgba(0,0,0,.10), 0 1px 2px rgba(0,0,0,.06);
|
|
116
|
-
--ked-shadow-md: 0 4px 12px rgba(0,0,0,.12), 0 2px 4px rgba(0,0,0,.07);
|
|
117
|
-
--ked-shadow-lg: 0 8px 28px rgba(0,0,0,.16), 0 3px 8px rgba(0,0,0,.08);
|
|
118
|
-
|
|
119
|
-
/* Transitions */
|
|
120
|
-
--ked-t-fast: 80ms ease;
|
|
121
|
-
--ked-t-base: 140ms ease;
|
|
122
|
-
|
|
123
|
-
display: flex; flex-direction: column; height: 100%; min-height: 0; overflow-x: hidden;
|
|
124
|
-
font-family: "Segoe UI", system-ui, -apple-system, Roboto, "Helvetica Neue", Arial, sans-serif;
|
|
125
|
-
color: var(--ked-text);
|
|
126
|
-
font-size: 13px;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/* ===== Word-style ribbon ============================================ */
|
|
130
|
-
.ked-toolbar {
|
|
131
|
-
flex: 0 0 auto; display: flex; flex-direction: column;
|
|
132
|
-
background: var(--ked-bg);
|
|
133
|
-
border-bottom: 1px solid var(--ked-border);
|
|
134
|
-
user-select: none;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/* --- tab strip --- */
|
|
138
|
-
.rib-tabs {
|
|
139
|
-
display: flex; align-items: flex-end; gap: 1px; height: 34px;
|
|
140
|
-
padding: 4px 8px 0;
|
|
141
|
-
background: linear-gradient(180deg, var(--ked-blue) 0%, #23498a 100%);
|
|
142
|
-
}
|
|
143
|
-
/* Tab buttons scroll horizontally on overflow; the right-side cluster
|
|
144
|
-
(.ked-header-review + collapse chevron) stays pinned as siblings of .rib-tabs. */
|
|
145
|
-
.rib-tab-scroll {
|
|
146
|
-
flex: 1 1 auto; min-width: 0; display: flex; align-items: flex-end; gap: 1px;
|
|
147
|
-
overflow-x: auto; overflow-y: hidden; flex-wrap: nowrap; scrollbar-width: none;
|
|
148
|
-
}
|
|
149
|
-
.rib-tab-scroll::-webkit-scrollbar { display: none; }
|
|
150
|
-
.rib-tab {
|
|
151
|
-
flex: 0 0 auto;
|
|
152
|
-
border: none; background: transparent; cursor: pointer;
|
|
153
|
-
font: inherit; font-size: 13px; color: rgba(255,255,255,0.82);
|
|
154
|
-
padding: 5px 13px 7px; border-radius: 4px 4px 0 0; position: relative;
|
|
155
|
-
transition: color var(--ked-t-fast), background var(--ked-t-fast);
|
|
156
|
-
letter-spacing: 0.01em;
|
|
157
|
-
}
|
|
158
|
-
.rib-tab:hover { color: #fff; background: rgba(255,255,255,0.12); }
|
|
159
|
-
.rib-tab.active {
|
|
160
|
-
background: var(--ked-surface); color: var(--ked-blue); font-weight: 600;
|
|
161
|
-
box-shadow: 0 -1px 3px rgba(0,0,0,0.08), 1px 0 0 var(--ked-border), -1px 0 0 var(--ked-border);
|
|
162
|
-
}
|
|
163
|
-
.rib-tab.active::after {
|
|
164
|
-
content: ""; position: absolute; left: 8px; right: 8px; top: 0;
|
|
165
|
-
height: 2.5px; background: var(--ked-blue-mid); border-radius: 0 0 2px 2px;
|
|
166
|
-
top: auto; bottom: 0; /* indicator at bottom in active state */
|
|
167
|
-
}
|
|
168
|
-
.rib-tab.file {
|
|
169
|
-
background: rgba(0,0,0,0.25); color: #fff; font-weight: 700;
|
|
170
|
-
border-radius: 4px 4px 0 0; letter-spacing: 0.02em;
|
|
171
|
-
}
|
|
172
|
-
.rib-tab.file:hover { background: rgba(0,0,0,0.38); }
|
|
173
|
-
|
|
174
|
-
/* review controls docked in the ribbon header (right of the tab strip) */
|
|
175
|
-
.ked-header-review { margin-left: auto; display: flex; align-items: center; gap: 6px; padding-bottom: 4px; }
|
|
176
|
-
.ked-mode-select {
|
|
177
|
-
height: 26px; border: 1px solid rgba(255,255,255,0.35); border-radius: 5px;
|
|
178
|
-
background: rgba(255,255,255,0.12);
|
|
179
|
-
font: inherit; font-size: 12px; color: #fff; padding: 0 6px; cursor: pointer;
|
|
180
|
-
transition: border-color var(--ked-t-fast), background var(--ked-t-fast);
|
|
181
|
-
}
|
|
182
|
-
.ked-mode-select:hover { border-color: rgba(255,255,255,0.6); background: rgba(255,255,255,0.2); }
|
|
183
|
-
.ked-mode-select option { color: var(--ked-text); background: var(--ked-surface); }
|
|
184
|
-
.ked-header-btn {
|
|
185
|
-
height: 26px; border: 1px solid rgba(255,255,255,0.35); border-radius: 5px;
|
|
186
|
-
background: rgba(255,255,255,0.12); cursor: pointer;
|
|
187
|
-
font: inherit; font-size: 12px; font-weight: 600; color: #fff; padding: 0 12px;
|
|
188
|
-
display: inline-flex; align-items: center; gap: 5px;
|
|
189
|
-
transition: border-color var(--ked-t-fast), background var(--ked-t-fast);
|
|
190
|
-
}
|
|
191
|
-
.ked-header-btn[hidden], .ked-review-head .ked-btn[hidden] { display: none; }
|
|
192
|
-
.ked-header-btn:hover { background: rgba(255,255,255,0.22); border-color: rgba(255,255,255,0.55); }
|
|
193
|
-
.ked-header-btn.active {
|
|
194
|
-
background: rgba(255,255,255,0.92); color: var(--ked-blue); border-color: transparent;
|
|
195
|
-
box-shadow: var(--ked-shadow-sm);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/* --- ribbon body: one panel visible at a time --- */
|
|
199
|
-
.rib-bodies {
|
|
200
|
-
background: var(--ked-surface);
|
|
201
|
-
border-bottom: 1px solid var(--ked-border);
|
|
202
|
-
box-shadow: 0 1px 0 rgba(0,0,0,0.04);
|
|
203
|
-
}
|
|
204
|
-
.rib-panel { display: none; align-items: stretch; min-height: 90px; padding: 0 4px; }
|
|
205
|
-
.rib-panel.active { display: flex; }
|
|
206
|
-
|
|
207
|
-
/* --- group: stacked controls + caption, divider on the right --- */
|
|
208
|
-
.rib-group {
|
|
209
|
-
display: flex; flex-direction: column; align-items: center;
|
|
210
|
-
padding: 5px 8px 3px; position: relative;
|
|
211
|
-
}
|
|
212
|
-
.rib-group + .rib-group::before {
|
|
213
|
-
content: ""; position: absolute; left: 0; top: 10px; bottom: 10px;
|
|
214
|
-
width: 1px;
|
|
215
|
-
background: linear-gradient(180deg, transparent, var(--ked-border) 20%, var(--ked-border) 80%, transparent);
|
|
216
|
-
}
|
|
217
|
-
.rib-controls { display: flex; align-items: center; gap: 2px; flex: 1; }
|
|
218
|
-
/* two stacked rows (Font, Paragraph) */
|
|
219
|
-
.rib-rows { display: flex; flex-direction: column; gap: 3px; flex: 1; justify-content: center; }
|
|
220
|
-
.rib-row { display: flex; align-items: center; gap: 2px; }
|
|
221
|
-
.rib-label {
|
|
222
|
-
font-size: 10.5px; color: var(--ked-text-subtle); padding-top: 3px; white-space: nowrap;
|
|
223
|
-
letter-spacing: 0.01em;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/* --- buttons --- */
|
|
227
|
-
.ked-toolbar button.rib-btn {
|
|
228
|
-
min-width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center;
|
|
229
|
-
border: 1px solid transparent; border-radius: 5px; background: transparent; cursor: pointer;
|
|
230
|
-
color: var(--ked-text); font-size: 13px; padding: 0 4px; gap: 1px;
|
|
231
|
-
transition: background var(--ked-t-fast), border-color var(--ked-t-fast), color var(--ked-t-fast);
|
|
232
|
-
}
|
|
233
|
-
.ked-toolbar button.rib-btn:hover {
|
|
234
|
-
background: var(--ked-hover);
|
|
235
|
-
border-color: var(--ked-border);
|
|
236
|
-
}
|
|
237
|
-
.ked-toolbar button.rib-btn:active {
|
|
238
|
-
background: var(--ked-active);
|
|
239
|
-
transform: scale(0.97);
|
|
240
|
-
}
|
|
241
|
-
.ked-toolbar button.rib-btn.active {
|
|
242
|
-
background: var(--ked-accent-btn);
|
|
243
|
-
color: var(--ked-accent-text);
|
|
244
|
-
border-color: var(--ked-accent-bdr);
|
|
245
|
-
}
|
|
246
|
-
.ked-toolbar button.rib-btn.active:hover { background: #b8d5f7; }
|
|
247
|
-
.ked-toolbar button.rib-btn.active svg { color: var(--ked-accent-text); }
|
|
248
|
-
.ked-toolbar button.rib-btn svg { width: 16px; height: 16px; display: block; }
|
|
249
|
-
.ked-toolbar button.rib-btn .caret { width: 8px; height: 8px; }
|
|
250
|
-
|
|
251
|
-
/* large button (Paste): icon over caption */
|
|
252
|
-
.ked-toolbar button.rib-big {
|
|
253
|
-
flex-direction: column; height: 100%; min-width: 52px; padding: 5px 7px; gap: 2px; justify-content: center;
|
|
254
|
-
}
|
|
255
|
-
.ked-toolbar button.rib-big svg { width: 28px; height: 28px; }
|
|
256
|
-
.ked-toolbar button.rib-big .big-cap { font-size: 11px; display: flex; align-items: center; gap: 1px; }
|
|
257
|
-
|
|
258
|
-
/* swatch button: icon row + colour underline */
|
|
259
|
-
.ked-toolbar button.rib-swatch { flex-direction: column; gap: 0; padding: 2px 3px; }
|
|
260
|
-
.ked-toolbar button.rib-swatch .row { display: flex; align-items: center; gap: 1px; }
|
|
261
|
-
.ked-toolbar button.rib-swatch .bar { width: 18px; height: 3px; margin-top: 1px; border-radius: 1px; }
|
|
262
|
-
|
|
263
|
-
/* disabled stub (feature not supported by the engine yet) */
|
|
264
|
-
.ked-toolbar button.rib-btn:disabled { opacity: 0.35; cursor: default; }
|
|
265
|
-
.ked-toolbar button.rib-btn:disabled:hover { background: transparent; border-color: transparent; transform: none; }
|
|
266
|
-
|
|
267
|
-
/* form controls */
|
|
268
|
-
.ked-toolbar select, .ked-toolbar input[type="number"] {
|
|
269
|
-
height: 25px; border: 1px solid var(--ked-border-mid); border-radius: 4px;
|
|
270
|
-
background: var(--ked-surface);
|
|
271
|
-
font: inherit; font-size: 12.5px; color: var(--ked-text);
|
|
272
|
-
transition: border-color var(--ked-t-fast);
|
|
273
|
-
}
|
|
274
|
-
.ked-toolbar select:hover, .ked-toolbar input[type="number"]:hover {
|
|
275
|
-
border-color: var(--ked-text-subtle);
|
|
276
|
-
}
|
|
277
|
-
.ked-toolbar select:focus, .ked-toolbar input[type="number"]:focus {
|
|
278
|
-
outline: 2px solid var(--ked-blue-light);
|
|
279
|
-
border-color: var(--ked-blue);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/* styles gallery */
|
|
283
|
-
.rib-gallery {
|
|
284
|
-
display: flex; align-items: center; gap: 4px; height: 64px; padding: 0 4px;
|
|
285
|
-
border: 1px solid var(--ked-border-mid); border-radius: 5px;
|
|
286
|
-
background: var(--ked-surface);
|
|
287
|
-
overflow-x: auto; max-width: 340px;
|
|
288
|
-
box-shadow: inset 0 1px 2px rgba(0,0,0,.04);
|
|
289
|
-
}
|
|
290
|
-
.rib-gallery::-webkit-scrollbar { height: 6px; }
|
|
291
|
-
.rib-gallery::-webkit-scrollbar-thumb { background: var(--ked-border-mid); border-radius: 3px; }
|
|
292
|
-
.style-card {
|
|
293
|
-
flex: 0 0 auto; width: 76px; height: 52px; border: 1px solid var(--ked-border); border-radius: 4px;
|
|
294
|
-
background: var(--ked-surface); cursor: pointer; display: flex; flex-direction: column;
|
|
295
|
-
align-items: center; justify-content: center; gap: 3px; padding: 2px;
|
|
296
|
-
transition: border-color var(--ked-t-fast), background var(--ked-t-fast), box-shadow var(--ked-t-fast);
|
|
297
|
-
}
|
|
298
|
-
.style-card:hover { border-color: var(--ked-blue); background: var(--ked-blue-xlight); }
|
|
299
|
-
.style-card.active {
|
|
300
|
-
border-color: var(--ked-blue); box-shadow: inset 0 0 0 1px var(--ked-blue);
|
|
301
|
-
background: var(--ked-blue-xlight);
|
|
302
|
-
}
|
|
303
|
-
.style-card .preview { font-size: 13px; line-height: 1; color: var(--ked-text); }
|
|
304
|
-
.style-card .name { font-size: 10px; color: var(--ked-text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 72px; }
|
|
305
|
-
|
|
306
|
-
/* work area: optional outline drawer + ruler + the scrolling page canvas */
|
|
307
|
-
.ked-workarea { flex: 1 1 auto; min-height: 0; display: flex; }
|
|
308
|
-
.ked-editorpane { flex: 1 1 auto; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
|
|
309
|
-
/* touch-action: keep one/two-finger PAN (scroll) but disable the browser's
|
|
310
|
-
native pinch-zoom and double-tap-zoom on the document, so our own
|
|
311
|
-
pinch-to-zoom handler (index.ts) owns those gestures. The toolbar/status bar
|
|
312
|
-
keep default touch-action so the ribbon scrolls and taps normally. */
|
|
313
|
-
.ked-app {
|
|
314
|
-
flex: 1 1 auto; min-height: 0; min-width: 0; overflow: auto;
|
|
315
|
-
background: var(--ked-canvas);
|
|
316
|
-
position: relative; touch-action: pan-x pan-y;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/* ruler row: top-left corner spacer (over the vertical ruler) + horizontal ruler */
|
|
320
|
-
.ked-ruler-row { flex: 0 0 22px; display: flex; }
|
|
321
|
-
.ked-ruler-row.hidden { display: none; }
|
|
322
|
-
.ked-ruler-corner {
|
|
323
|
-
flex: 0 0 22px; width: 22px;
|
|
324
|
-
background: var(--ked-canvas);
|
|
325
|
-
border-bottom: 1px solid var(--ked-border); border-right: 1px solid var(--ked-border);
|
|
326
|
-
}
|
|
327
|
-
.ked-ruler-corner.hidden { display: none; }
|
|
328
|
-
.ked-main-row { flex: 1 1 auto; min-height: 0; min-width: 0; display: flex; }
|
|
329
|
-
/* horizontal ruler (inch ticks, margin shading, draggable indent markers) */
|
|
330
|
-
.ked-ruler {
|
|
331
|
-
flex: 1 1 auto; height: 22px; position: relative;
|
|
332
|
-
background: var(--ked-canvas);
|
|
333
|
-
border-bottom: 1px solid var(--ked-border); overflow: hidden;
|
|
334
|
-
}
|
|
335
|
-
.ked-ruler.hidden { display: none; }
|
|
336
|
-
.ked-ruler canvas { position: absolute; inset: 0; }
|
|
337
|
-
/* vertical ruler (inch ticks + top/bottom margin shading down the left edge) */
|
|
338
|
-
.ked-vruler {
|
|
339
|
-
flex: 0 0 22px; width: 22px; position: relative;
|
|
340
|
-
background: var(--ked-canvas);
|
|
341
|
-
border-right: 1px solid var(--ked-border); overflow: hidden;
|
|
342
|
-
}
|
|
343
|
-
.ked-vruler.hidden { display: none; }
|
|
344
|
-
.ked-vruler canvas { position: absolute; inset: 0; }
|
|
345
|
-
/* margin handles: right-pointing triangles at the top/bottom content boundaries */
|
|
346
|
-
.ked-vruler .vruler-marker { position: absolute; left: 0; width: 0; height: 0; cursor: ns-resize; z-index: 2; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 7px solid var(--ked-blue); }
|
|
347
|
-
.ked-ruler .ruler-marker { position: absolute; width: 0; height: 0; cursor: ew-resize; z-index: 2; }
|
|
348
|
-
/* left-indent: bottom-pointing triangle sitting on the baseline */
|
|
349
|
-
.ked-ruler .ruler-left { bottom: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 7px solid var(--ked-blue); }
|
|
350
|
-
/* first-line-indent: top-pointing triangle */
|
|
351
|
-
.ked-ruler .ruler-first { top: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 7px solid var(--ked-blue); }
|
|
352
|
-
|
|
353
|
-
/* ===== Outline / Navigation drawer ================================== */
|
|
354
|
-
.ked-outline {
|
|
355
|
-
flex: 0 0 264px; width: 264px; min-height: 0; overflow-y: auto;
|
|
356
|
-
background: var(--ked-surface);
|
|
357
|
-
border-right: 1px solid var(--ked-border); display: none;
|
|
358
|
-
}
|
|
359
|
-
.ked-outline.open { display: block; }
|
|
360
|
-
.ked-outline .outline-head {
|
|
361
|
-
position: sticky; top: 0; background: var(--ked-surface); z-index: 1;
|
|
362
|
-
display: flex; align-items: center; justify-content: space-between;
|
|
363
|
-
padding: 10px 8px 10px 14px; border-bottom: 1px solid var(--ked-border);
|
|
364
|
-
font-size: 13px; font-weight: 600; color: var(--ked-text);
|
|
365
|
-
box-shadow: 0 1px 3px rgba(0,0,0,.05);
|
|
366
|
-
}
|
|
367
|
-
.ked-outline .outline-head button {
|
|
368
|
-
border: none; background: transparent; cursor: pointer; color: var(--ked-text-muted);
|
|
369
|
-
width: 26px; height: 26px; border-radius: 5px; font-size: 17px; line-height: 1;
|
|
370
|
-
transition: background var(--ked-t-fast), color var(--ked-t-fast);
|
|
371
|
-
}
|
|
372
|
-
.ked-outline .outline-head button:hover { background: var(--ked-hover); color: var(--ked-text); }
|
|
373
|
-
.ked-outline-list { padding: 4px 0 12px; }
|
|
374
|
-
.outline-item {
|
|
375
|
-
display: block; width: 100%; box-sizing: border-box; text-align: left;
|
|
376
|
-
border: none; border-left: 3px solid transparent; background: transparent; cursor: pointer;
|
|
377
|
-
padding: 5px 12px; color: var(--ked-text); font-size: 13px; line-height: 1.35;
|
|
378
|
-
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
|
|
379
|
-
transition: background var(--ked-t-fast), color var(--ked-t-fast), border-color var(--ked-t-fast);
|
|
380
|
-
}
|
|
381
|
-
.outline-item:hover { background: var(--ked-hover); }
|
|
382
|
-
.outline-item.active {
|
|
383
|
-
background: var(--ked-blue-xlight);
|
|
384
|
-
border-left-color: var(--ked-blue);
|
|
385
|
-
color: var(--ked-blue); font-weight: 600;
|
|
386
|
-
}
|
|
387
|
-
.outline-empty { padding: 16px 14px; color: var(--ked-text-subtle); font-size: 12px; line-height: 1.5; }
|
|
388
|
-
|
|
389
|
-
/* ===== Review pane (track changes + comments) ======================= */
|
|
390
|
-
.ked-review {
|
|
391
|
-
flex: 0 0 320px; width: 320px; min-height: 0; display: none;
|
|
392
|
-
flex-direction: column; background: #f7f8fa; border-left: 1px solid var(--ked-border);
|
|
393
|
-
font-size: 13px; color: #202124;
|
|
394
|
-
}
|
|
395
|
-
.ked-review.open { display: flex; }
|
|
396
|
-
.ked-review-head {
|
|
397
|
-
display: flex; align-items: center; gap: 8px;
|
|
398
|
-
padding: 10px 10px 10px 14px; background: var(--ked-surface);
|
|
399
|
-
border-bottom: 1px solid var(--ked-border);
|
|
400
|
-
box-shadow: 0 1px 3px rgba(0,0,0,.05);
|
|
401
|
-
}
|
|
402
|
-
.ked-review-head .ked-review-title { font-size: 14px; font-weight: 600; color: #202124; }
|
|
403
|
-
.ked-review-head .ked-review-title + .ked-btn { margin-left: auto; }
|
|
404
|
-
.ked-review-head .ked-review-close {
|
|
405
|
-
margin-left: 0; border: none; background: transparent; cursor: pointer;
|
|
406
|
-
color: #5f6368; width: 28px; height: 28px; border-radius: 50%; font-size: 18px; line-height: 1;
|
|
407
|
-
transition: background var(--ked-t-fast);
|
|
408
|
-
}
|
|
409
|
-
.ked-review-head .ked-review-close:hover { background: #f1f3f4; }
|
|
410
|
-
/* tab strip */
|
|
411
|
-
.ked-review-tabs {
|
|
412
|
-
display: flex; background: var(--ked-surface);
|
|
413
|
-
border-bottom: 1px solid var(--ked-border); padding: 0 8px;
|
|
414
|
-
}
|
|
415
|
-
.ked-review-tab {
|
|
416
|
-
flex: 1 1 0; border: none; background: transparent; cursor: pointer;
|
|
417
|
-
padding: 9px 4px 8px; font-size: 13px; font-weight: 600; color: #5f6368;
|
|
418
|
-
border-bottom: 2px solid transparent;
|
|
419
|
-
display: flex; align-items: center; justify-content: center; gap: 6px;
|
|
420
|
-
transition: color var(--ked-t-fast);
|
|
421
|
-
}
|
|
422
|
-
.ked-review-tab:hover { color: #202124; }
|
|
423
|
-
.ked-review-tab.active { color: var(--ked-blue); border-bottom-color: var(--ked-blue); }
|
|
424
|
-
.ked-review-tab .ked-pill {
|
|
425
|
-
background: #e8eaed; color: #5f6368; border-radius: 10px; padding: 0 7px;
|
|
426
|
-
font-size: 11px; font-weight: 700; min-width: 18px; text-align: center;
|
|
427
|
-
}
|
|
428
|
-
.ked-review-tab.active .ked-pill { background: var(--ked-blue-light); color: var(--ked-blue); }
|
|
429
|
-
/* sticky bulk-action bar */
|
|
430
|
-
.ked-review-actions {
|
|
431
|
-
display: flex; gap: 8px; padding: 8px 12px; background: #f7f8fa;
|
|
432
|
-
border-bottom: 1px solid var(--ked-border); position: sticky; top: 0; z-index: 1;
|
|
433
|
-
}
|
|
434
|
-
.ked-review-body { flex: 1 1 auto; overflow-y: auto; padding: 10px 12px; }
|
|
435
|
-
.ked-review-empty { padding: 28px 16px; text-align: center; color: var(--ked-text-subtle); font-size: 12.5px; line-height: 1.5; }
|
|
436
|
-
.ked-review-empty .ked-review-empty-ico { width: 32px; height: 32px; display: block; margin: 0 auto 10px; opacity: .45; color: var(--ked-text-subtle); }
|
|
437
|
-
.ked-review-empty .ked-review-empty-ico svg { width: 32px; height: 32px; }
|
|
438
|
-
|
|
439
|
-
/* buttons */
|
|
440
|
-
.ked-btn {
|
|
441
|
-
border: 1px solid var(--ked-border); background: var(--ked-surface); color: #3c4043; cursor: pointer;
|
|
442
|
-
border-radius: 6px; padding: 5px 14px; font-size: 12.5px; font-weight: 600;
|
|
443
|
-
display: inline-flex; align-items: center; gap: 5px; line-height: 1;
|
|
444
|
-
transition: background var(--ked-t-fast), box-shadow var(--ked-t-fast), border-color var(--ked-t-fast);
|
|
445
|
-
}
|
|
446
|
-
.ked-btn:hover { background: #f5f5f5; box-shadow: var(--ked-shadow-sm); border-color: var(--ked-border-mid); }
|
|
447
|
-
.ked-btn.ked-btn-primary { background: var(--ked-blue); border-color: var(--ked-blue); color: #fff; }
|
|
448
|
-
.ked-btn.ked-btn-primary:hover { background: var(--ked-blue-dark); border-color: var(--ked-blue-dark); }
|
|
449
|
-
.ked-btn.ked-btn-accept { color: var(--ked-success); border-color: #b7dfca; background: #e8f5ee; }
|
|
450
|
-
.ked-btn.ked-btn-accept:hover { background: #d4edde; }
|
|
451
|
-
.ked-btn.ked-btn-reject { color: var(--ked-danger); border-color: #f0c4c3; background: #fdecea; }
|
|
452
|
-
.ked-btn.ked-btn-reject:hover { background: #f9d5d3; }
|
|
453
|
-
.ked-btn.ked-btn-ghost { border-color: transparent; background: transparent; color: var(--ked-blue); padding: 4px 6px; }
|
|
454
|
-
.ked-btn.ked-btn-ghost:hover { background: var(--ked-blue-xlight); box-shadow: none; }
|
|
455
|
-
.ked-btn-sm { padding: 4px 10px; font-size: 12px; }
|
|
456
|
-
.ked-btn:disabled, .ked-header-btn:disabled { opacity: .45; cursor: default; pointer-events: none; }
|
|
457
|
-
|
|
458
|
-
/* suggestion card */
|
|
459
|
-
.ked-sug {
|
|
460
|
-
background: var(--ked-surface); border: 1px solid var(--ked-border);
|
|
461
|
-
border-left: 3px solid var(--ked-author, var(--ked-blue));
|
|
462
|
-
border-radius: 8px; padding: 10px 12px; margin-bottom: 8px;
|
|
463
|
-
box-shadow: var(--ked-shadow-sm);
|
|
464
|
-
cursor: pointer; transition: background var(--ked-t-fast), border-color var(--ked-t-fast);
|
|
465
|
-
}
|
|
466
|
-
.ked-sug:hover { background: #f8f9fa; border-color: var(--ked-blue-light); }
|
|
467
|
-
.ked-sug-top { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
|
|
468
|
-
.ked-sug-kind { font-weight: 600; font-size: 12.5px; color: #202124; display: flex; align-items: center; gap: 6px; }
|
|
469
|
-
.ked-sug-kind .ked-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--ked-author, var(--ked-blue)); }
|
|
470
|
-
.ked-sug-meta { margin-left: auto; color: var(--ked-text-subtle); font-size: 11.5px; white-space: nowrap; }
|
|
471
|
-
.ked-sug-actions { display: flex; gap: 8px; }
|
|
472
|
-
|
|
473
|
-
/* avatar + comment card */
|
|
474
|
-
.ked-avatar {
|
|
475
|
-
width: 28px; height: 28px; border-radius: 50%; flex: 0 0 28px;
|
|
476
|
-
display: flex; align-items: center; justify-content: center;
|
|
477
|
-
color: #fff; font-size: 12px; font-weight: 700; text-transform: uppercase;
|
|
478
|
-
}
|
|
479
|
-
.ked-thread {
|
|
480
|
-
background: var(--ked-surface); border: 1px solid var(--ked-border); border-radius: 8px;
|
|
481
|
-
padding: 12px; margin-bottom: 10px; box-shadow: var(--ked-shadow-sm);
|
|
482
|
-
cursor: pointer; transition: border-color var(--ked-t-fast);
|
|
483
|
-
}
|
|
484
|
-
.ked-thread:hover { border-color: var(--ked-blue-light); }
|
|
485
|
-
.ked-thread.active { border-color: var(--ked-blue); box-shadow: 0 0 0 1px var(--ked-blue-light), var(--ked-shadow-sm); }
|
|
486
|
-
.ked-thread.resolved { opacity: .58; }
|
|
487
|
-
.ked-comment { display: flex; gap: 9px; margin-bottom: 10px; }
|
|
488
|
-
.ked-comment:last-of-type { margin-bottom: 6px; }
|
|
489
|
-
.ked-comment-main { min-width: 0; flex: 1 1 auto; position: relative; }
|
|
490
|
-
.ked-comment-who { font-weight: 600; font-size: 12.5px; color: var(--ked-text); padding-right: 28px; }
|
|
491
|
-
.ked-comment-when { color: var(--ked-text-subtle); font-size: 11px; margin-left: 6px; font-weight: 400; }
|
|
492
|
-
.ked-comment-body { color: var(--ked-text); font-size: 13px; line-height: 1.45; white-space: pre-wrap; word-wrap: break-word; margin-top: 2px; }
|
|
493
|
-
.ked-comment-body.deleted, .ked-thread-popover-comment .deleted { color: var(--ked-text-subtle); font-style: italic; }
|
|
494
|
-
.ked-comment-actions { display: flex; gap: 2px; position: absolute; right: 0; top: -5px; }
|
|
495
|
-
.ked-comment-menu { position: relative; }
|
|
496
|
-
.ked-comment-menu > summary { list-style: none; cursor: pointer; width: 26px; height: 24px; border-radius: 5px; display: grid; place-items: center; color: var(--ked-text-subtle); font-weight: 700; }
|
|
497
|
-
.ked-comment-menu > summary::-webkit-details-marker { display: none; }
|
|
498
|
-
.ked-comment-menu > summary:hover, .ked-comment-menu > summary:focus-visible { background: var(--ked-blue-xlight); color: var(--ked-blue); outline: none; }
|
|
499
|
-
.ked-comment-menu-items { position: absolute; right: 0; top: 26px; z-index: 5; min-width: 112px; padding: 4px; background: var(--ked-surface); border: 1px solid var(--ked-border); border-radius: 7px; box-shadow: var(--ked-shadow-md); }
|
|
500
|
-
.ked-comment-menu-items .ked-btn { display: block; width: 100%; text-align: left; padding: 6px 8px; font-size: 11.5px; }
|
|
501
|
-
.ked-comment-actions .ked-danger { color: var(--ked-danger); }
|
|
502
|
-
.ked-comment-edit { display: grid; grid-template-columns: 1fr auto auto; gap: 6px; margin-top: 6px; }
|
|
503
|
-
.ked-comment-edit textarea { grid-column: 1 / -1; resize: vertical; min-height: 54px; border: 1px solid var(--ked-border); border-radius: 6px; padding: 7px; font: 13px/1.4 inherit; }
|
|
504
|
-
.ked-thread-actions { display: flex; gap: 4px; align-items: center; padding-top: 6px; border-top: 1px solid var(--ked-border); }
|
|
505
|
-
.ked-thread-actions .ked-resolved-tag { color: var(--ked-success); font-size: 11.5px; font-weight: 600; display: flex; align-items: center; gap: 4px; }
|
|
506
|
-
|
|
507
|
-
/* Level 2: Replies container and items (2-level hierarchy) */
|
|
508
|
-
.ked-replies-wrap {
|
|
509
|
-
margin-left: 14px; padding-left: 12px; border-left: 2px solid var(--ked-border);
|
|
510
|
-
display: flex; flex-direction: column; gap: 8px; margin-top: 6px; margin-bottom: 8px;
|
|
511
|
-
}
|
|
512
|
-
.ked-comment.ked-reply { margin-bottom: 0; gap: 8px; }
|
|
513
|
-
.ked-comment.ked-reply .ked-avatar { width: 22px; height: 22px; flex: 0 0 22px; font-size: 9.5px; }
|
|
514
|
-
.ked-comment.ked-reply .ked-comment-who { font-size: 12px; }
|
|
515
|
-
.ked-comment.ked-reply .ked-comment-body { font-size: 12.5px; }
|
|
516
|
-
|
|
517
|
-
/* inline reply editor inside a thread (Level 2) */
|
|
518
|
-
.ked-reply-box {
|
|
519
|
-
display: none; flex-direction: column; gap: 8px; margin-top: 6px; margin-bottom: 6px;
|
|
520
|
-
margin-left: 14px; padding-left: 12px; border-left: 2px solid var(--ked-blue);
|
|
521
|
-
}
|
|
522
|
-
.ked-reply-box.open { display: flex; }
|
|
523
|
-
.ked-reply-row { display: flex; gap: 8px; align-items: flex-start; }
|
|
524
|
-
.ked-reply-row .ked-avatar { width: 22px; height: 22px; flex: 0 0 22px; font-size: 9.5px; }
|
|
525
|
-
.ked-reply-textarea {
|
|
526
|
-
flex: 1 1 auto; resize: none; min-height: 50px; max-height: 180px;
|
|
527
|
-
border: 1px solid var(--ked-border); border-radius: 6px; padding: 7px 9px;
|
|
528
|
-
font: 12.5px/1.45 inherit; color: var(--ked-text); outline: none; background: var(--ked-surface);
|
|
529
|
-
transition: border-color var(--ked-t-fast), box-shadow var(--ked-t-fast); box-sizing: border-box;
|
|
530
|
-
}
|
|
531
|
-
.ked-reply-textarea:focus { border-color: var(--ked-blue); box-shadow: 0 0 0 2px var(--ked-blue-xlight); }
|
|
532
|
-
.ked-reply-actions { display: flex; justify-content: flex-end; gap: 6px; align-items: center; }
|
|
533
|
-
.ked-reply-prompt {
|
|
534
|
-
display: flex; align-items: center; gap: 8px; padding: 5px 10px; margin-top: 6px; margin-bottom: 6px;
|
|
535
|
-
margin-left: 14px; border: 1px solid var(--ked-border); border-radius: 16px; background: var(--ked-canvas); cursor: pointer;
|
|
536
|
-
transition: background var(--ked-t-fast), border-color var(--ked-t-fast);
|
|
537
|
-
}
|
|
538
|
-
.ked-reply-prompt:hover { background: var(--ked-blue-xlight); border-color: var(--ked-blue-light); }
|
|
539
|
-
.ked-reply-prompt-text { font-size: 12px; color: var(--ked-text-subtle); flex: 1 1 auto; }
|
|
540
|
-
.ked-comment-filters { display: flex; gap: 4px; margin: 0 0 9px; position: sticky; top: 0; z-index: 2; background: var(--ked-canvas); padding-bottom: 5px; }
|
|
541
|
-
.ked-comment-filter { border: 1px solid transparent; background: transparent; color: var(--ked-text-subtle); padding: 4px 9px; border-radius: 12px; cursor: pointer; font: 600 11.5px/1 inherit; }
|
|
542
|
-
.ked-comment-filter.active { color: var(--ked-blue); background: var(--ked-blue-xlight); border-color: var(--ked-blue-light); }
|
|
543
|
-
|
|
544
|
-
/* ===== Comment composer bubble (Google-Docs style, floats by selection) === */
|
|
545
|
-
.ked-comment-bubble {
|
|
546
|
-
position: absolute; z-index: 60; width: min(308px, calc(100% - 16px)); box-sizing: border-box;
|
|
547
|
-
background: var(--ked-surface); border: 1px solid var(--ked-border); border-radius: 10px;
|
|
548
|
-
box-shadow: var(--ked-shadow-lg); padding: 14px;
|
|
549
|
-
display: flex; flex-direction: column; gap: 10px;
|
|
550
|
-
}
|
|
551
|
-
.ked-comment-bubble .ked-bubble-row { display: flex; gap: 9px; align-items: flex-start; min-width: 0; }
|
|
552
|
-
.ked-comment-bubble textarea {
|
|
553
|
-
flex: 1 1 auto; resize: none; min-height: 52px; max-height: 180px;
|
|
554
|
-
min-width: 0; box-sizing: border-box; border: none; outline: none;
|
|
555
|
-
font: inherit; font-size: 13px; line-height: 1.45; color: #202124;
|
|
556
|
-
padding: 4px 0; background: transparent;
|
|
557
|
-
}
|
|
558
|
-
.ked-comment-bubble .ked-bubble-actions { display: flex; justify-content: flex-end; gap: 8px; }
|
|
559
|
-
.ked-comment-bubble .ked-btn.ked-btn-primary:disabled { opacity: .4; cursor: default; box-shadow: none; }
|
|
560
|
-
.ked-comment-thread-popover { width: min(336px, calc(100% - 16px)); max-height: min(480px, 70vh); }
|
|
561
|
-
.ked-thread-popover-head { display: flex; align-items: center; justify-content: space-between; }
|
|
562
|
-
.ked-thread-popover-head .ked-review-close { border: 0; background: transparent; font-size: 20px; cursor: pointer; }
|
|
563
|
-
.ked-thread-popover-list { overflow: auto; display: flex; flex-direction: column; gap: 9px; }
|
|
564
|
-
.ked-thread-popover-comment { border-bottom: 1px solid var(--ked-border); padding-bottom: 8px; font-size: 12.5px; line-height: 1.4; white-space: pre-wrap; }
|
|
565
|
-
.ked-thread-popover-comment strong { display: block; margin-bottom: 2px; font-size: 12px; }
|
|
566
|
-
.ked-thread-popover-reply { display: grid; grid-template-columns: 1fr auto; gap: 7px; align-items: end; }
|
|
567
|
-
.ked-thread-popover-reply textarea { min-height: 38px; resize: vertical; border: 1px solid var(--ked-border); border-radius: 6px; padding: 7px; font: inherit; font-size: 13px; line-height: 1.4; }
|
|
568
|
-
|
|
569
|
-
/* floating "leave a comment" chip shown beside an editable selection/caret */
|
|
570
|
-
.ked-comment-chip {
|
|
571
|
-
position: absolute; z-index: 55; width: 36px; height: 36px; border-radius: 50%;
|
|
572
|
-
border: 1px solid var(--ked-border); background: var(--ked-surface); cursor: pointer;
|
|
573
|
-
box-shadow: var(--ked-shadow-md); color: var(--ked-blue);
|
|
574
|
-
display: flex; align-items: center; justify-content: center;
|
|
575
|
-
padding: 0; line-height: 1; transition: transform var(--ked-t-fast), box-shadow var(--ked-t-fast), background var(--ked-t-fast);
|
|
576
|
-
}
|
|
577
|
-
.ked-comment-chip svg { width: 18px; height: 18px; }
|
|
578
|
-
.ked-comment-chip:hover {
|
|
579
|
-
transform: scale(1.1); box-shadow: var(--ked-shadow-lg);
|
|
580
|
-
background: var(--ked-blue-xlight);
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
/* @-mention autocomplete dropdown + rendered mention chips */
|
|
584
|
-
.ked-mention-menu {
|
|
585
|
-
position: fixed; z-index: 70; background: var(--ked-surface);
|
|
586
|
-
border: 1px solid var(--ked-border);
|
|
587
|
-
border-radius: 8px; box-shadow: var(--ked-shadow-lg); padding: 4px; box-sizing: border-box;
|
|
588
|
-
max-height: 220px; overflow-y: auto; overscroll-behavior: contain;
|
|
589
|
-
font: inherit; font-size: 13px; line-height: 1.3; color: var(--ked-text);
|
|
590
|
-
}
|
|
591
|
-
.ked-mention-item {
|
|
592
|
-
display: flex; align-items: center; gap: 8px; min-height: 36px; padding: 5px 8px; box-sizing: border-box;
|
|
593
|
-
border-radius: 6px; cursor: pointer; color: var(--ked-text);
|
|
594
|
-
transition: background var(--ked-t-fast);
|
|
595
|
-
}
|
|
596
|
-
.ked-mention-item:hover, .ked-mention-item.active { background: var(--ked-blue-xlight); }
|
|
597
|
-
.ked-mention-empty { padding: 12px 10px; color: var(--ked-text-subtle); text-align: center; font-size: 12px; }
|
|
598
|
-
.ked-mention-av {
|
|
599
|
-
width: 24px; height: 24px; border-radius: 50%; flex: 0 0 24px;
|
|
600
|
-
display: flex; align-items: center; justify-content: center; color: #fff; font-size: 10px; font-weight: 700; text-transform: uppercase;
|
|
601
|
-
}
|
|
602
|
-
.ked-mention { color: var(--ked-blue); background: var(--ked-blue-xlight); border-radius: 4px; padding: 0 3px; font-weight: 600; }
|
|
603
|
-
|
|
604
|
-
/* collapsed ribbon: keep the tab strip, hide the body */
|
|
605
|
-
.ked-toolbar.collapsed .rib-bodies { display: none; }
|
|
606
|
-
|
|
607
|
-
/* compact ribbon (container-width driven via ResizeObserver, see editorApp):
|
|
608
|
-
dense single horizontally-scrollable group row with captions hidden. Keyed off
|
|
609
|
-
the editor's own width, so it also engages for narrow embeds on a wide page.
|
|
610
|
-
The pointer:coarse half of the mobile @media block below carries the same body
|
|
611
|
-
rules for touch devices regardless of width. */
|
|
612
|
-
.ked-toolbar.compact .rib-panel {
|
|
613
|
-
min-height: 0; overflow-x: auto; overflow-y: hidden;
|
|
614
|
-
flex-wrap: nowrap; -webkit-overflow-scrolling: touch;
|
|
615
|
-
}
|
|
616
|
-
.ked-toolbar.compact .rib-label { display: none; }
|
|
617
|
-
.ked-toolbar.compact .rib-group { padding: 4px 6px; }
|
|
618
|
-
.ked-toolbar.compact .rib-panel::-webkit-scrollbar { height: 6px; }
|
|
619
|
-
.ked-toolbar.compact .rib-panel::-webkit-scrollbar-thumb { background: var(--ked-border-mid); border-radius: 3px; }
|
|
620
|
-
|
|
621
|
-
/* ===== Status bar ================================================== */
|
|
622
|
-
.ked-statusbar {
|
|
623
|
-
flex: 0 0 auto; height: 26px; display: flex; align-items: center; justify-content: space-between;
|
|
624
|
-
background: linear-gradient(90deg, var(--ked-blue-dark) 0%, var(--ked-blue) 100%);
|
|
625
|
-
color: rgba(255,255,255,0.92); font-size: 12px; padding: 0 10px; user-select: none;
|
|
626
|
-
box-shadow: 0 -1px 0 rgba(0,0,0,0.12);
|
|
627
|
-
}
|
|
628
|
-
.ked-statusbar .sb-left, .ked-statusbar .sb-right { display: flex; align-items: center; gap: 14px; }
|
|
629
|
-
.ked-statusbar .sb-right { gap: 6px; }
|
|
630
|
-
.ked-statusbar .sb-item { white-space: nowrap; letter-spacing: 0.01em; }
|
|
631
|
-
.ked-statusbar .sb-sep { width: 1px; height: 13px; background: rgba(255,255,255,0.28); }
|
|
632
|
-
.ked-statusbar button.sb-btn {
|
|
633
|
-
background: transparent; border: none; color: rgba(255,255,255,0.88); cursor: pointer; font-size: 14px;
|
|
634
|
-
width: 24px; height: 22px; border-radius: 4px; line-height: 1; padding: 0;
|
|
635
|
-
transition: background var(--ked-t-fast), color var(--ked-t-fast);
|
|
636
|
-
}
|
|
637
|
-
.ked-statusbar button.sb-btn:hover { background: rgba(255,255,255,0.18); color: #fff; }
|
|
638
|
-
.ked-statusbar input[type="range"] { width: 110px; cursor: pointer; accent-color: rgba(255,255,255,0.85); }
|
|
639
|
-
.ked-statusbar .sb-zoom { min-width: 38px; text-align: right; }
|
|
640
|
-
|
|
641
|
-
/* ===== Popovers (palettes, menus, pickers, dialogs) ================ */
|
|
642
|
-
.ked-pop {
|
|
643
|
-
position: fixed; background: var(--ked-surface);
|
|
644
|
-
border: 1px solid var(--ked-border); border-radius: 8px;
|
|
645
|
-
box-shadow: var(--ked-shadow-lg);
|
|
646
|
-
z-index: 50; font-size: 13px; padding: 4px;
|
|
647
|
-
}
|
|
648
|
-
.ked-menu { display: flex; flex-direction: column; min-width: 172px; }
|
|
649
|
-
.ked-menu button {
|
|
650
|
-
display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
|
|
651
|
-
border: none; background: transparent; cursor: pointer; padding: 7px 10px; border-radius: 5px;
|
|
652
|
-
font: inherit; color: var(--ked-text);
|
|
653
|
-
transition: background var(--ked-t-fast);
|
|
654
|
-
}
|
|
655
|
-
.ked-menu button:hover { background: var(--ked-hover); }
|
|
656
|
-
.ked-menu .check { width: 14px; color: var(--ked-blue); }
|
|
657
|
-
.ked-menu .sample { color: var(--ked-text-muted); }
|
|
658
|
-
.ked-pop-title { font-size: 11px; color: var(--ked-text-subtle); padding: 4px 8px 2px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; }
|
|
659
|
-
.ked-swatches { display: grid; grid-template-columns: repeat(6, 22px); gap: 4px; padding: 4px 6px; }
|
|
660
|
-
.ked-swatches button {
|
|
661
|
-
width: 22px; height: 22px; border: 1px solid rgba(0,0,0,0.15); border-radius: 4px;
|
|
662
|
-
cursor: pointer; padding: 0;
|
|
663
|
-
transition: transform var(--ked-t-fast), box-shadow var(--ked-t-fast);
|
|
664
|
-
}
|
|
665
|
-
.ked-swatches button:hover { outline: 2px solid var(--ked-blue); outline-offset: 2px; transform: scale(1.08); }
|
|
666
|
-
.ked-pop .pop-action {
|
|
667
|
-
display: flex; align-items: center; gap: 8px; width: 100%; text-align: left; border: none;
|
|
668
|
-
background: transparent; cursor: pointer; padding: 7px 8px; border-radius: 5px;
|
|
669
|
-
font: inherit; color: var(--ked-text);
|
|
670
|
-
border-top: 1px solid var(--ked-border); margin-top: 4px;
|
|
671
|
-
transition: background var(--ked-t-fast);
|
|
672
|
-
}
|
|
673
|
-
.ked-pop .pop-action:hover { background: var(--ked-hover); }
|
|
674
|
-
.ked-grid { display: grid; gap: 2px; padding: 8px 8px 2px; }
|
|
675
|
-
.ked-grid .cell {
|
|
676
|
-
width: 16px; height: 16px; border: 1px solid var(--ked-border-mid); background: var(--ked-surface);
|
|
677
|
-
transition: background var(--ked-t-fast), border-color var(--ked-t-fast);
|
|
678
|
-
}
|
|
679
|
-
.ked-grid .cell.on { background: var(--ked-accent-btn); border-color: var(--ked-blue); }
|
|
680
|
-
.ked-grid-label { text-align: center; font-size: 12px; color: var(--ked-text-muted); padding: 4px 0 6px; }
|
|
681
|
-
.ked-dialog { display: flex; flex-direction: column; gap: 9px; padding: 12px; min-width: 256px; }
|
|
682
|
-
.ked-dialog label { font-size: 12px; color: var(--ked-text-muted); display: flex; flex-direction: column; gap: 3px; font-weight: 500; }
|
|
683
|
-
.ked-dialog input {
|
|
684
|
-
height: 30px; border: 1px solid var(--ked-border-mid); border-radius: 5px;
|
|
685
|
-
padding: 0 9px; font: inherit; font-size: 13px; color: var(--ked-text);
|
|
686
|
-
transition: border-color var(--ked-t-fast), box-shadow var(--ked-t-fast);
|
|
687
|
-
}
|
|
688
|
-
.ked-dialog input:focus { outline: none; border-color: var(--ked-blue); box-shadow: 0 0 0 2px var(--ked-blue-light); }
|
|
689
|
-
.ked-dialog .row { display: flex; justify-content: flex-end; gap: 6px; margin-top: 4px; }
|
|
690
|
-
.ked-dialog button {
|
|
691
|
-
height: 30px; border: 1px solid var(--ked-border-mid); background: var(--ked-surface);
|
|
692
|
-
border-radius: 5px; cursor: pointer; padding: 0 14px; font: inherit; font-size: 13px;
|
|
693
|
-
font-weight: 500; color: var(--ked-text);
|
|
694
|
-
transition: background var(--ked-t-fast), border-color var(--ked-t-fast);
|
|
695
|
-
}
|
|
696
|
-
.ked-dialog button:hover { background: var(--ked-hover); }
|
|
697
|
-
.ked-dialog button.primary { background: var(--ked-blue); color: #fff; border-color: var(--ked-blue); }
|
|
698
|
-
.ked-dialog button.primary:hover { background: var(--ked-blue-dark); }
|
|
699
|
-
.ked-dialog button.danger { color: var(--ked-danger); border-color: #f0c4c3; }
|
|
700
|
-
.ked-dialog button.danger:hover { background: #fdecea; }
|
|
701
|
-
|
|
702
|
-
/* ===== Busy overlay (docx import / join / publish) ================= */
|
|
703
|
-
.ked-loading-overlay {
|
|
704
|
-
position: fixed; inset: 0; z-index: 70;
|
|
705
|
-
background: rgba(0,0,0,0.32);
|
|
706
|
-
display: flex; align-items: center; justify-content: center;
|
|
707
|
-
backdrop-filter: blur(2px);
|
|
708
|
-
}
|
|
709
|
-
.ked-loading-card {
|
|
710
|
-
display: flex; flex-direction: column; align-items: center; gap: 14px;
|
|
711
|
-
background: var(--ked-surface); border: 1px solid var(--ked-border); border-radius: 12px;
|
|
712
|
-
box-shadow: var(--ked-shadow-lg); padding: 28px 36px; min-width: 220px;
|
|
713
|
-
}
|
|
714
|
-
.ked-spinner {
|
|
715
|
-
width: 32px; height: 32px; border-radius: 50%;
|
|
716
|
-
border: 3px solid var(--ked-blue-light);
|
|
717
|
-
border-top-color: var(--ked-blue);
|
|
718
|
-
animation: ked-spin 0.75s linear infinite;
|
|
719
|
-
}
|
|
720
|
-
@keyframes ked-spin { to { transform: rotate(360deg); } }
|
|
721
|
-
.ked-loading-label { font-size: 13.5px; color: var(--ked-text-muted); text-align: center; font-weight: 500; }
|
|
722
|
-
.ked-progress { width: 180px; height: 5px; background: var(--ked-blue-light); border-radius: 3px; overflow: hidden; }
|
|
723
|
-
.ked-progress-bar { height: 100%; width: 0%; background: var(--ked-blue); transition: width 0.18s ease; border-radius: 3px; }
|
|
724
|
-
|
|
725
|
-
/* floating mini-toolbar shown above a selected image */
|
|
726
|
-
.ked-img-toolbar {
|
|
727
|
-
position: fixed; display: none; align-items: center; gap: 2px; z-index: 40;
|
|
728
|
-
background: var(--ked-surface); border: 1px solid var(--ked-border); border-radius: 8px; padding: 3px;
|
|
729
|
-
box-shadow: var(--ked-shadow-md);
|
|
730
|
-
}
|
|
731
|
-
.ked-img-toolbar button {
|
|
732
|
-
width: 30px; height: 30px; display: inline-flex; align-items: center; justify-content: center;
|
|
733
|
-
border: 1px solid transparent; border-radius: 5px; background: transparent; cursor: pointer;
|
|
734
|
-
color: var(--ked-text);
|
|
735
|
-
transition: background var(--ked-t-fast), color var(--ked-t-fast);
|
|
736
|
-
}
|
|
737
|
-
.ked-img-toolbar button:hover { background: var(--ked-hover); }
|
|
738
|
-
.ked-img-toolbar button.danger:hover { background: #fdecea; color: var(--ked-danger); }
|
|
739
|
-
.ked-img-toolbar button svg { width: 16px; height: 16px; }
|
|
740
|
-
.ked-img-toolbar .sep { width: 1px; height: 18px; background: var(--ked-border); margin: 0 2px; }
|
|
741
|
-
|
|
742
|
-
/* ===== Mobile / touch responsive layer ============================== */
|
|
743
|
-
/* Activates on touch devices (coarse primary pointer) OR narrow screens.
|
|
744
|
-
Desktop is untouched outside this block. Strategy: collapse the ribbon to one
|
|
745
|
-
horizontally-scrollable row, hide group captions, grow touch targets to ~40px,
|
|
746
|
-
turn the 264px outline into an overlay drawer, and clamp floating panels to
|
|
747
|
-
the viewport (a bottom sheet) so they never render off-screen. */
|
|
748
|
-
@media (pointer: coarse), (max-width: 760px) {
|
|
749
|
-
/* Ribbon body: single scrollable row instead of a tall multi-group block. */
|
|
750
|
-
.rib-panel { min-height: 0; overflow-x: auto; overflow-y: hidden; flex-wrap: nowrap; -webkit-overflow-scrolling: touch; }
|
|
751
|
-
.rib-label { display: none; }
|
|
752
|
-
.rib-group { padding: 4px 6px; }
|
|
753
|
-
/* Touch targets (Apple/Material guideline is ~40-48px). */
|
|
754
|
-
.ked-toolbar button.rib-btn { min-width: 40px; height: 40px; }
|
|
755
|
-
.ked-toolbar button.rib-btn svg { width: 18px; height: 18px; }
|
|
756
|
-
.rib-tab { padding: 9px 14px; font-size: 14px; }
|
|
757
|
-
.ked-toolbar select, .ked-toolbar input[type="number"] { height: 36px; font-size: 14px; }
|
|
758
|
-
|
|
759
|
-
/* Outline: overlay the page instead of stealing 264px of a ~360px screen. */
|
|
760
|
-
.ked-workarea { position: relative; }
|
|
761
|
-
.ked-outline { position: absolute; left: 0; top: 0; bottom: 0; height: auto; width: min(264px, 80vw); z-index: 30; box-shadow: 4px 0 20px rgba(0,0,0,0.2); }
|
|
762
|
-
.ked-review { position: absolute; right: 0; top: 0; bottom: 0; height: auto; width: min(320px, 88vw); z-index: 31; box-shadow: -4px 0 20px rgba(0,0,0,0.2); }
|
|
763
|
-
|
|
764
|
-
/* Status bar: tappable zoom controls. */
|
|
765
|
-
.ked-statusbar { height: 38px; }
|
|
766
|
-
.ked-statusbar button.sb-btn { width: 32px; height: 30px; font-size: 17px; }
|
|
767
|
-
.ked-statusbar input[type="range"] { width: 96px; }
|
|
768
|
-
|
|
769
|
-
/* Floating panels (Page Setup, Find) → bottom sheet; Activity → full-width.
|
|
770
|
-
!important overrides the inline position/size set in editorApp.ts. */
|
|
771
|
-
.ked-float-panel { left: 8px !important; right: 8px !important; top: auto !important; bottom: 8px !important; width: auto !important; max-width: none !important; max-height: 60vh; overflow: auto; }
|
|
772
|
-
.ked-float-drawer { width: 100% !important; }
|
|
773
|
-
.ked-img-toolbar button { width: 36px; height: 36px; }
|
|
774
|
-
|
|
775
|
-
/* Image resize handles: 8px dots are unhittable with a finger — an invisible
|
|
776
|
-
::before pads the touch target to ~24px without changing the visual size. */
|
|
777
|
-
.ked-obj-handle::before { content: ""; position: absolute; inset: -8px; }
|
|
778
|
-
}
|
|
779
|
-
`;
|
|
780
|
-
function h(r, e) {
|
|
781
|
-
if (document.getElementById(r)) return;
|
|
782
|
-
const t = document.createElement("style");
|
|
783
|
-
t.id = r, t.textContent = e, document.head.appendChild(t);
|
|
784
|
-
}
|
|
785
|
-
function J() {
|
|
786
|
-
h(O, H);
|
|
787
|
-
}
|
|
788
|
-
const U = `
|
|
789
|
-
.ked-drag-handle{cursor:move;user-select:none;}
|
|
790
|
-
.ked-drag-handle::before{content:"⠿";color:#b0b4ba;font-size:14px;line-height:1;margin-right:4px;flex:0 0 auto;}`;
|
|
791
|
-
function Z(r) {
|
|
792
|
-
h("ked-drag-handle-styles", U);
|
|
793
|
-
const { backdrop: e, modal: t, handle: o, signal: n } = r;
|
|
794
|
-
e.style.pointerEvents = "none", e.style.background = "transparent", e.style.display = "block", t.style.position = "fixed", t.style.margin = "0", t.style.pointerEvents = "auto", o.classList.add("ked-drag-handle");
|
|
795
|
-
const d = (a, s) => {
|
|
796
|
-
const b = Math.max(4, window.innerWidth - t.offsetWidth - 6), k = Math.max(4, window.innerHeight - 44);
|
|
797
|
-
t.style.left = `${Math.min(Math.max(4, a), b)}px`, t.style.top = `${Math.min(Math.max(4, s), k)}px`;
|
|
798
|
-
};
|
|
799
|
-
d(window.innerWidth - t.offsetWidth - 24, 72);
|
|
800
|
-
let i = null;
|
|
801
|
-
o.addEventListener(
|
|
802
|
-
"mousedown",
|
|
803
|
-
(a) => {
|
|
804
|
-
if (r.noDrag && a.target.closest(r.noDrag)) return;
|
|
805
|
-
const s = t.getBoundingClientRect();
|
|
806
|
-
i = { dx: a.clientX - s.left, dy: a.clientY - s.top }, a.preventDefault();
|
|
807
|
-
},
|
|
808
|
-
{ signal: n }
|
|
809
|
-
), window.addEventListener("mousemove", (a) => {
|
|
810
|
-
i && d(a.clientX - i.dx, a.clientY - i.dy);
|
|
811
|
-
}, { signal: n }), window.addEventListener("mouseup", () => {
|
|
812
|
-
i = null;
|
|
813
|
-
}, { signal: n });
|
|
814
|
-
}
|
|
815
|
-
const p = 0.15;
|
|
816
|
-
function Y(r, e) {
|
|
817
|
-
const t = e > 0 ? r / e : 1;
|
|
818
|
-
return { phase: "fonts", loaded: r, total: e, percent: p + (1 - p) * t };
|
|
819
|
-
}
|
|
820
|
-
const u = {
|
|
821
|
-
common: {
|
|
822
|
-
ok: "OK",
|
|
823
|
-
cancel: "Cancel",
|
|
824
|
-
apply: "Apply",
|
|
825
|
-
close: "Close",
|
|
826
|
-
delete: "Delete"
|
|
827
|
-
},
|
|
828
|
-
ribbon: {
|
|
829
|
-
file: "File",
|
|
830
|
-
home: "Home",
|
|
831
|
-
insert: "Insert",
|
|
832
|
-
layout: "Layout",
|
|
833
|
-
table: "Table",
|
|
834
|
-
view: "View",
|
|
835
|
-
developer: "Developer"
|
|
836
|
-
},
|
|
837
|
-
fileGroup: {
|
|
838
|
-
groupUndo: "Undo",
|
|
839
|
-
groupExport: "Export",
|
|
840
|
-
undo: "Undo (Ctrl+Z)",
|
|
841
|
-
redo: "Redo (Ctrl+Y)",
|
|
842
|
-
exportPdf: "Export to PDF",
|
|
843
|
-
exportDocx: "Export to .docx"
|
|
844
|
-
},
|
|
845
|
-
clipboard: {
|
|
846
|
-
groupLabel: "Clipboard",
|
|
847
|
-
paste: "Paste",
|
|
848
|
-
pasteTooltip: "Paste (Ctrl+V)",
|
|
849
|
-
cutTooltip: "Cut (Ctrl+X)",
|
|
850
|
-
copyTooltip: "Copy (Ctrl+C)",
|
|
851
|
-
formatPainterTooltip: "Format painter (double-click = sticky)"
|
|
852
|
-
},
|
|
853
|
-
font: {
|
|
854
|
-
groupLabel: "Font",
|
|
855
|
-
fontFamily: "Font family",
|
|
856
|
-
fontSize: "Font size (pt)",
|
|
857
|
-
fontSizePresets: "Font size presets",
|
|
858
|
-
growFont: "Grow font",
|
|
859
|
-
shrinkFont: "Shrink font",
|
|
860
|
-
changeCase: "Change case",
|
|
861
|
-
clearFormatting: "Clear all formatting",
|
|
862
|
-
bold: "Bold (Ctrl+B)",
|
|
863
|
-
italic: "Italic (Ctrl+I)",
|
|
864
|
-
underline: "Underline (Ctrl+U)",
|
|
865
|
-
strikethrough: "Strikethrough",
|
|
866
|
-
superscript: "Superscript",
|
|
867
|
-
subscript: "Subscript",
|
|
868
|
-
allCaps: "All caps",
|
|
869
|
-
smallCaps: "Small caps",
|
|
870
|
-
doubleStrikethrough: "Double strikethrough",
|
|
871
|
-
fontEffects: "Font — effects, caps, underline style, spacing",
|
|
872
|
-
highlightColor: "Text highlight colour",
|
|
873
|
-
fontColor: "Font colour",
|
|
874
|
-
noColor: "No Color",
|
|
875
|
-
automatic: "Automatic",
|
|
876
|
-
caseSentence: "Sentence case",
|
|
877
|
-
caseLower: "lowercase",
|
|
878
|
-
caseUpper: "UPPERCASE",
|
|
879
|
-
caseTitle: "Capitalize Each Word",
|
|
880
|
-
caseToggle: "tOGGLE cASE"
|
|
881
|
-
},
|
|
882
|
-
paragraph: {
|
|
883
|
-
groupLabel: "Paragraph",
|
|
884
|
-
bulletedList: "Bulleted list",
|
|
885
|
-
numberedList: "Numbered list (Tab/Shift+Tab change level)",
|
|
886
|
-
multilevelList: "Multilevel list (1, 1.1, 1.1.1 — Tab / Shift+Tab change level)",
|
|
887
|
-
decreaseIndent: "Decrease indent",
|
|
888
|
-
increaseIndent: "Increase indent",
|
|
889
|
-
sort: "Sort",
|
|
890
|
-
formattingMarks: "Show/hide formatting marks",
|
|
891
|
-
alignLeft: "Align left",
|
|
892
|
-
alignCenter: "Center",
|
|
893
|
-
alignRight: "Align right",
|
|
894
|
-
alignJustify: "Justify",
|
|
895
|
-
ltr: "Left-to-right paragraph",
|
|
896
|
-
rtl: "Right-to-left paragraph",
|
|
897
|
-
lineSpacing: "Line spacing",
|
|
898
|
-
lineSpacingOptions: "Line Spacing Options…",
|
|
899
|
-
borders: "Borders & shading",
|
|
900
|
-
bulletFilledCircle: "• Filled circle",
|
|
901
|
-
bulletHollowCircle: "◦ Hollow circle",
|
|
902
|
-
bulletFilledSquare: "▪ Filled square",
|
|
903
|
-
bulletDash: "– Dash",
|
|
904
|
-
bulletArrow: "➤ Arrow",
|
|
905
|
-
numberDecimal: "1. Decimal",
|
|
906
|
-
numberDecimalParen: "1) Decimal, parenthesis",
|
|
907
|
-
numberLowerLetter: "a. Lower letter",
|
|
908
|
-
numberUpperLetter: "A. Upper letter",
|
|
909
|
-
numberLowerRoman: "i. Lower roman",
|
|
910
|
-
numberUpperRoman: "I. Upper roman"
|
|
911
|
-
},
|
|
912
|
-
styles: {
|
|
913
|
-
groupLabel: "Styles",
|
|
914
|
-
updateStyle: "Update current style to match selection",
|
|
915
|
-
manageStyles: "Manage styles…",
|
|
916
|
-
showOnlyUsed: "Show only styles in use",
|
|
917
|
-
showAllStyles: "Show all styles",
|
|
918
|
-
charStyleSuffix: " ⓐ",
|
|
919
|
-
charStyleTitle: " (character style)"
|
|
920
|
-
},
|
|
921
|
-
editing: {
|
|
922
|
-
groupLabel: "Editing",
|
|
923
|
-
find: "Find",
|
|
924
|
-
findTooltip: "Find & replace (Ctrl+F)",
|
|
925
|
-
replace: "Replace",
|
|
926
|
-
replaceTooltip: "Replace (Ctrl+F)",
|
|
927
|
-
selectAll: "Select All",
|
|
928
|
-
selectAllTooltip: "Select all (Ctrl+A)"
|
|
929
|
-
},
|
|
930
|
-
insert: {
|
|
931
|
-
groupPages: "Pages",
|
|
932
|
-
pageBreak: "Page break (Ctrl+Enter)",
|
|
933
|
-
sectionBreak: "Section break — next page",
|
|
934
|
-
groupTables: "Tables",
|
|
935
|
-
insertTable: "Insert table",
|
|
936
|
-
groupIllustrations: "Illustrations",
|
|
937
|
-
insertImage: "Insert image from your device",
|
|
938
|
-
groupPicture: "Picture",
|
|
939
|
-
wrapSquare: "Wrap text around image (square)",
|
|
940
|
-
wrapInline: "Image in line with text (block)",
|
|
941
|
-
groupEquation: "Equation",
|
|
942
|
-
insertEquation: "Insert equation (MathML)",
|
|
943
|
-
groupSymbols: "Symbols",
|
|
944
|
-
insertSymbol: "Insert symbol or special character",
|
|
945
|
-
groupLinks: "Links",
|
|
946
|
-
insertLink: "Insert/remove hyperlink",
|
|
947
|
-
groupReferences: "References",
|
|
948
|
-
insertToc: "Insert / update table of contents (Ctrl+click an entry jumps to it)",
|
|
949
|
-
recalcToc: "Recalculate TOC page numbers from the current layout",
|
|
950
|
-
insertFootnote: "Insert footnote",
|
|
951
|
-
insertEndnote: "Insert endnote",
|
|
952
|
-
groupControls: "Controls",
|
|
953
|
-
richTextControl: "Rich text content control (wraps the selection or selected image)",
|
|
954
|
-
checkboxControl: "Check box content control",
|
|
955
|
-
dropdownControl: "Drop-down list content control",
|
|
956
|
-
datePickerControl: "Date picker content control",
|
|
957
|
-
signatureControl: "Select signing zone (WeSign position)",
|
|
958
|
-
dropdownPrompt: "List items (comma-separated):",
|
|
959
|
-
dropdownDefault: "Yes, No, N/A",
|
|
960
|
-
contentControlProps: "Content control properties & content (inspect the control at the caret)",
|
|
961
|
-
removeContentControl: "Remove the content control at the caret or around the selected image (keeps its content)",
|
|
962
|
-
noContentControl: "Place the caret inside a content control first.",
|
|
963
|
-
selectImageFirst: "select an image first",
|
|
964
|
-
placeCaretInControl: "place the caret in a content control"
|
|
965
|
-
},
|
|
966
|
-
layout: {
|
|
967
|
-
groupPageSetup: "Page Setup",
|
|
968
|
-
pageSetup: "Page layout (size, orientation, margins, columns, header/footer distance, page color & borders — applies to the caret's section)"
|
|
969
|
-
},
|
|
970
|
-
table: {
|
|
971
|
-
groupRowsCols: "Rows & Columns",
|
|
972
|
-
insertRowAbove: "Insert row above",
|
|
973
|
-
insertRowBelow: "Insert row below",
|
|
974
|
-
insertColLeft: "Insert column left",
|
|
975
|
-
insertColRight: "Insert column right",
|
|
976
|
-
deleteRow: "Delete row",
|
|
977
|
-
deleteCol: "Delete column",
|
|
978
|
-
deleteTable: "Delete table",
|
|
979
|
-
groupMerge: "Merge",
|
|
980
|
-
mergeCells: "Merge cells (select across cells in one row)",
|
|
981
|
-
unmergeCells: "Unmerge cell",
|
|
982
|
-
groupSize: "Size",
|
|
983
|
-
autofit: "AutoFit",
|
|
984
|
-
autofitTooltip: "AutoFit columns to contents or window, or use fixed widths",
|
|
985
|
-
autofitContents: "AutoFit to Contents",
|
|
986
|
-
autofitWindow: "AutoFit to Window",
|
|
987
|
-
fixedWidth: "Fixed Column Width",
|
|
988
|
-
width25: "Width: 25%",
|
|
989
|
-
width50: "Width: 50%",
|
|
990
|
-
width75: "Width: 75%",
|
|
991
|
-
widthFull: "Width: Full page",
|
|
992
|
-
alignLeft: "Align Left",
|
|
993
|
-
alignCenter: "Align Center",
|
|
994
|
-
alignRight: "Align Right",
|
|
995
|
-
placeCaretInTable: "Place the caret in a table or select one or more cells first."
|
|
996
|
-
},
|
|
997
|
-
view: {
|
|
998
|
-
groupShow: "Show",
|
|
999
|
-
outline: "Outline / navigation pane (jump to any heading)",
|
|
1000
|
-
bookmarks: "Bookmarks — list, go to, add, rename, delete",
|
|
1001
|
-
horizontalRuler: "Horizontal ruler",
|
|
1002
|
-
verticalRuler: "Vertical ruler",
|
|
1003
|
-
showGrid: "Show grid — a light mesh for aligning objects",
|
|
1004
|
-
snapToGrid: "Snap to grid — anchored objects snap to grid lines while dragging",
|
|
1005
|
-
gridSpacing: "Grid spacing",
|
|
1006
|
-
activity: "Activity — who created/edited this document and when",
|
|
1007
|
-
groupZoom: "Zoom",
|
|
1008
|
-
zoomIn: "Zoom in",
|
|
1009
|
-
zoomOut: "Zoom out",
|
|
1010
|
-
zoomLevel: "Zoom level"
|
|
1011
|
-
},
|
|
1012
|
-
review: {
|
|
1013
|
-
reviewButton: "Review",
|
|
1014
|
-
reviewButtonTooltip: "Suggestions & comments — review, accept, reject",
|
|
1015
|
-
addComment: "+ Comment",
|
|
1016
|
-
addCommentTooltip: "Add a comment at the selection (Ctrl+Alt+M / Cmd+Option+M)",
|
|
1017
|
-
editingMode: "Editing mode",
|
|
1018
|
-
modeEditing: "Editing",
|
|
1019
|
-
modeSuggesting: "Suggesting",
|
|
1020
|
-
modeViewing: "Viewing"
|
|
1021
|
-
},
|
|
1022
|
-
developer: {
|
|
1023
|
-
groupInspect: "Inspect",
|
|
1024
|
-
inspectTree: "Inspect document tree",
|
|
1025
|
-
inspectTreeTooltip: "Open the Document-tree inspector — browse the parsed model, highlight nodes on the page, and read each node's JSON"
|
|
1026
|
-
},
|
|
1027
|
-
contextMenu: {
|
|
1028
|
-
cut: "Cut",
|
|
1029
|
-
copy: "Copy",
|
|
1030
|
-
paste: "Paste",
|
|
1031
|
-
pasteText: "Paste as plain text",
|
|
1032
|
-
comment: "Comment",
|
|
1033
|
-
image: "Image",
|
|
1034
|
-
wrapSquare: "Wrap: square",
|
|
1035
|
-
wrapBlock: "Wrap: inline (block)",
|
|
1036
|
-
editField: "Edit field",
|
|
1037
|
-
updateField: "Update field",
|
|
1038
|
-
hyperlink: "Hyperlink",
|
|
1039
|
-
editHyperlink: "Edit hyperlink",
|
|
1040
|
-
removeHyperlink: "Remove hyperlink",
|
|
1041
|
-
openLink: "Open link in new tab",
|
|
1042
|
-
tableMenu: "Table",
|
|
1043
|
-
tableProperties: "Table properties",
|
|
1044
|
-
acceptSuggestion: "Accept",
|
|
1045
|
-
rejectSuggestion: "Reject",
|
|
1046
|
-
acceptAll: "Accept all suggestions",
|
|
1047
|
-
rejectAll: "Reject all suggestions",
|
|
1048
|
-
bookmark: "Bookmark",
|
|
1049
|
-
addBookmark: "Add bookmark",
|
|
1050
|
-
removeBookmark: "Remove bookmark",
|
|
1051
|
-
gotoBookmark: "Go to bookmark"
|
|
1052
|
-
},
|
|
1053
|
-
activity: {
|
|
1054
|
-
title: "Activity",
|
|
1055
|
-
createdLocally: "Created locally",
|
|
1056
|
-
createdByTemplate: "Created by {name} · {time}",
|
|
1057
|
-
noEdits: "No edits yet.",
|
|
1058
|
-
shareToTrack: "Share the document (or open one online) to track activity.",
|
|
1059
|
-
justNow: "just now",
|
|
1060
|
-
originTyped: "typed",
|
|
1061
|
-
originPasted: "pasted",
|
|
1062
|
-
originUndo: "undo",
|
|
1063
|
-
originRedo: "redo",
|
|
1064
|
-
originEdited: "edited"
|
|
1065
|
-
},
|
|
1066
|
-
outline: {
|
|
1067
|
-
title: "Outline"
|
|
1068
|
-
},
|
|
1069
|
-
busy: {
|
|
1070
|
-
exporting: "Exporting…"
|
|
1071
|
-
},
|
|
1072
|
-
fontDialog: {
|
|
1073
|
-
title: "Font",
|
|
1074
|
-
sectionEffects: "Effects",
|
|
1075
|
-
allCaps: "All caps",
|
|
1076
|
-
smallCaps: "Small caps",
|
|
1077
|
-
doubleStrikethrough: "Double strikethrough",
|
|
1078
|
-
outline: "Outline",
|
|
1079
|
-
shadow: "Shadow",
|
|
1080
|
-
emboss: "Emboss",
|
|
1081
|
-
engrave: "Engrave (imprint)",
|
|
1082
|
-
sectionUnderline: "Underline",
|
|
1083
|
-
underlineStyle: "Underline style",
|
|
1084
|
-
underlineColor: "Underline color",
|
|
1085
|
-
automatic: "Automatic",
|
|
1086
|
-
ulNone: "(none)",
|
|
1087
|
-
ulSingle: "Single",
|
|
1088
|
-
ulDouble: "Double",
|
|
1089
|
-
ulThick: "Thick",
|
|
1090
|
-
ulDotted: "Dotted",
|
|
1091
|
-
ulDashed: "Dashed",
|
|
1092
|
-
ulDotDash: "Dot dash",
|
|
1093
|
-
ulDotDotDash: "Dot dot dash",
|
|
1094
|
-
ulWave: "Wave",
|
|
1095
|
-
sectionSpacing: "Spacing & position",
|
|
1096
|
-
position: "Position (raise/lower)",
|
|
1097
|
-
scale: "Scale (width)",
|
|
1098
|
-
charSpacing: "Character spacing",
|
|
1099
|
-
kerning: "Kerning at/above",
|
|
1100
|
-
fitText: "Fit text width",
|
|
1101
|
-
sectionEmphasis: "Emphasis mark",
|
|
1102
|
-
emphasisMark: "Mark",
|
|
1103
|
-
emNone: "(none)",
|
|
1104
|
-
emDot: "Dot (above)",
|
|
1105
|
-
emComma: "Comma (above)",
|
|
1106
|
-
emCircle: "Circle (above)",
|
|
1107
|
-
emUnderDot: "Dot (below)",
|
|
1108
|
-
unitPx: "px",
|
|
1109
|
-
unitPct: "%"
|
|
1110
|
-
},
|
|
1111
|
-
paragraphDialog: {
|
|
1112
|
-
title: "Paragraph",
|
|
1113
|
-
sectionBorders: "Borders",
|
|
1114
|
-
borderColor: "Color",
|
|
1115
|
-
borderWidth: "Width (px)",
|
|
1116
|
-
borderStyle: "Style",
|
|
1117
|
-
sectionShading: "Shading (fill)",
|
|
1118
|
-
fill: "Fill",
|
|
1119
|
-
sectionSpacing: "Spacing & line breaks",
|
|
1120
|
-
lineSpacing: "Line spacing",
|
|
1121
|
-
lineSpacingAt: "At",
|
|
1122
|
-
lineSpacingAtPx: "At (px)",
|
|
1123
|
-
lsMultiple: "Multiple",
|
|
1124
|
-
lsAtLeast: "At least",
|
|
1125
|
-
lsExactly: "Exactly",
|
|
1126
|
-
verticalAlignment: "Vertical alignment",
|
|
1127
|
-
vaBaseline: "Baseline",
|
|
1128
|
-
vaTop: "Top",
|
|
1129
|
-
vaCenter: "Center",
|
|
1130
|
-
vaBottom: "Bottom",
|
|
1131
|
-
contextualSpacing: "Contextual spacing",
|
|
1132
|
-
widowOrphan: "Widow/orphan control",
|
|
1133
|
-
mirrorIndents: "Mirror indents",
|
|
1134
|
-
suppressLineNumbers: "Suppress line numbers",
|
|
1135
|
-
adjustRightIndent: "Adjust right indent",
|
|
1136
|
-
edgeTop: "Top",
|
|
1137
|
-
edgeRight: "Right",
|
|
1138
|
-
edgeBottom: "Bottom",
|
|
1139
|
-
edgeLeft: "Left",
|
|
1140
|
-
edgeBetween: "Between"
|
|
1141
|
-
},
|
|
1142
|
-
pageLayout: {
|
|
1143
|
-
title: "Page Layout",
|
|
1144
|
-
labelInches: "in",
|
|
1145
|
-
labelCm: "cm",
|
|
1146
|
-
sectionSize: "Size & Orientation",
|
|
1147
|
-
sectionMargins: "Margins",
|
|
1148
|
-
sectionColumns: "Columns",
|
|
1149
|
-
sectionHeaderFooter: "Header / Footer",
|
|
1150
|
-
sectionLineNumbers: "Line Numbers",
|
|
1151
|
-
sectionPageColor: "Page Color",
|
|
1152
|
-
sectionPageBorder: "Page Border",
|
|
1153
|
-
sectionBreak: "Section Break",
|
|
1154
|
-
paperSize: "Paper size",
|
|
1155
|
-
orientation: "Orientation",
|
|
1156
|
-
orientationPortrait: "Portrait",
|
|
1157
|
-
orientationLandscape: "Landscape",
|
|
1158
|
-
customSize: "Custom",
|
|
1159
|
-
width: "Width",
|
|
1160
|
-
height: "Height",
|
|
1161
|
-
marginTop: "Top",
|
|
1162
|
-
marginBottom: "Bottom",
|
|
1163
|
-
marginLeft: "Left",
|
|
1164
|
-
marginRight: "Right",
|
|
1165
|
-
marginGutter: "Gutter",
|
|
1166
|
-
mirrorMargins: "Mirror margins",
|
|
1167
|
-
marginNormal: "Normal",
|
|
1168
|
-
marginNarrow: "Narrow",
|
|
1169
|
-
marginWide: "Wide",
|
|
1170
|
-
columnCount: "Columns",
|
|
1171
|
-
columnSpacing: "Spacing",
|
|
1172
|
-
columnSeparatorLine: "Separator line",
|
|
1173
|
-
headerDistance: "Header",
|
|
1174
|
-
footerDistance: "Footer",
|
|
1175
|
-
lineNumbersEnable: "Line numbers",
|
|
1176
|
-
lineNumberStart: "Start at",
|
|
1177
|
-
lineNumberStep: "Count by",
|
|
1178
|
-
lineNumberRestart: "Restart each page",
|
|
1179
|
-
pageColor: "Page color",
|
|
1180
|
-
pageBorder: "Border",
|
|
1181
|
-
pageBorderStyle: "Style",
|
|
1182
|
-
pageBorderColor: "Color",
|
|
1183
|
-
pageBorderWidth: "Width",
|
|
1184
|
-
pageBorderApply: "Apply to",
|
|
1185
|
-
pageBorderApplyPage: "Whole document",
|
|
1186
|
-
pageBorderApplySection: "This section",
|
|
1187
|
-
sectionBreakType: "Break type",
|
|
1188
|
-
sectionBreakNextPage: "Next page",
|
|
1189
|
-
sectionBreakContinuous: "Continuous",
|
|
1190
|
-
sectionBreakEvenPage: "Even page",
|
|
1191
|
-
sectionBreakOddPage: "Odd page"
|
|
1192
|
-
},
|
|
1193
|
-
tableProperties: {
|
|
1194
|
-
title: "Borders & Shading",
|
|
1195
|
-
closeTooltip: "Close (Esc)",
|
|
1196
|
-
sectionBorders: "Borders",
|
|
1197
|
-
borderColor: "Color",
|
|
1198
|
-
borderWidth: "Width (px)",
|
|
1199
|
-
borderStyle: "Style",
|
|
1200
|
-
borderApplyTo: "Apply borders to",
|
|
1201
|
-
hint: "Pick a target to apply now — or set the options above and click Done.",
|
|
1202
|
-
individualEdges: "Individual edges",
|
|
1203
|
-
presetAll: "All",
|
|
1204
|
-
presetOutside: "Outside",
|
|
1205
|
-
presetInside: "Inside",
|
|
1206
|
-
presetNone: "None",
|
|
1207
|
-
edgeTop: "Top",
|
|
1208
|
-
edgeBottom: "Bottom",
|
|
1209
|
-
edgeLeft: "Left",
|
|
1210
|
-
edgeRight: "Right",
|
|
1211
|
-
edgeInsideH: "Inside H",
|
|
1212
|
-
edgeInsideV: "Inside V",
|
|
1213
|
-
sectionShading: "Shading (fill)",
|
|
1214
|
-
fill: "Fill",
|
|
1215
|
-
applyFill: "Apply Fill",
|
|
1216
|
-
noFill: "No Fill",
|
|
1217
|
-
sectionTableSize: "Table size",
|
|
1218
|
-
tableWidth: "Width",
|
|
1219
|
-
tableAlign: "Align",
|
|
1220
|
-
tableAlignLeft: "Left",
|
|
1221
|
-
tableAlignCenter: "Center",
|
|
1222
|
-
tableAlignRight: "Right",
|
|
1223
|
-
tableIndent: "Indent",
|
|
1224
|
-
fullWidth: "Full width",
|
|
1225
|
-
unitPercent: "%",
|
|
1226
|
-
unitPx: "px",
|
|
1227
|
-
unitInch: "in",
|
|
1228
|
-
sectionCell: "Cell",
|
|
1229
|
-
cellVAlign: "Vertical align",
|
|
1230
|
-
cellVAlignTop: "Top",
|
|
1231
|
-
cellVAlignCenter: "Center",
|
|
1232
|
-
cellVAlignBottom: "Bottom",
|
|
1233
|
-
cellTextDir: "Text direction",
|
|
1234
|
-
cellTextDirLrTb: "Left to right",
|
|
1235
|
-
cellTextDirTbRl: "Top to bottom (rotate)",
|
|
1236
|
-
cellTextDirBtLr: "Bottom to top (rotate)",
|
|
1237
|
-
sectionRow: "Row",
|
|
1238
|
-
rowHeight: "Height",
|
|
1239
|
-
rowHeightMin: "At least",
|
|
1240
|
-
rowHeightExact: "Exactly",
|
|
1241
|
-
rowKeepTogether: "Keep rows together",
|
|
1242
|
-
rowRepeatHeader: "Repeat as header row",
|
|
1243
|
-
sectionTableDefaults: "Table defaults",
|
|
1244
|
-
tableDefaultBorders: "Default borders",
|
|
1245
|
-
tableDefaultShading: "Default shading",
|
|
1246
|
-
tableDefaultCellMargin: "Default cell margins",
|
|
1247
|
-
cellMarginTop: "Top",
|
|
1248
|
-
cellMarginBottom: "Bottom",
|
|
1249
|
-
cellMarginLeft: "Left",
|
|
1250
|
-
cellMarginRight: "Right",
|
|
1251
|
-
done: "Done"
|
|
1252
|
-
},
|
|
1253
|
-
styleManager: {
|
|
1254
|
-
title: "Manage Styles",
|
|
1255
|
-
previewLabel: "Preview",
|
|
1256
|
-
newStyle: "New ▾",
|
|
1257
|
-
deleteStyle: "Delete",
|
|
1258
|
-
mergeDuplicates: "Merge duplicates",
|
|
1259
|
-
mergeDuplicatesTooltip: "Collapse styles that are identical except for their name",
|
|
1260
|
-
apply: "Apply",
|
|
1261
|
-
close: "Close",
|
|
1262
|
-
defaultBadge: "default",
|
|
1263
|
-
noneYet: "None yet",
|
|
1264
|
-
kindParagraph: "Paragraph styles",
|
|
1265
|
-
kindCharacter: "Character styles",
|
|
1266
|
-
kindList: "List styles",
|
|
1267
|
-
kindTable: "Table styles",
|
|
1268
|
-
newParagraphStyle: "Paragraph style",
|
|
1269
|
-
newCharacterStyle: "Character style",
|
|
1270
|
-
newListStyle: "List style",
|
|
1271
|
-
newTableStyle: "Table style",
|
|
1272
|
-
ctxModify: "Modify",
|
|
1273
|
-
ctxDuplicate: "Duplicate",
|
|
1274
|
-
ctxSetDefault: "Set as default",
|
|
1275
|
-
ctxDelete: "Delete"
|
|
1276
|
-
},
|
|
1277
|
-
tocProperties: {
|
|
1278
|
-
title: "Table of contents — field options",
|
|
1279
|
-
headingLevelsLabel: "Heading levels",
|
|
1280
|
-
headingLevelsToggle: "Build from heading levels (\\o)",
|
|
1281
|
-
levelsFrom: "Levels",
|
|
1282
|
-
levelsTo: "to",
|
|
1283
|
-
optionsLabel: "Options",
|
|
1284
|
-
useOutlineLevels: "Include paragraphs with a direct outline level (\\u)",
|
|
1285
|
-
makeHyperlinks: "Make entries hyperlinks to their heading (\\h)",
|
|
1286
|
-
hideInWeb: "Hide leader & page numbers in web view (\\z)",
|
|
1287
|
-
separatorLabel: "Label / page-number separator (\\p)",
|
|
1288
|
-
separatorPlaceholder: "tab (default)",
|
|
1289
|
-
fieldInstructionLabel: "Field instruction"
|
|
1290
|
-
},
|
|
1291
|
-
symbolPicker: {
|
|
1292
|
-
title: "Insert symbol",
|
|
1293
|
-
font: "Font",
|
|
1294
|
-
recentlyUsed: "Recently used",
|
|
1295
|
-
symbols: "Symbols"
|
|
1296
|
-
},
|
|
1297
|
-
comment: {
|
|
1298
|
-
submit: "Comment",
|
|
1299
|
-
replyPlaceholder: "Reply…"
|
|
1300
|
-
}
|
|
1301
|
-
}, V = {
|
|
1302
|
-
common: {
|
|
1303
|
-
ok: "Đồng ý",
|
|
1304
|
-
cancel: "Hủy",
|
|
1305
|
-
apply: "Áp dụng",
|
|
1306
|
-
close: "Đóng",
|
|
1307
|
-
delete: "Xóa"
|
|
1308
|
-
},
|
|
1309
|
-
ribbon: {
|
|
1310
|
-
file: "Tệp",
|
|
1311
|
-
home: "Trang chủ",
|
|
1312
|
-
insert: "Chèn",
|
|
1313
|
-
layout: "Bố cục",
|
|
1314
|
-
table: "Bảng",
|
|
1315
|
-
view: "Xem",
|
|
1316
|
-
developer: "Nhà phát triển"
|
|
1317
|
-
},
|
|
1318
|
-
fileGroup: {
|
|
1319
|
-
groupUndo: "Hoàn tác",
|
|
1320
|
-
groupExport: "Xuất",
|
|
1321
|
-
undo: "Hoàn tác (Ctrl+Z)",
|
|
1322
|
-
redo: "Làm lại (Ctrl+Y)",
|
|
1323
|
-
exportPdf: "Xuất sang PDF",
|
|
1324
|
-
exportDocx: "Xuất sang .docx"
|
|
1325
|
-
},
|
|
1326
|
-
clipboard: {
|
|
1327
|
-
groupLabel: "Bảng tạm",
|
|
1328
|
-
paste: "Dán",
|
|
1329
|
-
pasteTooltip: "Dán (Ctrl+V)",
|
|
1330
|
-
cutTooltip: "Cắt (Ctrl+X)",
|
|
1331
|
-
copyTooltip: "Sao chép (Ctrl+C)",
|
|
1332
|
-
formatPainterTooltip: "Sao chép định dạng (nhấp đúp = cố định)"
|
|
1333
|
-
},
|
|
1334
|
-
font: {
|
|
1335
|
-
groupLabel: "Phông chữ",
|
|
1336
|
-
fontFamily: "Phông chữ",
|
|
1337
|
-
fontSize: "Cỡ chữ (pt)",
|
|
1338
|
-
fontSizePresets: "Cỡ chữ đặt trước",
|
|
1339
|
-
growFont: "Tăng cỡ chữ",
|
|
1340
|
-
shrinkFont: "Giảm cỡ chữ",
|
|
1341
|
-
changeCase: "Thay đổi kiểu chữ",
|
|
1342
|
-
clearFormatting: "Xóa toàn bộ định dạng",
|
|
1343
|
-
bold: "Đậm (Ctrl+B)",
|
|
1344
|
-
italic: "Nghiêng (Ctrl+I)",
|
|
1345
|
-
underline: "Gạch chân (Ctrl+U)",
|
|
1346
|
-
strikethrough: "Gạch ngang",
|
|
1347
|
-
superscript: "Chỉ số trên",
|
|
1348
|
-
subscript: "Chỉ số dưới",
|
|
1349
|
-
allCaps: "Toàn bộ viết hoa",
|
|
1350
|
-
smallCaps: "Chữ hoa nhỏ",
|
|
1351
|
-
doubleStrikethrough: "Gạch ngang đôi",
|
|
1352
|
-
fontEffects: "Phông chữ — hiệu ứng, viết hoa, kiểu gạch chân, khoảng cách",
|
|
1353
|
-
highlightColor: "Màu nền văn bản",
|
|
1354
|
-
fontColor: "Màu chữ",
|
|
1355
|
-
noColor: "Không màu",
|
|
1356
|
-
automatic: "Tự động",
|
|
1357
|
-
caseSentence: "Viết hoa đầu câu",
|
|
1358
|
-
caseLower: "chữ thường",
|
|
1359
|
-
caseUpper: "CHỮ HOA",
|
|
1360
|
-
caseTitle: "Viết Hoa Mỗi Từ",
|
|
1361
|
-
caseToggle: "ĐẢO kiểu CHỮ"
|
|
1362
|
-
},
|
|
1363
|
-
paragraph: {
|
|
1364
|
-
groupLabel: "Đoạn văn",
|
|
1365
|
-
bulletedList: "Danh sách có dấu đầu dòng",
|
|
1366
|
-
numberedList: "Danh sách đánh số (Tab/Shift+Tab đổi cấp)",
|
|
1367
|
-
multilevelList: "Danh sách đa cấp (1, 1.1, 1.1.1 — Tab / Shift+Tab đổi cấp)",
|
|
1368
|
-
decreaseIndent: "Giảm thụt lề",
|
|
1369
|
-
increaseIndent: "Tăng thụt lề",
|
|
1370
|
-
sort: "Sắp xếp",
|
|
1371
|
-
formattingMarks: "Hiện/ẩn dấu định dạng",
|
|
1372
|
-
alignLeft: "Căn trái",
|
|
1373
|
-
alignCenter: "Căn giữa",
|
|
1374
|
-
alignRight: "Căn phải",
|
|
1375
|
-
alignJustify: "Căn đều",
|
|
1376
|
-
ltr: "Đoạn văn trái sang phải",
|
|
1377
|
-
rtl: "Đoạn văn phải sang trái",
|
|
1378
|
-
lineSpacing: "Giãn dòng",
|
|
1379
|
-
lineSpacingOptions: "Tùy chọn giãn dòng…",
|
|
1380
|
-
borders: "Đường viền & nền",
|
|
1381
|
-
bulletFilledCircle: "• Hình tròn đặc",
|
|
1382
|
-
bulletHollowCircle: "◦ Hình tròn rỗng",
|
|
1383
|
-
bulletFilledSquare: "▪ Hình vuông đặc",
|
|
1384
|
-
bulletDash: "– Gạch ngang",
|
|
1385
|
-
bulletArrow: "➤ Mũi tên",
|
|
1386
|
-
numberDecimal: "1. Số thập phân",
|
|
1387
|
-
numberDecimalParen: "1) Số thập phân, dấu ngoặc",
|
|
1388
|
-
numberLowerLetter: "a. Chữ thường",
|
|
1389
|
-
numberUpperLetter: "A. Chữ hoa",
|
|
1390
|
-
numberLowerRoman: "i. Số La Mã thường",
|
|
1391
|
-
numberUpperRoman: "I. Số La Mã hoa"
|
|
1392
|
-
},
|
|
1393
|
-
styles: {
|
|
1394
|
-
groupLabel: "Kiểu dáng",
|
|
1395
|
-
updateStyle: "Cập nhật kiểu hiện tại theo vùng chọn",
|
|
1396
|
-
manageStyles: "Quản lý kiểu dáng…",
|
|
1397
|
-
showOnlyUsed: "Chỉ hiển thị kiểu đang dùng",
|
|
1398
|
-
showAllStyles: "Hiển thị tất cả kiểu dáng",
|
|
1399
|
-
charStyleSuffix: " ⓐ",
|
|
1400
|
-
charStyleTitle: " (kiểu ký tự)"
|
|
1401
|
-
},
|
|
1402
|
-
editing: {
|
|
1403
|
-
groupLabel: "Chỉnh sửa",
|
|
1404
|
-
find: "Tìm",
|
|
1405
|
-
findTooltip: "Tìm & thay thế (Ctrl+F)",
|
|
1406
|
-
replace: "Thay thế",
|
|
1407
|
-
replaceTooltip: "Thay thế (Ctrl+F)",
|
|
1408
|
-
selectAll: "Chọn tất cả",
|
|
1409
|
-
selectAllTooltip: "Chọn tất cả (Ctrl+A)"
|
|
1410
|
-
},
|
|
1411
|
-
insert: {
|
|
1412
|
-
groupPages: "Trang",
|
|
1413
|
-
pageBreak: "Ngắt trang (Ctrl+Enter)",
|
|
1414
|
-
sectionBreak: "Ngắt phần — trang tiếp theo",
|
|
1415
|
-
groupTables: "Bảng",
|
|
1416
|
-
insertTable: "Chèn bảng",
|
|
1417
|
-
groupIllustrations: "Hình ảnh",
|
|
1418
|
-
insertImage: "Chèn ảnh từ thiết bị",
|
|
1419
|
-
groupPicture: "Ảnh",
|
|
1420
|
-
wrapSquare: "Bao văn bản xung quanh ảnh (vuông)",
|
|
1421
|
-
wrapInline: "Ảnh trong dòng với văn bản (khối)",
|
|
1422
|
-
groupEquation: "Phương trình",
|
|
1423
|
-
insertEquation: "Chèn phương trình (MathML)",
|
|
1424
|
-
groupSymbols: "Ký hiệu",
|
|
1425
|
-
insertSymbol: "Chèn ký hiệu hoặc ký tự đặc biệt",
|
|
1426
|
-
groupLinks: "Liên kết",
|
|
1427
|
-
insertLink: "Chèn/xóa siêu liên kết",
|
|
1428
|
-
groupReferences: "Tham chiếu",
|
|
1429
|
-
insertToc: "Chèn / cập nhật mục lục (Ctrl+click để nhảy đến mục)",
|
|
1430
|
-
recalcToc: "Tính lại số trang mục lục theo bố cục hiện tại",
|
|
1431
|
-
insertFootnote: "Chèn chú thích cuối trang",
|
|
1432
|
-
insertEndnote: "Chèn chú thích cuối tài liệu",
|
|
1433
|
-
groupControls: "Điều khiển",
|
|
1434
|
-
richTextControl: "Điều khiển nội dung văn bản phong phú",
|
|
1435
|
-
checkboxControl: "Điều khiển hộp kiểm",
|
|
1436
|
-
dropdownControl: "Điều khiển danh sách thả xuống",
|
|
1437
|
-
datePickerControl: "Điều khiển chọn ngày",
|
|
1438
|
-
signatureControl: "Chọn khu vực ký (vị trí ký WeSign)",
|
|
1439
|
-
dropdownPrompt: "Các mục trong danh sách (phân cách bằng dấu phẩy):",
|
|
1440
|
-
dropdownDefault: "Có, Không, Không áp dụng",
|
|
1441
|
-
contentControlProps: "Thuộc tính & nội dung điều khiển (kiểm tra điều khiển tại con trỏ)",
|
|
1442
|
-
removeContentControl: "Xóa điều khiển nội dung tại con trỏ hoặc quanh ảnh đã chọn (giữ lại nội dung)",
|
|
1443
|
-
noContentControl: "Đặt con trỏ bên trong một điều khiển nội dung trước.",
|
|
1444
|
-
selectImageFirst: "hãy chọn ảnh trước",
|
|
1445
|
-
placeCaretInControl: "đặt con trỏ vào trong một điều khiển nội dung"
|
|
1446
|
-
},
|
|
1447
|
-
layout: {
|
|
1448
|
-
groupPageSetup: "Thiết lập trang",
|
|
1449
|
-
pageSetup: "Bố cục trang (kích thước, hướng, lề, cột, khoảng cách đầu/cuối trang, màu & viền trang — áp dụng cho phần hiện tại)"
|
|
1450
|
-
},
|
|
1451
|
-
table: {
|
|
1452
|
-
groupRowsCols: "Hàng & Cột",
|
|
1453
|
-
insertRowAbove: "Chèn hàng phía trên",
|
|
1454
|
-
insertRowBelow: "Chèn hàng phía dưới",
|
|
1455
|
-
insertColLeft: "Chèn cột bên trái",
|
|
1456
|
-
insertColRight: "Chèn cột bên phải",
|
|
1457
|
-
deleteRow: "Xóa hàng",
|
|
1458
|
-
deleteCol: "Xóa cột",
|
|
1459
|
-
deleteTable: "Xóa bảng",
|
|
1460
|
-
groupMerge: "Gộp ô",
|
|
1461
|
-
mergeCells: "Gộp ô (chọn trải rộng các ô trong một hàng)",
|
|
1462
|
-
unmergeCells: "Bỏ gộp ô",
|
|
1463
|
-
groupSize: "Kích thước",
|
|
1464
|
-
autofit: "Tự động vừa",
|
|
1465
|
-
autofitTooltip: "Tự động vừa cột theo nội dung hoặc cửa sổ, hoặc dùng độ rộng cố định",
|
|
1466
|
-
autofitContents: "Tự động vừa nội dung",
|
|
1467
|
-
autofitWindow: "Tự động vừa cửa sổ",
|
|
1468
|
-
fixedWidth: "Độ rộng cột cố định",
|
|
1469
|
-
width25: "Rộng: 25%",
|
|
1470
|
-
width50: "Rộng: 50%",
|
|
1471
|
-
width75: "Rộng: 75%",
|
|
1472
|
-
widthFull: "Rộng: Toàn trang",
|
|
1473
|
-
alignLeft: "Căn trái",
|
|
1474
|
-
alignCenter: "Căn giữa",
|
|
1475
|
-
alignRight: "Căn phải",
|
|
1476
|
-
placeCaretInTable: "Đặt con trỏ trong bảng hoặc chọn một hay nhiều ô trước."
|
|
1477
|
-
},
|
|
1478
|
-
view: {
|
|
1479
|
-
groupShow: "Hiển thị",
|
|
1480
|
-
outline: "Phác thảo / ngăn điều hướng (nhảy đến bất kỳ tiêu đề nào)",
|
|
1481
|
-
bookmarks: "Dấu trang — danh sách, đến, thêm, đổi tên, xóa",
|
|
1482
|
-
horizontalRuler: "Thước ngang",
|
|
1483
|
-
verticalRuler: "Thước dọc",
|
|
1484
|
-
showGrid: "Hiện lưới — lưới nhẹ để căn chỉnh đối tượng",
|
|
1485
|
-
snapToGrid: "Hút vào lưới — đối tượng neo vào đường lưới khi kéo",
|
|
1486
|
-
gridSpacing: "Khoảng cách lưới",
|
|
1487
|
-
activity: "Hoạt động — ai tạo/chỉnh sửa tài liệu này và khi nào",
|
|
1488
|
-
groupZoom: "Thu phóng",
|
|
1489
|
-
zoomIn: "Phóng to",
|
|
1490
|
-
zoomOut: "Thu nhỏ",
|
|
1491
|
-
zoomLevel: "Mức thu phóng"
|
|
1492
|
-
},
|
|
1493
|
-
review: {
|
|
1494
|
-
reviewButton: "Xét duyệt",
|
|
1495
|
-
reviewButtonTooltip: "Đề xuất & nhận xét — xét duyệt, chấp nhận, từ chối",
|
|
1496
|
-
addComment: "+ Bình luận",
|
|
1497
|
-
addCommentTooltip: "Thêm bình luận tại vùng chọn (Ctrl+Alt+M / Cmd+Option+M)",
|
|
1498
|
-
editingMode: "Chế độ chỉnh sửa",
|
|
1499
|
-
modeEditing: "Đang chỉnh sửa",
|
|
1500
|
-
modeSuggesting: "Đang đề xuất",
|
|
1501
|
-
modeViewing: "Đang xem"
|
|
1502
|
-
},
|
|
1503
|
-
developer: {
|
|
1504
|
-
groupInspect: "Kiểm tra",
|
|
1505
|
-
inspectTree: "Kiểm tra cây tài liệu",
|
|
1506
|
-
inspectTreeTooltip: "Mở trình kiểm tra cây tài liệu — duyệt mô hình đã phân tích, tô sáng node trên trang và đọc JSON của từng node"
|
|
1507
|
-
},
|
|
1508
|
-
contextMenu: {
|
|
1509
|
-
cut: "Cắt",
|
|
1510
|
-
copy: "Sao chép",
|
|
1511
|
-
paste: "Dán",
|
|
1512
|
-
pasteText: "Dán dưới dạng văn bản thuần",
|
|
1513
|
-
comment: "Nhận xét",
|
|
1514
|
-
image: "Hình ảnh",
|
|
1515
|
-
wrapSquare: "Bao văn bản: vuông",
|
|
1516
|
-
wrapBlock: "Bao văn bản: nội tuyến (khối)",
|
|
1517
|
-
editField: "Chỉnh sửa trường",
|
|
1518
|
-
updateField: "Cập nhật trường",
|
|
1519
|
-
hyperlink: "Siêu liên kết",
|
|
1520
|
-
editHyperlink: "Chỉnh sửa siêu liên kết",
|
|
1521
|
-
removeHyperlink: "Xóa siêu liên kết",
|
|
1522
|
-
openLink: "Mở liên kết trong tab mới",
|
|
1523
|
-
tableMenu: "Bảng",
|
|
1524
|
-
tableProperties: "Thuộc tính bảng",
|
|
1525
|
-
acceptSuggestion: "Chấp nhận",
|
|
1526
|
-
rejectSuggestion: "Từ chối",
|
|
1527
|
-
acceptAll: "Chấp nhận tất cả đề xuất",
|
|
1528
|
-
rejectAll: "Từ chối tất cả đề xuất",
|
|
1529
|
-
bookmark: "Dấu trang",
|
|
1530
|
-
addBookmark: "Thêm dấu trang",
|
|
1531
|
-
removeBookmark: "Xóa dấu trang",
|
|
1532
|
-
gotoBookmark: "Đến dấu trang"
|
|
1533
|
-
},
|
|
1534
|
-
activity: {
|
|
1535
|
-
title: "Hoạt động",
|
|
1536
|
-
createdLocally: "Đã tạo cục bộ",
|
|
1537
|
-
createdByTemplate: "Tạo bởi {name} · {time}",
|
|
1538
|
-
noEdits: "Chưa có chỉnh sửa.",
|
|
1539
|
-
shareToTrack: "Chia sẻ tài liệu (hoặc mở trực tuyến) để theo dõi hoạt động.",
|
|
1540
|
-
justNow: "vừa xong",
|
|
1541
|
-
originTyped: "đã gõ",
|
|
1542
|
-
originPasted: "đã dán",
|
|
1543
|
-
originUndo: "hoàn tác",
|
|
1544
|
-
originRedo: "làm lại",
|
|
1545
|
-
originEdited: "đã chỉnh sửa"
|
|
1546
|
-
},
|
|
1547
|
-
outline: {
|
|
1548
|
-
title: "Phác thảo"
|
|
1549
|
-
},
|
|
1550
|
-
busy: {
|
|
1551
|
-
exporting: "Đang xuất…"
|
|
1552
|
-
},
|
|
1553
|
-
fontDialog: {
|
|
1554
|
-
title: "Phông chữ",
|
|
1555
|
-
sectionEffects: "Hiệu ứng",
|
|
1556
|
-
allCaps: "Toàn bộ viết hoa",
|
|
1557
|
-
smallCaps: "Chữ hoa nhỏ",
|
|
1558
|
-
doubleStrikethrough: "Gạch ngang đôi",
|
|
1559
|
-
outline: "Viền chữ",
|
|
1560
|
-
shadow: "Bóng đổ",
|
|
1561
|
-
emboss: "Nổi",
|
|
1562
|
-
engrave: "Khắc chìm",
|
|
1563
|
-
sectionUnderline: "Gạch chân",
|
|
1564
|
-
underlineStyle: "Kiểu gạch chân",
|
|
1565
|
-
underlineColor: "Màu gạch chân",
|
|
1566
|
-
automatic: "Tự động",
|
|
1567
|
-
ulNone: "(không có)",
|
|
1568
|
-
ulSingle: "Đơn",
|
|
1569
|
-
ulDouble: "Đôi",
|
|
1570
|
-
ulThick: "Dày",
|
|
1571
|
-
ulDotted: "Chấm",
|
|
1572
|
-
ulDashed: "Nét đứt",
|
|
1573
|
-
ulDotDash: "Chấm gạch",
|
|
1574
|
-
ulDotDotDash: "Chấm chấm gạch",
|
|
1575
|
-
ulWave: "Lượn sóng",
|
|
1576
|
-
sectionSpacing: "Khoảng cách & vị trí",
|
|
1577
|
-
position: "Vị trí (nâng/hạ)",
|
|
1578
|
-
scale: "Tỷ lệ (chiều rộng)",
|
|
1579
|
-
charSpacing: "Khoảng cách ký tự",
|
|
1580
|
-
kerning: "Căn chỉnh ký tự từ cỡ",
|
|
1581
|
-
fitText: "Độ rộng vừa chữ",
|
|
1582
|
-
sectionEmphasis: "Dấu nhấn",
|
|
1583
|
-
emphasisMark: "Dấu",
|
|
1584
|
-
emNone: "(không có)",
|
|
1585
|
-
emDot: "Chấm (trên)",
|
|
1586
|
-
emComma: "Phẩy (trên)",
|
|
1587
|
-
emCircle: "Vòng tròn (trên)",
|
|
1588
|
-
emUnderDot: "Chấm (dưới)",
|
|
1589
|
-
unitPx: "px",
|
|
1590
|
-
unitPct: "%"
|
|
1591
|
-
},
|
|
1592
|
-
paragraphDialog: {
|
|
1593
|
-
title: "Đoạn văn",
|
|
1594
|
-
sectionBorders: "Đường viền",
|
|
1595
|
-
borderColor: "Màu",
|
|
1596
|
-
borderWidth: "Độ rộng (px)",
|
|
1597
|
-
borderStyle: "Kiểu",
|
|
1598
|
-
sectionShading: "Nền (màu tô)",
|
|
1599
|
-
fill: "Màu tô",
|
|
1600
|
-
sectionSpacing: "Giãn dòng & ngắt dòng",
|
|
1601
|
-
lineSpacing: "Giãn dòng",
|
|
1602
|
-
lineSpacingAt: "Tại",
|
|
1603
|
-
lineSpacingAtPx: "Tại (px)",
|
|
1604
|
-
lsMultiple: "Bội số",
|
|
1605
|
-
lsAtLeast: "Ít nhất",
|
|
1606
|
-
lsExactly: "Đúng",
|
|
1607
|
-
verticalAlignment: "Căn dọc",
|
|
1608
|
-
vaBaseline: "Đường cơ sở",
|
|
1609
|
-
vaTop: "Trên",
|
|
1610
|
-
vaCenter: "Giữa",
|
|
1611
|
-
vaBottom: "Dưới",
|
|
1612
|
-
contextualSpacing: "Khoảng cách theo ngữ cảnh",
|
|
1613
|
-
widowOrphan: "Kiểm soát dòng lẻ",
|
|
1614
|
-
mirrorIndents: "Thụt lề đối xứng",
|
|
1615
|
-
suppressLineNumbers: "Ẩn số dòng",
|
|
1616
|
-
adjustRightIndent: "Điều chỉnh lề phải",
|
|
1617
|
-
edgeTop: "Trên",
|
|
1618
|
-
edgeRight: "Phải",
|
|
1619
|
-
edgeBottom: "Dưới",
|
|
1620
|
-
edgeLeft: "Trái",
|
|
1621
|
-
edgeBetween: "Giữa"
|
|
1622
|
-
},
|
|
1623
|
-
pageLayout: {
|
|
1624
|
-
title: "Bố cục trang",
|
|
1625
|
-
labelInches: "inch",
|
|
1626
|
-
labelCm: "cm",
|
|
1627
|
-
sectionSize: "Kích thước & Hướng",
|
|
1628
|
-
sectionMargins: "Lề",
|
|
1629
|
-
sectionColumns: "Cột",
|
|
1630
|
-
sectionHeaderFooter: "Đầu / Chân trang",
|
|
1631
|
-
sectionLineNumbers: "Số dòng",
|
|
1632
|
-
sectionPageColor: "Màu trang",
|
|
1633
|
-
sectionPageBorder: "Viền trang",
|
|
1634
|
-
sectionBreak: "Ngắt phần",
|
|
1635
|
-
paperSize: "Kích thước giấy",
|
|
1636
|
-
orientation: "Hướng",
|
|
1637
|
-
orientationPortrait: "Dọc",
|
|
1638
|
-
orientationLandscape: "Ngang",
|
|
1639
|
-
customSize: "Tùy chỉnh",
|
|
1640
|
-
width: "Chiều rộng",
|
|
1641
|
-
height: "Chiều cao",
|
|
1642
|
-
marginTop: "Trên",
|
|
1643
|
-
marginBottom: "Dưới",
|
|
1644
|
-
marginLeft: "Trái",
|
|
1645
|
-
marginRight: "Phải",
|
|
1646
|
-
marginGutter: "Gáy",
|
|
1647
|
-
mirrorMargins: "Lề đối xứng",
|
|
1648
|
-
marginNormal: "Thường",
|
|
1649
|
-
marginNarrow: "Hẹp",
|
|
1650
|
-
marginWide: "Rộng",
|
|
1651
|
-
columnCount: "Số cột",
|
|
1652
|
-
columnSpacing: "Khoảng cách",
|
|
1653
|
-
columnSeparatorLine: "Đường phân cách",
|
|
1654
|
-
headerDistance: "Đầu trang",
|
|
1655
|
-
footerDistance: "Chân trang",
|
|
1656
|
-
lineNumbersEnable: "Đánh số dòng",
|
|
1657
|
-
lineNumberStart: "Bắt đầu từ",
|
|
1658
|
-
lineNumberStep: "Đếm theo",
|
|
1659
|
-
lineNumberRestart: "Đặt lại mỗi trang",
|
|
1660
|
-
pageColor: "Màu trang",
|
|
1661
|
-
pageBorder: "Đường viền",
|
|
1662
|
-
pageBorderStyle: "Kiểu",
|
|
1663
|
-
pageBorderColor: "Màu",
|
|
1664
|
-
pageBorderWidth: "Độ rộng",
|
|
1665
|
-
pageBorderApply: "Áp dụng cho",
|
|
1666
|
-
pageBorderApplyPage: "Toàn bộ tài liệu",
|
|
1667
|
-
pageBorderApplySection: "Phần này",
|
|
1668
|
-
sectionBreakType: "Kiểu ngắt",
|
|
1669
|
-
sectionBreakNextPage: "Trang tiếp theo",
|
|
1670
|
-
sectionBreakContinuous: "Liên tục",
|
|
1671
|
-
sectionBreakEvenPage: "Trang chẵn",
|
|
1672
|
-
sectionBreakOddPage: "Trang lẻ"
|
|
1673
|
-
},
|
|
1674
|
-
tableProperties: {
|
|
1675
|
-
title: "Đường viền & Nền",
|
|
1676
|
-
closeTooltip: "Đóng (Esc)",
|
|
1677
|
-
sectionBorders: "Đường viền",
|
|
1678
|
-
borderColor: "Màu",
|
|
1679
|
-
borderWidth: "Độ rộng (px)",
|
|
1680
|
-
borderStyle: "Kiểu",
|
|
1681
|
-
borderApplyTo: "Áp dụng viền cho",
|
|
1682
|
-
hint: "Chọn mục tiêu để áp dụng ngay — hoặc thiết lập tùy chọn và nhấn Xong.",
|
|
1683
|
-
individualEdges: "Từng cạnh",
|
|
1684
|
-
presetAll: "Tất cả",
|
|
1685
|
-
presetOutside: "Bên ngoài",
|
|
1686
|
-
presetInside: "Bên trong",
|
|
1687
|
-
presetNone: "Không có",
|
|
1688
|
-
edgeTop: "Trên",
|
|
1689
|
-
edgeBottom: "Dưới",
|
|
1690
|
-
edgeLeft: "Trái",
|
|
1691
|
-
edgeRight: "Phải",
|
|
1692
|
-
edgeInsideH: "Trong H",
|
|
1693
|
-
edgeInsideV: "Trong V",
|
|
1694
|
-
sectionShading: "Nền (màu tô)",
|
|
1695
|
-
fill: "Màu tô",
|
|
1696
|
-
applyFill: "Áp dụng màu nền",
|
|
1697
|
-
noFill: "Không màu",
|
|
1698
|
-
sectionTableSize: "Kích thước bảng",
|
|
1699
|
-
tableWidth: "Độ rộng",
|
|
1700
|
-
tableAlign: "Căn chỉnh",
|
|
1701
|
-
tableAlignLeft: "Trái",
|
|
1702
|
-
tableAlignCenter: "Giữa",
|
|
1703
|
-
tableAlignRight: "Phải",
|
|
1704
|
-
tableIndent: "Thụt lề",
|
|
1705
|
-
fullWidth: "Toàn bộ chiều rộng",
|
|
1706
|
-
unitPercent: "%",
|
|
1707
|
-
unitPx: "px",
|
|
1708
|
-
unitInch: "inch",
|
|
1709
|
-
sectionCell: "Ô",
|
|
1710
|
-
cellVAlign: "Căn dọc",
|
|
1711
|
-
cellVAlignTop: "Trên",
|
|
1712
|
-
cellVAlignCenter: "Giữa",
|
|
1713
|
-
cellVAlignBottom: "Dưới",
|
|
1714
|
-
cellTextDir: "Hướng chữ",
|
|
1715
|
-
cellTextDirLrTb: "Trái sang phải",
|
|
1716
|
-
cellTextDirTbRl: "Trên xuống dưới (xoay)",
|
|
1717
|
-
cellTextDirBtLr: "Dưới lên trên (xoay)",
|
|
1718
|
-
sectionRow: "Hàng",
|
|
1719
|
-
rowHeight: "Chiều cao",
|
|
1720
|
-
rowHeightMin: "Ít nhất",
|
|
1721
|
-
rowHeightExact: "Đúng",
|
|
1722
|
-
rowKeepTogether: "Giữ hàng liền nhau",
|
|
1723
|
-
rowRepeatHeader: "Lặp lại như hàng tiêu đề",
|
|
1724
|
-
sectionTableDefaults: "Mặc định bảng",
|
|
1725
|
-
tableDefaultBorders: "Viền mặc định",
|
|
1726
|
-
tableDefaultShading: "Nền mặc định",
|
|
1727
|
-
tableDefaultCellMargin: "Lề ô mặc định",
|
|
1728
|
-
cellMarginTop: "Trên",
|
|
1729
|
-
cellMarginBottom: "Dưới",
|
|
1730
|
-
cellMarginLeft: "Trái",
|
|
1731
|
-
cellMarginRight: "Phải",
|
|
1732
|
-
done: "Xong"
|
|
1733
|
-
},
|
|
1734
|
-
styleManager: {
|
|
1735
|
-
title: "Quản lý kiểu dáng",
|
|
1736
|
-
previewLabel: "Xem trước",
|
|
1737
|
-
newStyle: "Mới ▾",
|
|
1738
|
-
deleteStyle: "Xóa",
|
|
1739
|
-
mergeDuplicates: "Gộp bản trùng",
|
|
1740
|
-
mergeDuplicatesTooltip: "Thu gọn các kiểu giống hệt nhau ngoại trừ tên",
|
|
1741
|
-
apply: "Áp dụng",
|
|
1742
|
-
close: "Đóng",
|
|
1743
|
-
defaultBadge: "mặc định",
|
|
1744
|
-
noneYet: "Chưa có",
|
|
1745
|
-
kindParagraph: "Kiểu đoạn văn",
|
|
1746
|
-
kindCharacter: "Kiểu ký tự",
|
|
1747
|
-
kindList: "Kiểu danh sách",
|
|
1748
|
-
kindTable: "Kiểu bảng",
|
|
1749
|
-
newParagraphStyle: "Kiểu đoạn văn",
|
|
1750
|
-
newCharacterStyle: "Kiểu ký tự",
|
|
1751
|
-
newListStyle: "Kiểu danh sách",
|
|
1752
|
-
newTableStyle: "Kiểu bảng",
|
|
1753
|
-
ctxModify: "Sửa đổi",
|
|
1754
|
-
ctxDuplicate: "Nhân bản",
|
|
1755
|
-
ctxSetDefault: "Đặt làm mặc định",
|
|
1756
|
-
ctxDelete: "Xóa"
|
|
1757
|
-
},
|
|
1758
|
-
tocProperties: {
|
|
1759
|
-
title: "Mục lục — tùy chọn trường",
|
|
1760
|
-
headingLevelsLabel: "Cấp tiêu đề",
|
|
1761
|
-
headingLevelsToggle: "Xây dựng từ cấp tiêu đề (\\o)",
|
|
1762
|
-
levelsFrom: "Từ cấp",
|
|
1763
|
-
levelsTo: "đến",
|
|
1764
|
-
optionsLabel: "Tùy chọn",
|
|
1765
|
-
useOutlineLevels: "Bao gồm đoạn văn có cấp phác thảo trực tiếp (\\u)",
|
|
1766
|
-
makeHyperlinks: "Tạo các mục liên kết đến tiêu đề (\\h)",
|
|
1767
|
-
hideInWeb: "Ẩn chấm dẫn & số trang trong chế độ xem web (\\z)",
|
|
1768
|
-
separatorLabel: "Dấu phân cách nhãn / số trang (\\p)",
|
|
1769
|
-
separatorPlaceholder: "tab (mặc định)",
|
|
1770
|
-
fieldInstructionLabel: "Lệnh trường"
|
|
1771
|
-
},
|
|
1772
|
-
symbolPicker: {
|
|
1773
|
-
title: "Chèn ký hiệu",
|
|
1774
|
-
font: "Phông",
|
|
1775
|
-
recentlyUsed: "Đã dùng gần đây",
|
|
1776
|
-
symbols: "Ký hiệu"
|
|
1777
|
-
},
|
|
1778
|
-
comment: {
|
|
1779
|
-
submit: "Nhận xét",
|
|
1780
|
-
replyPlaceholder: "Trả lời…"
|
|
1781
|
-
}
|
|
1782
|
-
}, K = {
|
|
1783
|
-
en: u,
|
|
1784
|
-
vi: V
|
|
1785
|
-
};
|
|
1786
|
-
function j(r) {
|
|
1787
|
-
const t = (r ?? (typeof navigator < "u" ? navigator.language : "en") ?? "en").split(/[-_]/)[0].toLowerCase();
|
|
1788
|
-
return K[t] ?? u;
|
|
1789
|
-
}
|
|
1790
|
-
class $ {
|
|
1791
|
-
/** Namespaced, typed public integration events. Legacy on()/off() remains. */
|
|
1792
|
-
events;
|
|
1793
|
-
handle = null;
|
|
1794
|
-
pendingQRCode = void 0;
|
|
1795
|
-
ready;
|
|
1796
|
-
handlers = /* @__PURE__ */ new Map();
|
|
1797
|
-
constructor(e) {
|
|
1798
|
-
this.pendingQRCode = e.qrCode, this.events = new P(e.events), this.ready = new Promise((t) => {
|
|
1799
|
-
const o = {
|
|
1800
|
-
container: e.container,
|
|
1801
|
-
backendUrl: e.backendUrl,
|
|
1802
|
-
// `docId` is the canonical name; fall back to the deprecated `collabId`.
|
|
1803
|
-
collabId: e.docId ?? e.collabId,
|
|
1804
|
-
user: e.user,
|
|
1805
|
-
onShareLink: e.onShareLink,
|
|
1806
|
-
onSave: e.onSave,
|
|
1807
|
-
readonly: e.readonly,
|
|
1808
|
-
mode: e.mode,
|
|
1809
|
-
allowedModes: e.allowedModes,
|
|
1810
|
-
permissions: e.permissions,
|
|
1811
|
-
knownUsers: e.knownUsers,
|
|
1812
|
-
mentionPicker: e.mentionPicker,
|
|
1813
|
-
reviewAccess: e.reviewAccess,
|
|
1814
|
-
resolveField: e.resolveField,
|
|
1815
|
-
agentTools: e.agentTools,
|
|
1816
|
-
view: e.view,
|
|
1817
|
-
theme: e.theme,
|
|
1818
|
-
overrideDefaultStyles: e.overrideDefaultStyles,
|
|
1819
|
-
behavior: e.behavior,
|
|
1820
|
-
develop: e.develop,
|
|
1821
|
-
fonts: e.fonts,
|
|
1822
|
-
cjk: e.cjk,
|
|
1823
|
-
customizeRibbon: e.customizeRibbon,
|
|
1824
|
-
onLoadProgress: e.onLoadProgress,
|
|
1825
|
-
eventDetail: this.events.detail,
|
|
1826
|
-
includeSelectionEvents: this.events.includeSelection,
|
|
1827
|
-
messages: j(e.locale),
|
|
1828
|
-
onVariableClick: e.onVariableClick,
|
|
1829
|
-
showVariablePopover: e.showVariablePopover,
|
|
1830
|
-
qrCode: e.qrCode,
|
|
1831
|
-
onReady: (n) => {
|
|
1832
|
-
this.handle = n, this.pendingQRCode !== void 0 && n.setQRCode(this.pendingQRCode), t(n);
|
|
1833
|
-
},
|
|
1834
|
-
onEvent: (n) => this.emit(n),
|
|
1835
|
-
onPublicEvent: (n) => this.events.dispatch(n)
|
|
1836
|
-
};
|
|
1837
|
-
e.onLoadProgress?.({ phase: "bundle", percent: 0, loaded: 0, total: 0 }), import("./editorApp-BtDzRfJq.js").then((n) => n.e).then((n) => (e.onLoadProgress?.({ phase: "bundle", percent: p, loaded: 0, total: 0 }), n.mountEditorApp(o)));
|
|
1838
|
-
});
|
|
1839
|
-
}
|
|
1840
|
-
/** Subscribe to a collaboration event. Returns an unsubscribe function. */
|
|
1841
|
-
on(e, t) {
|
|
1842
|
-
let o = this.handlers.get(e);
|
|
1843
|
-
return o || this.handlers.set(e, o = /* @__PURE__ */ new Set()), o.add(t), () => this.off(e, t);
|
|
1844
|
-
}
|
|
1845
|
-
/** Unsubscribe a handler previously passed to on(). */
|
|
1846
|
-
off(e, t) {
|
|
1847
|
-
this.handlers.get(e)?.delete(t);
|
|
1848
|
-
}
|
|
1849
|
-
emit(e) {
|
|
1850
|
-
const { type: t, ...o } = e;
|
|
1851
|
-
for (const n of this.handlers.get(t) ?? []) n(o);
|
|
1852
|
-
}
|
|
1853
|
-
/** Resolves once the editor is mounted and ready. */
|
|
1854
|
-
whenReady() {
|
|
1855
|
-
return this.ready;
|
|
1856
|
-
}
|
|
1857
|
-
/** Update or clear the header/footer QR code configuration. Triggers instant re-render. */
|
|
1858
|
-
setQRCode(e) {
|
|
1859
|
-
this.pendingQRCode = e, this.handle?.setQRCode(e), typeof console < "u" && (e ? console.log(
|
|
1860
|
-
"%c[KindyEditor]%c QR Code updated:",
|
|
1861
|
-
"background:#2563eb;color:#fff;font-weight:bold;padding:1px 5px;border-radius:3px;",
|
|
1862
|
-
"color:#1e293b;font-weight:bold;"
|
|
1863
|
-
) : console.log(
|
|
1864
|
-
"%c[KindyEditor]%c QR Code removed.",
|
|
1865
|
-
"background:#64748b;color:#fff;font-weight:bold;padding:1px 5px;border-radius:3px;",
|
|
1866
|
-
"color:#475569;"
|
|
1867
|
-
)), this.events.emit("custom", {
|
|
1868
|
-
name: "qrcode.changed",
|
|
1869
|
-
payload: e
|
|
1870
|
-
});
|
|
1871
|
-
}
|
|
1872
|
-
/** Get current header/footer QR code configuration. */
|
|
1873
|
-
getQRCode() {
|
|
1874
|
-
return this.handle ? this.handle.getQRCode() : this.pendingQRCode ?? void 0;
|
|
1875
|
-
}
|
|
1876
|
-
/** Create a child document that shares this editor's live styles, fonts and
|
|
1877
|
-
* theme. Use it to render a real, document-styled preview of a content slice
|
|
1878
|
-
* (e.g. a style sample, a field result, or any blocks/fragment/OOXML) onto a
|
|
1879
|
-
* canvas — instead of an HTML approximation — or to mount a canvas-native
|
|
1880
|
-
* editor over a slice. Returned synchronously; render() calls before the editor
|
|
1881
|
-
* is ready are buffered and flush on ready. (mountEditor() requires the editor
|
|
1882
|
-
* to be ready — await whenReady() first.) */
|
|
1883
|
-
createChild() {
|
|
1884
|
-
let e = null, t = null, o = !1;
|
|
1885
|
-
return this.ready.then((n) => {
|
|
1886
|
-
o || (e = n.createChild(), t?.(), t = null);
|
|
1887
|
-
}), {
|
|
1888
|
-
render: (n, d, i) => {
|
|
1889
|
-
const a = () => e?.render(n, d, i);
|
|
1890
|
-
e ? a() : t = a;
|
|
1891
|
-
},
|
|
1892
|
-
mountEditor: (n, d, i) => {
|
|
1893
|
-
if (!e) throw new Error("KindyEditor.createChild(): await whenReady() before mountEditor()");
|
|
1894
|
-
return e.mountEditor(n, d, i);
|
|
1895
|
-
},
|
|
1896
|
-
destroy: () => {
|
|
1897
|
-
o = !0, e?.destroy(), e = null;
|
|
1898
|
-
}
|
|
1899
|
-
};
|
|
1900
|
-
}
|
|
1901
|
-
/** Open a .docx. When online, auto-publishes it and surfaces a share link. */
|
|
1902
|
-
async openDocx(e) {
|
|
1903
|
-
return (await this.ready).openDocx(e);
|
|
1904
|
-
}
|
|
1905
|
-
/** Open a JSON document (.json or FullDocumentExport). */
|
|
1906
|
-
async openJson(e) {
|
|
1907
|
-
return (await this.ready).openJson(e);
|
|
1908
|
-
}
|
|
1909
|
-
/** Export the current document to a .docx Blob — track changes baked to the
|
|
1910
|
-
* original baseline, exactly like the toolbar's Export. Wire it to your own
|
|
1911
|
-
* Save button and POST it anywhere. Resolves once the editor is ready. */
|
|
1912
|
-
async exportDocx() {
|
|
1913
|
-
return (await this.ready).exportDocx();
|
|
1914
|
-
}
|
|
1915
|
-
/** Export the current document to a PDF Blob (see `exportDocx`). */
|
|
1916
|
-
async exportPdf() {
|
|
1917
|
-
return (await this.ready).exportPdf();
|
|
1918
|
-
}
|
|
1919
|
-
/** Export the full document snapshot + review/comments to a JSON Blob. */
|
|
1920
|
-
async exportJson() {
|
|
1921
|
-
return (await this.ready).exportJson();
|
|
1922
|
-
}
|
|
1923
|
-
/** Get the full document JSON payload (Document, ReviewLayer, metadata, mediaIds). */
|
|
1924
|
-
async getFullJson() {
|
|
1925
|
-
return (await this.ready).getFullJson();
|
|
1926
|
-
}
|
|
1927
|
-
/** Snapshot of the current document (plain data). Returns null before ready. */
|
|
1928
|
-
getDocument() {
|
|
1929
|
-
return this.handle?.getDocument() ?? null;
|
|
1930
|
-
}
|
|
1931
|
-
/** Replace the open document with a programmatically-built one (e.g. a
|
|
1932
|
-
* DocumentBuilder result). The input is cloned. Like openDocx, this starts
|
|
1933
|
-
* a NEW document: undo history and any live collab session are dropped
|
|
1934
|
-
* (the next share() forks). Zoom and scroll position are preserved, so
|
|
1935
|
-
* calling this on every data change gives a stable live preview. */
|
|
1936
|
-
async setDocument(e) {
|
|
1937
|
-
(await this.ready).setDocument(e);
|
|
1938
|
-
}
|
|
1939
|
-
/** Publish the current document and resolve its shareable link (online only). */
|
|
1940
|
-
async share() {
|
|
1941
|
-
return (await this.ready).share();
|
|
1942
|
-
}
|
|
1943
|
-
// ---- review layer (track changes + comments) ----------------------------
|
|
1944
|
-
/** Current editor mode. Returns null before the editor is ready. */
|
|
1945
|
-
getMode() {
|
|
1946
|
-
return this.handle?.getMode() ?? null;
|
|
1947
|
-
}
|
|
1948
|
-
/** Switch mode. Resolves to false if the mode isn't allowed (or not ready). */
|
|
1949
|
-
async setMode(e) {
|
|
1950
|
-
return (await this.ready).setMode(e);
|
|
1951
|
-
}
|
|
1952
|
-
/** Snapshot of the review overlay (suggestions + comment threads). */
|
|
1953
|
-
async getReview() {
|
|
1954
|
-
return (await this.ready).getReview();
|
|
1955
|
-
}
|
|
1956
|
-
/** The effective @-mentionable roster: the configured base PLUS whoever is
|
|
1957
|
-
* live-editing the document right now (auto-merged from presence). */
|
|
1958
|
-
async getKnownUsers() {
|
|
1959
|
-
return (await this.ready).getKnownUsers();
|
|
1960
|
-
}
|
|
1961
|
-
/** Replace the configured base roster (live editors are still merged on top). */
|
|
1962
|
-
async setKnownUsers(e) {
|
|
1963
|
-
(await this.ready).setKnownUsers(e);
|
|
1964
|
-
}
|
|
1965
|
-
async acceptSuggestion(e) {
|
|
1966
|
-
(await this.ready).acceptSuggestion(e);
|
|
1967
|
-
}
|
|
1968
|
-
async rejectSuggestion(e) {
|
|
1969
|
-
(await this.ready).rejectSuggestion(e);
|
|
1970
|
-
}
|
|
1971
|
-
async acceptAllSuggestions() {
|
|
1972
|
-
(await this.ready).acceptAllSuggestions();
|
|
1973
|
-
}
|
|
1974
|
-
async rejectAllSuggestions() {
|
|
1975
|
-
(await this.ready).rejectAllSuggestions();
|
|
1976
|
-
}
|
|
1977
|
-
/** Add a comment thread anchored to the current selection (a rich-text body;
|
|
1978
|
-
* `mentions` are @-tagged users). Resolves to the thread id, or null if
|
|
1979
|
-
* there's no selection. */
|
|
1980
|
-
async addComment(e, t) {
|
|
1981
|
-
return (await this.ready).addComment(e, t);
|
|
1982
|
-
}
|
|
1983
|
-
async replyToComment(e, t, o) {
|
|
1984
|
-
(await this.ready).replyToComment(e, t, o);
|
|
1985
|
-
}
|
|
1986
|
-
async startComment() {
|
|
1987
|
-
(await this.ready).startComment();
|
|
1988
|
-
}
|
|
1989
|
-
async openCommentThread(e) {
|
|
1990
|
-
(await this.ready).openCommentThread(e);
|
|
1991
|
-
}
|
|
1992
|
-
async editComment(e, t, o, n) {
|
|
1993
|
-
(await this.ready).editComment(e, t, o, n);
|
|
1994
|
-
}
|
|
1995
|
-
async deleteComment(e, t) {
|
|
1996
|
-
(await this.ready).deleteComment(e, t);
|
|
1997
|
-
}
|
|
1998
|
-
async resolveThread(e, t = !0) {
|
|
1999
|
-
(await this.ready).resolveThread(e, t);
|
|
2000
|
-
}
|
|
2001
|
-
async setReviewAccess(e) {
|
|
2002
|
-
(await this.ready).setReviewAccess(e);
|
|
2003
|
-
}
|
|
2004
|
-
/** Current selection/caret. Returns null before the editor is ready or when
|
|
2005
|
-
* the editor isn't focused. */
|
|
2006
|
-
getSelection() {
|
|
2007
|
-
return this.handle?.getSelection() ?? null;
|
|
2008
|
-
}
|
|
2009
|
-
/** Insert plain text at the caret (replacing any selection). */
|
|
2010
|
-
async insertText(e) {
|
|
2011
|
-
(await this.ready).insertText(e);
|
|
2012
|
-
}
|
|
2013
|
-
getTableSelection() {
|
|
2014
|
-
return this.handle?.getTableSelection() ?? null;
|
|
2015
|
-
}
|
|
2016
|
-
async setTableSelection(e) {
|
|
2017
|
-
(await this.ready).setTableSelection(e);
|
|
2018
|
-
}
|
|
2019
|
-
canExecuteTableAction(e) {
|
|
2020
|
-
return this.handle?.canExecuteTableAction(e) ?? !1;
|
|
2021
|
-
}
|
|
2022
|
-
async executeTableAction(e) {
|
|
2023
|
-
return (await this.ready).executeTableAction(e);
|
|
2024
|
-
}
|
|
2025
|
-
/** Check if a table action can be executed by host with optional selection. */
|
|
2026
|
-
canExecuteHostTableAction(e, t) {
|
|
2027
|
-
return this.handle?.canExecuteHostTableAction(e, t) ?? !1;
|
|
2028
|
-
}
|
|
2029
|
-
/** Execute a table action from host/code, optionally targeting a specific selection or table path/ID. */
|
|
2030
|
-
async executeHostTableAction(e, t) {
|
|
2031
|
-
return (await this.ready).executeHostTableAction(e, t);
|
|
2032
|
-
}
|
|
2033
|
-
/** Update the text value of a single cell in a table. */
|
|
2034
|
-
async setTableCellValue(e, t, o, n) {
|
|
2035
|
-
return (await this.ready).setTableCellValue(e, t, o, n);
|
|
2036
|
-
}
|
|
2037
|
-
/** Replace data rows in a table in a single atomic batch update. */
|
|
2038
|
-
async replaceTableRows(e, t, o) {
|
|
2039
|
-
return (await this.ready).replaceTableRows(e, t, o);
|
|
2040
|
-
}
|
|
2041
|
-
/** Get summaries of all tables in the document. */
|
|
2042
|
-
getTables() {
|
|
2043
|
-
return this.handle?.getTables() ?? [];
|
|
2044
|
-
}
|
|
2045
|
-
getDocId() {
|
|
2046
|
-
return this.handle?.getDocId() ?? null;
|
|
2047
|
-
}
|
|
2048
|
-
getShareLink() {
|
|
2049
|
-
return this.handle?.getShareLink() ?? null;
|
|
2050
|
-
}
|
|
2051
|
-
/** Render ephemeral highlight decorations for external comments/annotations.
|
|
2052
|
-
* Does not modify document content, dirty state, or DOCX/PDF export. */
|
|
2053
|
-
async setExternalAnnotations(e, t) {
|
|
2054
|
-
(await this.ready).setExternalAnnotations(e, t);
|
|
2055
|
-
}
|
|
2056
|
-
/** Clear all external comment/annotation highlight decorations. */
|
|
2057
|
-
async clearExternalAnnotations() {
|
|
2058
|
-
(await this.ready).clearExternalAnnotations();
|
|
2059
|
-
}
|
|
2060
|
-
/** Scroll the viewport to reveal a document range with smooth animation. */
|
|
2061
|
-
async revealRange(e, t) {
|
|
2062
|
-
(await this.ready).revealRange(e, t);
|
|
2063
|
-
}
|
|
2064
|
-
/** Scroll the viewport directly to the specified 1-based page number. */
|
|
2065
|
-
async goToPage(e, t) {
|
|
2066
|
-
return (await this.ready).goToPage(e, t);
|
|
2067
|
-
}
|
|
2068
|
-
/** Find text in document, highlight matches, and scroll focus to the first match. */
|
|
2069
|
-
async search(e, t) {
|
|
2070
|
-
return (await this.ready).search(e, t);
|
|
2071
|
-
}
|
|
2072
|
-
/** Navigate to next (1) or previous (-1) search match and scroll focus to it. */
|
|
2073
|
-
async searchNav(e) {
|
|
2074
|
-
return (await this.ready).searchNav(e);
|
|
2075
|
-
}
|
|
2076
|
-
/** Replace currently focused match with new text and scroll focus to next match. */
|
|
2077
|
-
async searchReplaceCurrent(e) {
|
|
2078
|
-
return (await this.ready).searchReplaceCurrent(e);
|
|
2079
|
-
}
|
|
2080
|
-
/** Replace all search matches in document in a single atomic undoable transaction. */
|
|
2081
|
-
async searchReplaceAll(e) {
|
|
2082
|
-
return (await this.ready).searchReplaceAll(e);
|
|
2083
|
-
}
|
|
2084
|
-
/** Clear search highlights and reset search state. */
|
|
2085
|
-
async searchClear() {
|
|
2086
|
-
(await this.ready).searchClear();
|
|
2087
|
-
}
|
|
2088
|
-
/** Live-update {{KEY}} template placeholders in the document without full reload,
|
|
2089
|
-
* preserving zoom, scroll position, and selection. */
|
|
2090
|
-
async setTemplateVariables(e, t) {
|
|
2091
|
-
(await this.ready).setTemplateVariables(e, t);
|
|
2092
|
-
}
|
|
2093
|
-
/** Revert a template variable to an earlier value recorded in its audit history. */
|
|
2094
|
-
async revertTemplateVariable(e, t, o) {
|
|
2095
|
-
return (await this.ready).revertTemplateVariable(e, t, o);
|
|
2096
|
-
}
|
|
2097
|
-
/** Insert an atomic template variable token at current caret/selection. */
|
|
2098
|
-
async insertTemplateVariable(e, t) {
|
|
2099
|
-
return (await this.ready).insertTemplateVariable(e, t);
|
|
2100
|
-
}
|
|
2101
|
-
/** Open the contract metadata palette autocomplete at current caret position. */
|
|
2102
|
-
async openMetadataPalette() {
|
|
2103
|
-
(await this.ready).openMetadataPalette();
|
|
2104
|
-
}
|
|
2105
|
-
/** Set template variable display mode ('code' | 'value' | 'placeholder'). */
|
|
2106
|
-
async setVariableDisplayMode(e) {
|
|
2107
|
-
(await this.ready).setVariableDisplayMode(e);
|
|
2108
|
-
}
|
|
2109
|
-
/** Get current template variable display mode. */
|
|
2110
|
-
async getVariableDisplayMode() {
|
|
2111
|
-
return (await this.ready).getVariableDisplayMode();
|
|
2112
|
-
}
|
|
2113
|
-
/** Get all registered template variables in the document. */
|
|
2114
|
-
async getTemplateVariables() {
|
|
2115
|
-
return (await this.ready).getTemplateVariables();
|
|
2116
|
-
}
|
|
2117
|
-
/** Get a single registered template variable definition by key. */
|
|
2118
|
-
async getTemplateVariable(e) {
|
|
2119
|
-
return (await this.ready).getTemplateVariable(e);
|
|
2120
|
-
}
|
|
2121
|
-
/** Get audit trail history for a template variable. */
|
|
2122
|
-
async getVariableHistory(e) {
|
|
2123
|
-
return (await this.ready).getVariableHistory(e);
|
|
2124
|
-
}
|
|
2125
|
-
/** Open built-in variable popover explicitly. */
|
|
2126
|
-
async openVariablePopover(e, t) {
|
|
2127
|
-
(await this.ready).openVariablePopover(e, t);
|
|
2128
|
-
}
|
|
2129
|
-
/** Close built-in variable popover. */
|
|
2130
|
-
async closeVariablePopover() {
|
|
2131
|
-
(await this.ready).closeVariablePopover();
|
|
2132
|
-
}
|
|
2133
|
-
/** Get all metadata IDs (numbers) currently used by template variables in the document. */
|
|
2134
|
-
async getUsedMetadataIds() {
|
|
2135
|
-
return (await this.ready).getUsedMetadataIds();
|
|
2136
|
-
}
|
|
2137
|
-
/** All WeSign signing boxes in document order. */
|
|
2138
|
-
async listSignatureControls() {
|
|
2139
|
-
return (await this.ready).listSignatureControls();
|
|
2140
|
-
}
|
|
2141
|
-
/** Signing boxes with laid-out geometry (page is 1-based for WeSign). */
|
|
2142
|
-
async getSignatureBoxes() {
|
|
2143
|
-
return (await this.ready).getSignatureBoxes();
|
|
2144
|
-
}
|
|
2145
|
-
/** Đánh dấu/chọn khu vực ký cho bên chỉ định (bọc vùng chọn hoặc chèn tại con trỏ) */
|
|
2146
|
-
async markSigningArea(e) {
|
|
2147
|
-
(await this.ready).markSigningArea(e);
|
|
2148
|
-
}
|
|
2149
|
-
/** Chèn ô ký cho bên chỉ định (ví dụ: Bên A, Bên B, Người lao động) tại vị trí con trỏ */
|
|
2150
|
-
async insertSignatureBox(e) {
|
|
2151
|
-
(await this.ready).markSigningArea(e);
|
|
2152
|
-
}
|
|
2153
|
-
/** Thay đổi kích thước (Width x Height) của một ô ký */
|
|
2154
|
-
async resizeSignatureBox(e, t, o) {
|
|
2155
|
-
(await this.ready).resizeSignatureBox(e, t, o);
|
|
2156
|
-
}
|
|
2157
|
-
/** Cập nhật thông tin và kích thước của một ô ký */
|
|
2158
|
-
async updateSignatureBox(e, t) {
|
|
2159
|
-
(await this.ready).updateSignatureBox(e, t);
|
|
2160
|
-
}
|
|
2161
|
-
/** Set custom metadata catalog for autocomplete palette. */
|
|
2162
|
-
async setMetadataCatalog(e) {
|
|
2163
|
-
(await this.ready).setMetadataCatalog(e);
|
|
2164
|
-
}
|
|
2165
|
-
/** Update fine-grained capabilities (e.g. allow comments/selection in view mode). */
|
|
2166
|
-
async setPermissions(e) {
|
|
2167
|
-
(await this.ready).setPermissions(e);
|
|
2168
|
-
}
|
|
2169
|
-
/** Current effective permissions. */
|
|
2170
|
-
getPermissions() {
|
|
2171
|
-
return this.handle?.getPermissions() ?? null;
|
|
2172
|
-
}
|
|
2173
|
-
destroy() {
|
|
2174
|
-
this.handle?.destroy(), this.handle = null, this.handlers.clear(), this.events.destroy();
|
|
2175
|
-
}
|
|
2176
|
-
}
|
|
2177
|
-
export {
|
|
2178
|
-
c as D,
|
|
2179
|
-
$ as K,
|
|
2180
|
-
B as Z,
|
|
2181
|
-
R as a,
|
|
2182
|
-
z as b,
|
|
2183
|
-
J as c,
|
|
2184
|
-
q as d,
|
|
2185
|
-
u as e,
|
|
2186
|
-
Y as f,
|
|
2187
|
-
h as i,
|
|
2188
|
-
Z as m,
|
|
2189
|
-
Q as r
|
|
2190
|
-
};
|