@reekon-tools/boldr-cad 1.4.0 → 1.6.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 (311) hide show
  1. package/README.md +13 -3
  2. package/dist/app/edit.d.ts +3 -3
  3. package/dist/app/edit.js +26 -1
  4. package/dist/app/edit.js.map +1 -1
  5. package/dist/app/state.d.ts +6 -8
  6. package/dist/app/state.js +0 -1
  7. package/dist/app/state.js.map +1 -1
  8. package/dist/data/sync.d.ts +1 -1
  9. package/dist/data/sync.js +7 -2
  10. package/dist/data/sync.js.map +1 -1
  11. package/dist/editor/actions.d.ts +8 -0
  12. package/dist/editor/actions.js +255 -181
  13. package/dist/editor/actions.js.map +1 -1
  14. package/dist/editor/elevation.d.ts +4 -1
  15. package/dist/editor/elevation.js +16 -17
  16. package/dist/editor/elevation.js.map +1 -1
  17. package/dist/editor/gestures.d.ts +21 -0
  18. package/dist/editor/gestures.js +92 -14
  19. package/dist/editor/gestures.js.map +1 -1
  20. package/dist/editor/keys.js +4 -3
  21. package/dist/editor/keys.js.map +1 -1
  22. package/dist/editor/laser.d.ts +4 -2
  23. package/dist/editor/laser.js +4 -2
  24. package/dist/editor/laser.js.map +1 -1
  25. package/dist/editor/linkActions.d.ts +49 -12
  26. package/dist/editor/linkActions.js +164 -35
  27. package/dist/editor/linkActions.js.map +1 -1
  28. package/dist/editor/links.d.ts +13 -0
  29. package/dist/editor/links.js +7 -1
  30. package/dist/editor/links.js.map +1 -1
  31. package/dist/editor/mode.d.ts +2 -1
  32. package/dist/editor/mode.js +8 -5
  33. package/dist/editor/mode.js.map +1 -1
  34. package/dist/editor/project.js +1 -2
  35. package/dist/editor/project.js.map +1 -1
  36. package/dist/editor/scaleGate.d.ts +13 -0
  37. package/dist/editor/scaleGate.js +27 -0
  38. package/dist/editor/scaleGate.js.map +1 -0
  39. package/dist/editor/selection.js +13 -9
  40. package/dist/editor/selection.js.map +1 -1
  41. package/dist/editor/tooltips.js +10 -0
  42. package/dist/editor/tooltips.js.map +1 -1
  43. package/dist/editor/view3d.d.ts +4 -1
  44. package/dist/editor/view3d.js +6 -2
  45. package/dist/editor/view3d.js.map +1 -1
  46. package/dist/export/pdf.d.ts +5 -2
  47. package/dist/export/pdf.js +12 -8
  48. package/dist/export/pdf.js.map +1 -1
  49. package/dist/export/plan.d.ts +1 -1
  50. package/dist/export/plan.js +14 -9
  51. package/dist/export/plan.js.map +1 -1
  52. package/dist/index.d.ts +1 -0
  53. package/dist/index.js +1 -0
  54. package/dist/index.js.map +1 -1
  55. package/dist/model/constraints.js +2 -0
  56. package/dist/model/constraints.js.map +1 -1
  57. package/dist/model/demo.d.ts +1 -0
  58. package/dist/model/demo.js +2 -1
  59. package/dist/model/demo.js.map +1 -1
  60. package/dist/model/elevation.d.ts +1 -1
  61. package/dist/model/elevation.js +3 -3
  62. package/dist/model/elevation.js.map +1 -1
  63. package/dist/model/geom.d.ts +2 -0
  64. package/dist/model/geom.js +11 -0
  65. package/dist/model/geom.js.map +1 -1
  66. package/dist/model/history.js +4 -1
  67. package/dist/model/history.js.map +1 -1
  68. package/dist/model/links.d.ts +10 -2
  69. package/dist/model/links.js +15 -3
  70. package/dist/model/links.js.map +1 -1
  71. package/dist/model/measurement.d.ts +2 -2
  72. package/dist/model/measurement.js +3 -3
  73. package/dist/model/measurement.js.map +1 -1
  74. package/dist/model/openings.d.ts +10 -0
  75. package/dist/model/openings.js +18 -0
  76. package/dist/model/openings.js.map +1 -1
  77. package/dist/model/planGeom.d.ts +37 -2
  78. package/dist/model/planGeom.js +72 -9
  79. package/dist/model/planGeom.js.map +1 -1
  80. package/dist/model/project.js +5 -2
  81. package/dist/model/project.js.map +1 -1
  82. package/dist/model/rooms.d.ts +18 -5
  83. package/dist/model/rooms.js +178 -73
  84. package/dist/model/rooms.js.map +1 -1
  85. package/dist/model/scale.d.ts +30 -0
  86. package/dist/model/scale.js +123 -0
  87. package/dist/model/scale.js.map +1 -0
  88. package/dist/model/settings.d.ts +0 -1
  89. package/dist/model/settings.js +1 -1
  90. package/dist/model/settings.js.map +1 -1
  91. package/dist/model/sketch.d.ts +26 -2
  92. package/dist/model/sketch.js +77 -22
  93. package/dist/model/sketch.js.map +1 -1
  94. package/dist/model/stroke.js +2 -2
  95. package/dist/model/trim.d.ts +54 -0
  96. package/dist/model/trim.js +219 -0
  97. package/dist/model/trim.js.map +1 -0
  98. package/dist/model/types.d.ts +62 -9
  99. package/dist/react/BottomBar.d.ts +2 -1
  100. package/dist/react/BottomBar.js +144 -46
  101. package/dist/react/BottomBar.js.map +1 -1
  102. package/dist/react/CadEditor.js +18 -9
  103. package/dist/react/CadEditor.js.map +1 -1
  104. package/dist/react/Drawer.js +6 -4
  105. package/dist/react/Drawer.js.map +1 -1
  106. package/dist/react/Duck.js.map +1 -1
  107. package/dist/react/KeypadSheet.js.map +1 -1
  108. package/dist/react/MarkupPanel.js +1 -1
  109. package/dist/react/PlanCanvas.native.js +54 -7
  110. package/dist/react/PlanCanvas.native.js.map +1 -1
  111. package/dist/react/PlanCanvas.web.js +17 -5
  112. package/dist/react/PlanCanvas.web.js.map +1 -1
  113. package/dist/react/Popovers.js +14 -3
  114. package/dist/react/Popovers.js.map +1 -1
  115. package/dist/react/Rail.js +1 -1
  116. package/dist/react/ShapeMenu.js +3 -2
  117. package/dist/react/ShapeMenu.js.map +1 -1
  118. package/dist/react/Sheet.d.ts +2 -2
  119. package/dist/react/Sheet.js.map +1 -1
  120. package/dist/react/ToolTip.js +3 -2
  121. package/dist/react/ToolTip.js.map +1 -1
  122. package/dist/react/TopBar.js +4 -3
  123. package/dist/react/TopBar.js.map +1 -1
  124. package/dist/react/barScroll.d.ts +23 -0
  125. package/dist/react/barScroll.js +47 -0
  126. package/dist/react/barScroll.js.map +1 -0
  127. package/dist/react/corners.d.ts +6 -2
  128. package/dist/react/corners.js.map +1 -1
  129. package/dist/react/editorBox.d.ts +8 -0
  130. package/dist/react/editorBox.js +10 -0
  131. package/dist/react/editorBox.js.map +1 -0
  132. package/dist/react/host.d.ts +1 -1
  133. package/dist/react/host.js +1 -1
  134. package/dist/react/host.js.map +1 -1
  135. package/dist/react/motion.d.ts +1 -1
  136. package/dist/react/motion.js +1 -1
  137. package/dist/react/motion.js.map +1 -1
  138. package/dist/react/pageLock.native.d.ts +2 -0
  139. package/dist/react/pageLock.native.js +2 -0
  140. package/dist/react/pageLock.native.js.map +1 -1
  141. package/dist/react/pageLock.web.d.ts +6 -0
  142. package/dist/react/pageLock.web.js +12 -3
  143. package/dist/react/pageLock.web.js.map +1 -1
  144. package/dist/react/ports.js +8 -3
  145. package/dist/react/ports.js.map +1 -1
  146. package/dist/react/saving.d.ts +7 -1
  147. package/dist/react/saving.js +10 -2
  148. package/dist/react/saving.js.map +1 -1
  149. package/dist/react/store.d.ts +5 -2
  150. package/dist/react/store.js +4 -1
  151. package/dist/react/store.js.map +1 -1
  152. package/dist/render/draw.d.ts +21 -4
  153. package/dist/render/draw.js +203 -151
  154. package/dist/render/draw.js.map +1 -1
  155. package/dist/render/elevation.js +3 -3
  156. package/dist/render/elevation.js.map +1 -1
  157. package/dist/render/figmaIcons.d.ts +6 -0
  158. package/dist/render/figmaIcons.js +16 -1
  159. package/dist/render/figmaIcons.js.map +1 -1
  160. package/dist/render/hit.d.ts +8 -1
  161. package/dist/render/hit.js +23 -4
  162. package/dist/render/hit.js.map +1 -1
  163. package/dist/render/icons.js +27 -20
  164. package/dist/render/icons.js.map +1 -1
  165. package/dist/render/lens.d.ts +27 -0
  166. package/dist/render/lens.js +41 -0
  167. package/dist/render/lens.js.map +1 -0
  168. package/dist/render/linkTile.d.ts +20 -2
  169. package/dist/render/linkTile.js +476 -246
  170. package/dist/render/linkTile.js.map +1 -1
  171. package/dist/render/snap.d.ts +10 -1
  172. package/dist/render/snap.js +87 -15
  173. package/dist/render/snap.js.map +1 -1
  174. package/dist/render/svgPath.d.ts +29 -0
  175. package/dist/render/svgPath.js +114 -0
  176. package/dist/render/svgPath.js.map +1 -0
  177. package/dist/render/tileIcons.d.ts +18 -0
  178. package/dist/render/tileIcons.js +67 -0
  179. package/dist/render/tileIcons.js.map +1 -0
  180. package/dist/render/view.d.ts +18 -1
  181. package/dist/render/view.js +38 -6
  182. package/dist/render/view.js.map +1 -1
  183. package/dist/skia/SkiaDrawCtx.d.ts +8 -0
  184. package/dist/skia/SkiaDrawCtx.js +27 -5
  185. package/dist/skia/SkiaDrawCtx.js.map +1 -1
  186. package/dist/solver/equations.d.ts +6 -0
  187. package/dist/solver/equations.js +53 -22
  188. package/dist/solver/equations.js.map +1 -1
  189. package/dist/solver/gauss-newton.js +6 -1
  190. package/dist/solver/gauss-newton.js.map +1 -1
  191. package/dist/tools/annotate.d.ts +0 -2
  192. package/dist/tools/annotate.js +1 -22
  193. package/dist/tools/annotate.js.map +1 -1
  194. package/dist/tools/chamfer.js +4 -0
  195. package/dist/tools/chamfer.js.map +1 -1
  196. package/dist/tools/dim.d.ts +3 -3
  197. package/dist/tools/dim.js +26 -65
  198. package/dist/tools/dim.js.map +1 -1
  199. package/dist/tools/fillet.js +4 -0
  200. package/dist/tools/fillet.js.map +1 -1
  201. package/dist/tools/freehand.js +1 -4
  202. package/dist/tools/freehand.js.map +1 -1
  203. package/dist/tools/line.js +15 -11
  204. package/dist/tools/line.js.map +1 -1
  205. package/dist/tools/modify.d.ts +32 -4
  206. package/dist/tools/modify.js +253 -98
  207. package/dist/tools/modify.js.map +1 -1
  208. package/dist/tools/registry.d.ts +7 -0
  209. package/dist/tools/registry.js +14 -1
  210. package/dist/tools/registry.js.map +1 -1
  211. package/dist/tools/select.d.ts +30 -8
  212. package/dist/tools/select.js +165 -34
  213. package/dist/tools/select.js.map +1 -1
  214. package/dist/tools/shapes.d.ts +1 -1
  215. package/dist/tools/shapes.js +12 -5
  216. package/dist/tools/shapes.js.map +1 -1
  217. package/dist/view3d/build.js +9 -8
  218. package/dist/view3d/build.js.map +1 -1
  219. package/package.json +9 -9
  220. package/src/app/edit.ts +25 -1
  221. package/src/app/state.ts +6 -8
  222. package/src/data/sync.ts +7 -2
  223. package/src/editor/actions.ts +213 -122
  224. package/src/editor/elevation.ts +13 -16
  225. package/src/editor/gestures.ts +83 -13
  226. package/src/editor/keys.ts +3 -2
  227. package/src/editor/laser.ts +7 -4
  228. package/src/editor/linkActions.ts +169 -31
  229. package/src/editor/links.ts +17 -1
  230. package/src/editor/mode.ts +8 -5
  231. package/src/editor/project.ts +1 -2
  232. package/src/editor/scaleGate.ts +32 -0
  233. package/src/editor/selection.ts +13 -7
  234. package/src/editor/tooltips.ts +9 -0
  235. package/src/editor/view3d.ts +6 -2
  236. package/src/export/pdf.ts +7 -4
  237. package/src/export/plan.ts +14 -10
  238. package/src/index.ts +1 -0
  239. package/src/model/constraints.ts +1 -0
  240. package/src/model/demo.ts +2 -1
  241. package/src/model/elevation.ts +4 -4
  242. package/src/model/geom.ts +10 -0
  243. package/src/model/history.ts +4 -1
  244. package/src/model/links.ts +14 -3
  245. package/src/model/measurement.ts +3 -3
  246. package/src/model/openings.ts +18 -0
  247. package/src/model/planGeom.ts +70 -10
  248. package/src/model/project.ts +6 -2
  249. package/src/model/rooms.ts +151 -63
  250. package/src/model/scale.ts +107 -0
  251. package/src/model/settings.ts +1 -2
  252. package/src/model/sketch.ts +62 -11
  253. package/src/model/stroke.ts +2 -2
  254. package/src/model/trim.ts +188 -0
  255. package/src/model/types.ts +57 -9
  256. package/src/react/BottomBar.tsx +177 -52
  257. package/src/react/CadEditor.tsx +19 -9
  258. package/src/react/Drawer.tsx +17 -12
  259. package/src/react/Duck.tsx +3 -3
  260. package/src/react/KeypadSheet.tsx +2 -2
  261. package/src/react/MarkupPanel.tsx +1 -1
  262. package/src/react/PlanCanvas.native.tsx +60 -6
  263. package/src/react/PlanCanvas.web.tsx +17 -5
  264. package/src/react/Popovers.tsx +24 -9
  265. package/src/react/Rail.tsx +1 -1
  266. package/src/react/ShapeMenu.tsx +3 -2
  267. package/src/react/Sheet.tsx +3 -3
  268. package/src/react/ToolTip.tsx +3 -2
  269. package/src/react/TopBar.tsx +4 -3
  270. package/src/react/barScroll.ts +57 -0
  271. package/src/react/corners.ts +6 -3
  272. package/src/react/editorBox.ts +20 -0
  273. package/src/react/host.ts +1 -1
  274. package/src/react/motion.tsx +6 -6
  275. package/src/react/pageLock.native.ts +2 -0
  276. package/src/react/pageLock.web.ts +12 -3
  277. package/src/react/ports.ts +7 -2
  278. package/src/react/saving.ts +10 -2
  279. package/src/react/store.ts +5 -2
  280. package/src/render/draw.ts +169 -118
  281. package/src/render/elevation.ts +5 -4
  282. package/src/render/figmaIcons.ts +17 -1
  283. package/src/render/hit.ts +21 -4
  284. package/src/render/icons.ts +27 -20
  285. package/src/render/lens.ts +52 -0
  286. package/src/render/linkTile.ts +436 -190
  287. package/src/render/snap.ts +87 -17
  288. package/src/render/svgPath.ts +95 -0
  289. package/src/render/tileIcons.ts +75 -0
  290. package/src/render/view.ts +43 -7
  291. package/src/skia/SkiaDrawCtx.ts +26 -4
  292. package/src/solver/equations.ts +52 -22
  293. package/src/solver/gauss-newton.ts +4 -1
  294. package/src/styles.css +3 -2
  295. package/src/tools/annotate.ts +1 -18
  296. package/src/tools/chamfer.ts +3 -0
  297. package/src/tools/dim.ts +26 -52
  298. package/src/tools/fillet.ts +3 -0
  299. package/src/tools/freehand.ts +1 -3
  300. package/src/tools/line.ts +12 -11
  301. package/src/tools/modify.ts +210 -70
  302. package/src/tools/registry.ts +18 -1
  303. package/src/tools/select.ts +144 -36
  304. package/src/tools/shapes.ts +9 -4
  305. package/src/ui/ctx.ts +4 -3
  306. package/src/ui/drawer.ts +8 -2
  307. package/src/view3d/build.ts +11 -10
  308. package/dist/react/LaserTray.d.ts +0 -4
  309. package/dist/react/LaserTray.js +0 -26
  310. package/dist/react/LaserTray.js.map +0 -1
  311. package/src/react/LaserTray.tsx +0 -42
