@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.
Files changed (221) hide show
  1. package/DESIGN.md +8 -4
  2. package/dist/src/box/box.d.ts +1 -1
  3. package/dist/src/box/box.d.ts.map +1 -1
  4. package/dist/src/box/index.d.ts.map +1 -1
  5. package/dist/src/changes/changes.d.ts +1 -1
  6. package/dist/src/changes/changes.d.ts.map +1 -1
  7. package/dist/src/changes/index.d.ts.map +1 -1
  8. package/dist/src/{codeFigure/codeFigure.d.ts → code-figure/code-figure.d.ts} +3 -3
  9. package/dist/src/code-figure/code-figure.d.ts.map +1 -0
  10. package/dist/src/{codeFigure/codeFigure.js → code-figure/code-figure.js} +10 -5
  11. package/dist/src/code-figure/index.d.ts +3 -0
  12. package/dist/src/code-figure/index.d.ts.map +1 -0
  13. package/dist/src/code-figure/index.js +1 -0
  14. package/dist/src/copy/copy.d.ts.map +1 -1
  15. package/dist/src/copy/copy.js +1 -7
  16. package/dist/src/{copyButton/copyButton.d.ts → copy-button/copy-button.d.ts} +8 -2
  17. package/dist/src/copy-button/copy-button.d.ts.map +1 -0
  18. package/dist/src/copy-button/copy-button.js +37 -0
  19. package/dist/src/copy-button/index.d.ts +3 -0
  20. package/dist/src/copy-button/index.d.ts.map +1 -0
  21. package/dist/src/{copyButton → copy-button}/index.js +1 -1
  22. package/dist/src/diagram/diagram.d.ts +1 -1
  23. package/dist/src/diagram/diagram.d.ts.map +1 -1
  24. package/dist/src/diagram/diagram.js +10 -1
  25. package/dist/src/diagram/index.d.ts.map +1 -1
  26. package/dist/src/drawing/drawing.d.ts +3 -3
  27. package/dist/src/drawing/drawing.d.ts.map +1 -1
  28. package/dist/src/drawing/drawing.js +6 -5
  29. package/dist/src/drawing/fnv1a-utf16.d.ts +2 -0
  30. package/dist/src/drawing/fnv1a-utf16.d.ts.map +1 -0
  31. package/dist/src/drawing/fnv1a-utf16.js +8 -0
  32. package/dist/src/drawing/index.d.ts +1 -1
  33. package/dist/src/drawing/index.d.ts.map +1 -1
  34. package/dist/src/drawing/render.d.ts +4 -9
  35. package/dist/src/drawing/render.d.ts.map +1 -1
  36. package/dist/src/drawing/render.js +221 -200
  37. package/dist/src/drawing/scene.d.ts +11 -7
  38. package/dist/src/drawing/scene.d.ts.map +1 -1
  39. package/dist/src/drawing/scene.js +8 -5
  40. package/dist/src/{drawnTitle/drawnTitle.d.ts → drawn-title/drawn-title.d.ts} +3 -2
  41. package/dist/src/drawn-title/drawn-title.d.ts.map +1 -0
  42. package/dist/src/{drawnTitle/drawnTitle.js → drawn-title/drawn-title.js} +3 -3
  43. package/dist/src/drawn-title/index.d.ts +3 -0
  44. package/dist/src/drawn-title/index.d.ts.map +1 -0
  45. package/dist/src/drawn-title/index.js +1 -0
  46. package/dist/src/{figRef/figRef.d.ts → fig-ref/fig-ref.d.ts} +1 -1
  47. package/dist/src/fig-ref/fig-ref.d.ts.map +1 -0
  48. package/dist/src/{figRef/figRef.js → fig-ref/fig-ref.js} +1 -1
  49. package/dist/src/fig-ref/index.d.ts +3 -0
  50. package/dist/src/fig-ref/index.d.ts.map +1 -0
  51. package/dist/src/fig-ref/index.js +1 -0
  52. package/dist/src/figure/figure.d.ts +3 -3
  53. package/dist/src/figure/figure.d.ts.map +1 -1
  54. package/dist/src/figure/figure.js +4 -2
  55. package/dist/src/figure/figures.d.ts +0 -1
  56. package/dist/src/figure/figures.d.ts.map +1 -1
  57. package/dist/src/figure/figures.js +2 -2
  58. package/dist/src/figure/index.d.ts.map +1 -1
  59. package/dist/src/illustration/illustration.d.ts +1 -0
  60. package/dist/src/illustration/illustration.d.ts.map +1 -1
  61. package/dist/src/illustration/illustration.js +2 -2
  62. package/dist/src/illustration/index.d.ts.map +1 -1
  63. package/dist/src/index.d.ts +9 -9
  64. package/dist/src/index.d.ts.map +1 -1
  65. package/dist/src/index.js +9 -9
  66. package/dist/src/links-here/index.d.ts +3 -0
  67. package/dist/src/links-here/index.d.ts.map +1 -0
  68. package/dist/src/links-here/index.js +1 -0
  69. package/dist/src/{linksHere/linksHere.d.ts → links-here/links-here.d.ts} +2 -2
  70. package/dist/src/links-here/links-here.d.ts.map +1 -0
  71. package/dist/src/{linksHere/linksHere.js → links-here/links-here.js} +2 -2
  72. package/dist/src/margin-note/index.d.ts +3 -0
  73. package/dist/src/margin-note/index.d.ts.map +1 -0
  74. package/dist/src/margin-note/index.js +1 -0
  75. package/dist/src/{marginNote/marginNote.d.ts → margin-note/margin-note.d.ts} +2 -1
  76. package/dist/src/margin-note/margin-note.d.ts.map +1 -0
  77. package/dist/src/{marginNote/marginNote.js → margin-note/margin-note.js} +4 -1
  78. package/dist/src/masthead/index.d.ts.map +1 -1
  79. package/dist/src/masthead/masthead.d.ts +1 -1
  80. package/dist/src/masthead/masthead.d.ts.map +1 -1
  81. package/dist/src/masthead/masthead.js +1 -3
  82. package/dist/src/note-header/index.d.ts +3 -0
  83. package/dist/src/note-header/index.d.ts.map +1 -0
  84. package/dist/src/note-header/index.js +1 -0
  85. package/dist/src/{noteHeader/noteHeader.d.ts → note-header/note-header.d.ts} +2 -1
  86. package/dist/src/note-header/note-header.d.ts.map +1 -0
  87. package/dist/src/{noteHeader/noteHeader.js → note-header/note-header.js} +12 -4
  88. package/dist/src/note-list/index.d.ts +3 -0
  89. package/dist/src/note-list/index.d.ts.map +1 -0
  90. package/dist/src/note-list/index.js +1 -0
  91. package/dist/src/{noteList/noteList.d.ts → note-list/note-list.d.ts} +2 -2
  92. package/dist/src/note-list/note-list.d.ts.map +1 -0
  93. package/dist/src/{noteList/noteList.js → note-list/note-list.js} +8 -3
  94. package/dist/src/ring/index.d.ts.map +1 -1
  95. package/dist/src/ring/ring.d.ts +1 -1
  96. package/dist/src/ring/ring.d.ts.map +1 -1
  97. package/dist/src/scheme/index.d.ts +1 -1
  98. package/dist/src/scheme/index.d.ts.map +1 -1
  99. package/dist/src/scheme/index.js +1 -1
  100. package/dist/src/scheme/{schemeSwitch.d.ts → scheme-switch.d.ts} +3 -2
  101. package/dist/src/scheme/scheme-switch.d.ts.map +1 -0
  102. package/dist/src/scheme/{schemeSwitch.js → scheme-switch.js} +7 -6
  103. package/dist/src/scheme/scheme.d.ts +0 -2
  104. package/dist/src/scheme/scheme.d.ts.map +1 -1
  105. package/dist/src/scheme/scheme.js +0 -2
  106. package/dist/src/scheme/switch.d.ts.map +1 -1
  107. package/dist/src/scheme/switch.js +12 -17
  108. package/dist/src/skip-link/index.d.ts +2 -0
  109. package/dist/src/skip-link/index.d.ts.map +1 -0
  110. package/dist/src/skip-link/index.js +1 -0
  111. package/dist/src/{skipLink/skipLink.d.ts → skip-link/skip-link.d.ts} +1 -1
  112. package/dist/src/skip-link/skip-link.d.ts.map +1 -0
  113. package/dist/src/{skipLink/skipLink.js → skip-link/skip-link.js} +1 -1
  114. package/dist/src/stage/index.d.ts.map +1 -1
  115. package/dist/src/stage/stage.d.ts +0 -2
  116. package/dist/src/stage/stage.d.ts.map +1 -1
  117. package/dist/src/stage/stage.js +0 -2
  118. package/dist/src/summary/index.d.ts.map +1 -1
  119. package/dist/src/summary/summary.d.ts +1 -1
  120. package/dist/src/summary/summary.d.ts.map +1 -1
  121. package/dist/src/time/time.d.ts +0 -3
  122. package/dist/src/time/time.d.ts.map +1 -1
  123. package/dist/src/time/time.js +0 -1
  124. package/package.json +13 -13
  125. package/src/box/box.ts +6 -3
  126. package/src/box/index.ts +1 -0
  127. package/src/changes/changes.ts +10 -4
  128. package/src/changes/index.ts +1 -0
  129. package/src/{codeFigure/codeFigure.ts → code-figure/code-figure.ts} +19 -8
  130. package/src/code-figure/index.ts +3 -0
  131. package/src/copy/copy.ts +8 -17
  132. package/src/copy-button/copy-button.ts +96 -0
  133. package/src/{copyButton → copy-button}/index.ts +4 -2
  134. package/src/diagram/diagram.ts +20 -4
  135. package/src/diagram/index.ts +1 -0
  136. package/src/drawing/drawing.ts +18 -8
  137. package/src/drawing/fnv1a-utf16.ts +9 -0
  138. package/src/drawing/index.ts +11 -1
  139. package/src/drawing/render.ts +460 -270
  140. package/src/drawing/scene.ts +20 -12
  141. package/src/{drawnTitle/drawnTitle.ts → drawn-title/drawn-title.ts} +8 -3
  142. package/src/drawn-title/index.ts +3 -0
  143. package/src/{figRef/figRef.ts → fig-ref/fig-ref.ts} +4 -2
  144. package/src/fig-ref/index.ts +3 -0
  145. package/src/figure/figure.ts +21 -12
  146. package/src/figure/figures.ts +3 -2
  147. package/src/figure/index.ts +2 -0
  148. package/src/illustration/illustration.ts +9 -4
  149. package/src/illustration/index.ts +1 -0
  150. package/src/index.ts +28 -9
  151. package/src/links-here/index.ts +3 -0
  152. package/src/{linksHere/linksHere.ts → links-here/links-here.ts} +12 -5
  153. package/src/margin-note/index.ts +3 -0
  154. package/src/{marginNote/marginNote.ts → margin-note/margin-note.ts} +9 -2
  155. package/src/masthead/index.ts +1 -0
  156. package/src/masthead/masthead.ts +12 -7
  157. package/src/note-header/index.ts +3 -0
  158. package/src/{noteHeader/noteHeader.ts → note-header/note-header.ts} +24 -8
  159. package/src/note-list/index.ts +3 -0
  160. package/src/{noteList/noteList.ts → note-list/note-list.ts} +17 -9
  161. package/src/plain-garden.css +9 -87
  162. package/src/ring/index.ts +1 -0
  163. package/src/ring/ring.ts +9 -5
  164. package/src/scheme/index.ts +3 -1
  165. package/src/scheme/{schemeSwitch.ts → scheme-switch.ts} +22 -11
  166. package/src/scheme/scheme.ts +3 -4
  167. package/src/scheme/switch.ts +9 -20
  168. package/src/skip-link/index.ts +1 -0
  169. package/src/stage/index.ts +1 -0
  170. package/src/stage/stage.ts +9 -6
  171. package/src/summary/index.ts +1 -0
  172. package/src/summary/summary.ts +5 -2
  173. package/src/time/time.ts +8 -5
  174. package/src/tokens.css +14 -61
  175. package/dist/src/codeFigure/codeFigure.d.ts.map +0 -1
  176. package/dist/src/codeFigure/index.d.ts +0 -3
  177. package/dist/src/codeFigure/index.d.ts.map +0 -1
  178. package/dist/src/codeFigure/index.js +0 -1
  179. package/dist/src/copyButton/copyButton.d.ts.map +0 -1
  180. package/dist/src/copyButton/copyButton.js +0 -30
  181. package/dist/src/copyButton/index.d.ts +0 -3
  182. package/dist/src/copyButton/index.d.ts.map +0 -1
  183. package/dist/src/drawnTitle/drawnTitle.d.ts.map +0 -1
  184. package/dist/src/drawnTitle/index.d.ts +0 -3
  185. package/dist/src/drawnTitle/index.d.ts.map +0 -1
  186. package/dist/src/drawnTitle/index.js +0 -1
  187. package/dist/src/figRef/figRef.d.ts.map +0 -1
  188. package/dist/src/figRef/index.d.ts +0 -3
  189. package/dist/src/figRef/index.d.ts.map +0 -1
  190. package/dist/src/figRef/index.js +0 -1
  191. package/dist/src/linksHere/index.d.ts +0 -3
  192. package/dist/src/linksHere/index.d.ts.map +0 -1
  193. package/dist/src/linksHere/index.js +0 -1
  194. package/dist/src/linksHere/linksHere.d.ts.map +0 -1
  195. package/dist/src/marginNote/index.d.ts +0 -3
  196. package/dist/src/marginNote/index.d.ts.map +0 -1
  197. package/dist/src/marginNote/index.js +0 -1
  198. package/dist/src/marginNote/marginNote.d.ts.map +0 -1
  199. package/dist/src/noteHeader/index.d.ts +0 -3
  200. package/dist/src/noteHeader/index.d.ts.map +0 -1
  201. package/dist/src/noteHeader/index.js +0 -1
  202. package/dist/src/noteHeader/noteHeader.d.ts.map +0 -1
  203. package/dist/src/noteList/index.d.ts +0 -3
  204. package/dist/src/noteList/index.d.ts.map +0 -1
  205. package/dist/src/noteList/index.js +0 -1
  206. package/dist/src/noteList/noteList.d.ts.map +0 -1
  207. package/dist/src/scheme/schemeSwitch.d.ts.map +0 -1
  208. package/dist/src/skipLink/index.d.ts +0 -2
  209. package/dist/src/skipLink/index.d.ts.map +0 -1
  210. package/dist/src/skipLink/index.js +0 -1
  211. package/dist/src/skipLink/skipLink.d.ts.map +0 -1
  212. package/src/codeFigure/index.ts +0 -2
  213. package/src/copyButton/copyButton.ts +0 -59
  214. package/src/drawnTitle/index.ts +0 -2
  215. package/src/figRef/index.ts +0 -2
  216. package/src/linksHere/index.ts +0 -2
  217. package/src/marginNote/index.ts +0 -2
  218. package/src/noteHeader/index.ts +0 -2
  219. package/src/noteList/index.ts +0 -2
  220. package/src/skipLink/index.ts +0 -1
  221. /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 { HATCHES, } from "./scene.js";
