@mdbase-dev/ui 0.1.0-beta.126 → 0.1.0-beta.147

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +159 -0
  2. package/css/collections.css +978 -0
  3. package/css/controls.css +26 -1
  4. package/css/screens.css +44 -2
  5. package/dist/AppSwitcher.js +187 -33
  6. package/dist/Checkbox.d.ts +14 -0
  7. package/dist/Checkbox.js +32 -0
  8. package/dist/CommandPalette.d.ts +4 -2
  9. package/dist/CommandPalette.js +275 -103
  10. package/dist/Dialog.js +72 -25
  11. package/dist/Feedback.js +763 -229
  12. package/dist/FeedbackMarkup.d.ts +1 -1
  13. package/dist/FeedbackMarkup.js +326 -125
  14. package/dist/FeedbackVerification.js +115 -68
  15. package/dist/SaveNotice.js +71 -28
  16. package/dist/Select.js +183 -135
  17. package/dist/SelectList.js +59 -14
  18. package/dist/ThemeSelect.js +55 -4
  19. package/dist/apps.d.ts +1 -0
  20. package/dist/apps.js +50 -29
  21. package/dist/brand.js +251 -68
  22. package/dist/codemirror.js +116 -87
  23. package/dist/collections/CollectionGate.d.ts +52 -0
  24. package/dist/collections/CollectionGate.js +456 -0
  25. package/dist/collections/CollectionSaveWarning.d.ts +10 -0
  26. package/dist/collections/CollectionSaveWarning.js +28 -0
  27. package/dist/collections/CollectionSwitcher.d.ts +26 -0
  28. package/dist/collections/CollectionSwitcher.js +579 -0
  29. package/dist/collections/SetupReview.d.ts +9 -0
  30. package/dist/collections/SetupReview.js +175 -0
  31. package/dist/collections/copy.d.ts +100 -0
  32. package/dist/collections/copy.js +937 -0
  33. package/dist/collections/dialogs.d.ts +27 -0
  34. package/dist/collections/dialogs.js +169 -0
  35. package/dist/collections/model.d.ts +146 -0
  36. package/dist/collections/model.js +337 -0
  37. package/dist/collections/mount.d.ts +18 -0
  38. package/dist/collections/mount.js +56 -0
  39. package/dist/collections/parts.d.ts +86 -0
  40. package/dist/collections/parts.js +439 -0
  41. package/dist/collections/testing.d.ts +19 -0
  42. package/dist/collections/testing.js +39 -0
  43. package/dist/collections/use-collection-ui.d.ts +140 -0
  44. package/dist/collections/use-collection-ui.js +236 -0
  45. package/dist/collections.d.ts +19 -0
  46. package/dist/collections.js +13 -0
  47. package/dist/feedback-data.d.ts +13 -12
  48. package/dist/feedback-data.js +365 -168
  49. package/dist/flock.d.ts +63 -0
  50. package/dist/flock.js +140 -0
  51. package/dist/i18n.d.ts +6 -0
  52. package/dist/i18n.js +71 -0
  53. package/dist/locales/de/messages.json +1 -0
  54. package/dist/locales/en/messages.json +1 -0
  55. package/dist/locales/es/messages.json +1 -0
  56. package/dist/locales/fr/messages.json +1 -0
  57. package/dist/locales/it/messages.json +1 -0
  58. package/dist/locales/ja/messages.json +1 -0
  59. package/dist/locales/ko/messages.json +1 -0
  60. package/dist/locales/pt/messages.json +1 -0
  61. package/dist/locales/ru/messages.json +1 -0
  62. package/dist/locales/zh/messages.json +1 -0
  63. package/dist/mark-activity.js +82 -75
  64. package/dist/permission-selection.js +27 -17
  65. package/dist/popover.js +138 -130
  66. package/dist/screens.d.ts +20 -3
  67. package/dist/screens.js +275 -6
  68. package/dist/select-model.js +34 -28
  69. package/dist/text-diff.d.ts +1 -0
  70. package/dist/text-diff.js +106 -74
  71. package/dist/theme.js +34 -40
  72. package/package.json +52 -7