@@ -2,14 +2,13 @@ import { afterEdit, analyze, tryAddConstraint } from '../app/edit';
2
2
  import { ed } from '../app/state';
3
3
  import { hyp, norm2 } from '../model/geom';
4
4
  import { pushHistory } from '../model/history';
5
- import { roomGeom, maybeRoom } from '../model/rooms';
6
5
  import { settings } from '../model/settings';
7
6
  import { addLine, gc, pinnedPoints } from '../model/sketch';
8
- import { SK, store } from '../model/store';
7
+ import { isUnscaled, setScale } from '../model/scale';
8
+ import { page, SK, store } from '../model/store';
9
9
  import { TH } from '../render/theme';
10
10
  import { shiftSnap, snap45, snapAt } from '../render/snap';
11
11
  import { requestDraw, requestOverlayDraw, S } from '../render/view';
12
- import { fmtArea } from '../units';
13
12
  import { commitPoint, applyPending, lengthPreview, PT, rememberHover, wallBand } from './registry';
14
13
  import { openKeypad, toast, updateCtx, updateHint } from '../editor/ports';
15
14
  import { intoWall, PAST_WALL } from '../editor/elevation';
@@ -166,14 +165,10 @@ export function makeLineTool() {
166
165
  st.start = b.id;
167
166
  pinnedPoints.clear();
168
167
  pinnedPoints.add(b.id);
169
- if (closed) {
170
- const loop = st.chain.slice(0, -1);
171
- const sk = SK();
172
- const rid = kindNow() === 'wall' || !ed.drawConstr ? maybeRoom(sk, loop) : null;
168
+ // a closed shape is only a shape: it's made a space by the Space tool, when the person picks it (the user's call,
169
+ // 2026-10-26: "By default i dont want spaces create at all")
170
+ if (closed)
173
171
  this.reset();
174
- if (rid)
175
- toast(sk.rooms[rid].name + ' added — ' + fmtArea(roomGeom(sk, sk.rooms[rid]).area));
176
- }
177
172
  },
