@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
+ ariaKeyShortcuts,
3
+ canZoomIn,
4
+ canZoomOut,
5
+ formatPercent,
6
+ shortcutLabel,
7
+ zoomReadout,
8
+ type ChromeKey,
9
+ type Platform,
10
+ type ShellMessages,
11
+ type ZoomTarget,
12
+ } from "../core/index.js";
13
+ import { createElement, toggleAttribute } from "./element.js";
14
+ import { iconElement, type ShellIconName } from "./icons.js";
15
+ import type { TooltipController } from "./tooltip.js";
16
+
17
+ export interface ZoomPanelContext {
18
+ ownerDocument: Document;
19
+ messages: ShellMessages;
20
+ lang: string;
21
+ platform: Platform;
22
+ tooltip: TooltipController;
23
+ }
24
+
25
+ export interface ZoomPanel {
26
+ readonly element: HTMLElement;
27
+ setTarget(target: ZoomTarget | null): void;
28
+ /** Runs a chrome key on the bound target; zoom out never zooms in (guide §5.8). */
29
+ run(key: ChromeKey): void;
30
+ destroy(): void;
31
+ }
32
+
33
+ export function createZoomPanel(context: ZoomPanelContext): ZoomPanel {
34
+ const { ownerDocument, messages, lang, platform, tooltip } = context;
35
+ let target: ZoomTarget | null = null;
36
+ let unsubscribe: (() => void) | undefined;
37
+ let frame: number | undefined;
38
+ const detachers: (() => void)[] = [];
39
+
40
+ function button(
41
+ zoom: "out" | "actual" | "in" | "fit",
42
+ key: ChromeKey,
43
+ tooltipLabel: string,
44
+ options: { label?: string; icon?: ShellIconName; className?: string },
45
+ ): HTMLButtonElement {
46
+ const element = createElement(ownerDocument, "button", {
47
+ type: "button",
48
+ class: options.className ?? "cd-shell-target",
49
+ "data-zoom": zoom,
50
+ "aria-label": options.label,
51
+ "aria-keyshortcuts": ariaKeyShortcuts(key, platform),
52
+ });
53
+ if (options.icon) element.append(iconElement(options.icon));
54
+ element.addEventListener("click", () => run(key));
55
+ detachers.push(
56
+ tooltip.attach(element, {
57
+ label: tooltipLabel,
58
+ shortcut: shortcutLabel(key, platform, messages.keyNames),
59
+ }),
60
+ );
61
+ return element;
62
+ }
63
+
64
+ const zoomOut = button("out", "zoomOut", messages.zoomOut, { label: messages.zoomOut, icon: "minus" });
65
+ const readout = button("actual", "zoomToActual", messages.zoomToActual(formatPercent(1, lang)), {
66
+ className: "cd-shell-target cd-shell-zoom-readout",
67
+ });
68
+ const zoomIn = button("in", "zoomIn", messages.zoomIn, { label: messages.zoomIn, icon: "plus" });
69
+ const fit = button("fit", "fit", messages.fit, { label: messages.fit, icon: "maximize" });
70
+ const separator = createElement(ownerDocument, "span", {
71
+ class: "cd-shell-zoom-separator",
72
+ "aria-hidden": "true",
73
+ });
74
+
75
+ const element = createElement(
76
+ ownerDocument,
77
+ "div",
78
+ {
79
+ class: "cd-shell-zoom cd-shell-island",
80
+ "data-chrome": "zoom",
81
+ role: "group",
82
+ "aria-label": messages.zoom,
83
+ },
84
+ zoomOut,
85
+ readout,
86
+ zoomIn,
87
+ separator,
88
+ fit,
89
+ );
90
+
91
+ function render(): void {
92
+ frame = undefined;
93
+ const zoom = target?.zoom() ?? 1;
94
+ const state = zoomReadout(zoom, lang, messages);
95
+ if (readout.textContent !== state.text) readout.textContent = state.text;
96
+ readout.setAttribute("aria-label", state.ariaLabel);
97
+ // aria-disabled, not disabled: a button pressed up to the limit keeps the focus (guide §5.8).
98
+ toggleAttribute(zoomOut, "aria-disabled", (!target || !state.canZoomOut) && "true");
99
+ toggleAttribute(zoomIn, "aria-disabled", (!target || !state.canZoomIn) && "true");
100
+ toggleAttribute(fit, "aria-disabled", (!target || !target.canFit()) && "true");
101
+ // The readout is never disabled (guide §5.8); without a target its click does nothing.
102
+ }
103
+
104
+ function schedule(): void {
105
+ if (frame === undefined) frame = requestAnimationFrame(render);
106
+ }
107
+
108
+ function cancelFrame(): void {
109
+ if (frame !== undefined) cancelAnimationFrame(frame);
110
+ frame = undefined;
111
+ }
112
+
113
+ function run(key: ChromeKey): void {
114
+ if (!target) return;
115
+ const zoom = target.zoom();
116
+ switch (key) {
117
+ case "zoomIn":
118
+ if (canZoomIn(zoom)) target.stepZoom(1);
119
+ break;
120
+ case "zoomOut":
121
+ if (canZoomOut(zoom)) target.stepZoom(-1);
122
+ break;
123
+ case "zoomToActual":
124
+ if (zoom !== 1) target.zoomToActual();
125
+ break;
126
+ case "fit":
127
+ if (target.canFit()) target.fit();
128
+ break;
129
+ }
130
+ }
131
+
132
+ render();
133
+
134
+ return {
135
+ element,
136
+ run,
137
+ setTarget(next) {
138
+ unsubscribe?.();
139
+ unsubscribe = undefined;
140
+ cancelFrame();
141
+ target = next;
142
+ if (next) unsubscribe = next.onChange(schedule);
143
+ render();
144
+ },
145
+ destroy() {
146
+ unsubscribe?.();
147
+ unsubscribe = undefined;
148
+ cancelFrame();
149
+ target = null;
150
+ for (const detach of detachers) detach();
151
+ element.remove();
152
+ },
153
+ };
154
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ // "@miragon/modeler-shell": the DOM chrome plus everything DOM-free from "./core".
2
+ export * from "./core/index.js";
3
+ export * from "./dom/index.js";
package/src/shell.css ADDED
@@ -0,0 +1,6 @@
1
+ /*
2
+ * @miragon/modeler-shell/shell.css. Load after the vendored cd-tokens.generated.css and after
3
+ * diagram-js.css (and the renderer's CSS), so the palette skin wins regardless of its specificity.
4
+ */
5
+ @import "./dom/shell-dom.css";
6
+ @import "./diagram-js/palette.css";