@oh-just-another/scene 0.60.0 → 0.62.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 (228) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/a11y.d.ts +1 -1
  4. package/dist/a11y.d.ts.map +1 -1
  5. package/dist/{annotation-geometry.d.ts → annotations/annotation-geometry.d.ts} +1 -1
  6. package/dist/annotations/annotation-geometry.d.ts.map +1 -0
  7. package/dist/{annotation-geometry.js → annotations/annotation-geometry.js} +1 -1
  8. package/dist/annotations/annotation-geometry.js.map +1 -0
  9. package/dist/annotations/annotation.d.ts.map +1 -0
  10. package/dist/{annotation.js.map → annotations/annotation.js.map} +1 -1
  11. package/dist/constants.d.ts +64 -0
  12. package/dist/constants.d.ts.map +1 -1
  13. package/dist/constants.js +92 -0
  14. package/dist/constants.js.map +1 -1
  15. package/dist/edges/edge-curve.d.ts.map +1 -0
  16. package/dist/{edge-curve.js → edges/edge-curve.js} +1 -1
  17. package/dist/edges/edge-curve.js.map +1 -0
  18. package/dist/{edge-geometry.d.ts → edges/edge-geometry.d.ts} +22 -1
  19. package/dist/edges/edge-geometry.d.ts.map +1 -0
  20. package/dist/{edge-geometry.js → edges/edge-geometry.js} +54 -9
  21. package/dist/{edge-geometry.js.map → edges/edge-geometry.js.map} +1 -1
  22. package/dist/edges/edge-label.d.ts +55 -0
  23. package/dist/edges/edge-label.d.ts.map +1 -0
  24. package/dist/edges/edge-label.js +193 -0
  25. package/dist/edges/edge-label.js.map +1 -0
  26. package/dist/{edge.d.ts → edges/edge.d.ts} +1 -1
  27. package/dist/edges/edge.d.ts.map +1 -0
  28. package/dist/edges/edge.js.map +1 -0
  29. package/dist/{elbow-link.d.ts → edges/elbow-link.d.ts} +1 -1
  30. package/dist/edges/elbow-link.d.ts.map +1 -0
  31. package/dist/{elbow-link.js → edges/elbow-link.js} +3 -3
  32. package/dist/edges/elbow-link.js.map +1 -0
  33. package/dist/edges/elbow-router.d.ts.map +1 -0
  34. package/dist/{elbow-router.js → edges/elbow-router.js} +1 -1
  35. package/dist/edges/elbow-router.js.map +1 -0
  36. package/dist/{heading.d.ts → edges/heading.d.ts} +1 -1
  37. package/dist/edges/heading.d.ts.map +1 -0
  38. package/dist/{heading.js → edges/heading.js} +1 -1
  39. package/dist/edges/heading.js.map +1 -0
  40. package/dist/{anchors.d.ts → geometry/anchors.d.ts} +2 -2
  41. package/dist/geometry/anchors.d.ts.map +1 -0
  42. package/dist/{anchors.js → geometry/anchors.js} +2 -2
  43. package/dist/geometry/anchors.js.map +1 -0
  44. package/dist/{outline.d.ts → geometry/outline.d.ts} +1 -1
  45. package/dist/geometry/outline.d.ts.map +1 -0
  46. package/dist/{outline.js → geometry/outline.js} +4 -4
  47. package/dist/geometry/outline.js.map +1 -0
  48. package/dist/{snap.d.ts → geometry/snap.d.ts} +1 -1
  49. package/dist/geometry/snap.d.ts.map +1 -0
  50. package/dist/{snap.js → geometry/snap.js} +1 -1
  51. package/dist/geometry/snap.js.map +1 -0
  52. package/dist/index.d.ts +53 -50
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +35 -32
  55. package/dist/index.js.map +1 -1
  56. package/dist/{layout-registry.d.ts → layout/layout-registry.d.ts} +2 -2
  57. package/dist/layout/layout-registry.d.ts.map +1 -0
  58. package/dist/layout/layout-registry.js.map +1 -0
  59. package/dist/{layout.d.ts → layout/layout.d.ts} +3 -3
  60. package/dist/layout/layout.d.ts.map +1 -0
  61. package/dist/{layout.js → layout/layout.js} +7 -7
  62. package/dist/layout/layout.js.map +1 -0
  63. package/dist/model/diff.d.ts.map +1 -0
  64. package/dist/model/diff.js.map +1 -0
  65. package/dist/{file.d.ts → model/file.d.ts} +9 -0
  66. package/dist/model/file.d.ts.map +1 -0
  67. package/dist/model/file.js +42 -0
  68. package/dist/model/file.js.map +1 -0
  69. package/dist/{hydrate.d.ts → model/hydrate.d.ts} +1 -0
  70. package/dist/model/hydrate.d.ts.map +1 -0
  71. package/dist/{hydrate.js → model/hydrate.js} +1 -0
  72. package/dist/model/hydrate.js.map +1 -0
  73. package/dist/model/layer.d.ts.map +1 -0
  74. package/dist/model/layer.js.map +1 -0
  75. package/dist/{operations.d.ts → model/operations.d.ts} +3 -3
  76. package/dist/model/operations.d.ts.map +1 -0
  77. package/dist/model/operations.js.map +1 -0
  78. package/dist/model/order.d.ts.map +1 -0
  79. package/dist/model/order.js.map +1 -0
  80. package/dist/{patch.d.ts → model/patch.d.ts} +3 -3
  81. package/dist/model/patch.d.ts.map +1 -0
  82. package/dist/model/patch.js.map +1 -0
  83. package/dist/{scene.d.ts → model/scene.d.ts} +3 -3
  84. package/dist/model/scene.d.ts.map +1 -0
  85. package/dist/model/scene.js.map +1 -0
  86. package/dist/{three-way-merge.d.ts → model/three-way-merge.d.ts} +1 -1
  87. package/dist/model/three-way-merge.d.ts.map +1 -0
  88. package/dist/model/three-way-merge.js.map +1 -0
  89. package/dist/{viewport.d.ts → model/viewport.d.ts} +10 -0
  90. package/dist/model/viewport.d.ts.map +1 -0
  91. package/dist/{viewport.js → model/viewport.js} +1 -1
  92. package/dist/model/viewport.js.map +1 -0
  93. package/dist/{queries.d.ts → query/queries.d.ts} +12 -7
  94. package/dist/query/queries.d.ts.map +1 -0
  95. package/dist/{queries.js → query/queries.js} +20 -10
  96. package/dist/query/queries.js.map +1 -0
  97. package/dist/query/spatial.d.ts.map +1 -0
  98. package/dist/query/spatial.js.map +1 -0
  99. package/dist/shapes/brush-outline.d.ts.map +1 -0
  100. package/dist/{brush-outline.js → shapes/brush-outline.js} +1 -1
  101. package/dist/shapes/brush-outline.js.map +1 -0
  102. package/dist/{container.d.ts → shapes/container.d.ts} +1 -1
  103. package/dist/shapes/container.d.ts.map +1 -0
  104. package/dist/{container.js → shapes/container.js} +1 -1
  105. package/dist/shapes/container.js.map +1 -0
  106. package/dist/shapes/ellipse.d.ts.map +1 -0
  107. package/dist/shapes/ellipse.js.map +1 -0
  108. package/dist/shapes/render-bounds.d.ts.map +1 -0
  109. package/dist/shapes/render-bounds.js.map +1 -0
  110. package/dist/shapes/shape-transform.d.ts.map +1 -0
  111. package/dist/shapes/shape-transform.js.map +1 -0
  112. package/dist/{shape.d.ts → shapes/shape.d.ts} +148 -3
  113. package/dist/shapes/shape.d.ts.map +1 -0
  114. package/dist/{shape.js → shapes/shape.js} +30 -5
  115. package/dist/shapes/shape.js.map +1 -0
  116. package/dist/text/paragraphs.d.ts +44 -0
  117. package/dist/text/paragraphs.d.ts.map +1 -0
  118. package/dist/text/paragraphs.js +133 -0
  119. package/dist/text/paragraphs.js.map +1 -0
  120. package/dist/text/placeholder.d.ts +9 -0
  121. package/dist/text/placeholder.d.ts.map +1 -0
  122. package/dist/text/placeholder.js +29 -0
  123. package/dist/text/placeholder.js.map +1 -0
  124. package/dist/{style.d.ts → text/style.d.ts} +6 -0
  125. package/dist/text/style.d.ts.map +1 -0
  126. package/dist/{style.js → text/style.js} +1 -1
  127. package/dist/text/style.js.map +1 -0
  128. package/dist/text/text-measure.d.ts.map +1 -0
  129. package/dist/text/text-measure.js.map +1 -0
  130. package/dist/{text-runs.d.ts → text/text-runs.d.ts} +1 -1
  131. package/dist/text/text-runs.d.ts.map +1 -0
  132. package/dist/text/text-runs.js.map +1 -0
  133. package/package.json +1 -1
  134. package/dist/anchors.d.ts.map +0 -1
  135. package/dist/anchors.js.map +0 -1
  136. package/dist/annotation-geometry.d.ts.map +0 -1
  137. package/dist/annotation-geometry.js.map +0 -1
  138. package/dist/annotation.d.ts.map +0 -1
  139. package/dist/brush-outline.d.ts.map +0 -1
  140. package/dist/brush-outline.js.map +0 -1
  141. package/dist/container.d.ts.map +0 -1
  142. package/dist/container.js.map +0 -1
  143. package/dist/diff.d.ts.map +0 -1
  144. package/dist/diff.js.map +0 -1
  145. package/dist/edge-curve.d.ts.map +0 -1
  146. package/dist/edge-curve.js.map +0 -1
  147. package/dist/edge-geometry.d.ts.map +0 -1
  148. package/dist/edge.d.ts.map +0 -1
  149. package/dist/edge.js.map +0 -1
  150. package/dist/elbow-link.d.ts.map +0 -1
  151. package/dist/elbow-link.js.map +0 -1
  152. package/dist/elbow-router.d.ts.map +0 -1
  153. package/dist/elbow-router.js.map +0 -1
  154. package/dist/ellipse.d.ts.map +0 -1
  155. package/dist/ellipse.js.map +0 -1
  156. package/dist/file.d.ts.map +0 -1
  157. package/dist/file.js +0 -13
  158. package/dist/file.js.map +0 -1
  159. package/dist/heading.d.ts.map +0 -1
  160. package/dist/heading.js.map +0 -1
  161. package/dist/hydrate.d.ts.map +0 -1
  162. package/dist/hydrate.js.map +0 -1
  163. package/dist/layer.d.ts.map +0 -1
  164. package/dist/layer.js.map +0 -1
  165. package/dist/layout-registry.d.ts.map +0 -1
  166. package/dist/layout-registry.js.map +0 -1
  167. package/dist/layout.d.ts.map +0 -1
  168. package/dist/layout.js.map +0 -1
  169. package/dist/operations.d.ts.map +0 -1
  170. package/dist/operations.js.map +0 -1
  171. package/dist/order.d.ts.map +0 -1
  172. package/dist/order.js.map +0 -1
  173. package/dist/outline.d.ts.map +0 -1
  174. package/dist/outline.js.map +0 -1
  175. package/dist/patch.d.ts.map +0 -1
  176. package/dist/patch.js.map +0 -1
  177. package/dist/queries.d.ts.map +0 -1
  178. package/dist/queries.js.map +0 -1
  179. package/dist/render-bounds.d.ts.map +0 -1
  180. package/dist/render-bounds.js.map +0 -1
  181. package/dist/scene.d.ts.map +0 -1
  182. package/dist/scene.js.map +0 -1
  183. package/dist/shape-transform.d.ts.map +0 -1
  184. package/dist/shape-transform.js.map +0 -1
  185. package/dist/shape.d.ts.map +0 -1
  186. package/dist/shape.js.map +0 -1
  187. package/dist/snap.d.ts.map +0 -1
  188. package/dist/snap.js.map +0 -1
  189. package/dist/spatial.d.ts.map +0 -1
  190. package/dist/spatial.js.map +0 -1
  191. package/dist/style.d.ts.map +0 -1
  192. package/dist/style.js.map +0 -1
  193. package/dist/text-measure.d.ts.map +0 -1
  194. package/dist/text-measure.js.map +0 -1
  195. package/dist/text-runs.d.ts.map +0 -1
  196. package/dist/text-runs.js.map +0 -1
  197. package/dist/three-way-merge.d.ts.map +0 -1
  198. package/dist/three-way-merge.js.map +0 -1
  199. package/dist/viewport.d.ts.map +0 -1
  200. package/dist/viewport.js.map +0 -1
  201. /package/dist/{annotation.d.ts → annotations/annotation.d.ts} +0 -0
  202. /package/dist/{annotation.js → annotations/annotation.js} +0 -0
  203. /package/dist/{edge-curve.d.ts → edges/edge-curve.d.ts} +0 -0
  204. /package/dist/{edge.js → edges/edge.js} +0 -0
  205. /package/dist/{elbow-router.d.ts → edges/elbow-router.d.ts} +0 -0
  206. /package/dist/{layout-registry.js → layout/layout-registry.js} +0 -0
  207. /package/dist/{diff.d.ts → model/diff.d.ts} +0 -0
  208. /package/dist/{diff.js → model/diff.js} +0 -0
  209. /package/dist/{layer.d.ts → model/layer.d.ts} +0 -0
  210. /package/dist/{layer.js → model/layer.js} +0 -0
  211. /package/dist/{operations.js → model/operations.js} +0 -0
  212. /package/dist/{order.d.ts → model/order.d.ts} +0 -0
  213. /package/dist/{order.js → model/order.js} +0 -0
  214. /package/dist/{patch.js → model/patch.js} +0 -0
  215. /package/dist/{scene.js → model/scene.js} +0 -0
  216. /package/dist/{three-way-merge.js → model/three-way-merge.js} +0 -0
  217. /package/dist/{spatial.d.ts → query/spatial.d.ts} +0 -0
  218. /package/dist/{spatial.js → query/spatial.js} +0 -0
  219. /package/dist/{brush-outline.d.ts → shapes/brush-outline.d.ts} +0 -0
  220. /package/dist/{ellipse.d.ts → shapes/ellipse.d.ts} +0 -0
  221. /package/dist/{ellipse.js → shapes/ellipse.js} +0 -0
  222. /package/dist/{render-bounds.d.ts → shapes/render-bounds.d.ts} +0 -0
  223. /package/dist/{render-bounds.js → shapes/render-bounds.js} +0 -0
  224. /package/dist/{shape-transform.d.ts → shapes/shape-transform.d.ts} +0 -0
  225. /package/dist/{shape-transform.js → shapes/shape-transform.js} +0 -0
  226. /package/dist/{text-measure.d.ts → text/text-measure.d.ts} +0 -0
  227. /package/dist/{text-measure.js → text/text-measure.js} +0 -0
  228. /package/dist/{text-runs.js → text/text-runs.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import { vec2 } from "@oh-just-another/math";
2
2
  import { req } from "@oh-just-another/types";
3
- import { BRUSH_OUTLINE_ARC_STEP, BRUSH_OUTLINE_MITER_LIMIT } from "./constants.js";
3
+ import { BRUSH_OUTLINE_ARC_STEP, BRUSH_OUTLINE_MITER_LIMIT } from "../constants.js";
4
4
  /**
5
5
  * The single closed outline polygon of a variable-width brush stroke: the left
6
6
  * offset side forward, a round end cap, the right offset side back, a round start
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brush-outline.js","sourceRoot":"","sources":["../../src/shapes/brush-outline.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Bounds, ElementId, Vec2 } from "@oh-just-another/types";
2
- import type { Scene } from "./scene.js";
2
+ import type { Scene } from "../model/scene.js";
3
3
  import type { Element, ElementBase } from "./shape.js";
4
4
  /**
5
5
  * Container behaviour spec. Carried on a shape via
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/shapes/container.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGvD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,aAAa,GAAG,IAAI,CAAC;AAI7E;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,UAAU,iBAAiB,KAAG,IAEvE,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,WAAW,GAAI,GAAG,WAAW,KAAG,OAAuC,CAAC;AAErF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,GAAI,GAAG,WAAW,KAAG,aAAa,GAAG,IA2CjE,CAAC;AAYF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,GAAG,WAAW,KAAG,MAAM,GAAG,IAS1D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;AAItF,sEAAsE;AACtE,eAAO,MAAM,8BAA8B,GAAI,UAAU,sBAAsB,KAAG,IAEjF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAAI,GAAG,WAAW,KAAG,SAAS,MAAM,EAcjE,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,KAAK,EACZ,YAAY,IAAI,EAChB,UAAS,WAAW,CAAC,SAAS,CAAa,KAC1C,OAAO,GAAG,IAgBZ,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAAI,WAAW,WAAW,EAAE,YAAY,MAAM,KAAG,MAAM,GAAG,IAuCzF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAC/B,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,EAC/D,UAAU,MAAM,KACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,IAAI,CAAA;CAcvD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { bounds as B } from "@oh-just-another/math";
2
- import { getLayersInOrder, getElementsInLayer } from "./queries.js";
2
+ import { getLayersInOrder, getElementsInLayer } from "../query/queries.js";
3
3
  const resolvers = [];
4
4
  /**
5
5
  * Plug in a resolver. Called in registration order — first non-null
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/shapes/container.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,uBAAuB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAgC3E,MAAM,SAAS,GAAwB,EAAE,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAA2B,EAAQ,EAAE;IAC7E,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAc,EAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAErF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAc,EAAwB,EAAE;IACvE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACxB,CAAC;IACD,wEAAwE;IACxE,oEAAoE;IACpE,qEAAqE;IACrE,oEAAoE;IACpE,mEAAmE;IACnE,wCAAwC;IACxC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAkF,CAAC;IAClG,iEAAiE;IACjE,+DAA+D;IAC/D,uCAAuC;IACvC,MAAM,KAAK,GAAG,CAAqD,CAAC;IACpE,IACE,IAAI,EAAE,UAAU,IAAI,IAAI;QACxB,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAChC,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,2BAA2B,CAAC;QACvE,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QACtB,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QACvB,OAAO;YACL,QAAQ,EAAE;gBACR,CAAC,EAAE,OAAO;gBACV,CAAC,EAAE,OAAO;gBACV,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;gBACnC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;aACrC;YACD,OAAO;SACR,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC;IAChC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,GAAG,GAAG,CAA4C,CAAC;IACzD,IAAI,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,IAAI,GACR,GAAG,CAAC,OAAO,KAAK,SAAS;QACvB,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;QAClD,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAc,EAAiB,EAAE;IAChE,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO;QACL,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;QAC1B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;KAC7B,CAAC;AACJ,CAAC,CAAC;AAUF,MAAM,cAAc,GAA6B,EAAE,CAAC;AAEpD,sEAAsE;AACtE,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,QAAgC,EAAQ,EAAE;IACvF,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAc,EAAqB,EAAE;IACrE,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvB,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrB,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAAY,EACZ,UAAgB,EAChB,UAAkC,IAAI,GAAG,EAAE,EAC3B,EAAE;IAClB,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE,OAAO;YAAE,SAAS;QAC9B,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,KAAK,SAAS;gBAAE,SAAS;YAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAE,SAAS;YAChC,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;gBAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAsB,EAAE,UAAkB,EAAiB,EAAE;IAC/F,MAAM,IAAI,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IAClC,0CAA0C;IAC1C,MAAM,UAAU,GAAW;QACzB,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtC,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;IACF,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IACxB,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;IAC3C,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC5C,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACf,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACf,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,iEAAiE;IACjE,mEAAmE;IACnE,4DAA4D;IAC5D,kEAAkE;IAClE,+DAA+D;IAC/D,8DAA8D;IAC9D,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,CAAC,EAAE,OAAO;QACV,CAAC,EAAE,OAAO;QACV,KAAK,EAAE,OAAO,GAAG,OAAO;QACxB,MAAM,EAAE,OAAO,GAAG,OAAO;KAC1B,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAA+D,EAC/D,QAAgB,EACyC,EAAE;IAC3D,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;IAChC,oEAAoE;IACpE,sEAAsE;IACtE,yBAAyB;IACzB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACjE,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,OAAO;QACvC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,QAAQ;QACzC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;KAC1C,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../src/shapes/ellipse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,IAAI,MAAM,EACV,IAAI,MAAM,EACV,IAAI,MAAM,EACV,IAAI,MAAM,EACV,OAAO,MAAM,KACZ,IAGF,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipse.js","sourceRoot":"","sources":["../../src/shapes/ellipse.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,KAAa,EACP,EAAE;IACR,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,mBAAmB;IACpE,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;AACxE,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-bounds.d.ts","sourceRoot":"","sources":["../../src/shapes/render-bounds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,KAAK,sBAAsB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,cAAc,CAAC;AAIrE;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,MAAM,MAAM,EAAE,IAAI,sBAAsB,KAAG,IAEjF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,WAAW,KAAG,MAgB3D,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-bounds.js","sourceRoot":"","sources":["../../src/shapes/render-bounds.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAoB,MAAM,YAAY,CAAC;AAuBrE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;AAE5D;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAY,EAAE,EAA0B,EAAQ,EAAE;IACvF,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAkB,EAAU,EAAE;IACnE,MAAM,CAAC,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACzB,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACrE,OAAO;QACL,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI;QACb,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,KAAK;QAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM;KAChC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-transform.d.ts","sourceRoot":"","sources":["../../src/shapes/shape-transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,WAAW,EAAE,OAAO,IAAI,KAAG,IAS9D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,WAAW,EAAE,OAAO,IAAI,KAAG,IAY9D,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-transform.js","sourceRoot":"","sources":["../../src/shapes/shape-transform.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAkB,EAAE,KAAW,EAAQ,EAAE;IACpE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO;QACL,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;QAC3C,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;KAC5C,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAkB,EAAE,KAAW,EAAQ,EAAE;IACpE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,uBAAuB;IACvB,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;IAC/B,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;IAChC,OAAO;QACL,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;KAChD,CAAC;AACJ,CAAC,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import type { Bounds, FileId, LayerId, ElementId, Vec2 } from "@oh-just-another/types";
2
2
  import type { FractionalIndex } from "fractional-keys";
3
- import type { AnchorRef } from "./edge.js";
4
- import type { Style, TextStyle } from "./style.js";
5
- import type { TextRun } from "./text-runs.js";
3
+ import type { AnchorRef } from "../edges/edge.js";
4
+ import type { Style, TextStyle } from "../text/style.js";
5
+ import type { TextRun } from "../text/text-runs.js";
6
6
  /**
7
7
  * Fields shared by every shape variant. `order` is a fractional-index string
8
8
  * used for z-ordering within the parent layer — insertions are O(1) and never
@@ -91,6 +91,15 @@ export interface ElementBase {
91
91
  * shape.
92
92
  */
93
93
  readonly hidden?: boolean;
94
+ /**
95
+ * Embedded text label — the shape's own text content, drawn inside its
96
+ * bounds (wrapped to the width, aligned via `style.textAlign` /
97
+ * `style.textBaseline`, `middle`+`center` by default). Shares the text
98
+ * element's building blocks (styled runs, list paragraphs) as data;
99
+ * layout is the renderer's job. Double-click opens the inline editor
100
+ * on shapes that support it (see `canCarryLabel`).
101
+ */
102
+ readonly label?: ShapeLabel;
94
103
  /**
95
104
  * Element-level hyperlink. Any shape — text, image,
96
105
  * rectangle — can carry one. The host opens it on Cmd/Ctrl-click or via
@@ -154,6 +163,90 @@ export interface TextElement extends ElementBase {
154
163
  * (renders exactly like a plain text block). See {@link TextRun}.
155
164
  */
156
165
  readonly runs?: readonly TextRun[];
166
+ /**
167
+ * Optional per-paragraph attributes (lists / nesting), aligned by index
168
+ * with `text.split("\n")`. A shorter array leaves the trailing
169
+ * paragraphs plain; omitted = every paragraph plain. Numbering for
170
+ * `"numbered"` items is derived at render time (consecutive numbered
171
+ * paragraphs at the same indent count up), never stored.
172
+ */
173
+ readonly paragraphs?: readonly TextParagraph[];
174
+ }
175
+ /**
176
+ * Embedded text carried by a non-text shape (see `ElementBase.label`).
177
+ * Field-for-field compatible with the text element's content model so
178
+ * the text pipeline (runs, paragraphs, layout, inline editing) applies
179
+ * unchanged.
180
+ */
181
+ export interface ShapeLabel {
182
+ readonly text: string;
183
+ readonly fontFamily: string;
184
+ readonly fontSize: number;
185
+ /**
186
+ * Auto-fit mode (sticky notes): the RENDERED font size is derived so
187
+ * the text fills the shape body, scaling with the shape; `fontSize`
188
+ * then only serves as the fallback / upper hint. Picking an explicit
189
+ * size in the toolbar clears the flag.
190
+ */
191
+ readonly autoFit?: boolean;
192
+ /** Optional style overlay; `textAlign`/`textBaseline` default to center/middle. */
193
+ readonly style?: TextStyle;
194
+ readonly runs?: readonly TextRun[];
195
+ readonly paragraphs?: readonly TextParagraph[];
196
+ }
197
+ /**
198
+ * Sticky note — a bounded card whose text lives in the shared embedded
199
+ * `label` (double-click to edit). Background comes from `style.fill`;
200
+ * `authorName` renders along the bottom edge when `showAuthor` is on.
201
+ * Registered as a plugin-style type: not part of the built-in `Element`
202
+ * union, handled through the renderer / bounder registries and the
203
+ * custom-element wire schema.
204
+ */
205
+ export interface StickyElement extends ElementBase {
206
+ readonly type: "sticky";
207
+ readonly width: number;
208
+ readonly height: number;
209
+ readonly authorName?: string;
210
+ readonly showAuthor?: boolean;
211
+ /** Free-form tags, rendered as small pills along the bottom edge. */
212
+ readonly tags?: readonly string[];
213
+ /**
214
+ * Emoji reactions. Each glyph tracks WHO reacted (`users` — collab
215
+ * user ids); the visible counter is `users.length`. A user's click on
216
+ * a glyph they already reacted with removes their reaction (toggle),
217
+ * anyone else's click adds theirs. The add button lives in the host
218
+ * UI at the sticky's bottom-left corner.
219
+ */
220
+ readonly reactions?: readonly {
221
+ readonly glyph: string;
222
+ readonly users: readonly string[];
223
+ }[];
224
+ }
225
+ /** True when the shape is a sticky note. */
226
+ export declare const isSticky: (shape: ElementBase) => shape is StickyElement;
227
+ /**
228
+ * Emoji element — a single glyph drawn at `size` world units. The glyph
229
+ * is replaced via the toolbar picker. Plugin-style type like `sticky`.
230
+ */
231
+ export interface EmojiElement extends ElementBase {
232
+ readonly type: "emoji";
233
+ readonly glyph: string;
234
+ readonly size: number;
235
+ }
236
+ /** True when the shape is an emoji element. */
237
+ export declare const isEmoji: (shape: ElementBase) => shape is EmojiElement;
238
+ /** True when the shape's type supports an embedded text label. */
239
+ export declare const canCarryLabel: (shape: ElementBase) => boolean;
240
+ /**
241
+ * Paragraph-level attributes for a {@link TextElement}. Both fields are
242
+ * optional so plain paragraphs serialize as `{}` (or are omitted entirely
243
+ * via a short array).
244
+ */
245
+ export interface TextParagraph {
246
+ /** List marker kind; omitted = plain paragraph. */
247
+ readonly list?: "bullet" | "numbered";
248
+ /** 0-based nesting level. Omitted = 0. */
249
+ readonly indent?: number;
157
250
  }
