@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,77 @@
1
+ import { type ReactNode } from 'react';
2
+ import { Animated, type PressableProps, type StyleProp, type TextStyle, type ViewStyle } from 'react-native';
3
+ import { DURATION, EASE } from './easing';
4
+ export { DURATION, EASE };
5
+ export declare const POP_IN = 140, POP_OUT = 100, POP_EASE_OUT: import("react-native").EasingFunction;
6
+ /** Reduce Motion is on: things that move only fade. */
7
+ export declare const reducedMotion: () => boolean;
8
+ /**
9
+ * A popup's coming and going: whether it's on screen (`present` — open, or still going), and the style that moves it.
10
+ * `from`: where it comes from, points (toward the button that opened it: a menu under a button at the top comes down
11
+ * from it, `{ y: -6 }`); `origin`: the point it grows from, as CSS transform-origin ('top right', 'left center'…).
12
+ *
13
+ * `keep`: once it's been open, it stays built between times — hidden (`display: none`: not laid out, not tapped, not
14
+ * read out) rather than taken down — so a menu with a lot in it opens at once, not after it's been built again (on a
15
+ * device, the wait before it moved). `mounted` says whether to draw it at all; the style hides it when it's away.
16
+ */
17
+ export declare function usePopup(open: boolean, from: {
18
+ x?: number;
19
+ y?: number;
20
+ }, origin: string, keep?: boolean): {
21
+ present: boolean;
22
+ mounted: boolean;
23
+ style: Animated.WithAnimatedObject<ViewStyle>;
24
+ };
25
+ /** An animated value that eases to 1 when `on`, to 0 when not (starting where it is). */
26
+ export declare function useEased(on: boolean): Animated.Value;
27
+ /**
28
+ * A press as an animated value: to 1 as it goes down, back to 0 as it lets go. Spread the handlers on a Pressable.
29
+ * `full`: a quick tap still shows the whole press — let go before it's all the way in, it finishes going in, then
30
+ * comes back (within `outMs` all told).
31
+ */
32
+ export declare function usePress(inMs?: number, outMs?: number, easing?: import("react-native").EasingFunction, full?: boolean): {
33
+ v: Animated.Value;
34
+ onPressIn: () => void;
35
+ onPressOut: () => void;
36
+ };
37
+ /** The toggle's own pace: a smooth ease in and out, slower than a button press, so its knob's travel reads as one glide. */
38
+ export declare const TOGGLE_EASE: import("react-native").EasingFunction;
39
+ export declare const TOGGLE_MS = 200, TOGGLE_PRESS_MS = 90;
40
+ /**
41
+ * A toggle's glide, started by the tap itself rather than once the setting it flips has been applied: on a device that
42
+ * meant waiting for the menu to render again and, for a layer or a snap, the drawing to be redrawn — the knob sat
43
+ * stretched for a moment before it moved. `go` starts the glide now; a change of `on` from elsewhere (the setting
44
+ * changed another way, or put back) glides it too.
45
+ */
46
+ export declare function useToggleEased(on: boolean): {
47
+ v: Animated.Value;
48
+ go: (to: boolean, change: () => void) => void;
49
+ };
50
+ type TapState = {
51
+ pressed: boolean;
52
+ hovered: boolean;
53
+ };
54
+ export type TapProps = Omit<PressableProps, 'style' | 'children'> & {
55
+ style?: StyleProp<ViewStyle> | ((s: TapState) => StyleProp<ViewStyle>);
56
+ children?: ReactNode;
57
+ /** scale: sinks and dims (buttons, keys); dim: only dims (wide rows); none: no press feedback */
58
+ feel?: 'scale' | 'dim' | 'none';
59
+ };
60
+ /** A Pressable with the chrome's press feel. `style` may be a function of { pressed, hovered }, as a Pressable's. */
61
+ export declare function Tap({ style, feel, onPressIn, onPressOut, onHoverIn, onHoverOut, ...rest }: TapProps): import("react").JSX.Element;
62
+ /**
63
+ * A segmented control (Units, Precision, Draft / Annotate, Pages / Spaces): the chosen option's highlight slides to
64
+ * the one picked as the labels fade. `style` is the track, `optionStyle` each option, `onColor` the highlight.
65
+ */
66
+ export declare function Segmented<T extends string | number>({ value, options, onPick, style, optionStyle, textStyle, onColor, onText, offText, role }: {
67
+ value: T;
68
+ options: [T, string][];
69
+ onPick: (v: T) => void;
70
+ style?: StyleProp<ViewStyle>;
71
+ optionStyle?: StyleProp<ViewStyle>;
72
+ textStyle?: StyleProp<TextStyle>;
73
+ onColor?: string;
74
+ onText: string;
75
+ offText: string;
76
+ role?: 'button' | 'tab';
77
+ }): import("react").JSX.Element;
@@ -0,0 +1,173 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { AccessibilityInfo, Animated, Easing, Pressable, StyleSheet, View, } from 'react-native';
4
+ import { DURATION, EASE, NATIVE } from './easing';
5
+ import { TweenView } from './Tween';
6
+ /*
7
+ How the chrome moves: one set of rules, everywhere.
8
+ - A change of state (a toggle, a choice in a segmented control, the selected tool) moves over 150 ms: off at once,
9
+ settling softly at the end — quick to answer, nothing springy.
10
+ - A press sinks a touch (to 96 %, a little dimmer) in 70 ms and comes back over 150 ms with the same easing; wide
11
+ rows (menu items) only dim.
12
+ On a device all of it runs on the native driver — opacity, transforms and colours only (what moves a view's size or
13
+ place goes through TweenView) — so a press or a change of state plays smoothly however busy the JavaScript thread is,
14
+ as it is just after a tap (the editor answers, the plan is drawn again). Interpolations are made once, not on every
15
+ render: each one made anew has to be sent to the UI thread again.
16
+ */
17
+ export { DURATION, EASE };
18
+ const PRESS_IN = 70;
19
+ const ease = (v, to, duration = DURATION) => Animated.timing(v, { toValue: to, duration, easing: EASE, useNativeDriver: NATIVE }).start();
20
+ /*
21
+ Popups — the ••• and Layers menus, the shapes menu, the markup panel, an image's slider, a toast — come and go the
22
+ same way: in about 140 ms they fade in and grow from just under their size, easing to a stop, moving out a few
23
+ points from the button that opened them; going, in about 100 ms they fade and shrink back, gathering pace, and stay
24
+ on screen until they've gone. Opacity and a transform only, on the native driver: the UI thread plays them, so a
25
+ busy JavaScript thread (a redraw, a save) can't make them stutter. With Reduce Motion on, they only fade.
26
+ */
27
+ export const POP_IN = 140, POP_OUT = 100, POP_EASE_OUT = Easing.bezier(0.4, 0, 1, 1);
28
+ let reduceMotion = false;
29
+ try {
30
+ AccessibilityInfo.isReduceMotionEnabled?.().then(v => { reduceMotion = !!v; }, () => { });
31
+ AccessibilityInfo.addEventListener?.('reduceMotionChanged', (v) => { reduceMotion = !!v; });
32
+ }
33
+ catch { /* (no accessibility settings to read: full motion) */ }
34
+ /** Reduce Motion is on: things that move only fade. */
35
+ export const reducedMotion = () => reduceMotion;
36
+ /**
37
+ * A popup's coming and going: whether it's on screen (`present` — open, or still going), and the style that moves it.
38
+ * `from`: where it comes from, points (toward the button that opened it: a menu under a button at the top comes down
39
+ * from it, `{ y: -6 }`); `origin`: the point it grows from, as CSS transform-origin ('top right', 'left center'…).
40
+ *
41
+ * `keep`: once it's been open, it stays built between times — hidden (`display: none`: not laid out, not tapped, not
42
+ * read out) rather than taken down — so a menu with a lot in it opens at once, not after it's been built again (on a
43
+ * device, the wait before it moved). `mounted` says whether to draw it at all; the style hides it when it's away.
44
+ */
45
+ export function usePopup(open, from, origin, keep = false) {
46
+ const v = useRef(new Animated.Value(open ? 1 : 0)).current, [present, setPresent] = useState(open), been = useRef(open);
47
+ if (open)
48
+ been.current = true;
49
+ useEffect(() => {
50
+ if (open)
51
+ setPresent(true);
52
+ // (on the next frame: a popup just put on screen is mounted twice by React's strict mode, and its animation would
53
+ // stop when the first goes)
54
+ const frame = requestAnimationFrame(() => {
55
+ Animated.timing(v, open
56
+ ? { toValue: 1, duration: POP_IN, easing: EASE, useNativeDriver: NATIVE }
57
+ : { toValue: 0, duration: POP_OUT, easing: POP_EASE_OUT, useNativeDriver: NATIVE })
58
+ .start(({ finished }) => { if (finished && !open)
59
+ setPresent(false); });
60
+ });
61
+ return () => cancelAnimationFrame(frame);
62
+ }, [open, v]);
63
+ const fx = from.x ?? 0, fy = from.y ?? 0;
64
+ const style = useMemo(() => (reduceMotion
65
+ ? { opacity: v }
66
+ : {
67
+ opacity: v, transformOrigin: origin,
68
+ transform: [
69
+ { translateX: v.interpolate({ inputRange: [0, 1], outputRange: [fx, 0] }) },
70
+ { translateY: v.interpolate({ inputRange: [0, 1], outputRange: [fy, 0] }) },
71
+ { scale: v.interpolate({ inputRange: [0, 1], outputRange: [0.96, 1] }) },
72
+ ],
73
+ }), [v, fx, fy, origin]);
74
+ const shown = open || present;
75
+ const hidden = useMemo(() => [style, { display: 'none' }], [style]);
76
+ return { present: shown, mounted: shown || (keep && been.current), style: shown ? style : hidden };
77
+ }
78
+ /** An animated value that eases to 1 when `on`, to 0 when not (starting where it is). */
79
+ export function useEased(on) {
80
+ const v = useRef(new Animated.Value(on ? 1 : 0)).current;
81
+ useEffect(() => { ease(v, on ? 1 : 0); }, [on, v]);
82
+ return v;
83
+ }
84
+ /**
85
+ * A press as an animated value: to 1 as it goes down, back to 0 as it lets go. Spread the handlers on a Pressable.
86
+ * `full`: a quick tap still shows the whole press — let go before it's all the way in, it finishes going in, then
87
+ * comes back (within `outMs` all told).
88
+ */
89
+ export function usePress(inMs = PRESS_IN, outMs = DURATION, easing = EASE, full = false) {
90
+ const v = useRef(new Animated.Value(0)).current;
91
+ const timing = (x, ms) => Animated.timing(v, { toValue: x, duration: ms, easing, useNativeDriver: NATIVE });
92
+ return {
93
+ v,
94
+ onPressIn: () => timing(1, inMs).start(),
95
+ onPressOut: () => v.stopAnimation(now => {
96
+ if (!full || now >= 0.99) {
97
+ timing(0, outMs).start();
98
+ return;
99
+ }
100
+ const rest = Math.round((1 - now) * inMs * 0.6);
101
+ Animated.sequence([timing(1, rest), timing(0, Math.max(60, outMs - rest))]).start();
102
+ }),
103
+ };
104
+ }
105
+ /** The toggle's own pace: a smooth ease in and out, slower than a button press, so its knob's travel reads as one glide. */
106
+ export const TOGGLE_EASE = Easing.bezier(0.4, 0, 0.2, 1);
107
+ export const TOGGLE_MS = 200, TOGGLE_PRESS_MS = 90;
108
+ /**
109
+ * A toggle's glide, started by the tap itself rather than once the setting it flips has been applied: on a device that
110
+ * meant waiting for the menu to render again and, for a layer or a snap, the drawing to be redrawn — the knob sat
111
+ * stretched for a moment before it moved. `go` starts the glide now; a change of `on` from elsewhere (the setting
112
+ * changed another way, or put back) glides it too.
113
+ */
114
+ export function useToggleEased(on) {
115
+ const v = useRef(new Animated.Value(on ? 1 : 0)).current, at = useRef(on), pending = useRef(false);
116
+ const glide = useCallback((to) => {
117
+ at.current = to;
118
+ Animated.timing(v, { toValue: to ? 1 : 0, duration: TOGGLE_MS, easing: TOGGLE_EASE, useNativeDriver: NATIVE }).start();
119
+ }, [v]);
120
+ /** Glide to `to` now, and make the change a frame later (once the glide is with the native driver). */
121
+ const go = useCallback((to, change) => {
122
+ glide(to);
123
+ pending.current = true;
124
+ requestAnimationFrame(() => { pending.current = false; change(); });
125
+ }, [glide]);
126
+ // after every render: where the setting really is wins (changed another way, or refused) — not while a tap's own
127
+ // change is still on its way
128
+ useEffect(() => { if (!pending.current && on !== at.current)
129
+ glide(on); });
130
+ return { v, go };
131
+ }
132
+ const AnimatedPressable = Animated.createAnimatedComponent(Pressable);
133
+ /** A Pressable with the chrome's press feel. `style` may be a function of { pressed, hovered }, as a Pressable's. */
134
+ export function Tap({ style, feel = 'scale', onPressIn, onPressOut, onHoverIn, onHoverOut, ...rest }) {
135
+ const v = useRef(new Animated.Value(0)).current;
136
+ const [st, setSt] = useState({ pressed: false, hovered: false });
137
+ const resolved = typeof style === 'function' ? style(st) : style;
138
+ const base = StyleSheet.flatten(resolved)?.opacity ?? 1;
139
+ const anim = useMemo(() => (feel === 'none' ? null : {
140
+ opacity: v.interpolate({ inputRange: [0, 1], outputRange: [base, base * (feel === 'dim' ? 0.7 : 0.82)] }),
141
+ ...(feel === 'scale' ? { transform: [{ scale: v.interpolate({ inputRange: [0, 1], outputRange: [1, 0.96] }) }] } : {}),
142
+ }), [v, base, feel]);
143
+ return (_jsx(AnimatedPressable, { ...rest, onPressIn: (e) => { setSt(s => ({ ...s, pressed: true })); ease(v, 1, PRESS_IN); onPressIn?.(e); }, onPressOut: (e) => { setSt(s => ({ ...s, pressed: false })); ease(v, 0); onPressOut?.(e); }, onHoverIn: (e) => { setSt(s => ({ ...s, hovered: true })); onHoverIn?.(e); }, onHoverOut: (e) => { setSt(s => ({ ...s, hovered: false })); onHoverOut?.(e); }, style: [resolved, anim] }));
144
+ }
145
+ /**
146
+ * One option of a segmented control: its label fades between the two colours as it's chosen. On a device that's two
147
+ * labels, one over the other, crossfaded on the native driver (it animates a fade smoothly, not a text colour); in a
148
+ * browser, one label whose colour is eased.
149
+ */
150
+ function SegOption({ label, on, onPress, onLayout, style, textStyle, onText, offText, role }) {
151
+ const t = useEased(on);
152
+ const ink = useMemo(() => (NATIVE ? t.interpolate({ inputRange: [0, 1], outputRange: [1, 0] }) : t.interpolate({ inputRange: [0, 1], outputRange: [offText, onText] })), [t, offText, onText]);
153
+ return (_jsx(Tap, { feel: "dim", accessibilityRole: role, accessibilityLabel: label, accessibilityState: { selected: on }, onPress: onPress, onLayout: e => onLayout(e.nativeEvent.layout), style: [segCenter, style, { backgroundColor: 'transparent' }], children: NATIVE ? (_jsxs(_Fragment, { children: [_jsx(Animated.Text, { style: [textStyle, { color: offText, opacity: ink }], children: label }), _jsx(View, { pointerEvents: "none", style: segOver, children: _jsx(Animated.Text, { accessible: false, style: [textStyle, { color: onText, opacity: t }], children: label }) })] })) : _jsx(Animated.Text, { style: [textStyle, { color: ink }], children: label }) }));
154
+ }
155
+ // (no grow: a device's layout grows a row with a growing child to all the room it's given — the control then ran the
156
+ // width of its menu row, squeezing the row's own label out)
157
+ const segRow = { flexDirection: 'row', alignSelf: 'stretch' };
158
+ /** An option's label sits in its middle, both ways, whatever its padding. */
159
+ const segCenter = { alignItems: 'center', justifyContent: 'center' };
160
+ // (spelt out: React Native 0.86 dropped StyleSheet.absoluteFillObject, and spreading it gave nothing — the label then sat
161
+ // under the other one, each option centring the pair)
162
+ const segOver = { position: 'absolute', top: 0, right: 0, bottom: 0, left: 0, alignItems: 'center', justifyContent: 'center' };
163
+ /**
164
+ * A segmented control (Units, Precision, Draft / Annotate, Pages / Spaces): the chosen option's highlight slides to
165
+ * the one picked as the labels fade. `style` is the track, `optionStyle` each option, `onColor` the highlight.
166
+ */
167
+ export function Segmented({ value, options, onPick, style, optionStyle, textStyle, onColor = '#fff', onText, offText, role = 'button' }) {
168
+ const [boxes, setBoxes] = useState({});
169
+ const box = boxes[String(value)];
170
+ const radius = StyleSheet.flatten(optionStyle)?.borderRadius ?? 999;
171
+ return (_jsx(View, { style: style, accessibilityRole: role === 'tab' ? 'tablist' : undefined, children: _jsxs(View, { style: segRow, children: [box && (_jsx(TweenView, { pointerEvents: "none", to: { left: box.x, width: box.width }, style: { position: 'absolute', top: 0, bottom: 0, borderRadius: radius, backgroundColor: onColor } })), options.map(([v, label]) => (_jsx(SegOption, { label: label, on: v === value, onPress: () => onPick(v), role: role, onLayout: r => setBoxes(b => (b[String(v)] && b[String(v)].x === r.x && b[String(v)].width === r.width ? b : { ...b, [String(v)]: r })), style: optionStyle, textStyle: textStyle, onText: onText, offText: offText }, String(v))))] }) }));
172
+ }
173
+ //# sourceMappingURL=motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.js","sourceRoot":"","sources":["../../src/react/motion.tsx"],"names":[],"mappings":"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"}
@@ -1,10 +1,14 @@
1
1
  import { conflictEnd, conflictOpen, conflictStart } from '../editor/conflict';