178
173
  typeLength(initial) {
179
174
  const st = this.st;
@@ -181,6 +176,8 @@ export function makeLineTool() {
181
176
  return;
182
177
  const dirs = [['→', [1, 0]], ['←', [-1, 0]], ['↑', [0, 1]], ['↓', [0, -1]]];
183
178
  let dir = st.dir || [1, 0];
179
+ // how long the segment is drawn so far (to the pointer: nothing, on a touch screen, after a tap)
180
+ const from = PT(st.start), drawn = ed.snapState ? hyp(ed.snapState.x - from.x, ed.snapState.y - from.y) : 0;
184
181
  openKeypad({
185
182
  title: 'Segment length', sub: 'Direction sets where it goes', initial: initial || '',
186
183
  extras: () => dirs.map(([label, d]) => ({
@@ -192,13 +189,20 @@ export function makeLineTool() {
192
189
  onDone: v => {
193
190
  if (v <= 0)
194
191
  return;
192
+ pushHistory();
193
+ // the drawing's first length: the sketch is scaled so the segment, as drawn, is that long — as it is, when
194
+ // nothing was drawn to go by (model/scale.ts). Before it's read where the segment starts: that moves too.
195
+ const pg = page();
196
+ if (isUnscaled(pg.sk) && SK() === pg.sk) {
197
+ setScale(pg, drawn > 1e-6 ? v / drawn : 1);
198
+ requestDraw();
199
+ }
195
200
  const a = PT(st.start);
196
201
  const guides = [];
197
202
  if (Math.abs(dir[1]) < 1e-9)
198
203
  guides.push({ kind: 'H', from: st.start });
199
204
  else if (Math.abs(dir[0]) < 1e-9)
200
205
  guides.push({ kind: 'V', from: st.start });
201
- pushHistory();
202
206
  this.segmentTo({ x: a.x + dir[0] * v, y: a.y + dir[1] * v, kind: 'free', guides }, v);
203
207
  afterEdit();
204
208
  },
@@ -1 +1 @@
1
- {"version":3,"file":"line.js","sourceRoot":"","sources":["../../src/tools/line.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,EAAE,EAAyB,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAuB,MAAM,YAAY,CAAC;AACxH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAoB5C;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,GAAa,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,CAAC,GAAqB,EAAa,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3I,MAAM,CAAC,GAAG;QACR,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjB,KAAK;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YACrC,IAAI,GAAG;gBAAE,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChD,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC;YAAC,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC;YACvC,oGAAoG;YACpG,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAAC,OAAO,EAAE,CAAC;gBAAC,WAAW,EAAE,CAAC;YAAC,CAAC;YACjE,SAAS,EAAE,CAAC;YAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,EAAO,IAAI,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1F,0FAA0F;QAC1F,EAAE,CAAC,EAAO;YACR,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC/F,IAAI,CAAC,EAAE,CAAC,KAAK;gBAAE,OAAO,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK;gBAAE,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,IAAI,IAAI,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAAC,CAAC;YAC7F,OAAO,CAAC,CAAC;QACX,CAAC;QACD,uGAAuG;QACvG,QAAQ,CAAC,EAAO;YACd,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QACzG,CAAC;QACD,KAAK,CAAC,EAAO,IAAI,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAC5J,+GAA+G;QAC/G,UAAU,CAAC,IAAI,GAAgB,IAAI;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;gBAAC,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC;gBAAC,OAAO;YAAC,CAAC;YACzE,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC7G,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;gBAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,OAAO,EAAE,KAAK,MAAM,CAAC;gBACxF,IAAI,IAAI;oBAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAAC,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC;gBAC7B,CAAC,CAAC,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC;gBAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;gBACzC,IAAI,EAAE,CAAC,UAAU,IAAI,CAAC,IAAI;oBAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAClD,CAAC,CAAC,SAAS,EAAE,CAAC;gBAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBAAC,CAAC,CAAC,MAAM,EAAE,CAAC;gBAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC3E,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,EAAO;YACV,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,EAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjC,EAAE,CAAC,EAAO;YACR,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;YAC9E,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,IAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;gBACtI,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC1B,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACrB,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpD,uGAAuG;gBACvG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;gBACZ,YAAY,CAAC,KAAK,EAAE,CAAC;gBAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC7C,IAAI,OAAO;oBAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzC,SAAS,EAAE,CAAC;gBAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAAC,SAAS,EAAE,CAAC;gBAAC,UAAU,EAAE,CAAC;gBACvD,OAAO;YACT,CAAC;YACD,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACtB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACxE,WAAW,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAAC,SAAS,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK;gBAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,SAAS,CAAC,CAAO,EAAE,QAAiB;YAClC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAM,CAAC,CAAC;YACxB,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;gBAAE,OAAO;YAC7C,gFAAgF;YAChF,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;gBAAC,KAAK,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACzG,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK;gBAAE,OAAO;YAC9B,sEAAsE;YACtE,MAAM,IAAI,GAAG,OAAO,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,KAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;YACjH,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrB,mEAAmE;YACnE,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAC5B,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;oBAC/B,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG;wBAAE,gBAAgB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;yBACrF,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG;wBAAE,gBAAgB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;yBAC1F,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,IAAI;wBAAE,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpH,CAAC;YACH,CAAC;YACD,IAAI,QAAQ,IAAI,IAAI;gBAAE,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,KAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACjK,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YACzD,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAAC,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC;YAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACpD,YAAY,CAAC,KAAK,EAAE,CAAC;YAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,OAAO,EAAE,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,IAAI,GAAG;oBAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;QACD,UAAU,CAAC,OAAe;YACxB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,CAAC,KAAK;gBAAE,OAAO;YACtB,MAAM,IAAI,GAAiC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1G,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,UAAU,CAAC;gBACT,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,8BAA8B,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;gBACpF,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtC,KAAK;oBACL,SAAS,EAAE,YAAY,GAAG,KAAK;oBAC/B,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;oBACpE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC5B,CAAC,CAAC;gBACH,MAAM,EAAE,CAAC,CAAC,EAAE;oBACV,IAAI,CAAC,IAAI,CAAC;wBAAE,OAAO;oBACnB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAM,CAAC,CAAC;oBACxB,MAAM,MAAM,GAAY,EAAE,CAAC;oBAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,KAAM,EAAE,CAAC,CAAC;yBACpE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,KAAM,EAAE,CAAC,CAAC;oBAC9E,WAAW,EAAE,CAAC;oBACd,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;oBACtF,SAAS,EAAE,CAAC;gBACd,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACzC,UAAU;YACR,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YAC7C,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACvB,WAAW,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAC7E,SAAS,EAAE,CAAC;QACd,CAAC;QACD,GAAG,CAAC,CAAQ;YACV,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YACxF,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI;YACF,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,0FAA0F,CAAC,CAAC,CAAC,iHAAiH,CAAC;YAC/P,OAAO,OAAO,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,gFAAgF,CAAC,CAAC,CAAC,kEAAkE,CAAC;QACtL,CAAC;KACF,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"line.js","sourceRoot":"","sources":["../../src/tools/line.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,42 @@
1
- import type { Sketch } from '../model/types';
1
+ import { type TrimItem, type TrimPiece } from '../model/trim';
2
+ import type { Sketch, XY } from '../model/types';
2
3
  import type { PEv } from './registry';
4
+ /** A piece a tap or a stroke took: where on what it's of (in the drawing), and the piece then. */
5
+ interface TrimMark {
6
+ at: XY;
7
+ pc: TrimPiece;
8
+ key: string;
9
+ }
3
10
  export declare const trimTool: {
11
+ st: {
12
+ down: XY | null;
13
+ last: XY | null;
14
+ stroke: boolean;
15
+ marks: TrimMark[];
16
+ };
4
17
  reset(): void;
5
- hover: (ev: PEv) => void;
18
+ show(marks: TrimMark[]): void;
19
+ hover(ev: PEv): void;
6
20
  down(ev: PEv): void;
7
21
  move(ev: PEv): void;
8
22
  up(ev: PEv): void;
9
23
  hint(): string;
10
24
  };
11
- /** Cut a line back to the nearest crossings around (wx, wy). Unlike SolveSpace, constraints carry over. */
12
- export declare function trimLine(lid: string, wx: number, wy: number): void;
25
+ /**
26
+ * Cut away a tap's or a stroke's pieces, as one undo step. Each is found again as it's cut — on what it was of, or on a
27
+ * piece an earlier cut split off — so cutting one doesn't upset the next. If the drawing can't solve after, it's put
28
+ * back as it was and says so.
29
+ */
30
+ export declare function trimMarks(marks: TrimMark[]): void;
31
+ /**
32
+ * Cut piece `pc` away. A line or wall is shortened from an end, or split in two around a middle piece that goes (the
33
+ * two kept in line); an arc the same (the two one circle still); a circle opens into an arc round the rest; with no cut
34
+ * either side, the whole thing goes. Where a cut is a point already there, the new end is that point, so what meets
35
+ * there stays joined; a crossing makes a new point, held on what it crosses. Constraints carry over (product rule 9):
36
+ * a length, a midpoint or Equal on a cut line no longer say what they did and go. Edits the sketch only: the caller
37
+ * pushes history, solves and runs afterEdit. Returns what it made (a split's second piece).
38
+ */
39
+ export declare function trimPiece(sk: Sketch, pc: TrimPiece): TrimItem[];
13
40
  export declare const offsetTool: {
14
41
  reset(): void;
15
42
  hover: (ev: PEv) => void;
@@ -53,3 +80,4 @@ export declare function splitLineAt(sk: Sketch, lid: string, pid: string): strin
53
80
  * three walls meeting at a point do. Lines never split anything, and nothing splits a line. Part of an edit.
54
81
  */
55
82
  export declare function splitWallsAtEnds(sk: Sketch, lid: string): void;
83
+ export {};
@@ -1,143 +1,294 @@
1
- import { afterEdit, holdFaces, solveOrRevert, tryAddConstraint, undo } from '../app/edit';
1
+ import { afterEdit, holdFaces, solveSketch, tryAddConstraint, undo } from '../app/edit';
2
2
  import { ed } from '../app/state';
3
- import { splitFaces } from '../model/faces';
4
- import { clamp, hyp, lineCircleT, norm2, projT, segInter } from '../model/geom';
3
+ import { faceKey, splitFaces } from '../model/faces';
4
+ import { clamp, hyp, norm2, projT } from '../model/geom';
5
5
  import { dropHistory, pushHistory } from '../model/history';
6
6
  import { uid } from '../model/ids';
7
7
  import { findFace, maybeRoom, roomGeom } from '../model/rooms';
8
- import { addLine, addPoint } from '../model/sketch';
9
- import { SK } from '../model/store';
8
+ import { addCons, addLine, addPoint } from '../model/sketch';
9
+ import { replaceSK, SK } from '../model/store';
10
+ import { distTo, nearestOn, pieceAt, pieceKey, pieceShape, trimItemAt } from '../model/trim';
10
11
  import { hitAny } from '../render/hit';
11
12
  import { outsideSide } from '../model/planGeom';
12
- import { mainT, requestDraw, s2w } from '../render/view';
13
+ import { TH } from '../render/theme';
14
+ import { mainT, requestDraw, requestOverlayDraw, S, s2w } from '../render/view';
13
15
  import { placeTargets, snapSlide } from '../editor/elevation';
14
16
  import { fmtArea, fmtLen } from '../units';
15
17
  import { openKeypad, toast } from '../editor/ports';
18
+ import { noScaleYet, waitForScale } from '../editor/scaleGate';
16
19
  /** Hover helper: highlight only geometry of the given types. */
17
20
  const hoverOnly = (types) => (ev) => {
18
21
  const h = hitAny(ev.sx, ev.sy, { touch: ev.touch, only: 'geom' });
19
22
  ed.hover = h && types.includes(h.type) ? h : null;
20
23
  requestDraw();
21
24
  };
25
+ /** How near (inches) a point is to count as on what's trimmed, and cuts to count as one: a couple of pixels. */
26
+ const cutTol = () => Math.min(0.5, 2 / mainT().s);
27
+ /** The piece under screen point (sx, sy). */
28
+ function trimMarkAt(sx, sy, touch) {
29
+ const [x, y] = s2w(sx, sy), sk = SK();
30
+ const it = trimItemAt(sk, { x, y }, (touch ? 20 : 10) / mainT().s);
31
+ if (!it)
32
+ return null;
33
+ // (where on it: found again there as it's cut, on it or on a piece an earlier cut split off)
34
+ const at = nearestOn(sk, it, { x, y }), pc = pieceAt(sk, it, at, cutTol());
35
+ return { at, pc, key: pieceKey(pc) };
36
+ }
37
+ /** What's about to be cut away, drawn over the drawing in red. */
38
+ const trimPreview = (pcs) => (c, T) => {
39
+ const sk = SK();
40
+ c.save();
41
+ c.strokeStyle = TH.red;
42
+ c.lineWidth = 4;
43
+ c.lineCap = 'round';
44
+ c.globalAlpha = 0.85;
45
+ for (const pc of pcs) {
46
+ const g = pieceShape(sk, pc);
47
+ if (!g)
48
+ continue;
49
+ c.beginPath();
50
+ if ('a' in g) {
51
+ const [x1, y1] = S(T, g.a.x, g.a.y), [x2, y2] = S(T, g.b.x, g.b.y);
52
+ c.moveTo(x1, y1);
53
+ c.lineTo(x2, y2);
54
+ }
55
+ else {
56
+ const [x, y] = S(T, g.o.x, g.o.y);
57
+ c.arc(x, y, g.r * T.s, -g.t0, -g.t1, true);
58
+ }
59
+ c.stroke();
60
+ }
61
+ c.restore();
62
+ };
63
+ const freshTrim = () => ({ down: null, last: null, stroke: false, marks: [] });
22
64
  export const trimTool = {
23
- reset() { ed.hover = null; },
24
- hover: hoverOnly(['line', 'circle']),
25
- down(ev) { this.hover(ev); },
26
- move(ev) { this.hover(ev); },
27
- up(ev) {
28
- const h = hitAny(ev.sx, ev.sy, { touch: ev.touch, only: 'geom' });
29
- if (!h)
65
+ st: freshTrim(),
66
+ reset() { this.st = freshTrim(); ed.hover = null; ed.preview = null; requestOverlayDraw(); },
67
+ show(marks) { ed.preview = marks.length ? trimPreview(marks.map(m => m.pc)) : null; requestOverlayDraw(); },
68
+ hover(ev) { const m = trimMarkAt(ev.sx, ev.sy, ev.touch); this.show(m ? [m] : []); },
69
+ down(ev) {
70
+ const m = trimMarkAt(ev.sx, ev.sy, ev.touch);
71
+ this.st = { down: { x: ev.sx, y: ev.sy }, last: { x: ev.sx, y: ev.sy }, stroke: false, marks: m ? [m] : [] };
72
+ this.show(this.st.marks);
73
+ },
74
+ move(ev) {
75
+ const st = this.st;
76
+ if (!st.down) {
77
+ this.hover(ev);
30
78
  return;
31
- const [wx, wy] = s2w(ev.sx, ev.sy);
32
- if (h.type === 'line')
33
- trimLine(h.id, wx, wy);
34
- else if (h.type === 'circle') {
35
- pushHistory();
36
- delete SK().circles[h.id];
37
- afterEdit();
38
79
  }
80
+ if (!st.stroke && hyp(ev.sx - st.down.x, ev.sy - st.down.y) < 12)
81
+ return;
82
+ st.stroke = true;
83
+ // every few pixels of the way since the last move, so a quick stroke doesn't skip a short piece
84
+ const from = st.last, n = Math.max(1, Math.ceil(hyp(ev.sx - from.x, ev.sy - from.y) / 6));
85
+ for (let i = 1; i <= n; i++) {
86
+ const m = trimMarkAt(from.x + ((ev.sx - from.x) * i) / n, from.y + ((ev.sy - from.y) * i) / n, ev.touch);
87
+ if (m && !st.marks.some(k => k.key === m.key))
88
+ st.marks.push(m);
89
+ }
90
+ st.last = { x: ev.sx, y: ev.sy };
91
+ this.show(st.marks);
92
+ },
93
+ up(ev) {
94
+ const st = this.st, tap = trimMarkAt(ev.sx, ev.sy, ev.touch);
95
+ const marks = st.stroke ? st.marks : tap ? [tap] : [];
96
+ this.reset();
97
+ if (marks.length)
98
+ trimMarks(marks);
39
99
  },
40
- hint() { return 'Tap the part of a line to remove. It cuts back to the nearest crossing and keeps the rest constrained.'; },
100
+ hint() { return 'Tap the piece to cut away, or drag across several. Each cuts back to where something crosses or meets it.'; },
41
101
  };
42
- /** Cut a line back to the nearest crossings around (wx, wy). Unlike SolveSpace, constraints carry over. */
43
- export function trimLine(lid, wx, wy) {
44
- const sk = SK(), l = sk.lines[lid];
45
- const A = { ...sk.points[l.a] }, B = { ...sk.points[l.b] };
46
- const tc = projT(A, B, { x: wx, y: wy });
47
- const ts = [];
48
- for (const id in sk.lines) {
49
- if (id === lid)
102
+ /**
103
+ * Cut away a tap's or a stroke's pieces, as one undo step. Each is found again as it's cut — on what it was of, or on a
104
+ * piece an earlier cut split off — so cutting one doesn't upset the next. If the drawing can't solve after, it's put
105
+ * back as it was and says so.
106
+ */
107
+ export function trimMarks(marks) {
108
+ const sk = SK(), was = JSON.stringify(sk), tol = cutTol(), near = 3 * tol;
109
+ pushHistory();
110
+ const made = [];
111
+ let cut = 0, whole = null;
112
+ for (const m of marks) {
113
+ const it = [m.pc.item, ...made].find(c => distTo(sk, c, m.at) <= near);
114
+ if (!it)
50
115
  continue;
51
- const o = sk.lines[id];
52
- const r = segInter(A, B, sk.points[o.a], sk.points[o.b]);
53
- if (r && r.t > 1e-6 && r.t < 1 - 1e-6)
54
- ts.push({ t: r.t, line: id });
116
+ const pc = pieceAt(sk, it, m.at, tol);
117
+ if (!pc.lo && !pc.hi)
118
+ whole = it.kind;
119
+ made.push(...trimPiece(sk, pc));
120
+ cut++;
55
121
  }
56
- for (const id in sk.circles) {
57
- const ci = sk.circles[id];
58
- for (const t of lineCircleT(A, B, sk.points[ci.c], ci.r))
59
- ts.push({ t, circle: id });
122
+ if (!cut) {
123
+ dropHistory();
124
+ return;
60
125
  }
61
- pushHistory();
62
- if (!ts.length) {
63
- delete sk.lines[lid];
126
+ if (!solveSketch().ok) {
127
+ replaceSK(JSON.parse(was));
128
+ dropHistory();
64
129
  afterEdit();
65
- toast('Line removed — nothing crossed it.');
130
+ toast('Can’t trim that — it conflicts with other constraints.', { warn: true });
66
131
  return;
67
132
  }
68
- ts.sort((a, b) => a.t - b.t);
69
- let lo = null, hi = null;
70
- for (const r of ts) {
71
- if (r.t < tc)
72
- lo = r;
73
- else if (!hi)
74
- hi = r;
75
- }
76
- const mk = (r) => {
77
- const id = addPoint(sk, A.x + (B.x - A.x) * r.t, A.y + (B.y - A.y) * r.t);
78
- if (r.line)
79
- tryAddConstraint({ type: 'online', p: id, l: r.line }, { silent: true });
80
- if (r.circle)
81
- tryAddConstraint({ type: 'oncircle', p: id, c: r.circle }, { silent: true });
133
+ afterEdit();
134
+ // (a tap that took a whole thing: nothing crossed it, so there was nothing to cut back to)
135
+ if (marks.length === 1 && whole)
136
+ toast((whole === 'line' ? 'Line' : whole === 'arc' ? 'Arc' : 'Circle') + ' removed — ' + (whole === 'circle' ? 'it takes two crossings to cut a piece out.' : 'nothing crossed it.'));
137
+ }
138
+ /**
139
+ * Cut piece `pc` away. A line or wall is shortened from an end, or split in two around a middle piece that goes (the
140
+ * two kept in line); an arc the same (the two one circle still); a circle opens into an arc round the rest; with no cut
141
+ * either side, the whole thing goes. Where a cut is a point already there, the new end is that point, so what meets
142
+ * there stays joined; a crossing makes a new point, held on what it crosses. Constraints carry over (product rule 9):
143
+ * a length, a midpoint or Equal on a cut line no longer say what they did and go. Edits the sketch only: the caller
144
+ * pushes history, solves and runs afterEdit. Returns what it made (a split's second piece).
145
+ */
146
+ export function trimPiece(sk, pc) {
147
+ const { item, lo, hi } = pc, made = [];
148
+ /** A cut's point: the one there, or a new one, held on what crosses there. */
149
+ const at = (c) => {
150
+ if (c.pt)
151
+ return c.pt;
152
+ const id = addPoint(sk, c.x, c.y);
153
+ if (c.line)
154
+ addCons(sk, { type: 'online', p: id, l: c.line });
155
+ if (c.curve)
156
+ addCons(sk, { type: 'oncircle', p: id, c: c.curve });
82
157
  return id;
83
158
  };
84
- const oldA = l.a, oldB = l.b, L = hyp(B.x - A.x, B.y - A.y);
85
- const isHV = (c) => (c.type === 'h' || c.type === 'v') && ((c.a === oldA && c.b === oldB) || (c.a === oldB && c.b === oldA));
86
- const retarget = (na, nb) => {
159
+ if (item.kind === 'line')
160
+ trimLinePiece(sk, item.id, lo, hi, at, made);
161
+ else if (item.kind === 'arc') {
162
+ const a = sk.arcs[item.id];
163
+ if (!lo && !hi)
164
+ delete sk.arcs[item.id];
165
+ else if (!lo)
166
+ a.a = at(hi);
167
+ else if (!hi)
168
+ a.b = at(lo);
169
+ else {
170
+ const p1 = at(lo), p2 = at(hi), oldB = a.b, nid = uid('ar');
171
+ a.b = p1;
172
+ sk.arcs[nid] = { ...a, a: p2, b: oldB };
173
+ // one circle still; a tangent at its old end goes with the piece that ends there now
174
+ addCons(sk, { type: 'eqr', c1: item.id, c2: nid });
175
+ for (const c of Object.values(sk.cons))
176
+ if (c.type === 'tan' && c.c === item.id) {
177
+ const l = sk.lines[c.l];
178
+ if (l && (l.a === oldB || l.b === oldB))
179
+ c.c = nid;
180
+ }
181
+ made.push({ kind: 'arc', id: nid });
182
+ }
183
+ }
184
+ else {
185
+ const ci = sk.circles[item.id];
186
+ if (!lo || !hi)
187
+ delete sk.circles[item.id];
188
+ else {
189
+ // what's left runs from the cut after the piece round to the one before: an arc, with the circle's id, so what
190
+ // refers to it (its size, a tangent, Concentric) refers to the arc
191
+ const { c, constr, kind, thick } = ci, a = at(hi), b = at(lo);
192
+ delete sk.circles[item.id];
193
+ sk.arcs[item.id] = { c, a, b, ...(constr ? { constr } : {}), ...(kind ? { kind } : {}), ...(thick ? { thick } : {}) };
194
+ }
195
+ }
196
+ // a point held on a line or an arc that's that line's or arc's end now: an end is on it already
197
+ const ids = new Set([item.id, ...made.map(m => m.id)]);
198
+ for (const id in sk.cons) {
199
+ const c = sk.cons[id], l = c.l ? sk.lines[c.l] : undefined, a = c.c ? sk.arcs[c.c] : undefined;
200
+ if (c.type === 'online' && !c.face && l && ids.has(c.l) && (l.a === c.p || l.b === c.p))
201
+ delete sk.cons[id];
202
+ else if (c.type === 'oncircle' && a && ids.has(c.c) && (a.a === c.p || a.b === c.p))
203
+ delete sk.cons[id];
204
+ }
205
+ return made;
206
+ }
207
+ function trimLinePiece(sk, lid, lo, hi, at, made) {
208
+ const l = sk.lines[lid];
209
+ if (!lo && !hi) {
210
+ delete sk.lines[lid];
211
+ return;
212
+ }
213
+ const A = sk.points[l.a], B = sk.points[l.b], L = hyp(B.x - A.x, B.y - A.y), oldA = l.a, oldB = l.b;
214
+ // its length, its middle, Equal to another: they no longer say what they did
215
+ for (const id in sk.cons) {
216
+ const c = sk.cons[id];
217
+ if ((c.type === 'dist' && c.line === lid) || (c.type === 'mid' && c.l === lid) || (c.type === 'eq' && (c.l1 === lid || c.l2 === lid)))
218
+ delete sk.cons[id];
219
+ }
220
+ if (lo && hi) {
221
+ // a middle piece: split at both cuts (splitLineAt carries constraints, spaces, doors and windows, and what's on its
222
+ // faces) and the piece between goes; the two left stay in line
223
+ const p1 = at(lo), p2 = at(hi), mid = splitLineAt(sk, lid, p1), rest = mid && splitLineAt(sk, mid, p2);
224
+ if (!mid || !rest)
225
+ return;
226
+ delete sk.lines[mid];
87
227
  for (const id in sk.cons) {
88
228
  const c = sk.cons[id];
89
- if (isHV(c)) {
90
- c.a = na;
91
- c.b = nb;
92
- }
93
- if (c.type === 'dist' && c.line === lid)
94
- delete sk.cons[id];
95
- if (c.type === 'mid' && c.l === lid)
229
+ const across = (c.type === 'h' || c.type === 'v') && ((c.a === p1 && c.b === p2) || (c.a === p2 && c.b === p1));
230
+ if (across || (c.type === 'online' && c.p === p2 && c.l === lid))
96
231
  delete sk.cons[id];
97
232
  }
98
- };
233
+ addCons(sk, { type: 'col', l1: lid, l2: rest });
234
+ made.push({ kind: 'line', id: rest });
235
+ return;
236
+ }
237
+ const hv = (c) => (c.type === 'h' || c.type === 'v') && ((c.a === oldA && c.b === oldB) || (c.a === oldB && c.b === oldA));
99
238
  if (!lo) {
100
- const p = mk(hi);
239
+ // from its start: it starts at the cut now, and what's measured from its start is measured from there
240
+ const p = at(hi), s = hi.at * L;
101
241
  l.a = p;
102
- retarget(p, oldB);
242
+ for (const c of Object.values(sk.cons))
243
+ if (hv(c)) {
244
+ c.a = p;
245
+ c.b = oldB;
246
+ }
103
247
  for (const id in sk.openings) {
104
248
  const o = sk.openings[id];
105
- if (o.line === lid)
106
- o.at -= hi.t * L;
249
+ if (o.line !== lid)
250
+ continue;
251
+ if (o.at < s)
252
+ delete sk.openings[id];
253
+ else
254
+ o.at -= s;
107
255
  }
108
- }
109
- else if (!hi) {
110
- const p = mk(lo);
111
- l.b = p;
112
- retarget(oldA, p);
256
+ shiftWallFace(sk, lid, -1, -s);
257
+ for (const side of [1, -1])
258
+ for (const e of sk.elev?.[lid + '|' + side] ?? []) {
259
+ e.a[0] -= s;
260
+ e.b[0] -= s;
261
+ }
113
262
  }
114
263
  else {
115
- const p1 = mk(lo), p2 = mk(hi);
116
- l.b = p1;
117
- const nid = addLine(sk, p2, oldB, { kind: l.kind, constr: l.constr, thick: l.thick });
118
- const copies = [];
119
- for (const id in sk.cons) {
120
- const c = sk.cons[id];
121
- if ((c.type === 'par' || c.type === 'perp' || c.type === 'col') && (c.l1 === lid || c.l2 === lid))
122
- copies.push(Object.assign({}, c, c.l1 === lid ? { l1: nid } : { l2: nid }));
123
- if (isHV(c))
124
- copies.push({ type: c.type, a: p2, b: oldB });
125
- }
126
- retarget(oldA, p1);
127
- for (const c of copies)
128
- tryAddConstraint(c, { silent: true });
129
- tryAddConstraint({ type: 'online', p: p2, l: lid }, { silent: true });
130
- tryAddConstraint({ type: 'par', l1: lid, l2: nid }, { silent: true });
264
+ // to its end: it ends at the cut now
265
+ const p = at(lo), s = lo.at * L;
266
+ l.b = p;
267
+ for (const c of Object.values(sk.cons))
268
+ if (hv(c)) {
269
+ c.a = oldA;
270
+ c.b = p;
271
+ }
131
272
  for (const id in sk.openings) {
132
273
  const o = sk.openings[id];
133
- if (o.line === lid && o.at > hi.t * L) {
134
- o.line = nid;
135
- o.at -= hi.t * L;
136
- }
274
+ if (o.line === lid && o.at > s)
275
+ delete sk.openings[id];
137
276
  }
277
+ shiftWallFace(sk, lid, 1, s - L);
138
278
  }
139
- solveOrRevert();
140
- afterEdit();
279
+ }
280
+ /**
281
+ * What's drawn on one face of wall `lid`, moved across it by dx: the face's x runs from the wall's start seen from side
282
+ * −1, and from its end seen from side 1 (see splitFaces), so a trim moving that end moves it.
283
+ */
284
+ function shiftWallFace(sk, lid, side, dx) {
285
+ const face = sk.faces?.[faceKey(lid, side)];
286
+ if (!face || !dx)
287
+ return;
288
+ delete face.wall; // (its corners are recounted at its next placing)
289
+ for (const p of Object.values(face.points))
290
+ if (!p.anchor)
291
+ p.x += dx;
141
292
  }
142
293
  export const offsetTool = {
143
294
  reset() { ed.hover = null; },
@@ -156,6 +307,9 @@ export const offsetTool = {
156
307
  hint() { return 'Tap a line on the side you want the copy. Then type the distance.'; },
157
308
  };
158
309
  export function offsetPrompt(lid, side) {
310
+ // (a distance typed is real: nothing drawn says what it is in a sketch without its scale yet — editor/scaleGate.ts)
311
+ if (waitForScale())
312
+ return;
159
313
  ed.sel = [{ type: 'line', id: lid }];
160
314
  requestDraw();
161
315
  openKeypad({ title: 'Offset distance', sub: 'Copies the line, kept parallel', initial: '', onDone: v => { if (!v)
@@ -242,7 +396,8 @@ export const roomTool = {
242
396
  }
243
397
  ed.sel = [];
244
398
  afterEdit();
245
- toast(sk.rooms[id].name + ' — ' + fmtArea(roomGeom(sk, sk.rooms[id]).area));
399
+ // (its area once the drawing has its scale: before, only a placeholder)
400
+ toast(sk.rooms[id].name + (noScaleYet() ? '' : ' — ' + fmtArea(roomGeom(sk, sk.rooms[id]).area)));
246
401
  },
247
402
  hint() { return 'Tap inside a closed shape to make a space. Area is measured to the inside face of walls.'; },
248
403
  };