@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
@@ -1,4 +1,4 @@
1
- import { useSyncExternalStore } from 'react';
1
+ import { useCallback, useRef, useSyncExternalStore } from 'react';
2
2
  import { sessionState } from '../model/session';
3
3
  /*
4
4
  The React side of the editor: a version number that changes whenever the editor or the interface's own state
@@ -16,6 +16,20 @@ const subscribe = (l) => { listeners.add(l); return () => { listeners.delete(l);
16
16
  const getVersion = () => version;
17
17
  /** Re-render this component whenever the editor changes. */
18
18
  export const useEditorVersion = () => useSyncExternalStore(subscribe, getVersion, getVersion);
19
+ /** The editor's change count (for a key that should change with every change: see useEditorKey). */
20
+ export const editorVersion = () => version;
21
+ /**
22
+ * Re-render this component only when what it shows changes, not on every change to the editor: `key` sums up all it
23
+ * reads, as one string, worked out again after each change — the same string, and it isn't rendered again. Keep it
24
+ * cheap and free of side effects; a component that's only briefly on screen can key on editorVersion() instead.
25
+ * (Re-rendering the whole interface on every change was most of the time an interaction took on a phone.)
26
+ */
27
+ export function useEditorKey(key) {
28
+ const latest = useRef(key);
29
+ latest.current = key;
30
+ const get = useCallback(() => latest.current(), []);
31
+ return useSyncExternalStore(subscribe, get, get);
32
+ }
19
33
  export const ui = sessionState(() => ({
20
34
  toast: null,
21
35
  /** the keypad sheet is showing (its contents live in editor/keypad.ts) */
@@ -28,8 +42,24 @@ export const ui = sessionState(() => ({
28
42
  renameRoom: null,
29
43
  note: null,
30
44
  palette: false,
45
+ /** what the tool just picked from the rail does (a note under the tabs that goes by itself); seq tells one pick from the next */
46
+ toolTip: null,
47
+ /** the slider open above the bar: the selected image's opacity, or how far it's turned; or the link tiles' size */
48
+ imgPop: null,
49
+ /** the tool each shared place on the rail draws with (the last picked; editor/mode.ts TOOL_GROUPS), and the menu of
50
+ a group's tools, open beside its place at x, y */
51
+ picked: { shapes: 'line', marks: 'arrow' },
52
+ shapeMenu: null,
53
+ /** the top bar's open menu: ••• (exports, files and settings) or Layers (the stack) */
31
54
  menu: false,
32
55
  /** when a sheet opened (taps on the backdrop right after are the opening tap's ghost click) */
33
56
  sheetOpenedAt: 0,
57
+ /**
58
+ * How wide the top row's mode tabs and right-hand buttons laid out (0: not yet), and whether those buttons were
59
+ * measured in 3D, which has no Layers (see topRow.ts)
60
+ */
61
+ topRoom: { tabs: 0, right: 0, right3d: false },
62
+ /** Annotate's + floats in the corner (as a phone's) on a screen too short for it under the rail (see Rail) */
63
+ linkFab: false,
34
64
  }));
35
65
  //# sourceMappingURL=store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/react/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD;;;EAGE;AAEF,IAAI,OAAO,GAAG,CAAC,CAAC;AAChB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AAExC,2FAA2F;AAC3F,MAAM,UAAU,MAAM;IACpB,OAAO,EAAE,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,SAAS;QAAE,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,CAAa,EAAE,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClG,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;AAEjC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,oBAAoB,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAKtG,MAAM,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;IACpC,KAAK,EAAE,IAAyB;IAChC,0EAA0E;IAC1E,MAAM,EAAE,KAAK;IACb,gEAAgE;IAChE,QAAQ,EAAE,IAA4E;IACtF,+CAA+C;IAC/C,MAAM,EAAE,IAAwB;IAChC,8DAA8D;IAC9D,UAAU,EAAE,IAAqB;IACjC,IAAI,EAAE,IAA6B;IACnC,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,KAAK;IACX,+FAA+F;IAC/F,aAAa,EAAE,CAAC;CACjB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/react/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD;;;EAGE;AAEF,IAAI,OAAO,GAAG,CAAC,CAAC;AAChB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AAExC,2FAA2F;AAC3F,MAAM,UAAU,MAAM;IACpB,OAAO,EAAE,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,SAAS;QAAE,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,CAAa,EAAE,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClG,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;AAEjC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,oBAAoB,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAEtG,oGAAoG;AACpG,MAAM,CAAC,MAAM,aAAa,GAAG,GAAW,EAAE,CAAC,OAAO,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,GAAiB;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAKD,MAAM,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;IACpC,KAAK,EAAE,IAAyB;IAChC,0EAA0E;IAC1E,MAAM,EAAE,KAAK;IACb,gEAAgE;IAChE,QAAQ,EAAE,IAA4E;IACtF,+CAA+C;IAC/C,MAAM,EAAE,IAAwB;IAChC,8DAA8D;IAC9D,UAAU,EAAE,IAAqB;IACjC,IAAI,EAAE,IAA6B;IACnC,OAAO,EAAE,KAAK;IACd,iIAAiI;IACjI,OAAO,EAAE,IAA4C;IACrD,mHAAmH;IACnH,MAAM,EAAE,IAAgD;IACxD;yDACqD;IACrD,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAA4B;IACpE,SAAS,EAAE,IAAsD;IACjE,uFAAuF;IACvF,IAAI,EAAE,KAAkC;IACxC,+FAA+F;IAC/F,aAAa,EAAE,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;IAC9C,8GAA8G;IAC9G,OAAO,EAAE,KAAK;CACf,CAAC,CAAC,CAAC"}
@@ -1,4 +1,6 @@
1
1
  export declare const C: {
2
+ /** card: the Pages panel's cards (Figma 2548:101989), a step between grey-1 and grey-2 */
3
+ readonly card: '#3A3B3C';
2
4
  readonly dark: '#181A1C';
3
5
  readonly g1: '#2B2C2E';
4
6
  readonly g2: '#424345';
@@ -16,6 +18,14 @@ export declare const C: {
16
18
  readonly green: '#00E920';
17
19
  readonly white: '#FFFFFF';
18
20
  readonly softRed: '#FFB4AE';
21
+ /** the keypad's keys: digits, unit and symbol keys, Del */
22
+ readonly key: '#4B6074';
23
+ readonly key2: '#67819A';
24
+ readonly mutedRed: '#DF6358';
25
+ /** a toggle that's on */
26
+ readonly on: '#58A942';
27
+ /** BOLDR's measurement tiles (Other/Active Blue): the job's lengths under a line's length keys */
28
+ readonly tile: '#0364F4';
19
29
  };
20
30
  /** The chrome's typeface: Montserrat in a browser (the host loads the web font); the system font on a device. */
21
31
  export declare const FONT: string | undefined;
@@ -1,9 +1,17 @@
1
1
  import { Platform } from 'react-native';
2
2
  /* The editor chrome's colors and type (dark in both themes; the canvas has its own light and dark colors). */
3
3
  export const C = {
4
+ /** card: the Pages panel's cards (Figma 2548:101989), a step between grey-1 and grey-2 */
5
+ card: '#3A3B3C',
4
6
  dark: '#181A1C', g1: '#2B2C2E', g2: '#424345', g3: '#626364', g4: '#9FA0A2', lg1: '#BCBEC2', lg2: '#E8EAED',
5
7
  yellow: '#FFAD00', blue: '#0066FF', lblue: '#50A6FF', lblue2: '#89C3FF', red: '#E83D2F', wred: '#DA1100',
6
8
  purple: '#BD30A8', green: '#00E920', white: '#FFFFFF', softRed: '#FFB4AE',
9
+ /** the keypad's keys: digits, unit and symbol keys, Del */
10
+ key: '#4B6074', key2: '#67819A', mutedRed: '#DF6358',
11
+ /** a toggle that's on */
12
+ on: '#58A942',
13
+ /** BOLDR's measurement tiles (Other/Active Blue): the job's lengths under a line's length keys */
14
+ tile: '#0364F4',
7
15
  };
8
16
  /** The chrome's typeface: Montserrat in a browser (the host loads the web font); the system font on a device. */
9
17
  export const FONT = Platform.select({ web: '"Metropolis","Montserrat",-apple-system,"Segoe UI",Roboto,sans-serif', default: undefined });
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/react/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,8GAA8G;AAE9G,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS;IAC3G,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;IACxG,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS;CACjE,CAAC;AAEX,iHAAiH;AACjH,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAqB,EAAE,GAAG,EAAE,sEAAsE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AAE7J,gDAAgD;AAChD,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,kCAAkC,EAAW,CAAC;AAEjF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/react/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,8GAA8G;AAE9G,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,0FAA0F;IAC1F,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS;IAC3G,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;IACxG,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS;IACzE,2DAA2D;IAC3D,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS;IACpD,yBAAyB;IACzB,EAAE,EAAE,SAAS;IACb,kGAAkG;IAClG,IAAI,EAAE,SAAS;CACP,CAAC;AAEX,iHAAiH;AACjH,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAqB,EAAE,GAAG,EAAE,sEAAsE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AAE7J,gDAAgD;AAChD,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,kCAAkC,EAAW,CAAC;AAEjF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC"}
@@ -0,0 +1,22 @@
1
+ /** Where the row the tabs sit on starts (from the editor's top), and the line under them (the tool tips). */
2
+ export declare const TABS_TOP: {
3
+ row: number;
4
+ below: number;
5
+ }, TIP_TOP: {
6
+ row: number;
7
+ below: number;
8
+ };
9
+ export interface TopLayout {
10
+ /** the tabs on a row of their own under the top row */
11
+ below: boolean;
12
+ /** in the top row, but not centred on the screen: their left edge (null: centred) */
13
+ left: number | null;
14
+ /** how wide the crumb may be (0: it isn't shown) */
15
+ crumb: number;
16
+ }
17
+ /** A part of the row laid out `w` wide (the right-hand buttons: as they are in this mode). Nothing changes for less than a point. */
18
+ export declare function setTopRoom(part: 'tabs' | 'right', w: number): void;
19
+ /** The top row on a screen `width` by `height` (round buttons `size` across). */
20
+ export declare function topLayout(width: number, height: number, phone: boolean, size?: number): TopLayout;
21
+ /** The layout as a string, for a component's key (it's drawn again when this changes). */
22
+ export declare const topKey: (l: TopLayout) => string;
@@ -0,0 +1,61 @@
1
+ import { is3d } from '../editor/view3dState';
2
+ import { notify, ui } from './store';
3
+ /*
4
+ The top row: the back button and the crumb on the left, the round buttons on the right, and the mode tabs centred
5
+ between them. Where they don't all fit:
6
+ - a tall screen (a phone; an iPad held upright) puts the tabs on a row of their own under it, as a phone has them;
7
+ - a short one (a phone on its side) has no height to spare for that: the crumb goes, and the tabs sit between the
8
+ back button and the buttons.
9
+ Worked out from their widths as they lay out, so it holds for whatever buttons the host adds. (Centred regardless,
10
+ an 11" iPad's tabs covered the crumb and, in Draft, the Fit button.)
11
+ */
12
+ /** From the screen's edges to the row, and between the tabs and what's beside them. */
13
+ const EDGE = 12, GAP = 10;
14
+ /** The back button's gap to the crumb. */
15
+ const BACK_GAP = 8;
16
+ /** A crumb narrower than this isn't worth showing; the crumb's widest. */
17
+ const CRUMB_MIN = 140, CRUMB_MAX = 420;
18
+ /** Shorter than this (points), a screen keeps the tabs in the top row. */
19
+ const SHORT = 560;
20
+ /** Until they've laid out: about how wide the tabs and the right-hand buttons are. */
21
+ const GUESS = { tabs: 232, right: 330 };
22
+ /** Where the row the tabs sit on starts (from the editor's top), and the line under them (the tool tips). */
23
+ export const TABS_TOP = { row: 12, below: 66 }, TIP_TOP = { row: 66, below: 120 };
24
+ /** A part of the row laid out `w` wide (the right-hand buttons: as they are in this mode). Nothing changes for less than a point. */
25
+ export function setTopRoom(part, w) {
26
+ const r = ui.topRoom, now3d = part === 'right' && is3d();
27
+ if (Math.abs(r[part] - w) < 1 && (part === 'tabs' || r.right3d === now3d))
28
+ return;
29
+ ui.topRoom = part === 'tabs' ? { ...r, tabs: w } : { ...r, right: w, right3d: now3d };
30
+ notify();
31
+ }
32
+ /**
33
+ * The tabs' width, and the right-hand buttons' as Draft has them: 3D has no Layers button, and it's counted anyway, so
34
+ * switching between them never moves the tabs.
35
+ */
36
+ function widths(size) {
37
+ const r = ui.topRoom;
38
+ return { tabs: r.tabs || GUESS.tabs, right: r.right ? r.right + (r.right3d ? size + BACK_GAP : 0) : GUESS.right };
39
+ }
40
+ /** The top row on a screen `width` by `height` (round buttons `size` across). */
41
+ export function topLayout(width, height, phone, size = 46) {
42
+ const m = widths(size), back = EDGE + size + BACK_GAP, end = width - EDGE - m.right - GAP;
43
+ if (phone)
44
+ return { below: true, left: null, crumb: 0 };
45
+ // centred: the crumb up to the tabs, the buttons clear of them
46
+ const side = width / 2 - m.tabs / 2 - GAP, centred = side >= m.right + EDGE;
47
+ if (centred && side - back >= CRUMB_MIN)
48
+ return { below: false, left: null, crumb: Math.min(CRUMB_MAX, side - back) };
49
+ if (height < SHORT) {
50
+ if (centred)
51
+ return { below: false, left: null, crumb: 0 };
52
+ const from = EDGE + size + GAP;
53
+ if (end - from >= m.tabs)
54
+ return { below: false, left: (from + end) / 2 - m.tabs / 2, crumb: 0 };
55
+ }
56
+ const crumb = Math.min(CRUMB_MAX, end - back);
57
+ return { below: true, left: null, crumb: crumb >= CRUMB_MIN ? crumb : 0 };
58
+ }
59
+ /** The layout as a string, for a component's key (it's drawn again when this changes). */
60
+ export const topKey = (l) => [l.below, l.left == null ? '' : Math.round(l.left), Math.round(l.crumb)].join(',');
61
+ //# sourceMappingURL=topRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topRow.js","sourceRoot":"","sources":["../../src/react/topRow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Whether the person is on a touch screen: a device, a coarse pointer in a browser (an iPad), or a finger the last
3
+ * thing on the drawing. A keypad swipes to the job's measurements there, as BOLDR's own keypads do; a desktop has a
4
+ * button for them.
5
+ */
6
+ export declare const touchUI: () => boolean;
@@ -0,0 +1,9 @@
1
+ import { Platform } from 'react-native';
2
+ import { ed } from '../app/state';
3
+ /**
4
+ * Whether the person is on a touch screen: a device, a coarse pointer in a browser (an iPad), or a finger the last
5
+ * thing on the drawing. A keypad swipes to the job's measurements there, as BOLDR's own keypads do; a desktop has a
6
+ * button for them.
7
+ */
8
+ export const touchUI = () => Platform.OS !== 'web' || ed.lastPointerTouch || (typeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches);
9
+ //# sourceMappingURL=touch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"touch.js","sourceRoot":"","sources":["../../src/react/touch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,GAAY,EAAE,CACnC,QAAQ,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,gBAAgB,IAAI,CAAC,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC"}
@@ -16,16 +16,24 @@ export interface DrawCtx {
16
16
  translate(x: number, y: number): void;
17
17
  /** radians, clockwise on screen */
18
18
  rotate(angle: number): void;
19
+ scale(x: number, y: number): void;
19
20
  setLineDash(segments: number[]): void;
20
21
  beginPath(): void;
21
22
  moveTo(x: number, y: number): void;
22
23
  lineTo(x: number, y: number): void;
23
24
  closePath(): void;
25
+ bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
24
26
  /** as the HTML canvas: angles in radians, clockwise on screen unless `counterclockwise` */
25
27
  arc(x: number, y: number, r: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
26
28
  arcTo(x1: number, y1: number, x2: number, y2: number, r: number): void;
27
29
  rect(x: number, y: number, w: number, h: number): void;
28
30
  roundRect(x: number, y: number, w: number, h: number, r: number): void;
31
+ /**
32
+ * Optional: start a path that is a shape `draw` makes (drawn there with its top left at x, y), for a shape drawn many
33
+ * times a frame — every chip's and badge's box. An engine that has it keeps each shape (by `key`) once and moves it
34
+ * into place, instead of describing it again each time; without it, `draw` draws it there.
35
+ */
36
+ shape?(key: string, x: number, y: number, draw: (c: DrawCtx, x: number, y: number) => void): void;
29
37
  fill(): void;
30
38
  stroke(): void;
31
39
  clip(): void;
@@ -3,6 +3,7 @@ import type { Page, XY } from '../model/types';
3
3
  import { type Xform } from './view';
4
4
  import type { DrawCtx } from './ctx';
5
5
  type C2D = DrawCtx;
6
+ /** A rounded rectangle's path, its corners smoothed as Figma's 60% ("iOS"): render/squircle.ts. */
6
7
  export declare function rr(c: C2D, x: number, y: number, w: number, h: number, r: number): void;
7
8
  export interface ChipOpts {
8
9
  bg: string;
@@ -15,9 +16,15 @@ export interface ChipOpts {
15
16
  kind?: HitChip['kind'];
16
17
  id?: string;
17
18
  rot?: number;
19
+ /** a link mark before the text (a value set elsewhere: another view, or a measurement of the job) */
20
+ mark?: 'link';
18
21
  }
22
+ /** Blue for outlined (linked) chips: the lighter blue on a dark canvas, so the text stays readable. */
23
+ export declare function linkBlue(): string;
24
+ /** A small chain-link mark centred on (x, y). */
25
+ export declare function linkMark(c: C2D, x: number, y: number, color: string): void;
19
26
  /** Rounded label on the canvas; registers a hit region when `kind` is given. */
20
- export declare function chip(c: C2D, text: string, cx: number, cy: number, { bg, fg, border, font, pad, h, minW, kind, id, rot }: ChipOpts): number;
27
+ export declare function chip(c: C2D, text: string, cx: number, cy: number, { bg, fg, border, font, pad, h, minW, kind, id, rot, mark }: ChipOpts): number;
21
28
  export declare const DIAM_DEFAULT_ANG: number;
22
29
  /**
23
30
  * Dimension tool, between the two taps: a dashed line from the first pick to what's under the pointer,
@@ -46,6 +53,31 @@ export declare function draw(): void;
46
53
  * can be tapped, in drawing order — what was drawn is what can be tapped.
47
54
  */
48
55
  export declare function drawPlan(ctx: C2D, W: number, H: number): HitChip[];
56
+ /**
57
+ * How a host that keeps the drawing as a picture (see PlanCanvas.native) wants it drawn. It moves and scales the
58
+ * picture with the view until it's redrawn, so: `margin` px of background and grid past each edge of the screen (so
59
+ * a picture zoomed out or panned a little shows no edge), and what stays put on the screen however the view moves —
60
+ * the wall view's key plan, the conflict border — drawn on `fixed` instead. Without them, everything is drawn on the
61
+ * one canvas, to the screen's edges (the browser).
62
+ */
63
+ /**
64
+ * `layer`: just the background, grid and photos and plans ('under'), or everything over them ('above') — a host that
65
+ * keeps them apart redraws the photos alone as one is turned or moved. Without it, all of it.
66
+ */
67
+ export interface KeepOpts {
68
+ margin?: number;
69
+ fixed?: C2D;
70
+ layer?: 'under' | 'above';
71
+ }
72
+ /**
73
+ * The drawing without its moving parts (see drawPlanOverlay), for a host that keeps it as a picture and redraws only
74
+ * those parts as the pointer moves. Returns the tap targets, as drawPlan does.
75
+ */
76
+ export declare function drawPlanStatic(ctx: C2D, W: number, H: number, opts?: KeepOpts): HitChip[];
77
+ /** The photos and plans under the drawing, with the background and grid (see KeepOpts.layer). */
78
+ export declare function drawPlanUnder(ctx: C2D, W: number, H: number, opts?: KeepOpts): void;
79
+ /** The parts that move with the pointer: a tool's preview, the snap marker, the selection box, the conflict tint. */
80
+ export declare function drawPlanOverlay(ctx: C2D, W: number, H: number, opts?: KeepOpts): void;
49
81
  /** Page thumbnail for the drawer (no chips, no definition colors). */
50
82
  export declare function drawThumb(canvas: HTMLCanvasElement, pg: Page): void;
51
83
  /** A page's walls, lines and spaces fitted into w × h, without labels (page thumbnails, file previews). */