@gjermundgaraba-designs/plain-garden 0.7.0 → 0.9.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/DESIGN.md +8 -4
- package/dist/src/box/box.d.ts +1 -1
- package/dist/src/box/box.d.ts.map +1 -1
- package/dist/src/box/index.d.ts.map +1 -1
- package/dist/src/changes/changes.d.ts +1 -1
- package/dist/src/changes/changes.d.ts.map +1 -1
- package/dist/src/changes/index.d.ts.map +1 -1
- package/dist/src/{codeFigure/codeFigure.d.ts → code-figure/code-figure.d.ts} +3 -3
- package/dist/src/code-figure/code-figure.d.ts.map +1 -0
- package/dist/src/{codeFigure/codeFigure.js → code-figure/code-figure.js} +10 -5
- package/dist/src/code-figure/index.d.ts +3 -0
- package/dist/src/code-figure/index.d.ts.map +1 -0
- package/dist/src/code-figure/index.js +1 -0
- package/dist/src/copy/copy.d.ts.map +1 -1
- package/dist/src/copy/copy.js +1 -7
- package/dist/src/{copyButton/copyButton.d.ts → copy-button/copy-button.d.ts} +8 -2
- package/dist/src/copy-button/copy-button.d.ts.map +1 -0
- package/dist/src/copy-button/copy-button.js +37 -0
- package/dist/src/copy-button/index.d.ts +3 -0
- package/dist/src/copy-button/index.d.ts.map +1 -0
- package/dist/src/{copyButton → copy-button}/index.js +1 -1
- package/dist/src/diagram/diagram.d.ts +1 -1
- package/dist/src/diagram/diagram.d.ts.map +1 -1
- package/dist/src/diagram/diagram.js +10 -1
- package/dist/src/diagram/index.d.ts.map +1 -1
- package/dist/src/drawing/drawing.d.ts +3 -3
- package/dist/src/drawing/drawing.d.ts.map +1 -1
- package/dist/src/drawing/drawing.js +6 -5
- package/dist/src/drawing/fnv1a-utf16.d.ts +2 -0
- package/dist/src/drawing/fnv1a-utf16.d.ts.map +1 -0
- package/dist/src/drawing/fnv1a-utf16.js +8 -0
- package/dist/src/drawing/index.d.ts +1 -1
- package/dist/src/drawing/index.d.ts.map +1 -1
- package/dist/src/drawing/render.d.ts +4 -9
- package/dist/src/drawing/render.d.ts.map +1 -1
- package/dist/src/drawing/render.js +221 -200
- package/dist/src/drawing/scene.d.ts +11 -7
- package/dist/src/drawing/scene.d.ts.map +1 -1
- package/dist/src/drawing/scene.js +8 -5
- package/dist/src/{drawnTitle/drawnTitle.d.ts → drawn-title/drawn-title.d.ts} +3 -2
- package/dist/src/drawn-title/drawn-title.d.ts.map +1 -0
- package/dist/src/{drawnTitle/drawnTitle.js → drawn-title/drawn-title.js} +3 -3
- package/dist/src/drawn-title/index.d.ts +3 -0
- package/dist/src/drawn-title/index.d.ts.map +1 -0
- package/dist/src/drawn-title/index.js +1 -0
- package/dist/src/{figRef/figRef.d.ts → fig-ref/fig-ref.d.ts} +1 -1
- package/dist/src/fig-ref/fig-ref.d.ts.map +1 -0
- package/dist/src/{figRef/figRef.js → fig-ref/fig-ref.js} +1 -1
- package/dist/src/fig-ref/index.d.ts +3 -0
- package/dist/src/fig-ref/index.d.ts.map +1 -0
- package/dist/src/fig-ref/index.js +1 -0
- package/dist/src/figure/figure.d.ts +3 -3
- package/dist/src/figure/figure.d.ts.map +1 -1
- package/dist/src/figure/figure.js +4 -2
- package/dist/src/figure/figures.d.ts +0 -1
- package/dist/src/figure/figures.d.ts.map +1 -1
- package/dist/src/figure/figures.js +2 -2
- package/dist/src/figure/index.d.ts.map +1 -1
- package/dist/src/illustration/illustration.d.ts +1 -0
- package/dist/src/illustration/illustration.d.ts.map +1 -1
- package/dist/src/illustration/illustration.js +2 -2
- package/dist/src/illustration/index.d.ts.map +1 -1
- package/dist/src/index.d.ts +9 -9
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -9
- package/dist/src/links-here/index.d.ts +3 -0
- package/dist/src/links-here/index.d.ts.map +1 -0
- package/dist/src/links-here/index.js +1 -0
- package/dist/src/{linksHere/linksHere.d.ts → links-here/links-here.d.ts} +2 -2
- package/dist/src/links-here/links-here.d.ts.map +1 -0
- package/dist/src/{linksHere/linksHere.js → links-here/links-here.js} +2 -2
- package/dist/src/margin-note/index.d.ts +3 -0
- package/dist/src/margin-note/index.d.ts.map +1 -0
- package/dist/src/margin-note/index.js +1 -0
- package/dist/src/{marginNote/marginNote.d.ts → margin-note/margin-note.d.ts} +2 -1
- package/dist/src/margin-note/margin-note.d.ts.map +1 -0
- package/dist/src/{marginNote/marginNote.js → margin-note/margin-note.js} +4 -1
- package/dist/src/masthead/index.d.ts.map +1 -1
- package/dist/src/masthead/masthead.d.ts +1 -1
- package/dist/src/masthead/masthead.d.ts.map +1 -1
- package/dist/src/masthead/masthead.js +1 -3
- package/dist/src/note-header/index.d.ts +3 -0
- package/dist/src/note-header/index.d.ts.map +1 -0
- package/dist/src/note-header/index.js +1 -0
- package/dist/src/{noteHeader/noteHeader.d.ts → note-header/note-header.d.ts} +2 -1
- package/dist/src/note-header/note-header.d.ts.map +1 -0
- package/dist/src/{noteHeader/noteHeader.js → note-header/note-header.js} +12 -4
- package/dist/src/note-list/index.d.ts +3 -0
- package/dist/src/note-list/index.d.ts.map +1 -0
- package/dist/src/note-list/index.js +1 -0
- package/dist/src/{noteList/noteList.d.ts → note-list/note-list.d.ts} +2 -2
- package/dist/src/note-list/note-list.d.ts.map +1 -0
- package/dist/src/{noteList/noteList.js → note-list/note-list.js} +8 -3
- package/dist/src/ring/index.d.ts.map +1 -1
- package/dist/src/ring/ring.d.ts +1 -1
- package/dist/src/ring/ring.d.ts.map +1 -1
- package/dist/src/scheme/index.d.ts +1 -1
- package/dist/src/scheme/index.d.ts.map +1 -1
- package/dist/src/scheme/index.js +1 -1
- package/dist/src/scheme/{schemeSwitch.d.ts → scheme-switch.d.ts} +3 -2
- package/dist/src/scheme/scheme-switch.d.ts.map +1 -0
- package/dist/src/scheme/{schemeSwitch.js → scheme-switch.js} +7 -6
- package/dist/src/scheme/scheme.d.ts +0 -2
- package/dist/src/scheme/scheme.d.ts.map +1 -1
- package/dist/src/scheme/scheme.js +0 -2
- package/dist/src/scheme/switch.d.ts.map +1 -1
- package/dist/src/scheme/switch.js +12 -17
- package/dist/src/skip-link/index.d.ts +2 -0
- package/dist/src/skip-link/index.d.ts.map +1 -0
- package/dist/src/skip-link/index.js +1 -0
- package/dist/src/{skipLink/skipLink.d.ts → skip-link/skip-link.d.ts} +1 -1
- package/dist/src/skip-link/skip-link.d.ts.map +1 -0
- package/dist/src/{skipLink/skipLink.js → skip-link/skip-link.js} +1 -1
- package/dist/src/stage/index.d.ts.map +1 -1
- package/dist/src/stage/stage.d.ts +0 -2
- package/dist/src/stage/stage.d.ts.map +1 -1
- package/dist/src/stage/stage.js +0 -2
- package/dist/src/summary/index.d.ts.map +1 -1
- package/dist/src/summary/summary.d.ts +1 -1
- package/dist/src/summary/summary.d.ts.map +1 -1
- package/dist/src/time/time.d.ts +0 -3
- package/dist/src/time/time.d.ts.map +1 -1
- package/dist/src/time/time.js +0 -1
- package/package.json +13 -13
- package/src/box/box.ts +6 -3
- package/src/box/index.ts +1 -0
- package/src/changes/changes.ts +10 -4
- package/src/changes/index.ts +1 -0
- package/src/{codeFigure/codeFigure.ts → code-figure/code-figure.ts} +19 -8
- package/src/code-figure/index.ts +3 -0
- package/src/copy/copy.ts +8 -17
- package/src/copy-button/copy-button.ts +96 -0
- package/src/{copyButton → copy-button}/index.ts +4 -2
- package/src/diagram/diagram.ts +20 -4
- package/src/diagram/index.ts +1 -0
- package/src/drawing/drawing.ts +18 -8
- package/src/drawing/fnv1a-utf16.ts +9 -0
- package/src/drawing/index.ts +11 -1
- package/src/drawing/render.ts +460 -270
- package/src/drawing/scene.ts +20 -12
- package/src/{drawnTitle/drawnTitle.ts → drawn-title/drawn-title.ts} +8 -3
- package/src/drawn-title/index.ts +3 -0
- package/src/{figRef/figRef.ts → fig-ref/fig-ref.ts} +4 -2
- package/src/fig-ref/index.ts +3 -0
- package/src/figure/figure.ts +21 -12
- package/src/figure/figures.ts +3 -2
- package/src/figure/index.ts +2 -0
- package/src/illustration/illustration.ts +9 -4
- package/src/illustration/index.ts +1 -0
- package/src/index.ts +28 -9
- package/src/links-here/index.ts +3 -0
- package/src/{linksHere/linksHere.ts → links-here/links-here.ts} +12 -5
- package/src/margin-note/index.ts +3 -0
- package/src/{marginNote/marginNote.ts → margin-note/margin-note.ts} +9 -2
- package/src/masthead/index.ts +1 -0
- package/src/masthead/masthead.ts +12 -7
- package/src/note-header/index.ts +3 -0
- package/src/{noteHeader/noteHeader.ts → note-header/note-header.ts} +24 -8
- package/src/note-list/index.ts +3 -0
- package/src/{noteList/noteList.ts → note-list/note-list.ts} +17 -9
- package/src/plain-garden.css +9 -87
- package/src/ring/index.ts +1 -0
- package/src/ring/ring.ts +9 -5
- package/src/scheme/index.ts +3 -1
- package/src/scheme/{schemeSwitch.ts → scheme-switch.ts} +22 -11
- package/src/scheme/scheme.ts +3 -4
- package/src/scheme/switch.ts +9 -20
- package/src/skip-link/index.ts +1 -0
- package/src/stage/index.ts +1 -0
- package/src/stage/stage.ts +9 -6
- package/src/summary/index.ts +1 -0
- package/src/summary/summary.ts +5 -2
- package/src/time/time.ts +8 -5
- package/src/tokens.css +14 -61
- package/dist/src/codeFigure/codeFigure.d.ts.map +0 -1
- package/dist/src/codeFigure/index.d.ts +0 -3
- package/dist/src/codeFigure/index.d.ts.map +0 -1
- package/dist/src/codeFigure/index.js +0 -1
- package/dist/src/copyButton/copyButton.d.ts.map +0 -1
- package/dist/src/copyButton/copyButton.js +0 -30
- package/dist/src/copyButton/index.d.ts +0 -3
- package/dist/src/copyButton/index.d.ts.map +0 -1
- package/dist/src/drawnTitle/drawnTitle.d.ts.map +0 -1
- package/dist/src/drawnTitle/index.d.ts +0 -3
- package/dist/src/drawnTitle/index.d.ts.map +0 -1
- package/dist/src/drawnTitle/index.js +0 -1
- package/dist/src/figRef/figRef.d.ts.map +0 -1
- package/dist/src/figRef/index.d.ts +0 -3
- package/dist/src/figRef/index.d.ts.map +0 -1
- package/dist/src/figRef/index.js +0 -1
- package/dist/src/linksHere/index.d.ts +0 -3
- package/dist/src/linksHere/index.d.ts.map +0 -1
- package/dist/src/linksHere/index.js +0 -1
- package/dist/src/linksHere/linksHere.d.ts.map +0 -1
- package/dist/src/marginNote/index.d.ts +0 -3
- package/dist/src/marginNote/index.d.ts.map +0 -1
- package/dist/src/marginNote/index.js +0 -1
- package/dist/src/marginNote/marginNote.d.ts.map +0 -1
- package/dist/src/noteHeader/index.d.ts +0 -3
- package/dist/src/noteHeader/index.d.ts.map +0 -1
- package/dist/src/noteHeader/index.js +0 -1
- package/dist/src/noteHeader/noteHeader.d.ts.map +0 -1
- package/dist/src/noteList/index.d.ts +0 -3
- package/dist/src/noteList/index.d.ts.map +0 -1
- package/dist/src/noteList/index.js +0 -1
- package/dist/src/noteList/noteList.d.ts.map +0 -1
- package/dist/src/scheme/schemeSwitch.d.ts.map +0 -1
- package/dist/src/skipLink/index.d.ts +0 -2
- package/dist/src/skipLink/index.d.ts.map +0 -1
- package/dist/src/skipLink/index.js +0 -1
- package/dist/src/skipLink/skipLink.d.ts.map +0 -1
- package/src/codeFigure/index.ts +0 -2
- package/src/copyButton/copyButton.ts +0 -59
- package/src/drawnTitle/index.ts +0 -2
- package/src/figRef/index.ts +0 -2
- package/src/linksHere/index.ts +0 -2
- package/src/marginNote/index.ts +0 -2
- package/src/noteHeader/index.ts +0 -2
- package/src/noteList/index.ts +0 -2
- package/src/skipLink/index.ts +0 -1
- /package/src/{skipLink/skipLink.ts → skip-link/skip-link.ts} +0 -0
|
@@ -1,57 +1,50 @@
|
|
|
1
1
|
import { brandViewResult as __foldkitBrandViewResult } from 'foldkit/brand'
|
|
2
2
|
import { noteId } from "../figure/figures.js";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import { fnv1aUtf16 } from "./fnv1a-utf16.js";
|
|
4
|
+
import { HATCHES } from "./scene.js";
|
|
5
5
|
const MARK = {
|
|
6
|
-
/** How far construction lines run past a sharp shape's corners. */
|
|
7
6
|
reach: 22,
|
|
8
|
-
/** Coloured hatching: lines at 45°, this far apart. */
|
|
9
7
|
hatch: 4.5,
|
|
10
|
-
/** A centre line runs this far past a round thing's edge. */
|
|
11
8
|
centre: 14,
|
|
12
|
-
/** A measurement's extension lines start this far off the object and end this far past
|
|
13
|
-
the line; its label sits `lift` above the line. */
|
|
14
9
|
extension: { off: 4, past: 6 },
|
|
15
10
|
lift: 6,
|
|
16
|
-
/** A diameter's leader runs `knee` past the rim, then along a `shelf`. */
|
|
17
11
|
knee: 26,
|
|
18
12
|
shelf: 46,
|
|
19
|
-
/** A numbered part: the ring round its number, and the dot on the object. */
|
|
20
13
|
ring: 10,
|
|
21
14
|
dot: 2,
|
|
22
15
|
};
|
|
23
|
-
const hatched = (c) => __foldkitBrandViewResult((HATCHES.
|
|
24
|
-
|
|
16
|
+
const hatched = (c) => __foldkitBrandViewResult((HATCHES.some((h) => __foldkitBrandViewResult((h === c), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous"))), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#hatched");
|
|
17
|
+
const isNamed = (name) => __foldkitBrandViewResult((name !== undefined && name !== ""), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#isNamed");
|
|
25
18
|
const n = (v) => __foldkitBrandViewResult((String(Math.round(v * 10) / 10 || 0)), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#n");
|
|
26
|
-
/** How finely a path's points are kept, as steps per unit: tenths for a pencil stroke,
|
|
27
|
-
whose width is about a unit and would go lumpy coarser, for a curve, whose facets show
|
|
28
|
-
as soon as its points move, and for anything small; whole units for a big sharp shape,
|
|
29
|
-
a few corners at least 40 units apart each way, where half a unit does not show. */
|
|
30
19
|
const FINE = 10;
|
|
31
20
|
const COARSE = 1;
|
|
32
21
|
const grain = (pts) => {
|
|
33
22
|
if (pts.length > 8) {
|
|
34
23
|
return __foldkitBrandViewResult((FINE), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#grain");
|
|
35
24
|
}
|
|
36
|
-
const xs = pts.map((p) => __foldkitBrandViewResult((p[0]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous"));
|
|
37
|
-
const ys = pts.map((p) => __foldkitBrandViewResult((p[1]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~
|
|
25
|
+
const xs = pts.map((p) => __foldkitBrandViewResult((p[0]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~2"));
|
|
26
|
+
const ys = pts.map((p) => __foldkitBrandViewResult((p[1]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~3"));
|
|
38
27
|
const small = Math.min(Math.max(...xs) - Math.min(...xs), Math.max(...ys) - Math.min(...ys));
|
|
39
28
|
return __foldkitBrandViewResult((small >= 40 ? COARSE : FINE), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#grain");
|
|
40
29
|
};
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const grid = pts.map(([x, y]) => __foldkitBrandViewResult(([
|
|
45
|
-
|
|
30
|
+
const ORIGIN = [0, 0];
|
|
31
|
+
const pt = (pts, i) => __foldkitBrandViewResult((pts[i] ?? ORIGIN), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#pt");
|
|
32
|
+
const path = (pts, closed = true, q = FINE) => {
|
|
33
|
+
const grid = pts.map(([x, y]) => __foldkitBrandViewResult(([
|
|
34
|
+
Math.round(x * q),
|
|
35
|
+
Math.round(y * q),
|
|
36
|
+
]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~4"));
|
|
46
37
|
const steps = [];
|
|
47
|
-
for (let i = 1; i < grid.length; i
|
|
38
|
+
for (let i = 1; i < grid.length; i += 1) {
|
|
48
39
|
const [here, before] = [pt(grid, i), pt(grid, i - 1)];
|
|
49
40
|
const [dx, dy] = [here[0] - before[0], here[1] - before[1]];
|
|
50
41
|
if (!dx && !dy) {
|
|
51
42
|
continue;
|
|
52
43
|
}
|
|
53
|
-
const last = steps
|
|
54
|
-
if (last &&
|
|
44
|
+
const last = steps.at(-1);
|
|
45
|
+
if (last &&
|
|
46
|
+
last[0] * dy === last[1] * dx &&
|
|
47
|
+
last[0] * dx + last[1] * dy > 0) {
|
|
55
48
|
last[0] += dx;
|
|
56
49
|
last[1] += dy;
|
|
57
50
|
}
|
|
@@ -60,19 +53,21 @@ function path(pts, closed = true, q = FINE) {
|
|
|
60
53
|
}
|
|
61
54
|
}
|
|
62
55
|
const num = (v) => __foldkitBrandViewResult((String(v / q || 0)
|
|
63
|
-
.replace(/^0
|
|
64
|
-
.replace(/^-0
|
|
56
|
+
.replace(/^0\./u, ".")
|
|
57
|
+
.replace(/^-0\./u, "-.")), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#num");
|
|
65
58
|
let d = "";
|
|
66
59
|
let cmd = "";
|
|
67
60
|
let prev = "";
|
|
68
|
-
// A command letter is written only when it changes. A number needs a space before it
|
|
69
|
-
// unless a letter, its own minus, or its point after a number with a point divides it.
|
|
70
61
|
const put = (letter, ...vs) => {
|
|
71
62
|
if (letter !== cmd) {
|
|
72
|
-
|
|
63
|
+
cmd = letter;
|
|
64
|
+
prev = letter;
|
|
65
|
+
d += letter;
|
|
73
66
|
}
|
|
74
67
|
for (const v of vs.map(num)) {
|
|
75
|
-
const divided = /[a-z]$/
|
|
68
|
+
const divided = /[a-z]$/iu.test(prev) ||
|
|
69
|
+
v.startsWith("-") ||
|
|
70
|
+
(v.startsWith(".") && prev.includes("."));
|
|
76
71
|
d += (divided ? "" : " ") + v;
|
|
77
72
|
prev = v;
|
|
78
73
|
}
|
|
@@ -82,60 +77,51 @@ function path(pts, closed = true, q = FINE) {
|
|
|
82
77
|
if (!dy) {
|
|
83
78
|
put("h", dx);
|
|
84
79
|
}
|
|
85
|
-
else if (
|
|
86
|
-
put("
|
|
80
|
+
else if (dx) {
|
|
81
|
+
put("l", dx, dy);
|
|
87
82
|
}
|
|
88
83
|
else {
|
|
89
|
-
put("
|
|
84
|
+
put("v", dy);
|
|
90
85
|
}
|
|
91
86
|
}
|
|
92
87
|
return __foldkitBrandViewResult((d + (closed ? "z" : "")), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#path");
|
|
93
|
-
}
|
|
88
|
+
};
|
|
94
89
|
const esc = (s) => __foldkitBrandViewResult((s
|
|
95
|
-
.
|
|
96
|
-
.
|
|
97
|
-
.
|
|
98
|
-
.
|
|
99
|
-
.
|
|
90
|
+
.replaceAll("&", "&")
|
|
91
|
+
.replaceAll("<", "<")
|
|
92
|
+
.replaceAll(">", ">")
|
|
93
|
+
.replaceAll('"', """)
|
|
94
|
+
.replaceAll("'", "'")), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#esc");
|
|
100
95
|
const unit = (dx, dy) => {
|
|
101
96
|
const l = Math.hypot(dx, dy) || 1;
|
|
102
97
|
return __foldkitBrandViewResult(([dx / l, dy / l]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#unit");
|
|
103
98
|
};
|
|
104
99
|
const dist = (a, b) => __foldkitBrandViewResult((Math.hypot(b[0] - a[0], b[1] - a[1])), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#dist");
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
const pt = (pts, i) => __foldkitBrandViewResult((pts[i] ?? ORIGIN), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#pt");
|
|
108
|
-
/** A text's 32-bit FNV-1a hash. */
|
|
109
|
-
function fnv(text) {
|
|
110
|
-
let h = 2166136261;
|
|
111
|
-
for (let i = 0; i < text.length; i++) {
|
|
112
|
-
h = Math.imul(h ^ text.charCodeAt(i), 16777619);
|
|
113
|
-
}
|
|
114
|
-
return __foldkitBrandViewResult((h >>> 0), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#fnv");
|
|
115
|
-
}
|
|
116
|
-
function seeded(text) {
|
|
117
|
-
let s = fnv(text);
|
|
100
|
+
const seeded = (text) => {
|
|
101
|
+
let s = fnv1aUtf16(text);
|
|
118
102
|
const next = () => {
|
|
119
|
-
s = (s +
|
|
103
|
+
s = (s + 0x6d_2b_79_f5) >>> 0;
|
|
120
104
|
let t = s;
|
|
121
105
|
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
122
106
|
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
123
|
-
return __foldkitBrandViewResult((((t ^ (t >>> 14)) >>> 0) /
|
|
107
|
+
return __foldkitBrandViewResult((((t ^ (t >>> 14)) >>> 0) / 4_294_967_296), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#next");
|
|
124
108
|
};
|
|
125
109
|
return __foldkitBrandViewResult(({ next, between: (a, b) => __foldkitBrandViewResult((a + (b - a) * next()), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#between") }), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#seeded");
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
function densify(pts, closed, step = 4) {
|
|
110
|
+
};
|
|
111
|
+
const densify = (pts, closed, step = 4) => {
|
|
129
112
|
const out = [];
|
|
130
113
|
const corners = [];
|
|
131
114
|
const segs = closed ? pts.length : pts.length - 1;
|
|
132
|
-
for (let i = 0; i < segs; i
|
|
115
|
+
for (let i = 0; i < segs; i += 1) {
|
|
133
116
|
const a = pt(pts, i);
|
|
134
117
|
const b = pt(pts, (i + 1) % pts.length);
|
|
135
118
|
corners.push(out.length);
|
|
136
119
|
const k = Math.max(1, Math.floor(dist(a, b) / step));
|
|
137
|
-
for (let j = 0; j < k; j
|
|
138
|
-
out.push([
|
|
120
|
+
for (let j = 0; j < k; j += 1) {
|
|
121
|
+
out.push([
|
|
122
|
+
a[0] + ((b[0] - a[0]) * j) / k,
|
|
123
|
+
a[1] + ((b[1] - a[1]) * j) / k,
|
|
124
|
+
]);
|
|
139
125
|
}
|
|
140
126
|
}
|
|
141
127
|
if (!closed) {
|
|
@@ -143,38 +129,51 @@ function densify(pts, closed, step = 4) {
|
|
|
143
129
|
out.push(pt(pts, pts.length - 1));
|
|
144
130
|
}
|
|
145
131
|
return __foldkitBrandViewResult(({ out, corners }), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#densify");
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
function turn(pts, degrees = 0) {
|
|
132
|
+
};
|
|
133
|
+
const turn = (pts, degrees = 0) => {
|
|
149
134
|
if (!degrees) {
|
|
150
135
|
return __foldkitBrandViewResult((pts), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#turn");
|
|
151
136
|
}
|
|
152
137
|
const c = [
|
|
153
|
-
pts.reduce((s, p) => __foldkitBrandViewResult((s + p[0]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~
|
|
154
|
-
pts.reduce((s, p) => __foldkitBrandViewResult((s + p[1]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~
|
|
138
|
+
pts.reduce((s, p) => __foldkitBrandViewResult((s + p[0]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~5"), 0) / pts.length,
|
|
139
|
+
pts.reduce((s, p) => __foldkitBrandViewResult((s + p[1]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~6"), 0) / pts.length,
|
|
155
140
|
];
|
|
156
141
|
const a = (degrees * Math.PI) / 180;
|
|
157
142
|
const [sin, cos] = [Math.sin(a), Math.cos(a)];
|
|
158
143
|
return __foldkitBrandViewResult((pts.map(([x, y]) => __foldkitBrandViewResult(([
|
|
159
144
|
c[0] + (x - c[0]) * cos - (y - c[1]) * sin,
|
|
160
145
|
c[1] + (x - c[0]) * sin + (y - c[1]) * cos,
|
|
161
|
-
]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~
|
|
162
|
-
}
|
|
163
|
-
|
|
146
|
+
]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~7"))), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#turn");
|
|
147
|
+
};
|
|
148
|
+
const smooth = (ctrl, closed, per = 14) => {
|
|
164
149
|
const m = ctrl.length;
|
|
165
|
-
const at = (i) => __foldkitBrandViewResult((closed
|
|
150
|
+
const at = (i) => __foldkitBrandViewResult((closed
|
|
151
|
+
? pt(ctrl, ((i % m) + m) % m)
|
|
152
|
+
: pt(ctrl, Math.min(Math.max(i, 0), m - 1))), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#at");
|
|
166
153
|
const out = [];
|
|
167
154
|
const segs = closed ? m : m - 1;
|
|
168
|
-
for (let i = 0; i < segs; i
|
|
155
|
+
for (let i = 0; i < segs; i += 1) {
|
|
169
156
|
const [p0, p1, p2, p3] = [at(i - 1), at(i), at(i + 1), at(i + 2)];
|
|
170
|
-
const c1 = [
|
|
171
|
-
|
|
172
|
-
|
|
157
|
+
const c1 = [
|
|
158
|
+
p1[0] + (p2[0] - p0[0]) / 6,
|
|
159
|
+
p1[1] + (p2[1] - p0[1]) / 6,
|
|
160
|
+
];
|
|
161
|
+
const c2 = [
|
|
162
|
+
p2[0] - (p3[0] - p1[0]) / 6,
|
|
163
|
+
p2[1] - (p3[1] - p1[1]) / 6,
|
|
164
|
+
];
|
|
165
|
+
for (let j = 0; j < per; j += 1) {
|
|
173
166
|
const t = j / per;
|
|
174
167
|
const u = 1 - t;
|
|
175
168
|
out.push([
|
|
176
|
-
u ** 3 * p1[0] +
|
|
177
|
-
|
|
169
|
+
u ** 3 * p1[0] +
|
|
170
|
+
3 * u * u * t * c1[0] +
|
|
171
|
+
3 * u * t * t * c2[0] +
|
|
172
|
+
t ** 3 * p2[0],
|
|
173
|
+
u ** 3 * p1[1] +
|
|
174
|
+
3 * u * u * t * c1[1] +
|
|
175
|
+
3 * u * t * t * c2[1] +
|
|
176
|
+
t ** 3 * p2[1],
|
|
178
177
|
]);
|
|
179
178
|
}
|
|
180
179
|
}
|
|
@@ -182,20 +181,17 @@ function smooth(ctrl, closed, per = 14) {
|
|
|
182
181
|
out.push(pt(ctrl, m - 1));
|
|
183
182
|
}
|
|
184
183
|
return __foldkitBrandViewResult((out), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#smooth");
|
|
185
|
-
}
|
|
186
|
-
|
|
184
|
+
};
|
|
185
|
+
const arc = (cx, cy, rx, ry, from, to, close) => {
|
|
187
186
|
const k = Math.max(24, Math.floor(Math.abs(to - from) / 5));
|
|
188
187
|
const pts = [];
|
|
189
|
-
for (let i = 0; i < k + (close ? 0 : 1); i
|
|
188
|
+
for (let i = 0; i < k + (close ? 0 : 1); i += 1) {
|
|
190
189
|
const a = ((from + ((to - from) * i) / k) * Math.PI) / 180;
|
|
191
190
|
pts.push([cx + rx * Math.cos(a), cy + ry * Math.sin(a)]);
|
|
192
191
|
}
|
|
193
192
|
return __foldkitBrandViewResult((pts), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#arc");
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
moved with their groups, into `marks`. `k` is how much the groups round them scale;
|
|
197
|
-
`names` holds every group name met so far in the scene. */
|
|
198
|
-
function build(shapes, marks, T = (p) => __foldkitBrandViewResult((p), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~7"), k = 1, group, names = new Set()) {
|
|
193
|
+
};
|
|
194
|
+
const build = (shapes, marks, T = (p) => __foldkitBrandViewResult((p), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~8"), k = 1, group, names = new Set()) => {
|
|
199
195
|
const out = [];
|
|
200
196
|
for (const s of shapes) {
|
|
201
197
|
if ("part" in s) {
|
|
@@ -203,7 +199,11 @@ function build(shapes, marks, T = (p) => __foldkitBrandViewResult((p), "@gjermun
|
|
|
203
199
|
continue;
|
|
204
200
|
}
|
|
205
201
|
if ("measure" in s) {
|
|
206
|
-
marks.push({
|
|
202
|
+
marks.push({
|
|
203
|
+
...s,
|
|
204
|
+
measure: [T(s.measure[0]), T(s.measure[1])],
|
|
205
|
+
offset: s.offset * k,
|
|
206
|
+
});
|
|
207
207
|
continue;
|
|
208
208
|
}
|
|
209
209
|
if ("diameter" in s || "centre" in s) {
|
|
@@ -213,19 +213,18 @@ function build(shapes, marks, T = (p) => __foldkitBrandViewResult((p), "@gjermun
|
|
|
213
213
|
continue;
|
|
214
214
|
}
|
|
215
215
|
if ("group" in s) {
|
|
216
|
-
if (s.name
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
216
|
+
if (isNamed(s.name)) {
|
|
217
|
+
if (isNamed(group)) {
|
|
218
|
+
throw new Error(`Group "${s.name}" is inside group "${group}": named groups do not nest.`);
|
|
219
|
+
}
|
|
220
|
+
if (!/^[a-z0-9-]+$/u.test(s.name)) {
|
|
221
|
+
throw new Error(`Group "${s.name}": name it in lower-case letters, digits and hyphens.`);
|
|
222
|
+
}
|
|
223
|
+
if (names.has(s.name)) {
|
|
224
|
+
throw new Error(`Two groups are named "${s.name}".`);
|
|
225
|
+
}
|
|
226
226
|
names.add(s.name);
|
|
227
227
|
}
|
|
228
|
-
// The group's own origin goes to `place`, and the group scales about it.
|
|
229
228
|
const [ox, oy] = s.origin ?? [0, 0];
|
|
230
229
|
const [px, py] = s.place ?? [ox, oy];
|
|
231
230
|
const by = s.scale ?? 1;
|
|
@@ -241,12 +240,26 @@ function build(shapes, marks, T = (p) => __foldkitBrandViewResult((p), "@gjermun
|
|
|
241
240
|
out.push({ pts: d, closed, corners, anchors: pts.map(T), ...look });
|
|
242
241
|
};
|
|
243
242
|
if ("text" in s) {
|
|
244
|
-
out.push({
|
|
243
|
+
out.push({
|
|
244
|
+
...look,
|
|
245
|
+
pts: [T(s.at)],
|
|
246
|
+
closed: false,
|
|
247
|
+
corners: [],
|
|
248
|
+
anchors: [],
|
|
249
|
+
text: s,
|
|
250
|
+
});
|
|
245
251
|
}
|
|
246
252
|
else if ("arrow" in s) {
|
|
247
253
|
const a = s.arrow.map(T);
|
|
248
254
|
const shaft = a.length === 2 ? densify(a, false).out : smooth(a, false);
|
|
249
|
-
out.push({
|
|
255
|
+
out.push({
|
|
256
|
+
...look,
|
|
257
|
+
pts: shaft,
|
|
258
|
+
closed: false,
|
|
259
|
+
corners: [],
|
|
260
|
+
anchors: [],
|
|
261
|
+
arrow: true,
|
|
262
|
+
});
|
|
250
263
|
}
|
|
251
264
|
else if ("rect" in s) {
|
|
252
265
|
const [x, y, w, h] = s.rect;
|
|
@@ -257,10 +270,7 @@ function build(shapes, marks, T = (p) => __foldkitBrandViewResult((p), "@gjermun
|
|
|
257
270
|
[x + w, y + h],
|
|
258
271
|
[x, y + h],
|
|
259
272
|
];
|
|
260
|
-
if (
|
|
261
|
-
cornered(turn(box, s.turn), true);
|
|
262
|
-
}
|
|
263
|
-
else {
|
|
273
|
+
if (r) {
|
|
264
274
|
const pts = [];
|
|
265
275
|
const arcs = [
|
|
266
276
|
[x + w - r, y + r, -90],
|
|
@@ -269,7 +279,7 @@ function build(shapes, marks, T = (p) => __foldkitBrandViewResult((p), "@gjermun
|
|
|
269
279
|
[x + r, y + r, 180],
|
|
270
280
|
];
|
|
271
281
|
for (const [cx, cy, a0] of arcs) {
|
|
272
|
-
for (let j = 0; j < 9; j
|
|
282
|
+
for (let j = 0; j < 9; j += 1) {
|
|
273
283
|
pts.push([
|
|
274
284
|
cx + r * Math.cos(((a0 + j * 10) * Math.PI) / 180),
|
|
275
285
|
cy + r * Math.sin(((a0 + j * 10) * Math.PI) / 180),
|
|
@@ -278,6 +288,9 @@ function build(shapes, marks, T = (p) => __foldkitBrandViewResult((p), "@gjermun
|
|
|
278
288
|
}
|
|
279
289
|
plain(densify(turn(pts, s.turn), true).out, true);
|
|
280
290
|
}
|
|
291
|
+
else {
|
|
292
|
+
cornered(turn(box, s.turn), true);
|
|
293
|
+
}
|
|
281
294
|
}
|
|
282
295
|
else if ("circle" in s) {
|
|
283
296
|
plain(arc(s.circle[0], s.circle[1], s.circle[2], s.circle[2], 0, 360, true), true);
|
|
@@ -285,13 +298,13 @@ function build(shapes, marks, T = (p) => __foldkitBrandViewResult((p), "@gjermun
|
|
|
285
298
|
else if ("ellipse" in s) {
|
|
286
299
|
const [cx, cy, rx, ry] = s.ellipse;
|
|
287
300
|
const whole = s.from === undefined && s.to === undefined;
|
|
288
|
-
plain(arc(cx, cy, rx, ry, s.from ?? 0, s.to ?? 360, whole), whole ||
|
|
301
|
+
plain(arc(cx, cy, rx, ry, s.from ?? 0, s.to ?? 360, whole), whole || s.closed === true);
|
|
289
302
|
}
|
|
290
303
|
else if ("poly" in s) {
|
|
291
|
-
cornered(turn(s.poly, s.turn),
|
|
304
|
+
cornered(turn(s.poly, s.turn), s.open !== true);
|
|
292
305
|
}
|
|
293
306
|
else if ("curve" in s) {
|
|
294
|
-
plain(smooth(s.curve,
|
|
307
|
+
plain(smooth(s.curve, s.closed === true), s.closed === true);
|
|
295
308
|
}
|
|
296
309
|
else if ("dome" in s) {
|
|
297
310
|
const [cx, cy, rx, ry] = s.dome;
|
|
@@ -316,38 +329,44 @@ function build(shapes, marks, T = (p) => __foldkitBrandViewResult((p), "@gjermun
|
|
|
316
329
|
}
|
|
317
330
|
}
|
|
318
331
|
return __foldkitBrandViewResult((out), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#build");
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/** A pencil stroke along pts: a filled shape, thick in the middle, tapering at both ends,
|
|
322
|
-
wandering slowly off the true line and running a little past where it should stop. */
|
|
323
|
-
function taper(src, width, rand, over) {
|
|
332
|
+
};
|
|
333
|
+
const taper = (src, width, rand, over) => {
|
|
324
334
|
const wander = 0.9;
|
|
325
335
|
const floor = 0.45;
|
|
326
336
|
if (src.length < 2) {
|
|
327
337
|
return __foldkitBrandViewResult((""), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#taper");
|
|
328
338
|
}
|
|
329
|
-
const pts = src
|
|
339
|
+
const pts = [...src];
|
|
330
340
|
const [first, second] = [pt(pts, 0), pt(pts, 1)];
|
|
331
|
-
const [last, penultimate] = [
|
|
341
|
+
const [last, penultimate] = [
|
|
342
|
+
pt(pts, pts.length - 1),
|
|
343
|
+
pt(pts, pts.length - 2),
|
|
344
|
+
];
|
|
332
345
|
const t0 = unit(second[0] - first[0], second[1] - first[1]);
|
|
333
346
|
const t1 = unit(last[0] - penultimate[0], last[1] - penultimate[1]);
|
|
334
347
|
pts[0] = [first[0] - t0[0] * over, first[1] - t0[1] * over];
|
|
335
348
|
pts[pts.length - 1] = [last[0] + t1[0] * over, last[1] + t1[1] * over];
|
|
336
349
|
const s = [0];
|
|
337
|
-
for (let i = 1; i < pts.length; i
|
|
350
|
+
for (let i = 1; i < pts.length; i += 1) {
|
|
338
351
|
s.push((s[i - 1] ?? 0) + dist(pt(pts, i - 1), pt(pts, i)));
|
|
339
352
|
}
|
|
340
|
-
const
|
|
341
|
-
const
|
|
353
|
+
const length = s.at(-1) ?? 0;
|
|
354
|
+
const L = length === 0 ? 1 : length;
|
|
355
|
+
const [p1, p2, p3] = [
|
|
356
|
+
rand.between(0, 6),
|
|
357
|
+
rand.between(0, 6),
|
|
358
|
+
rand.between(0, 6),
|
|
359
|
+
];
|
|
342
360
|
const left = [];
|
|
343
361
|
const right = [];
|
|
344
|
-
pts.
|
|
362
|
+
for (const [i, p] of pts.entries()) {
|
|
345
363
|
const a = pt(pts, Math.max(i - 1, 0));
|
|
346
364
|
const b = pt(pts, Math.min(i + 1, pts.length - 1));
|
|
347
365
|
const along = s[i] ?? 0;
|
|
348
366
|
const [tx, ty] = unit(b[0] - a[0], b[1] - a[1]);
|
|
349
367
|
const [nx, ny] = [-ty, tx];
|
|
350
|
-
const j = wander *
|
|
368
|
+
const j = wander *
|
|
369
|
+
(0.6 * Math.sin(along / 37 + p1) + 0.4 * Math.sin(along / 97 + p2));
|
|
351
370
|
let press = floor + (1 - floor) * Math.max(0, Math.sin((Math.PI * along) / L)) ** 0.5;
|
|
352
371
|
if (L < 40) {
|
|
353
372
|
press = Math.max(press, 0.55);
|
|
@@ -356,11 +375,10 @@ function taper(src, width, rand, over) {
|
|
|
356
375
|
const [cx, cy] = [p[0] + nx * j, p[1] + ny * j];
|
|
357
376
|
left.push([cx + nx * w, cy + ny * w]);
|
|
358
377
|
right.push([cx - nx * w, cy - ny * w]);
|
|
359
|
-
}
|
|
360
|
-
return __foldkitBrandViewResult((path([...left, ...right.
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
function strokesOf(b, rand) {
|
|
378
|
+
}
|
|
379
|
+
return __foldkitBrandViewResult((path([...left, ...right.toReversed()])), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#taper");
|
|
380
|
+
};
|
|
381
|
+
const strokesOf = (b, rand) => {
|
|
364
382
|
if (b.closed && b.corners.length >= 3) {
|
|
365
383
|
const c = [...b.corners, b.pts.length];
|
|
366
384
|
return __foldkitBrandViewResult((c.slice(0, -1).map((start, i) => {
|
|
@@ -375,25 +393,26 @@ function strokesOf(b, rand) {
|
|
|
375
393
|
]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#strokesOf");
|
|
376
394
|
}
|
|
377
395
|
return __foldkitBrandViewResult(([b.pts]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#strokesOf");
|
|
378
|
-
}
|
|
379
|
-
/** A shape's own points: a sharp shape's corners rather than the points the pencil follows
|
|
380
|
-
between them. */
|
|
396
|
+
};
|
|
381
397
|
const exact = (b) => (__foldkitBrandViewResult((b.corners.length ? b.anchors : b.pts), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#exact"));
|
|
382
|
-
|
|
383
|
-
function dashes(pts, pattern) {
|
|
398
|
+
const dashes = (pts, pattern) => {
|
|
384
399
|
const out = [];
|
|
385
400
|
let [i, left, on, run] = [0, pattern[0] ?? 0, true, [pt(pts, 0)]];
|
|
386
|
-
for (let j = 1; j < pts.length; j
|
|
401
|
+
for (let j = 1; j < pts.length; j += 1) {
|
|
387
402
|
let a = pt(pts, j - 1);
|
|
388
403
|
const b = pt(pts, j);
|
|
389
404
|
let seg = dist(a, b);
|
|
390
405
|
while (seg > left) {
|
|
391
|
-
const m = [
|
|
406
|
+
const m = [
|
|
407
|
+
a[0] + ((b[0] - a[0]) * left) / seg,
|
|
408
|
+
a[1] + ((b[1] - a[1]) * left) / seg,
|
|
409
|
+
];
|
|
392
410
|
if (on) {
|
|
393
411
|
out.push([...run, m]);
|
|
394
412
|
}
|
|
395
413
|
[run, a, seg, on] = [[m], m, seg - left, !on];
|
|
396
|
-
|
|
414
|
+
i += 1;
|
|
415
|
+
left = pattern[i % pattern.length] ?? 0;
|
|
397
416
|
}
|
|
398
417
|
left -= seg;
|
|
399
418
|
if (on) {
|
|
@@ -404,18 +423,24 @@ function dashes(pts, pattern) {
|
|
|
404
423
|
out.push(run);
|
|
405
424
|
}
|
|
406
425
|
return __foldkitBrandViewResult((out), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#dashes");
|
|
407
|
-
}
|
|
408
|
-
// A centre line is dash-dot; a dashed line (a level, an axis, what is hidden) is dashes.
|
|
409
|
-
// The pencil draws the pattern stroke by stroke; the ruler sets it as a dash array.
|
|
426
|
+
};
|
|
410
427
|
const DASH = {
|
|
411
428
|
centre: { pencil: [14, 4, 2, 4], ruler: "14 3 2 3", weight: 0.6 },
|
|
412
429
|
dashed: { pencil: [5, 3], ruler: "5 3", weight: 0.8 },
|
|
413
430
|
};
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
431
|
+
const OVERRUN = {
|
|
432
|
+
outline: 8,
|
|
433
|
+
mark: 2,
|
|
434
|
+
construction: 1,
|
|
435
|
+
ring: 1,
|
|
436
|
+
arrow: 0.5,
|
|
437
|
+
dash: 0.3,
|
|
438
|
+
};
|
|
439
|
+
const pencil = (rand) => {
|
|
417
440
|
const out = [];
|
|
418
|
-
const stroke = (pts, w, cls, over) =>
|
|
441
|
+
const stroke = (pts, w, cls, over) => {
|
|
442
|
+
out.push(`<path class="${cls}" d="${taper(pts.length === 2 ? densify(pts, false).out : pts, w, rand, over + rand.between(-2, 3))}"/>`);
|
|
443
|
+
};
|
|
419
444
|
return __foldkitBrandViewResult(({
|
|
420
445
|
out,
|
|
421
446
|
weights: { outline: 2, detail: 1.15, arrow: 1.15 },
|
|
@@ -429,20 +454,22 @@ function pencil(rand) {
|
|
|
429
454
|
if (!b.closed || b.corners.length < 3 || b.anchors.length > 6) {
|
|
430
455
|
return;
|
|
431
456
|
}
|
|
432
|
-
b.anchors.
|
|
457
|
+
for (const [i, a] of b.anchors.entries()) {
|
|
433
458
|
const c = pt(b.anchors, (i + 1) % b.anchors.length);
|
|
434
459
|
const [dx, dy] = unit(c[0] - a[0], c[1] - a[1]);
|
|
435
460
|
stroke([
|
|
436
461
|
[a[0] - dx * MARK.reach, a[1] - dy * MARK.reach],
|
|
437
462
|
[c[0] + dx * MARK.reach, c[1] + dy * MARK.reach],
|
|
438
463
|
], 0.7, "pen faint", OVERRUN.construction);
|
|
439
|
-
}
|
|
464
|
+
}
|
|
465
|
+
},
|
|
466
|
+
mark: (pts, w) => {
|
|
467
|
+
stroke(pts, w, "pen", OVERRUN.mark);
|
|
440
468
|
},
|
|
441
|
-
mark: (pts, w) => __foldkitBrandViewResult((stroke(pts, w, "pen", OVERRUN.mark)), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#mark"),
|
|
442
469
|
ring: (c, r, w) => {
|
|
443
470
|
const pts = arc(c[0], c[1], r, r, 0, 360, true);
|
|
444
471
|
const k = Math.floor(rand.next() * pts.length);
|
|
445
|
-
stroke(Array.from({ length: pts.length + 3 }, (_, i) => __foldkitBrandViewResult((pt(pts, (k + i) % pts.length)), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~
|
|
472
|
+
stroke(Array.from({ length: pts.length + 3 }, (_, i) => __foldkitBrandViewResult((pt(pts, (k + i) % pts.length)), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~11")), w, "pen", OVERRUN.ring);
|
|
446
473
|
},
|
|
447
474
|
dashed: (pts, kind) => {
|
|
448
475
|
for (const d of dashes(pts, DASH[kind].pencil)) {
|
|
@@ -459,19 +486,28 @@ function pencil(rand) {
|
|
|
459
486
|
}
|
|
460
487
|
},
|
|
461
488
|
}), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#pencil");
|
|
462
|
-
}
|
|
463
|
-
|
|
489
|
+
};
|
|
490
|
+
const ruler = () => {
|
|
464
491
|
const out = [];
|
|
465
|
-
const line = (pts, w, cls = "ln", closed = false, attrs = "") =>
|
|
492
|
+
const line = (pts, w, cls = "ln", closed = false, attrs = "") => {
|
|
493
|
+
out.push(`<path class="${cls}" ${attrs}d="${path(pts, closed, grain(pts))}" stroke-width="${w}"/>`);
|
|
494
|
+
};
|
|
466
495
|
return __foldkitBrandViewResult(({
|
|
467
496
|
out,
|
|
468
497
|
weights: { outline: 1.6, detail: 0.8, arrow: 1 },
|
|
469
|
-
outline: (b, w) =>
|
|
498
|
+
outline: (b, w) => {
|
|
499
|
+
line(exact(b), w, "ln", b.closed);
|
|
500
|
+
},
|
|
470
501
|
hatch: 1,
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
502
|
+
mark: (pts, w) => {
|
|
503
|
+
line(pts, w);
|
|
504
|
+
},
|
|
505
|
+
ring: ([cx, cy], r, w) => {
|
|
506
|
+
out.push(`<circle class="ln paper" cx="${n(cx)}" cy="${n(cy)}" r="${r}" stroke-width="${w}"/>`);
|
|
507
|
+
},
|
|
508
|
+
dashed: (pts, kind) => {
|
|
509
|
+
line(pts, DASH[kind].weight, "ln", false, `stroke-dasharray="${DASH[kind].ruler}" `);
|
|
510
|
+
},
|
|
475
511
|
arrow: ([x, y], [dx, dy]) => {
|
|
476
512
|
const [nx, ny] = [-dy, dx];
|
|
477
513
|
out.push(`<path class="solid" d="${path([
|
|
@@ -481,39 +517,29 @@ function ruler() {
|
|
|
481
517
|
])}"/>`);
|
|
482
518
|
},
|
|
483
519
|
}), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#ruler");
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
With a figure number, each named group is a <g> a note in that figure can point at. */
|
|
488
|
-
export function drawingMarks(scene, stage, figure) {
|
|
489
|
-
// Seeded by the scene itself: the same scene and stage always draw the same strokes.
|
|
520
|
+
};
|
|
521
|
+
const lettering = (at, text, opts = {}) => __foldkitBrandViewResult((`<text class="tech" x="${n(at[0])}" y="${n(at[1])}" text-anchor="${opts.anchor ?? "middle"}"${(opts.rotate ?? 0) === 0 ? "" : ` transform="rotate(${opts.rotate} ${n(at[0])} ${n(at[1])})"`}>${esc(text)}</text>`), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#lettering");
|
|
522
|
+
export const drawingMarks = (scene, stage, id, figure) => {
|
|
490
523
|
const rand = seeded(JSON.stringify(scene) + stage);
|
|
491
524
|
const hand = stage === "settled" ? ruler() : pencil(rand);
|
|
492
|
-
const out = hand
|
|
493
|
-
// Each hatching colour is one <pattern>, its id the drawing's own: on paper, a line every
|
|
494
|
-
// MARK.hatch at 45°. The id comes from the scene and stage, so a page draws a hatched scene
|
|
495
|
-
// once at a stage; a second copy would repeat its ids.
|
|
525
|
+
const { out } = hand;
|
|
496
526
|
const patterns = new Map();
|
|
497
|
-
const own = `h${fnv(JSON.stringify(scene) + stage).toString(36)}`;
|
|
498
527
|
const hatching = (colour) => {
|
|
499
|
-
const
|
|
528
|
+
const patternId = `${id}-${colour}`;
|
|
500
529
|
const [s, w] = [MARK.hatch, hand.hatch];
|
|
501
|
-
patterns.set(colour, `<pattern id="${
|
|
502
|
-
return __foldkitBrandViewResult((`url(#${
|
|
530
|
+
patterns.set(colour, `<pattern id="${patternId}" width="${s}" height="${s}" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><rect class="paper" width="${s}" height="${s}"/><path class="ln hatch" style="--hatch: var(--draw-${colour})" d="M0 ${s / 2}h${s}" stroke-width="${w}"/></pattern>`);
|
|
531
|
+
return __foldkitBrandViewResult((`url(#${patternId})`), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#hatching");
|
|
503
532
|
};
|
|
504
|
-
const lettering = (at, text, opts = {}) => __foldkitBrandViewResult((`<text class="tech" x="${n(at[0])}" y="${n(at[1])}" text-anchor="${opts.anchor ?? "middle"}"${opts.rotate ? ` transform="rotate(${opts.rotate} ${n(at[0])} ${n(at[1])})"` : ""}>${esc(text)}</text>`), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#lettering");
|
|
505
|
-
// The drafting marks' numbers and labels go on top of everything else.
|
|
506
533
|
const words = [];
|
|
507
534
|
const word = (...args) => __foldkitBrandViewResult((words.push(lettering(...args))), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#word");
|
|
508
|
-
// Each named group is one run of shapes: a <g> when the drawing is in a figure.
|
|
509
535
|
let current;
|
|
510
536
|
const marks = [];
|
|
511
537
|
for (const b of build(scene.shapes, marks)) {
|
|
512
538
|
if (b.group !== current) {
|
|
513
|
-
if (current && figure !== undefined) {
|
|
539
|
+
if (isNamed(current) && figure !== undefined) {
|
|
514
540
|
out.push("</g>");
|
|
515
541
|
}
|
|
516
|
-
if (b.group && figure !== undefined) {
|
|
542
|
+
if (isNamed(b.group) && figure !== undefined) {
|
|
517
543
|
out.push(`<g id="${esc(noteId(figure, b.group))}">`);
|
|
518
544
|
}
|
|
519
545
|
current = b.group;
|
|
@@ -522,24 +548,26 @@ export function drawingMarks(scene, stage, figure) {
|
|
|
522
548
|
out.push(lettering(pt(b.pts, 0), b.text.text, b.text.align === undefined ? {} : { anchor: b.text.align }));
|
|
523
549
|
continue;
|
|
524
550
|
}
|
|
525
|
-
if (b.arrow) {
|
|
551
|
+
if (b.arrow === true) {
|
|
526
552
|
hand.mark(b.pts, hand.weights.arrow);
|
|
527
553
|
const [p, q] = [pt(b.pts, b.pts.length - 2), pt(b.pts, b.pts.length - 1)];
|
|
528
554
|
hand.arrow(q, unit(q[0] - p[0], q[1] - p[1]));
|
|
529
555
|
continue;
|
|
530
556
|
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
557
|
+
let fill = "";
|
|
558
|
+
if (b.fill === "ink") {
|
|
559
|
+
fill = 'class="solid"';
|
|
560
|
+
}
|
|
561
|
+
else if (b.fill !== undefined) {
|
|
562
|
+
fill =
|
|
563
|
+
hatched(b.fill) && stage !== "rough"
|
|
537
564
|
? `fill="${hatching(b.fill)}"`
|
|
538
565
|
: 'class="paper"';
|
|
566
|
+
}
|
|
539
567
|
if (fill && b.closed) {
|
|
540
568
|
out.push(`<path ${fill} d="${path(exact(b), true, grain(exact(b)))}"/>`);
|
|
541
569
|
}
|
|
542
|
-
hand.construction(b);
|
|
570
|
+
hand.construction?.(b);
|
|
543
571
|
if (b.line === "dashed") {
|
|
544
572
|
hand.dashed(b.closed ? [...b.pts, pt(b.pts, 0)] : b.pts, "dashed");
|
|
545
573
|
}
|
|
@@ -547,10 +575,9 @@ export function drawingMarks(scene, stage, figure) {
|
|
|
547
575
|
hand.outline(b, hand.weights[b.line]);
|
|
548
576
|
}
|
|
549
577
|
}
|
|
550
|
-
if (current && figure !== undefined) {
|
|
578
|
+
if (isNamed(current) && figure !== undefined) {
|
|
551
579
|
out.push("</g>");
|
|
552
580
|
}
|
|
553
|
-
// Centre lines under measurements, under the numbered parts.
|
|
554
581
|
for (const m of marks) {
|
|
555
582
|
if (!("centre" in m)) {
|
|
556
583
|
continue;
|
|
@@ -582,10 +609,8 @@ export function drawingMarks(scene, stage, figure) {
|
|
|
582
609
|
if (!("measure" in d)) {
|
|
583
610
|
continue;
|
|
584
611
|
}
|
|
585
|
-
|
|
586
|
-
const
|
|
587
|
-
// Left to right, so each arrowhead points out from the line.
|
|
588
|
-
const ends = [swap(d.measure[0]), swap(d.measure[1])].sort((a, b) => __foldkitBrandViewResult((a[0] - b[0]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~15"));
|
|
612
|
+
const swap = d.vertical === true ? ([x, y]) => __foldkitBrandViewResult(([y, x]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~12") : (p) => __foldkitBrandViewResult((p), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~13");
|
|
613
|
+
const ends = [swap(d.measure[0]), swap(d.measure[1])].toSorted((a, b) => __foldkitBrandViewResult((a[0] - b[0]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~14"));
|
|
589
614
|
const [p, q] = [pt(ends, 0), pt(ends, 1)];
|
|
590
615
|
const side = d.offset > 0 ? 1 : -1;
|
|
591
616
|
const y = (d.offset > 0 ? Math.max(p[1], q[1]) : Math.min(p[1], q[1])) + d.offset;
|
|
@@ -596,26 +621,23 @@ export function drawingMarks(scene, stage, figure) {
|
|
|
596
621
|
hand.mark([swap([p[0], y]), swap([q[0], y])], 0.8);
|
|
597
622
|
hand.arrow(swap([p[0], y]), swap([-1, 0]));
|
|
598
623
|
hand.arrow(swap([q[0], y]), swap([1, 0]));
|
|
599
|
-
word(swap([(p[0] + q[0]) / 2, y - MARK.lift]), d.label, d.vertical ? { rotate: -90 } : {});
|
|
624
|
+
word(swap([(p[0] + q[0]) / 2, y - MARK.lift]), d.label, d.vertical === true ? { rotate: -90 } : {});
|
|
600
625
|
}
|
|
601
|
-
marks
|
|
602
|
-
.filter((m) => __foldkitBrandViewResult(("part" in m), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~16"))
|
|
603
|
-
.forEach(({ at, tag }, i) => {
|
|
626
|
+
for (const [i, { at, tag }] of marks.filter((m) => __foldkitBrandViewResult(("part" in m), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~15")).entries()) {
|
|
604
627
|
const [dx, dy] = unit(tag[0] - at[0], tag[1] - at[1]);
|
|
605
|
-
// The leader stops just short of the ring.
|
|
606
628
|
const gap = MARK.ring + 1;
|
|
607
629
|
hand.mark([at, [tag[0] - dx * gap, tag[1] - dy * gap]], 0.8);
|
|
608
630
|
out.push(`<circle class="solid" cx="${n(at[0])}" cy="${n(at[1])}" r="${MARK.dot}"/>`);
|
|
609
631
|
hand.ring(tag, MARK.ring, 0.9);
|
|
610
632
|
word([tag[0], tag[1] + 4], String(i + 1));
|
|
611
|
-
}
|
|
612
|
-
const defs = patterns.size
|
|
633
|
+
}
|
|
634
|
+
const defs = patterns.size
|
|
635
|
+
? `<defs>${[...patterns.values()].join("")}</defs>`
|
|
636
|
+
: "";
|
|
613
637
|
return __foldkitBrandViewResult((defs + out.join("") + words.join("")), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#drawingMarks");
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
export function titlePlacement(scene) {
|
|
618
|
-
const pct = (v) => __foldkitBrandViewResult((`${Math.round(v * 10000) / 100}%`), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#pct");
|
|
638
|
+
};
|
|
639
|
+
const pct = (v) => __foldkitBrandViewResult((`${Math.round(v * 10_000) / 100}%`), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#pct");
|
|
640
|
+
export const titlePlacement = (scene) => {
|
|
619
641
|
const ground = scene.ground ?? scene.height;
|
|
620
642
|
const [from, to] = scene.focus ?? [0, scene.width];
|
|
621
643
|
return __foldkitBrandViewResult(({
|
|
@@ -623,10 +645,9 @@ export function titlePlacement(scene) {
|
|
|
623
645
|
"--focus-width": pct(scene.width / (to - from)),
|
|
624
646
|
"--focus-start": pct(-from / (to - from)),
|
|
625
647
|
}), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#titlePlacement");
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
export function partNames(scene) {
|
|
648
|
+
};
|
|
649
|
+
export const partNames = (scene) => {
|
|
629
650
|
const marks = [];
|
|
630
651
|
build(scene.shapes, marks);
|
|
631
|
-
return __foldkitBrandViewResult((marks.flatMap((m) => (__foldkitBrandViewResult(("part" in m ? [m.part] : []), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~
|
|
632
|
-
}
|
|
652
|
+
return __foldkitBrandViewResult((marks.flatMap((m) => (__foldkitBrandViewResult(("part" in m ? [m.part] : []), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~16")))), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#partNames");
|
|
653
|
+
};
|