@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.
Files changed (98) hide show
  1. package/API.md +1051 -84
  2. package/README.md +162 -31
  3. package/dist/appearance-BBaM_4bD.d.ts +323 -0
  4. package/dist/appearance-XX3JC3pI.d.cts +323 -0
  5. package/dist/{chunk-6LQOFACK.js → chunk-A4YGKH4Y.js} +1252 -31
  6. package/dist/chunk-A4YGKH4Y.js.map +1 -0
  7. package/dist/{chunk-RJRFR6N3.js → chunk-KYDG5DMX.js} +2 -2
  8. package/dist/{chunk-5JSZ4VGA.js → chunk-OADW3GPA.js} +240 -6
  9. package/dist/chunk-OADW3GPA.js.map +1 -0
  10. package/dist/core.cjs +260 -6
  11. package/dist/core.cjs.map +1 -1
  12. package/dist/core.d.cts +81 -6
  13. package/dist/core.d.ts +81 -6
  14. package/dist/core.js +43 -3
  15. package/dist/diagram-js.cjs +34 -2
  16. package/dist/diagram-js.cjs.map +1 -1
  17. package/dist/diagram-js.d.cts +10 -3
  18. package/dist/diagram-js.d.ts +10 -3
  19. package/dist/diagram-js.js +14 -2
  20. package/dist/diagram-js.js.map +1 -1
  21. package/dist/index.cjs +1658 -196
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +18 -9
  24. package/dist/index.d.ts +18 -9
  25. package/dist/index.js +44 -4
  26. package/dist/shell.css +692 -3
  27. package/dist/testing-vscode-stub.js +2 -2
  28. package/dist/testing.cjs +2849 -550
  29. package/dist/testing.cjs.map +1 -1
  30. package/dist/testing.d.cts +75 -9
  31. package/dist/testing.d.ts +75 -9
  32. package/dist/testing.js +2744 -558
  33. package/dist/testing.js.map +1 -1
  34. package/dist/toasts-Bp0REqdq.d.cts +142 -0
  35. package/dist/toasts-Bp0REqdq.d.ts +142 -0
  36. package/dist/{types-OuFlqZp0.d.cts → types-CnRrINRs.d.cts} +170 -9
  37. package/dist/{types-DnZn9CPw.d.ts → types-PuDZczzy.d.ts} +170 -9
  38. package/dist/vscode-extension.js +2 -2
  39. package/dist/vscode-webview.cjs +1546 -178
  40. package/dist/vscode-webview.cjs.map +1 -1
  41. package/dist/vscode-webview.d.cts +6 -4
  42. package/dist/vscode-webview.d.ts +6 -4
  43. package/dist/vscode-webview.js +11 -2
  44. package/dist/vscode-webview.js.map +1 -1
  45. package/package.json +2 -2
  46. package/src/core/feedback/appearance.ts +141 -0
  47. package/src/core/feedback/problems.ts +23 -0
  48. package/src/core/feedback/toasts.ts +118 -0
  49. package/src/core/fit.ts +18 -3
  50. package/src/core/index.ts +43 -0
  51. package/src/core/keymap.ts +20 -0
  52. package/src/core/messages.ts +71 -0
  53. package/src/core/types.ts +24 -2
  54. package/src/core/web-chrome/bottom-row.ts +37 -0
  55. package/src/core/web-chrome/drop.ts +78 -0
  56. package/src/core/web-chrome/top-row.ts +66 -0
  57. package/src/diagram-js/service.ts +4 -1
  58. package/src/diagram-js/viewport.ts +19 -0
  59. package/src/dom/buttons.css +124 -0
  60. package/src/dom/feedback/appearance.ts +184 -0
  61. package/src/dom/feedback/feedback.css +435 -0
  62. package/src/dom/feedback/problems-popover.ts +287 -0
  63. package/src/dom/feedback/toasts.ts +431 -0
  64. package/src/dom/index.ts +13 -0
  65. package/src/dom/keys.ts +8 -0
  66. package/src/dom/menu.ts +28 -17
  67. package/src/dom/mount.ts +290 -20
  68. package/src/dom/problems.ts +5 -4
  69. package/src/dom/shell-dom.css +7 -4
  70. package/src/dom/tooltip.ts +10 -0
  71. package/src/dom/types.ts +188 -6
  72. package/src/dom/web/drop-zone.ts +181 -0
  73. package/src/dom/web/empty-state.ts +144 -0
  74. package/src/dom/web/legal.ts +75 -0
  75. package/src/dom/web/menu-groups.ts +69 -0
  76. package/src/dom/web/primary.ts +124 -0
  77. package/src/dom/web/web.css +386 -0
  78. package/src/shell.css +3 -0
  79. package/src/testing/case-tools.ts +164 -0
  80. package/src/testing/cases.ts +209 -144
  81. package/src/testing/checks.ts +51 -15
  82. package/src/testing/facts.ts +56 -2
  83. package/src/testing/geometry.ts +206 -26
  84. package/src/testing/harness.ts +56 -7
  85. package/src/testing/index.ts +4 -0
  86. package/src/testing/page-tools.ts +24 -1
  87. package/src/testing/page.ts +10 -0
  88. package/src/testing/web-cases.ts +913 -0
  89. package/src/testing/web-checks.ts +1049 -0
  90. package/src/testing/web-facts.ts +713 -0
  91. package/src/vscode/webview/mount.ts +13 -1
  92. package/dist/chunk-5JSZ4VGA.js.map +0 -1
  93. package/dist/chunk-6LQOFACK.js.map +0 -1
  94. package/dist/keymap-CObQE6q6.d.cts +0 -151
  95. package/dist/keymap-DORzHnK-.d.ts +0 -151
  96. package/dist/types-B6NfkiUG.d.cts +0 -66
  97. package/dist/types-B6NfkiUG.d.ts +0 -66
  98. /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
- zoomReadout: () => zoomReadout
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: host === "web" && problemsVisible ? SHELL.fitInsetBottomWeb : SHELL.fitInsetBottom,
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, "&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
+ }
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
- zoomReadout
864
+ toastLifetime,
865
+ toastStackBottom,
866
+ toastStackWidth,
867
+ toastToEvict,
868
+ webHeadMarkup,
869
+ webModeScript,
870
+ zoomReadout,
871
+ zoomRowRaised
618
872
  });
619
873
  //# sourceMappingURL=core.cjs.map