@pascal-app/editor 1.1.0 → 1.1.2

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 (262) hide show
  1. package/package.json +9 -15
  2. package/src/components/editor/action-menu-button.tsx +1 -1
  3. package/src/components/editor/alignment-3d-guide-layer.tsx +1 -1
  4. package/src/components/editor/custom-camera-controls.tsx +11 -11
  5. package/src/components/editor/editor-layout-v2.tsx +1 -1
  6. package/src/components/editor/elevation-3d-guide-layer.tsx +1 -1
  7. package/src/components/editor/first-person-controls.tsx +20 -1981
  8. package/src/components/editor/floating-action-menu.tsx +1 -1
  9. package/src/components/editor/floating-building-action-menu.tsx +1 -1
  10. package/src/components/editor/floor-region-controls.tsx +6 -2
  11. package/src/components/editor/floorplan-navigation-presentation.test.ts +0 -40
  12. package/src/components/editor/floorplan-navigation-presentation.ts +0 -66
  13. package/src/components/editor/floorplan-panel.tsx +26 -22
  14. package/src/components/editor/floorplan-wall-typing-keys.ts +1 -1
  15. package/src/components/editor/follow-pascal.test.tsx +1 -2
  16. package/src/components/editor/follow-pascal.tsx +1 -1
  17. package/src/components/editor/footprint-height-handle.tsx +1 -1
  18. package/src/components/editor/group-actions.ts +1 -2
  19. package/src/components/editor/group-floating-action-menu.tsx +1 -1
  20. package/src/components/editor/group-move-3d.ts +1 -2
  21. package/src/components/editor/group-rotate-handle.tsx +1 -2
  22. package/src/components/editor/handles/use-handle-drag.ts +1 -2
  23. package/src/components/editor/index.tsx +24 -14
  24. package/src/components/editor/inspector-extension-actions.tsx +1 -1
  25. package/src/components/editor/node-arrow-handles.tsx +1 -1
  26. package/src/components/editor/open-wall-ends-3d-layer.tsx +1 -1
  27. package/src/components/editor/opening-guides-3d-layer.tsx +1 -1
  28. package/src/components/editor/room-controls.tsx +7 -4
  29. package/src/components/editor/room-handles-2d.tsx +2 -3
  30. package/src/components/editor/room-handles.tsx +1 -2
  31. package/src/components/editor/room-highlight.tsx +6 -105
  32. package/src/components/editor/room-labels.test.ts +8 -822
  33. package/src/components/editor/room-labels.tsx +40 -1671
  34. package/src/components/editor/room-webgpu-materials.test.ts +1 -1
  35. package/src/components/editor/selection-manager.tsx +5 -3
  36. package/src/components/editor/site-edge-labels.tsx +1 -1
  37. package/src/components/editor/snapshot-capture-overlay.tsx +2 -5
  38. package/src/components/editor/use-floorplan-background-placement.ts +2 -1
  39. package/src/components/editor/views/plugins-view.tsx +1 -1
  40. package/src/components/editor/views/view-bar.tsx +9 -9
  41. package/src/components/editor/wall-measurement-label.tsx +1 -1
  42. package/src/components/editor/wall-move-side-handles.tsx +1 -1
  43. package/src/components/editor/wall-pull-grip.tsx +2 -2
  44. package/src/components/editor-2d/floorplan-group-move.tsx +2 -3
  45. package/src/components/editor-2d/floorplan-measurement-tool-layer.tsx +1 -1
  46. package/src/components/editor-2d/floorplan-open-wall-ends-layer.tsx +1 -1
  47. package/src/components/editor-2d/floorplan-registry-move-overlay.tsx +1 -2
  48. package/src/components/editor-2d/renderers/floorplan-annotation-layout.test.ts +0 -37
  49. package/src/components/editor-2d/renderers/floorplan-annotation-layout.ts +0 -30
  50. package/src/components/editor-2d/renderers/floorplan-dimension-edit-overlay.tsx +13 -3
  51. package/src/components/editor-2d/renderers/floorplan-placement-preview-layer.tsx +1 -2
  52. package/src/components/editor-2d/renderers/floorplan-registry-layer.test.ts +8 -10
  53. package/src/components/editor-2d/renderers/floorplan-registry-layer.tsx +25 -33
  54. package/src/components/systems/roof/roof-edit-system.tsx +4 -3
  55. package/src/components/tools/distribution/distribution-run-tool.tsx +1 -1
  56. package/src/components/tools/item/placement-history.test.tsx +1 -1
  57. package/src/components/tools/item/use-placement-coordinator.tsx +2 -3
  58. package/src/components/tools/paint-region/wall-paint-region-tool.tsx +6 -2
  59. package/src/components/tools/registry/move-registry-node-tool.tsx +1 -2
  60. package/src/components/tools/shared/cursor-sphere.tsx +1 -1
  61. package/src/components/tools/shared/draft-measurement-label.tsx +1 -1
  62. package/src/components/tools/shared/placement-box.tsx +1 -1
  63. package/src/components/tools/shared/placement-dimension-guides.tsx +1 -1
  64. package/src/components/tools/site/terrain-brush-cursor.tsx +1 -1
  65. package/src/components/ui/action-menu/camera-actions.tsx +2 -2
  66. package/src/components/ui/action-menu/control-modes.tsx +1 -1
  67. package/src/components/ui/action-menu/follow-pascal-pill.tsx +1 -1
  68. package/src/components/ui/action-menu/index.tsx +3 -3
  69. package/src/components/ui/action-menu/measurement-control.tsx +3 -3
  70. package/src/components/ui/action-menu/placement.ts +0 -18
  71. package/src/components/ui/action-menu/point-ask-button.tsx +1 -1
  72. package/src/components/ui/action-menu/view-toggles.tsx +5 -5
  73. package/src/components/ui/controls/finish-swatch.tsx +1 -1
  74. package/src/components/ui/controls/material-paint-panel.tsx +2 -2
  75. package/src/components/ui/controls/scene-material-list.tsx +2 -2
  76. package/src/components/ui/controls/select-control.tsx +1 -1
  77. package/src/components/ui/controls/terrain-sculpt-panel.tsx +1 -1
  78. package/src/components/ui/floating-level-selector.tsx +3 -3
  79. package/src/components/ui/helpers/contextual-helper-panel.tsx +1 -1
  80. package/src/components/ui/helpers/helper-manager.test.tsx +1 -1
  81. package/src/components/ui/helpers/helper-manager.tsx +1 -1
  82. package/src/components/ui/level-duplicate-dialog.tsx +1 -1
  83. package/src/components/ui/node-icon-image.test.tsx +46 -0
  84. package/src/components/ui/node-icon-image.tsx +33 -1
  85. package/src/components/ui/panels/collections/collections-popover.tsx +2 -2
  86. package/src/components/ui/panels/floor-foundation-panel.tsx +2 -2
  87. package/src/components/ui/panels/floor-opening-panel.tsx +4 -4
  88. package/src/components/ui/panels/node-display.ts +1 -1
  89. package/src/components/ui/panels/panel-manager.tsx +1 -1
  90. package/src/components/ui/panels/panel-wrapper.tsx +1 -1
  91. package/src/components/ui/panels/parametric-inspector.tsx +1 -1
  92. package/src/components/ui/panels/room-construction-rows.tsx +6 -6
  93. package/src/components/ui/panels/room-name-options.ts +1 -5
  94. package/src/components/ui/panels/room-panel.tsx +6 -8
  95. package/src/components/ui/primitives/color-dot.tsx +2 -2
  96. package/src/components/ui/primitives/opacity-control.tsx +2 -2
  97. package/src/components/ui/primitives/sidebar.tsx +3 -3
  98. package/src/components/ui/right-stack.tsx +1 -1
  99. package/src/components/ui/sidebar/icon-rail.tsx +1 -1
  100. package/src/components/ui/sidebar/panels/items-panel/function-tree-panel.tsx +1 -1
  101. package/src/components/ui/sidebar/panels/settings-panel/audio-settings-dialog.tsx +2 -2
  102. package/src/components/ui/sidebar/panels/settings-panel/construction-animation-setting.tsx +1 -1
  103. package/src/components/ui/sidebar/panels/settings-panel/index.tsx +2 -2
  104. package/src/components/ui/sidebar/panels/settings-panel/keyboard-shortcuts-dialog.tsx +1 -1
  105. package/src/components/ui/sidebar/panels/settings-panel/load-build-dialog.tsx +1 -1
  106. package/src/components/ui/sidebar/panels/settings-panel/print-export-button.tsx +1 -1
  107. package/src/components/ui/sidebar/panels/site-panel/building-tree-node.tsx +1 -1
  108. package/src/components/ui/sidebar/panels/site-panel/index.tsx +2 -2
  109. package/src/components/ui/sidebar/panels/site-panel/inline-rename-input.tsx +1 -1
  110. package/src/components/ui/sidebar/panels/site-panel/level-tree-node.tsx +1 -1
  111. package/src/components/ui/sidebar/panels/site-panel/roof-tree-node.tsx +46 -7
  112. package/src/components/ui/sidebar/panels/site-panel/tree-node-actions.tsx +1 -1
  113. package/src/components/ui/sidebar/panels/site-panel/tree-node-drag.tsx +14 -5
  114. package/src/components/ui/sidebar/panels/site-panel/unit-tree-node.tsx +2 -2
  115. package/src/components/ui/sidebar/panels/zone-panel/index.tsx +3 -3
  116. package/src/components/ui/sidebar/tab-bar.tsx +1 -1
  117. package/src/components/ui/wall-type/wall-type-editor-dialog.tsx +1 -1
  118. package/src/components/ui/wall-type/wall-type-menu.tsx +1 -1
  119. package/src/components/viewer-overlay.tsx +1 -2
  120. package/src/hooks/use-auto-frame.ts +1 -2
  121. package/src/hooks/use-keyboard.ts +1 -2
  122. package/src/hooks/use-selected-room.ts +5 -7
  123. package/src/i18n/floor-footprint-name.ts +1 -1
  124. package/src/i18n/locales/en/messages.po +180 -182
  125. package/src/i18n/locales/es/messages.po +180 -182
  126. package/src/i18n/locales/fr/messages.po +180 -182
  127. package/src/i18n/locales/ja/messages.po +180 -182
  128. package/src/i18n/locales/zh-CN/messages.po +180 -182
  129. package/src/i18n/locales.test.ts +1 -1
  130. package/src/index.tsx +109 -131
  131. package/src/lib/below-grade.test.tsx +4 -4
  132. package/src/lib/camera-facing.test.ts +1 -1
  133. package/src/lib/camera-facing.ts +2 -3
  134. package/src/lib/editor-level-display.ts +1 -1
  135. package/src/lib/floor-footprints.test.ts +2 -2
  136. package/src/lib/floor-opening-draft.ts +1 -1
  137. package/src/lib/floorplan/annotation-visibility.test.ts +1 -1
  138. package/src/lib/floorplan/annotation-visibility.ts +1 -1
  139. package/src/lib/floorplan/floorplan-export.test.ts +1 -1
  140. package/src/lib/floorplan/floorplan-export.tsx +8 -11
  141. package/src/lib/floorplan/floorplan-extension.ts +4 -157
  142. package/src/lib/floorplan/floorplan-mode.ts +2 -1
  143. package/src/lib/floorplan/floorplan-pdfkit-renderer.test.ts +1 -1
  144. package/src/lib/floorplan/floorplan-pdfkit-renderer.ts +8 -6
  145. package/src/lib/floorplan/floorplan-plugin-install.test.tsx +3 -4
  146. package/src/lib/floorplan/geometry.ts +2 -112
  147. package/src/lib/floorplan/index.ts +0 -9
  148. package/src/lib/floorplan/items.ts +2 -1
  149. package/src/lib/floorplan/schedules.ts +6 -3
  150. package/src/lib/floorplan/sheet-export.ts +7 -3
  151. package/src/lib/floorplan/site-plan/site-parts.ts +7 -1
  152. package/src/lib/floorplan/site-plan/site-plan-layer.tsx +1 -1
  153. package/src/lib/follow-pascal-presentation.ts +1 -1
  154. package/src/lib/glb-export.ts +1 -1
  155. package/src/lib/material-paint.ts +1 -1
  156. package/src/lib/measurements.test.ts +2 -1
  157. package/src/lib/mezzanine-selection.test.ts +1 -1
  158. package/src/lib/paint-region-mode.ts +1 -1
  159. package/src/lib/point-ask/session.ts +1 -2
  160. package/src/lib/roof-duplication.test.ts +100 -0
  161. package/src/lib/roof-duplication.ts +30 -5
  162. package/src/lib/room-handle-drag.ts +2 -12
  163. package/src/lib/room-name-catalog.test.ts +2 -1
  164. package/src/lib/room-name-messages.test.ts +2 -1
  165. package/src/lib/room-name-messages.ts +1 -118
  166. package/src/lib/room-name-storage.test.ts +2 -1
  167. package/src/lib/room-selection-commands.ts +2 -2
  168. package/src/lib/room-selection.test.ts +6 -6
  169. package/src/lib/room-transform-session.ts +1 -2
  170. package/src/lib/room-zone-routing.ts +2 -2
  171. package/src/lib/selection-routing.test.ts +0 -28
  172. package/src/lib/selection-routing.ts +1 -40
  173. package/src/lib/sfx-bus.ts +8 -32
  174. package/src/lib/sfx-player.test.ts +72 -1
  175. package/src/lib/sfx-player.ts +49 -337
  176. package/src/lib/viewer-selection.test.ts +38 -10
  177. package/src/lib/wall-pull.test.ts +1 -1
  178. package/src/lib/wall-pull.ts +1 -27
  179. package/src/store/use-editor.tsx +17 -26
  180. package/src/store/use-floorplan-annotation-visibility.ts +5 -5
  181. package/src/store/use-wall-region-handles-selection.ts +1 -2
  182. package/src/components/editor/__bench__/room-label-placement.bench.ts +0 -108
  183. package/src/components/editor/first-person/build-collider-world.test.ts +0 -596
  184. package/src/components/editor/first-person/build-collider-world.ts +0 -549
  185. package/src/components/editor/first-person/ground-holes.test.ts +0 -128
  186. package/src/components/editor/first-person/ground-holes.ts +0 -130
  187. package/src/components/editor/first-person/mechanism-targets.test.ts +0 -162
  188. package/src/components/editor/first-person/mechanism-targets.ts +0 -88
  189. package/src/components/editor/first-person/terrain-collider.test.ts +0 -132
  190. package/src/components/editor/first-person/terrain-collider.ts +0 -212
  191. package/src/components/editor/floorplan-camera-sync.test.ts +0 -249
  192. package/src/components/editor/floorplan-camera-sync.ts +0 -213
  193. package/src/components/editor/localized-html.tsx +0 -22
  194. package/src/components/editor-2d/renderers/floorplan-dimension-renderer.test.tsx +0 -236
  195. package/src/components/editor-2d/renderers/floorplan-dimension-renderer.tsx +0 -708
  196. package/src/components/editor-2d/renderers/floorplan-geometry-renderer.test.tsx +0 -385
  197. package/src/components/editor-2d/renderers/floorplan-geometry-renderer.tsx +0 -670
  198. package/src/components/editor-2d/renderers/floorplan-label-angle.test.ts +0 -89
  199. package/src/components/editor-2d/renderers/floorplan-label-angle.ts +0 -106
  200. package/src/components/editor-2d/svg-paths.ts +0 -124
  201. package/src/components/ui/action-menu/action-button.tsx +0 -89
  202. package/src/components/ui/action-menu/follow-pascal-toggle.tsx +0 -42
  203. package/src/components/ui/primitives/button.tsx +0 -69
  204. package/src/components/ui/primitives/dropdown-menu.tsx +0 -232
  205. package/src/components/ui/primitives/popover.tsx +0 -42
  206. package/src/components/ui/primitives/switch.tsx +0 -29
  207. package/src/components/ui/primitives/tooltip.tsx +0 -57
  208. package/src/components/ui/scene-loader.tsx +0 -73
  209. package/src/components/viewer/floorplan-compass-button.tsx +0 -67
  210. package/src/components/viewer/floorplan-preview-geometry.test.ts +0 -107
  211. package/src/components/viewer/floorplan-preview-geometry.ts +0 -281
  212. package/src/components/viewer/floorplan-preview-navigation.test.ts +0 -43
  213. package/src/components/viewer/floorplan-preview-navigation.ts +0 -62
  214. package/src/components/viewer/floorplan-preview-visibility.test.ts +0 -35
  215. package/src/components/viewer/floorplan-preview-visibility.ts +0 -19
  216. package/src/components/viewer/floorplan-preview.tsx +0 -1065
  217. package/src/components/viewer/render-settings-menu.tsx +0 -294
  218. package/src/components/viewer/sky-control.tsx +0 -710
  219. package/src/components/viewer/use-viewer-camera-navigation-sync.ts +0 -140
  220. package/src/components/viewer/use-viewer-ui-sounds.test.ts +0 -15
  221. package/src/components/viewer/use-viewer-ui-sounds.ts +0 -46
  222. package/src/components/viewer/viewer-controls-bar.tsx +0 -496
  223. package/src/components/viewer/viewer-hover-label.tsx +0 -42
  224. package/src/components/viewer/viewer-rooms.tsx +0 -248
  225. package/src/components/viewer/viewer-scene-header.tsx +0 -286
  226. package/src/components/viewer/viewer-selection-manager.tsx +0 -124
  227. package/src/components/viewer/viewer-stage-modes.test.ts +0 -38
  228. package/src/components/viewer/viewer-stage-modes.ts +0 -49
  229. package/src/components/viewer/viewer-stage-switcher.tsx +0 -97
  230. package/src/components/viewer/viewer-stage.test.tsx +0 -47
  231. package/src/components/viewer/viewer-stage.tsx +0 -221
  232. package/src/components/walkthrough-hud.tsx +0 -193
  233. package/src/hooks/use-mobile.ts +0 -19
  234. package/src/i18n/level-name.ts +0 -39
  235. package/src/i18n/scene-theme-name.ts +0 -16
  236. package/src/lib/below-grade.ts +0 -133
  237. package/src/lib/camera-pose.test.ts +0 -237
  238. package/src/lib/camera-pose.ts +0 -172
  239. package/src/lib/floorplan/floorplan-extension.test.ts +0 -42
  240. package/src/lib/floorplan/floorplan-readonly.test.ts +0 -47
  241. package/src/lib/floorplan/floorplan-readonly.ts +0 -95
  242. package/src/lib/floorplan/marks.test.ts +0 -213
  243. package/src/lib/floorplan/marks.ts +0 -238
  244. package/src/lib/measurements.ts +0 -8
  245. package/src/lib/node-display-label.ts +0 -37
  246. package/src/lib/room-assembly-overlay.test.ts +0 -275
  247. package/src/lib/room-assembly-overlay.ts +0 -265
  248. package/src/lib/room-selection.ts +0 -417
  249. package/src/lib/scene-bounds.test.ts +0 -327
  250. package/src/lib/scene-bounds.ts +0 -233
  251. package/src/lib/typing-target.ts +0 -9
  252. package/src/lib/viewer-selection.ts +0 -595
  253. package/src/lib/zone-content.ts +0 -133
  254. package/src/store/camera-pose-store.test.ts +0 -29
  255. package/src/store/camera-pose-store.ts +0 -27
  256. package/src/store/navigation-sync-pose-store.test.ts +0 -34
  257. package/src/store/navigation-sync-pose-store.ts +0 -27
  258. package/src/store/use-audio.test.ts +0 -146
  259. package/src/store/use-audio.tsx +0 -169
  260. package/src/store/use-first-person-hud.ts +0 -40
  261. package/src/store/use-follow-pascal.test.ts +0 -62
  262. package/src/store/use-follow-pascal.ts +0 -53