2
2
  import { elevSyncFrame } from '../editor/elevation';
3
- import { keypadEnd, keypadOpen, keypadStart, keypadTyped } from '../editor/keypad';
3
+ import { keypadEnd, keypadOnHost, keypadOpen, keypadSpec, keypadStart, keypadSubmit, keypadTyped } from '../editor/keypad';
4
+ import { hostKeypad } from './hostKeypad';
5
+ import { offersJobMeasurements } from '../editor/links';
4
6
  import { onSessionReset } from '../model/session';
5
7
  import { saveNow } from '../model/store';
6
- import { requestDraw } from '../render/view';
8
+ import { manualSave, noteEdits, saveDrawing } from './saving';
9
+ import { requestDraw, requestOverlayDraw } from '../render/view';
7
10
  import { notify, ui } from './store';
11
+ import { setInteracting } from './Duck';
8
12
  /* The editor's ports for the React Native interface: each request updates the interface's state and re-renders. */
9
13
  let toastTimer, toastId = 0;
10
14
  onSessionReset(() => clearTimeout(toastTimer));
@@ -31,15 +35,68 @@ function downloadInBrowser(name, mime, data) {
31
35
  a.remove();
32
36
  setTimeout(() => URL.revokeObjectURL(a.href), 2000);
33
37
  }