158
251
  /**
159
252
  * Normalised crop rectangle for an {@link ImageElement}. All four
@@ -171,6 +264,29 @@ export interface ImageCrop {
171
264
  readonly width: number;
172
265
  readonly height: number;
173
266
  }
267
+ /**
268
+ * Shape mask applied to an image element's BOX (after crop): pixels
269
+ * outside the mask are clipped away by the renderer (`RenderTarget.clip`
270
+ * — canvas2d clip / svg clipPath / webgl2 stencil). Coordinates are
271
+ * normalised to the element box (0..1 on both axes), so the mask scales
272
+ * with the shape. Additive: scenes and renderers that predate masks
273
+ * ignore it and draw the full box.
274
+ *
275
+ * - `ellipse` — inscribed ellipse (circle on a square box).
276
+ * - `round-rect` — rounded rectangle; `radius` is a fraction of the
277
+ * SHORTER box side (0..0.5; 0.5 = capsule).
278
+ * - `polygon` — arbitrary closed ring of normalised points (≥ 3). The
279
+ * built-in presets live in {@link IMAGE_MASK_POLYGON_PRESETS}.
280
+ */
281
+ export type ImageMask = {
282
+ readonly kind: "ellipse";
283
+ } | {
284
+ readonly kind: "round-rect";
285
+ readonly radius: number;
286
+ } | {
287
+ readonly kind: "polygon";
288
+ readonly points: readonly Vec2[];
289
+ };
174
290
  export interface ImageElement extends ElementBase {
175
291
  readonly type: "image";
176
292
  /**
@@ -185,6 +301,11 @@ export interface ImageElement extends ElementBase {
185
301
  * cropping simply ignore it and draw the full bitmap.
186
302
  */
187
303
  readonly crop?: ImageCrop;
304
+ /**
305
+ * Optional shape mask clipping the drawn box. Omitted = no mask.
306
+ * Independent of (and applied after) `crop`. See {@link ImageMask}.
307
+ */
308
+ readonly mask?: ImageMask;
188
309
  /**
189
310
  * Id of the `BinaryFile` in `Scene.files` that backs this image.
190
311
  * When present, hosts should resolve through the file registry
@@ -194,6 +315,12 @@ export interface ImageElement extends ElementBase {
194
315
  readonly fileId?: FileId;
195
316
  readonly width: number;
196
317
  readonly height: number;
318
+ /**
319
+ * Accessible description of the image content. Surfaced as `<title>`
320
+ * in SVG output and available to hosts for `aria` wiring. Omitted =
321
+ * decorative / undescribed.
322
+ */
323
+ readonly alt?: string;
197
324
  /**
198
325
  * Animated-content hint (opt-in). When set, the
199
326
  * renderer's image path consults `getAnimationAdapter(kind)`
@@ -250,6 +377,24 @@ export interface BrushElement extends ElementBase {
250
377
  * on itself. Omitted (undefined) for ordinary open strokes.
251
378
  */
252
379
  readonly closed?: boolean;
380
+ /**
381
+ * Raw input pressure (0–1) per point, aligned 1:1 with `points`. The baked
382
+ * `width` is derived from it (base width × pressure curve × taper), so a
383
+ * stroke can be regenerated with a different base width / thinning without
384
+ * re-capturing. Omitted on strokes committed before pressures were stored.
385
+ */
386
+ readonly pressures?: readonly number[];
387
+ /**
388
+ * True when `pressures` were synthesised from pointer speed (mouse / touch
389
+ * without a real pressure channel) rather than read from the device. Lets a
390
+ * regeneration pass know whether re-simulating is appropriate.
391
+ */
392
+ readonly simulatePressure?: boolean;
393
+ /**
394
+ * The brush base half-width (local px) the stroke was committed with — the
395
+ * value the pressure curve scaled toward. Omitted on legacy strokes.
396
+ */
397
+ readonly baseWidth?: number;
253
398
  }