@@ -1,385 +0,0 @@
1
- import { describe, expect, test } from 'bun:test'
2
- import type { FloorplanGeometry } from '@pascal-app/core'
3
- import { renderToStaticMarkup } from 'react-dom/server'
4
- import { floorplanGeometryMetadata } from '../../../lib/floorplan/floorplan-extension'
5
- import { FloorplanGeometryRenderer } from './floorplan-geometry-renderer'
6
-
7
- describe('FloorplanGeometryRenderer static labels', () => {
8
- test('renders a measurement value together with its geometry', () => {
9
- const geometry = {
10
- kind: 'group',
11
- children: [
12
- { kind: 'line', x1: 0, y1: 0, x2: 2, y2: 0, stroke: '#334155' },
13
- {
14
- kind: 'dimension-label',
15
- appearance: 'outlined',
16
- cx: 1,
17
- cy: 0,
18
- text: '2.00m',
19
- angle: 0,
20
- offsetPx: 14,
21
- },
22
- ],
23
- } satisfies FloorplanGeometry
24
-
25
- const markup = renderToStaticMarkup(
26
- <svg>
27
- <FloorplanGeometryRenderer geometry={geometry} />
28
- </svg>,
29
- )
30
-
31
- expect(markup).toContain('<line')
32
- expect(markup).toContain('2.00m')
33
- expect(markup).toContain('translate(0 -0.14)')
34
- })
35
-
36
- test('keeps screen-upright measurement labels readable in rotated exports', () => {
37
- const geometry = {
38
- kind: 'dimension-label',
39
- appearance: 'outlined',
40
- cx: 1,
41
- cy: 2,
42
- text: 'A 6.0m²',
43
- angle: Math.PI / 3,
44
- screenUpright: true,
45
- } satisfies FloorplanGeometry
46
-
47
- const markup = renderToStaticMarkup(
48
- <svg>
49
- <FloorplanGeometryRenderer geometry={geometry} sceneRotationDeg={90} />
50
- </svg>,
51
- )
52
-
53
- expect(markup).toContain('A 6.0m²')
54
- expect(markup).toContain('rotate(-90)')
55
- })
56
-
57
- test('uses paper-point sizing when document scale is provided', () => {
58
- const geometry = {
59
- kind: 'dimension-label',
60
- appearance: 'outlined',
61
- cx: 1,
62
- cy: 2,
63
- text: '2.00m',
64
- angle: 0,
65
- } satisfies FloorplanGeometry
66
-
67
- const markup = renderToStaticMarkup(
68
- <svg>
69
- <FloorplanGeometryRenderer annotationUnitsPerPoint={0.01} geometry={geometry} />
70
- </svg>,
71
- )
72
-
73
- expect(markup).toContain('font-size="0.08"')
74
- })
75
-
76
- test('uses live screen sizing without enabling document annotation styles', () => {
77
- const geometry = {
78
- kind: 'group',
79
- children: [
80
- {
81
- kind: 'text',
82
- x: 0,
83
- y: 0,
84
- text: 'LIVE TEXT',
85
- fontSize: 0.16,
86
- upright: true,
87
- },
88
- {
89
- kind: 'dimension-label',
90
- appearance: 'outlined',
91
- cx: 1,
92
- cy: 2,
93
- text: '2.00m',
94
- angle: 0,
95
- offsetPx: 14,
96
- },
97
- ],
98
- } satisfies FloorplanGeometry
99
-
100
- const markup = renderToStaticMarkup(
101
- <svg>
102
- <FloorplanGeometryRenderer geometry={geometry} screenUnitsPerPixel={0.02} />
103
- </svg>,
104
- )
105
-
106
- expect(markup).toContain('font-size="0.16"')
107
- expect(markup).toContain('font-size="0.24"')
108
- expect(markup).toContain('translate(0 -0.28)')
109
- })
110
-
111
- test('renders outlined measurement labels as PDF-safe dark text on a white plate', () => {
112
- const geometry = {
113
- kind: 'dimension-label',
114
- appearance: 'outlined',
115
- cx: 1,
116
- cy: 2,
117
- text: '2.00m',
118
- angle: 0,
119
- } satisfies FloorplanGeometry
120
-
121
- const markup = renderToStaticMarkup(
122
- <svg>
123
- <FloorplanGeometryRenderer
124
- geometry={geometry}
125
- renderMode="pdf"
126
- screenUnitsPerPixel={0.02}
127
- />
128
- </svg>,
129
- )
130
-
131
- expect(markup).toContain('data-floorplan-dimension-label-plate=""')
132
- expect(markup).toContain('fill="#111827"')
133
- expect(markup).not.toContain('paint-order="stroke"')
134
- expect(markup).not.toContain('fill="#ffffff" font-family=')
135
- })
136
-
137
- test('caps PDF annotation linework without changing live stroke widths', () => {
138
- const geometry = {
139
- kind: 'line',
140
- x1: 0,
141
- y1: 0,
142
- x2: 2,
143
- y2: 0,
144
- stroke: '#334155',
145
- strokeWidth: 2,
146
- vectorEffect: 'non-scaling-stroke',
147
- } satisfies FloorplanGeometry
148
-
149
- const liveMarkup = renderToStaticMarkup(
150
- <svg>
151
- <FloorplanGeometryRenderer geometry={geometry} />
152
- </svg>,
153
- )
154
- const pdfMarkup = renderToStaticMarkup(
155
- <svg>
156
- <FloorplanGeometryRenderer geometry={geometry} renderMode="pdf" />
157
- </svg>,
158
- )
159
-
160
- expect(liveMarkup).toContain('stroke-width="2"')
161
- expect(pdfMarkup).toContain('stroke-width="0.5"')
162
- })
163
-
164
- test('removes unsupported paint-order outlines from generic PDF text', () => {
165
- const geometry = {
166
- kind: 'text',
167
- x: 1,
168
- y: 2,
169
- text: '101',
170
- fontSize: 0.15,
171
- fill: '#ffffff',
172
- stroke: '#334155',
173
- strokeWidth: 0.04,
174
- paintOrder: 'stroke',
175
- } satisfies FloorplanGeometry
176
-
177
- const markup = renderToStaticMarkup(
178
- <svg>
179
- <FloorplanGeometryRenderer geometry={geometry} renderMode="pdf" />
180
- </svg>,
181
- )
182
-
183
- expect(markup).toContain('fill="#334155"')
184
- expect(markup).not.toContain('paint-order')
185
- expect(markup).not.toContain('stroke=')
186
- })
187
-
188
- test('resolves generic annotation text from paper points only in document mode', () => {
189
- const geometry = {
190
- kind: 'text',
191
- x: 2,
192
- y: 3,
193
- text: 'VERIFY DIMENSIONS',
194
- fontSize: 0.16,
195
- upright: true,
196
- } satisfies FloorplanGeometry
197
-
198
- const liveMarkup = renderToStaticMarkup(
199
- <svg>
200
- <FloorplanGeometryRenderer geometry={geometry} />
201
- </svg>,
202
- )
203
- const documentMarkup = renderToStaticMarkup(
204
- <svg>
205
- <FloorplanGeometryRenderer annotationUnitsPerPoint={0.01} geometry={geometry} />
206
- </svg>,
207
- )
208
-
209
- expect(liveMarkup).toContain('font-size="0.16"')
210
- expect(documentMarkup).toContain('font-size="0.08"')
211
- })
212
-
213
- test('uses a room-label paper profile while preserving room label hierarchy', () => {
214
- const geometry = {
215
- kind: 'group',
216
- children: [
217
- {
218
- kind: 'text',
219
- x: 0,
220
- y: 0,
221
- text: 'KITCHEN',
222
- fontSize: 0.2,
223
- metadata: floorplanGeometryMetadata({ annotationRole: 'room-label' }),
224
- upright: true,
225
- },
226
- {
227
- kind: 'text',
228
- x: 0,
229
- y: 0.18,
230
- text: '101',
231
- fontSize: 0.16,
232
- metadata: floorplanGeometryMetadata({ annotationRole: 'room-label' }),
233
- upright: true,
234
- },
235
- {
236
- kind: 'text',
237
- x: 0,
238
- y: 0.36,
239
- text: 'CH: 2700',
240
- fontSize: 0.11,
241
- metadata: floorplanGeometryMetadata({ annotationRole: 'room-label' }),
242
- upright: true,
243
- },
244
- ],
245
- } satisfies FloorplanGeometry
246
-
247
- const markup = renderToStaticMarkup(
248
- <svg>
249
- <FloorplanGeometryRenderer annotationUnitsPerPoint={0.01} geometry={geometry} />
250
- </svg>,
251
- )
252
-
253
- expect(markup).toContain('font-size="0.08"')
254
- expect(markup).toContain('font-size="0.07"')
255
- expect(markup).toContain('font-size="0.055"')
256
- expect(markup).toMatch(/translate\(0 0\.08625/)
257
- expect(markup).toMatch(/translate\(0 0\.18625/)
258
- expect(markup).toMatch(/translate\(0 0\.27375/)
259
- })
260
-
261
- test('uses paper stroke profiles for leaders and opening marks in document mode', () => {
262
- const geometry = {
263
- kind: 'group',
264
- metadata: floorplanGeometryMetadata({ annotationRole: 'opening-mark' }),
265
- children: [
266
- {
267
- kind: 'polyline',
268
- points: [
269
- [0, 0],
270
- [1, 0],
271
- [1.4, 0],
272
- ],
273
- stroke: '#334155',
274
- strokeWidth: 0.9,
275
- vectorEffect: 'non-scaling-stroke',
276
- },
277
- {
278
- kind: 'rect',
279
- x: 2,
280
- y: 2,
281
- width: 0.42,
282
- height: 0.32,
283
- fill: '#ffffff',
284
- stroke: '#334155',
285
- strokeWidth: 0.02,
286
- },
287
- ],
288
- } satisfies FloorplanGeometry
289
-
290
- const markup = renderToStaticMarkup(
291
- <svg>
292
- <FloorplanGeometryRenderer annotationUnitsPerPoint={0.01} geometry={geometry} />
293
- </svg>,
294
- )
295
-
296
- expect(markup).toContain('stroke-width="0.9"')
297
- expect(markup).toContain('vector-effect="non-scaling-stroke"')
298
- expect(markup).toContain('height="0.14"')
299
- expect(markup).toContain('rx="0.07"')
300
- })
301
-
302
- test('registers fixed mark pills as annotation obstacles', () => {
303
- const geometry = {
304
- kind: 'group',
305
- children: [
306
- { kind: 'line', x1: 0, y1: 0, x2: 0, y2: 0.4 },
307
- { kind: 'rect', x: -0.2, y: 0.4, width: 0.4, height: 0.32 },
308
- { kind: 'text', x: 0, y: 0.56, text: '107', fontSize: 0.15, upright: true },
309
- ],
310
- } satisfies FloorplanGeometry
311
-
312
- const markup = renderToStaticMarkup(
313
- <svg>
314
- <FloorplanGeometryRenderer geometry={geometry} />
315
- </svg>,
316
- )
317
-
318
- expect(markup).toContain('data-floorplan-annotation-obstacle=""')
319
- })
320
-
321
- test('registers semantic plan primitives as annotation obstacles', () => {
322
- const markup = renderToStaticMarkup(
323
- <svg>
324
- <FloorplanGeometryRenderer
325
- geometry={{
326
- kind: 'polygon',
327
- points: [
328
- [0, 0],
329
- [4, 0],
330
- [4, 0.2],
331
- ],
332
- metadata: floorplanGeometryMetadata({ annotationObstacle: 'outline' }),
333
- }}
334
- />
335
- </svg>,
336
- )
337
-
338
- expect(markup).toContain('data-floorplan-annotation-obstacle="outline"')
339
- })
340
-
341
- test('registers fixed annotation categories as obstacles', () => {
342
- const roomLabel = {
343
- kind: 'text',
344
- x: 0,
345
- y: 0,
346
- text: 'KITCHEN',
347
- fontSize: 0.18,
348
- metadata: floorplanGeometryMetadata({ annotationRole: 'room-label' }),
349
- } satisfies FloorplanGeometry
350
- const stairArrow = {
351
- kind: 'polyline',
352
- points: [
353
- [0, 0],
354
- [0.5, 0.5],
355
- ],
356
- metadata: floorplanGeometryMetadata({ annotationRole: 'stair-annotation' }),
357
- } satisfies FloorplanGeometry
358
-
359
- const markup = renderToStaticMarkup(
360
- <svg>
361
- <FloorplanGeometryRenderer geometry={roomLabel} />
362
- <FloorplanGeometryRenderer geometry={stairArrow} />
363
- </svg>,
364
- )
365
-
366
- expect(markup).toContain('data-floorplan-annotation-obstacle="bounds"')
367
- expect(markup).toContain('data-floorplan-annotation-obstacle="outline"')
368
- })
369
- test('forwards even-odd fill rules for compound plugin paths', () => {
370
- const geometry = {
371
- kind: 'path',
372
- d: 'M0,0H4V4H0ZM1,1H3V3H1Z',
373
- fill: '#3f6b2f',
374
- fillRule: 'evenodd',
375
- } satisfies FloorplanGeometry
376
-
377
- const markup = renderToStaticMarkup(
378
- <svg>
379
- <FloorplanGeometryRenderer geometry={geometry} />
380
- </svg>,
381
- )
382
-
383
- expect(markup).toContain('fill-rule="evenodd"')
384
- })
385
- })