@reekon-tools/boldr-cad 0.1.0 → 1.0.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 (547) hide show
  1. package/README.md +81 -9
  2. package/dist/app/edit.d.ts +12 -1
  3. package/dist/app/edit.js +96 -11
  4. package/dist/app/edit.js.map +1 -1
  5. package/dist/app/state.d.ts +31 -4
  6. package/dist/app/state.js +31 -2
  7. package/dist/app/state.js.map +1 -1
  8. package/dist/data/memory.d.ts +5 -0
  9. package/dist/data/memory.js +2 -2
  10. package/dist/data/memory.js.map +1 -1
  11. package/dist/data/provider.d.ts +19 -7
  12. package/dist/data/sync.d.ts +7 -2
  13. package/dist/data/sync.js +115 -64
  14. package/dist/data/sync.js.map +1 -1
  15. package/dist/editor/actions.d.ts +1 -2
  16. package/dist/editor/actions.js +391 -113
  17. package/dist/editor/actions.js.map +1 -1
  18. package/dist/editor/confirm.d.ts +23 -0
  19. package/dist/editor/confirm.js +35 -0
  20. package/dist/editor/confirm.js.map +1 -0
  21. package/dist/editor/elevation.d.ts +191 -90
  22. package/dist/editor/elevation.js +812 -616
  23. package/dist/editor/elevation.js.map +1 -1
  24. package/dist/editor/face.d.ts +73 -0
  25. package/dist/editor/face.js +269 -0
  26. package/dist/editor/face.js.map +1 -0
  27. package/dist/editor/files.d.ts +6 -0
  28. package/dist/editor/files.js +50 -4
  29. package/dist/editor/files.js.map +1 -1
  30. package/dist/editor/gestures.d.ts +18 -3
  31. package/dist/editor/gestures.js +145 -30
  32. package/dist/editor/gestures.js.map +1 -1
  33. package/dist/editor/keypad.d.ts +19 -4
  34. package/dist/editor/keypad.js +39 -9
  35. package/dist/editor/keypad.js.map +1 -1
  36. package/dist/editor/keys.js +36 -4
  37. package/dist/editor/keys.js.map +1 -1
  38. package/dist/editor/laser.d.ts +20 -4
  39. package/dist/editor/laser.js +104 -21
  40. package/dist/editor/laser.js.map +1 -1
  41. package/dist/editor/linkActions.d.ts +49 -0
  42. package/dist/editor/linkActions.js +210 -0
  43. package/dist/editor/linkActions.js.map +1 -0
  44. package/dist/editor/linkFollow.d.ts +2 -0
  45. package/dist/editor/linkFollow.js +53 -0
  46. package/dist/editor/linkFollow.js.map +1 -0
  47. package/dist/editor/linkWrite.d.ts +13 -0
  48. package/dist/editor/linkWrite.js +84 -0
  49. package/dist/editor/linkWrite.js.map +1 -0
  50. package/dist/editor/links.d.ts +84 -0
  51. package/dist/editor/links.js +130 -0
  52. package/dist/editor/links.js.map +1 -0
  53. package/dist/editor/markup.d.ts +29 -3
  54. package/dist/editor/markup.js +95 -10
  55. package/dist/editor/markup.js.map +1 -1
  56. package/dist/editor/mode.d.ts +40 -2
  57. package/dist/editor/mode.js +71 -4
  58. package/dist/editor/mode.js.map +1 -1
  59. package/dist/editor/ports.d.ts +36 -6
  60. package/dist/editor/ports.js +10 -1
  61. package/dist/editor/ports.js.map +1 -1
  62. package/dist/editor/project.d.ts +38 -6
  63. package/dist/editor/project.js +167 -27
  64. package/dist/editor/project.js.map +1 -1
  65. package/dist/editor/selection.d.ts +10 -0
  66. package/dist/editor/selection.js +62 -8
  67. package/dist/editor/selection.js.map +1 -1
  68. package/dist/editor/status.js +3 -0
  69. package/dist/editor/status.js.map +1 -1
  70. package/dist/editor/tooltips.d.ts +5 -0
  71. package/dist/editor/tooltips.js +48 -0
  72. package/dist/editor/tooltips.js.map +1 -0
  73. package/dist/editor/view3d.d.ts +17 -0
  74. package/dist/editor/view3d.js +135 -0
  75. package/dist/editor/view3d.js.map +1 -0
  76. package/dist/editor/view3dState.d.ts +39 -0
  77. package/dist/editor/view3dState.js +44 -0
  78. package/dist/editor/view3dState.js.map +1 -0
  79. package/dist/export/dxf.js +1 -1
  80. package/dist/export/dxf.js.map +1 -1
  81. package/dist/export/pdf.js +17 -12
  82. package/dist/export/pdf.js.map +1 -1
  83. package/dist/export/plan.d.ts +23 -6
  84. package/dist/export/plan.js +127 -44
  85. package/dist/export/plan.js.map +1 -1
  86. package/dist/index.d.ts +5 -0
  87. package/dist/index.js +2 -0
  88. package/dist/index.js.map +1 -1
  89. package/dist/model/constraints.js +15 -4
  90. package/dist/model/constraints.js.map +1 -1
  91. package/dist/model/demo.js +3 -3
  92. package/dist/model/demo.js.map +1 -1
  93. package/dist/model/elevation.d.ts +6 -9
  94. package/dist/model/elevation.js +5 -13
  95. package/dist/model/elevation.js.map +1 -1
  96. package/dist/model/faces.d.ts +58 -0
  97. package/dist/model/faces.js +197 -0
  98. package/dist/model/faces.js.map +1 -0
  99. package/dist/model/facesolve.d.ts +72 -0
  100. package/dist/model/facesolve.js +369 -0
  101. package/dist/model/facesolve.js.map +1 -0
  102. package/dist/model/history.d.ts +3 -2
  103. package/dist/model/history.js +17 -11
  104. package/dist/model/history.js.map +1 -1
  105. package/dist/model/images.d.ts +18 -0
  106. package/dist/model/images.js +26 -0
  107. package/dist/model/images.js.map +1 -0
  108. package/dist/model/links.d.ts +46 -0
  109. package/dist/model/links.js +73 -0
  110. package/dist/model/links.js.map +1 -0
  111. package/dist/model/markup.d.ts +46 -0
  112. package/dist/model/markup.js +71 -0
  113. package/dist/model/markup.js.map +1 -0
  114. package/dist/model/measurement.d.ts +11 -0
  115. package/dist/model/measurement.js +24 -0
  116. package/dist/model/measurement.js.map +1 -0
  117. package/dist/model/openings.d.ts +4 -0
  118. package/dist/model/openings.js +4 -0
  119. package/dist/model/openings.js.map +1 -1
  120. package/dist/model/planGeom.d.ts +72 -2
  121. package/dist/model/planGeom.js +184 -10
  122. package/dist/model/planGeom.js.map +1 -1
  123. package/dist/model/project.js +3 -2
  124. package/dist/model/project.js.map +1 -1
  125. package/dist/model/projectfile.js +2 -1
  126. package/dist/model/projectfile.js.map +1 -1
  127. package/dist/model/rooms.js +2 -2
  128. package/dist/model/rooms.js.map +1 -1
  129. package/dist/model/settings.d.ts +6 -0
  130. package/dist/model/settings.js +2 -2
  131. package/dist/model/settings.js.map +1 -1
  132. package/dist/model/sketch.d.ts +14 -0
  133. package/dist/model/sketch.js +143 -24
  134. package/dist/model/sketch.js.map +1 -1
  135. package/dist/model/smooth.d.ts +6 -0
  136. package/dist/model/smooth.js +52 -0
  137. package/dist/model/smooth.js.map +1 -0
  138. package/dist/model/store.d.ts +12 -0
  139. package/dist/model/store.js +35 -3
  140. package/dist/model/store.js.map +1 -1
  141. package/dist/model/types.d.ts +173 -8
  142. package/dist/model/wallfaces.d.ts +32 -0
  143. package/dist/model/wallfaces.js +133 -20
  144. package/dist/model/wallfaces.js.map +1 -1
  145. package/dist/model/wallshape.d.ts +15 -0
  146. package/dist/model/wallshape.js +89 -0
  147. package/dist/model/wallshape.js.map +1 -0
  148. package/dist/react/BottomBar.d.ts +9 -5
  149. package/dist/react/BottomBar.js +213 -24
  150. package/dist/react/BottomBar.js.map +1 -1
  151. package/dist/react/Buttons.d.ts +13 -2
  152. package/dist/react/Buttons.js +37 -5
  153. package/dist/react/Buttons.js.map +1 -1
  154. package/dist/react/CadEditor.d.ts +46 -3
  155. package/dist/react/CadEditor.js +77 -20
  156. package/dist/react/CadEditor.js.map +1 -1
  157. package/dist/react/ConfirmSheet.d.ts +4 -0
  158. package/dist/react/ConfirmSheet.js +31 -0
  159. package/dist/react/ConfirmSheet.js.map +1 -0
  160. package/dist/react/ConflictSheet.d.ts +2 -1
  161. package/dist/react/ConflictSheet.js +16 -8
  162. package/dist/react/ConflictSheet.js.map +1 -1
  163. package/dist/react/Drawer.d.ts +8 -2
  164. package/dist/react/Drawer.js +167 -38
  165. package/dist/react/Drawer.js.map +1 -1
  166. package/dist/react/Duck.d.ts +13 -0
  167. package/dist/react/Duck.js +45 -0
  168. package/dist/react/Duck.js.map +1 -0
  169. package/dist/react/Empty3D.d.ts +2 -0
  170. package/dist/react/Empty3D.js +39 -0
  171. package/dist/react/Empty3D.js.map +1 -0
  172. package/dist/react/FitScroll.d.ts +6 -0
  173. package/dist/react/FitScroll.js +14 -0
  174. package/dist/react/FitScroll.js.map +1 -0
  175. package/dist/react/Icon.native.d.ts +6 -0
  176. package/dist/react/Icon.native.js +4 -0
  177. package/dist/react/Icon.native.js.map +1 -1
  178. package/dist/react/Icon.web.d.ts +6 -0
  179. package/dist/react/Icon.web.js +4 -0
  180. package/dist/react/Icon.web.js.map +1 -1
  181. package/dist/react/KeypadSheet.d.ts +9 -2
  182. package/dist/react/KeypadSheet.js +174 -42
  183. package/dist/react/KeypadSheet.js.map +1 -1
  184. package/dist/react/LaserTray.js +8 -5
  185. package/dist/react/LaserTray.js.map +1 -1
  186. package/dist/react/MarkupPanel.d.ts +8 -0
  187. package/dist/react/MarkupPanel.js +67 -0
  188. package/dist/react/MarkupPanel.js.map +1 -0
  189. package/dist/react/PageThumb.native.d.ts +7 -2
  190. package/dist/react/PageThumb.native.js +19 -7
  191. package/dist/react/PageThumb.native.js.map +1 -1
  192. package/dist/react/PageThumb.web.d.ts +3 -2
  193. package/dist/react/PageThumb.web.js +4 -4
  194. package/dist/react/PageThumb.web.js.map +1 -1
  195. package/dist/react/PlanCanvas.native.d.ts +1 -1
  196. package/dist/react/PlanCanvas.native.js +134 -36
  197. package/dist/react/PlanCanvas.native.js.map +1 -1
  198. package/dist/react/PlanCanvas.web.js +16 -5
  199. package/dist/react/PlanCanvas.web.js.map +1 -1
  200. package/dist/react/Popovers.d.ts +12 -6
  201. package/dist/react/Popovers.js +53 -26
  202. package/dist/react/Popovers.js.map +1 -1
  203. package/dist/react/Rail.d.ts +24 -0
  204. package/dist/react/Rail.js +324 -34
  205. package/dist/react/Rail.js.map +1 -1
  206. package/dist/react/ShapeMenu.d.ts +7 -0
  207. package/dist/react/ShapeMenu.js +58 -0
  208. package/dist/react/ShapeMenu.js.map +1 -0
  209. package/dist/react/Sheet.d.ts +14 -4
  210. package/dist/react/Sheet.js +54 -9
  211. package/dist/react/Sheet.js.map +1 -1
  212. package/dist/react/Slider.d.ts +18 -0
  213. package/dist/react/Slider.js +27 -0
  214. package/dist/react/Slider.js.map +1 -0
  215. package/dist/react/Toast.js +14 -6
  216. package/dist/react/Toast.js.map +1 -1
  217. package/dist/react/ToolTip.d.ts +7 -0
  218. package/dist/react/ToolTip.js +43 -0
  219. package/dist/react/ToolTip.js.map +1 -0
  220. package/dist/react/TopBar.d.ts +6 -3
  221. package/dist/react/TopBar.js +48 -17
  222. package/dist/react/TopBar.js.map +1 -1
  223. package/dist/react/Tween.d.ts +7 -0
  224. package/dist/react/Tween.js +26 -0
  225. package/dist/react/Tween.js.map +1 -0
  226. package/dist/react/Tween.native.d.ts +6 -0
  227. package/dist/react/Tween.native.js +43 -0
  228. package/dist/react/Tween.native.js.map +1 -0
  229. package/dist/react/View3D.native.d.ts +4 -0
  230. package/dist/react/View3D.native.js +103 -0
  231. package/dist/react/View3D.native.js.map +1 -0
  232. package/dist/react/View3D.web.d.ts +4 -0
  233. package/dist/react/View3D.web.js +151 -0
  234. package/dist/react/View3D.web.js.map +1 -0
  235. package/dist/react/View3DHost.d.ts +143 -0
  236. package/dist/react/View3DHost.js +377 -0
  237. package/dist/react/View3DHost.js.map +1 -0
  238. package/dist/react/corners.d.ts +7 -0
  239. package/dist/react/corners.js +51 -0
  240. package/dist/react/corners.js.map +1 -0
  241. package/dist/react/easing.d.ts +15 -0
  242. package/dist/react/easing.js +10 -0
  243. package/dist/react/easing.js.map +1 -0
  244. package/dist/react/host.d.ts +7 -2
  245. package/dist/react/host.js +8 -3
  246. package/dist/react/host.js.map +1 -1
  247. package/dist/react/hostKeypad.d.ts +56 -0
  248. package/dist/react/hostKeypad.js +5 -0
  249. package/dist/react/hostKeypad.js.map +1 -0
  250. package/dist/react/motion.d.ts +77 -0
  251. package/dist/react/motion.js +173 -0
  252. package/dist/react/motion.js.map +1 -0
  253. package/dist/react/ports.js +90 -8
  254. package/dist/react/ports.js.map +1 -1
  255. package/dist/react/saving.d.ts +15 -0
  256. package/dist/react/saving.js +76 -0
  257. package/dist/react/saving.js.map +1 -0
  258. package/dist/react/store.d.ts +38 -1
  259. package/dist/react/store.js +31 -1
  260. package/dist/react/store.js.map +1 -1
  261. package/dist/react/theme.d.ts +10 -0
  262. package/dist/react/theme.js +8 -0
  263. package/dist/react/theme.js.map +1 -1
  264. package/dist/react/topRow.d.ts +22 -0
  265. package/dist/react/topRow.js +61 -0
  266. package/dist/react/topRow.js.map +1 -0
  267. package/dist/react/touch.d.ts +6 -0
  268. package/dist/react/touch.js +9 -0
  269. package/dist/react/touch.js.map +1 -0
  270. package/dist/render/ctx.d.ts +8 -0
  271. package/dist/render/draw.d.ts +33 -1
  272. package/dist/render/draw.js +593 -215
  273. package/dist/render/draw.js.map +1 -1
  274. package/dist/render/elevation.d.ts +65 -43
  275. package/dist/render/elevation.js +414 -140
  276. package/dist/render/elevation.js.map +1 -1
  277. package/dist/render/figmaIcons.d.ts +12 -0
  278. package/dist/render/figmaIcons.js +21 -0
  279. package/dist/render/figmaIcons.js.map +1 -0
  280. package/dist/render/hit.d.ts +22 -2
  281. package/dist/render/hit.js +168 -25
  282. package/dist/render/hit.js.map +1 -1
  283. package/dist/render/icons.js +69 -10
  284. package/dist/render/icons.js.map +1 -1
  285. package/dist/render/linkTile.d.ts +15 -0
  286. package/dist/render/linkTile.js +369 -0
  287. package/dist/render/linkTile.js.map +1 -0
  288. package/dist/render/markup.d.ts +11 -0
  289. package/dist/render/markup.js +112 -0
  290. package/dist/render/markup.js.map +1 -0
  291. package/dist/render/navigate.d.ts +88 -0
  292. package/dist/render/navigate.js +100 -0
  293. package/dist/render/navigate.js.map +1 -0
  294. package/dist/render/snap.d.ts +20 -1
  295. package/dist/render/snap.js +118 -25
  296. package/dist/render/snap.js.map +1 -1
  297. package/dist/render/squircle.d.ts +8 -0
  298. package/dist/render/squircle.js +71 -0
  299. package/dist/render/squircle.js.map +1 -0
  300. package/dist/render/view.d.ts +115 -2
  301. package/dist/render/view.js +244 -19
  302. package/dist/render/view.js.map +1 -1
  303. package/dist/skia/SkiaDrawCtx.d.ts +30 -2
  304. package/dist/skia/SkiaDrawCtx.js +198 -43
  305. package/dist/skia/SkiaDrawCtx.js.map +1 -1
  306. package/dist/skia/host.d.ts +18 -2
  307. package/dist/skia/host.js +46 -1
  308. package/dist/skia/host.js.map +1 -1
  309. package/dist/solver/equations.js +37 -2
  310. package/dist/solver/equations.js.map +1 -1
  311. package/dist/solver/gauss-newton.d.ts +17 -0
  312. package/dist/solver/gauss-newton.js +144 -36
  313. package/dist/solver/gauss-newton.js.map +1 -1
  314. package/dist/solver/linalg.d.ts +45 -2
  315. package/dist/solver/linalg.js +164 -10
  316. package/dist/solver/linalg.js.map +1 -1
  317. package/dist/solver/types.d.ts +5 -0
  318. package/dist/tools/annotate.d.ts +57 -1
  319. package/dist/tools/annotate.js +64 -43
  320. package/dist/tools/annotate.js.map +1 -1
  321. package/dist/tools/chamfer.d.ts +12 -0
  322. package/dist/tools/chamfer.js +114 -0
  323. package/dist/tools/chamfer.js.map +1 -0
  324. package/dist/tools/corner.d.ts +38 -0
  325. package/dist/tools/corner.js +99 -0
  326. package/dist/tools/corner.js.map +1 -0
  327. package/dist/tools/dim.d.ts +86 -9
  328. package/dist/tools/dim.js +581 -96
  329. package/dist/tools/dim.js.map +1 -1
  330. package/dist/tools/elevation.js +1 -1
  331. package/dist/tools/elevation.js.map +1 -1
  332. package/dist/tools/fillet.d.ts +9 -0
  333. package/dist/tools/fillet.js +86 -0
  334. package/dist/tools/fillet.js.map +1 -0
  335. package/dist/tools/freehand.d.ts +3 -2
  336. package/dist/tools/freehand.js +19 -12
  337. package/dist/tools/freehand.js.map +1 -1
  338. package/dist/tools/index.js +14 -4
  339. package/dist/tools/index.js.map +1 -1
  340. package/dist/tools/line.d.ts +8 -3
  341. package/dist/tools/line.js +66 -30
  342. package/dist/tools/line.js.map +1 -1
  343. package/dist/tools/modify.d.ts +13 -0
  344. package/dist/tools/modify.js +105 -25
  345. package/dist/tools/modify.js.map +1 -1
  346. package/dist/tools/openings.js +22 -15
  347. package/dist/tools/openings.js.map +1 -1
  348. package/dist/tools/registry.d.ts +8 -0
  349. package/dist/tools/registry.js +42 -2
  350. package/dist/tools/registry.js.map +1 -1
  351. package/dist/tools/select.d.ts +77 -3
  352. package/dist/tools/select.js +560 -74
  353. package/dist/tools/select.js.map +1 -1
  354. package/dist/tools/shapes.d.ts +14 -0
  355. package/dist/tools/shapes.js +154 -75
  356. package/dist/tools/shapes.js.map +1 -1
  357. package/dist/units/format.d.ts +10 -2
  358. package/dist/units/format.js +18 -3
  359. package/dist/units/format.js.map +1 -1
  360. package/dist/view3d/build.d.ts +35 -0
  361. package/dist/view3d/build.js +630 -0
  362. package/dist/view3d/build.js.map +1 -0
  363. package/dist/view3d/camera.d.ts +60 -0
  364. package/dist/view3d/camera.js +84 -0
  365. package/dist/view3d/camera.js.map +1 -0
  366. package/dist/view3d/fatLines.d.ts +11 -0
  367. package/dist/view3d/fatLines.js +83 -0
  368. package/dist/view3d/fatLines.js.map +1 -0
  369. package/dist/view3d/lines.d.ts +17 -0
  370. package/dist/view3d/lines.js +271 -0
  371. package/dist/view3d/lines.js.map +1 -0
  372. package/dist/view3d/mesh.d.ts +51 -0
  373. package/dist/view3d/mesh.js +101 -0
  374. package/dist/view3d/mesh.js.map +1 -0
  375. package/dist/view3d/poly.d.ts +16 -0
  376. package/dist/view3d/poly.js +109 -0
  377. package/dist/view3d/poly.js.map +1 -0
  378. package/dist/view3d/viewer.d.ts +86 -0
  379. package/dist/view3d/viewer.js +350 -0
  380. package/dist/view3d/viewer.js.map +1 -0
  381. package/package.json +15 -2
  382. package/src/app/edit.ts +83 -12
  383. package/src/app/main.ts +11 -5
  384. package/src/app/state.ts +38 -5
  385. package/src/data/memory.ts +2 -2
  386. package/src/data/provider.ts +15 -7
  387. package/src/data/sync.ts +87 -50
  388. package/src/editor/actions.ts +292 -83
  389. package/src/editor/confirm.ts +58 -0
  390. package/src/editor/elevation.ts +698 -478
  391. package/src/editor/face.ts +227 -0
  392. package/src/editor/files.ts +40 -4
  393. package/src/editor/gestures.ts +147 -31
  394. package/src/editor/keypad.ts +43 -11
  395. package/src/editor/keys.ts +25 -5
  396. package/src/editor/laser.ts +98 -20
  397. package/src/editor/linkActions.ts +194 -0
  398. package/src/editor/linkFollow.ts +43 -0
  399. package/src/editor/linkWrite.ts +77 -0
  400. package/src/editor/links.ts +181 -0
  401. package/src/editor/markup.ts +92 -8
  402. package/src/editor/mode.ts +83 -7
  403. package/src/editor/ports.ts +37 -6
  404. package/src/editor/project.ts +155 -26
  405. package/src/editor/selection.ts +54 -8
  406. package/src/editor/status.ts +2 -0
  407. package/src/editor/tooltips.ts +47 -0
  408. package/src/editor/view3d.ts +119 -0
  409. package/src/editor/view3dState.ts +61 -0
  410. package/src/export/dxf.ts +1 -1
  411. package/src/export/pdf.ts +15 -7
  412. package/src/export/plan.ts +119 -35
  413. package/src/index.ts +5 -0
  414. package/src/input/keyboard.ts +2 -4
  415. package/src/model/constraints.ts +13 -4
  416. package/src/model/demo.ts +3 -3
  417. package/src/model/elevation.ts +6 -16
  418. package/src/model/faces.ts +153 -0
  419. package/src/model/facesolve.ts +322 -0
  420. package/src/model/history.ts +19 -11
  421. package/src/model/images.ts +35 -0
  422. package/src/model/links.ts +77 -0
  423. package/src/model/markup.ts +80 -0
  424. package/src/model/measurement.ts +26 -0
  425. package/src/model/openings.ts +6 -0
  426. package/src/model/planGeom.ts +174 -8
  427. package/src/model/project.ts +3 -2
  428. package/src/model/projectfile.ts +2 -1
  429. package/src/model/rooms.ts +1 -1
  430. package/src/model/settings.ts +8 -2
  431. package/src/model/sketch.ts +101 -14
  432. package/src/model/smooth.ts +51 -0
  433. package/src/model/store.ts +35 -4
  434. package/src/model/types.ts +170 -8
  435. package/src/model/wallfaces.ts +126 -17
  436. package/src/model/wallshape.ts +97 -0
  437. package/src/react/BottomBar.tsx +263 -46
  438. package/src/react/Buttons.tsx +50 -9
  439. package/src/react/CadEditor.tsx +133 -30
  440. package/src/react/ConfirmSheet.tsx +38 -0
  441. package/src/react/ConflictSheet.tsx +19 -12
  442. package/src/react/Drawer.tsx +213 -110
  443. package/src/react/Duck.tsx +50 -0
  444. package/src/react/Empty3D.tsx +32 -0
  445. package/src/react/FitScroll.tsx +19 -0
  446. package/src/react/Icon.native.tsx +5 -0
  447. package/src/react/Icon.web.tsx +5 -0
  448. package/src/react/KeypadSheet.tsx +253 -60
  449. package/src/react/LaserTray.tsx +12 -8
  450. package/src/react/MarkupPanel.tsx +150 -0
  451. package/src/react/PageThumb.native.tsx +18 -7
  452. package/src/react/PageThumb.web.tsx +4 -4
  453. package/src/react/PlanCanvas.native.tsx +151 -34
  454. package/src/react/PlanCanvas.web.tsx +15 -5
  455. package/src/react/Popovers.tsx +116 -51
  456. package/src/react/Rail.tsx +360 -27
  457. package/src/react/ShapeMenu.tsx +66 -0
  458. package/src/react/Sheet.tsx +56 -11
  459. package/src/react/Slider.tsx +48 -0
  460. package/src/react/Toast.tsx +16 -9
  461. package/src/react/ToolTip.tsx +49 -0
  462. package/src/react/TopBar.tsx +97 -39
  463. package/src/react/Tween.native.tsx +36 -0
  464. package/src/react/Tween.tsx +24 -0
  465. package/src/react/View3D.native.tsx +131 -0
  466. package/src/react/View3D.web.tsx +131 -0
  467. package/src/react/View3DHost.ts +367 -0
  468. package/src/react/corners.ts +52 -0
  469. package/src/react/easing.ts +14 -0
  470. package/src/react/host.ts +8 -3
  471. package/src/react/hostKeypad.ts +66 -0
  472. package/src/react/motion.tsx +239 -0
  473. package/src/react/ports.ts +78 -9
  474. package/src/react/saving.ts +80 -0
  475. package/src/react/store.ts +35 -3
  476. package/src/react/theme.ts +8 -0
  477. package/src/react/topRow.ts +71 -0
  478. package/src/react/touch.ts +10 -0
  479. package/src/render/ctx.ts +8 -0
  480. package/src/render/draw.ts +437 -175
  481. package/src/render/elevation.ts +349 -143
  482. package/src/render/figmaIcons.ts +22 -0
  483. package/src/render/hit.ts +140 -21
  484. package/src/render/icons.ts +69 -10
  485. package/src/render/linkTile.ts +297 -0
  486. package/src/render/markup.ts +91 -0
  487. package/src/render/navigate.ts +114 -0
  488. package/src/render/snap.ts +105 -22
  489. package/src/render/squircle.ts +73 -0
  490. package/src/render/view.ts +255 -19
  491. package/src/skia/SkiaDrawCtx.ts +163 -41
  492. package/src/skia/host.ts +46 -1
  493. package/src/solver/equations.ts +37 -2
  494. package/src/solver/gauss-newton.ts +125 -28
  495. package/src/solver/linalg.ts +141 -5
  496. package/src/solver/types.ts +5 -0
  497. package/src/styles.css +91 -42
  498. package/src/tools/annotate.ts +58 -29
  499. package/src/tools/chamfer.ts +103 -0
  500. package/src/tools/corner.ts +99 -0
  501. package/src/tools/dim.ts +524 -92
  502. package/src/tools/elevation.ts +1 -1
  503. package/src/tools/fillet.ts +82 -0
  504. package/src/tools/freehand.ts +20 -16
  505. package/src/tools/index.ts +17 -4
  506. package/src/tools/line.ts +59 -23
  507. package/src/tools/modify.ts +86 -24
  508. package/src/tools/openings.ts +8 -13
  509. package/src/tools/registry.ts +27 -2
  510. package/src/tools/select.ts +424 -75
  511. package/src/tools/shapes.ts +119 -58
  512. package/src/ui/ctx.ts +2 -1
  513. package/src/ui/domPorts.ts +23 -4
  514. package/src/ui/drawer.ts +6 -26
  515. package/src/ui/elevation.ts +10 -101
  516. package/src/ui/keypad.ts +8 -14
  517. package/src/ui/laser.ts +2 -2
  518. package/src/ui/menu.ts +63 -17
  519. package/src/ui/noteinput.ts +3 -3
  520. package/src/ui/opacity.ts +108 -0
  521. package/src/ui/palette.ts +67 -12
  522. package/src/ui/rail.ts +21 -7
  523. package/src/ui/topbar.ts +4 -14
  524. package/src/units/format.ts +18 -3
  525. package/src/view3d/build.ts +607 -0
  526. package/src/view3d/camera.ts +113 -0
  527. package/src/view3d/fatLines.ts +83 -0
  528. package/src/view3d/lines.ts +258 -0
  529. package/src/view3d/mesh.ts +111 -0
  530. package/src/view3d/poly.ts +104 -0
  531. package/src/view3d/viewer.ts +348 -0
  532. package/dist/react/ElevCanvas.native.d.ts +0 -3
  533. package/dist/react/ElevCanvas.native.js +0 -58
  534. package/dist/react/ElevCanvas.native.js.map +0 -1
  535. package/dist/react/ElevCanvas.web.d.ts +0 -4
  536. package/dist/react/ElevCanvas.web.js +0 -44
  537. package/dist/react/ElevCanvas.web.js.map +0 -1
  538. package/dist/react/ElevationSheet.d.ts +0 -2
  539. package/dist/react/ElevationSheet.js +0 -38
  540. package/dist/react/ElevationSheet.js.map +0 -1
  541. package/dist/render/elevationView.d.ts +0 -3
  542. package/dist/render/elevationView.js +0 -100
  543. package/dist/render/elevationView.js.map +0 -1
  544. package/src/react/ElevCanvas.native.tsx +0 -68
  545. package/src/react/ElevCanvas.web.tsx +0 -42
  546. package/src/react/ElevationSheet.tsx +0 -88
  547. package/src/render/elevationView.ts +0 -73
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkActions.js","sourceRoot":"","sources":["../../src/editor/linkActions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC;;;;;;EAME;AAEF,wHAAwH;AACxH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAY,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;AAE5H,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAE5C,+DAA+D;AAC/D,MAAM,UAAU,YAAY;IAC1B,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClE,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,iHAAiH;AACjH,MAAM,UAAU,WAAW,CAAC,CAAa;IACvC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,IAAI,EAAE,MAAM,KAAK,KAAK,IAAI,IAAI,EAAE,OAAO,KAAK,KAAK,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,CAAC,eAAe,EAAE;QAAE,OAAO;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO;IAC3B,wEAAwE;IACxE,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QAAC,KAAK,CAAC,2EAA2E,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACrK,mHAAmH;IACnH,MAAM,CAAC,GAAG,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/H,0EAA0E;IAC1E,MAAM,IAAI,GAAG,EAAE,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACrI,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IAChK,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAAE,CAAC,EAAE,CAAC;IAChF,WAAW,EAAE,CAAC;IACd,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,CAAC,GAAS,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACpJ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,SAAS,CAAC,CAAC;IACnB,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACxD,SAAS,EAAE,CAAC;AACd,CAAC;AAED,sEAAsE;AACtE,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB;;;EAGE;AAEF,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,EAAE,GAAG,EAAE,EAAE;IACpC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,eAAe;IAC7B,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,QAAQ,EAAE,IAAI,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAClG,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;IAChB,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;AACnG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACtE,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK;QAAE,IAAI,MAAM,CAAC,CAAC,CAAC;YAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,WAAW,EAAE,CAAC;AAChB,CAAC;AAED,2HAA2H;AAC3H,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC;AAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;AAClF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,UAAU,CAAC,CAAC;AAC1J,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC;AAE7H,uHAAuH;AACvH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAAE,OAAO;IAC7B,WAAW,EAAE,CAAC;IACd,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC;SACzB,CAAC;QACJ,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACnE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,SAAS,EAAE,CAAC;AACd,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,IAAI,CAAC,CAAC;QAAE,OAAO;IACf,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,0DAA0D,CAAC,CAAC,CAAC,iCAAiC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACnM,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,EAAU,EAAE,KAAc;IAChE,IAAI,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE;QAAE,OAAO;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC;IAClE,UAAU,CAAC;QACT,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG;QAClC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS;QACjD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;KACzF,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxB,IAAI,CAAC,CAAC,EAAE,cAAc;QAAE,OAAO;IAC/B,WAAW,EAAE,CAAC;IACd,OAAO,CAAC,CAAC,cAAc,CAAC;IACxB,SAAS,EAAE,CAAC;AACd,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACxC,IAAI,CAAC,CAAC;QAAE,OAAO;IACf,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,wEAAwE,CAAC,CAAC,CAAC,iCAAiC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACvM,QAAQ,CAAC,CAAC,CAAC,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC;IACzC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,eAAe,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;AAC3J,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EAAU;IAC7C,MAAM,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO;IACxC,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAE,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC,GAAsB,IAAI,CAAC;IAChC,IAAI,CAAC;QAAC,CAAC,GAAG,MAAM,CAAC,CAAC,eAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,CAAC,GAAG,IAAI,CAAC;IAAC,CAAC;IACvJ,IAAI,CAAC,CAAC,EAAE,CAAC;QAAC,KAAK,CAAC,wEAAwE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IACpH,mGAAmG;IACnG,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;QAAC,KAAK,CAAC,8IAA8I,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC3N,WAAW,EAAE,CAAC;IACd,GAAG,CAAC,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC;IACnB,SAAS,EAAE,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ /** Bring every linked dimension in the project to what the job says it is now. */
2
+ export declare function followLinked(): void;
@@ -0,0 +1,53 @@
1
+ import { allCons } from '../model/faces';
2
+ import { linkInfoOf } from '../model/links';
3
+ import { dimMeasurement, dimValueOf } from '../model/measurement';
4
+ import { onSessionReset } from '../model/session';
5
+ import { SK, store } from '../model/store';
6
+ import { setDimValue } from '../tools/dim';
7
+ import { linksHost, onLinkInfo } from './links';
8
+ import { staleEcho } from './linkWrite';
9
+ /*
10
+ Dimensions linked to measurements of the job follow them: when the job says a measurement is something else now
11
+ (changed elsewhere, on another device, by someone else), or the drawing has a different value for it (an undo past
12
+ a change both made), the dimension takes the job's value. On the page being edited the drawing solves to it, as a
13
+ step of no undo of its own; on other pages the value is set, and the drawing solves when that page is next edited.
14
+ One the drawing can't hold is left as it is (and not tried again until the job's value changes).
15
+ */
16
+ /** Values tried on dimensions and refused, by "page|constraint": not tried again until the job's value changes. */
17
+ const refused = new Map();
18
+ let following = false;
19
+ onSessionReset(() => { refused.clear(); following = false; });
20
+ /** Bring every linked dimension in the project to what the job says it is now. */
21
+ export function followLinked() {
22
+ const p = store.project;
23
+ if (following || !p || !linksHost())
24
+ return;
25
+ following = true;
26
+ try {
27
+ for (const pg of p.pages)
28
+ for (const [cid, c] of allCons(pg.sk)) {
29
+ const t = c.measurementRef, info = t && linkInfoOf(t);
30
+ if (!t || !info || info.exists === false || info.value == null || staleEcho(t, info.value))
31
+ continue;
32
+ const m = dimMeasurement(c), key = pg.id + '|' + cid;
33
+ if (!m || m.value === info.value) {
34
+ refused.delete(key);
35
+ continue;
36
+ }
37
+ if (refused.get(key) === info.value)
38
+ continue;
39
+ const v = dimValueOf(c, { value: info.value });
40
+ if (pg.id === store.curPageId && SK().cons[cid] === c) {
41
+ if (!setDimValue(cid, v, undefined, { quiet: true }))
42
+ refused.set(key, info.value);
43
+ }
44
+ else
45
+ c.value = v;
46
+ }
47
+ }
48
+ finally {
49
+ following = false;
50
+ }
51
+ }
52
+ onLinkInfo(() => followLinked());
53
+ //# sourceMappingURL=linkFollow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkFollow.js","sourceRoot":"","sources":["../../src/editor/linkFollow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;;;;;EAME;AAEF,mHAAmH;AACnH,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;AAC1C,IAAI,SAAS,GAAG,KAAK,CAAC;AACtB,cAAc,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9D,kFAAkF;AAClF,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;IACxB,IAAI,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE;QAAE,OAAO;IAC5C,SAAS,GAAG,IAAI,CAAC;IACjB,IAAI,CAAC;QACH,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK;YAAE,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;gBAChE,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;gBACtD,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACrG,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;gBACrD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;oBAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACpE,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK;oBAAE,SAAS;gBAC9C,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC/C,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtD,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;wBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrF,CAAC;;oBAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YACrB,CAAC;IACH,CAAC;YAAS,CAAC;QAAC,SAAS,GAAG,KAAK,CAAC;IAAC,CAAC;AAClC,CAAC;AAED,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Constraint, LinkTarget } from '../model/types';
2
+ /**
3
+ * Whether what the job says of `t` (its value `value`) is older than what was just written to it — to be ignored.
4
+ * Hearing the written value back, it's settled.
5
+ */
6
+ export declare function staleEcho(t: LinkTarget, value: number): boolean;
7
+ /** Whether a new value for `c` would change it (a linked one is asked about only then). */
8
+ export declare const changesValue: (c: Constraint, v: number) => boolean;
9
+ /**
10
+ * Ask before giving linked dimension `c` value `v` (inches, or degrees). `apply(unlink)` sets it — letting go of the
11
+ * link with `unlink` — and says whether it took; `capture` (a laser reading's) goes to the job with it.
12
+ */
13
+ export declare function askLinkedChange(c: Constraint, v: number, apply: (unlink: boolean) => boolean, capture?: unknown): void;
@@ -0,0 +1,84 @@
1
+ import { linkInfoOf, linkKey, linkName } from '../model/links';
2
+ import { onSessionReset } from '../model/session';
3
+ import { dimMeasurement } from '../model/measurement';
4
+ import { store } from '../model/store';
5
+ import { fmtAng, fmtLen } from '../units';
6
+ import { askConfirm } from './confirm';
7
+ import { linksHost } from './links';
8
+ /*
9
+ A dimension linked to a measurement of the job is that measurement: giving it a new value — typed, from a laser
10
+ reading, dropped from the tray — changes the job's too, so the person is asked first. Change both writes it to the
11
+ job (through the host); Only this drawing keeps the new value here and lets go of the link; Cancel leaves both.
12
+
13
+ What the editor writes comes back from the job a moment later, and an answer from before it may arrive first: for a
14
+ few seconds after a write, the job saying anything else about that measurement is taken to be the old news it is.
15
+ */
16
+ /** Writes to the job's measurements not yet heard back: by linkKey, the value written and when. */
17
+ const wrote = new Map();
18
+ const ECHO_MS = 8000;
19
+ onSessionReset(() => wrote.clear());
20
+ /**
21
+ * Whether what the job says of `t` (its value `value`) is older than what was just written to it — to be ignored.
22
+ * Hearing the written value back, it's settled.
23
+ */
24
+ export function staleEcho(t, value) {
25
+ const k = linkKey(t), w = wrote.get(k);
26
+ if (!w)
27
+ return false;
28
+ if (w.value === value || Date.now() - w.at > ECHO_MS) {
29
+ wrote.delete(k);
30
+ return false;
31
+ }
32
+ return true;
33
+ }
34
+ /** Whether a new value for `c` would change it (a linked one is asked about only then). */
35
+ export const changesValue = (c, v) => c.value == null || Math.abs(c.value - v) > 1e-9;
36
+ /**
37
+ * Ask before giving linked dimension `c` value `v` (inches, or degrees). `apply(unlink)` sets it — letting go of the
38
+ * link with `unlink` — and says whether it took; `capture` (a laser reading's) goes to the job with it.
39
+ */
40
+ export function askLinkedChange(c, v, apply, capture) {
41
+ const t = c.measurementRef;
42
+ if (!t)
43
+ return;
44
+ const info = linkInfoOf(t), host = linksHost(), m = dimMeasurement(c, v);
45
+ const name = linkName(t), group = info?.groupName ?? t.groupName, gone = info?.exists === false;
46
+ const canWrite = !!host?.update && !!m && !gone && info?.canEdit !== false;
47
+ const pageId = store.curPageId, still = () => store.curPageId === pageId && linksHost() === host;
48
+ const what = c.type === 'angle' ? fmtAng(v) : fmtLen(c.rad ? v / 2 : v);
49
+ if (canWrite) {
50
+ askConfirm({
51
+ title: 'Change ' + name + (group ? ' in ' + group : '') + ' to ' + what + '?',
52
+ msg: 'This dimension is linked to it. Only this drawing keeps ' + what + ' here and unlinks them.',
53
+ choices: [
54
+ { label: 'Change both', run: () => {
55
+ if (!still())
56
+ return;
57
+ // (before it's set: the drawing hearing the job's old value meanwhile mustn't put it back)
58
+ const k = linkKey(t), was = wrote.get(k);
59
+ wrote.set(k, { value: m.value, at: Date.now() });
60
+ if (apply(false))
61
+ host.update(t, m.value, capture);
62
+ else if (was)
63
+ wrote.set(k, was);
64
+ else
65
+ wrote.delete(k);
66
+ } },
67
+ { label: 'Only this drawing', run: () => { if (still())
68
+ apply(true); } },
69
+ { label: 'Cancel', run: () => { } },
70
+ ],
71
+ });
72
+ return;
73
+ }
74
+ askConfirm({
75
+ title: gone ? name + ' was removed from the job' : name + ' can’t be changed from here',
76
+ msg: 'Keep ' + what + ' in this drawing (it unlinks from ' + name + '), or cancel.',
77
+ choices: [
78
+ { label: 'Keep in this drawing', run: () => { if (still())
79
+ apply(true); } },
80
+ { label: 'Cancel', run: () => { } },
81
+ ],
82
+ });
83
+ }
84
+ //# sourceMappingURL=linkWrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkWrite.js","sourceRoot":"","sources":["../../src/editor/linkWrite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type { LinkInfo, LinkTarget } from '../model/types';
2
+ /** What a keypad takes from the job's measurements: a line's length, or a dimension's angle. */
3
+ export type MeasurementKind = 'length' | 'angle';
4
+ /** What the editor asks the host to pick from (Annotate's +). */
5
+ export interface CadLinkPick {
6
+ /**
7
+ * 'files': the job's files and objects to pick. Never its measurements: those come into a drawing only through a
8
+ * line's length keypad in Draft (CadLinks.lengths), as the dimensions they drive. A host may still show them, greyed
9
+ * out, saying so when one's tapped (BOLDR's do); one it hands back anyway is dropped.
10
+ */
11
+ want: 'files';
12
+ /** what the drawing links to already */
13
+ linked: LinkTarget[];
14
+ }
15
+ /** A dimension of the drawing, saved to the drawing's group as a measurement of the job. */
16
+ export interface CadSaveMeasurement {
17
+ kind: 'length' | 'angle';
18
+ /** micrometres for a length, degrees for an angle */
19
+ value: number;
20
+ /** the dimension's label, if it has one */
21
+ label?: string;
22
+ /** the host's record of the laser reading that set it (as laserReading was given it), if one did */
23
+ capture?: unknown;
24
+ }
25
+ /** The host's side of links (CadEditorProps.links). Pass one object for as long as the editor's open (memoized). */
26
+ export interface CadLinks {
27
+ /** Let the person pick from the job's files; resolves with what they picked ([] for nothing). */
28
+ pick(req: CadLinkPick): Promise<LinkTarget[]>;
29
+ /**
30
+ * The job's measurements, lengths and angles, for a keypad's own list (a page swiped to on a touch screen): call
31
+ * `cb` with them, in the order to show them, as targets with what they are now (name, group, `mkind`, value, text)
32
+ * — and again as they change, but not until the whole job's been heard from (never none while it's loading). The
33
+ * keypad greys out those that aren't its kind. Returns how to stop.
34
+ */
35
+ measurements?(cb: (list: LinkTarget[]) => void): () => void;
36
+ /**
37
+ * Let the person pick one of the job's measurements for a keypad from the host's own list (Select From List, on a
38
+ * desktop: its side drawer), those of `kind` pickable and the rest greyed out. Resolves with the one picked (null:
39
+ * none). Absent: the keypad's own list (`measurements`) is shown instead.
40
+ */
41
+ pickMeasurement?(req: {
42
+ kind: MeasurementKind;
43
+ }): Promise<LinkTarget | null>;
44
+ /**
45
+ * Say what each of `targets` is now, by linkKey, and again whenever that changes — one that's gone with
46
+ * `exists: false`, but never while it's still loading. Returns how to stop.
47
+ */
48
+ subscribe(targets: LinkTarget[], cb: (info: Record<string, LinkInfo>) => void): () => void;
49
+ /** Open what `target` is for (another screen, or a sheet over the drawing). */
50
+ open(target: LinkTarget): void;
51
+ /** Change a linked measurement (micrometres, or degrees), the person having said to; `capture` as saveMeasurement's. */
52
+ update?(target: LinkTarget, value: number, capture?: unknown): void;
53
+ /** Save a dimension as a new measurement in the drawing's own group; resolves with it (null: not saved). */
54
+ saveMeasurement?(m: CadSaveMeasurement): Promise<LinkTarget | null>;
55
+ /** whether saveMeasurement can be used here (not in a group whose measurements need a column, for one) */
56
+ canSave?: boolean;
57
+ }
58
+ export declare const linksHost: () => CadLinks | null;
59
+ export declare const linksEpoch: () => number;
60
+ /** Whether the host can link things (Annotate's + shows). */
61
+ export declare const canLink: () => boolean;
62
+ /** The host's links from now on (CadEditor), or null for none. */
63
+ export declare function setLinksHost(h: CadLinks | null): void;
64
+ /** Call `fn` with each answer about what's linked (after it's been taken in). */
65
+ export declare function onLinkInfo(fn: (info: Record<string, LinkInfo>) => void): void;
66
+ /** Ask the host about what the drawing links to now — if that's changed since it was last asked. */
67
+ export declare function refreshLinks(): void;
68
+ /** Have the person pick from the job's files: what they picked, or [] if nothing (or the editor moved on meanwhile). */
69
+ export declare function pickLinks(): Promise<LinkTarget[]>;
70
+ /** Whether the host offers the job's measurements to a keypad: listing them, or picking one itself. */
71
+ export declare const offersJobMeasurements: () => boolean;
72
+ /** Whether the host picks a measurement itself (Select From List opens its own list). */
73
+ export declare const hostPicksMeasurements: () => boolean;
74
+ /** Whether a measurement of the job's can go in a keypad of `kind`: one of that kind, more than nothing. */
75
+ export declare const measurementFits: (t: LinkTarget, kind: MeasurementKind) => boolean;
76
+ /** Hear the job's measurements from the host, and again as they change, until the returned stop — or the host changes. */
77
+ export declare function watchJobMeasurements(cb: (list: LinkTarget[]) => void): () => void;
78
+ /**
79
+ * Have the host's own list pick a measurement of `kind` (Select From List): the one picked, or null — none picked, one
80
+ * that isn't of `kind`, or the editor moved on meanwhile. Asks once at a time, as the picker's +.
81
+ */
82
+ export declare function pickJobMeasurement(kind: MeasurementKind): Promise<LinkTarget | null>;
83
+ /** Open what a link is for. */
84
+ export declare function openLink(t: LinkTarget): void;
@@ -0,0 +1,130 @@
1
+ import { linkInfo, linkKey, linkTargets } from '../model/links';
2
+ import { onSessionReset } from '../model/session';
3
+ import { store } from '../model/store';
4
+ import { requestDraw } from '../render/view';
5
+ import { updateCtx } from './ports';
6
+ let host = null;
7
+ /** The host's answers for what's linked now, as asked (keys: what was asked about). */
8
+ let sub = null;
9
+ /** Bumped when the host or the session changes: an answer to an older question is dropped. */
10
+ let epoch = 0;
11
+ /** The picker's open: a second + meanwhile (a double press) asks nothing more of the host. */
12
+ let picking = false;
13
+ /** Told of each answer (editor/linkFollow.ts: linked dimensions follow their measurements). */
14
+ const heard = [];
15
+ export const linksHost = () => host;
16
+ export const linksEpoch = () => epoch;
17
+ /** Whether the host can link things (Annotate's + shows). */
18
+ export const canLink = () => !!host;
19
+ /** The host's links from now on (CadEditor), or null for none. */
20
+ export function setLinksHost(h) {
21
+ if (h === host)
22
+ return;
23
+ stop();
24
+ host = h;
25
+ epoch++;
26
+ picking = false;
27
+ refreshLinks();
28
+ }
29
+ function stop() {
30
+ const s = sub;
31
+ sub = null;
32
+ s?.stop();
33
+ }
34
+ onSessionReset(() => { stop(); host = null; epoch++; picking = false; });
35
+ /** Call `fn` with each answer about what's linked (after it's been taken in). */
36
+ export function onLinkInfo(fn) { heard.push(fn); }
37
+ /** Ask the host about what the drawing links to now — if that's changed since it was last asked. */
38
+ export function refreshLinks() {
39
+ const p = store.project;
40
+ if (!host || !p) {
41
+ stop();
42
+ return;
43
+ }
44
+ const targets = linkTargets(p), keys = targets.map(linkKey).sort().join('\n');
45
+ if (sub && sub.keys === keys)
46
+ return;
47
+ stop();
48
+ if (!targets.length)
49
+ return;
50
+ const s = { keys, stop: () => { } };
51
+ // (before asking: the host may answer at once)
52
+ sub = s;
53
+ const unsub = host.subscribe(targets, info => {
54
+ if (sub !== s)
55
+ return;
56
+ // (what's been heard of stays: another question about it, as the links change, needn't wait for the answer)
57
+ Object.assign(linkInfo.byKey, info);
58
+ for (const fn of heard)
59
+ fn(info);
60
+ requestDraw();
61
+ updateCtx();
62
+ });
63
+ if (sub === s)
64
+ s.stop = unsub;
65
+ else
66
+ unsub();
67
+ }
68
+ /** Have the person pick from the job's files: what they picked, or [] if nothing (or the editor moved on meanwhile). */
69
+ export async function pickLinks() {
70
+ const h = host, p = store.project;
71
+ if (!h || !p || picking)
72
+ return [];
73
+ const mine = epoch;
74
+ picking = true;
75
+ let out;
76
+ try {
77
+ out = await h.pick({ want: 'files', linked: linkTargets(p) });
78
+ }
79
+ catch {
80
+ return [];
81
+ }
82
+ finally {
83
+ if (mine === epoch)
84
+ picking = false;
85
+ }
86
+ // (its files: a measurement isn't put on the plan as a tile)
87
+ return mine === epoch && h === host ? (out ?? []).filter(t => t.kind === 'file') : [];
88
+ }
89
+ /** Whether the host offers the job's measurements to a keypad: listing them, or picking one itself. */
90
+ export const offersJobMeasurements = () => !!host?.measurements || !!host?.pickMeasurement;
91
+ /** Whether the host picks a measurement itself (Select From List opens its own list). */
92
+ export const hostPicksMeasurements = () => !!host?.pickMeasurement;
93
+ /** Whether a measurement of the job's can go in a keypad of `kind`: one of that kind, more than nothing. */
94
+ export const measurementFits = (t, kind) => t.kind === 'measurement' && (t.mkind ?? 'length') === kind && (t.value ?? 0) > 0;
95
+ /** Hear the job's measurements from the host, and again as they change, until the returned stop — or the host changes. */
96
+ export function watchJobMeasurements(cb) {
97
+ const h = host;
98
+ if (!h?.measurements)
99
+ return () => { };
100
+ let live = true;
101
+ const stop = h.measurements(list => { if (live && h === host)
102
+ cb(list.filter(t => t.kind === 'measurement' && typeof t.value === 'number')); });
103
+ return () => { live = false; stop(); };
104
+ }
105
+ /**
106
+ * Have the host's own list pick a measurement of `kind` (Select From List): the one picked, or null — none picked, one
107
+ * that isn't of `kind`, or the editor moved on meanwhile. Asks once at a time, as the picker's +.
108
+ */
109
+ export async function pickJobMeasurement(kind) {
110
+ const h = host;
111
+ if (!h?.pickMeasurement || picking)
112
+ return null;
113
+ const mine = epoch;
114
+ picking = true;
115
+ let t;
116
+ try {
117
+ t = await h.pickMeasurement({ kind });
118
+ }
119
+ catch {
120
+ return null;
121
+ }
122
+ finally {
123
+ if (mine === epoch)
124
+ picking = false;
125
+ }
126
+ return mine === epoch && h === host && t && measurementFits(t, kind) ? t : null;
127
+ }
128
+ /** Open what a link is for. */
129
+ export function openLink(t) { host?.open(t); }
130
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/editor/links.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,30 @@
1
- /** The markup colors. */
2
- export declare const NOTE_COLORS: string[];
3
- /** Pick the markup color: new markup uses it, and selected markup changes to it (one undo step). */
1
+ import { type NoteStyle } from '../model/markup';
2
+ import type { NoteCap } from '../model/types';
3
+ export { NOTE_CAPS, NOTE_COLORS, NOTE_STYLES, NOTE_TEXT_SIZES, NOTE_WIDTHS } from '../model/markup';
4
+ export interface MarkupTarget {
5
+ /** the selected markup's look (the first of them), or new markup's */
6
+ color: string;
7
+ width: number;
8
+ style: NoteStyle;
9
+ startCap?: NoteCap;
10
+ endCap?: NoteCap;
11
+ /** what applies: width (not for notes alone), the ends (pen strokes and arrows only) */
12
+ widthApplies: boolean;
13
+ ends: boolean;
14
+ /** text size (inches on the drawing): for selected text notes, or new ones while the Note tool is on */
15
+ textIn?: number;
16
+ }
17
+ /** What the panel shows and edits. */
18
+ export declare function markupTarget(): MarkupTarget;
19
+ /** Pick the markup color: selected markup changes to it, or (nothing selected) new markup uses it. */
4
20
  export declare function setNoteColor(c: string): void;