@@ -12,7 +12,7 @@ export interface FeedbackMark {
12
12
  export declare function paintFeedbackMarks(context: CanvasRenderingContext2D, image: CanvasImageSource, marks: readonly FeedbackMark[]): void;
13
13
  export declare function FeedbackMarkup({ screenshot, onApply, onClose }: {
14
14
  screenshot: FeedbackScreenshot;
15
- onApply(screenshot: FeedbackScreenshot): void;
15
+ onApply(screenshot: FeedbackScreenshot, count: number): void;
16
16
  onClose(): void;
17
17
  }): import("react").JSX.Element;
18
18
  export {};
@@ -1,136 +1,337 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { i18n as _i18n } from "@lingui/core";
3
+ import { useLocaleRevision } from "./i18n.js";
2
4
  import { useEffect, useId, useRef, useState } from "react";
3
5
  import { Dialog } from "./Dialog.js";
4
6
  import { screenshotFromCanvas, screenshotUrl } from "./feedback-data.js";
5
7
  /** Redactions render last and replace whole pixels. Export is a flattened raster, never layers. */
6
8
  export function paintFeedbackMarks(context, image, marks) {
7
- const { width, height } = context.canvas;
8
- context.clearRect(0, 0, width, height);
9
- context.drawImage(image, 0, 0);
10
- for (const mark of [...marks.filter((m) => m.tool !== "blackout"), ...marks.filter((m) => m.tool === "blackout")]) {
11
- const first = mark.points[0], last = mark.points.at(-1);
12
- if (!first || !last)
13
- continue;
14
- context.save();
15
- if (mark.tool === "draw") {
16
- context.strokeStyle = "#df3c32";
17
- context.lineWidth = Math.max(3, width / 360);
18
- context.lineCap = "round";
19
- context.lineJoin = "round";
20
- context.beginPath();
21
- context.moveTo(first.x, first.y);
22
- for (const point of mark.points.slice(1))
23
- context.lineTo(point.x, point.y);
24
- context.stroke();
25
- }
26
- else {
27
- const x = Math.floor(Math.min(first.x, last.x)), y = Math.floor(Math.min(first.y, last.y));
28
- context.fillStyle = mark.tool === "blackout" ? "#000" : "rgba(255, 214, 48, .42)";
29
- context.fillRect(x, y, Math.ceil(Math.max(first.x, last.x)) - x, Math.ceil(Math.max(first.y, last.y)) - y);
30
- }
31
- context.restore();
9
+ const {
10
+ width,
11
+ height
12
+ } = context.canvas;
13
+ context.clearRect(0, 0, width, height);
14
+ context.drawImage(image, 0, 0);
15
+ for (const mark of [...marks.filter(m => m.tool !== "blackout"), ...marks.filter(m => m.tool === "blackout")]) {
16
+ const first = mark.points[0],
17
+ last = mark.points.at(-1);
18
+ if (!first || !last) continue;
19
+ context.save();
20
+ if (mark.tool === "draw") {
21
+ context.strokeStyle = "#df3c32";
22
+ context.lineWidth = Math.max(3, width / 360);
23
+ context.lineCap = "round";
24
+ context.lineJoin = "round";
25
+ context.beginPath();
26
+ context.moveTo(first.x, first.y);
27
+ for (const point of mark.points.slice(1)) context.lineTo(point.x, point.y);
28
+ context.stroke();
29
+ } else {
30
+ const x = Math.floor(Math.min(first.x, last.x)),
31
+ y = Math.floor(Math.min(first.y, last.y));
32
+ context.fillStyle = mark.tool === "blackout" ? "#000" : "rgba(255, 214, 48, .42)";
33
+ context.fillRect(x, y, Math.ceil(Math.max(first.x, last.x)) - x, Math.ceil(Math.max(first.y, last.y)) - y);
32
34
  }
35
+ context.restore();
36
+ }
33
37
  }
34
- export function FeedbackMarkup({ screenshot, onApply, onClose }) {
35
- const canvas = useRef(null);
36
- const image = useRef(null);
37
- const marks = useRef([]);
38
- const current = useRef(null);
39
- const cursor = useRef(null);
40
- const [tool, setTool] = useState("draw");
41
- const [count, setCount] = useState(0);
42
- const [ready, setReady] = useState(false);
43
- const [busy, setBusy] = useState(false);
44
- const [error, setError] = useState("");
45
- const instructions = useId();
46
- function paint(showCursor = true) {
47
- const context = canvas.current?.getContext("2d");
48
- if (!context || !image.current)
49
- return;
50
- paintFeedbackMarks(context, image.current, current.current ? [...marks.current, current.current] : marks.current);
51
- if (showCursor && cursor.current) {
52
- context.strokeStyle = "#1267ad";
53
- context.lineWidth = 2;
54
- context.beginPath();
55
- context.arc(cursor.current.x, cursor.current.y, 7, 0, Math.PI * 2);
56
- context.stroke();
57
- }
38
+ export function FeedbackMarkup({
39
+ screenshot,
40
+ onApply,
41
+ onClose
42
+ }) {
43
+ useLocaleRevision();
44
+ const canvas = useRef(null);
45
+ const image = useRef(null);
46
+ const marks = useRef([]);
47
+ const current = useRef(null);
48
+ const cursor = useRef(null);
49
+ const [tool, setTool] = useState("draw");
50
+ const [count, setCount] = useState(0);
51
+ const [ready, setReady] = useState(false);
52
+ const [busy, setBusy] = useState(false);
53
+ const [error, setError] = useState("");
54
+ const instructions = useId();
55
+ function paint(showCursor = true) {
56
+ const context = canvas.current?.getContext("2d");
57
+ if (!context || !image.current) return;
58
+ paintFeedbackMarks(context, image.current, current.current ? [...marks.current, current.current] : marks.current);
59
+ if (showCursor && cursor.current) {
60
+ context.strokeStyle = "#1267ad";
61
+ context.lineWidth = 2;
62
+ context.beginPath();
63
+ context.arc(cursor.current.x, cursor.current.y, 7, 0, Math.PI * 2);
64
+ context.stroke();
58
65
  }
59
- useEffect(() => {
60
- let live = true;
61
- const decoded = new Image();
62
- decoded.src = screenshotUrl(screenshot);
63
- void decoded.decode().then(() => {
64
- if (!live || !canvas.current)
65
- return;
66
- image.current = decoded;
67
- canvas.current.width = decoded.naturalWidth;
68
- canvas.current.height = decoded.naturalHeight;
66
+ }
67
+ useEffect(() => {
68
+ let live = true;
69
+ const decoded = new Image();
70
+ decoded.src = screenshotUrl(screenshot);
71
+ void decoded.decode().then(() => {
72
+ if (!live || !canvas.current) return;
73
+ image.current = decoded;
74
+ canvas.current.width = decoded.naturalWidth;
75
+ canvas.current.height = decoded.naturalHeight;
76
+ paint();
77
+ setReady(true);
78
+ }).catch(() => {
79
+ if (live) setError(_i18n._(
80
+ /** i18n */
81
+ {
82
+ id: "lnc6-d",
83
+ message: "The screenshot could not be opened for markup."
84
+ }));
85
+ });
86
+ return () => {
87
+ live = false;
88
+ image.current = null;
89
+ marks.current = [];
90
+ current.current = null;
91
+ };
92
+ }, [screenshot]);
93
+ function finish() {
94
+ if (current.current && current.current.points.length > 1 && marks.current.length < 100) marks.current.push(current.current);
95
+ current.current = null;
96
+ setCount(marks.current.length);
97
+ paint();
98
+ }
99
+ function coordinate(clientX, clientY) {
100
+ const element = canvas.current;
101
+ const rect = element.getBoundingClientRect();
102
+ return {
103
+ x: Math.max(0, Math.min(element.width, (clientX - rect.left) * element.width / rect.width)),
104
+ y: Math.max(0, Math.min(element.height, (clientY - rect.top) * element.height / rect.height))
105
+ };
106
+ }
107
+ return _jsxs(Dialog, {
108
+ open: true,
109
+ onClose: onClose,
110
+ closeDisabled: busy,
111
+ title: _i18n._(
112
+ /** i18n */
113
+ {
114
+ id: "wsx-_Y",
115
+ message: "Mark up screenshot"
116
+ }),
117
+ className: "mdbase-feedback-markup",
118
+ children: [_jsxs("div", {
119
+ className: "mdbase-feedback-tools",
120
+ role: "group",
121
+ "aria-label": _i18n._(
122
+ /** i18n */
123
+ {
124
+ id: "VyuLii",
125
+ message: "Screenshot tools"
126
+ }),
127
+ children: [["draw", "highlight", "blackout"].map(value => _jsx("button", {
128
+ type: "button",
129
+ "aria-pressed": tool === value,
130
+ disabled: !ready || busy,
131
+ onClick: () => {
132
+ current.current = null;
133
+ setTool(value);
134
+ paint();
135
+ },
136
+ children: value === "draw" ? _i18n._(
137
+ /** i18n */
138
+ {
139
+ id: "2vTp2v",
140
+ message: "Draw"
141
+ }) : value === "highlight" ? _i18n._(
142
+ /** i18n */
143
+ {
144
+ id: "gtEbeW",
145
+ message: "Highlight"
146
+ }) : _i18n._(
147
+ /** i18n */
148
+ {
149
+ id: "o7QK4c",
150
+ message: "Blackout"
151
+ })
152
+ }, value)), _jsx("button", {
153
+ type: "button",
154
+ disabled: !count || busy,
155
+ onClick: () => {
156
+ current.current = null;
157
+ marks.current.pop();
158
+ setCount(marks.current.length);
159
+ paint();
160
+ },
161
+ children: _i18n._(
162
+ /** i18n */
163
+ {
164
+ id: "9uI_rE",
165
+ message: "Undo"
166
+ })
167
+ }), _jsx("button", {
168
+ type: "button",
169
+ disabled: !count || busy,
170
+ onClick: () => {
171
+ current.current = null;
172
+ marks.current = [];
173
+ setCount(0);
174
+ paint();
175
+ },
176
+ children: _i18n._(
177
+ /** i18n */
178
+ {
179
+ id: "1AZHba",
180
+ message: "Reset",
181
+ context: "Screenshot annotations"
182
+ })
183
+ })]
184
+ }), _jsx("div", {
185
+ className: "mdbase-feedback-canvas",
186
+ children: _jsx("canvas", {
187
+ ref: canvas,
188
+ tabIndex: 0,
189
+ "aria-label": _i18n._(
190
+ /** i18n */
191
+ {
192
+ id: "cM8Pei",
193
+ message: "Screenshot annotation canvas"
194
+ }),
195
+ "aria-describedby": instructions,
196
+ onPointerDown: event => {
197
+ if (!ready || busy || event.button !== 0) return;
198
+ if (marks.current.length >= 100) {
199
+ setError(_i18n._(
200
+ /** i18n */
201
+ {
202
+ id: "BfJnph",
203
+ message: "Up to 100 marks can be applied. Undo or reset to make another mark."
204
+ }));
205
+ return;
206
+ }
207
+ cursor.current = null;
208
+ event.currentTarget.setPointerCapture(event.pointerId);
209
+ current.current = {
210
+ tool,
211
+ points: [coordinate(event.clientX, event.clientY)]
212
+ };
213
+ },
214
+ onPointerMove: event => {
215
+ if (current.current && event.currentTarget.hasPointerCapture(event.pointerId) && current.current.points.length < 2000) {
216
+ current.current.points.push(coordinate(event.clientX, event.clientY));
69
217
  paint();
70
- setReady(true);
71
- }).catch(() => { if (live)
72
- setError("The screenshot could not be opened for markup."); });
73
- return () => { live = false; image.current = null; marks.current = []; current.current = null; };
74
- }, [screenshot]);
75
- function finish() {
76
- if (current.current && current.current.points.length > 1 && marks.current.length < 100)
77
- marks.current.push(current.current);
78
- current.current = null;
79
- setCount(marks.current.length);
80
- paint();
81
- }
82
- function coordinate(clientX, clientY) {
83
- const element = canvas.current;
84
- const rect = element.getBoundingClientRect();
85
- return { x: Math.max(0, Math.min(element.width, (clientX - rect.left) * element.width / rect.width)), y: Math.max(0, Math.min(element.height, (clientY - rect.top) * element.height / rect.height)) };
86
- }
87
- return _jsxs(Dialog, { open: true, onClose: onClose, closeDisabled: busy, title: "Mark up screenshot", className: "mdbase-feedback-markup", children: [_jsxs("div", { className: "mdbase-feedback-tools", role: "group", "aria-label": "Screenshot tools", children: [["draw", "highlight", "blackout"].map((value) => _jsx("button", { type: "button", "aria-pressed": tool === value, disabled: !ready || busy, onClick: () => { current.current = null; setTool(value); paint(); }, children: value === "draw" ? "Draw" : value === "highlight" ? "Highlight" : "Blackout" }, value)), _jsx("button", { type: "button", disabled: !count || busy, onClick: () => { current.current = null; marks.current.pop(); setCount(marks.current.length); paint(); }, children: "Undo" }), _jsx("button", { type: "button", disabled: !count || busy, onClick: () => { current.current = null; marks.current = []; setCount(0); paint(); }, children: "Reset" })] }), _jsx("div", { className: "mdbase-feedback-canvas", children: _jsx("canvas", { ref: canvas, tabIndex: 0, "aria-label": "Screenshot annotation canvas", "aria-describedby": instructions, onPointerDown: (event) => {
88
- if (!ready || busy || event.button !== 0)
89
- return;
90
- if (marks.current.length >= 100) {
91
- setError("Up to 100 marks can be applied. Undo or reset to make another mark.");
92
- return;
93
- }
94
- cursor.current = null;
95
- event.currentTarget.setPointerCapture(event.pointerId);
96
- current.current = { tool, points: [coordinate(event.clientX, event.clientY)] };
97
- }, onPointerMove: (event) => { if (current.current && event.currentTarget.hasPointerCapture(event.pointerId) && current.current.points.length < 2000) {
98
- current.current.points.push(coordinate(event.clientX, event.clientY));
99
- paint();
100
- } }, onPointerUp: (event) => { if (event.currentTarget.hasPointerCapture(event.pointerId)) {
101
- current.current?.points.push(coordinate(event.clientX, event.clientY));
102
- finish();
103
- event.currentTarget.releasePointerCapture(event.pointerId);
104
- } }, onPointerCancel: () => { current.current = null; paint(); }, onKeyDown: (event) => {
105
- if (!ready || busy || !["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", " ", "Enter"].includes(event.key))
106
- return;
107
- event.preventDefault();
108
- cursor.current ??= { x: event.currentTarget.width / 2, y: event.currentTarget.height / 2 };
109
- if (event.key === " " || event.key === "Enter") {
110
- if (current.current) {
111
- current.current.points.push({ ...cursor.current });
112
- finish();
113
- }
114
- else if (marks.current.length < 100)
115
- current.current = { tool, points: [{ ...cursor.current }] };
116
- else
117
- setError("Up to 100 marks can be applied. Undo or reset to make another mark.");
118
- }
119
- else {
120
- const step = event.shiftKey ? 50 : 10;
121
- cursor.current.x = Math.max(0, Math.min(event.currentTarget.width, cursor.current.x + (event.key === "ArrowRight" ? step : event.key === "ArrowLeft" ? -step : 0)));
122
- cursor.current.y = Math.max(0, Math.min(event.currentTarget.height, cursor.current.y + (event.key === "ArrowDown" ? step : event.key === "ArrowUp" ? -step : 0)));
123
- if (current.current && current.current.points.length < 2000)
124
- current.current.points.push({ ...cursor.current });
125
- }
126
- paint();
127
- } }) }), _jsx("p", { id: instructions, className: "mdbase-feedback-help", children: "Drag to mark. Keyboard: arrows move; Space starts or finishes. Blackout removes pixels." }), _jsxs("span", { className: "mdbase-feedback-sr-only", role: "status", children: [count, " marks applied."] }), error && _jsx("p", { role: "alert", children: error }), _jsxs("div", { className: "mdbase-feedback-actions", children: [_jsx("button", { type: "button", disabled: busy, onClick: onClose, children: "Cancel" }), _jsx("button", { type: "button", className: "mdbase-feedback-primary", disabled: !ready || busy, onClick: () => {
128
- if (!canvas.current)
129
- return;
130
- finish();
131
- paint(false);
132
- setBusy(true);
133
- setError("");
134
- void screenshotFromCanvas(canvas.current).then(onApply).catch((reason) => { setBusy(false); setError(reason instanceof Error ? reason.message : "The screenshot could not be saved."); });
135
- }, children: busy ? "Applying…" : "Apply changes" })] })] });
218
+ }
219
+ },
220
+ onPointerUp: event => {
221
+ if (event.currentTarget.hasPointerCapture(event.pointerId)) {
222
+ current.current?.points.push(coordinate(event.clientX, event.clientY));
223
+ finish();
224
+ event.currentTarget.releasePointerCapture(event.pointerId);
225
+ }
226
+ },
227
+ onPointerCancel: () => {
228
+ current.current = null;
229
+ paint();
230
+ },
231
+ onKeyDown: event => {
232
+ if (!ready || busy || !["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", " ", "Enter"].includes(event.key)) return;
233
+ event.preventDefault();
234
+ cursor.current ??= {
235
+ x: event.currentTarget.width / 2,
236
+ y: event.currentTarget.height / 2
237
+ };
238
+ if (event.key === " " || event.key === "Enter") {
239
+ if (current.current) {
240
+ current.current.points.push({
241
+ ...cursor.current
242
+ });
243
+ finish();
244
+ } else if (marks.current.length < 100) current.current = {
245
+ tool,
246
+ points: [{
247
+ ...cursor.current
248
+ }]
249
+ };else setError(_i18n._(
250
+ /** i18n */
251
+ {
252
+ id: "BfJnph",
253
+ message: "Up to 100 marks can be applied. Undo or reset to make another mark."
254
+ }));
255
+ } else {
256
+ const step = event.shiftKey ? 50 : 10;
257
+ cursor.current.x = Math.max(0, Math.min(event.currentTarget.width, cursor.current.x + (event.key === "ArrowRight" ? step : event.key === "ArrowLeft" ? -step : 0)));
258
+ cursor.current.y = Math.max(0, Math.min(event.currentTarget.height, cursor.current.y + (event.key === "ArrowDown" ? step : event.key === "ArrowUp" ? -step : 0)));
259
+ if (current.current && current.current.points.length < 2000) current.current.points.push({
260
+ ...cursor.current
261
+ });
262
+ }
263
+ paint();
264
+ }
265
+ })
266
+ }), _jsx("p", {
267
+ id: instructions,
268
+ className: "mdbase-feedback-help",
269
+ children: _i18n._(
270
+ /** i18n */
271
+ {
272
+ id: "P71euV",
273
+ message: "Drag to mark. Keyboard: arrows move; Space starts or finishes. Blackout removes pixels."
274
+ })
275
+ }), _jsx("span", {
276
+ className: "mdbase-feedback-sr-only",
277
+ role: "status",
278
+ children: _i18n._(
279
+ /** i18n */
280
+ {
281
+ id: "ITLqil",
282
+ message: "{count, plural, one {# mark applied.} other {# marks applied.}}",
283
+ values: {
284
+ count: count
285
+ }
286
+ })
287
+ }), error && _jsx("p", {
288
+ role: "alert",
289
+ children: error
290
+ }), _jsxs("div", {
291
+ className: "mdbase-feedback-actions",
292
+ children: [_jsx("button", {
293
+ type: "button",
294
+ disabled: busy,
295
+ onClick: onClose,
296
+ children: _i18n._(
297
+ /** i18n */
298
+ {
299
+ id: "dEgA5A",
300
+ message: "Cancel"
301
+ })
302
+ }), _jsx("button", {
303
+ type: "button",
304
+ className: "mdbase-feedback-primary",
305
+ disabled: !ready || busy,
306
+ onClick: () => {
307
+ if (!canvas.current) return;
308
+ finish();
309
+ paint(false);
310
+ setBusy(true);
311
+ setError("");
312
+ const count = marks.current.length;
313
+ void screenshotFromCanvas(canvas.current).then(screenshot => onApply(screenshot, count)).catch(reason => {
314
+ setBusy(false);
315
+ setError(reason instanceof Error ? reason.message : _i18n._(
316
+ /** i18n */
317
+ {
318
+ id: "37unnc",
319
+ message: "The screenshot could not be saved."
320
+ }));
321
+ });
322
+ },
323
+ children: busy ? _i18n._(
324
+ /** i18n */
325
+ {
326
+ id: "wdRxTD",
327
+ message: "Applying\u2026"
328
+ }) : _i18n._(
329
+ /** i18n */
330
+ {
331
+ id: "PWh9Ii",
332
+ message: "Apply changes"
333
+ })
334
+ })]
335
+ })]
336
+ });
136
337
  }