38
+ /** What the host's keypad is asked for (see hostKeypad.ts): its answer goes to this keypad, if it's still the one open. */
39
+ function hostRequest(spec) {
40
+ const mine = () => keypadSpec() === spec;
41
+ return {
42
+ title: spec.title,
43
+ sub: spec.sub,
44
+ kind: spec.numeric ? 'angle' : 'length',
45
+ current: spec.initial || undefined,
46
+ extras: () => (spec.extras?.() ?? []).map(x => ({ label: x.label, ariaLabel: x.ariaLabel, on: x.on, danger: x.danger, press: () => { if (mine()) {
47
+ x.onPress();
48
+ notify();
49
+ } } })),
50
+ apply: v => { if (mine())
51
+ keypadSubmit(v); },
52
+ cancel: () => { if (mine())
53
+ reactPorts.closeKeypad(); },
54
+ ...(spec.measurements && offersJobMeasurements() ? {
55
+ measurementKind: spec.measurements.kind,
56
+ pickMeasurement: (t) => { if (mine()) {
57
+ spec.measurements.pick(t);
58
+ notify();
59
+ } },
60
+ } : {}),
61
+ };
62
+ }
63
+ /** A slider above the bar (an image's opacity or rotation, the tiles' size): opened, swapped for another, or closed by its button again. */
64
+ function toggleImagePop(kind) {
65
+ ui.imgPop = ui.imgPop === kind ? null : kind;
66
+ ui.menu = false;
67
+ // (a toast would sit over the slider: it's done with once the slider opens)
68
+ if (ui.imgPop)
69
+ ui.toast = null;
70
+ notify();
71
+ }
72
+ /**
73
+ * One re-render for all an edit refreshes: an edit alone refreshes the bar, the status, the drawer and the wall view,
74
+ * and each refresh had every component on screen work out again what it shows — four to seven times for one tap.
75
+ * React draws once at the end of the task anyway; this has them look once too.
76
+ */
77
+ let refreshQueued = false;
78
+ function notifySoon() {
79
+ if (refreshQueued)
80
+ return;
81
+ refreshQueued = true;
82
+ queueMicrotask(() => { refreshQueued = false; notify(); });
83
+ }
84
+ onSessionReset(() => { refreshQueued = false; });
34
85
  export const reactPorts = {
35
86
  refresh(part) {
87
+ // canvas previews follow the typed value: they're drawn with the moving parts, not the whole drawing again
36
88
  if (part === 'keypad')
37
- requestDraw(); // canvas previews follow the typed value
89
+ requestOverlayDraw();
38
90
  if (part === 'elevation')
39
91
  elevSyncFrame(); // the open wall's frame from the live drawing (closes the view if the wall is gone)
40
- notify();
92
+ noteEdits();
93
+ notifySoon();
41
94
  },
95
+ // only what needs attention: something asked for that couldn't be done, and why. What did happen shows on the
96
+ // drawing itself — no status messages ("Deleted", "Undone", "Points joined"…)
42
97
  toast(msg, o = {}) {
98
+ if (!o.warn)
99
+ return;
43
100
  ui.toast = { id: ++toastId, msg, warn: o.warn, action: o.action };
44
101
  clearTimeout(toastTimer);
45
102
  toastTimer = setTimeout(() => { ui.toast = null; notify(); }, o.warn ? 5200 : 3200);
@@ -47,6 +104,18 @@ export const reactPorts = {
47
104
  },
48
105
  openKeypad(spec) {
49
106
  reactPorts.dismissConflict();
107
+ // a phone's host asks with its own keypad: the editor keeps the request (a laser reading, Delete, another tool can
108
+ // still close it) but draws nothing of its own
109
+ const host = hostKeypad();
110
+ if (host) {
111
+ if (keypadOpen())
112
+ reactPorts.closeKeypad();
113
+ keypadStart(spec, true);
114
+ host(hostRequest(spec));
115
+ notify();
116
+ requestDraw();
117
+ return;
118
+ }
50
119
  // the keypad has no text field: let typed keys reach the editor, not the button that opened it (Enter would press it again)
51
120
  if (typeof document !== 'undefined')
52
121
  document.activeElement?.blur?.();
@@ -57,7 +126,9 @@ export const reactPorts = {
57
126
  requestDraw();
58
127
  },
59
128
  closeKeypad() {
60
- const spec = keypadEnd();
129
+ const onHost = keypadOnHost(), spec = keypadEnd();
130
+ if (onHost)
131
+ hostKeypad()?.(null);
61
132
  ui.keypad = false;
62
133
  notify();
63
134
  requestDraw();
@@ -81,25 +152,36 @@ export const reactPorts = {
81
152
  return true;
82
153
  },
83
154
  openDrawer(tab) { ui.drawer = tab ?? 'pages'; notify(); },
84
- showNoteInput(x, y, cb) { ui.note = { x, y, cb }; notify(); },
155
+ showNoteInput(x, y, cb, initial) { ui.note = { x, y, cb, initial }; notify(); },
85
156
  hideNoteInput() { if (ui.note) {
86
157
  ui.note = null;
87
158
  notify();
88
159
  } },
89
- openPalette() { ui.palette = true; notify(); },
160
+ // (its button again closes it)
161
+ openPalette() { ui.palette = !ui.palette; ui.menu = false; ui.shapeMenu = null; notify(); },
162
+ toggleImageOpacity() { toggleImagePop('opacity'); },
163
+ toggleImageRotation() { toggleImagePop('rotate'); },
164
+ toggleTileSize() { toggleImagePop('tilesize'); },
90
165
  editRoomName(roomId) { ui.drawer = 'rooms'; ui.renameRoom = roomId; notify(); },
91
166
  setCursor(cursor, where = 'plan') { cursorTargets[where]?.(cursor); },
167
+ interacting: setInteracting,
92
168
  dismissPopovers() {
93
- const was = ui.palette || ui.menu;
169
+ const was = ui.palette || !!ui.menu || !!ui.imgPop || !!ui.shapeMenu;
94
170
  if (was) {
95
171
  ui.palette = false;
96
172
  ui.menu = false;
173
+ ui.imgPop = null;
174
+ ui.shapeMenu = null;
97
175
  notify();
98
176
  }
99
177
  return was;
100
178
  },
101
179
  saveFile(name, mime, data) { (fileSaver ?? downloadInBrowser)(name, mime, data); },
102
180
  save() {
181
+ if (manualSave()) {
182
+ void saveDrawing();
183
+ return;
184
+ }
103
185
  const ok = saveNow();
104
186
  reactPorts.toast(ok ? 'Saved on this device' : 'Saved, but the image was too large to keep offline.', { warn: !ok });
105
187
  },
@@ -1 +1 @@
1
- {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/react/ports.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/react/ports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CadSync } from '../data/sync';
2
+ export type CadSaveState = 'saved' | 'dirty' | 'saving' | 'error';
3
+ export declare const manualSave: () => boolean;
4
+ export declare const saveState: () => CadSaveState;
5
+ /** Start manual saving for the drawing open in `sync`; `listener` hears each change of state. */
6
+ export declare function startManualSave(sync: CadSync, listener: ((s: CadSaveState) => void) | null): void;
7
+ export declare function stopManualSave(): void;
8
+ /** An edit was made: unsaved from now on (cheap, so it runs with every refresh of the editor). */
9
+ export declare function noteEdits(): void;
10
+ /** Compare the drawing with what's saved (an undo back to the saved drawing is clean again). */
11
+ export declare function checkChanges(): void;
12
+ /** Whether the drawing has edits that aren't saved (or a save that failed or is still going). */
13
+ export declare function hasUnsavedChanges(): boolean;
14
+ /** Save: write the drawing, its preview and its measurements. Resolves true once written, false if that failed. */
15
+ export declare function saveDrawing(): Promise<boolean>;
@@ -0,0 +1,76 @@
1
+ import { ed } from '../app/state';
2
+ import { sessionState } from '../model/session';
3
+ import { store } from '../model/store';
4
+ import { notify } from './store';
5
+ import { renderThumbnail } from './thumbnail';
6
+ const sv = sessionState(() => ({
7
+ manual: false,
8
+ state: 'saved',
9
+ /** the edit count when the drawing last matched what's saved */
10
+ cleanSeq: 0,
11
+ sync: null,
12
+ listener: null,
13
+ }));
14
+ export const manualSave = () => sv.manual;
15
+ export const saveState = () => sv.state;
16
+ function setState(s) {
17
+ if (sv.state === s)
18
+ return;
19
+ sv.state = s;
20
+ sv.listener?.(s);
21
+ notify();
22
+ }
23
+ /** Start manual saving for the drawing open in `sync`; `listener` hears each change of state. */
24
+ export function startManualSave(sync, listener) {
25
+ Object.assign(sv, { manual: true, state: 'saved', cleanSeq: ed.editSeq, sync, listener });
26
+ listener?.('saved');
27
+ }
28
+ export function stopManualSave() {
29
+ Object.assign(sv, { manual: false, sync: null, listener: null });
30
+ }
31
+ /** An edit was made: unsaved from now on (cheap, so it runs with every refresh of the editor). */
32
+ export function noteEdits() {
33
+ if (sv.manual && sv.state !== 'saving' && ed.editSeq !== sv.cleanSeq)
34
+ setState('dirty');
35
+ }
36
+ /** Compare the drawing with what's saved (an undo back to the saved drawing is clean again). */
37
+ export function checkChanges() {
38
+ if (!sv.manual || !sv.sync || sv.state === 'saving')
39
+ return;
40
+ if (sv.sync.hasChanges())
41
+ setState('dirty');
42
+ else {
43
+ sv.cleanSeq = ed.editSeq;
44
+ setState('saved');
45
+ }
46
+ }
47
+ /** Whether the drawing has edits that aren't saved (or a save that failed or is still going). */
48
+ export function hasUnsavedChanges() {
49
+ checkChanges();
50
+ return sv.manual && sv.state !== 'saved';
51
+ }
52
+ /** Save: write the drawing, its preview and its measurements. Resolves true once written, false if that failed. */
53
+ export async function saveDrawing() {
54
+ const sync = sv.sync;
55
+ if (!sv.manual || !sync || !store.project)
56
+ return true;
57
+ setState('saving');
58
+ const before = sync.failures();
59
+ sync.persistence.save();
60
+ const thumb = renderThumbnail(store.project.pages[0]);
61
+ if (thumb)
62
+ sync.saveThumbnail(thumb);
63
+ await sync.idle();
64
+ await sync.idle(); // the measurement ids the save stamped on the pages
65
+ if (sync.failures() !== before) {
66
+ setState('error');
67
+ return false;
68
+ }
69
+ // edited while it saved: still unsaved
70
+ const dirty = sync.hasChanges();
71
+ if (!dirty)
72
+ sv.cleanSeq = ed.editSeq;
73
+ setState(dirty ? 'dirty' : 'saved');
74
+ return true;
75
+ }
76
+ //# sourceMappingURL=saving.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saving.js","sourceRoot":"","sources":["../../src/react/saving.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,15 @@ import type { ConflictSpec, DrawerTab, ToastOpts } from '../editor/ports';
3
3
  export declare function notify(): void;
4
4
  /** Re-render this component whenever the editor changes. */
5
5
  export declare const useEditorVersion: () => number;
6
+ /** The editor's change count (for a key that should change with every change: see useEditorKey). */
7
+ export declare const editorVersion: () => number;
8
+ /**
9
+ * Re-render this component only when what it shows changes, not on every change to the editor: `key` sums up all it
10
+ * reads, as one string, worked out again after each change — the same string, and it isn't rendered again. Keep it
11
+ * cheap and free of side effects; a component that's only briefly on screen can key on editorVersion() instead.
12
+ * (Re-rendering the whole interface on every change was most of the time an interaction took on a phone.)
13
+ */
14
+ export declare function useEditorKey(key: () => string): string;
6
15
  export interface ToastState {
7
16
  id: number;
8
17
  msg: string;
@@ -13,6 +22,7 @@ export interface NoteInputState {
13
22
  x: number;
14
23
  y: number;
15
24
  cb: (text: string) => void;
25
+ initial?: string;
16
26
  }
17
27
  export declare const ui: {
18
28
  toast: ToastState | null;
@@ -32,7 +42,34 @@ export declare const ui: {
32
42
  renameRoom: string | null;
33
43
  note: NoteInputState | null;
34
44
  palette: boolean;
35
- menu: boolean;
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: {
47
+ text: string;
48
+ seq: number;
49
+ } | null;
50
+ /** the slider open above the bar: the selected image's opacity, or how far it's turned; or the link tiles' size */
51
+ imgPop: null | 'opacity' | 'rotate' | 'tilesize';
52
+ /** the tool each shared place on the rail draws with (the last picked; editor/mode.ts TOOL_GROUPS), and the menu of
53
+ a group's tools, open beside its place at x, y */
54
+ picked: Record<string, string>;
55
+ shapeMenu: {
56
+ x: number;
57
+ y: number;
58
+ group: string;
59
+ } | null;
60
+ /** the top bar's open menu: ••• (exports, files and settings) or Layers (the stack) */
61
+ menu: false | 'more' | 'layers';
36
62
  /** when a sheet opened (taps on the backdrop right after are the opening tap's ghost click) */
37
63
  sheetOpenedAt: number;
64
+ /**
65
+ * How wide the top row's mode tabs and right-hand buttons laid out (0: not yet), and whether those buttons were
66
+ * measured in 3D, which has no Layers (see topRow.ts)
67
+ */
68
+ topRoom: {
69
+ tabs: number;
70
+ right: number;
71
+ right3d: boolean;
72
+ };
73
+ /** Annotate's + floats in the corner (as a phone's) on a screen too short for it under the rail (see Rail) */
74
+ linkFab: boolean;
38
75
  };