@miragon/modeler-shell 0.0.0-stage → 0.2.0

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 (147) hide show
  1. package/API.md +2869 -0
  2. package/LICENSE +21 -0
  3. package/README.md +566 -2
  4. package/THIRD_PARTY_NOTICES.md +52 -0
  5. package/dist/appearance-BBaM_4bD.d.ts +323 -0
  6. package/dist/appearance-D3FUcbu6.d.cts +53 -0
  7. package/dist/appearance-D3FUcbu6.d.ts +53 -0
  8. package/dist/appearance-XX3JC3pI.d.cts +323 -0
  9. package/dist/chunk-66HCSJNY.js +2792 -0
  10. package/dist/chunk-66HCSJNY.js.map +1 -0
  11. package/dist/chunk-KYDG5DMX.js +136 -0
  12. package/dist/chunk-KYDG5DMX.js.map +1 -0
  13. package/dist/chunk-N4QXFF3A.js +23 -0
  14. package/dist/chunk-N4QXFF3A.js.map +1 -0
  15. package/dist/chunk-OADW3GPA.js +785 -0
  16. package/dist/chunk-OADW3GPA.js.map +1 -0
  17. package/dist/core.cjs +873 -0
  18. package/dist/core.cjs.map +1 -0
  19. package/dist/core.d.cts +246 -0
  20. package/dist/core.d.ts +246 -0
  21. package/dist/core.js +131 -0
  22. package/dist/core.js.map +1 -0
  23. package/dist/diagram-js.cjs +1147 -0
  24. package/dist/diagram-js.cjs.map +1 -0
  25. package/dist/diagram-js.d.cts +170 -0
  26. package/dist/diagram-js.d.ts +170 -0
  27. package/dist/diagram-js.js +879 -0
  28. package/dist/diagram-js.js.map +1 -0
  29. package/dist/index.cjs +3632 -0
  30. package/dist/index.cjs.map +1 -0
  31. package/dist/index.d.cts +29 -0
  32. package/dist/index.d.ts +29 -0
  33. package/dist/index.js +143 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/protocol-DhYBakWL.d.cts +15 -0
  36. package/dist/protocol-IeW8bf4f.d.ts +15 -0
  37. package/dist/shell.css +1603 -0
  38. package/dist/testing-vscode-stub.cjs +332 -0
  39. package/dist/testing-vscode-stub.cjs.map +1 -0
  40. package/dist/testing-vscode-stub.d.cts +65 -0
  41. package/dist/testing-vscode-stub.d.ts +65 -0
  42. package/dist/testing-vscode-stub.js +154 -0
  43. package/dist/testing-vscode-stub.js.map +1 -0
  44. package/dist/testing.cjs +4663 -0
  45. package/dist/testing.cjs.map +1 -0
  46. package/dist/testing.d.cts +231 -0
  47. package/dist/testing.d.ts +231 -0
  48. package/dist/testing.js +4483 -0
  49. package/dist/testing.js.map +1 -0
  50. package/dist/toasts-Bp0REqdq.d.cts +142 -0
  51. package/dist/toasts-Bp0REqdq.d.ts +142 -0
  52. package/dist/types-CnRrINRs.d.cts +445 -0
  53. package/dist/types-PuDZczzy.d.ts +445 -0
  54. package/dist/vscode-extension.cjs +215 -0
  55. package/dist/vscode-extension.cjs.map +1 -0
  56. package/dist/vscode-extension.d.cts +103 -0
  57. package/dist/vscode-extension.d.ts +103 -0
  58. package/dist/vscode-extension.js +24 -0
  59. package/dist/vscode-extension.js.map +1 -0
  60. package/dist/vscode-webview.cjs +3561 -0
  61. package/dist/vscode-webview.cjs.map +1 -0
  62. package/dist/vscode-webview.d.cts +84 -0
  63. package/dist/vscode-webview.d.ts +84 -0
  64. package/dist/vscode-webview.js +259 -0
  65. package/dist/vscode-webview.js.map +1 -0
  66. package/package.json +145 -4
  67. package/src/core/appearance.ts +104 -0
  68. package/src/core/feedback/appearance.ts +141 -0
  69. package/src/core/feedback/problems.ts +23 -0
  70. package/src/core/feedback/toasts.ts +118 -0
  71. package/src/core/fit.ts +220 -0
  72. package/src/core/index.ts +127 -0
  73. package/src/core/keymap.ts +295 -0
  74. package/src/core/layout.ts +69 -0
  75. package/src/core/messages.ts +159 -0
  76. package/src/core/sizes.ts +85 -0
  77. package/src/core/types.ts +106 -0
  78. package/src/core/web-chrome/bottom-row.ts +37 -0
  79. package/src/core/web-chrome/drop.ts +78 -0
  80. package/src/core/web-chrome/top-row.ts +66 -0
  81. package/src/core/zoom.ts +74 -0
  82. package/src/core.ts +2 -0
  83. package/src/diagram-js/connect.ts +75 -0
  84. package/src/diagram-js/index.ts +16 -0
  85. package/src/diagram-js/module.ts +20 -0
  86. package/src/diagram-js/palette-skin.ts +267 -0
  87. package/src/diagram-js/palette.css +269 -0
  88. package/src/diagram-js/service.ts +243 -0
  89. package/src/diagram-js/types.ts +67 -0
  90. package/src/diagram-js/viewport.ts +583 -0
  91. package/src/diagram-js.ts +2 -0
  92. package/src/dom/buttons.css +124 -0
  93. package/src/dom/element.ts +51 -0
  94. package/src/dom/feedback/appearance.ts +184 -0
  95. package/src/dom/feedback/feedback.css +435 -0
  96. package/src/dom/feedback/problems-popover.ts +287 -0
  97. package/src/dom/feedback/toasts.ts +431 -0
  98. package/src/dom/hint.ts +51 -0
  99. package/src/dom/icons.ts +309 -0
  100. package/src/dom/index.ts +42 -0
  101. package/src/dom/inspector.ts +35 -0
  102. package/src/dom/keys.ts +67 -0
  103. package/src/dom/ledger.ts +87 -0
  104. package/src/dom/legend.ts +85 -0
  105. package/src/dom/menu.ts +404 -0
  106. package/src/dom/mount.ts +731 -0
  107. package/src/dom/problems.ts +73 -0
  108. package/src/dom/shell-dom.css +969 -0
  109. package/src/dom/status.ts +72 -0
  110. package/src/dom/tooltip.ts +237 -0
  111. package/src/dom/types.ts +459 -0
  112. package/src/dom/web/drop-zone.ts +181 -0
  113. package/src/dom/web/empty-state.ts +144 -0
  114. package/src/dom/web/legal.ts +75 -0
  115. package/src/dom/web/menu-groups.ts +69 -0
  116. package/src/dom/web/primary.ts +124 -0
  117. package/src/dom/web/web.css +386 -0
  118. package/src/dom/zoom-panel.ts +154 -0
  119. package/src/index.ts +3 -0
  120. package/src/shell.css +9 -0
  121. package/src/testing/case-tools.ts +164 -0
  122. package/src/testing/cases.ts +1077 -0
  123. package/src/testing/checks.ts +868 -0
  124. package/src/testing/facts.ts +641 -0
  125. package/src/testing/geometry.ts +652 -0
  126. package/src/testing/harness.ts +187 -0
  127. package/src/testing/index.ts +19 -0
  128. package/src/testing/page-tools.ts +457 -0
  129. package/src/testing/page.ts +27 -0
  130. package/src/testing/vscode-stub.ts +237 -0
  131. package/src/testing/web-cases.ts +913 -0
  132. package/src/testing/web-checks.ts +1049 -0
  133. package/src/testing/web-facts.ts +713 -0
  134. package/src/testing-vscode-stub.ts +2 -0
  135. package/src/testing.ts +2 -0
  136. package/src/vscode/extension/html.ts +107 -0
  137. package/src/vscode/extension/index.ts +8 -0
  138. package/src/vscode/extension/reveal.ts +9 -0
  139. package/src/vscode/extension/theme-bridge.ts +85 -0
  140. package/src/vscode/extension/types.ts +36 -0
  141. package/src/vscode/protocol.ts +31 -0
  142. package/src/vscode/webview/appearance.ts +141 -0
  143. package/src/vscode/webview/index.ts +8 -0
  144. package/src/vscode/webview/mount.ts +88 -0
  145. package/src/vscode/webview/state.ts +116 -0
  146. package/src/vscode-extension.ts +2 -0
  147. package/src/vscode-webview.ts +2 -0