4
- // The drafting marks' sizes, in scene units.
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.includes(c ?? "")), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#hatched");
24
- /* ------------------------------------------------------------------ numbers and noise */
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~2"));
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
- /** Path data, as short as it stays exact: the points rounded to the grid, then each written
42
- as a step from the last (h and v where it runs straight), with straight runs joined. */
43
- function path(pts, closed = true, q = FINE) {
44
- const grid = pts.map(([x, y]) => __foldkitBrandViewResult(([Math.round(x * q), Math.round(y * q)]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~3"));
45
- // Steps on the grid: exact, so a run of steps in one direction joins into one.
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[steps.length - 1];
54
- if (last && last[0] * dy === last[1] * dx && last[0] * dx + last[1] * dy > 0) {
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\./, "-.")), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#num");
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
- d += cmd = prev = letter;
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]$/i.test(prev) || v[0] === "-" || (v[0] === "." && prev.includes("."));
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 (!dx) {
86
- put("v", dy);
80
+ else if (dx) {
81
+ put("l", dx, dy);
87
82
  }
88
83
  else {
89
- put("l", dx, dy);
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
- .replace(/&/g, "&amp;")
96
- .replace(/</g, "&lt;")
97
- .replace(/>/g, "&gt;")
98
- .replace(/"/g, "&quot;")
99
- .replace(/'/g, "&#x27;")), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#esc");
90
+ .replaceAll("&", "&amp;")
91
+ .replaceAll("<", "&lt;")
92
+ .replaceAll(">", "&gt;")
93
+ .replaceAll('"', "&quot;")
94
+ .replaceAll("'", "&#x27;")), "@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 ORIGIN = [0, 0];
106
- /** A point by its index; every index the renderer asks for is in range. */
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 + 0x6d2b79f5) >>> 0;
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) / 4294967296), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#next");
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
- /* ------------------------------------------------------------------ geometry */
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([a[0] + ((b[0] - a[0]) * j) / k, a[1] + ((b[1] - a[1]) * j) / k]);
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
- /** Points turned about their centroid. */
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~4"), 0) / pts.length,
154
- pts.reduce((s, p) => __foldkitBrandViewResult((s + p[1]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~5"), 0) / pts.length,
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~6"))), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#turn");
162
- }
163
- function smooth(ctrl, closed, per = 14) {
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 ? pt(ctrl, ((i % m) + m) % m) : pt(ctrl, Math.min(Math.max(i, 0), m - 1))), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#at");
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 = [p1[0] + (p2[0] - p0[0]) / 6, p1[1] + (p2[1] - p0[1]) / 6];
171
- const c2 = [p2[0] - (p3[0] - p1[0]) / 6, p2[1] - (p3[1] - p1[1]) / 6];
172
- for (let j = 0; j < per; j++) {
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] + 3 * u * u * t * c1[0] + 3 * u * t * t * c2[0] + t ** 3 * p2[0],
177
- u ** 3 * p1[1] + 3 * u * u * t * c1[1] + 3 * u * t * t * c2[1] + t ** 3 * p2[1],
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
- function arc(cx, cy, rx, ry, from, to, close) {
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
- /** Every shape as points, in drawing order, with groups flattened into place; the marks,
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({ ...s, measure: [T(s.measure[0]), T(s.measure[1])], offset: s.offset * k });
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 && group) {
217
- throw new Error(`Group "${s.name}" is inside group "${group}": named groups do not nest.`);
218
- }
219
- if (s.name && !/^[a-z0-9-]+$/.test(s.name)) {
220
- throw new Error(`Group "${s.name}": name it in lower-case letters, digits and hyphens.`);
221
- }
222
- if (s.name && names.has(s.name)) {
223
- throw new Error(`Two groups are named "${s.name}".`);
224
- }
225
- if (s.name) {
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({ ...look, pts: [T(s.at)], closed: false, corners: [], anchors: [], text: s });
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({ ...look, pts: shaft, closed: false, corners: [], anchors: [], arrow: true });
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 (!r) {
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 || !!s.closed);
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), !s.open);
304
+ cornered(turn(s.poly, s.turn), s.open !== true);
292
305
  }
293
306
  else if ("curve" in s) {
294
- plain(smooth(s.curve, !!s.closed), !!s.closed);
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
- /* ------------------------------------------------------------------ the hand */
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.slice();
339
+ const pts = [...src];
330
340
  const [first, second] = [pt(pts, 0), pt(pts, 1)];
331
- const [last, penultimate] = [pt(pts, pts.length - 1), pt(pts, pts.length - 2)];
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 L = s[s.length - 1] || 1;
341
- const [p1, p2, p3] = [rand.between(0, 6), rand.between(0, 6), rand.between(0, 6)];
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.forEach((p, i) => {
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 * (0.6 * Math.sin(along / 37 + p1) + 0.4 * Math.sin(along / 97 + p2));
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.reverse()])), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#taper");
361
- }
362
- /** Where a hand lifts the pencil: each side of a box, or once round a curve with overlap. */
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
- /** A line broken into dashes: the runs of pts that fall on the pattern's even entries. */
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 = [a[0] + ((b[0] - a[0]) * left) / seg, a[1] + ((b[1] - a[1]) * left) / seg];
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
- left = pattern[++i % pattern.length] ?? 0;
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
- // How far past its end the pencil runs each kind of stroke, before its own error of −2 to 3.
415
- const OVERRUN = { outline: 8, mark: 2, construction: 1, ring: 1, arrow: 0.5, dash: 0.3 };
416
- function pencil(rand) {
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) => __foldkitBrandViewResult((out.push(`<path class="${cls}" d="${taper(pts.length === 2 ? densify(pts, false).out : pts, w, rand, over + rand.between(-2, 3))}"/>`)), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#stroke");
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.forEach((a, i) => {
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~12")), w, "pen", OVERRUN.ring);
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
- function ruler() {
489
+ };
490
+ const ruler = () => {
464
491
  const out = [];
465
- const line = (pts, w, cls = "ln", closed = false, attrs = "") => __foldkitBrandViewResult((out.push(`<path class="${cls}" ${attrs}d="${path(pts, closed, grain(pts))}" stroke-width="${w}"/>`)), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#line");
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) => __foldkitBrandViewResult((line(exact(b), w, "ln", b.closed)), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#outline~2"),
498
+ outline: (b, w) => {
499
+ line(exact(b), w, "ln", b.closed);
500
+ },
470
501
  hatch: 1,
471
- construction: () => { },
472
- mark: (pts, w) => __foldkitBrandViewResult((line(pts, w)), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#mark~2"),
473
- ring: ([cx, cy], r, w) => __foldkitBrandViewResult((out.push(`<circle class="ln paper" cx="${n(cx)}" cy="${n(cy)}" r="${r}" stroke-width="${w}"/>`)), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#ring~2"),
474
- dashed: (pts, kind) => __foldkitBrandViewResult((line(pts, DASH[kind].weight, "ln", false, `stroke-dasharray="${DASH[kind].ruler}" `)), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#dashed~2"),
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
- /* ------------------------------------------------------------------ the drawing */
486
- /** The marks inside a drawing's <svg viewBox="0 0 width height">, as the stage draws them.
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.out;
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 id = `${own}-${colour}`;
528
+ const patternId = `${id}-${colour}`;
500
529
  const [s, w] = [MARK.hatch, hand.hatch];
501
- patterns.set(colour, `<pattern id="${id}" 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>`);
502
- return __foldkitBrandViewResult((`url(#${id})`), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#hatching");
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
- // Rough shows no colour: a hatched shape is paper there, like any other fill.
532
- const fill = !b.fill
533
- ? ""
534
- : b.fill === "ink"
535
- ? 'class="solid"'
536
- : hatched(b.fill) && stage !== "rough"
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
- // Drawn as a horizontal measurement; a vertical one is the same with x and y swapped.
586
- const swap = d.vertical ? ([x, y]) => __foldkitBrandViewResult(([y, x]), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~13") : (p) => __foldkitBrandViewResult((p), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#anonymous~14");
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 ? `<defs>${[...patterns.values()].join("")}</defs>` : "";
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
- /** Where a DrawnTitle's title stands (--ground, up from the drawing's foot) and how a phone
616
- crops the drawing to the scene's focus (--focus-width, --focus-start). */
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
- /** The names of the scene's numbered parts, in their numbers' order. */
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~18")))), "@gjermundgaraba-designs/plain-garden/src/drawing/render.js#partNames");
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
+ };