254
399
  /**
255
400
  * Container shape that holds children via the shared `parentId` link.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape.d.ts","sourceRoot":"","sources":["../../src/shapes/shape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAKpD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtD;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAEvD;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAE9B;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAE7B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAE5B;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACzC;IAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACzC;IAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACjE;IAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GAC3F;IAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAA;CAAE,CAAC;AAE3B,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CAChD;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CAChD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;CAC/F;AAED,4CAA4C;AAC5C,eAAO,MAAM,QAAQ,GAAI,OAAO,WAAW,KAAG,KAAK,IAAI,aAAwC,CAAC;AAEhG;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,+CAA+C;AAC/C,eAAO,MAAM,OAAO,GAAI,OAAO,WAAW,KAAG,KAAK,IAAI,YAAsC,CAAC;AAW7F,kEAAkE;AAClE,eAAO,MAAM,aAAa,GAAI,OAAO,WAAW,KAAG,OAA0C,CAAC;AAE9F;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACtC,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAA;CAAE,CAAC;AAEnE,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;IACtD,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,iFAAiF;IACjF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,cAAc,GACd,cAAc,GACd,WAAW,GACX,WAAW,GACX,YAAY,GACZ,eAAe,GACf,YAAY,GACZ,YAAY,GACZ,iBAAiB,GACjB,YAAY,CAAC;AAEjB;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,cAAc,GAAG,WAAW,CAAC;AAInD,eAAO,MAAM,WAAW,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,gBAA0C,CAAC;AAC7F,eAAO,MAAM,SAAS,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,cAAsC,CAAC;AACvF,eAAO,MAAM,SAAS,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,cAAsC,CAAC;AACvF,eAAO,MAAM,MAAM,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,WAAgC,CAAC;AAC9E,eAAO,MAAM,MAAM,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,WAAgC,CAAC;AAC9E,eAAO,MAAM,OAAO,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,YAAkC,CAAC;AACjF,eAAO,MAAM,UAAU,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,eAAwC,CAAC;AAC1F,eAAO,MAAM,OAAO,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,YAAkC,CAAC;AACjF,eAAO,MAAM,OAAO,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,YAAkC,CAAC;AACjF,eAAO,MAAM,YAAY,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,iBAA6C,CAAC;AACjG,eAAO,MAAM,OAAO,GAAI,GAAG,WAAW,KAAG,CAAC,IAAI,YAAkC,CAAC;AAEjF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,KAAK,KAAG,MAA8C,CAAC;AAI7F;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;AAIvF;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,WAAW,EACnD,MAAM,CAAC,CAAC,MAAM,CAAC,EACf,SAAS,cAAc,CAAC,CAAC,CAAC,KACzB,IAEF,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,cAAc,GAAG,SAAsC,CAAC;AAElG;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,WAAW,KAAG,MAM1D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,WAAW,KAAG,MAoB1D,CAAC"}
@@ -1,6 +1,21 @@
1
1
  import { bounds as B } from "@oh-just-another/math";
2
- import { TEXT_APPROX_CHAR_WIDTH_FACTOR, TEXT_LINE_HEIGHT_FACTOR } from "./constants.js";
3
- import { getTextMeasurer } from "./text-measure.js";
2
+ import { TEXT_APPROX_CHAR_WIDTH_FACTOR, TEXT_LINE_HEIGHT_FACTOR } from "../constants.js";
3
+ import { getTextMeasurer } from "../text/text-measure.js";
4
+ import { pickTextPlaceholder } from "../text/placeholder.js";
5
+ /** True when the shape is a sticky note. */
6
+ export const isSticky = (shape) => shape.type === "sticky";
7
+ /** True when the shape is an emoji element. */
8
+ export const isEmoji = (shape) => shape.type === "emoji";
9
+ /** Shape types whose body can host an embedded label. */
10
+ const LABELABLE_TYPES = new Set([
11
+ "rectangle",
12
+ "ellipse",
13
+ "polygon",
14
+ "block-arrow",
15
+ "sticky",
16
+ ]);
17
+ /** True when the shape's type supports an embedded text label. */
18
+ export const canCarryLabel = (shape) => LABELABLE_TYPES.has(shape.type);
4
19
  // --- type guards ---
