@oh-just-another/diagram 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/CHANGELOG.md +45 -0
- package/README.md +68 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/bindings.d.ts +73 -0
- package/dist/bindings.d.ts.map +1 -0
- package/dist/bindings.js +77 -0
- package/dist/bindings.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/oja-diagram-element.d.ts +42 -0
- package/dist/oja-diagram-element.d.ts.map +1 -0
- package/dist/oja-diagram-element.js +202 -0
- package/dist/oja-diagram-element.js.map +1 -0
- package/dist/oja-diagram.global.js +1846 -0
- package/dist/oja-diagram.global.js.map +7 -0
- package/dist/render-worker.js +5 -0
- package/dist/render-worker.js.map +7 -0
- package/dist/styles.generated.d.ts +2 -0
- package/dist/styles.generated.d.ts.map +1 -0
- package/dist/styles.generated.js +4 -0
- package/dist/styles.generated.js.map +1 -0
- package/fonts/LICENSE +25 -0
- package/fonts/PTSerif-Bold.woff2 +0 -0
- package/fonts/PTSerif-BoldItalic.woff2 +0 -0
- package/fonts/PTSerif-Italic.woff2 +0 -0
- package/fonts/PTSerif-Regular.woff2 +0 -0
- package/fonts/Roboto-Bold.woff2 +0 -0
- package/fonts/Roboto-BoldItalic.woff2 +0 -0
- package/fonts/Roboto-Italic.woff2 +0 -0
- package/fonts/Roboto-Regular.woff2 +0 -0
- package/fonts/RobotoMono-Bold.woff2 +0 -0
- package/fonts/RobotoMono-BoldItalic.woff2 +0 -0
- package/fonts/RobotoMono-Italic.woff2 +0 -0
- package/fonts/RobotoMono-Regular.woff2 +0 -0
- package/package.json +72 -0
- package/wasm/rasterizer.wasm +0 -0
- package/wasm/text_shaper.wasm +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type EditorAPI, type ElementId, type Mode } from "@oh-just-another/editor";
|
|
2
|
+
import type { Scene } from "@oh-just-another/scene";
|
|
3
|
+
type ThemeSetting = "dark" | "light" | "system";
|
|
4
|
+
/**
|
|
5
|
+
* `<oja-diagram>` — a framework-neutral custom element wrapping the React
|
|
6
|
+
* editor. It mounts the editor into its own shadow root (styles isolated
|
|
7
|
+
* via `adoptedStyleSheets`, floating UI portaled into the same root), and
|
|
8
|
+
* exposes a plain DOM surface: attributes / properties for configuration,
|
|
9
|
+
* methods for imperative control, and `CustomEvent`s for output.
|
|
10
|
+
*
|
|
11
|
+
* Attributes (string): `theme` (`dark` | `light` | `system`), `renderer`
|
|
12
|
+
* (`canvas2d` | `webgl2` | `offscreen`), `grid` / `snap` (boolean — present
|
|
13
|
+
* = on). Properties: `scene` (a `Scene` object). Events: `ready`,
|
|
14
|
+
* `scenechange`, `selectionchange`, `themechange`. Methods: `undo`, `redo`,
|
|
15
|
+
* `zoomToFit`, `getScene`, `loadScene`, `getMode`, `setMode`,
|
|
16
|
+
* `getSelection`, `setSelection`, plus the `editor` escape hatch.
|
|
17
|
+
*/
|
|
18
|
+
export declare class OjaDiagramElement extends HTMLElement {
|
|
19
|
+
#private;
|
|
20
|
+
static get observedAttributes(): readonly string[];
|
|
21
|
+
connectedCallback(): void;
|
|
22
|
+
disconnectedCallback(): void;
|
|
23
|
+
attributeChangedCallback(name: string): void;
|
|
24
|
+
/** The current scene. Setting it loads the scene once the editor is ready. */
|
|
25
|
+
get scene(): Scene | undefined;
|
|
26
|
+
set scene(scene: Scene | undefined);
|
|
27
|
+
get theme(): ThemeSetting | null;
|
|
28
|
+
set theme(value: ThemeSetting | null);
|
|
29
|
+
/** The live editor engine, or `null` until `ready` fires. */
|
|
30
|
+
get editor(): EditorAPI["editor"];
|
|
31
|
+
getScene(): Scene | undefined;
|
|
32
|
+
loadScene(scene: Scene): void;
|
|
33
|
+
undo(): void;
|
|
34
|
+
redo(): void;
|
|
35
|
+
zoomToFit(): void;
|
|
36
|
+
getMode(): Mode | null;
|
|
37
|
+
setMode(mode: Mode): void;
|
|
38
|
+
getSelection(): ReadonlySet<ElementId>;
|
|
39
|
+
setSelection(ids: Iterable<ElementId>): void;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=oja-diagram-element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oja-diagram-element.d.ts","sourceRoot":"","sources":["../src/oja-diagram-element.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,SAAS,EAEd,KAAK,SAAS,EACd,KAAK,IAAI,EACV,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAGpD,KAAK,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAoBhD;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAkB,SAAQ,WAAW;;IAChD,MAAM,KAAK,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEjD;IAWD,iBAAiB,IAAI,IAAI;IAyBzB,oBAAoB,IAAI,IAAI;IAU5B,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAoB5C,8EAA8E;IAC9E,IAAI,KAAK,IAAI,KAAK,GAAG,SAAS,CAE7B;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,EAGjC;IAED,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,CAG/B;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,EAGnC;IAED,6DAA6D;IAC7D,IAAI,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,CAEhC;IAID,QAAQ,IAAI,KAAK,GAAG,SAAS;IAG7B,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAI7B,IAAI,IAAI,IAAI;IAGZ,IAAI,IAAI,IAAI;IAGZ,SAAS,IAAI,IAAI;IAGjB,OAAO,IAAI,IAAI,GAAG,IAAI;IAGtB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAGzB,YAAY,IAAI,WAAW,CAAC,SAAS,CAAC;IAGtC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI;CA8D7C"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createRoot } from "react-dom/client";
|
|
3
|
+
import { Editor as EditorComponent, bindEditorHotkeys, } from "@oh-just-another/editor";
|
|
4
|
+
import { PortalContainerProvider } from "@oh-just-another/react-ui";
|
|
5
|
+
import { REACT_UI_STYLES } from "./styles.generated.js";
|
|
6
|
+
const THEMES = new Set(["dark", "light", "system"]);
|
|
7
|
+
const RENDERERS = new Set(["canvas2d", "webgl2", "offscreen"]);
|
|
8
|
+
/** Lazily built singleton stylesheet shared by every element instance. */
|
|
9
|
+
let sharedSheet = null;
|
|
10
|
+
const styleSheet = () => {
|
|
11
|
+
if (!sharedSheet) {
|
|
12
|
+
sharedSheet = new CSSStyleSheet();
|
|
13
|
+
// The stylesheet declares its theme variables on `:root`, which selects
|
|
14
|
+
// the document root and so matches nothing inside a shadow tree. Rewrite
|
|
15
|
+
// it to `:host` so the variables land on the shadow host and inherit
|
|
16
|
+
// down to every component (including portaled menus / tooltips).
|
|
17
|
+
sharedSheet.replaceSync(REACT_UI_STYLES.replace(/:root\b/g, ":host"));
|
|
18
|
+
}
|
|
19
|
+
return sharedSheet;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* `<oja-diagram>` — a framework-neutral custom element wrapping the React
|
|
23
|
+
* editor. It mounts the editor into its own shadow root (styles isolated
|
|
24
|
+
* via `adoptedStyleSheets`, floating UI portaled into the same root), and
|
|
25
|
+
* exposes a plain DOM surface: attributes / properties for configuration,
|
|
26
|
+
* methods for imperative control, and `CustomEvent`s for output.
|
|
27
|
+
*
|
|
28
|
+
* Attributes (string): `theme` (`dark` | `light` | `system`), `renderer`
|
|
29
|
+
* (`canvas2d` | `webgl2` | `offscreen`), `grid` / `snap` (boolean — present
|
|
30
|
+
* = on). Properties: `scene` (a `Scene` object). Events: `ready`,
|
|
31
|
+
* `scenechange`, `selectionchange`, `themechange`. Methods: `undo`, `redo`,
|
|
32
|
+
* `zoomToFit`, `getScene`, `loadScene`, `getMode`, `setMode`,
|
|
33
|
+
* `getSelection`, `setSelection`, plus the `editor` escape hatch.
|
|
34
|
+
*/
|
|
35
|
+
export class OjaDiagramElement extends HTMLElement {
|
|
36
|
+
static get observedAttributes() {
|
|
37
|
+
return ["theme", "renderer", "grid", "snap"];
|
|
38
|
+
}
|
|
39
|
+
#root = null;
|
|
40
|
+
#portalLayer = null;
|
|
41
|
+
/** Wraps the editor + portals; carries `data-theme` so both pick up the theme. */
|
|
42
|
+
#themeHost = null;
|
|
43
|
+
#api = null;
|
|
44
|
+
#unbindHotkeys = null;
|
|
45
|
+
/** Initial scene captured before mount; live updates go through `loadScene`. */
|
|
46
|
+
#scene = undefined;
|
|
47
|
+
connectedCallback() {
|
|
48
|
+
if (this.#root)
|
|
49
|
+
return;
|
|
50
|
+
const shadow = this.shadowRoot ?? this.attachShadow({ mode: "open" });
|
|
51
|
+
shadow.adoptedStyleSheets = [styleSheet()];
|
|
52
|
+
// The host element must establish a sizing context; the editor fills it.
|
|
53
|
+
if (!this.style.display)
|
|
54
|
+
this.style.display = "block";
|
|
55
|
+
// One container holds both the editor and the portal layer so a forced
|
|
56
|
+
// `data-theme` applies to menus / tooltips (portaled) and chrome alike.
|
|
57
|
+
const container = document.createElement("div");
|
|
58
|
+
container.style.cssText = "width:100%;height:100%;position:relative";
|
|
59
|
+
const mount = document.createElement("div");
|
|
60
|
+
mount.style.cssText = "width:100%;height:100%";
|
|
61
|
+
const portals = document.createElement("div");
|
|
62
|
+
this.#portalLayer = portals;
|
|
63
|
+
container.append(mount, portals);
|
|
64
|
+
shadow.append(container);
|
|
65
|
+
this.#themeHost = container;
|
|
66
|
+
this.#applyTheme();
|
|
67
|
+
this.#root = createRoot(mount);
|
|
68
|
+
this.#render();
|
|
69
|
+
}
|
|
70
|
+
disconnectedCallback() {
|
|
71
|
+
this.#unbindHotkeys?.();
|
|
72
|
+
this.#unbindHotkeys = null;
|
|
73
|
+
this.#root?.unmount();
|
|
74
|
+
this.#root = null;
|
|
75
|
+
this.#api = null;
|
|
76
|
+
this.#portalLayer = null;
|
|
77
|
+
this.#themeHost = null;
|
|
78
|
+
}
|
|
79
|
+
attributeChangedCallback(name) {
|
|
80
|
+
if (name === "theme")
|
|
81
|
+
this.#applyTheme();
|
|
82
|
+
if (this.#root)
|
|
83
|
+
this.#render();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Mirror the `theme` attribute onto the container as `data-theme` so the
|
|
87
|
+
* `[data-theme]` overrides in the stylesheet take effect. `system` (or
|
|
88
|
+
* absent) leaves it off, falling back to `:host` + `prefers-color-scheme`.
|
|
89
|
+
*/
|
|
90
|
+
#applyTheme() {
|
|
91
|
+
const host = this.#themeHost;
|
|
92
|
+
if (!host)
|
|
93
|
+
return;
|
|
94
|
+
const theme = this.getAttribute("theme");
|
|
95
|
+
if (theme === "dark" || theme === "light")
|
|
96
|
+
host.dataset.theme = theme;
|
|
97
|
+
else
|
|
98
|
+
delete host.dataset.theme;
|
|
99
|
+
}
|
|
100
|
+
// --- Properties ---
|
|
101
|
+
/** The current scene. Setting it loads the scene once the editor is ready. */
|
|
102
|
+
get scene() {
|
|
103
|
+
return this.#api ? this.#api.getScene() : this.#scene;
|
|
104
|
+
}
|
|
105
|
+
set scene(scene) {
|
|
106
|
+
this.#scene = scene;
|
|
107
|
+
if (this.#api && scene)
|
|
108
|
+
this.#api.loadScene(scene);
|
|
109
|
+
}
|
|
110
|
+
get theme() {
|
|
111
|
+
const v = this.getAttribute("theme");
|
|
112
|
+
return v && THEMES.has(v) ? v : null;
|
|
113
|
+
}
|
|
114
|
+
set theme(value) {
|
|
115
|
+
if (value)
|
|
116
|
+
this.setAttribute("theme", value);
|
|
117
|
+
else
|
|
118
|
+
this.removeAttribute("theme");
|
|
119
|
+
}
|
|
120
|
+
/** The live editor engine, or `null` until `ready` fires. */
|
|
121
|
+
get editor() {
|
|
122
|
+
return this.#api?.editor ?? null;
|
|
123
|
+
}
|
|
124
|
+
// --- Methods (delegate to the editor API once ready) ---
|
|
125
|
+
getScene() {
|
|
126
|
+
return this.#api?.getScene();
|
|
127
|
+
}
|
|
128
|
+
loadScene(scene) {
|
|
129
|
+
this.#scene = scene;
|
|
130
|
+
this.#api?.loadScene(scene);
|
|
131
|
+
}
|
|
132
|
+
undo() {
|
|
133
|
+
this.#api?.undo();
|
|
134
|
+
}
|
|
135
|
+
redo() {
|
|
136
|
+
this.#api?.redo();
|
|
137
|
+
}
|
|
138
|
+
zoomToFit() {
|
|
139
|
+
this.#api?.zoomToFit();
|
|
140
|
+
}
|
|
141
|
+
getMode() {
|
|
142
|
+
return this.#api?.getMode() ?? null;
|
|
143
|
+
}
|
|
144
|
+
setMode(mode) {
|
|
145
|
+
this.#api?.setMode(mode);
|
|
146
|
+
}
|
|
147
|
+
getSelection() {
|
|
148
|
+
return this.#api?.getSelection() ?? new Set();
|
|
149
|
+
}
|
|
150
|
+
setSelection(ids) {
|
|
151
|
+
this.#api?.setSelection(ids);
|
|
152
|
+
}
|
|
153
|
+
// --- Internals ---
|
|
154
|
+
#emit(type, detail) {
|
|
155
|
+
this.dispatchEvent(new CustomEvent(type, { detail }));
|
|
156
|
+
}
|
|
157
|
+
#editorProps() {
|
|
158
|
+
const themeAttr = this.getAttribute("theme");
|
|
159
|
+
const rendererAttr = this.getAttribute("renderer");
|
|
160
|
+
const theme = themeAttr && THEMES.has(themeAttr) ? themeAttr : undefined;
|
|
161
|
+
const renderer = rendererAttr && RENDERERS.has(rendererAttr) ? rendererAttr : undefined;
|
|
162
|
+
return {
|
|
163
|
+
...(this.#scene ? { initialScene: this.#scene } : {}),
|
|
164
|
+
grid: { enabled: this.hasAttribute("grid") },
|
|
165
|
+
snap: this.hasAttribute("snap"),
|
|
166
|
+
...(theme ? { theme } : {}),
|
|
167
|
+
...(renderer ? { capabilities: { renderer } } : {}),
|
|
168
|
+
onReady: (editor) => {
|
|
169
|
+
// Wire keyboard shortcuts so the editor is usable without a host
|
|
170
|
+
// doing it. Listen on `window`: a shadow-internal element doesn't
|
|
171
|
+
// have to hold focus for the shortcut to land, and `composedPath`
|
|
172
|
+
// keeps text-field suppression correct across the shadow boundary.
|
|
173
|
+
this.#unbindHotkeys?.();
|
|
174
|
+
this.#unbindHotkeys = bindEditorHotkeys(editor);
|
|
175
|
+
// A scene assigned before the engine was ready — e.g. a framework
|
|
176
|
+
// wrapper restoring persisted state on mount — was only stashed in
|
|
177
|
+
// `#scene` (the imperative API didn't exist yet) and the editor
|
|
178
|
+
// seeded from an empty `initialScene`. Apply it now via the live
|
|
179
|
+
// engine so the restore actually lands. (`#api` is still null here:
|
|
180
|
+
// `useImperativeHandle` updates the ref a render later than `onReady`.)
|
|
181
|
+
if (this.#scene)
|
|
182
|
+
editor.loadScene(this.#scene);
|
|
183
|
+
this.#emit("ready", { editor });
|
|
184
|
+
},
|
|
185
|
+
onSceneChange: (scene) => {
|
|
186
|
+
this.#emit("scenechange", scene);
|
|
187
|
+
},
|
|
188
|
+
onSelectionChange: (ids) => {
|
|
189
|
+
this.#emit("selectionchange", [...ids]);
|
|
190
|
+
},
|
|
191
|
+
onThemeChange: (next) => {
|
|
192
|
+
this.#emit("themechange", next);
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
#render() {
|
|
197
|
+
this.#root?.render(_jsx(PortalContainerProvider, { container: this.#portalLayer, children: _jsx(EditorComponent, { ref: (api) => {
|
|
198
|
+
this.#api = api;
|
|
199
|
+
}, ...this.#editorProps() }) }));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=oja-diagram-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oja-diagram-element.js","sourceRoot":"","sources":["../src/oja-diagram-element.tsx"],"names":[],"mappings":"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"}
|