@miragon/modeler-shell 0.0.0-stage → 0.1.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 (126) hide show
  1. package/API.md +1902 -0
  2. package/LICENSE +21 -0
  3. package/README.md +435 -2
  4. package/THIRD_PARTY_NOTICES.md +52 -0
  5. package/dist/appearance-D3FUcbu6.d.cts +53 -0
  6. package/dist/appearance-D3FUcbu6.d.ts +53 -0
  7. package/dist/chunk-5JSZ4VGA.js +551 -0
  8. package/dist/chunk-5JSZ4VGA.js.map +1 -0
  9. package/dist/chunk-6LQOFACK.js +1576 -0
  10. package/dist/chunk-6LQOFACK.js.map +1 -0
  11. package/dist/chunk-N4QXFF3A.js +23 -0
  12. package/dist/chunk-N4QXFF3A.js.map +1 -0
  13. package/dist/chunk-RJRFR6N3.js +136 -0
  14. package/dist/chunk-RJRFR6N3.js.map +1 -0
  15. package/dist/core.cjs +619 -0
  16. package/dist/core.cjs.map +1 -0
  17. package/dist/core.d.cts +171 -0
  18. package/dist/core.d.ts +171 -0
  19. package/dist/core.js +91 -0
  20. package/dist/core.js.map +1 -0
  21. package/dist/diagram-js.cjs +1115 -0
  22. package/dist/diagram-js.cjs.map +1 -0
  23. package/dist/diagram-js.d.cts +163 -0
  24. package/dist/diagram-js.d.ts +163 -0
  25. package/dist/diagram-js.js +867 -0
  26. package/dist/diagram-js.js.map +1 -0
  27. package/dist/index.cjs +2175 -0
  28. package/dist/index.cjs.map +1 -0
  29. package/dist/index.d.cts +20 -0
  30. package/dist/index.d.ts +20 -0
  31. package/dist/index.js +103 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/keymap-CObQE6q6.d.cts +151 -0
  34. package/dist/keymap-DORzHnK-.d.ts +151 -0
  35. package/dist/protocol-DhYBakWL.d.cts +15 -0
  36. package/dist/protocol-IeW8bf4f.d.ts +15 -0
  37. package/dist/shell.css +914 -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 +2364 -0
  45. package/dist/testing.cjs.map +1 -0
  46. package/dist/testing.d.cts +165 -0
  47. package/dist/testing.d.ts +165 -0
  48. package/dist/testing.js +2297 -0
  49. package/dist/testing.js.map +1 -0
  50. package/dist/types-B6NfkiUG.d.cts +66 -0
  51. package/dist/types-B6NfkiUG.d.ts +66 -0
  52. package/dist/types-DnZn9CPw.d.ts +284 -0
  53. package/dist/types-OuFlqZp0.d.cts +284 -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 +2198 -0
  61. package/dist/vscode-webview.cjs.map +1 -0
  62. package/dist/vscode-webview.d.cts +82 -0
  63. package/dist/vscode-webview.d.ts +82 -0
  64. package/dist/vscode-webview.js +250 -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/fit.ts +205 -0
  69. package/src/core/index.ts +84 -0
  70. package/src/core/keymap.ts +275 -0
  71. package/src/core/layout.ts +69 -0
  72. package/src/core/messages.ts +88 -0
  73. package/src/core/sizes.ts +85 -0
  74. package/src/core/types.ts +84 -0
  75. package/src/core/zoom.ts +74 -0
  76. package/src/core.ts +2 -0
  77. package/src/diagram-js/connect.ts +75 -0
  78. package/src/diagram-js/index.ts +16 -0
  79. package/src/diagram-js/module.ts +20 -0
  80. package/src/diagram-js/palette-skin.ts +267 -0
  81. package/src/diagram-js/palette.css +269 -0
  82. package/src/diagram-js/service.ts +240 -0
  83. package/src/diagram-js/types.ts +67 -0
  84. package/src/diagram-js/viewport.ts +564 -0
  85. package/src/diagram-js.ts +2 -0
  86. package/src/dom/element.ts +51 -0
  87. package/src/dom/hint.ts +51 -0
  88. package/src/dom/icons.ts +309 -0
  89. package/src/dom/index.ts +29 -0
  90. package/src/dom/inspector.ts +35 -0
  91. package/src/dom/keys.ts +59 -0
  92. package/src/dom/ledger.ts +87 -0
  93. package/src/dom/legend.ts +85 -0
  94. package/src/dom/menu.ts +393 -0
  95. package/src/dom/mount.ts +461 -0
  96. package/src/dom/problems.ts +72 -0
  97. package/src/dom/shell-dom.css +966 -0
  98. package/src/dom/status.ts +72 -0
  99. package/src/dom/tooltip.ts +237 -0
  100. package/src/dom/types.ts +277 -0
  101. package/src/dom/zoom-panel.ts +154 -0
  102. package/src/index.ts +3 -0
  103. package/src/shell.css +6 -0
  104. package/src/testing/cases.ts +1012 -0
  105. package/src/testing/checks.ts +832 -0
  106. package/src/testing/facts.ts +587 -0
  107. package/src/testing/geometry.ts +472 -0
  108. package/src/testing/harness.ts +138 -0
  109. package/src/testing/index.ts +15 -0
  110. package/src/testing/page-tools.ts +434 -0
  111. package/src/testing/page.ts +17 -0
  112. package/src/testing/vscode-stub.ts +237 -0
  113. package/src/testing-vscode-stub.ts +2 -0
  114. package/src/testing.ts +2 -0
  115. package/src/vscode/extension/html.ts +107 -0
  116. package/src/vscode/extension/index.ts +8 -0
  117. package/src/vscode/extension/reveal.ts +9 -0
  118. package/src/vscode/extension/theme-bridge.ts +85 -0
  119. package/src/vscode/extension/types.ts +36 -0
  120. package/src/vscode/protocol.ts +31 -0
  121. package/src/vscode/webview/appearance.ts +141 -0
  122. package/src/vscode/webview/index.ts +8 -0
  123. package/src/vscode/webview/mount.ts +76 -0
  124. package/src/vscode/webview/state.ts +116 -0
  125. package/src/vscode-extension.ts +2 -0
  126. package/src/vscode-webview.ts +2 -0