package/dist/core.cjs ADDED
@@ -0,0 +1,873 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/core.ts
21
+ var core_exports = {};
22
+ __export(core_exports, {
23
+ APPEARANCE_STORAGE_KEY: () => APPEARANCE_STORAGE_KEY,
24
+ CHROME_ISLANDS: () => CHROME_ISLANDS,
25
+ FIT_ANIMATION_MS: () => FIT_ANIMATION_MS,
26
+ INVALID_STATUS_DELAY_MS: () => INVALID_STATUS_DELAY_MS,
27
+ LEGAL_LINE_HEIGHT: () => LEGAL_LINE_HEIGHT,
28
+ MAX_FIT_ZOOM: () => MAX_FIT_ZOOM,
29
+ MAX_TOASTS: () => MAX_TOASTS,
30
+ PALETTE_CLEARANCE: () => PALETTE_CLEARANCE,
31
+ REDUCED_MOTION_CLASS: () => REDUCED_MOTION_CLASS,
32
+ SHELL: () => SHELL,
33
+ SHELL_TOKENS: () => SHELL_TOKENS,
34
+ TEXT_FIELD_SELECTOR: () => TEXT_FIELD_SELECTOR,
35
+ TOAST_DURATION_MS: () => TOAST_DURATION_MS,
36
+ TOAST_MAX_WIDTH: () => TOAST_MAX_WIDTH,
37
+ TOOLTIP_DELAY_MS: () => TOOLTIP_DELAY_MS,
38
+ VIEW_TOLERANCE: () => VIEW_TOLERANCE,
39
+ ZOOM_MAX: () => ZOOM_MAX,
40
+ ZOOM_MIN: () => ZOOM_MIN,
41
+ acceptsFile: () => acceptsFile,
42
+ appearanceAttributes: () => appearanceAttributes,
43
+ appearanceFromBodyClasses: () => appearanceFromBodyClasses,
44
+ appearanceFromColorThemeKind: () => appearanceFromColorThemeKind,
45
+ ariaKeyShortcuts: () => ariaKeyShortcuts,
46
+ ariaKeyShortcutsFromLabel: () => ariaKeyShortcutsFromLabel,
47
+ canZoomIn: () => canZoomIn,
48
+ canZoomOut: () => canZoomOut,
49
+ commandKeyLabel: () => commandKeyLabel,
50
+ decideKey: () => decideKey,
51
+ decidePaletteRow: () => decidePaletteRow,
52
+ decideTopRow: () => decideTopRow,
53
+ defaultMessages: () => defaultMessages,
54
+ detectPlatform: () => detectPlatform,
55
+ documentMode: () => documentMode,
56
+ dragVerdict: () => dragVerdict,
57
+ easeStandard: () => easeStandard,
58
+ fitInsets: () => fitInsets,
59
+ fitViewbox: () => fitViewbox,
60
+ formatNumber: () => formatNumber,
61
+ formatPercent: () => formatPercent,
62
+ freeRectCenter: () => freeRectCenter,
63
+ interpolateViewbox: () => interpolateViewbox,
64
+ isUndoRedoKey: () => isUndoRedoKey,
65
+ legalLineHeight: () => legalLineHeight,
66
+ legendStartsOpen: () => legendStartsOpen,
67
+ matchChromeKey: () => matchChromeKey,
68
+ parseAppearanceChoice: () => parseAppearanceChoice,
69
+ placeTooltip: () => placeTooltip,
70
+ problemSummary: () => problemSummary,
71
+ reducedMotionFromBodyClasses: () => reducedMotionFromBodyClasses,
72
+ requestedAppearance: () => requestedAppearance,
73
+ resolveAppearance: () => resolveAppearance,
74
+ resolveMessages: () => resolveMessages,
75
+ sameView: () => sameView,
76
+ shellSizesFromTokens: () => shellSizesFromTokens,
77
+ shortcutLabel: () => shortcutLabel,
78
+ toastLifetime: () => toastLifetime,
79
+ toastStackBottom: () => toastStackBottom,
80
+ toastStackWidth: () => toastStackWidth,
81
+ toastToEvict: () => toastToEvict,
82
+ webHeadMarkup: () => webHeadMarkup,
83
+ webModeScript: () => webModeScript,
84
+ zoomReadout: () => zoomReadout,
85
+ zoomRowRaised: () => zoomRowRaised
86
+ });
87
+ module.exports = __toCommonJS(core_exports);
88
+
89
+ // src/core/types.ts
90
+ var CHROME_ISLANDS = [
91
+ "menu",
92
+ "palette",
93
+ "primary",
94
+ "zoom",
95
+ "problems",
96
+ "legend",
97
+ "inspector",
98
+ "status",
99
+ "legal",
100
+ "toasts",
101
+ "empty-state",
102
+ "drop-zone",
103
+ "problems-popover"
104
+ ];
105
+
106
+ // src/core/sizes.ts
107
+ var SHELL_TOKENS = {
108
+ edge: "--cd-shell-rand",
109
+ gap: "--cd-shell-luecke",
110
+ row: "--cd-shell-zeile",
111
+ target: "--cd-shell-ziel",
112
+ entry: "--cd-shell-eintrag",
113
+ free: "--cd-shell-frei",
114
+ menuMinWidth: "--cd-shell-menue-breite",
115
+ inspectorWidth: "--cd-shell-inspector-breite",
116
+ fitInsetTop: "--cd-shell-einpassen-oben",
117
+ fitInsetTopSecondRow: "--cd-shell-einpassen-oben-schmal",
118
+ fitInsetSide: "--cd-shell-einpassen-seite",
119
+ fitInsetBottom: "--cd-shell-einpassen-unten",
120
+ fitInsetBottomWeb: "--cd-shell-einpassen-unten-web",
121
+ narrow: "--cd-shell-schmal",
122
+ veryNarrow: "--cd-shell-sehr-schmal",
123
+ low: "--cd-shell-niedrig",
124
+ layerIslands: "--cd-shell-ebene-inseln",
125
+ layerInspector: "--cd-shell-ebene-inspector",
126
+ layerTopRow: "--cd-shell-ebene-reihe",
127
+ layerPopups: "--cd-shell-ebene-aufklapper",
128
+ layerDialog: "--cd-shell-ebene-dialog",
129
+ layerToast: "--cd-shell-ebene-toast"
130
+ };
131
+ var SHELL = {
132
+ edge: 12,
133
+ gap: 8,
134
+ row: 40,
135
+ target: 32,
136
+ entry: 36,
137
+ free: 64,
138
+ menuMinWidth: 248,
139
+ inspectorWidth: 288,
140
+ fitInsetTop: 88,
141
+ fitInsetTopSecondRow: 140,
142
+ fitInsetSide: 24,
143
+ fitInsetBottom: 64,
144
+ fitInsetBottomWeb: 92,
145
+ narrow: 760,
146
+ veryNarrow: 440,
147
+ low: 820,
148
+ layerIslands: 20,
149
+ layerInspector: 25,
150
+ layerTopRow: 30,
151
+ layerPopups: 40,
152
+ layerDialog: 50,
153
+ layerToast: 60
154
+ };
155
+ var PIXEL_OR_PLAIN_NUMBER = /^\s*-?(?:\d+\.?\d*|\.\d+)(?:px)?\s*$/;
156
+ function shellSizesFromTokens(shellGroup) {
157
+ const sizes = {};
158
+ for (const name of Object.keys(SHELL_TOKENS)) {
159
+ const token = SHELL_TOKENS[name];
160
+ const raw = Object.hasOwn(shellGroup, token) ? shellGroup[token] : void 0;
161
+ if (raw === void 0) {
162
+ throw new Error(`@miragon/modeler-shell: the shell token ${token} is missing`);
163
+ }
164
+ if (typeof raw !== "string" || !PIXEL_OR_PLAIN_NUMBER.test(raw)) {
165
+ throw new Error(
166
+ `@miragon/modeler-shell: the shell token ${token} is not a number: ${JSON.stringify(raw)}`
167
+ );
168
+ }
169
+ sizes[name] = Number.parseFloat(raw);
170
+ }
171
+ return sizes;
172
+ }
173
+
174
+ // src/core/web-chrome/bottom-row.ts
175
+ var LEGAL_LINE_HEIGHT = 20;
176
+ function legalLineHeight(measured) {
177
+ if (measured === void 0 || !Number.isFinite(measured) || measured <= 0) return LEGAL_LINE_HEIGHT;
178
+ return Math.max(1, Math.round(measured / LEGAL_LINE_HEIGHT)) * LEGAL_LINE_HEIGHT;
179
+ }
180
+ function zoomRowRaised(input) {
181
+ const { containerWidth, legalRight, zoomWidth } = input;
182
+ if (legalRight === void 0 || zoomWidth === void 0) return false;
183
+ const zoomLeft = containerWidth - SHELL.edge - zoomWidth;
184
+ return legalRight + SHELL.gap > zoomLeft;
185
+ }
186
+
187
+ // src/core/fit.ts
188
+ var MAX_FIT_ZOOM = 1;
189
+ var FIT_ANIMATION_MS = 250;
190
+ function fitViewbox(bounds, container, insets, maxZoom = MAX_FIT_ZOOM) {
191
+ if (!(container.width > 0 && container.height > 0)) return void 0;
192
+ const hasWidth = bounds.width > 0;
193
+ const hasHeight = bounds.height > 0;
194
+ if (!hasWidth && !hasHeight) return void 0;
195
+ const horizontal = freeExtent(container.width, insets.left, insets.right);
196
+ const vertical = freeExtent(container.height, insets.top, insets.bottom);
197
+ const contentWidth = hasWidth ? bounds.width : 0;
198
+ const contentHeight = hasHeight ? bounds.height : 0;
199
+ const scale = Math.min(
200
+ maxZoom,
201
+ hasWidth ? horizontal.extent / contentWidth : Infinity,
202
+ hasHeight ? vertical.extent / contentHeight : Infinity
203
+ );
204
+ const box = {
205
+ x: bounds.x + contentWidth / 2 - (horizontal.start + horizontal.extent / 2) / scale,
206
+ y: bounds.y + contentHeight / 2 - (vertical.start + vertical.extent / 2) / scale,
207
+ width: container.width / scale,
208
+ height: container.height / scale,
209
+ scale
210
+ };
211
+ return Object.values(box).every(Number.isFinite) && scale > 0 ? box : void 0;
212
+ }
213
+ function freeExtent(total, before, after) {
214
+ const extent = total - before - after;
215
+ return extent > 0 ? { start: before, extent } : { start: 0, extent: total };
216
+ }
217
+ function freeRectCenter(container, insets) {
218
+ if (!(container.width > 0 && container.height > 0)) return void 0;
219
+ const horizontal = freeExtent(container.width, insets.left, insets.right);
220
+ const vertical = freeExtent(container.height, insets.top, insets.bottom);
221
+ return {
222
+ x: horizontal.start + horizontal.extent / 2,
223
+ y: vertical.start + vertical.extent / 2
224
+ };
225
+ }
226
+ function fitInsets(layout) {
227
+ const { container, host, paletteRow, problemsVisible, zoomRaised, legendWidth, inspector } = layout;
228
+ const raisedBottomRow = host === "web" && (problemsVisible || zoomRaised === true);
229
+ const wrappedLegalLines = legalLineHeight(layout.legalHeight) - LEGAL_LINE_HEIGHT;
230
+ const insets = {
231
+ top: paletteRow === "second-row" ? SHELL.fitInsetTopSecondRow : SHELL.fitInsetTop,
232
+ right: SHELL.fitInsetSide,
233
+ bottom: raisedBottomRow ? SHELL.fitInsetBottomWeb + wrappedLegalLines : SHELL.fitInsetBottom,
234
+ left: SHELL.fitInsetSide
235
+ };
236
+ const bottomSheetOpen = inspector !== void 0 && container.width <= SHELL.narrow;
237
+ if (inspector !== void 0 && !bottomSheetOpen) {
238
+ insets.right = SHELL.edge + SHELL.inspectorWidth + SHELL.fitInsetSide;
239
+ }
240
+ if (bottomSheetOpen) {
241
+ insets.bottom = inspector.sheetTop === void 0 ? SHELL.fitInsetBottom : container.height - inspector.sheetTop + SHELL.edge;
242
+ } else if (legendWidth !== void 0 && legendWidth > 0 && container.width > SHELL.veryNarrow) {
243
+ insets.left = SHELL.edge + legendWidth + SHELL.fitInsetSide;
244
+ }
245
+ return insets;
246
+ }
247
+ var VIEW_TOLERANCE = 1e-3;
248
+ function sameView(a, b, tolerance = VIEW_TOLERANCE) {
249
+ const close = (first, second) => Math.abs(first - second) <= tolerance * Math.max(1, Math.abs(first), Math.abs(second));
250
+ return close(a.scale, b.scale) && close(a.x * a.scale, b.x * b.scale) && close(a.y * a.scale, b.y * b.scale);
251
+ }
252
+ function interpolateViewbox(from, to, progress) {
253
+ if (!(progress > 0)) return { ...from };
254
+ if (progress >= 1) return { ...to };
255
+ const linear = (start, end) => start + (end - start) * progress;
256
+ const scale = from.scale > 0 && to.scale > 0 ? Math.exp(linear(Math.log(from.scale), Math.log(to.scale))) : linear(from.scale, to.scale);
257
+ const centreX = linear(from.x + from.width / 2, to.x + to.width / 2);
258
+ const centreY = linear(from.y + from.height / 2, to.y + to.height / 2);
259
+ const width = linear(from.width * from.scale, to.width * to.scale) / scale;
260
+ const height = linear(from.height * from.scale, to.height * to.scale) / scale;
261
+ return { x: centreX - width / 2, y: centreY - height / 2, width, height, scale };
262
+ }
263
+ function easeStandard(progress) {
264
+ return STANDARD_EASING(progress);
265
+ }
266
+ var STANDARD_EASING = cubicBezier(0.4, 0, 0.2, 1);
267
+ function cubicBezier(x1, y1, x2, y2) {
268
+ const polynomial = (first, second) => {
269
+ const c = 3 * first;
270
+ const b = 3 * (second - first) - c;
271
+ const a = 1 - c - b;
272
+ return {
273
+ at: (t) => ((a * t + b) * t + c) * t,
274
+ slope: (t) => (3 * a * t + 2 * b) * t + c
275
+ };
276
+ };
277
+ const curveX = polynomial(x1, x2);
278
+ const curveY = polynomial(y1, y2);
279
+ const precision = 1e-7;
280
+ const parameterFor = (x) => {
281
+ let t = x;
282
+ for (let iteration = 0; iteration < 8; iteration++) {
283
+ const error = curveX.at(t) - x;
284
+ if (Math.abs(error) < precision) return t;
285
+ const slope = curveX.slope(t);
286
+ if (Math.abs(slope) < 1e-6) break;
287
+ t -= error / slope;
288
+ if (t < 0 || t > 1) break;
289
+ }
290
+ let low = 0;
291
+ let high = 1;
292
+ t = x;
293
+ for (let iteration = 0; iteration < 60; iteration++) {
294
+ const value = curveX.at(t);
295
+ if (Math.abs(value - x) < precision) break;
296
+ if (value < x) low = t;
297
+ else high = t;
298
+ t = (low + high) / 2;
299
+ }
300
+ return t;
301
+ };
302
+ return (progress) => {
303
+ if (!(progress > 0)) return 0;
304
+ if (progress >= 1) return 1;
305
+ return curveY.at(parameterFor(progress));
306
+ };
307
+ }
308
+
309
+ // src/core/zoom.ts
310
+ var ZOOM_MIN = 0.2;
311
+ var ZOOM_MAX = 4;
312
+ function canZoomOut(zoom) {
313
+ return zoom > ZOOM_MIN * 1.001;
314
+ }
315
+ function canZoomIn(zoom) {
316
+ return zoom < ZOOM_MAX * 0.999;
317
+ }
318
+ function formatPercent(zoom, lang) {
319
+ return numberFormat(lang, "percent").format(zoom);
320
+ }
321
+ function formatNumber(value, lang) {
322
+ return numberFormat(lang, "decimal").format(value);
323
+ }
324
+ var FALLBACK_LANG = "en";
325
+ var formats = /* @__PURE__ */ new Map();
326
+ function numberFormat(lang, style) {
327
+ const key = `${style}|${lang}`;
328
+ let format = formats.get(key);
329
+ if (!format) {
330
+ const options = style === "percent" ? { style, maximumFractionDigits: 0 } : { style };
331
+ try {
332
+ format = new Intl.NumberFormat(lang, options);
333
+ } catch {
334
+ format = new Intl.NumberFormat(FALLBACK_LANG, options);
335
+ }
336
+ formats.set(key, format);
337
+ }
338
+ return format;
339
+ }
340
+ function zoomReadout(zoom, lang, messages) {
341
+ const text = formatPercent(zoom, lang);
342
+ return {
343
+ text,
344
+ ariaLabel: messages.zoomToActualNow(formatPercent(1, lang), text),
345
+ canZoomOut: canZoomOut(zoom),
346
+ canZoomIn: canZoomIn(zoom)
347
+ };
348
+ }
349
+
350
+ // src/core/keymap.ts
351
+ function matchChromeKey(event) {
352
+ if (event.altKey) return void 0;
353
+ if (isCommand(event)) {
354
+ if (event.key === "+" || event.key === "=" || event.code === "NumpadAdd") return "zoomIn";
355
+ if (event.key === "-" || event.key === "_" || event.code === "NumpadSubtract") return "zoomOut";
356
+ if (event.key === "0" || event.code === "Numpad0") return "zoomToActual";
357
+ return void 0;
358
+ }
359
+ return event.shiftKey && event.code === "Digit1" ? "fit" : void 0;
360
+ }
361
+ function isCommand(event) {
362
+ return event.metaKey || event.ctrlKey;
363
+ }
364
+ function isUndoRedoKey(event) {
365
+ if (event.altKey || !isCommand(event)) return false;
366
+ const letter = undoRedoLetter(event);
367
+ return letter === "z" || letter === "y" && !event.shiftKey;
368
+ }
369
+ function undoRedoLetter(event) {
370
+ if (event.key.length === 1 && event.key.charCodeAt(0) < 128) return event.key.toLowerCase();
371
+ if (event.code === "KeyZ") return "z";
372
+ if (event.code === "KeyY") return "y";
373
+ return void 0;
374
+ }
375
+ var TEXT_FIELD_SELECTOR = "input, textarea, select, [contenteditable]:not([contenteditable='false'])";
376
+ function decideKey(event, context) {
377
+ const stop = context.host === "ide";
378
+ const composing = event.isComposing === true;
379
+ if (event.key === "Escape" && !event.metaKey && !event.ctrlKey && !event.altKey && !event.shiftKey) {
380
+ if (context.menuOpen && !composing) {
381
+ return { action: "closeMenu", preventDefault: true, stopPropagation: stop };
382
+ }
383
+ if (context.menuOpen || context.dialogOpen) return { preventDefault: false, stopPropagation: stop };
384
+ }
385
+ const chromeKey = matchChromeKey(event);
386
+ if (chromeKey !== void 0) {
387
+ if (context.startScreen === true && !stop) return { preventDefault: false, stopPropagation: false };
388
+ const blocked = composing || context.inTextField || context.modalOpen;
389
+ if (!blocked) return { action: chromeKey, preventDefault: true, stopPropagation: stop };
390
+ return { preventDefault: false, stopPropagation: chromeKey === "fit" ? false : stop };
391
+ }
392
+ if (context.inTextField && isUndoRedoKey(event)) return { preventDefault: false, stopPropagation: stop };
393
+ if (context.defaultPrevented) return { preventDefault: false, stopPropagation: stop };
394
+ return { preventDefault: false, stopPropagation: false };
395
+ }
396
+ function detectPlatform(navigator) {
397
+ const platform = navigator?.userAgentData?.platform || navigator?.platform || "";
398
+ return /mac/i.test(platform) ? "mac" : "other";
399
+ }
400
+ function shortcutLabel(key, platform, keyNames) {
401
+ if (platform === "mac") return MAC_SHORTCUT_LABELS[key];
402
+ switch (key) {
403
+ case "zoomIn":
404
+ return `${keyNames.ctrl}+${keyNames.plus}`;
405
+ case "zoomOut":
406
+ return `${keyNames.ctrl}+${keyNames.minus}`;
407
+ case "zoomToActual":
408
+ return `${keyNames.ctrl}+0`;
409
+ case "fit":
410
+ return `${keyNames.shift}+1`;
411
+ }
412
+ }
413
+ function commandKeyLabel(key, platform, keyNames) {
414
+ return platform === "mac" ? `\u2318${key}` : `${keyNames.ctrl}+${key}`;
415
+ }
416
+ var MAC_SHORTCUT_LABELS = {
417
+ zoomIn: "\u2318+",
418
+ zoomOut: "\u2318\u2212",
419
+ zoomToActual: "\u23180",
420
+ fit: "\u21E71"
421
+ };
422
+ function ariaKeyShortcuts(key, platform) {
423
+ const command = platform === "mac" ? "Meta" : "Control";
424
+ switch (key) {
425
+ case "zoomIn":
426
+ return `${command}+= ${command}+Plus`;
427
+ case "zoomOut":
428
+ return `${command}+-`;
429
+ case "zoomToActual":
430
+ return `${command}+0`;
431
+ case "fit":
432
+ return "Shift+1";
433
+ }
434
+ }
435
+ var MAC_MODIFIER_SYMBOLS = {
436
+ "\u2318": "Meta",
437
+ "\u21E7": "Shift",
438
+ "\u2325": "Alt",
439
+ "\u2303": "Control"
440
+ };
441
+ var MODIFIER_NAMES = {
442
+ cmd: "Meta",
443
+ command: "Meta",
444
+ meta: "Meta",
445
+ ctrl: "Control",
446
+ control: "Control",
447
+ strg: "Control",
448
+ shift: "Shift",
449
+ umschalt: "Shift",
450
+ alt: "Alt",
451
+ option: "Alt",
452
+ opt: "Alt"
453
+ };
454
+ var NAMED_KEYS = {
455
+ esc: "Escape",
456
+ escape: "Escape",
457
+ del: "Delete",
458
+ delete: "Delete",
459
+ entf: "Delete",
460
+ backspace: "Backspace",
461
+ enter: "Enter",
462
+ return: "Enter",
463
+ tab: "Tab",
464
+ space: "Space",
465
+ home: "Home",
466
+ end: "End",
467
+ pageup: "PageUp",
468
+ pagedown: "PageDown",
469
+ arrowup: "ArrowUp",
470
+ arrowdown: "ArrowDown",
471
+ arrowleft: "ArrowLeft",
472
+ arrowright: "ArrowRight",
473
+ "\u2191": "ArrowUp",
474
+ "\u2193": "ArrowDown",
475
+ "\u2190": "ArrowLeft",
476
+ "\u2192": "ArrowRight",
477
+ plus: "Plus"
478
+ };
479
+ function ariaKeyName(key) {
480
+ const named = NAMED_KEYS[key.toLowerCase()];
481
+ if (named) return named;
482
+ if (/^f\d{1,2}$/i.test(key)) return key.toUpperCase();
483
+ if (key.length !== 1 || MAC_MODIFIER_SYMBOLS[key]) return void 0;
484
+ if (key === "+") return "Plus";
485
+ if (key === " ") return "Space";
486
+ return key.toUpperCase();
487
+ }
488
+ function ariaKeyShortcutsFromLabel(label) {
489
+ let rest = label.trim();
490
+ const modifiers = [];
491
+ for (let symbol = MAC_MODIFIER_SYMBOLS[rest.charAt(0)]; symbol && rest.length > 1; ) {
492
+ modifiers.push(symbol);
493
+ rest = rest.slice(1).trim();
494
+ symbol = MAC_MODIFIER_SYMBOLS[rest.charAt(0)];
495
+ }
496
+ if (!rest || /\s/.test(rest.replace(/\s*\+\s*/g, "+"))) return void 0;
497
+ const parts = rest.split("+").map((part) => part.trim());
498
+ let key = parts.pop() ?? "";
499
+ if (key === "" && parts.at(-1) === "") {
500
+ parts.pop();
501
+ key = "+";
502
+ }
503
+ for (const part of parts) {
504
+ const modifier = MODIFIER_NAMES[part.toLowerCase()];
505
+ if (!modifier) return void 0;
506
+ modifiers.push(modifier);
507
+ }
508
+ const name = ariaKeyName(key);
509
+ return name ? [...new Set(modifiers), name].join("+") : void 0;
510
+ }
511
+
512
+ // src/core/appearance.ts
513
+ function resolveAppearance(requested, themes) {
514
+ const [fallback] = themes;
515
+ if (fallback === void 0) {
516
+ throw new Error(
517
+ "@miragon/modeler-shell: resolveAppearance needs at least one theme the modeler can show"
518
+ );
519
+ }
520
+ const theme = themes.includes(requested.theme) ? requested.theme : fallback;
521
+ return withKontrast(theme, requested.kontrast);
522
+ }
523
+ function withKontrast(theme, kontrast) {
524
+ return kontrast === "hoch" ? { theme, kontrast } : { theme };
525
+ }
526
+ function appearanceFromColorThemeKind(kind) {
527
+ switch (kind) {
528
+ case 2:
529
+ return { theme: "dark" };
530
+ case 3:
531
+ return { theme: "dark", kontrast: "hoch" };
532
+ case 4:
533
+ return { theme: "light", kontrast: "hoch" };
534
+ default:
535
+ return { theme: "light" };
536
+ }
537
+ }
538
+ function requestedAppearance(kind, setting) {
539
+ const fromKind = appearanceFromColorThemeKind(kind);
540
+ const theme = setting === "light" || setting === "dark" ? setting : fromKind.theme;
541
+ return withKontrast(theme, fromKind.kontrast);
542
+ }
543
+ function appearanceFromBodyClasses(classes) {
544
+ const present = new Set(classes);
545
+ if (present.has("vscode-high-contrast-light")) return { theme: "light", kontrast: "hoch" };
546
+ if (present.has("vscode-high-contrast")) return { theme: "dark", kontrast: "hoch" };
547
+ if (present.has("vscode-dark")) return { theme: "dark" };
548
+ if (present.has("vscode-light")) return { theme: "light" };
549
+ return void 0;
550
+ }
551
+ function reducedMotionFromBodyClasses(classes) {
552
+ return new Set(classes).has("vscode-reduce-motion");
553
+ }
554
+ var REDUCED_MOTION_CLASS = "cd-shell-reduce-motion";
555
+ function appearanceAttributes(appearance) {
556
+ return appearance.kontrast === "hoch" ? { "data-cd-theme": appearance.theme, "data-cd-kontrast": "hoch" } : { "data-cd-theme": appearance.theme };
557
+ }
558
+
559
+ // src/core/messages.ts
560
+ var defaultMessages = {
561
+ menu: "Menu",
562
+ tools: "Tools",
563
+ canvas: "Diagram",
564
+ zoom: "Zoom",
565
+ zoomOut: "Zoom out",
566
+ zoomIn: "Zoom in",
567
+ zoomToActual: (percent) => `Zoom to ${percent}`,
568
+ zoomToActualNow: (percent, now) => `Zoom to ${percent} (now ${now})`,
569
+ fit: "Fit to view",
570
+ legend: "Legend",
571
+ closeLegend: "Close legend",
572
+ problems: (count, formattedCount) => `${formattedCount} ${count === 1 ? "problem" : "problems"}`,
573
+ problemsLabel: (count, errors, formattedCount, formattedErrors) => `${formattedCount} ${count === 1 ? "problem" : "problems"}, ${errors === 0 ? "no errors" : `${formattedErrors} ${errors === 1 ? "error" : "errors"}`}`,
574
+ showProblems: "Show in Problems view",
575
+ emptyHint: "Pick a tool from the palette to start.",
576
+ insertExample: "Insert example",
577
+ invalidFile: (diagram) => `This file isn't a valid ${diagram} right now. The diagram shows the last valid version and is read-only until you fix the text.`,
578
+ keyNames: { ctrl: "Ctrl", shift: "Shift", plus: "Plus", minus: "Minus" },
579
+ share: "Share",
580
+ legal: "Legal",
581
+ copyright: (year) => `\xA9 ${year} Miragon GmbH`,
582
+ opensInNewTab: "Opens in a new tab",
583
+ newDiagram: "New diagram",
584
+ openFile: "Open\u2026",
585
+ showExample: "Show example",
586
+ importFile: "Import\u2026",
587
+ appearance: "Appearance",
588
+ appearanceSystem: "System",
589
+ appearanceLight: "Light",
590
+ appearanceDark: "Dark",
591
+ problemsTitle: "Problems",
592
+ problemSeverity: (severity) => severity === "error" ? "Error" : "Warning",
593
+ close: "Close",
594
+ dropFile: "Drop file here",
595
+ dropForbidden: (reason) => reason === "multiple" ? "Drop one file at a time" : reason === "dialog" ? "Close the dialog to drop a file" : "This modeler can't open this file type",
596
+ dropHint: "Or drop a file here",
597
+ openFileLink: "Open a file\u2026",
598
+ cannotOpenFile: (name, accepted) => `Couldn't open \u201C${name}\u201D. Drop a ${accepted} file.`
599
+ };
600
+ function resolveMessages(overrides) {
601
+ const { keyNames, ...texts } = overrides ?? {};
602
+ return {
603
+ ...defaultMessages,
604
+ ...definedEntries(texts),
605
+ keyNames: { ...defaultMessages.keyNames, ...definedEntries(keyNames ?? {}) }
606
+ };
607
+ }
608
+ function definedEntries(partial) {
609
+ return Object.fromEntries(Object.entries(partial).filter(([, value]) => value !== void 0));
610
+ }
611
+
612
+ // src/core/layout.ts
613
+ var PALETTE_CLEARANCE = 16;
614
+ var TOOLTIP_DELAY_MS = 300;
615
+ var INVALID_STATUS_DELAY_MS = 800;
616
+ function decidePaletteRow(input) {
617
+ const { containerWidth, paletteWidth, menuRight, primaryLeft } = input;
618
+ if (containerWidth <= SHELL.narrow) return "second-row";
619
+ const paletteLeft = (containerWidth - paletteWidth) / 2;
620
+ const paletteRight = (containerWidth + paletteWidth) / 2;
621
+ if (paletteLeft < menuRight + PALETTE_CLEARANCE) return "second-row";
622
+ if (primaryLeft !== void 0 && paletteRight > primaryLeft - PALETTE_CLEARANCE) return "second-row";
623
+ return "top";
624
+ }
625
+ function legendStartsOpen(containerHeight) {
626
+ return containerHeight > SHELL.low;
627
+ }
628
+ function placeTooltip(input) {
629
+ const { anchor, island, tooltip, container } = input;
630
+ const inUpperHalf = island.y + island.height / 2 < container.height / 2;
631
+ const y = inUpperHalf ? island.y + island.height + SHELL.gap : island.y - SHELL.gap - tooltip.height;
632
+ const centred = anchor.x + anchor.width / 2 - tooltip.width / 2;
633
+ const rightmost = container.width - SHELL.edge - tooltip.width;
634
+ const x = Math.max(SHELL.edge, Math.min(centred, rightmost));
635
+ return { x, y };
636
+ }
637
+
638
+ // src/core/web-chrome/top-row.ts
639
+ function decideTopRow(input) {
640
+ const { containerWidth, paletteWidth, menuRight, primary } = input;
641
+ if (!primary) {
642
+ return {
643
+ paletteRow: decidePaletteRow({ containerWidth, paletteWidth, menuRight }),
644
+ primaryLabel: "shown"
645
+ };
646
+ }
647
+ const paletteRowBeside = (primaryWidth) => decidePaletteRow({
648
+ containerWidth,
649
+ paletteWidth,
650
+ menuRight,
651
+ primaryLeft: containerWidth - SHELL.edge - primaryWidth
652
+ });
653
+ if (paletteRowBeside(primary.withLabel) === "top") return { paletteRow: "top", primaryLabel: "shown" };
654
+ if (paletteRowBeside(primary.iconOnly) === "top") return { paletteRow: "top", primaryLabel: "collapsed" };
655
+ const labelledLeft = containerWidth - SHELL.edge - primary.withLabel;
656
+ return {
657
+ paletteRow: "second-row",
658
+ primaryLabel: menuRight + PALETTE_CLEARANCE <= labelledLeft ? "shown" : "collapsed"
659
+ };
660
+ }
661
+
662
+ // src/core/web-chrome/drop.ts
663
+ function acceptEntries(accept) {
664
+ const entries = accept.map((entry) => entry.trim().toLowerCase()).filter((entry) => entry !== "");
665
+ return {
666
+ extensions: entries.filter((entry) => entry.startsWith(".")),
667
+ mimeTypes: entries.filter((entry) => !entry.startsWith(".") && entry.includes("/"))
668
+ };
669
+ }
670
+ function matchesMimeType(type, mimeTypes) {
671
+ const normalized = type.trim().toLowerCase();
672
+ if (normalized === "") return false;
673
+ return mimeTypes.some(
674
+ (entry) => entry.endsWith("/*") ? normalized.startsWith(entry.slice(0, -1)) : normalized === entry
675
+ );
676
+ }
677
+ function dragVerdict(items, context) {
678
+ const files = items.filter((item) => item.kind === "file");
679
+ if (files.length === 0) return { state: "none" };
680
+ if (context.dialogOpen) return { state: "forbidden", reason: "dialog" };
681
+ if (files.length > 1 && !context.multiple) return { state: "forbidden", reason: "multiple" };
682
+ const { mimeTypes } = acceptEntries(context.accept);
683
+ const foreignType = (item) => item.type.trim() !== "" && !matchesMimeType(item.type, mimeTypes);
684
+ if (mimeTypes.length > 0 && files.every(foreignType)) return { state: "forbidden", reason: "type" };
685
+ return { state: "over" };
686
+ }
687
+ function acceptsFile(file, accept) {
688
+ const { extensions, mimeTypes } = acceptEntries(accept);
689
+ if (extensions.length === 0 && mimeTypes.length === 0) return true;
690
+ const name = file.name.toLowerCase();
691
+ return extensions.some((extension) => name.endsWith(extension)) || matchesMimeType(file.type, mimeTypes);
692
+ }
693
+
694
+ // src/core/feedback/toasts.ts
695
+ var MAX_TOASTS = 3;
696
+ var TOAST_DURATION_MS = {
697
+ success: 2800,
698
+ info: 2800,
699
+ warning: 5e3,
700
+ danger: 5e3
701
+ };
702
+ var TOAST_MAX_WIDTH = 480;
703
+ function toastLifetime(request) {
704
+ if (request.action) return void 0;
705
+ const requested = request.durationMs;
706
+ const longer = requested !== void 0 && Number.isFinite(requested) ? requested : 0;
707
+ return Math.max(TOAST_DURATION_MS[request.status], longer);
708
+ }
709
+ function toastToEvict(stack) {
710
+ if (stack.length < MAX_TOASTS) return void 0;
711
+ const evicted = stack.find((slot) => !slot.engaged && !slot.hasAction) ?? stack.find((slot) => !slot.engaged) ?? stack[0];
712
+ return evicted?.id;
713
+ }
714
+ function toastStackWidth(containerWidth) {
715
+ return Math.max(0, Math.min(TOAST_MAX_WIDTH, containerWidth - 2 * SHELL.edge));
716
+ }
717
+ function toastStackBottom(input) {
718
+ const stackWidth = toastStackWidth(input.containerWidth);
719
+ const { cardWidth } = input;
720
+ const width = cardWidth !== void 0 && Number.isFinite(cardWidth) ? Math.min(stackWidth, Math.max(0, cardWidth)) : stackWidth;
721
+ const left = (input.containerWidth - width) / 2;
722
+ const right = left + width;
723
+ let highest;
724
+ for (const obstacle of input.obstacles) {
725
+ const distance = Math.max(obstacle.left - right, left - obstacle.right);
726
+ if (distance >= SHELL.gap) continue;
727
+ highest = highest === void 0 ? obstacle.top : Math.max(highest, obstacle.top);
728
+ }
729
+ return highest === void 0 ? SHELL.edge : Math.max(SHELL.edge, highest + SHELL.gap);
730
+ }
731
+
732
+ // src/core/feedback/appearance.ts
733
+ var APPEARANCE_STORAGE_KEY = "miragon.darstellung";
734
+ function parseAppearanceChoice(stored) {
735
+ return stored === "light" || stored === "dark" ? stored : "system";
736
+ }
737
+ function documentMode(choice, themes, colors) {
738
+ if (!themes.includes("dark")) return fixedMode("light", colors.light);
739
+ const parsed = parseAppearanceChoice(choice);
740
+ if (parsed === "system") {
741
+ return {
742
+ theme: "system",
743
+ colorScheme: "light dark",
744
+ themeColor: { light: colors.light, dark: colors.dark }
745
+ };
746
+ }
747
+ return fixedMode(parsed, colors[parsed]);
748
+ }
749
+ function fixedMode(theme, color) {
750
+ return { theme, colorScheme: theme, themeColor: { light: color, dark: color } };
751
+ }
752
+ function webModeScript(options) {
753
+ const contrast = [
754
+ `if (window.matchMedia && window.matchMedia(${scriptString("(prefers-contrast: more)")}).matches)`,
755
+ ` document.documentElement.setAttribute("data-cd-kontrast", "hoch");`
756
+ ];
757
+ if (!options.themes.includes("dark")) return contrast.join("\n");
758
+ const { light, dark } = options.themeColors;
759
+ return [
760
+ "(function () {",
761
+ " var html = document.documentElement;",
762
+ " var choice = null;",
763
+ " try {",
764
+ ` choice = window.localStorage.getItem(${scriptString(APPEARANCE_STORAGE_KEY)});`,
765
+ " } catch (error) {}",
766
+ ` if (choice === "light" || choice === "dark") {`,
767
+ ` var color = choice === "dark" ? ${scriptString(dark)} : ${scriptString(light)};`,
768
+ ` html.setAttribute("data-cd-theme", choice);`,
769
+ ` var scheme = document.querySelector("meta[name=color-scheme]");`,
770
+ ` if (scheme) scheme.setAttribute("content", choice);`,
771
+ ` var metas = document.querySelectorAll("meta[name=theme-color]");`,
772
+ ` for (var index = 0; index < metas.length; index++) metas[index].setAttribute("content", color);`,
773
+ " }",
774
+ ...contrast.map((line) => ` ${line}`),
775
+ "})();"
776
+ ].join("\n");
777
+ }
778
+ function scriptString(value) {
779
+ return JSON.stringify(value).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
780
+ }
781
+ function webHeadMarkup(options) {
782
+ const mode = documentMode("system", options.themes, options.themeColors);
783
+ const script = `<script>
784
+ ${webModeScript(options)}
785
+ </script>`;
786
+ if (mode.theme !== "system") {
787
+ return [`<meta name="theme-color" content="${escapeAttribute(mode.themeColor.light)}">`, script].join(
788
+ "\n"
789
+ );
790
+ }
791
+ return [
792
+ `<meta name="color-scheme" content="${escapeAttribute(mode.colorScheme)}">`,
793
+ `<meta name="theme-color" content="${escapeAttribute(mode.themeColor.light)}" media="(prefers-color-scheme: light)">`,
794
+ `<meta name="theme-color" content="${escapeAttribute(mode.themeColor.dark)}" media="(prefers-color-scheme: dark)">`,
795
+ script
796
+ ].join("\n");
797
+ }
798
+ function escapeAttribute(value) {
799
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
800
+ }
801
+
802
+ // src/core/feedback/problems.ts
803
+ function problemSummary(items) {
804
+ const errors = items.filter((item) => item.severity === "error").length;
805
+ return { count: items.length, errors, items };
806
+ }
807
+ // Annotate the CommonJS export names for ESM import in node:
808
+ 0 && (module.exports = {
809
+ APPEARANCE_STORAGE_KEY,
810
+ CHROME_ISLANDS,
811
+ FIT_ANIMATION_MS,
812
+ INVALID_STATUS_DELAY_MS,
813
+ LEGAL_LINE_HEIGHT,
814
+ MAX_FIT_ZOOM,
815
+ MAX_TOASTS,
816
+ PALETTE_CLEARANCE,
817
+ REDUCED_MOTION_CLASS,
818
+ SHELL,
819
+ SHELL_TOKENS,
820
+ TEXT_FIELD_SELECTOR,
821
+ TOAST_DURATION_MS,
822
+ TOAST_MAX_WIDTH,
823
+ TOOLTIP_DELAY_MS,
824
+ VIEW_TOLERANCE,
825
+ ZOOM_MAX,
826
+ ZOOM_MIN,
827
+ acceptsFile,
828
+ appearanceAttributes,
829
+ appearanceFromBodyClasses,
830
+ appearanceFromColorThemeKind,
831
+ ariaKeyShortcuts,
832
+ ariaKeyShortcutsFromLabel,
833
+ canZoomIn,
834
+ canZoomOut,
835
+ commandKeyLabel,
836
+ decideKey,
837
+ decidePaletteRow,
838
+ decideTopRow,
839
+ defaultMessages,
840
+ detectPlatform,
841
+ documentMode,
842
+ dragVerdict,
843
+ easeStandard,
844
+ fitInsets,
845
+ fitViewbox,
846
+ formatNumber,
847
+ formatPercent,
848
+ freeRectCenter,
849
+ interpolateViewbox,
850
+ isUndoRedoKey,
851
+ legalLineHeight,
852
+ legendStartsOpen,
853
+ matchChromeKey,
854
+ parseAppearanceChoice,
855
+ placeTooltip,
856
+ problemSummary,
857
+ reducedMotionFromBodyClasses,
858
+ requestedAppearance,
859
+ resolveAppearance,
860
+ resolveMessages,
861
+ sameView,
862
+ shellSizesFromTokens,
863
+ shortcutLabel,
864
+ toastLifetime,
865
+ toastStackBottom,
866
+ toastStackWidth,
867
+ toastToEvict,
868
+ webHeadMarkup,
869
+ webModeScript,
870
+ zoomReadout,
871
+ zoomRowRaised
872
+ });
873
+ //# sourceMappingURL=core.cjs.map