@oh-just-another/templates 0.57.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 +15 -0
- package/LICENSE +21 -0
- package/README.md +73 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/built-in.d.ts +16 -0
- package/dist/built-in.d.ts.map +1 -0
- package/dist/built-in.js +204 -0
- package/dist/built-in.js.map +1 -0
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +11 -0
- package/dist/constants.js.map +1 -0
- package/dist/icons.d.ts +21 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +24 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/library.d.ts +29 -0
- package/dist/library.d.ts.map +1 -0
- package/dist/library.js +60 -0
- package/dist/library.js.map +1 -0
- package/dist/registry.d.ts +27 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +48 -0
- package/dist/registry.js.map +1 -0
- package/dist/rich/binding.d.ts +10 -0
- package/dist/rich/binding.d.ts.map +1 -0
- package/dist/rich/binding.js +42 -0
- package/dist/rich/binding.js.map +1 -0
- package/dist/rich/bounds.d.ts +16 -0
- package/dist/rich/bounds.d.ts.map +1 -0
- package/dist/rich/bounds.js +13 -0
- package/dist/rich/bounds.js.map +1 -0
- package/dist/rich/define.d.ts +44 -0
- package/dist/rich/define.d.ts.map +1 -0
- package/dist/rich/define.js +3 -0
- package/dist/rich/define.js.map +1 -0
- package/dist/rich/drop-zones.d.ts +25 -0
- package/dist/rich/drop-zones.d.ts.map +1 -0
- package/dist/rich/drop-zones.js +63 -0
- package/dist/rich/drop-zones.js.map +1 -0
- package/dist/rich/extends.d.ts +35 -0
- package/dist/rich/extends.d.ts.map +1 -0
- package/dist/rich/extends.js +46 -0
- package/dist/rich/extends.js.map +1 -0
- package/dist/rich/hit-test.d.ts +14 -0
- package/dist/rich/hit-test.d.ts.map +1 -0
- package/dist/rich/hit-test.js +53 -0
- package/dist/rich/hit-test.js.map +1 -0
- package/dist/rich/index.d.ts +22 -0
- package/dist/rich/index.d.ts.map +1 -0
- package/dist/rich/index.js +15 -0
- package/dist/rich/index.js.map +1 -0
- package/dist/rich/interactive.d.ts +44 -0
- package/dist/rich/interactive.d.ts.map +1 -0
- package/dist/rich/interactive.js +80 -0
- package/dist/rich/interactive.js.map +1 -0
- package/dist/rich/layout.d.ts +44 -0
- package/dist/rich/layout.d.ts.map +1 -0
- package/dist/rich/layout.js +418 -0
- package/dist/rich/layout.js.map +1 -0
- package/dist/rich/node.d.ts +96 -0
- package/dist/rich/node.d.ts.map +1 -0
- package/dist/rich/node.js +7 -0
- package/dist/rich/node.js.map +1 -0
- package/dist/rich/ports.d.ts +19 -0
- package/dist/rich/ports.d.ts.map +1 -0
- package/dist/rich/ports.js +52 -0
- package/dist/rich/ports.js.map +1 -0
- package/dist/rich/registry.d.ts +19 -0
- package/dist/rich/registry.d.ts.map +1 -0
- package/dist/rich/registry.js +35 -0
- package/dist/rich/registry.js.map +1 -0
- package/dist/rich/render.d.ts +19 -0
- package/dist/rich/render.d.ts.map +1 -0
- package/dist/rich/render.js +306 -0
- package/dist/rich/render.js.map +1 -0
- package/dist/rich/style.d.ts +126 -0
- package/dist/rich/style.d.ts.map +1 -0
- package/dist/rich/style.js +35 -0
- package/dist/rich/style.js.map +1 -0
- package/dist/rich/svg.d.ts +90 -0
- package/dist/rich/svg.d.ts.map +1 -0
- package/dist/rich/svg.js +415 -0
- package/dist/rich/svg.js.map +1 -0
- package/dist/spec.d.ts +2789 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +239 -0
- package/dist/spec.js.map +1 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/rich/layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { LayoutStyle, NodeStyle } from "./style.js";
|
|
2
|
+
/**
|
|
3
|
+
* Data binding: either a literal value or `{ bind: "<key>" }` that resolves
|
|
4
|
+
* to `data[key]` at render time.
|
|
5
|
+
*/
|
|
6
|
+
export type Binding<T> = T | {
|
|
7
|
+
readonly bind: string;
|
|
8
|
+
};
|
|
9
|
+
export interface NodeBase {
|
|
10
|
+
/**
|
|
11
|
+
* Stable identifier within the template tree. Optional but recommended —
|
|
12
|
+
* `id` is what hit-test events report back to the host.
|
|
13
|
+
*/
|
|
14
|
+
readonly id?: string;
|
|
15
|
+
readonly style?: NodeStyle;
|
|
16
|
+
readonly layout?: LayoutStyle;
|
|
17
|
+
}
|
|
18
|
+
export interface ContainerNode extends NodeBase {
|
|
19
|
+
readonly type: "container";
|
|
20
|
+
readonly children?: readonly TemplateNode[];
|
|
21
|
+
}
|
|
22
|
+
export interface TextNode extends NodeBase {
|
|
23
|
+
readonly type: "text";
|
|
24
|
+
readonly text: Binding<string>;
|
|
25
|
+
}
|
|
26
|
+
export interface IconNode extends NodeBase {
|
|
27
|
+
readonly type: "icon";
|
|
28
|
+
/**
|
|
29
|
+
* Inline SVG markup as a string. The renderer parses + paints it; for
|
|
30
|
+
* `<svg>` markup, `style.fill` / `style.color` are not auto-propagated.
|
|
31
|
+
*/
|
|
32
|
+
readonly svg: Binding<string>;
|
|
33
|
+
}
|
|
34
|
+
export interface ImageNode extends NodeBase {
|
|
35
|
+
readonly type: "image";
|
|
36
|
+
readonly src: Binding<string>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Clickable area. The host's `Editor` listens for `TEMPLATE_TAP` emits with
|
|
40
|
+
* the node `id` and the host-defined `action` string and routes them.
|
|
41
|
+
*/
|
|
42
|
+
export interface ButtonNode extends NodeBase {
|
|
43
|
+
readonly type: "button";
|
|
44
|
+
readonly label?: Binding<string>;
|
|
45
|
+
/** Free-form action identifier; the host decides what to do with it. */
|
|
46
|
+
readonly action: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Region that accepts dropped shapes / templates. Fires `TEMPLATE_DROP` for
|
|
50
|
+
* this kind of node.
|
|
51
|
+
*/
|
|
52
|
+
export interface DropZoneNode extends NodeBase {
|
|
53
|
+
readonly type: "drop-zone";
|
|
54
|
+
/** Whitelist of template ids or shape `type`s that may be dropped here. */
|
|
55
|
+
readonly accepts?: readonly string[];
|
|
56
|
+
readonly label?: Binding<string>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Connection port — a named anchor on the rendered template shape. Links
|
|
60
|
+
* snap to ports during draw / re-bind. Visible-on-hover is up to the host.
|
|
61
|
+
*
|
|
62
|
+
* Position the port the same way as any other node: typically with
|
|
63
|
+
* `layout.position = "spot"` + `anchor` / `anchorFocus` / `offset`.
|
|
64
|
+
* The port's `id` becomes the key in `shape.anchors`.
|
|
65
|
+
*
|
|
66
|
+
* `system` picks which coordinate system the port resolves to in
|
|
67
|
+
* `shape.anchors` (see `extractPorts`):
|
|
68
|
+
* - `"ratio"` (default) — bounds-relative `{x,y}` in 0..1; scales with
|
|
69
|
+
* the template under resize. Ports without `system` use this.
|
|
70
|
+
* - `"absolute"` — fixed local-px offset from the template's origin;
|
|
71
|
+
* stays put (does not scale) when the template is resized.
|
|
72
|
+
* - `"edge"` — pinned to polygon edge `index` at parameter `t` (0..1);
|
|
73
|
+
* stays on the real sloped edge. Requires `edge`; meaningful only
|
|
74
|
+
* when the instantiated shape is a polygon (falls back to centre on
|
|
75
|
+
* non-polygons, per the scene anchor resolver).
|
|
76
|
+
*/
|
|
77
|
+
export interface PortNode extends NodeBase {
|
|
78
|
+
readonly type: "port";
|
|
79
|
+
/** Required for ports — used as `shape.anchors[id]` lookup key. */
|
|
80
|
+
readonly id: string;
|
|
81
|
+
/** Coordinate system for the resulting anchor. Default `"ratio"`. */
|
|
82
|
+
readonly system?: "ratio" | "absolute" | "edge";
|
|
83
|
+
/** Edge index + parameter — required when `system` is `"edge"`. */
|
|
84
|
+
readonly edge?: {
|
|
85
|
+
readonly index: number;
|
|
86
|
+
readonly t: number;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export type TemplateNode = ContainerNode | TextNode | IconNode | ImageNode | ButtonNode | DropZoneNode | PortNode;
|
|
90
|
+
/** Type guard: a node is a container (has `children`). */
|
|
91
|
+
export declare const isContainer: (n: TemplateNode) => n is ContainerNode;
|
|
92
|
+
/** True if a node should react to pointer input. */
|
|
93
|
+
export declare const isInteractive: (n: TemplateNode) => n is ButtonNode | DropZoneNode;
|
|
94
|
+
/** Iterate every child of `n` lazily, regardless of node kind. */
|
|
95
|
+
export declare const childrenOf: (n: TemplateNode) => readonly TemplateNode[];
|
|
96
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/rich/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzD;;;GAGG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IAChD,mEAAmE;IACnE,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE;AAED,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,UAAU,GACV,YAAY,GACZ,QAAQ,CAAC;AAEb,0DAA0D;AAC1D,eAAO,MAAM,WAAW,GAAI,GAAG,YAAY,KAAG,CAAC,IAAI,aAAuC,CAAC;AAE3F,oDAAoD;AACpD,eAAO,MAAM,aAAa,GAAI,GAAG,YAAY,KAAG,CAAC,IAAI,UAAU,GAAG,YACnB,CAAC;AAEhD,kEAAkE;AAClE,eAAO,MAAM,UAAU,GAAI,GAAG,YAAY,KAAG,SAAS,YAAY,EACxB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Type guard: a node is a container (has `children`). */
|
|
2
|
+
export const isContainer = (n) => n.type === "container";
|
|
3
|
+
/** True if a node should react to pointer input. */
|
|
4
|
+
export const isInteractive = (n) => n.type === "button" || n.type === "drop-zone";
|
|
5
|
+
/** Iterate every child of `n` lazily, regardless of node kind. */
|
|
6
|
+
export const childrenOf = (n) => isContainer(n) ? (n.children ?? []) : [];
|
|
7
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/rich/node.ts"],"names":[],"mappings":"AAsGA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAe,EAAsB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AAE3F,oDAAoD;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAe,EAAkC,EAAE,CAC/E,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AAEhD,kEAAkE;AAClE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAe,EAA2B,EAAE,CACrE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AnchorRef } from "@oh-just-another/scene";
|
|
2
|
+
import type { LayoutedNode } from "./layout.js";
|
|
3
|
+
/**
|
|
4
|
+
* Walk a layouted template tree and collect every `PortNode` as a map
|
|
5
|
+
* from `port.id` → `AnchorRef`, populated onto `shape.anchors` by the
|
|
6
|
+
* template-instance factory. Link endpoints can then reference ports by
|
|
7
|
+
* id (via `{ kind: "anchor", anchor: { kind: "named", name: <port.id> } }`);
|
|
8
|
+
* the snap engine + nearest-anchor lookup picks them up automatically.
|
|
9
|
+
*
|
|
10
|
+
* The port's `system` field (default `"ratio"`) chooses the coordinate
|
|
11
|
+
* system the ref resolves to (all three round-trip through `shape.anchors`):
|
|
12
|
+
* - `"ratio"` — bounds-relative `{x,y}` in 0..1; scales with resize.
|
|
13
|
+
* - `"absolute"` — local-px offset from the template origin; fixed.
|
|
14
|
+
* - `"edge"` — polygon edge `index` + parameter `t` (from `port.edge`);
|
|
15
|
+
* stays on the real edge. Missing `edge` → falls back to `ratio` so a
|
|
16
|
+
* malformed port still yields a usable anchor instead of being dropped.
|
|
17
|
+
*/
|
|
18
|
+
export declare const extractPorts: (root: LayoutedNode) => Record<string, AnchorRef>;
|
|
19
|
+
//# sourceMappingURL=ports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/rich/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,YAAY,KAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAgCzE,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walk a layouted template tree and collect every `PortNode` as a map
|
|
3
|
+
* from `port.id` → `AnchorRef`, populated onto `shape.anchors` by the
|
|
4
|
+
* template-instance factory. Link endpoints can then reference ports by
|
|
5
|
+
* id (via `{ kind: "anchor", anchor: { kind: "named", name: <port.id> } }`);
|
|
6
|
+
* the snap engine + nearest-anchor lookup picks them up automatically.
|
|
7
|
+
*
|
|
8
|
+
* The port's `system` field (default `"ratio"`) chooses the coordinate
|
|
9
|
+
* system the ref resolves to (all three round-trip through `shape.anchors`):
|
|
10
|
+
* - `"ratio"` — bounds-relative `{x,y}` in 0..1; scales with resize.
|
|
11
|
+
* - `"absolute"` — local-px offset from the template origin; fixed.
|
|
12
|
+
* - `"edge"` — polygon edge `index` + parameter `t` (from `port.edge`);
|
|
13
|
+
* stays on the real edge. Missing `edge` → falls back to `ratio` so a
|
|
14
|
+
* malformed port still yields a usable anchor instead of being dropped.
|
|
15
|
+
*/
|
|
16
|
+
export const extractPorts = (root) => {
|
|
17
|
+
const out = {};
|
|
18
|
+
const rootBounds = root.bounds;
|
|
19
|
+
if (rootBounds.width === 0 || rootBounds.height === 0)
|
|
20
|
+
return out;
|
|
21
|
+
const visit = (l) => {
|
|
22
|
+
if (l.node.type === "port") {
|
|
23
|
+
const port = l.node;
|
|
24
|
+
// Port bounds are 0×0 — the layout pass already placed its
|
|
25
|
+
// top-left at the resolved spot position. `dx`/`dy` are the
|
|
26
|
+
// resolved local-px offset from the template origin.
|
|
27
|
+
const dx = l.bounds.x - rootBounds.x;
|
|
28
|
+
const dy = l.bounds.y - rootBounds.y;
|
|
29
|
+
const system = port.system ?? "ratio";
|
|
30
|
+
if (system === "edge" && port.edge) {
|
|
31
|
+
out[port.id] = { kind: "edge", index: port.edge.index, t: port.edge.t };
|
|
32
|
+
}
|
|
33
|
+
else if (system === "absolute") {
|
|
34
|
+
out[port.id] = { kind: "absolute", offset: { x: dx, y: dy } };
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// "ratio" (default) and the malformed-"edge" fallback: convert
|
|
38
|
+
// the resolved point into a ratio of the root bounds so it
|
|
39
|
+
// resolves the same regardless of the template's final size.
|
|
40
|
+
out[port.id] = {
|
|
41
|
+
kind: "ratio",
|
|
42
|
+
position: { x: dx / rootBounds.width, y: dy / rootBounds.height },
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
for (const child of l.children)
|
|
47
|
+
visit(child);
|
|
48
|
+
};
|
|
49
|
+
visit(root);
|
|
50
|
+
return out;
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=ports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/rich/ports.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAkB,EAA6B,EAAE;IAC5E,MAAM,GAAG,GAA8B,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/B,IAAI,UAAU,CAAC,KAAK,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAElE,MAAM,KAAK,GAAG,CAAC,CAAe,EAAQ,EAAE;QACtC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YACpB,2DAA2D;YAC3D,4DAA4D;YAC5D,qDAAqD;YACrD,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;YACrC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;YACtC,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1E,CAAC;iBAAM,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,2DAA2D;gBAC3D,6DAA6D;gBAC7D,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG;oBACb,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE;iBAClE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ;YAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RichTemplate } from "./define.js";
|
|
2
|
+
/**
|
|
3
|
+
* Registry of rich templates, keyed by id. The render layer and the host UI
|
|
4
|
+
* both read from this registry; the host typically installs templates at
|
|
5
|
+
* startup and rarely mutates it afterwards.
|
|
6
|
+
*/
|
|
7
|
+
export declare class RichTemplateRegistry {
|
|
8
|
+
private readonly items;
|
|
9
|
+
register(template: RichTemplate): void;
|
|
10
|
+
replace(template: RichTemplate): void;
|
|
11
|
+
get(id: string): RichTemplate | undefined;
|
|
12
|
+
has(id: string): boolean;
|
|
13
|
+
list(): readonly RichTemplate[];
|
|
14
|
+
byCategory(category: string): readonly RichTemplate[];
|
|
15
|
+
clear(): void;
|
|
16
|
+
}
|
|
17
|
+
/** Singleton used by the kernel renderer + most hosts. */
|
|
18
|
+
export declare const defaultRichRegistry: RichTemplateRegistry;
|
|
19
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/rich/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IAEzD,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAOtC,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIrC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIzC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,IAAI,IAAI,SAAS,YAAY,EAAE;IAI/B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE;IAIrD,KAAK,IAAI,IAAI;CAGd;AAED,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,sBAA6B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry of rich templates, keyed by id. The render layer and the host UI
|
|
3
|
+
* both read from this registry; the host typically installs templates at
|
|
4
|
+
* startup and rarely mutates it afterwards.
|
|
5
|
+
*/
|
|
6
|
+
export class RichTemplateRegistry {
|
|
7
|
+
items = new Map();
|
|
8
|
+
register(template) {
|
|
9
|
+
if (this.items.has(template.id)) {
|
|
10
|
+
throw new Error(`Rich template already registered: ${template.id}`);
|
|
11
|
+
}
|
|
12
|
+
this.items.set(template.id, template);
|
|
13
|
+
}
|
|
14
|
+
replace(template) {
|
|
15
|
+
this.items.set(template.id, template);
|
|
16
|
+
}
|
|
17
|
+
get(id) {
|
|
18
|
+
return this.items.get(id);
|
|
19
|
+
}
|
|
20
|
+
has(id) {
|
|
21
|
+
return this.items.has(id);
|
|
22
|
+
}
|
|
23
|
+
list() {
|
|
24
|
+
return [...this.items.values()];
|
|
25
|
+
}
|
|
26
|
+
byCategory(category) {
|
|
27
|
+
return this.list().filter((t) => t.category === category);
|
|
28
|
+
}
|
|
29
|
+
clear() {
|
|
30
|
+
this.items.clear();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Singleton used by the kernel renderer + most hosts. */
|
|
34
|
+
export const defaultRichRegistry = new RichTemplateRegistry();
|
|
35
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/rich/registry.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IACd,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEzD,QAAQ,CAAC,QAAsB;QAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,QAAsB;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,UAAU,CAAC,QAAgB;QACzB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAED,0DAA0D;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type TemplateElement as SceneTemplateElement } from "@oh-just-another/scene";
|
|
2
|
+
import { type ElementRenderer } from "@oh-just-another/renderer-core";
|
|
3
|
+
/**
|
|
4
|
+
* Render a `TemplateElement` onto a `RenderTarget`:
|
|
5
|
+
* 1. looks up the template in the rich registry by `shape.templateId`,
|
|
6
|
+
* 2. resolves data bindings against `shape.data`,
|
|
7
|
+
* 3. runs the layout engine with a measurer backed by `target.measureText`,
|
|
8
|
+
* 4. walks the layouted tree and paints each node into `target`.
|
|
9
|
+
*
|
|
10
|
+
* The caller is expected to have already translated `target` to the shape's
|
|
11
|
+
* `position` (via `renderScene`'s per-shape TRS push).
|
|
12
|
+
*/
|
|
13
|
+
export declare const renderTemplateElement: ElementRenderer<SceneTemplateElement>;
|
|
14
|
+
/**
|
|
15
|
+
* Wire the rich-template renderer + bounder into the global registries. Call
|
|
16
|
+
* once at app startup, alongside `installBuiltinRenderers()`.
|
|
17
|
+
*/
|
|
18
|
+
export declare const installTemplateShapeRenderer: () => void;
|
|
19
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/rich/render.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,eAAe,IAAI,oBAAoB,EAC7C,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,gCAAgC,CAAC;AAgBxC;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,eAAe,CAAC,oBAAoB,CA0BvE,CAAC;AA2MF;;;GAGG;AACH,eAAO,MAAM,4BAA4B,QAAO,IAgD/C,CAAC"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { registerBounder, registerContainerResolver, registerContainerZonesResolver, } from "@oh-just-another/scene";
|
|
2
|
+
import { extractDropZone, extractAllDropZones } from "./drop-zones.js";
|
|
3
|
+
import { registerElementRenderer, } from "@oh-just-another/renderer-core";
|
|
4
|
+
import { resolveBindings } from "./binding.js";
|
|
5
|
+
import { layoutTree } from "./layout.js";
|
|
6
|
+
import { defaultRichRegistry } from "./registry.js";
|
|
7
|
+
import { paintSvgIcon, parseSvg } from "./svg.js";
|
|
8
|
+
/**
|
|
9
|
+
* Render a `TemplateElement` onto a `RenderTarget`:
|
|
10
|
+
* 1. looks up the template in the rich registry by `shape.templateId`,
|
|
11
|
+
* 2. resolves data bindings against `shape.data`,
|
|
12
|
+
* 3. runs the layout engine with a measurer backed by `target.measureText`,
|
|
13
|
+
* 4. walks the layouted tree and paints each node into `target`.
|
|
14
|
+
*
|
|
15
|
+
* The caller is expected to have already translated `target` to the shape's
|
|
16
|
+
* `position` (via `renderScene`'s per-shape TRS push).
|
|
17
|
+
*/
|
|
18
|
+
export const renderTemplateElement = (shape, target) => {
|
|
19
|
+
const template = defaultRichRegistry.get(shape.templateId);
|
|
20
|
+
if (!template) {
|
|
21
|
+
paintMissing(target, shape.width, shape.height, shape.templateId);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const root = resolveBindings(template.root, { ...template.defaults, ...shape.data });
|
|
25
|
+
// Force the root to fill the shape's box, which is what makes a template
|
|
26
|
+
// resizable: the user-defined `width/height` on the root layout are
|
|
27
|
+
// overridden with the shape's current width/height so the layout engine
|
|
28
|
+
// distributes the remaining space to children.
|
|
29
|
+
const rootWithSize = {
|
|
30
|
+
...root,
|
|
31
|
+
layout: {
|
|
32
|
+
...(root.layout ?? {}),
|
|
33
|
+
width: shape.width,
|
|
34
|
+
height: shape.height,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
const measure = makeMeasureText(target);
|
|
38
|
+
const layouted = layoutTree(rootWithSize, {
|
|
39
|
+
measureText: measure,
|
|
40
|
+
available: { width: shape.width, height: shape.height },
|
|
41
|
+
});
|
|
42
|
+
paintNode(layouted, target);
|
|
43
|
+
};
|
|
44
|
+
const makeMeasureText = (target) => {
|
|
45
|
+
// measureText reads the current font on the target. Set/restore around the
|
|
46
|
+
// measurement so the caller's style is not stomped on.
|
|
47
|
+
return (text, fontFamily, fontSize) => {
|
|
48
|
+
target.save();
|
|
49
|
+
try {
|
|
50
|
+
target.setFont(fontFamily, fontSize);
|
|
51
|
+
return target.measureText(text).width;
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
target.restore();
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
const paintNode = (l, target) => {
|
|
59
|
+
paintBox(l.node, l.bounds, target);
|
|
60
|
+
switch (l.node.type) {
|
|
61
|
+
case "container":
|
|
62
|
+
for (const c of l.children)
|
|
63
|
+
paintNode(c, target);
|
|
64
|
+
break;
|
|
65
|
+
case "text":
|
|
66
|
+
paintText(l.node, l.bounds, target);
|
|
67
|
+
break;
|
|
68
|
+
case "button":
|
|
69
|
+
paintButton(l.node, l.bounds, target);
|
|
70
|
+
break;
|
|
71
|
+
case "drop-zone":
|
|
72
|
+
paintDropZone(l.node, l.bounds, target);
|
|
73
|
+
break;
|
|
74
|
+
case "icon":
|
|
75
|
+
paintIcon(l.node, l.bounds, target);
|
|
76
|
+
break;
|
|
77
|
+
case "image":
|
|
78
|
+
paintImagePlaceholder(l.node, l.bounds, target);
|
|
79
|
+
break;
|
|
80
|
+
case "port":
|
|
81
|
+
// Ports are dimensionless — nothing to paint. Hosts paint port-dot
|
|
82
|
+
// overlays from `shape.anchors`.
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
const paintBox = (node, b, target) => {
|
|
87
|
+
const style = node.style;
|
|
88
|
+
if (!style)
|
|
89
|
+
return;
|
|
90
|
+
const hasFill = style.fill !== undefined && style.fill !== "transparent";
|
|
91
|
+
const hasStroke = style.stroke !== undefined && style.stroke !== "transparent" && (style.strokeWidth ?? 1) > 0;
|
|
92
|
+
if (!hasFill && !hasStroke)
|
|
93
|
+
return;
|
|
94
|
+
if (style.opacity !== undefined)
|
|
95
|
+
target.setOpacity(style.opacity);
|
|
96
|
+
if (hasFill && style.fill)
|
|
97
|
+
target.setFill(style.fill);
|
|
98
|
+
if (hasStroke && style.stroke) {
|
|
99
|
+
target.setStroke(style.stroke);
|
|
100
|
+
target.setStrokeWidth(style.strokeWidth ?? 1);
|
|
101
|
+
}
|
|
102
|
+
target.beginPath();
|
|
103
|
+
target.rect(b.x, b.y, b.width, b.height);
|
|
104
|
+
if (hasFill)
|
|
105
|
+
target.fill();
|
|
106
|
+
if (hasStroke)
|
|
107
|
+
target.stroke();
|
|
108
|
+
};
|
|
109
|
+
const paintText = (node, b, target) => {
|
|
110
|
+
const color = node.style?.color ?? node.style?.fill ?? "#000";
|
|
111
|
+
const fontFamily = node.style?.fontFamily ?? "system-ui, sans-serif";
|
|
112
|
+
const fontSize = node.style?.fontSize ?? 14;
|
|
113
|
+
const align = node.style?.textAlign ?? "left";
|
|
114
|
+
target.setFont(fontFamily, fontSize);
|
|
115
|
+
target.setTextAlign(align);
|
|
116
|
+
target.setTextBaseline("top");
|
|
117
|
+
target.setFill(color);
|
|
118
|
+
const raw = typeof node.text === "string" ? node.text : "";
|
|
119
|
+
const text = truncateToWidth(raw, b.width, target);
|
|
120
|
+
// X anchor for alignment within the box.
|
|
121
|
+
let x = b.x;
|
|
122
|
+
if (align === "center")
|
|
123
|
+
x = b.x + b.width / 2;
|
|
124
|
+
else if (align === "right")
|
|
125
|
+
x = b.x + b.width;
|
|
126
|
+
target.fillText(text, x, b.y);
|
|
127
|
+
};
|
|
128
|
+
const paintButton = (node, b, target) => {
|
|
129
|
+
const fill = node.style?.fill ?? "#f4f4f4";
|
|
130
|
+
const stroke = node.style?.stroke ?? "#888";
|
|
131
|
+
const color = node.style?.color ?? "#222";
|
|
132
|
+
target.setFill(fill);
|
|
133
|
+
target.setStroke(stroke);
|
|
134
|
+
target.setStrokeWidth(node.style?.strokeWidth ?? 1);
|
|
135
|
+
target.beginPath();
|
|
136
|
+
target.rect(b.x, b.y, b.width, b.height);
|
|
137
|
+
target.fill();
|
|
138
|
+
target.stroke();
|
|
139
|
+
if (node.label !== undefined) {
|
|
140
|
+
const rawLabel = typeof node.label === "string" ? node.label : "";
|
|
141
|
+
const fontFamily = node.style?.fontFamily ?? "system-ui, sans-serif";
|
|
142
|
+
const fontSize = node.style?.fontSize ?? 13;
|
|
143
|
+
target.setFont(fontFamily, fontSize);
|
|
144
|
+
target.setTextAlign("center");
|
|
145
|
+
target.setTextBaseline("middle");
|
|
146
|
+
target.setFill(color);
|
|
147
|
+
const labelText = truncateToWidth(rawLabel, Math.max(0, b.width - 12), target);
|
|
148
|
+
target.fillText(labelText, b.x + b.width / 2, b.y + b.height / 2);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
const paintDropZone = (node, b, target) => {
|
|
152
|
+
target.setStroke(node.style?.stroke ?? "#888");
|
|
153
|
+
target.setStrokeWidth(node.style?.strokeWidth ?? 1);
|
|
154
|
+
target.setDashArray([4, 4]);
|
|
155
|
+
target.beginPath();
|
|
156
|
+
target.rect(b.x, b.y, b.width, b.height);
|
|
157
|
+
target.stroke();
|
|
158
|
+
target.setDashArray(null);
|
|
159
|
+
if (node.label !== undefined) {
|
|
160
|
+
const labelText = typeof node.label === "string" ? node.label : "Drop here";
|
|
161
|
+
const color = node.style?.color ?? "#999";
|
|
162
|
+
target.setFont(node.style?.fontFamily ?? "system-ui", node.style?.fontSize ?? 12);
|
|
163
|
+
target.setTextAlign("center");
|
|
164
|
+
target.setTextBaseline("middle");
|
|
165
|
+
target.setFill(color);
|
|
166
|
+
target.fillText(labelText, b.x + b.width / 2, b.y + b.height / 2);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
const paintIcon = (node, b, target) => {
|
|
170
|
+
const svg = typeof node.svg === "string" ? node.svg : "";
|
|
171
|
+
if (!svg)
|
|
172
|
+
return;
|
|
173
|
+
const tint = node.style?.color ?? node.style?.stroke ?? node.style?.fill ?? "#222";
|
|
174
|
+
const cached = getCachedSvg(svg, tint);
|
|
175
|
+
if (!cached) {
|
|
176
|
+
// Couldn't parse — fall back to a hairline placeholder so the layout
|
|
177
|
+
// slot still shows.
|
|
178
|
+
target.setStroke(tint);
|
|
179
|
+
target.setStrokeWidth(1);
|
|
180
|
+
target.beginPath();
|
|
181
|
+
target.rect(b.x, b.y, b.width, b.height);
|
|
182
|
+
target.stroke();
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
paintSvgIcon(cached, b, target);
|
|
186
|
+
};
|
|
187
|
+
// Parsed-SVG cache keyed by `markup|tint`. SVG strings in templates are
|
|
188
|
+
// repeated for every instance — parse once, reuse.
|
|
189
|
+
const svgCache = new Map();
|
|
190
|
+
const getCachedSvg = (markup, tint) => {
|
|
191
|
+
const key = `${markup}|${tint}`;
|
|
192
|
+
if (svgCache.has(key))
|
|
193
|
+
return svgCache.get(key) ?? null;
|
|
194
|
+
const parsed = parseSvg(markup, tint);
|
|
195
|
+
svgCache.set(key, parsed);
|
|
196
|
+
return parsed;
|
|
197
|
+
};
|
|
198
|
+
const paintImagePlaceholder = (_node, b, target) => {
|
|
199
|
+
target.setStroke("#888");
|
|
200
|
+
target.setStrokeWidth(1);
|
|
201
|
+
target.setFill("#eee");
|
|
202
|
+
target.beginPath();
|
|
203
|
+
target.rect(b.x, b.y, b.width, b.height);
|
|
204
|
+
target.fill();
|
|
205
|
+
target.stroke();
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* Truncate `text` with a trailing `…` so the painted run fits within
|
|
209
|
+
* `maxWidth`. Reads the target's current font (the caller is expected to
|
|
210
|
+
* have set it).
|
|
211
|
+
*/
|
|
212
|
+
const truncateToWidth = (text, maxWidth, target) => {
|
|
213
|
+
if (maxWidth <= 0)
|
|
214
|
+
return "";
|
|
215
|
+
if (target.measureText(text).width <= maxWidth)
|
|
216
|
+
return text;
|
|
217
|
+
const ellipsis = "…";
|
|
218
|
+
if (target.measureText(ellipsis).width > maxWidth)
|
|
219
|
+
return "";
|
|
220
|
+
let lo = 0;
|
|
221
|
+
let hi = text.length;
|
|
222
|
+
// Largest prefix that, plus the ellipsis, still fits.
|
|
223
|
+
while (lo < hi) {
|
|
224
|
+
const mid = (lo + hi + 1) >>> 1;
|
|
225
|
+
const candidate = text.slice(0, mid) + ellipsis;
|
|
226
|
+
if (target.measureText(candidate).width <= maxWidth)
|
|
227
|
+
lo = mid;
|
|
228
|
+
else
|
|
229
|
+
hi = mid - 1;
|
|
230
|
+
}
|
|
231
|
+
return text.slice(0, lo) + ellipsis;
|
|
232
|
+
};
|
|
233
|
+
const paintMissing = (target, width, height, id) => {
|
|
234
|
+
target.setStroke("#c00");
|
|
235
|
+
target.setStrokeWidth(1);
|
|
236
|
+
target.setDashArray([4, 4]);
|
|
237
|
+
target.beginPath();
|
|
238
|
+
target.rect(0, 0, width, height);
|
|
239
|
+
target.stroke();
|
|
240
|
+
target.setDashArray(null);
|
|
241
|
+
target.setFill("#c00");
|
|
242
|
+
target.setFont("system-ui", 11);
|
|
243
|
+
target.setTextAlign("center");
|
|
244
|
+
target.setTextBaseline("middle");
|
|
245
|
+
target.fillText(`missing template: ${id}`, width / 2, height / 2);
|
|
246
|
+
};
|
|
247
|
+
void null; // appease unused-import checks
|
|
248
|
+
/**
|
|
249
|
+
* Wire the rich-template renderer + bounder into the global registries. Call
|
|
250
|
+
* once at app startup, alongside `installBuiltinRenderers()`.
|
|
251
|
+
*/
|
|
252
|
+
export const installTemplateShapeRenderer = () => {
|
|
253
|
+
registerElementRenderer("template", renderTemplateElement);
|
|
254
|
+
registerBounder("template", (shape) => {
|
|
255
|
+
// The shape's width/height drives both the bounder and the renderer so
|
|
256
|
+
// the user's resize gesture changes both the AABB and the painted layout.
|
|
257
|
+
return { x: 0, y: 0, width: shape.width, height: shape.height };
|
|
258
|
+
});
|
|
259
|
+
// Re-layout a template shape's tree against its current width/height so the
|
|
260
|
+
// drop-zone bounds stay in sync with the visible body after the user resizes
|
|
261
|
+
// it (e.g. growing a swim-lane). Returns the layouted root, or null when the
|
|
262
|
+
// shape isn't a known template.
|
|
263
|
+
//
|
|
264
|
+
// Same trick as renderTemplateElement: inject the shape's current
|
|
265
|
+
// width/height into the root layout, otherwise the root container collapses
|
|
266
|
+
// to its intrinsic size (~80×60 driven by the drop-zone's intrinsic) and the
|
|
267
|
+
// resolver returns a tiny box.
|
|
268
|
+
const layoutTemplateShape = (shape) => {
|
|
269
|
+
if (shape.type !== "template")
|
|
270
|
+
return null;
|
|
271
|
+
const tmpl = shape;
|
|
272
|
+
const template = defaultRichRegistry.get(tmpl.templateId);
|
|
273
|
+
if (!template)
|
|
274
|
+
return null;
|
|
275
|
+
const rootWithSize = {
|
|
276
|
+
...template.root,
|
|
277
|
+
layout: { ...(template.root.layout ?? {}), width: tmpl.width, height: tmpl.height },
|
|
278
|
+
};
|
|
279
|
+
return layoutTree(rootWithSize, {
|
|
280
|
+
available: { width: tmpl.width, height: tmpl.height },
|
|
281
|
+
});
|
|
282
|
+
};
|
|
283
|
+
// Live single-zone resolver — the container-attach protocol's drop target.
|
|
284
|
+
registerContainerResolver((shape) => {
|
|
285
|
+
const layouted = layoutTemplateShape(shape);
|
|
286
|
+
if (!layouted)
|
|
287
|
+
return null;
|
|
288
|
+
const dropZone = extractDropZone(layouted);
|
|
289
|
+
if (!dropZone)
|
|
290
|
+
return null;
|
|
291
|
+
// Read padding from the shape's static metadata fallback (if any)
|
|
292
|
+
// so authors can tune it per-template; default 8.
|
|
293
|
+
const staticMeta = shape.metadata?.container ?? {};
|
|
294
|
+
return { dropZone, padding: staticMeta.padding ?? 8 };
|
|
295
|
+
});
|
|
296
|
+
// Live multi-zone resolver — every lane of a multi-lane template, for the
|
|
297
|
+
// debug hit-zone overlay (the attach protocol still uses the single zone).
|
|
298
|
+
registerContainerZonesResolver((shape) => {
|
|
299
|
+
const layouted = layoutTemplateShape(shape);
|
|
300
|
+
if (!layouted)
|
|
301
|
+
return null;
|
|
302
|
+
const zones = extractAllDropZones(layouted);
|
|
303
|
+
return zones.length > 0 ? zones : null;
|
|
304
|
+
});
|
|
305
|
+
};
|
|
306
|
+
//# sourceMappingURL=render.js.map
|