5
20
  export const isRectangle = (s) => s.type === "rectangle";
6
21
  export const isEllipse = (s) => s.type === "ellipse";
@@ -81,6 +96,13 @@ registerBounder("ellipse", (s) => ({
81
96
  height: s.height,
82
97
  }));
83
98
  registerBounder("polygon", (s) => B.fromPoints(s.points));
99
+ registerBounder("sticky", (s) => ({
100
+ x: 0,
101
+ y: 0,
102
+ width: s.width,
103
+ height: s.height,
104
+ }));
105
+ registerBounder("emoji", (s) => ({ x: 0, y: 0, width: s.size, height: s.size }));
84
106
  registerBounder("path", (s) => {
85
107
  const points = [];
86
108
  let cursor = { x: 0, y: 0 };
@@ -114,7 +136,11 @@ registerBounder("text", (s) => {
114
136
  // estimate (`chars × fontSize × factor`) headless / in tests. Height
115
137
  // is line count × line-height; hard newlines honoured in both modes.
116
138
  const lineHeight = s.fontSize * TEXT_LINE_HEIGHT_FACTOR;
117
- const paragraphs = s.text.split("\n");
139
+ // An empty element is sized by its placeholder prompt (the renderer draws
140
+ // it while the text is being written), so the selection box and the
141
+ // dirty rect cover exactly what is on screen; the box snaps to the real
142
+ // text from the first keystroke.
143
+ const paragraphs = (s.text === "" ? pickTextPlaceholder(s.id) : s.text).split("\n");
118
144
  const measurer = getTextMeasurer();
119
145
  // Pass weight/style so the measured width matches the rendered (bold /
120
146
  // italic) glyphs — otherwise the box wouldn't grow when text is bolded.
@@ -132,8 +158,7 @@ registerBounder("text", (s) => {
132
158
  };
133
159
  if (s.maxWidth === undefined) {
134
160
  // Auto-width: widest paragraph drives width, one visual line per
135
- // paragraph. Empty text keeps a caret-sized box so it stays
136
- // selectable / editable.
161
+ // paragraph.
137
162
  let width = 0;
138
163
  for (const p of paragraphs)
139
164
  width = Math.max(width, measureLine(p));
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape.js","sourceRoot":"","sources":["../../src/shapes/shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { TextParagraph } from "../shapes/shape.js";
2
+ /**
3
+ * Paragraph-attribute helpers for text lists. A "paragraph" is a
4
+ * `\n`-separated block of a text element's flat `text`; attributes
5
+ * (`TextParagraph`) are stored in an array aligned by paragraph index.
6
+ * These helpers keep that array consistent as the text is edited and
7
+ * answer range queries for the toolbar.
8
+ */
9
+ /** Number of paragraphs in `text` (always ≥ 1; empty text = one empty paragraph). */
10
+ export declare const paragraphCount: (text: string) => number;
11
+ /**
12
+ * Paragraph index range `[first, last]` (inclusive) covered by the source
13
+ * offset range `[from, to]`. Offsets outside the text are clamped.
14
+ */
15
+ export declare const paragraphRangeForOffsets: (text: string, from: number, to: number) => {
16
+ readonly first: number;
17
+ readonly last: number;
18
+ };
19
+ /** Attrs for a paragraph index (missing / short array → plain). */
20
+ export declare const paragraphAt: (paragraphs: readonly TextParagraph[] | undefined, index: number) => TextParagraph;
21
+ /**
22
+ * Canonical form: trailing plain paragraphs are dropped; an all-plain
23
+ * array collapses to `undefined` so plain text stays byte-identical on
24
+ * the wire.
25
+ */
26
+ export declare const normalizeParagraphs: (paragraphs: readonly TextParagraph[]) => readonly TextParagraph[] | undefined;
27
+ /**
28
+ * Re-align the paragraph-attribute array after a text change. Paragraphs
29
+ * are matched by the longest common prefix and suffix of the old / new
30
+ * paragraph lists; the edited middle keeps the first edited paragraph's
31
+ * attrs and lets inserted paragraphs inherit them — so pressing Enter
32
+ * inside a list item continues the list, and deleting a line drops its
33
+ * attrs with it. Pure and heuristic by design: it has no caret input, so
34
+ * pathological multi-paragraph pastes may inherit conservatively (plain).
35
+ */
36
+ export declare const remapParagraphsForTextChange: (oldText: string, newText: string, paragraphs: readonly TextParagraph[] | undefined) => readonly TextParagraph[] | undefined;
37
+ /**
38
+ * Derived list markers, one per paragraph: `"•"` for bullets, `"N."` for
39
+ * numbered items (consecutive numbered paragraphs at the SAME indent
40
+ * count up; any other paragraph kind resets the counter), `null` for
41
+ * plain paragraphs.
42
+ */
43
+ export declare const listMarkers: (paragraphs: readonly TextParagraph[] | undefined, count: number) => readonly (string | null)[];
44
+ //# sourceMappingURL=paragraphs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraphs.d.ts","sourceRoot":"","sources":["../../src/text/paragraphs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;GAMG;AAEH,qFAAqF;AACrF,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,MAI7C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GACnC,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,IAAI,MAAM,KACT;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAajD,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,WAAW,GACtB,YAAY,SAAS,aAAa,EAAE,GAAG,SAAS,EAChD,OAAO,MAAM,KACZ,aAA0C,CAAC;AAI9C;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,YAAY,SAAS,aAAa,EAAE,KACnC,SAAS,aAAa,EAAE,GAAG,SAK7B,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,GACvC,SAAS,MAAM,EACf,SAAS,MAAM,EACf,YAAY,SAAS,aAAa,EAAE,GAAG,SAAS,KAC/C,SAAS,aAAa,EAAE,GAAG,SAoC7B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,YAAY,SAAS,aAAa,EAAE,GAAG,SAAS,EAChD,OAAO,MAAM,KACZ,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAoB1B,CAAC"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Paragraph-attribute helpers for text lists. A "paragraph" is a
3
+ * `\n`-separated block of a text element's flat `text`; attributes
4
+ * (`TextParagraph`) are stored in an array aligned by paragraph index.
5
+ * These helpers keep that array consistent as the text is edited and
6
+ * answer range queries for the toolbar.
7
+ */
8
+ /** Number of paragraphs in `text` (always ≥ 1; empty text = one empty paragraph). */
9
+ export const paragraphCount = (text) => {
10
+ let n = 1;
11
+ for (const ch of text)
12
+ if (ch === "\n")
13
+ n++;
14
+ return n;
15
+ };
16
+ /**
17
+ * Paragraph index range `[first, last]` (inclusive) covered by the source
18
+ * offset range `[from, to]`. Offsets outside the text are clamped.
19
+ */
20
+ export const paragraphRangeForOffsets = (text, from, to) => {
21
+ const lo = Math.max(0, Math.min(from, to));
22
+ const hi = Math.min(text.length, Math.max(from, to));
23
+ // Paragraph index = newlines before the offset; `hi` may equal `text.length`
24
+ // (caret at the very end), so the count runs over `[0, hi)` only.
25
+ let idx = 0;
26
+ let first = 0;
27
+ for (let i = 0; i < hi; i++) {
28
+ if (i === lo)
29
+ first = idx;
30
+ if (text[i] === "\n")
31
+ idx++;
32
+ }
33
+ if (lo >= hi)
34
+ first = idx;
35
+ return { first, last: idx };
36
+ };
37
+ /** Attrs for a paragraph index (missing / short array → plain). */
38
+ export const paragraphAt = (paragraphs, index) => paragraphs?.[index] ?? {};
39
+ const isPlain = (p) => p.list === undefined && (p.indent ?? 0) === 0;
40
+ /**
41
+ * Canonical form: trailing plain paragraphs are dropped; an all-plain
42
+ * array collapses to `undefined` so plain text stays byte-identical on
43
+ * the wire.
44
+ */
45
+ export const normalizeParagraphs = (paragraphs) => {
46
+ let end = paragraphs.length;
47
+ while (end > 0 && isPlain(paragraphs[end - 1] ?? {}))
48
+ end--;
49
+ if (end === 0)
50
+ return undefined;
51
+ return paragraphs.slice(0, end);
52
+ };
53
+ /**
54
+ * Re-align the paragraph-attribute array after a text change. Paragraphs
55
+ * are matched by the longest common prefix and suffix of the old / new
56
+ * paragraph lists; the edited middle keeps the first edited paragraph's
57
+ * attrs and lets inserted paragraphs inherit them — so pressing Enter
58
+ * inside a list item continues the list, and deleting a line drops its
59
+ * attrs with it. Pure and heuristic by design: it has no caret input, so
60
+ * pathological multi-paragraph pastes may inherit conservatively (plain).
61
+ */
62
+ export const remapParagraphsForTextChange = (oldText, newText, paragraphs) => {
63
+ if (paragraphs === undefined || paragraphs.length === 0)
64
+ return undefined;
65
+ if (oldText === newText)
66
+ return paragraphs;
67
+ const oldParas = oldText.split("\n");
68
+ const newParas = newText.split("\n");
69
+ if (oldParas.length === newParas.length)
70
+ return paragraphs; // in-line edit — indices stable
71
+ // Longest common prefix / suffix of the paragraph LISTS (exact match).
72
+ let prefix = 0;
73
+ while (prefix < oldParas.length &&
74
+ prefix < newParas.length &&
75
+ oldParas[prefix] === newParas[prefix]) {
76
+ prefix++;
77
+ }
78
+ let suffix = 0;
79
+ while (suffix < oldParas.length - prefix &&
80
+ suffix < newParas.length - prefix &&
81
+ oldParas[oldParas.length - 1 - suffix] === newParas[newParas.length - 1 - suffix]) {
82
+ suffix++;
83
+ }
84
+ const out = [];
85
+ for (let i = 0; i < prefix; i++)
86
+ out.push(paragraphAt(paragraphs, i));
87
+ // The edited middle: inherit the first edited old paragraph's attrs
88
+ // (falls back to the last prefix paragraph when the middle was empty —
89
+ // a pure insertion continues whatever precedes it).
90
+ const inheritFrom = Math.min(prefix, oldParas.length - 1);
91
+ const inherited = paragraphAt(paragraphs, inheritFrom);
92
+ const newMiddle = newParas.length - prefix - suffix;
93
+ for (let i = 0; i < newMiddle; i++)
94
+ out.push(inherited);
95
+ for (let i = suffix; i > 0; i--)
96
+ out.push(paragraphAt(paragraphs, oldParas.length - i));
97
+ return normalizeParagraphs(out);
98
+ };
99
+ /**
100
+ * Derived list markers, one per paragraph: `"•"` for bullets, `"N."` for
101
+ * numbered items (consecutive numbered paragraphs at the SAME indent
102
+ * count up; any other paragraph kind resets the counter), `null` for
103
+ * plain paragraphs.
104
+ */
105
+ export const listMarkers = (paragraphs, count) => {
106
+ const out = [];
107
+ const counters = new Map();
108
+ for (let i = 0; i < count; i++) {
109
+ const p = paragraphAt(paragraphs, i);
110
+ const level = p.indent ?? 0;
111
+ if (p.list === "numbered") {
112
+ const n = (counters.get(level) ?? 0) + 1;
113
+ counters.set(level, n);
114
+ // A deeper-or-equal reset boundary: nested lists restart when the
115
+ // chain is interrupted at their own level (handled below).
116
+ for (const key of [...counters.keys()])
117
+ if (key > level)
118
+ counters.delete(key);
119
+ out.push(`${String(n)}.`);
120
+ }
121
+ else {
122
+ if (p.list === undefined)
123
+ counters.clear();
124
+ else
125
+ for (const key of [...counters.keys()])
126
+ if (key >= level)
127
+ counters.delete(key);
128
+ out.push(p.list === "bullet" ? "•" : null);
129
+ }
130
+ }
131
+ return out;
132
+ };
133
+ //# sourceMappingURL=paragraphs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraphs.js","sourceRoot":"","sources":["../../src/text/paragraphs.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,qFAAqF;AACrF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;IACrD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,EAAE,IAAI,IAAI;QAAE,IAAI,EAAE,KAAK,IAAI;YAAE,CAAC,EAAE,CAAC;IAC5C,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,IAAY,EACZ,IAAY,EACZ,EAAU,EACyC,EAAE;IACrD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACrD,6EAA6E;IAC7E,kEAAkE;IAClE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE;YAAE,KAAK,GAAG,GAAG,CAAC;QAC1B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,GAAG,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,EAAE,IAAI,EAAE;QAAE,KAAK,GAAG,GAAG,CAAC;IAC1B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,UAAgD,EAChD,KAAa,EACE,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAE9C,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AAE7F;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,UAAoC,EACE,EAAE;IACxC,IAAI,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC;IAC5B,OAAO,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAAE,GAAG,EAAE,CAAC;IAC5D,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,OAAe,EACf,OAAe,EACf,UAAgD,EACV,EAAE;IACxC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1E,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,UAAU,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,UAAU,CAAC,CAAC,gCAAgC;IAE5F,uEAAuE;IACvE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OACE,MAAM,GAAG,QAAQ,CAAC,MAAM;QACxB,MAAM,GAAG,QAAQ,CAAC,MAAM;QACxB,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,EACrC,CAAC;QACD,MAAM,EAAE,CAAC;IACX,CAAC;IACD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OACE,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM;QACjC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM;QACjC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,EACjF,CAAC;QACD,MAAM,EAAE,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,oEAAoE;IACpE,uEAAuE;IACvE,oDAAoD;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxD,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACxF,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,UAAgD,EAChD,KAAa,EACe,EAAE;IAC9B,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACzC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvB,kEAAkE;YAClE,2DAA2D;YAC3D,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAAE,IAAI,GAAG,GAAG,KAAK;oBAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9E,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;gBAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;;gBACtC,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAAE,IAAI,GAAG,IAAI,KAAK;wBAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpF,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type TextPlaceholder } from "../constants.js";
2
+ /**
3
+ * Pick the placeholder for an empty text element. Weighted by
4
+ * `TextPlaceholder.weight`, and DETERMINISTIC in `seed` (the element id):
5
+ * the same element always shows the same prompt — no reshuffling between
6
+ * frames or re-renders — while different elements spread across the list.
7
+ */
8
+ export declare const pickTextPlaceholder: (seed: string, placeholders?: readonly TextPlaceholder[]) => string;
9
+ //# sourceMappingURL=placeholder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placeholder.d.ts","sourceRoot":"","sources":["../../src/text/placeholder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAY1E;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC9B,MAAM,MAAM,EACZ,eAAc,SAAS,eAAe,EAAsB,KAC3D,MASF,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { TEXT_PLACEHOLDERS } from "../constants.js";
2
+ /** FNV-1a 32-bit hash — stable across runs, cheap, good spread for short ids. */
3
+ const fnv1a = (s) => {
4
+ let h = 0x811c9dc5;
5
+ for (let i = 0; i < s.length; i++) {
6
+ h ^= s.charCodeAt(i);
7
+ h = Math.imul(h, 0x01000193) >>> 0;
8
+ }
9
+ return h;
10
+ };
11
+ /**
12
+ * Pick the placeholder for an empty text element. Weighted by
13
+ * `TextPlaceholder.weight`, and DETERMINISTIC in `seed` (the element id):
14
+ * the same element always shows the same prompt — no reshuffling between
15
+ * frames or re-renders — while different elements spread across the list.
16
+ */
17
+ export const pickTextPlaceholder = (seed, placeholders = TEXT_PLACEHOLDERS) => {
18
+ const total = placeholders.reduce((sum, p) => sum + Math.max(1, p.weight), 0);
19
+ if (total <= 0 || placeholders.length === 0)
20
+ return "";
21
+ let ticket = fnv1a(seed) % total;
22
+ for (const p of placeholders) {
23
+ ticket -= Math.max(1, p.weight);
24
+ if (ticket < 0)
25
+ return p.text;
26
+ }
27
+ return placeholders[placeholders.length - 1]?.text ?? "";
28
+ };
29
+ //# sourceMappingURL=placeholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placeholder.js","sourceRoot":"","sources":["../../src/text/placeholder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAwB,MAAM,iBAAiB,CAAC;AAE1E,iFAAiF;AACjF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE;IAClC,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,IAAY,EACZ,eAA2C,iBAAiB,EACpD,EAAE;IACV,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,IAAI,KAAK,IAAI,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACvD,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7B,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IAChC,CAAC;IACD,OAAO,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;AAC3D,CAAC,CAAC"}