@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
@@ -0,0 +1,136 @@
1
+ import {
2
+ appearanceMessage
3
+ } from "./chunk-N4QXFF3A.js";
4
+ import {
5
+ appearanceAttributes,
6
+ requestedAppearance,
7
+ resolveAppearance
8
+ } from "./chunk-OADW3GPA.js";
9
+
10
+ // src/vscode/extension/html.ts
11
+ var NONCE_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
12
+ var NONCE_LENGTH = 32;
13
+ var UNBIASED_BYTE_LIMIT = 256 - 256 % NONCE_ALPHABET.length;
14
+ var CSP_NONCE = /^[A-Za-z0-9+/_-]+={0,2}$/;
15
+ var DEFAULT_BODY = '<div id="app"></div>';
16
+ function createNonce() {
17
+ let nonce = "";
18
+ while (nonce.length < NONCE_LENGTH) {
19
+ for (const byte of crypto.getRandomValues(new Uint8Array(NONCE_LENGTH))) {
20
+ if (byte < UNBIASED_BYTE_LIMIT && nonce.length < NONCE_LENGTH) {
21
+ nonce += NONCE_ALPHABET.charAt(byte % NONCE_ALPHABET.length);
22
+ }
23
+ }
24
+ }
25
+ return nonce;
26
+ }
27
+ function escapeHtml(value) {
28
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
29
+ }
30
+ function attribute(name, value) {
31
+ return `${name}="${escapeHtml(value)}"`;
32
+ }
33
+ function contentSecurityPolicy(cspSource, nonce, inlineStyles) {
34
+ return [
35
+ "default-src 'none'",
36
+ `img-src ${cspSource} data: blob:`,
37
+ inlineStyles ? `style-src ${cspSource} 'unsafe-inline'` : `style-src ${cspSource}`,
38
+ `font-src ${cspSource} data:`,
39
+ `script-src 'nonce-${nonce}'`
40
+ ].join("; ");
41
+ }
42
+ function renderWebviewHtml(options) {
43
+ const nonce = options.nonce ?? createNonce();
44
+ if (!CSP_NONCE.test(nonce)) {
45
+ throw new Error(`@miragon/modeler-shell: renderWebviewHtml got an invalid nonce "${nonce}"`);
46
+ }
47
+ const appearance = appearanceAttributes(options.appearance);
48
+ const kontrast = appearance["data-cd-kontrast"];
49
+ const htmlAttributes = [
50
+ attribute("lang", options.lang),
51
+ attribute("class", "cd-shell-document"),
52
+ attribute("data-cd-theme", appearance["data-cd-theme"]),
53
+ ...kontrast ? [attribute("data-cd-kontrast", kontrast)] : []
54
+ ].join(" ");
55
+ const stylesheets = (options.styleUris ?? []).map(
56
+ (uri) => `
57
+ <link ${attribute("rel", "stylesheet")} ${attribute("href", uri)} />`
58
+ );
59
+ return `<!doctype html>
60
+ <html ${htmlAttributes}>
61
+ <head>
62
+ <meta charset="UTF-8" />
63
+ <meta http-equiv="Content-Security-Policy" ${attribute("content", contentSecurityPolicy(options.cspSource, nonce, options.inlineStyles !== false))} />
64
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />${stylesheets.join("")}
65
+ <title>${escapeHtml(options.title)}</title>
66
+ </head>
67
+ <body>
68
+ ${options.body ?? DEFAULT_BODY}
69
+ <script ${attribute("nonce", nonce)} ${attribute("src", options.scriptUri)}></script>
70
+ </body>
71
+ </html>
72
+ `;
73
+ }
74
+
75
+ // src/vscode/extension/theme-bridge.ts
76
+ function isColorThemeSetting(value) {
77
+ return value === "automatic" || value === "light" || value === "dark";
78
+ }
79
+ function readColorThemeSetting(vscode, settingKey) {
80
+ const separator = settingKey.lastIndexOf(".");
81
+ const value = separator < 0 ? vscode.workspace.getConfiguration().get(settingKey) : vscode.workspace.getConfiguration(settingKey.slice(0, separator)).get(settingKey.slice(separator + 1));
82
+ return isColorThemeSetting(value) ? value : void 0;
83
+ }
84
+ function currentAppearance(vscode, options) {
85
+ const setting = options.settingKey ? readColorThemeSetting(vscode, options.settingKey) : void 0;
86
+ return resolveAppearance(requestedAppearance(vscode.window.activeColorTheme.kind, setting), options.themes);
87
+ }
88
+ function connectThemeBridge(vscode, panel, options) {
89
+ if (options.themes.length === 0) {
90
+ throw new Error("@miragon/modeler-shell: connectThemeBridge needs at least one theme");
91
+ }
92
+ const { settingKey } = options;
93
+ const post = () => {
94
+ void panel.webview.postMessage(appearanceMessage(currentAppearance(vscode, options)));
95
+ };
96
+ let wasVisible = panel.visible;
97
+ const subscriptions = [
98
+ vscode.window.onDidChangeActiveColorTheme(post),
99
+ panel.onDidChangeViewState(({ webviewPanel }) => {
100
+ const becameVisible = webviewPanel.visible && !wasVisible;
101
+ wasVisible = webviewPanel.visible;
102
+ if (becameVisible) post();
103
+ })
104
+ ];
105
+ if (settingKey) {
106
+ subscriptions.push(
107
+ vscode.workspace.onDidChangeConfiguration((event) => {
108
+ if (event.affectsConfiguration(settingKey)) post();
109
+ })
110
+ );
111
+ }
112
+ let disposed = false;
113
+ const dispose = () => {
114
+ if (disposed) return;
115
+ disposed = true;
116
+ for (const subscription of subscriptions.splice(0)) subscription.dispose();
117
+ };
118
+ subscriptions.push(panel.onDidDispose(dispose));
119
+ return { dispose };
120
+ }
121
+
122
+ // src/vscode/extension/reveal.ts
123
+ function revealFileLabel(platform) {
124
+ if (platform === "darwin") return "Reveal in Finder";
125
+ if (platform === "win32") return "Reveal in File Explorer";
126
+ return "Open Containing Folder";
127
+ }
128
+
129
+ export {
130
+ createNonce,
131
+ renderWebviewHtml,
132
+ currentAppearance,
133
+ connectThemeBridge,
134
+ revealFileLabel
135
+ };
136
+ //# sourceMappingURL=chunk-KYDG5DMX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vscode/extension/html.ts","../src/vscode/extension/theme-bridge.ts","../src/vscode/extension/reveal.ts"],"sourcesContent":["import { appearanceAttributes, type Appearance } from \"../../core/index.js\";\n\nexport interface WebviewHtmlOptions {\n /** `webview.cspSource` */\n cspSource: string;\n /** The bundle, `webview.asWebviewUri(…).toString()`. */\n scriptUri: string;\n /** Stylesheets in load order (token CSS first, see API.md). */\n styleUris?: readonly string[] | undefined;\n /** `<title>` */\n title: string;\n /** The tool's UI language for `<html lang>`; English modelers pass `\"en\"`. */\n lang: string;\n /** Resolved appearance (`currentAppearance`), written before the first paint. */\n appearance: Appearance;\n /** Markup inside `<body>` before the script; default `<div id=\"app\"></div>`. */\n body?: string | undefined;\n /** Script nonce; default `createNonce()`. */\n nonce?: string | undefined;\n /**\n * Allow inline styles (`style-src … 'unsafe-inline'`), default `true`: renderers write `style`\n * attributes into markup (palette entries, SVG strings). The shell and diagram-js themselves\n * only style through the CSSOM and run without it; pass `false` once the renderer does too.\n */\n inlineStyles?: boolean | undefined;\n}\n\nconst NONCE_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst NONCE_LENGTH = 32;\n/** Bytes at or above this limit are rejected, so every character is equally likely. */\nconst UNBIASED_BYTE_LIMIT = 256 - (256 % NONCE_ALPHABET.length);\n/** The `base64-value` of a CSP `nonce-source`. */\nconst CSP_NONCE = /^[A-Za-z0-9+/_-]+={0,2}$/;\n\nconst DEFAULT_BODY = '<div id=\"app\"></div>';\n\n/** 32 characters `[A-Za-z0-9]` from `crypto.getRandomValues`. */\nexport function createNonce(): string {\n let nonce = \"\";\n while (nonce.length < NONCE_LENGTH) {\n for (const byte of crypto.getRandomValues(new Uint8Array(NONCE_LENGTH))) {\n if (byte < UNBIASED_BYTE_LIMIT && nonce.length < NONCE_LENGTH) {\n nonce += NONCE_ALPHABET.charAt(byte % NONCE_ALPHABET.length);\n }\n }\n }\n return nonce;\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\n}\n\nfunction attribute(name: string, value: string): string {\n return `${name}=\"${escapeHtml(value)}\"`;\n}\n\nfunction contentSecurityPolicy(cspSource: string, nonce: string, inlineStyles: boolean): string {\n return [\n \"default-src 'none'\",\n `img-src ${cspSource} data: blob:`,\n inlineStyles ? `style-src ${cspSource} 'unsafe-inline'` : `style-src ${cspSource}`,\n `font-src ${cspSource} data:`,\n `script-src 'nonce-${nonce}'`,\n ].join(\"; \");\n}\n\n/**\n * The webview document: `<html lang class=\"cd-shell-document\" data-cd-theme [data-cd-kontrast]>`,\n * the CSP (`default-src 'none'`, `img-src <cspSource> data: blob:`, `style-src <cspSource>` plus\n * `'unsafe-inline'` unless `inlineStyles: false`, `font-src <cspSource> data:`,\n * `script-src 'nonce-…'`), the stylesheets, `body` and the nonce'd script. Attribute values and the\n * title are escaped; `body` is markup and is not. Throws for a `nonce` that is not a CSP base64\n * value.\n */\nexport function renderWebviewHtml(options: WebviewHtmlOptions): string {\n const nonce = options.nonce ?? createNonce();\n if (!CSP_NONCE.test(nonce)) {\n throw new Error(`@miragon/modeler-shell: renderWebviewHtml got an invalid nonce \"${nonce}\"`);\n }\n const appearance = appearanceAttributes(options.appearance);\n const kontrast = appearance[\"data-cd-kontrast\"];\n const htmlAttributes = [\n attribute(\"lang\", options.lang),\n attribute(\"class\", \"cd-shell-document\"),\n attribute(\"data-cd-theme\", appearance[\"data-cd-theme\"]),\n ...(kontrast ? [attribute(\"data-cd-kontrast\", kontrast)] : []),\n ].join(\" \");\n const stylesheets = (options.styleUris ?? []).map(\n (uri) => `\\n <link ${attribute(\"rel\", \"stylesheet\")} ${attribute(\"href\", uri)} />`,\n );\n\n return `<!doctype html>\n<html ${htmlAttributes}>\n <head>\n <meta charset=\"UTF-8\" />\n <meta http-equiv=\"Content-Security-Policy\" ${attribute(\"content\", contentSecurityPolicy(options.cspSource, nonce, options.inlineStyles !== false))} />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />${stylesheets.join(\"\")}\n <title>${escapeHtml(options.title)}</title>\n </head>\n <body>\n ${options.body ?? DEFAULT_BODY}\n <script ${attribute(\"nonce\", nonce)} ${attribute(\"src\", options.scriptUri)}></script>\n </body>\n</html>\n`;\n}\n","import {\n requestedAppearance,\n resolveAppearance,\n type Appearance,\n type ColorThemeSetting,\n type Theme,\n} from \"../../core/index.js\";\nimport { appearanceMessage } from \"../protocol.js\";\nimport type { DisposableLike, VsCodeLike, WebviewPanelLike } from \"./types.js\";\n\nexport interface ThemeBridgeOptions {\n /** The modes the modeler can show, a static value of the modeler package (`[\"light\"]` today). */\n themes: readonly Theme[];\n /** Full key of `miragon.<modeler>.colorTheme`; omit until the modeler can show dark. */\n settingKey?: string | undefined;\n}\n\nfunction isColorThemeSetting(value: unknown): value is ColorThemeSetting {\n return value === \"automatic\" || value === \"light\" || value === \"dark\";\n}\n\nfunction readColorThemeSetting(vscode: VsCodeLike, settingKey: string): ColorThemeSetting | undefined {\n const separator = settingKey.lastIndexOf(\".\");\n const value =\n separator < 0\n ? vscode.workspace.getConfiguration().get<unknown>(settingKey)\n : vscode.workspace\n .getConfiguration(settingKey.slice(0, separator))\n .get<unknown>(settingKey.slice(separator + 1));\n return isColorThemeSetting(value) ? value : undefined;\n}\n\n/**\n * The resolved appearance right now: color theme kind (and setting) through `resolveAppearance`.\n * A setting value outside `automatic | light | dark` counts as `automatic`.\n */\nexport function currentAppearance(vscode: VsCodeLike, options: ThemeBridgeOptions): Appearance {\n const setting = options.settingKey ? readColorThemeSetting(vscode, options.settingKey) : undefined;\n return resolveAppearance(requestedAppearance(vscode.window.activeColorTheme.kind, setting), options.themes);\n}\n\n/**\n * Posts an `AppearanceMessage` to the panel's webview on `onDidChangeActiveColorTheme`, on a change\n * of `settingKey` and whenever the panel becomes visible again (hidden retained webviews may miss\n * messages). Disposes itself with the panel. Throws when `themes` is empty.\n */\nexport function connectThemeBridge(\n vscode: VsCodeLike,\n panel: WebviewPanelLike,\n options: ThemeBridgeOptions,\n): DisposableLike {\n if (options.themes.length === 0) {\n throw new Error(\"@miragon/modeler-shell: connectThemeBridge needs at least one theme\");\n }\n const { settingKey } = options;\n const post = (): void => {\n void panel.webview.postMessage(appearanceMessage(currentAppearance(vscode, options)));\n };\n\n let wasVisible = panel.visible;\n const subscriptions: DisposableLike[] = [\n vscode.window.onDidChangeActiveColorTheme(post),\n panel.onDidChangeViewState(({ webviewPanel }) => {\n const becameVisible = webviewPanel.visible && !wasVisible;\n wasVisible = webviewPanel.visible;\n if (becameVisible) post();\n }),\n ];\n if (settingKey) {\n subscriptions.push(\n vscode.workspace.onDidChangeConfiguration((event) => {\n if (event.affectsConfiguration(settingKey)) post();\n }),\n );\n }\n\n let disposed = false;\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n for (const subscription of subscriptions.splice(0)) subscription.dispose();\n };\n subscriptions.push(panel.onDidDispose(dispose));\n return { dispose };\n}\n","/**\n * The label VS Code itself uses for revealing a file, for the action on the export notification:\n * `darwin` \"Reveal in Finder\", `win32` \"Reveal in File Explorer\", otherwise \"Open Containing Folder\".\n */\nexport function revealFileLabel(platform: string): string {\n if (platform === \"darwin\") return \"Reveal in Finder\";\n if (platform === \"win32\") return \"Reveal in File Explorer\";\n return \"Open Containing Folder\";\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,23 @@
1
+ // src/vscode/protocol.ts
2
+ var APPEARANCE_MESSAGE_TYPE = "modelerShell.appearance";
3
+ function appearanceMessage(appearance) {
4
+ return {
5
+ type: APPEARANCE_MESSAGE_TYPE,
6
+ appearance: appearance.kontrast ? { theme: appearance.theme, kontrast: appearance.kontrast } : { theme: appearance.theme }
7
+ };
8
+ }
9
+ function isRecord(value) {
10
+ return typeof value === "object" && value !== null && !Array.isArray(value);
11
+ }
12
+ function isAppearanceMessage(value) {
13
+ if (!isRecord(value) || value.type !== APPEARANCE_MESSAGE_TYPE || !isRecord(value.appearance)) return false;
14
+ const { theme, kontrast } = value.appearance;
15
+ return (theme === "light" || theme === "dark") && (kontrast === void 0 || kontrast === "hoch");
16
+ }
17
+
18
+ export {
19
+ APPEARANCE_MESSAGE_TYPE,
20
+ appearanceMessage,
21
+ isAppearanceMessage
22
+ };
23
+ //# sourceMappingURL=chunk-N4QXFF3A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vscode/protocol.ts"],"sourcesContent":["import type { Appearance } from \"../core/index.js\";\n\n/** The one message the theme bridge posts to the webview. */\nexport const APPEARANCE_MESSAGE_TYPE = \"modelerShell.appearance\";\n\nexport interface AppearanceMessage {\n type: typeof APPEARANCE_MESSAGE_TYPE;\n /** Already resolved against the modeler's themes. */\n appearance: Appearance;\n}\n\n/** A plain, JSON-safe message (no `kontrast: undefined` key). */\nexport function appearanceMessage(appearance: Appearance): AppearanceMessage {\n return {\n type: APPEARANCE_MESSAGE_TYPE,\n appearance: appearance.kontrast\n ? { theme: appearance.theme, kontrast: appearance.kontrast }\n : { theme: appearance.theme },\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Type guard for `MessageEvent.data` in the webview. */\nexport function isAppearanceMessage(value: unknown): value is AppearanceMessage {\n if (!isRecord(value) || value.type !== APPEARANCE_MESSAGE_TYPE || !isRecord(value.appearance)) return false;\n const { theme, kontrast } = value.appearance;\n return (theme === \"light\" || theme === \"dark\") && (kontrast === undefined || kontrast === \"hoch\");\n}\n"],"mappings":";AAGO,IAAM,0BAA0B;AAShC,SAAS,kBAAkB,YAA2C;AAC3E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY,WAAW,WACnB,EAAE,OAAO,WAAW,OAAO,UAAU,WAAW,SAAS,IACzD,EAAE,OAAO,WAAW,MAAM;AAAA,EAChC;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAGO,SAAS,oBAAoB,OAA4C;AAC9E,MAAI,CAAC,SAAS,KAAK,KAAK,MAAM,SAAS,2BAA2B,CAAC,SAAS,MAAM,UAAU,EAAG,QAAO;AACtG,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM;AAClC,UAAQ,UAAU,WAAW,UAAU,YAAY,aAAa,UAAa,aAAa;AAC5F;","names":[]}