21
+ /** The stroke width (not for notes, which have no stroke of their own). */
22
+ export declare function setNoteWidth(w: number): void;
23
+ /** A text note's size on the drawing (inches): selected notes change to it, and new ones use it. */
24
+ export declare function setNoteTextSize(inches: number): void;
25
+ /** Solid, dashed or dotted. */
26
+ export declare function setNoteStyle(st: NoteStyle): void;
27
+ /** How a pen stroke's, arrow's or leader's start or end finishes (its kind's own way is left unset). */
28
+ export declare function setNoteCap(which: 'start' | 'end', cap: NoteCap): void;
29
+ /** Edit a note's text: the text field opens over it with its text (Enter or leaving the field keeps it, Esc cancels). */
30
+ export declare function editNoteText(id: string): void;
@@ -1,21 +1,106 @@
1
1
  import { afterEdit } from '../app/edit';
2
2
  import { ed } from '../app/state';
3
3
  import { pushHistory } from '../model/history';
4
+ import { DEFAULT_NOTE_WIDTH, hasEnds, NOTE_TEXT_IN, noteLook, noteTextIn } from '../model/markup';
4
5
  import { SK } from '../model/store';
5
- import { updateCtx, updateRail } from './ports';
6
- /** The markup colors. */
7
- export const NOTE_COLORS = ['#F070EE', '#E83D2F', '#FFAD00', '#0066FF', '#00E920', '#181A1C'];
8
- /** Pick the markup color: new markup uses it, and selected markup changes to it (one undo step). */
9
- export function setNoteColor(c) {
10
- ed.noteColor = c;
11
- const ids = ed.sel.filter(s => s.type === 'note').map(s => s.id);
12
- if (ids.length) {
6
+ import { mainT, noteTextBox } from '../render/view';
7
+ import { showNoteInput, updateCtx, updateRail } from './ports';
8
+ export { NOTE_CAPS, NOTE_COLORS, NOTE_STYLES, NOTE_TEXT_SIZES, NOTE_WIDTHS } from '../model/markup';
9
+ /*
10
+ The stroke panel (the rail's color dot): BOLDR's annotation set — color, width, solid / dashed /
11
+ dotted, and the two ends of a pen stroke or arrow. With markup selected it changes that markup (one undo step); with
12
+ nothing selected it sets the look of the next markup drawn.
13
+ */
14
+ const selectedNotes = () => {
15
+ const ids = new Set(ed.sel.filter(s => s.type === 'note').map(s => s.id));
16
+ return ids.size ? SK().notes.filter(n => ids.has(n.id)) : [];
17
+ };
18
+ /** What the panel shows and edits. */
19
+ export function markupTarget() {
20
+ const notes = selectedNotes();
21
+ if (!notes.length)
22
+ return { color: ed.noteColor, width: ed.noteWidth, style: ed.noteStyle, widthApplies: true, ends: false, textIn: ed.tool === 'text' ? ed.noteTextIn : undefined };
23
+ const look = noteLook(notes.find(n => n.type !== 'text') ?? notes[0]);
24
+ const ends = notes.every(hasEnds);
25
+ return {
26
+ color: notes[0].color, width: look.width, style: look.style,
27
+ startCap: ends ? look.startCap : undefined, endCap: ends ? look.endCap : undefined,
28
+ widthApplies: notes.some(n => n.type !== 'text'), ends,
29
+ textIn: notes.find(n => n.type === 'text') ? noteTextIn(notes.find(n => n.type === 'text')) : undefined,
30
+ };
31
+ }
32
+ /** Change the selected markup (one undo step), or remember it for new markup. */
33
+ function apply(onNote, onDefault) {
34
+ const notes = selectedNotes();
35
+ if (notes.length) {
13
36
  pushHistory();
14
- SK().notes.forEach(n => { if (ids.includes(n.id))
15
- n.color = c; });
37
+ notes.forEach(onNote);
16
38
  afterEdit();
17
39
  }
40
+ else
41
+ onDefault?.();
18
42
  updateRail();
19
43
  updateCtx();
20
44
  }
45
+ /** Pick the markup color: selected markup changes to it, or (nothing selected) new markup uses it. */
46
+ export function setNoteColor(c) {
47
+ // (recolouring one thing isn't choosing the colour to draw with next: a blue leader left the pen blue)
48
+ apply(n => { n.color = c; }, () => { ed.noteColor = c; });
49
+ }
50
+ /** The stroke width (not for notes, which have no stroke of their own). */
51
+ export function setNoteWidth(w) {
52
+ apply(n => { if (n.type === 'text')
53
+ return; if (w === (n.type === 'cloud' ? 2.5 : DEFAULT_NOTE_WIDTH))
54
+ delete n.width;
55
+ else
56
+ n.width = w; }, () => { ed.noteWidth = w; });
57
+ }
58
+ /** A text note's size on the drawing (inches): selected notes change to it, and new ones use it. */
59
+ export function setNoteTextSize(inches) {
60
+ apply(n => { if (n.type !== 'text')
61
+ return; delete n.size; if (inches === NOTE_TEXT_IN)
62
+ delete n.ts;
63
+ else
64
+ n.ts = inches; }, () => { ed.noteTextIn = inches; });
65
+ }
66
+ /** Solid, dashed or dotted. */
67
+ export function setNoteStyle(st) {
68
+ apply(n => { if (st === 'solid')
69
+ delete n.style;
70
+ else
71
+ n.style = st; }, () => { ed.noteStyle = st; });
72
+ }
73
+ /** How a pen stroke's, arrow's or leader's start or end finishes (its kind's own way is left unset). */
74
+ export function setNoteCap(which, cap) {
75
+ apply(n => {
76
+ if (!hasEnds(n))
77
+ return;
78
+ const own = noteLook({ ...n, startCap: undefined, cap: undefined });
79
+ if (which === 'start') {
80
+ if (cap === own.startCap)
81
+ delete n.startCap;
82
+ else
83
+ n.startCap = cap;
84
+ }
85
+ else if (cap === own.endCap)
86
+ delete n.cap;
87
+ else
88
+ n.cap = cap;
89
+ });
90
+ }
91
+ /** Edit a note's text: the text field opens over it with its text (Enter or leaving the field keeps it, Esc cancels). */
92
+ export function editNoteText(id) {
93
+ const n = SK().notes.find(x => x.id === id);
94
+ if (!n || n.type !== 'text')
95
+ return;
96
+ const b = noteTextBox(mainT(), n);
97
+ showNoteInput(b.x, b.mid, txt => {
98
+ const cur = SK().notes.find(x => x.id === id);
99
+ if (!cur || !txt || txt === cur.text)
100
+ return;
101
+ pushHistory();
102
+ cur.text = txt;
103
+ afterEdit();
104
+ }, n.text);
105
+ }
21
106
  //# sourceMappingURL=markup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markup.js","sourceRoot":"","sources":["../../src/editor/markup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEhD,yBAAyB;AACzB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAE9F,oGAAoG;AACpG,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjE,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,CAAC;QAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,SAAS,EAAE,CAAC;IAAC,CAAC;IAClH,UAAU,EAAE,CAAC;IAAC,SAAS,EAAE,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"markup.js","sourceRoot":"","sources":["../../src/editor/markup.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,45 @@ import { type Mode } from '../app/state';
3
3
  export declare function setMode(m: Mode): void;
4
4
  /** New lines become construction lines (guides that never make spaces), or regular lines again. */
5
5
  export declare function toggleConstr(): void;
6
- /** A tool rail entry: [tool or action id, label, shortcut, kind], or '|' for a divider. */
7
- export type RailItem = '|' | [id: string, label: string, key: string, kind?: 'toggle' | 'act'];
6
+ /** What's drawn — lines, rectangles, circles, arcs, Draw to shape — becomes walls, or lines again. */
7
+ export declare function toggleWalls(): void;
8
+ /** Whether what's drawn now is walls: the Walls toggle, except in the wall view (what's drawn on a wall's face never is). */
9
+ export declare const drawsWalls: () => boolean;
10
+ /** The rail's toggles: whether each is on, and flipping it. */
11
+ export declare const TOGGLES: Record<string, {
12
+ on: () => boolean;
13
+ flip: () => void;
14
+ }>;
15
+ /**
16
+ * A tool rail entry: [tool or action id, label, shortcut, kind], or '|' for a divider. A 'group' holds several tools in
17
+ * one place (see SHAPE_TOOLS).
18
+ */
19
+ export type RailItem = '|' | [id: string, label: string, key: string, kind?: 'toggle' | 'act' | 'group'];
20
+ /** The tool rail now: the wall view's while a wall is open, otherwise the current mode's (the 3D tab has none). */
21
+ export declare const railItems: () => RailItem[];
22
+ /** The icon for a rail item. */
23
+ export declare const railIcon: (id: string) => string;
8
24
  /** The tool rail for each mode. 'toggle' items switch something on and off; 'act' items run an action. */
9
25
  export declare const RAIL: Record<Mode, RailItem[]>;
26
+ /**
27
+ * Tools that share one place on a phone's rail, which has no room for each: a tap draws with the one used last (the
28
+ * place shows it), and a long press opens a menu of them all (react/ShapeMenu.tsx) — Draft's Line, Rectangle, Circle
29
+ * and Arc, and Annotate's markup shapes. A tablet's or a browser's rail shows every one in its own place.
30
+ */
31
+ export declare const SHAPE_TOOLS: string[];
32
+ export declare const SHAPES_GROUP = "shapes";
33
+ export declare const MARK_TOOLS: string[];
34
+ export declare const MARKS_GROUP = "marks";
35
+ export interface ToolGroup {
36
+ tools: string[];
37
+ label: string;
38
+ mode: Mode;
39
+ phoneOnly: boolean;
40
+ }
41
+ export declare const TOOL_GROUPS: Record<string, ToolGroup>;
42
+ /** The group a tool shares its place with on this rail, if any. */
43
+ export declare const groupOf: (tool: string, phone: boolean) => string | null;
44
+ /** A rail with each group's tools folded into one place, where the first of them was; the rest as it was. */
45
+ export declare function groupTools(items: RailItem[], phone: boolean): RailItem[];
46
+ /** A tool's name on the rail ('Line', 'Rectangle'…). */
47
+ export declare const toolLabel: (id: string) => string;