@@ -0,0 +1,154 @@
1
+ import {
2
+ connectThemeBridge,
3
+ currentAppearance,
4
+ renderWebviewHtml
5
+ } from "./chunk-RJRFR6N3.js";
6
+ import "./chunk-N4QXFF3A.js";
7
+ import "./chunk-5JSZ4VGA.js";
8
+
9
+ // src/testing/vscode-stub.ts
10
+ var BODY_CLASSES = {
11
+ 1: ["vscode-light"],
12
+ 2: ["vscode-dark"],
13
+ 3: ["vscode-high-contrast"],
14
+ 4: ["vscode-high-contrast-light", "vscode-high-contrast"]
15
+ };
16
+ var ALL_BODY_CLASSES = Object.values(BODY_CLASSES).flat();
17
+ var REDUCE_MOTION_BODY_CLASS = "vscode-reduce-motion";
18
+ var VSCODE_DEFAULT_STYLES = `@layer vscode-default {
19
+ body { margin: 0; padding: 0 20px; color: currentColor; font-family: serif; font-size: 17px; }
20
+ kbd { box-shadow: inset 0 -1px 0 currentColor; vertical-align: middle; padding: 1px 3px; border-radius: 3px; font-family: serif; }
21
+ code { font-family: serif; padding: 1px 3px; border-radius: 4px; }
22
+ a:focus, input:focus, select:focus, textarea:focus { outline: 1px solid -webkit-focus-ring-color; outline-offset: -1px; }
23
+ }`;
24
+ var STUB_SETTING_KEY = "miragon.modeler.colorTheme";
25
+ function colorThemeKindOf(appearance) {
26
+ if (appearance.kontrast) return appearance.theme === "dark" ? 3 : 4;
27
+ return appearance.theme === "dark" ? 2 : 1;
28
+ }
29
+ function stubOptionsFromSearch(search) {
30
+ const params = new URLSearchParams(search);
31
+ const theme = params.get("theme") === "dark" ? "dark" : "light";
32
+ const setting = params.get("colorTheme");
33
+ return {
34
+ requested: params.get("kontrast") === "hoch" ? { theme, kontrast: "hoch" } : { theme },
35
+ colorTheme: setting === "automatic" || setting === "light" || setting === "dark" ? setting : void 0,
36
+ reduceMotion: params.has("reduceMotion")
37
+ };
38
+ }
39
+ function installVsCodeWebviewStub(options) {
40
+ const settingKey = options.settingKey ?? STUB_SETTING_KEY;
41
+ const scope = window;
42
+ let kind = colorThemeKindOf(options.requested);
43
+ let setting = options.colorTheme;
44
+ const themeListeners = /* @__PURE__ */ new Set();
45
+ const configurationListeners = /* @__PURE__ */ new Set();
46
+ const vscode = {
47
+ window: {
48
+ get activeColorTheme() {
49
+ return { kind };
50
+ },
51
+ onDidChangeActiveColorTheme(listener) {
52
+ themeListeners.add(listener);
53
+ return { dispose: () => themeListeners.delete(listener) };
54
+ }
55
+ },
56
+ workspace: {
57
+ getConfiguration: (section) => ({
58
+ get: (key) => (section ? `${section}.${key}` : key) === settingKey ? setting : void 0
59
+ }),
60
+ onDidChangeConfiguration(listener) {
61
+ configurationListeners.add(listener);
62
+ return { dispose: () => configurationListeners.delete(listener) };
63
+ }
64
+ }
65
+ };
66
+ const none = { dispose: () => void 0 };
67
+ let posted = 0;
68
+ let delivered = 0;
69
+ window.addEventListener("message", () => delivered++);
70
+ const panel = {
71
+ webview: {
72
+ postMessage(message) {
73
+ posted++;
74
+ window.postMessage(message, "*");
75
+ }
76
+ },
77
+ visible: true,
78
+ onDidChangeViewState: () => none,
79
+ onDidDispose: () => none
80
+ };
81
+ const bridgeOptions = { themes: options.themes, settingKey };
82
+ const defaults = document.createElement("style");
83
+ defaults.id = "_defaultStyles";
84
+ defaults.textContent = VSCODE_DEFAULT_STYLES;
85
+ document.head.prepend(defaults);
86
+ const html = new DOMParser().parseFromString(
87
+ renderWebviewHtml({
88
+ cspSource: window.location.origin,
89
+ scriptUri: "webview.js",
90
+ title: document.title,
91
+ lang: options.lang ?? "en",
92
+ appearance: currentAppearance(vscode, bridgeOptions)
93
+ }),
94
+ "text/html"
95
+ ).documentElement;
96
+ for (const name of html.getAttributeNames()) {
97
+ if (name === "class") document.documentElement.classList.add(...html.classList);
98
+ else document.documentElement.setAttribute(name, html.getAttribute(name) ?? "");
99
+ }
100
+ const setBodyClasses = (next) => {
101
+ document.body.classList.remove(...ALL_BODY_CLASSES);
102
+ document.body.classList.add(...BODY_CLASSES[next]);
103
+ };
104
+ setBodyClasses(kind);
105
+ document.body.classList.toggle(REDUCE_MOTION_BODY_CLASS, options.reduceMotion === true);
106
+ connectThemeBridge(vscode, panel, bridgeOptions);
107
+ let state = options.state;
108
+ const sent = [];
109
+ let acquired = false;
110
+ scope.acquireVsCodeApi = () => {
111
+ if (acquired) throw new Error("An instance of the VS Code API has already been acquired");
112
+ acquired = true;
113
+ return {
114
+ getState: () => state,
115
+ setState(next) {
116
+ state = next;
117
+ },
118
+ postMessage(message) {
119
+ sent.push(message);
120
+ }
121
+ };
122
+ };
123
+ const stub = {
124
+ get kind() {
125
+ return kind;
126
+ },
127
+ setColorThemeKind(next) {
128
+ kind = next;
129
+ setBodyClasses(next);
130
+ for (const listener of [...themeListeners]) listener({ kind: next });
131
+ },
132
+ setColorTheme(next) {
133
+ setting = next;
134
+ for (const listener of [...configurationListeners]) {
135
+ listener({ affectsConfiguration: (section) => settingKey.startsWith(section) });
136
+ }
137
+ },
138
+ setReduceMotion(reduceMotion) {
139
+ document.body.classList.toggle(REDUCE_MOTION_BODY_CLASS, reduceMotion);
140
+ },
141
+ pendingMessages: () => posted - delivered,
142
+ posted: sent,
143
+ state: () => state
144
+ };
145
+ scope.__modelerShellVsCodeStub = stub;
146
+ return stub;
147
+ }
148
+ export {
149
+ STUB_SETTING_KEY,
150
+ colorThemeKindOf,
151
+ installVsCodeWebviewStub,
152
+ stubOptionsFromSearch
153
+ };
154
+ //# sourceMappingURL=testing-vscode-stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/testing/vscode-stub.ts"],"sourcesContent":["import type { Appearance, ColorThemeSetting, Theme } from \"../core/index.js\";\nimport {\n connectThemeBridge,\n currentAppearance,\n renderWebviewHtml,\n type ColorThemeLike,\n type DisposableLike,\n type VsCodeLike,\n type WebviewPanelLike,\n} from \"../vscode/extension/index.js\";\n\n/*\n * Runs in the page, in front of a modeler's webview bundle: a stand-in for the VS Code around it,\n * so a modeler's e2e suite runs the conformance kit for the `ide` host without VS Code.\n */\n\n/** `vscode.ColorThemeKind`: 1 Light, 2 Dark, 3 High Contrast, 4 High Contrast Light. */\nexport type ColorThemeKind = 1 | 2 | 3 | 4;\n\n/** The body classes VS Code's webview host page sets per color theme (High Contrast Light keeps both). */\nconst BODY_CLASSES: Readonly<Record<ColorThemeKind, readonly string[]>> = {\n 1: [\"vscode-light\"],\n 2: [\"vscode-dark\"],\n 3: [\"vscode-high-contrast\"],\n 4: [\"vscode-high-contrast-light\", \"vscode-high-contrast\"],\n};\nconst ALL_BODY_CLASSES = Object.values(BODY_CLASSES).flat();\nconst REDUCE_MOTION_BODY_CLASS = \"vscode-reduce-motion\";\n\n/**\n * The rules of VS Code's default webview stylesheet the shell's own-document reset must beat\n * (implementation notes, \"VS Code: host hygiene\"), with deliberately foreign values so a leak shows.\n */\nconst VSCODE_DEFAULT_STYLES = `@layer vscode-default {\n body { margin: 0; padding: 0 20px; color: currentColor; font-family: serif; font-size: 17px; }\n kbd { box-shadow: inset 0 -1px 0 currentColor; vertical-align: middle; padding: 1px 3px; border-radius: 3px; font-family: serif; }\n code { font-family: serif; padding: 1px 3px; border-radius: 4px; }\n a:focus, input:focus, select:focus, textarea:focus { outline: 1px solid -webkit-focus-ring-color; outline-offset: -1px; }\n}`;\n\n/** The default setting key the stub answers when `colorTheme` is given without one. */\nexport const STUB_SETTING_KEY = \"miragon.modeler.colorTheme\";\n\n/** The VS Code color theme that requests `appearance` (guide §13.3). */\nexport function colorThemeKindOf(appearance: Appearance): ColorThemeKind {\n if (appearance.kontrast) return appearance.theme === \"dark\" ? 3 : 4;\n return appearance.theme === \"dark\" ? 2 : 1;\n}\n\nexport interface VsCodeWebviewStubOptions {\n /** What VS Code requests: its color theme, as the appearance the kit asks for. */\n requested: Appearance;\n /** The modes the modeler declares (what its extension passes to the theme bridge). */\n themes: readonly Theme[];\n /** `<html lang>`; default `\"en\"`. */\n lang?: string | undefined;\n /** The value of the modeler's `colorTheme` setting (from its dark-mode release on). */\n colorTheme?: ColorThemeSetting | undefined;\n /** The full setting key the stub answers and the bridge listens to; default `STUB_SETTING_KEY`. */\n settingKey?: string | undefined;\n /** VS Code's `workbench.reduceMotion` (the body class `vscode-reduce-motion`). */\n reduceMotion?: boolean | undefined;\n /** What `getState()` of the stubbed `acquireVsCodeApi()` returns at first. */\n state?: unknown;\n}\n\n/** The stubbed `acquireVsCodeApi()`. */\nexport interface StubbedVsCodeApi {\n getState(): unknown;\n setState(state: unknown): void;\n postMessage(message: unknown): void;\n}\n\nexport interface VsCodeWebviewStub {\n readonly kind: ColorThemeKind;\n /** What VS Code does on a color theme change: body classes first, then the extension's bridge posts. */\n setColorThemeKind(kind: ColorThemeKind): void;\n /** Changes the `colorTheme` setting, as the user does in the settings editor. */\n setColorTheme(setting: ColorThemeSetting | undefined): void;\n setReduceMotion(reduceMotion: boolean): void;\n /** Messages the bridge posted that have not reached the window yet. */\n pendingMessages(): number;\n /** What the webview posted with `acquireVsCodeApi().postMessage`. */\n readonly posted: readonly unknown[];\n /** The webview state as the last `setState` left it. */\n state(): unknown;\n}\n\n/** The page globals the stub sets. */\nexport type StubWindow = Window & {\n /** The stub of `installVsCodeWebviewStub`, for a Playwright suite to drive. */\n __modelerShellVsCodeStub?: VsCodeWebviewStub;\n acquireVsCodeApi?: () => StubbedVsCodeApi;\n};\n\n/**\n * The stub's options from a query string (`theme`, `kontrast=hoch`, `colorTheme`, `reduceMotion`),\n * the counterpart of `vsCodeStubSearch` of `@miragon/modeler-shell/testing`.\n */\nexport function stubOptionsFromSearch(\n search: string,\n): Pick<VsCodeWebviewStubOptions, \"requested\" | \"colorTheme\" | \"reduceMotion\"> {\n const params = new URLSearchParams(search);\n const theme: Theme = params.get(\"theme\") === \"dark\" ? \"dark\" : \"light\";\n const setting = params.get(\"colorTheme\");\n return {\n requested: params.get(\"kontrast\") === \"hoch\" ? { theme, kontrast: \"hoch\" } : { theme },\n colorTheme: setting === \"automatic\" || setting === \"light\" || setting === \"dark\" ? setting : undefined,\n reduceMotion: params.has(\"reduceMotion\"),\n };\n}\n\n/**\n * Stands in for VS Code around the page: its default stylesheet in `@layer vscode-default`, `<html>`\n * with the attributes `renderWebviewHtml` writes before the first paint, `<body>` with the host\n * page's theme (and reduce-motion) classes, `acquireVsCodeApi()`, and the real `connectThemeBridge`\n * running against a fake `vscode` namespace whose panel posts to this window. Call it before the\n * modeler's webview code runs; also exposed as `window.__modelerShellVsCodeStub`.\n */\nexport function installVsCodeWebviewStub(options: VsCodeWebviewStubOptions): VsCodeWebviewStub {\n const settingKey = options.settingKey ?? STUB_SETTING_KEY;\n const scope = window as StubWindow;\n let kind = colorThemeKindOf(options.requested);\n let setting = options.colorTheme;\n const themeListeners = new Set<(theme: ColorThemeLike) => unknown>();\n const configurationListeners = new Set<\n (event: { affectsConfiguration(section: string): boolean }) => unknown\n >();\n const vscode: VsCodeLike = {\n window: {\n get activeColorTheme() {\n return { kind };\n },\n onDidChangeActiveColorTheme(listener) {\n themeListeners.add(listener);\n return { dispose: () => themeListeners.delete(listener) };\n },\n },\n workspace: {\n getConfiguration: (section?: string) => ({\n get: <T>(key: string): T | undefined =>\n (section ? `${section}.${key}` : key) === settingKey ? (setting as T | undefined) : undefined,\n }),\n onDidChangeConfiguration(listener) {\n configurationListeners.add(listener);\n return { dispose: () => configurationListeners.delete(listener) };\n },\n },\n };\n const none: DisposableLike = { dispose: () => undefined };\n let posted = 0;\n let delivered = 0;\n // Registered before the modeler's listeners, so it counts a message before the shell applies it.\n window.addEventListener(\"message\", () => delivered++);\n const panel: WebviewPanelLike = {\n webview: {\n postMessage(message) {\n posted++;\n window.postMessage(message, \"*\");\n },\n },\n visible: true,\n onDidChangeViewState: () => none,\n onDidDispose: () => none,\n };\n const bridgeOptions = { themes: options.themes, settingKey };\n\n const defaults = document.createElement(\"style\");\n defaults.id = \"_defaultStyles\";\n defaults.textContent = VSCODE_DEFAULT_STYLES;\n document.head.prepend(defaults);\n\n const html = new DOMParser().parseFromString(\n renderWebviewHtml({\n cspSource: window.location.origin,\n scriptUri: \"webview.js\",\n title: document.title,\n lang: options.lang ?? \"en\",\n appearance: currentAppearance(vscode, bridgeOptions),\n }),\n \"text/html\",\n ).documentElement;\n for (const name of html.getAttributeNames()) {\n if (name === \"class\") document.documentElement.classList.add(...html.classList);\n else document.documentElement.setAttribute(name, html.getAttribute(name) ?? \"\");\n }\n\n const setBodyClasses = (next: ColorThemeKind): void => {\n document.body.classList.remove(...ALL_BODY_CLASSES);\n document.body.classList.add(...BODY_CLASSES[next]);\n };\n setBodyClasses(kind);\n document.body.classList.toggle(REDUCE_MOTION_BODY_CLASS, options.reduceMotion === true);\n connectThemeBridge(vscode, panel, bridgeOptions);\n\n let state = options.state;\n const sent: unknown[] = [];\n let acquired = false;\n scope.acquireVsCodeApi = () => {\n if (acquired) throw new Error(\"An instance of the VS Code API has already been acquired\");\n acquired = true;\n return {\n getState: () => state,\n setState(next) {\n state = next;\n },\n postMessage(message) {\n sent.push(message);\n },\n };\n };\n\n const stub: VsCodeWebviewStub = {\n get kind() {\n return kind;\n },\n setColorThemeKind(next) {\n kind = next;\n setBodyClasses(next);\n for (const listener of [...themeListeners]) listener({ kind: next });\n },\n setColorTheme(next) {\n setting = next;\n for (const listener of [...configurationListeners]) {\n listener({ affectsConfiguration: (section) => settingKey.startsWith(section) });\n }\n },\n setReduceMotion(reduceMotion) {\n document.body.classList.toggle(REDUCE_MOTION_BODY_CLASS, reduceMotion);\n },\n pendingMessages: () => posted - delivered,\n posted: sent,\n state: () => state,\n };\n scope.__modelerShellVsCodeStub = stub;\n return stub;\n}\n"],"mappings":"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","names":[]}