@oh-just-another/scene 0.59.0 → 0.61.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 +81 -0
- package/README.md +2 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/brush-outline.d.ts +21 -0
- package/dist/brush-outline.d.ts.map +1 -0
- package/dist/brush-outline.js +142 -0
- package/dist/brush-outline.js.map +1 -0
- package/dist/constants.d.ts +71 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +71 -0
- package/dist/constants.js.map +1 -1
- package/dist/edge-geometry.d.ts +36 -0
- package/dist/edge-geometry.d.ts.map +1 -1
- package/dist/edge-geometry.js +70 -14
- package/dist/edge-geometry.js.map +1 -1
- package/dist/edge-label.d.ts +55 -0
- package/dist/edge-label.d.ts.map +1 -0
- package/dist/edge-label.js +193 -0
- package/dist/edge-label.js.map +1 -0
- package/dist/edge.d.ts +12 -0
- package/dist/edge.d.ts.map +1 -1
- package/dist/edge.js +17 -1
- package/dist/edge.js.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/shape-transform.d.ts +6 -0
- package/dist/shape-transform.d.ts.map +1 -1
- package/dist/shape-transform.js +18 -0
- package/dist/shape-transform.js.map +1 -1
- package/dist/shape.d.ts +63 -0
- package/dist/shape.d.ts.map +1 -1
- package/dist/shape.js +8 -0
- package/dist/shape.js.map +1 -1
- package/dist/text-runs.d.ts +44 -0
- package/dist/text-runs.d.ts.map +1 -0
- package/dist/text-runs.js +139 -0
- package/dist/text-runs.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { req } from "@oh-just-another/types";
|
|
2
|
+
import { LINK_LABEL_CHAR_WIDTH_FACTOR, LINK_LABEL_DEFAULT_FONT_SIZE, LINK_LABEL_DEFAULT_POSITION, LINK_LABEL_END_CLEARANCE, LINK_LABEL_LINE_HEIGHT, LINK_LABEL_MAX_WIDTH, LINK_LABEL_PAD_X, LINK_LABEL_PAD_Y, } from "./constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* Label geometry shared by the renderer (pill placement), hit-testing and
|
|
5
|
+
* bounds/culling — one source of truth so the drawn pill, the clickable area
|
|
6
|
+
* and the dirty-rect all agree.
|
|
7
|
+
*/
|
|
8
|
+
/** Point at fractional arc length `t` (0..1) along a polyline. */
|
|
9
|
+
export const pointAlongPath = (path, t) => {
|
|
10
|
+
if (path.length === 2) {
|
|
11
|
+
const [a, b] = path;
|
|
12
|
+
return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };
|
|
13
|
+
}
|
|
14
|
+
const lengths = [];
|
|
15
|
+
let total = 0;
|
|
16
|
+
for (let i = 1; i < path.length; i++) {
|
|
17
|
+
const cur = req(path[i]);
|
|
18
|
+
const prev = req(path[i - 1]);
|
|
19
|
+
const len = Math.hypot(cur.x - prev.x, cur.y - prev.y);
|
|
20
|
+
lengths.push(len);
|
|
21
|
+
total += len;
|
|
22
|
+
}
|
|
23
|
+
let remaining = total * t;
|
|
24
|
+
for (let i = 0; i < lengths.length; i++) {
|
|
25
|
+
const segLen = req(lengths[i]);
|
|
26
|
+
if (remaining <= segLen) {
|
|
27
|
+
const a = req(path[i]);
|
|
28
|
+
const b = req(path[i + 1]);
|
|
29
|
+
const r = segLen === 0 ? 0 : remaining / segLen;
|
|
30
|
+
return { x: a.x + (b.x - a.x) * r, y: a.y + (b.y - a.y) * r };
|
|
31
|
+
}
|
|
32
|
+
remaining -= segLen;
|
|
33
|
+
}
|
|
34
|
+
return req(path[path.length - 1]);
|
|
35
|
+
};
|
|
36
|
+
/** Total polyline length. */
|
|
37
|
+
const pathLength = (path) => {
|
|
38
|
+
let total = 0;
|
|
39
|
+
for (let i = 1; i < path.length; i++) {
|
|
40
|
+
const a = req(path[i - 1]);
|
|
41
|
+
const b = req(path[i]);
|
|
42
|
+
total += Math.hypot(b.x - a.x, b.y - a.y);
|
|
43
|
+
}
|
|
44
|
+
return total;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* World anchor point of a link's label on `path`.
|
|
48
|
+
*
|
|
49
|
+
* - Explicit `label.position` → fractional arc length, clamped so the pill
|
|
50
|
+
* keeps {@link LINK_LABEL_END_CLEARANCE} away from either end (arrowheads).
|
|
51
|
+
* - No explicit position on an orthogonal (elbow) link → the midpoint of the
|
|
52
|
+
* LONGEST segment: it never sits on a corner and stays put when re-routing
|
|
53
|
+
* re-flows the shorter segments.
|
|
54
|
+
* - Otherwise → clamped arc-length midpoint.
|
|
55
|
+
*/
|
|
56
|
+
export const linkLabelAnchor = (path, edge) => {
|
|
57
|
+
const explicit = edge.label?.position;
|
|
58
|
+
if (explicit === undefined && (edge.routing ?? "straight") === "orthogonal" && path.length > 2) {
|
|
59
|
+
let bestLen = -1;
|
|
60
|
+
let mid = req(path[0]);
|
|
61
|
+
for (let i = 1; i < path.length; i++) {
|
|
62
|
+
const a = req(path[i - 1]);
|
|
63
|
+
const b = req(path[i]);
|
|
64
|
+
const len = Math.hypot(b.x - a.x, b.y - a.y);
|
|
65
|
+
if (len > bestLen) {
|
|
66
|
+
bestLen = len;
|
|
67
|
+
mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return mid;
|
|
71
|
+
}
|
|
72
|
+
const total = pathLength(path);
|
|
73
|
+
const clearance = total > 0 ? Math.min(0.5, LINK_LABEL_END_CLEARANCE / total) : 0;
|
|
74
|
+
const t = Math.min(1 - clearance, Math.max(clearance, explicit ?? LINK_LABEL_DEFAULT_POSITION));
|
|
75
|
+
return pointAlongPath(path, t);
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Conservative size estimate of the label pill (world px at zoom 1) for
|
|
79
|
+
* hit-testing and dirty-rect / culling bounds. Mirrors the renderer's
|
|
80
|
+
* measured word-wrap with a per-glyph advance of
|
|
81
|
+
* {@link LINK_LABEL_CHAR_WIDTH_FACTOR} × fontSize — deliberately a little
|
|
82
|
+
* generous so the drawn pill always fits inside the estimated box.
|
|
83
|
+
*/
|
|
84
|
+
export const estimateLinkLabelBox = (label) => {
|
|
85
|
+
const fontSize = label.fontSize ?? LINK_LABEL_DEFAULT_FONT_SIZE;
|
|
86
|
+
const charW = fontSize * LINK_LABEL_CHAR_WIDTH_FACTOR;
|
|
87
|
+
const maxChars = Math.max(1, Math.floor(LINK_LABEL_MAX_WIDTH / charW));
|
|
88
|
+
let lines = 0;
|
|
89
|
+
let widest = 0;
|
|
90
|
+
for (const paragraph of label.text.split("\n")) {
|
|
91
|
+
const words = paragraph.split(/\s+/).filter((w) => w.length > 0);
|
|
92
|
+
if (words.length === 0) {
|
|
93
|
+
lines += 1;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
let current = "";
|
|
97
|
+
for (const word of words) {
|
|
98
|
+
const candidate = current === "" ? word : `${current} ${word}`;
|
|
99
|
+
if (candidate.length <= maxChars || current === "") {
|
|
100
|
+
current = candidate;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
widest = Math.max(widest, current.length);
|
|
104
|
+
lines += 1;
|
|
105
|
+
current = word;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
widest = Math.max(widest, current.length);
|
|
109
|
+
lines += 1;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
width: Math.min(widest * charW, LINK_LABEL_MAX_WIDTH) + LINK_LABEL_PAD_X * 2,
|
|
113
|
+
height: lines * fontSize * LINK_LABEL_LINE_HEIGHT + LINK_LABEL_PAD_Y * 2,
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Estimated world AABB of a link's label pill on `path` (the drawn polyline —
|
|
118
|
+
* see `getLinkCurvePoints`), or `null` when the link has no label. Centred on
|
|
119
|
+
* {@link linkLabelAnchor}. The scene-aware convenience is
|
|
120
|
+
* `linkLabelBounds` in `edge-geometry.ts`.
|
|
121
|
+
*/
|
|
122
|
+
export const linkLabelBoundsForPath = (path, edge) => {
|
|
123
|
+
if (!edge.label || edge.label.text === "" || path.length < 2)
|
|
124
|
+
return null;
|
|
125
|
+
const anchor = linkLabelAnchor(path, edge);
|
|
126
|
+
const box = estimateLinkLabelBox(edge.label);
|
|
127
|
+
return {
|
|
128
|
+
x: anchor.x - box.width / 2,
|
|
129
|
+
y: anchor.y - box.height / 2,
|
|
130
|
+
width: box.width,
|
|
131
|
+
height: box.height,
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Sampling offsets (fractions of a span, ordered by distance from the
|
|
136
|
+
* midpoint) used to slide a per-span handle out of the label pill. The first
|
|
137
|
+
* sample outside the pill wins, so the handle stays as close to the visual
|
|
138
|
+
* middle as possible.
|
|
139
|
+
*/
|
|
140
|
+
const HANDLE_NUDGE_TS = [0.5, 0.38, 0.62, 0.26, 0.74, 0.14, 0.86];
|
|
141
|
+
const insideBounds = (p, b) => p.x >= b.x && p.x <= b.x + b.width && p.y >= b.y && p.y <= b.y + b.height;
|
|
142
|
+
/**
|
|
143
|
+
* Slide a per-span handle point out of the label pill along its own span.
|
|
144
|
+
* `pointAt(t)` maps a span fraction to a world point (chord lerp for straight
|
|
145
|
+
* spans, the cubic for bezier). Returns the first sampled point outside
|
|
146
|
+
* `label`, or the plain midpoint when the whole span is covered (degenerate —
|
|
147
|
+
* better a conflicting handle than a missing one, and callers keep 1:1 span
|
|
148
|
+
* indexing either way).
|
|
149
|
+
*/
|
|
150
|
+
export const nudgeHandleOffLabel = (pointAt, label) => {
|
|
151
|
+
const mid = pointAt(0.5);
|
|
152
|
+
if (label === null || !insideBounds(mid, label))
|
|
153
|
+
return mid;
|
|
154
|
+
for (const t of HANDLE_NUDGE_TS) {
|
|
155
|
+
const p = pointAt(t);
|
|
156
|
+
if (!insideBounds(p, label))
|
|
157
|
+
return p;
|
|
158
|
+
}
|
|
159
|
+
return mid;
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* Fractional arc-length position (0..1) of the point on `path` nearest to
|
|
163
|
+
* `p` — the inverse of {@link pointAlongPath}. Used by the caption-drag
|
|
164
|
+
* gesture: the cursor is projected back onto the polyline so the label can
|
|
165
|
+
* only slide ALONG its link. Returns 0.5 for a degenerate (zero-length) path.
|
|
166
|
+
*/
|
|
167
|
+
export const projectPointToPathT = (path, p) => {
|
|
168
|
+
let total = 0;
|
|
169
|
+
let bestDist = Infinity;
|
|
170
|
+
let bestAt = 0;
|
|
171
|
+
let walked = 0;
|
|
172
|
+
for (let i = 1; i < path.length; i++) {
|
|
173
|
+
const a = req(path[i - 1]);
|
|
174
|
+
const b = req(path[i]);
|
|
175
|
+
const dx = b.x - a.x;
|
|
176
|
+
const dy = b.y - a.y;
|
|
177
|
+
const len = Math.hypot(dx, dy);
|
|
178
|
+
if (len > 0) {
|
|
179
|
+
const t = Math.max(0, Math.min(1, ((p.x - a.x) * dx + (p.y - a.y) * dy) / (len * len)));
|
|
180
|
+
const qx = a.x + dx * t;
|
|
181
|
+
const qy = a.y + dy * t;
|
|
182
|
+
const d = (p.x - qx) ** 2 + (p.y - qy) ** 2;
|
|
183
|
+
if (d < bestDist) {
|
|
184
|
+
bestDist = d;
|
|
185
|
+
bestAt = walked + len * t;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
walked += len;
|
|
189
|
+
total += len;
|
|
190
|
+
}
|
|
191
|
+
return total > 0 ? bestAt / total : 0.5;
|
|
192
|
+
};
|
|
193
|
+
//# sourceMappingURL=edge-label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-label.js","sourceRoot":"","sources":["../src/edge-label.ts"],"names":[],"mappings":"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"}
|
package/dist/edge.d.ts
CHANGED
|
@@ -47,6 +47,12 @@ export type AnchorRef = {
|
|
|
47
47
|
readonly index: number;
|
|
48
48
|
readonly t: number;
|
|
49
49
|
};
|
|
50
|
+
/**
|
|
51
|
+
* Runtime guard for `AnchorRef` values carried through untyped channels
|
|
52
|
+
* (e.g. snap-candidate `metadata`). Checks the discriminant only — the
|
|
53
|
+
* variants' payloads are trusted once the kind matches.
|
|
54
|
+
*/
|
|
55
|
+
export declare const isAnchorRef: (value: unknown) => value is AnchorRef;
|
|
50
56
|
export type LinkEndpoint = {
|
|
51
57
|
readonly kind: "point";
|
|
52
58
|
readonly position: Vec2;
|
|
@@ -81,6 +87,12 @@ export type LinkEndpoint = {
|
|
|
81
87
|
readonly kind: "floating";
|
|
82
88
|
readonly elementId: ElementId;
|
|
83
89
|
};
|
|
90
|
+
/**
|
|
91
|
+
* The element an endpoint is attached to, or `undefined` for a free
|
|
92
|
+
* `point` endpoint (which pins to a world position, not a shape). Lets
|
|
93
|
+
* callers derive link adjacency without switching on the endpoint kind.
|
|
94
|
+
*/
|
|
95
|
+
export declare const endpointElementId: (ep: LinkEndpoint) => ElementId | undefined;
|
|
84
96
|
/**
|
|
85
97
|
* How to draw the line between an edge's two endpoints.
|
|
86
98
|
* - `straight` — single segment endpoint-to-endpoint.
|
package/dist/edge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":"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"}
|
package/dist/edge.js
CHANGED
|
@@ -1,2 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Runtime guard for `AnchorRef` values carried through untyped channels
|
|
3
|
+
* (e.g. snap-candidate `metadata`). Checks the discriminant only — the
|
|
4
|
+
* variants' payloads are trusted once the kind matches.
|
|
5
|
+
*/
|
|
6
|
+
export const isAnchorRef = (value) => {
|
|
7
|
+
if (typeof value !== "object" || value === null)
|
|
8
|
+
return false;
|
|
9
|
+
const kind = value.kind;
|
|
10
|
+
return kind === "named" || kind === "ratio" || kind === "absolute" || kind === "edge";
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* The element an endpoint is attached to, or `undefined` for a free
|
|
14
|
+
* `point` endpoint (which pins to a world position, not a shape). Lets
|
|
15
|
+
* callers derive link adjacency without switching on the endpoint kind.
|
|
16
|
+
*/
|
|
17
|
+
export const endpointElementId = (ep) => ep.kind === "point" ? undefined : ep.elementId;
|
|
2
18
|
//# sourceMappingURL=edge.js.map
|
package/dist/edge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge.js","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"edge.js","sourceRoot":"","sources":["../src/edge.ts"],"names":[],"mappings":"AAkDA;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAsB,EAAE;IAChE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,IAAI,GAAI,KAAqC,CAAC,IAAI,CAAC;IACzD,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,CAAC;AACxF,CAAC,CAAC;AAyBF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAgB,EAAyB,EAAE,CAC3E,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
export type { Style, TextStyle, LineCap, LineJoin, TextAlign, TextBaseline, FontWeight, FontStyle, TextDecoration, StrokeAlign, Roundness, } from "./style.js";
|
|
2
2
|
export { getCornerRadius, strokeOutsideExtent } from "./style.js";
|
|
3
|
+
export type { TextRun } from "./text-runs.js";
|
|
4
|
+
export { runsToText, normalizeRuns, sliceRuns, applyStyleToRange } from "./text-runs.js";
|
|
3
5
|
export { ADAPTIVE_CORNER_RADIUS, PROPORTIONAL_CORNER_RADIUS } from "./constants.js";
|
|
4
|
-
export type { Element, ElementBase, BuiltinElement, RectangleElement, EllipseElement, PolygonElement, PathElement, PathCommand, TextElement, ImageElement, TemplateElement, GroupElement, FrameElement, BlockArrowElement, BrushElement, BrushPoint, ElementBounder, } from "./shape.js";
|
|
6
|
+
export type { Element, ElementBase, BuiltinElement, RectangleElement, EllipseElement, PolygonElement, PathElement, PathCommand, TextElement, ImageElement, ImageCrop, TemplateElement, GroupElement, FrameElement, BlockArrowElement, BrushElement, BrushPoint, ElementBounder, } from "./shape.js";
|
|
5
7
|
export type { Link, LinkEndpoint, LinkRouting, LinkArrowheads, LinkLabel, ArrowheadStyle, AnchorRef, NamedAnchor, StandardAnchor, } from "./edge.js";
|
|
6
|
-
export {
|
|
8
|
+
export { isAnchorRef, endpointElementId } from "./edge.js";
|
|
9
|
+
export { getLinkEndpointWorld, getLinkPath, findLinkAt, getElbowSegmentHandles, getLinkCurvePoints, getLinkCurveSegments, linkLabelBounds, getLinkWaypointMidpoints, getSelfLoopSpec, straightElbowFallback, } from "./edge-geometry.js";
|
|
10
|
+
export { estimateLinkLabelBox, linkLabelAnchor, linkLabelBoundsForPath, nudgeHandleOffLabel, pointAlongPath, projectPointToPathT, } from "./edge-label.js";
|
|
7
11
|
export { catmullRomBeziers, cubicWithEndTangents, flattenSegments, type BezierSegment, } from "./edge-curve.js";
|
|
8
12
|
export type { Layer } from "./layer.js";
|
|
9
13
|
export type { Viewport, GridStyle } from "./viewport.js";
|
|
10
14
|
export type { Scene } from "./scene.js";
|
|
11
15
|
export type { Patch } from "./patch.js";
|
|
12
16
|
export type { OperationResult } from "./operations.js";
|
|
13
|
-
export { isRectangle, isEllipse, isPolygon, isPath, isText, isImage, isTemplate, isGroup, isFrame, isBlockArrow, isBrush, registerBounder, getBounder, getElementLocalBounds, getElementWorldBounds, } from "./shape.js";
|
|
17
|
+
export { isRectangle, isEllipse, isPolygon, isPath, isText, isImage, isTemplate, isGroup, isFrame, isBlockArrow, isBrush, brushBodyColor, registerBounder, getBounder, getElementLocalBounds, getElementWorldBounds, } from "./shape.js";
|
|
18
|
+
export { brushOutline } from "./brush-outline.js";
|
|
14
19
|
export { registerRenderOverflow, getElementRenderBounds, type RenderOverflow, } from "./render-bounds.js";
|
|
15
20
|
export { setTextMeasurer, getTextMeasurer, type TextMeasurer, type TextMeasureOpts, } from "./text-measure.js";
|
|
16
21
|
export { STANDARD_ANCHORS, STANDARD_ANCHOR_RATIOS, CARDINAL_ANCHORS, getNamedAnchorLocal, getAnchorLocal, getAnchorWorld, getAnchorOutwardNormal, listAnchorsLocal, geometryDefaultAnchorsLocal, findNearestAnchor, snapExcludedAnchors, } from "./anchors.js";
|
|
@@ -38,7 +43,7 @@ export type { LayoutFn, LayoutSpec, GridLayoutSpec, StackLayoutSpec, WrapLayoutS
|
|
|
38
43
|
export { gridLayout, stackLayout, wrapLayout, measureWrap, treeLayout, getAutoLayoutSpec, runAutoLayout, } from "./layout.js";
|
|
39
44
|
export type { LayoutKindEntry } from "./layout-registry.js";
|
|
40
45
|
export { registerLayoutKind, unregisterLayoutKind, getLayoutKind, listLayoutKinds, } from "./layout-registry.js";
|
|
41
|
-
export { SNAP_PROBE_CULL_RADIUS, DEFAULT_GRID_SPACING, ELBOW_OBSTACLE_MARGIN, ELBOW_OBSTACLE_INTERIOR_EPSILON, FRAME_HEADER_HEIGHT, FRAME_HEADER_PADDING_X, FRAME_HEADER_FONT_SIZE, FALLBACK_SCENE_WIDTH, FALLBACK_SCENE_HEIGHT, } from "./constants.js";
|
|
46
|
+
export { SNAP_PROBE_CULL_RADIUS, DEFAULT_GRID_SPACING, ELBOW_OBSTACLE_MARGIN, ELBOW_OBSTACLE_INTERIOR_EPSILON, FRAME_HEADER_HEIGHT, FRAME_HEADER_PADDING_X, FRAME_HEADER_FONT_SIZE, FALLBACK_SCENE_WIDTH, FALLBACK_SCENE_HEIGHT, LINK_LABEL_DEFAULT_POSITION, LINK_LABEL_DEFAULT_FONT_SIZE, LINK_LABEL_MAX_WIDTH, LINK_LABEL_PAD_X, LINK_LABEL_PAD_Y, LINK_LABEL_LINE_HEIGHT, LINK_LABEL_END_CLEARANCE, LINK_LABEL_CHAR_WIDTH_FACTOR, } from "./constants.js";
|
|
42
47
|
export { elbowRoute, type ElbowRouteOptions } from "./elbow-router.js";
|
|
43
48
|
export { routeElbowLink, routeElbowPreview } from "./elbow-link.js";
|
|
44
49
|
export { type Heading, HEADING_RIGHT, HEADING_DOWN, HEADING_LEFT, HEADING_UP, headingIsHorizontal, headingsEqual, flipHeading, vectorToHeading, headingForPoint, headingForPointFromElement, headingForEdgePoint, } from "./heading.js";
|
|
@@ -46,5 +51,6 @@ export type { SceneElementDiff } from "./diff.js";
|
|
|
46
51
|
export { diffSceneElements } from "./diff.js";
|
|
47
52
|
export type { ConflictResolutionInput, ThreeWayMergeConflict, ThreeWayMergeOptions, ThreeWayMergeReport, } from "./three-way-merge.js";
|
|
48
53
|
export { mergeScenesThreeWay, applyConflictResolutions } from "./three-way-merge.js";
|
|
54
|
+
export { localToWorld, worldToLocal } from "./shape-transform.js";
|
|
49
55
|
export { isContainer, getContainerSpec, getDropZoneWorld, findContainerAt, expandDropZoneToFit, containerSizeForZone, registerContainerResolver, getDropZonesWorld, registerContainerZonesResolver, type ContainerSpec, type ContainerResolver, type ContainerZonesResolver, } from "./container.js";
|
|
50
56
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,KAAK,EACL,SAAS,EACT,OAAO,EACP,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACpF,YAAY,EACV,OAAO,EACP,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACX,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
export { getCornerRadius, strokeOutsideExtent } from "./style.js";
|
|
2
|
+
export { runsToText, normalizeRuns, sliceRuns, applyStyleToRange } from "./text-runs.js";
|
|
2
3
|
export { ADAPTIVE_CORNER_RADIUS, PROPORTIONAL_CORNER_RADIUS } from "./constants.js";
|
|
3
|
-
export {
|
|
4
|
+
export { isAnchorRef, endpointElementId } from "./edge.js";
|
|
5
|
+
export { getLinkEndpointWorld, getLinkPath, findLinkAt, getElbowSegmentHandles, getLinkCurvePoints, getLinkCurveSegments, linkLabelBounds, getLinkWaypointMidpoints, getSelfLoopSpec, straightElbowFallback, } from "./edge-geometry.js";
|
|
6
|
+
export { estimateLinkLabelBox, linkLabelAnchor, linkLabelBoundsForPath, nudgeHandleOffLabel, pointAlongPath, projectPointToPathT, } from "./edge-label.js";
|
|
4
7
|
export { catmullRomBeziers, cubicWithEndTangents, flattenSegments, } from "./edge-curve.js";
|
|
5
8
|
// Element helpers + bounder registry
|
|
6
|
-
export { isRectangle, isEllipse, isPolygon, isPath, isText, isImage, isTemplate, isGroup, isFrame, isBlockArrow, isBrush, registerBounder, getBounder, getElementLocalBounds, getElementWorldBounds, } from "./shape.js";
|
|
9
|
+
export { isRectangle, isEllipse, isPolygon, isPath, isText, isImage, isTemplate, isGroup, isFrame, isBlockArrow, isBrush, brushBodyColor, registerBounder, getBounder, getElementLocalBounds, getElementWorldBounds, } from "./shape.js";
|
|
10
|
+
export { brushOutline } from "./brush-outline.js";
|
|
7
11
|
export { registerRenderOverflow, getElementRenderBounds, } from "./render-bounds.js";
|
|
8
12
|
export { setTextMeasurer, getTextMeasurer, } from "./text-measure.js";
|
|
9
13
|
// Anchor helpers
|
|
@@ -32,13 +36,15 @@ export { getElementAccessibleName, registerAccessibleName } from "./a11y.js";
|
|
|
32
36
|
export { gridLayout, stackLayout, wrapLayout, measureWrap, treeLayout, getAutoLayoutSpec, runAutoLayout, } from "./layout.js";
|
|
33
37
|
export { registerLayoutKind, unregisterLayoutKind, getLayoutKind, listLayoutKinds, } from "./layout-registry.js";
|
|
34
38
|
// Tunable thresholds.
|
|
35
|
-
export { SNAP_PROBE_CULL_RADIUS, DEFAULT_GRID_SPACING, ELBOW_OBSTACLE_MARGIN, ELBOW_OBSTACLE_INTERIOR_EPSILON, FRAME_HEADER_HEIGHT, FRAME_HEADER_PADDING_X, FRAME_HEADER_FONT_SIZE, FALLBACK_SCENE_WIDTH, FALLBACK_SCENE_HEIGHT, } from "./constants.js";
|
|
39
|
+
export { SNAP_PROBE_CULL_RADIUS, DEFAULT_GRID_SPACING, ELBOW_OBSTACLE_MARGIN, ELBOW_OBSTACLE_INTERIOR_EPSILON, FRAME_HEADER_HEIGHT, FRAME_HEADER_PADDING_X, FRAME_HEADER_FONT_SIZE, FALLBACK_SCENE_WIDTH, FALLBACK_SCENE_HEIGHT, LINK_LABEL_DEFAULT_POSITION, LINK_LABEL_DEFAULT_FONT_SIZE, LINK_LABEL_MAX_WIDTH, LINK_LABEL_PAD_X, LINK_LABEL_PAD_Y, LINK_LABEL_LINE_HEIGHT, LINK_LABEL_END_CLEARANCE, LINK_LABEL_CHAR_WIDTH_FACTOR, } from "./constants.js";
|
|
36
40
|
// Elbow router — A*-based obstacle-avoiding 90° routing.
|
|
37
41
|
export { elbowRoute } from "./elbow-router.js";
|
|
38
42
|
export { routeElbowLink, routeElbowPreview } from "./elbow-link.js";
|
|
39
43
|
export { HEADING_RIGHT, HEADING_DOWN, HEADING_LEFT, HEADING_UP, headingIsHorizontal, headingsEqual, flipHeading, vectorToHeading, headingForPoint, headingForPointFromElement, headingForEdgePoint, } from "./heading.js";
|
|
40
44
|
export { diffSceneElements } from "./diff.js";
|
|
41
45
|
export { mergeScenesThreeWay, applyConflictResolutions } from "./three-way-merge.js";
|
|
46
|
+
// Shape local↔world transform helpers.
|
|
47
|
+
export { localToWorld, worldToLocal } from "./shape-transform.js";
|
|
42
48
|
// Container / drop-zone protocol.
|
|
43
49
|
export { isContainer, getContainerSpec, getDropZoneWorld, findContainerAt, expandDropZoneToFit, containerSizeForZone, registerContainerResolver, getDropZonesWorld, registerContainerZonesResolver, } from "./container.js";
|
|
44
50
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,4 +5,10 @@ import type { ElementBase } from "./shape.js";
|
|
|
5
5
|
* scale → rotate (about origin) → translate by `position`.
|
|
6
6
|
*/
|
|
7
7
|
export declare const localToWorld: (shape: ElementBase, local: Vec2) => Vec2;
|
|
8
|
+
/**
|
|
9
|
+
* Inverse of {@link localToWorld}: map a world-space point into the shape's
|
|
10
|
+
* local coordinates (un-translate → un-rotate → un-scale). Axis-aligned scale
|
|
11
|
+
* of 0 collapses that axis to 0 to avoid a divide-by-zero.
|
|
12
|
+
*/
|
|
13
|
+
export declare const worldToLocal: (shape: ElementBase, world: Vec2) => Vec2;
|
|
8
14
|
//# sourceMappingURL=shape-transform.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shape-transform.d.ts","sourceRoot":"","sources":["../src/shape-transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,WAAW,EAAE,OAAO,IAAI,KAAG,IAS9D,CAAC"}
|
|
1
|
+
{"version":3,"file":"shape-transform.d.ts","sourceRoot":"","sources":["../src/shape-transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,WAAW,EAAE,OAAO,IAAI,KAAG,IAS9D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,WAAW,EAAE,OAAO,IAAI,KAAG,IAY9D,CAAC"}
|
package/dist/shape-transform.js
CHANGED
|
@@ -12,4 +12,22 @@ export const localToWorld = (shape, local) => {
|
|
|
12
12
|
y: shape.position.y + (sx * sin + sy * cos),
|
|
13
13
|
};
|
|
14
14
|
};
|
|
15
|
+
/**
|
|
16
|
+
* Inverse of {@link localToWorld}: map a world-space point into the shape's
|
|
17
|
+
* local coordinates (un-translate → un-rotate → un-scale). Axis-aligned scale
|
|
18
|
+
* of 0 collapses that axis to 0 to avoid a divide-by-zero.
|
|
19
|
+
*/
|
|
20
|
+
export const worldToLocal = (shape, world) => {
|
|
21
|
+
const dx = world.x - shape.position.x;
|
|
22
|
+
const dy = world.y - shape.position.y;
|
|
23
|
+
const cos = Math.cos(shape.rotation);
|
|
24
|
+
const sin = Math.sin(shape.rotation);
|
|
25
|
+
// Rotate by -rotation.
|
|
26
|
+
const rx = dx * cos + dy * sin;
|
|
27
|
+
const ry = -dx * sin + dy * cos;
|
|
28
|
+
return {
|
|
29
|
+
x: shape.scale.x === 0 ? 0 : rx / shape.scale.x,
|
|
30
|
+
y: shape.scale.y === 0 ? 0 : ry / shape.scale.y,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
15
33
|
//# sourceMappingURL=shape-transform.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shape-transform.js","sourceRoot":"","sources":["../src/shape-transform.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAkB,EAAE,KAAW,EAAQ,EAAE;IACpE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO;QACL,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;QAC3C,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;KAC5C,CAAC;AACJ,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"shape-transform.js","sourceRoot":"","sources":["../src/shape-transform.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAkB,EAAE,KAAW,EAAQ,EAAE;IACpE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO;QACL,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;QAC3C,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;KAC5C,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAkB,EAAE,KAAW,EAAQ,EAAE;IACpE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,uBAAuB;IACvB,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;IAC/B,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;IAChC,OAAO;QACL,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;KAChD,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/shape.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { Bounds, FileId, LayerId, ElementId, Vec2 } from "@oh-just-another/
|
|
|
2
2
|
import type { FractionalIndex } from "fractional-keys";
|
|
3
3
|
import type { AnchorRef } from "./edge.js";
|
|
4
4
|
import type { Style, TextStyle } from "./style.js";
|
|
5
|
+
import type { TextRun } from "./text-runs.js";
|
|
5
6
|
/**
|
|
6
7
|
* Fields shared by every shape variant. `order` is a fractional-index string
|
|
7
8
|
* used for z-ordering within the parent layer — insertions are O(1) and never
|
|
@@ -146,6 +147,29 @@ export interface TextElement extends ElementBase {
|
|
|
146
147
|
/** Width budget for wrapping; `undefined` = single line. */
|
|
147
148
|
readonly maxWidth?: number;
|
|
148
149
|
readonly style: TextStyle;
|
|
150
|
+
/**
|
|
151
|
+
* Optional styled-run overlay for rich text. Each run styles a contiguous
|
|
152
|
+
* substring; `runs.map(r => r.text).join("")` MUST equal `text`, which
|
|
153
|
+
* stays the flat source of truth. Omitted (or empty) = uniform styling
|
|
154
|
+
* (renders exactly like a plain text block). See {@link TextRun}.
|
|
155
|
+
*/
|
|
156
|
+
readonly runs?: readonly TextRun[];
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Normalised crop rectangle for an {@link ImageElement}. All four
|
|
160
|
+
* values are fractions in `[0, 1]` of the source image's intrinsic
|
|
161
|
+
* dimensions: `{ x: 0, y: 0, width: 1, height: 1 }` shows the whole
|
|
162
|
+
* image (equivalent to omitting `crop`). The cropped source region is
|
|
163
|
+
* stretched to fill the element's `width` × `height` box, so cropping
|
|
164
|
+
* does not change the element's on-canvas footprint — only which part
|
|
165
|
+
* of the bitmap is visible. Being normalised keeps the crop stable when
|
|
166
|
+
* the backing file is swapped for a differently-sized copy.
|
|
167
|
+
*/
|
|
168
|
+
export interface ImageCrop {
|
|
169
|
+
readonly x: number;
|
|
170
|
+
readonly y: number;
|
|
171
|
+
readonly width: number;
|
|
172
|
+
readonly height: number;
|
|
149
173
|
}
|
|
150
174
|
export interface ImageElement extends ElementBase {
|
|
151
175
|
readonly type: "image";
|
|
@@ -155,6 +179,12 @@ export interface ImageElement extends ElementBase {
|
|
|
155
179
|
* `Scene.files` entry, which keeps scene.json small for large bitmaps.
|
|
156
180
|
*/
|
|
157
181
|
readonly src: string;
|
|
182
|
+
/**
|
|
183
|
+
* Optional normalised source-crop rectangle. Omitted = whole image.
|
|
184
|
+
* See {@link ImageCrop}. Additive: scenes and renderers that predate
|
|
185
|
+
* cropping simply ignore it and draw the full bitmap.
|
|
186
|
+
*/
|
|
187
|
+
readonly crop?: ImageCrop;
|
|
158
188
|
/**
|
|
159
189
|
* Id of the `BinaryFile` in `Scene.files` that backs this image.
|
|
160
190
|
* When present, hosts should resolve through the file registry
|
|
@@ -213,6 +243,31 @@ export interface BrushPoint {
|
|
|
213
243
|
export interface BrushElement extends ElementBase {
|
|
214
244
|
readonly type: "brush";
|
|
215
245
|
readonly points: readonly BrushPoint[];
|
|
246
|
+
/**
|
|
247
|
+
* A closed stroke: its ends meet, so the renderer fills the area enclosed by
|
|
248
|
+
* the centreline with `style.fill` (under the variable-width stroke body).
|
|
249
|
+
* Set on commit only when a fill colour is chosen and the stroke loops back
|
|
250
|
+
* on itself. Omitted (undefined) for ordinary open strokes.
|
|
251
|
+
*/
|
|
252
|
+
readonly closed?: boolean;
|
|
253
|
+
/**
|
|
254
|
+
* Raw input pressure (0–1) per point, aligned 1:1 with `points`. The baked
|
|
255
|
+
* `width` is derived from it (base width × pressure curve × taper), so a
|
|
256
|
+
* stroke can be regenerated with a different base width / thinning without
|
|
257
|
+
* re-capturing. Omitted on strokes committed before pressures were stored.
|
|
258
|
+
*/
|
|
259
|
+
readonly pressures?: readonly number[];
|
|
260
|
+
/**
|
|
261
|
+
* True when `pressures` were synthesised from pointer speed (mouse / touch
|
|
262
|
+
* without a real pressure channel) rather than read from the device. Lets a
|
|
263
|
+
* regeneration pass know whether re-simulating is appropriate.
|
|
264
|
+
*/
|
|
265
|
+
readonly simulatePressure?: boolean;
|
|
266
|
+
/**
|
|
267
|
+
* The brush base half-width (local px) the stroke was committed with — the
|
|
268
|
+
* value the pressure curve scaled toward. Omitted on legacy strokes.
|
|
269
|
+
*/
|
|
270
|
+
readonly baseWidth?: number;
|
|
216
271
|
}
|
|
217
272
|
/**
|
|
218
273
|
* Container shape that holds children via the shared `parentId` link.
|
|
@@ -279,6 +334,14 @@ export declare const isGroup: (s: ElementBase) => s is GroupElement;
|
|
|
279
334
|
export declare const isFrame: (s: ElementBase) => s is FrameElement;
|
|
280
335
|
export declare const isBlockArrow: (s: ElementBase) => s is BlockArrowElement;
|
|
281
336
|
export declare const isBrush: (s: ElementBase) => s is BrushElement;
|
|
337
|
+
/**
|
|
338
|
+
* The colour the variable-width brush BODY is painted with: the line colour
|
|
339
|
+
* (`style.stroke`, set by the drawing panel), falling back to `style.fill` for
|
|
340
|
+
* strokes authored before the stroke/fill split (their line lived in `fill`),
|
|
341
|
+
* then to opaque black. Shared by the committed-stroke renderer and the live
|
|
342
|
+
* overlay preview so the two never diverge.
|
|
343
|
+
*/
|
|
344
|
+
export declare const brushBodyColor: (style: Style) => string;
|
|
282
345
|
/**
|
|
283
346
|
* Computes the *local* bounds of a shape — its AABB in local coordinates,
|
|
284
347
|
* before `position`/`rotation`/`scale` are applied. The world AABB lives in
|
package/dist/shape.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../src/shape.ts"],"names":[],"mappings":"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"}
|
package/dist/shape.js
CHANGED
|
@@ -13,6 +13,14 @@ export const isGroup = (s) => s.type === "group";
|
|
|
13
13
|
export const isFrame = (s) => s.type === "frame";
|
|
14
14
|
export const isBlockArrow = (s) => s.type === "block-arrow";
|
|
15
15
|
export const isBrush = (s) => s.type === "brush";
|
|
16
|
+
/**
|
|
17
|
+
* The colour the variable-width brush BODY is painted with: the line colour
|
|
18
|
+
* (`style.stroke`, set by the drawing panel), falling back to `style.fill` for
|
|
19
|
+
* strokes authored before the stroke/fill split (their line lived in `fill`),
|
|
20
|
+
* then to opaque black. Shared by the committed-stroke renderer and the live
|
|
21
|
+
* overlay preview so the two never diverge.
|
|
22
|
+
*/
|
|
23
|
+
export const brushBodyColor = (style) => style.stroke ?? style.fill ?? "#000";
|
|
16
24
|
const bounderRegistry = new Map();
|
|
17
25
|
/**
|
|
18
26
|
* Register a bounder for a custom shape type. Plugins call this once at module
|