@miragon/modeler-shell 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/API.md +1051 -84
- package/README.md +162 -31
- package/dist/appearance-BBaM_4bD.d.ts +323 -0
- package/dist/appearance-XX3JC3pI.d.cts +323 -0
- package/dist/{chunk-6LQOFACK.js → chunk-A4YGKH4Y.js} +1252 -31
- package/dist/chunk-A4YGKH4Y.js.map +1 -0
- package/dist/{chunk-RJRFR6N3.js → chunk-KYDG5DMX.js} +2 -2
- package/dist/{chunk-5JSZ4VGA.js → chunk-OADW3GPA.js} +240 -6
- package/dist/chunk-OADW3GPA.js.map +1 -0
- package/dist/core.cjs +260 -6
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +81 -6
- package/dist/core.d.ts +81 -6
- package/dist/core.js +43 -3
- package/dist/diagram-js.cjs +34 -2
- package/dist/diagram-js.cjs.map +1 -1
- package/dist/diagram-js.d.cts +10 -3
- package/dist/diagram-js.d.ts +10 -3
- package/dist/diagram-js.js +14 -2
- package/dist/diagram-js.js.map +1 -1
- package/dist/index.cjs +1658 -196
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -9
- package/dist/index.d.ts +18 -9
- package/dist/index.js +44 -4
- package/dist/shell.css +692 -3
- package/dist/testing-vscode-stub.js +2 -2
- package/dist/testing.cjs +2849 -550
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +75 -9
- package/dist/testing.d.ts +75 -9
- package/dist/testing.js +2744 -558
- package/dist/testing.js.map +1 -1
- package/dist/toasts-Bp0REqdq.d.cts +142 -0
- package/dist/toasts-Bp0REqdq.d.ts +142 -0
- package/dist/{types-OuFlqZp0.d.cts → types-CnRrINRs.d.cts} +170 -9
- package/dist/{types-DnZn9CPw.d.ts → types-PuDZczzy.d.ts} +170 -9
- package/dist/vscode-extension.js +2 -2
- package/dist/vscode-webview.cjs +1546 -178
- package/dist/vscode-webview.cjs.map +1 -1
- package/dist/vscode-webview.d.cts +6 -4
- package/dist/vscode-webview.d.ts +6 -4
- package/dist/vscode-webview.js +11 -2
- package/dist/vscode-webview.js.map +1 -1
- package/package.json +2 -2
- package/src/core/feedback/appearance.ts +141 -0
- package/src/core/feedback/problems.ts +23 -0
- package/src/core/feedback/toasts.ts +118 -0
- package/src/core/fit.ts +18 -3
- package/src/core/index.ts +43 -0
- package/src/core/keymap.ts +20 -0
- package/src/core/messages.ts +71 -0
- package/src/core/types.ts +24 -2
- package/src/core/web-chrome/bottom-row.ts +37 -0
- package/src/core/web-chrome/drop.ts +78 -0
- package/src/core/web-chrome/top-row.ts +66 -0
- package/src/diagram-js/service.ts +4 -1
- package/src/diagram-js/viewport.ts +19 -0
- package/src/dom/buttons.css +124 -0
- package/src/dom/feedback/appearance.ts +184 -0
- package/src/dom/feedback/feedback.css +435 -0
- package/src/dom/feedback/problems-popover.ts +287 -0
- package/src/dom/feedback/toasts.ts +431 -0
- package/src/dom/index.ts +13 -0
- package/src/dom/keys.ts +8 -0
- package/src/dom/menu.ts +28 -17
- package/src/dom/mount.ts +290 -20
- package/src/dom/problems.ts +5 -4
- package/src/dom/shell-dom.css +7 -4
- package/src/dom/tooltip.ts +10 -0
- package/src/dom/types.ts +188 -6
- package/src/dom/web/drop-zone.ts +181 -0
- package/src/dom/web/empty-state.ts +144 -0
- package/src/dom/web/legal.ts +75 -0
- package/src/dom/web/menu-groups.ts +69 -0
- package/src/dom/web/primary.ts +124 -0
- package/src/dom/web/web.css +386 -0
- package/src/shell.css +3 -0
- package/src/testing/case-tools.ts +164 -0
- package/src/testing/cases.ts +209 -144
- package/src/testing/checks.ts +51 -15
- package/src/testing/facts.ts +56 -2
- package/src/testing/geometry.ts +206 -26
- package/src/testing/harness.ts +56 -7
- package/src/testing/index.ts +4 -0
- package/src/testing/page-tools.ts +24 -1
- package/src/testing/page.ts +10 -0
- package/src/testing/web-cases.ts +913 -0
- package/src/testing/web-checks.ts +1049 -0
- package/src/testing/web-facts.ts +713 -0
- package/src/vscode/webview/mount.ts +13 -1
- package/dist/chunk-5JSZ4VGA.js.map +0 -1
- package/dist/chunk-6LQOFACK.js.map +0 -1
- package/dist/keymap-CObQE6q6.d.cts +0 -151
- package/dist/keymap-DORzHnK-.d.ts +0 -151
- package/dist/types-B6NfkiUG.d.cts +0 -66
- package/dist/types-B6NfkiUG.d.ts +0 -66
- /package/dist/{chunk-RJRFR6N3.js.map → chunk-KYDG5DMX.js.map} +0 -0
package/dist/core.cjs
CHANGED
|
@@ -20,19 +20,25 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/core.ts
|
|
21
21
|
var core_exports = {};
|
|
22
22
|
__export(core_exports, {
|
|
23
|
+
APPEARANCE_STORAGE_KEY: () => APPEARANCE_STORAGE_KEY,
|
|
23
24
|
CHROME_ISLANDS: () => CHROME_ISLANDS,
|
|
24
25
|
FIT_ANIMATION_MS: () => FIT_ANIMATION_MS,
|
|
25
26
|
INVALID_STATUS_DELAY_MS: () => INVALID_STATUS_DELAY_MS,
|
|
27
|
+
LEGAL_LINE_HEIGHT: () => LEGAL_LINE_HEIGHT,
|
|
26
28
|
MAX_FIT_ZOOM: () => MAX_FIT_ZOOM,
|
|
29
|
+
MAX_TOASTS: () => MAX_TOASTS,
|
|
27
30
|
PALETTE_CLEARANCE: () => PALETTE_CLEARANCE,
|
|
28
31
|
REDUCED_MOTION_CLASS: () => REDUCED_MOTION_CLASS,
|
|
29
32
|
SHELL: () => SHELL,
|
|
30
33
|
SHELL_TOKENS: () => SHELL_TOKENS,
|
|
31
34
|
TEXT_FIELD_SELECTOR: () => TEXT_FIELD_SELECTOR,
|
|
35
|
+
TOAST_DURATION_MS: () => TOAST_DURATION_MS,
|
|
36
|
+
TOAST_MAX_WIDTH: () => TOAST_MAX_WIDTH,
|
|
32
37
|
TOOLTIP_DELAY_MS: () => TOOLTIP_DELAY_MS,
|
|
33
38
|
VIEW_TOLERANCE: () => VIEW_TOLERANCE,
|
|
34
39
|
ZOOM_MAX: () => ZOOM_MAX,
|
|
35
40
|
ZOOM_MIN: () => ZOOM_MIN,
|
|
41
|
+
acceptsFile: () => acceptsFile,
|
|
36
42
|
appearanceAttributes: () => appearanceAttributes,
|
|
37
43
|
appearanceFromBodyClasses: () => appearanceFromBodyClasses,
|
|
38
44
|
appearanceFromColorThemeKind: () => appearanceFromColorThemeKind,
|
|
@@ -40,10 +46,14 @@ __export(core_exports, {
|
|
|
40
46
|
ariaKeyShortcutsFromLabel: () => ariaKeyShortcutsFromLabel,
|
|
41
47
|
canZoomIn: () => canZoomIn,
|
|
42
48
|
canZoomOut: () => canZoomOut,
|
|
49
|
+
commandKeyLabel: () => commandKeyLabel,
|
|
43
50
|
decideKey: () => decideKey,
|
|
44
51
|
decidePaletteRow: () => decidePaletteRow,
|
|
52
|
+
decideTopRow: () => decideTopRow,
|
|
45
53
|
defaultMessages: () => defaultMessages,
|
|
46
54
|
detectPlatform: () => detectPlatform,
|
|
55
|
+
documentMode: () => documentMode,
|
|
56
|
+
dragVerdict: () => dragVerdict,
|
|
47
57
|
easeStandard: () => easeStandard,
|
|
48
58
|
fitInsets: () => fitInsets,
|
|
49
59
|
fitViewbox: () => fitViewbox,
|
|
@@ -52,9 +62,12 @@ __export(core_exports, {
|
|
|
52
62
|
freeRectCenter: () => freeRectCenter,
|
|
53
63
|
interpolateViewbox: () => interpolateViewbox,
|
|
54
64
|
isUndoRedoKey: () => isUndoRedoKey,
|
|
65
|
+
legalLineHeight: () => legalLineHeight,
|
|
55
66
|
legendStartsOpen: () => legendStartsOpen,
|
|
56
67
|
matchChromeKey: () => matchChromeKey,
|
|
68
|
+
parseAppearanceChoice: () => parseAppearanceChoice,
|
|
57
69
|
placeTooltip: () => placeTooltip,
|
|
70
|
+
problemSummary: () => problemSummary,
|
|
58
71
|
reducedMotionFromBodyClasses: () => reducedMotionFromBodyClasses,
|
|
59
72
|
requestedAppearance: () => requestedAppearance,
|
|
60
73
|
resolveAppearance: () => resolveAppearance,
|
|
@@ -62,7 +75,14 @@ __export(core_exports, {
|
|
|
62
75
|
sameView: () => sameView,
|
|
63
76
|
shellSizesFromTokens: () => shellSizesFromTokens,
|
|
64
77
|
shortcutLabel: () => shortcutLabel,
|
|
65
|
-
|
|
78
|
+
toastLifetime: () => toastLifetime,
|
|
79
|
+
toastStackBottom: () => toastStackBottom,
|
|
80
|
+
toastStackWidth: () => toastStackWidth,
|
|
81
|
+
toastToEvict: () => toastToEvict,
|
|
82
|
+
webHeadMarkup: () => webHeadMarkup,
|
|
83
|
+
webModeScript: () => webModeScript,
|
|
84
|
+
zoomReadout: () => zoomReadout,
|
|
85
|
+
zoomRowRaised: () => zoomRowRaised
|
|
66
86
|
});
|
|
67
87
|
module.exports = __toCommonJS(core_exports);
|
|
68
88
|
|
|
@@ -75,7 +95,12 @@ var CHROME_ISLANDS = [
|
|
|
75
95
|
"problems",
|
|
76
96
|
"legend",
|
|
77
97
|
"inspector",
|
|
78
|
-
"status"
|
|
98
|
+
"status",
|
|
99
|
+
"legal",
|
|
100
|
+
"toasts",
|
|
101
|
+
"empty-state",
|
|
102
|
+
"drop-zone",
|
|
103
|
+
"problems-popover"
|
|
79
104
|
];
|
|
80
105
|
|
|
81
106
|
// src/core/sizes.ts
|
|
@@ -146,6 +171,19 @@ function shellSizesFromTokens(shellGroup) {
|
|
|
146
171
|
return sizes;
|
|
147
172
|
}
|
|
148
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
|
+
|
|
149
187
|
// src/core/fit.ts
|
|
150
188
|
var MAX_FIT_ZOOM = 1;
|
|
151
189
|
var FIT_ANIMATION_MS = 250;
|
|
@@ -186,11 +224,13 @@ function freeRectCenter(container, insets) {
|
|
|
186
224
|
};
|
|
187
225
|
}
|
|
188
226
|
function fitInsets(layout) {
|
|
189
|
-
const { container, host, paletteRow, problemsVisible, legendWidth, inspector } = 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;
|
|
190
230
|
const insets = {
|
|
191
231
|
top: paletteRow === "second-row" ? SHELL.fitInsetTopSecondRow : SHELL.fitInsetTop,
|
|
192
232
|
right: SHELL.fitInsetSide,
|
|
193
|
-
bottom:
|
|
233
|
+
bottom: raisedBottomRow ? SHELL.fitInsetBottomWeb + wrappedLegalLines : SHELL.fitInsetBottom,
|
|
194
234
|
left: SHELL.fitInsetSide
|
|
195
235
|
};
|
|
196
236
|
const bottomSheetOpen = inspector !== void 0 && container.width <= SHELL.narrow;
|
|
@@ -344,6 +384,7 @@ function decideKey(event, context) {
|
|
|
344
384
|
}
|
|
345
385
|
const chromeKey = matchChromeKey(event);
|
|
346
386
|
if (chromeKey !== void 0) {
|
|
387
|
+
if (context.startScreen === true && !stop) return { preventDefault: false, stopPropagation: false };
|
|
347
388
|
const blocked = composing || context.inTextField || context.modalOpen;
|
|
348
389
|
if (!blocked) return { action: chromeKey, preventDefault: true, stopPropagation: stop };
|
|
349
390
|
return { preventDefault: false, stopPropagation: chromeKey === "fit" ? false : stop };
|
|
@@ -369,6 +410,9 @@ function shortcutLabel(key, platform, keyNames) {
|
|
|
369
410
|
return `${keyNames.shift}+1`;
|
|
370
411
|
}
|
|
371
412
|
}
|
|
413
|
+
function commandKeyLabel(key, platform, keyNames) {
|
|
414
|
+
return platform === "mac" ? `\u2318${key}` : `${keyNames.ctrl}+${key}`;
|
|
415
|
+
}
|
|
372
416
|
var MAC_SHORTCUT_LABELS = {
|
|
373
417
|
zoomIn: "\u2318+",
|
|
374
418
|
zoomOut: "\u2318\u2212",
|
|
@@ -531,7 +575,27 @@ var defaultMessages = {
|
|
|
531
575
|
emptyHint: "Pick a tool from the palette to start.",
|
|
532
576
|
insertExample: "Insert example",
|
|
533
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.`,
|
|
534
|
-
keyNames: { ctrl: "Ctrl", shift: "Shift", plus: "Plus", minus: "Minus" }
|
|
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.`
|
|
535
599
|
};
|
|
536
600
|
function resolveMessages(overrides) {
|
|
537
601
|
const { keyNames, ...texts } = overrides ?? {};
|
|
@@ -570,21 +634,197 @@ function placeTooltip(input) {
|
|
|
570
634
|
const x = Math.max(SHELL.edge, Math.min(centred, rightmost));
|
|
571
635
|
return { x, y };
|
|
572
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, "&").replace(/"/g, """).replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">");
|
|
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
|
+
}
|
|
573
807
|
// Annotate the CommonJS export names for ESM import in node:
|
|
574
808
|
0 && (module.exports = {
|
|
809
|
+
APPEARANCE_STORAGE_KEY,
|
|
575
810
|
CHROME_ISLANDS,
|
|
576
811
|
FIT_ANIMATION_MS,
|
|
577
812
|
INVALID_STATUS_DELAY_MS,
|
|
813
|
+
LEGAL_LINE_HEIGHT,
|
|
578
814
|
MAX_FIT_ZOOM,
|
|
815
|
+
MAX_TOASTS,
|
|
579
816
|
PALETTE_CLEARANCE,
|
|
580
817
|
REDUCED_MOTION_CLASS,
|
|
581
818
|
SHELL,
|
|
582
819
|
SHELL_TOKENS,
|
|
583
820
|
TEXT_FIELD_SELECTOR,
|
|
821
|
+
TOAST_DURATION_MS,
|
|
822
|
+
TOAST_MAX_WIDTH,
|
|
584
823
|
TOOLTIP_DELAY_MS,
|
|
585
824
|
VIEW_TOLERANCE,
|
|
586
825
|
ZOOM_MAX,
|
|
587
826
|
ZOOM_MIN,
|
|
827
|
+
acceptsFile,
|
|
588
828
|
appearanceAttributes,
|
|
589
829
|
appearanceFromBodyClasses,
|
|
590
830
|
appearanceFromColorThemeKind,
|
|
@@ -592,10 +832,14 @@ function placeTooltip(input) {
|
|
|
592
832
|
ariaKeyShortcutsFromLabel,
|
|
593
833
|
canZoomIn,
|
|
594
834
|
canZoomOut,
|
|
835
|
+
commandKeyLabel,
|
|
595
836
|
decideKey,
|
|
596
837
|
decidePaletteRow,
|
|
838
|
+
decideTopRow,
|
|
597
839
|
defaultMessages,
|
|
598
840
|
detectPlatform,
|
|
841
|
+
documentMode,
|
|
842
|
+
dragVerdict,
|
|
599
843
|
easeStandard,
|
|
600
844
|
fitInsets,
|
|
601
845
|
fitViewbox,
|
|
@@ -604,9 +848,12 @@ function placeTooltip(input) {
|
|
|
604
848
|
freeRectCenter,
|
|
605
849
|
interpolateViewbox,
|
|
606
850
|
isUndoRedoKey,
|
|
851
|
+
legalLineHeight,
|
|
607
852
|
legendStartsOpen,
|
|
608
853
|
matchChromeKey,
|
|
854
|
+
parseAppearanceChoice,
|
|
609
855
|
placeTooltip,
|
|
856
|
+
problemSummary,
|
|
610
857
|
reducedMotionFromBodyClasses,
|
|
611
858
|
requestedAppearance,
|
|
612
859
|
resolveAppearance,
|
|
@@ -614,6 +861,13 @@ function placeTooltip(input) {
|
|
|
614
861
|
sameView,
|
|
615
862
|
shellSizesFromTokens,
|
|
616
863
|
shortcutLabel,
|
|
617
|
-
|
|
864
|
+
toastLifetime,
|
|
865
|
+
toastStackBottom,
|
|
866
|
+
toastStackWidth,
|
|
867
|
+
toastToEvict,
|
|
868
|
+
webHeadMarkup,
|
|
869
|
+
webModeScript,
|
|
870
|
+
zoomReadout,
|
|
871
|
+
zoomRowRaised
|
|
618
872
|
});
|
|
619
873
|
//# sourceMappingURL=core.cjs.map
|