@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.
- package/API.md +1902 -0
- package/LICENSE +21 -0
- package/README.md +435 -2
- package/THIRD_PARTY_NOTICES.md +52 -0
- package/dist/appearance-D3FUcbu6.d.cts +53 -0
- package/dist/appearance-D3FUcbu6.d.ts +53 -0
- package/dist/chunk-5JSZ4VGA.js +551 -0
- package/dist/chunk-5JSZ4VGA.js.map +1 -0
- package/dist/chunk-6LQOFACK.js +1576 -0
- package/dist/chunk-6LQOFACK.js.map +1 -0
- package/dist/chunk-N4QXFF3A.js +23 -0
- package/dist/chunk-N4QXFF3A.js.map +1 -0
- package/dist/chunk-RJRFR6N3.js +136 -0
- package/dist/chunk-RJRFR6N3.js.map +1 -0
- package/dist/core.cjs +619 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +171 -0
- package/dist/core.d.ts +171 -0
- package/dist/core.js +91 -0
- package/dist/core.js.map +1 -0
- package/dist/diagram-js.cjs +1115 -0
- package/dist/diagram-js.cjs.map +1 -0
- package/dist/diagram-js.d.cts +163 -0
- package/dist/diagram-js.d.ts +163 -0
- package/dist/diagram-js.js +867 -0
- package/dist/diagram-js.js.map +1 -0
- package/dist/index.cjs +2175 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +20 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/keymap-CObQE6q6.d.cts +151 -0
- package/dist/keymap-DORzHnK-.d.ts +151 -0
- package/dist/protocol-DhYBakWL.d.cts +15 -0
- package/dist/protocol-IeW8bf4f.d.ts +15 -0
- package/dist/shell.css +914 -0
- package/dist/testing-vscode-stub.cjs +332 -0
- package/dist/testing-vscode-stub.cjs.map +1 -0
- package/dist/testing-vscode-stub.d.cts +65 -0
- package/dist/testing-vscode-stub.d.ts +65 -0
- package/dist/testing-vscode-stub.js +154 -0
- package/dist/testing-vscode-stub.js.map +1 -0
- package/dist/testing.cjs +2364 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +165 -0
- package/dist/testing.d.ts +165 -0
- package/dist/testing.js +2297 -0
- package/dist/testing.js.map +1 -0
- package/dist/types-B6NfkiUG.d.cts +66 -0
- package/dist/types-B6NfkiUG.d.ts +66 -0
- package/dist/types-DnZn9CPw.d.ts +284 -0
- package/dist/types-OuFlqZp0.d.cts +284 -0
- package/dist/vscode-extension.cjs +215 -0
- package/dist/vscode-extension.cjs.map +1 -0
- package/dist/vscode-extension.d.cts +103 -0
- package/dist/vscode-extension.d.ts +103 -0
- package/dist/vscode-extension.js +24 -0
- package/dist/vscode-extension.js.map +1 -0
- package/dist/vscode-webview.cjs +2198 -0
- package/dist/vscode-webview.cjs.map +1 -0
- package/dist/vscode-webview.d.cts +82 -0
- package/dist/vscode-webview.d.ts +82 -0
- package/dist/vscode-webview.js +250 -0
- package/dist/vscode-webview.js.map +1 -0
- package/package.json +145 -4
- package/src/core/appearance.ts +104 -0
- package/src/core/fit.ts +205 -0
- package/src/core/index.ts +84 -0
- package/src/core/keymap.ts +275 -0
- package/src/core/layout.ts +69 -0
- package/src/core/messages.ts +88 -0
- package/src/core/sizes.ts +85 -0
- package/src/core/types.ts +84 -0
- package/src/core/zoom.ts +74 -0
- package/src/core.ts +2 -0
- package/src/diagram-js/connect.ts +75 -0
- package/src/diagram-js/index.ts +16 -0
- package/src/diagram-js/module.ts +20 -0
- package/src/diagram-js/palette-skin.ts +267 -0
- package/src/diagram-js/palette.css +269 -0
- package/src/diagram-js/service.ts +240 -0
- package/src/diagram-js/types.ts +67 -0
- package/src/diagram-js/viewport.ts +564 -0
- package/src/diagram-js.ts +2 -0
- package/src/dom/element.ts +51 -0
- package/src/dom/hint.ts +51 -0
- package/src/dom/icons.ts +309 -0
- package/src/dom/index.ts +29 -0
- package/src/dom/inspector.ts +35 -0
- package/src/dom/keys.ts +59 -0
- package/src/dom/ledger.ts +87 -0
- package/src/dom/legend.ts +85 -0
- package/src/dom/menu.ts +393 -0
- package/src/dom/mount.ts +461 -0
- package/src/dom/problems.ts +72 -0
- package/src/dom/shell-dom.css +966 -0
- package/src/dom/status.ts +72 -0
- package/src/dom/tooltip.ts +237 -0
- package/src/dom/types.ts +277 -0
- package/src/dom/zoom-panel.ts +154 -0
- package/src/index.ts +3 -0
- package/src/shell.css +6 -0
- package/src/testing/cases.ts +1012 -0
- package/src/testing/checks.ts +832 -0
- package/src/testing/facts.ts +587 -0
- package/src/testing/geometry.ts +472 -0
- package/src/testing/harness.ts +138 -0
- package/src/testing/index.ts +15 -0
- package/src/testing/page-tools.ts +434 -0
- package/src/testing/page.ts +17 -0
- package/src/testing/vscode-stub.ts +237 -0
- package/src/testing-vscode-stub.ts +2 -0
- package/src/testing.ts +2 -0
- package/src/vscode/extension/html.ts +107 -0
- package/src/vscode/extension/index.ts +8 -0
- package/src/vscode/extension/reveal.ts +9 -0
- package/src/vscode/extension/theme-bridge.ts +85 -0
- package/src/vscode/extension/types.ts +36 -0
- package/src/vscode/protocol.ts +31 -0
- package/src/vscode/webview/appearance.ts +141 -0
- package/src/vscode/webview/index.ts +8 -0
- package/src/vscode/webview/mount.ts +76 -0
- package/src/vscode/webview/state.ts +116 -0
- package/src/vscode-extension.ts +2 -0
- 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
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";
|