@things-factory/figure-ui 10.1.79 → 10.1.82

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 (145) hide show
  1. package/client/figure-assistant.ts +2 -2
  2. package/client/graphql/index.ts +99 -10
  3. package/client/graphql/reached.ts +25 -0
  4. package/client/graphql/store.ts +27 -4
  5. package/client/modeller/ai-proposal.ts +74 -9
  6. package/client/modeller/align.ts +2 -3
  7. package/client/modeller/canvas.ts +18 -5
  8. package/client/modeller/command-preview.ts +113 -0
  9. package/client/modeller/editor.ts +826 -54
  10. package/client/modeller/fields.ts +12 -4
  11. package/client/modeller/figure-facts.ts +2 -2
  12. package/client/modeller/figure-first-save.ts +36 -14
  13. package/client/modeller/figure-history-panel.ts +133 -14
  14. package/client/modeller/figure-links.ts +385 -68
  15. package/client/modeller/figure-parts.ts +56 -2
  16. package/client/modeller/figure-preview.ts +19 -1
  17. package/client/modeller/figure-properties.ts +3 -3
  18. package/client/modeller/figure-revert-choice.ts +49 -0
  19. package/client/modeller/first-save.ts +16 -0
  20. package/client/modeller/gizmo.ts +0 -16
  21. package/client/modeller/links.ts +142 -15
  22. package/client/modeller/motion-ends.ts +83 -0
  23. package/client/modeller/occupancy.ts +28 -2
  24. package/client/modeller/product-session.ts +154 -18
  25. package/client/modeller/refusals.ts +15 -0
  26. package/client/modeller/revert-request.ts +26 -0
  27. package/client/modeller/side-panel-styles.ts +12 -0
  28. package/client/modeller/stage-model.ts +25 -3
  29. package/client/pages/figure-modeller-page.ts +68 -29
  30. package/dist-client/figure-assistant.js +2 -2
  31. package/dist-client/figure-assistant.js.map +1 -1
  32. package/dist-client/graphql/index.d.ts +39 -2
  33. package/dist-client/graphql/index.js +63 -9
  34. package/dist-client/graphql/index.js.map +1 -1
  35. package/dist-client/graphql/reached.d.ts +10 -0
  36. package/dist-client/graphql/reached.js +28 -0
  37. package/dist-client/graphql/reached.js.map +1 -0
  38. package/dist-client/graphql/store.js +27 -4
  39. package/dist-client/graphql/store.js.map +1 -1
  40. package/dist-client/modeller/ai-proposal.d.ts +31 -2
  41. package/dist-client/modeller/ai-proposal.js +65 -6
  42. package/dist-client/modeller/ai-proposal.js.map +1 -1
  43. package/dist-client/modeller/align.d.ts +1 -1
  44. package/dist-client/modeller/align.js +0 -2
  45. package/dist-client/modeller/align.js.map +1 -1
  46. package/dist-client/modeller/canvas.d.ts +11 -0
  47. package/dist-client/modeller/canvas.js +33 -4
  48. package/dist-client/modeller/canvas.js.map +1 -1
  49. package/dist-client/modeller/clips.d.ts +1 -1
  50. package/dist-client/modeller/command-preview.d.ts +35 -0
  51. package/dist-client/modeller/command-preview.js +95 -0
  52. package/dist-client/modeller/command-preview.js.map +1 -0
  53. package/dist-client/modeller/editor.d.ts +113 -1
  54. package/dist-client/modeller/editor.js +850 -50
  55. package/dist-client/modeller/editor.js.map +1 -1
  56. package/dist-client/modeller/fields.d.ts +3 -2
  57. package/dist-client/modeller/fields.js +10 -3
  58. package/dist-client/modeller/fields.js.map +1 -1
  59. package/dist-client/modeller/figure-facts.js +2 -2
  60. package/dist-client/modeller/figure-facts.js.map +1 -1
  61. package/dist-client/modeller/figure-first-save.d.ts +3 -4
  62. package/dist-client/modeller/figure-first-save.js +41 -14
  63. package/dist-client/modeller/figure-first-save.js.map +1 -1
  64. package/dist-client/modeller/figure-history-panel.d.ts +31 -0
  65. package/dist-client/modeller/figure-history-panel.js +130 -14
  66. package/dist-client/modeller/figure-history-panel.js.map +1 -1
  67. package/dist-client/modeller/figure-links.d.ts +51 -1
  68. package/dist-client/modeller/figure-links.js +392 -72
  69. package/dist-client/modeller/figure-links.js.map +1 -1
  70. package/dist-client/modeller/figure-parts.d.ts +7 -0
  71. package/dist-client/modeller/figure-parts.js +55 -2
  72. package/dist-client/modeller/figure-parts.js.map +1 -1
  73. package/dist-client/modeller/figure-preview.d.ts +6 -0
  74. package/dist-client/modeller/figure-preview.js +22 -1
  75. package/dist-client/modeller/figure-preview.js.map +1 -1
  76. package/dist-client/modeller/figure-properties.js +3 -3
  77. package/dist-client/modeller/figure-properties.js.map +1 -1
  78. package/dist-client/modeller/figure-revert-choice.d.ts +17 -0
  79. package/dist-client/modeller/figure-revert-choice.js +59 -0
  80. package/dist-client/modeller/figure-revert-choice.js.map +1 -0
  81. package/dist-client/modeller/first-save.d.ts +7 -0
  82. package/dist-client/modeller/first-save.js +17 -0
  83. package/dist-client/modeller/first-save.js.map +1 -1
  84. package/dist-client/modeller/gizmo.d.ts +0 -6
  85. package/dist-client/modeller/gizmo.js +0 -18
  86. package/dist-client/modeller/gizmo.js.map +1 -1
  87. package/dist-client/modeller/links.d.ts +49 -4
  88. package/dist-client/modeller/links.js +141 -15
  89. package/dist-client/modeller/links.js.map +1 -1
  90. package/dist-client/modeller/motion-ends.d.ts +12 -0
  91. package/dist-client/modeller/motion-ends.js +65 -0
  92. package/dist-client/modeller/motion-ends.js.map +1 -0
  93. package/dist-client/modeller/occupancy.d.ts +14 -1
  94. package/dist-client/modeller/occupancy.js +14 -1
  95. package/dist-client/modeller/occupancy.js.map +1 -1
  96. package/dist-client/modeller/product-session.d.ts +43 -2
  97. package/dist-client/modeller/product-session.js +146 -12
  98. package/dist-client/modeller/product-session.js.map +1 -1
  99. package/dist-client/modeller/refusals.d.ts +13 -0
  100. package/dist-client/modeller/refusals.js +16 -0
  101. package/dist-client/modeller/refusals.js.map +1 -1
  102. package/dist-client/modeller/revert-request.d.ts +16 -0
  103. package/dist-client/modeller/revert-request.js +11 -0
  104. package/dist-client/modeller/revert-request.js.map +1 -0
  105. package/dist-client/modeller/side-panel-styles.js +12 -0
  106. package/dist-client/modeller/side-panel-styles.js.map +1 -1
  107. package/dist-client/modeller/stage-model.d.ts +18 -2
  108. package/dist-client/modeller/stage-model.js +21 -3
  109. package/dist-client/modeller/stage-model.js.map +1 -1
  110. package/dist-client/pages/figure-modeller-page.d.ts +8 -1
  111. package/dist-client/pages/figure-modeller-page.js +72 -34
  112. package/dist-client/pages/figure-modeller-page.js.map +1 -1
  113. package/dist-client/route.d.ts +1 -1
  114. package/dist-client/tsconfig.tsbuildinfo +1 -1
  115. package/package.json +6 -6
  116. package/test/ai-proposal.test.ts +2 -2
  117. package/test/align.test.ts +50 -5
  118. package/test/browser/acceptance-page.js +187 -0
  119. package/test/browser/build.mjs +5 -1
  120. package/test/browser/revert-page.js +47 -0
  121. package/test/browser/serve-acceptance.mjs +85 -0
  122. package/test/browser/serve-revert.mjs +119 -0
  123. package/test/clip-ai-proposal.test.ts +104 -0
  124. package/test/clip-consent.test.ts +88 -0
  125. package/test/command-preview.test.ts +288 -0
  126. package/test/fields.test.ts +4 -3
  127. package/test/figure-assistant-surface.test.ts +4 -1
  128. package/test/first-minute.test.ts +96 -0
  129. package/test/first-save-suggest.test.ts +42 -0
  130. package/test/gizmo.test.ts +20 -16
  131. package/test/joint-fan.test.ts +2 -1
  132. package/test/layout.test.ts +9 -2
  133. package/test/links.test.ts +7 -4
  134. package/test/proposal-record.test.ts +126 -0
  135. package/test/release-entry.test.ts +28 -0
  136. package/test/release-panel.test.ts +3 -2
  137. package/test/resize-with-placement.test.ts +225 -0
  138. package/test/revert-choice.test.ts +39 -0
  139. package/test/revert-keeping.test.ts +102 -0
  140. package/test/save-landed.test.ts +198 -0
  141. package/translations/en.json +222 -10
  142. package/translations/ja.json +223 -11
  143. package/translations/ko.json +223 -11
  144. package/translations/ms.json +222 -10
  145. package/translations/zh.json +223 -11
@@ -51,7 +51,7 @@
51
51
  "figure.text.scale-position-explained": "keeps this place as a share of the figure size — at twice the size it is twice as far.",
52
52
  "figure.text.repeat-member": "copy {index} of {count} made by repeating {name}.",
53
53
  "figure.label.detail-none": "none",
54
- "figure.label.repeat": "repeat",
54
+ "figure.label.repeat": "arranged in a row",
55
55
  "figure.text.repeat-fits-length": "as many copies as fit the figure’s length at this pitch.",
56
56
  "figure.text.repeat-fixed-count": "a repeat of a fixed count; its pitch cannot be set yet.",
57
57
  "figure.text.repeat-what-pitch-gives": "{count} at a length of {length} mm · placed up to {longest} mm long ({limit} in a row).",
@@ -59,6 +59,8 @@
59
59
  "figure.text.gizmo-joint-places": "a joint places {part}. move it with its control in the motion tab.",
60
60
  "figure.label.motion-continuous": "turn without end",
61
61
  "figure.text.fasten-before-moving": "fasten it to another part or the floor first; then it can move.",
62
+ "figure.text.motion-summary": "{part} · against {against} · {kind} along {axis}",
63
+ "figure.text.motion-ends-shown": "The canvas shows the poses at both ends of the range ({min} … {max} {unit}), translucent. What lies between is not checked.",
62
64
  "figure.text.joint-range-holds-zero": "the range must hold 0, the rest pose.",
63
65
  "figure.text.gizmo-joint-mimic": "the {joint} joint follows {leader}. move {leader}.",
64
66
  "figure.text.gizmo-joint-fixed-turn": "the {joint} joint does not turn. give it a turn in the motion tab.",
@@ -268,8 +270,8 @@
268
270
  "figure.label.released-versions": "released versions",
269
271
  "figure.label.repeat-axis": "axis it repeats along",
270
272
  "figure.label.repeat-count": "count",
271
- "figure.label.repeat-gap": "pitch",
272
- "figure.label.repeat-pitch": "pitch",
273
+ "figure.label.repeat-gap": "pitch (centre to centre)",
274
+ "figure.label.repeat-pitch": "pitch (centre to centre)",
273
275
  "figure.label.reuse-trend": "reuse trend",
274
276
  "figure.label.instance-count": "instance count",
275
277
  "figure.label.rotation-degrees": "rotation (degrees)",
@@ -344,6 +346,11 @@
344
346
  "figure.text.leave-without-saving": "there are unsaved changes. discard them and leave?",
345
347
  "figure.button.leave-without-saving": "discard and leave",
346
348
  "figure.button.keep-editing": "keep editing",
349
+ "figure.text.clips-would-go": "Applying this removes these clips: {clips}. Undo brings them back.",
350
+ "figure.text.clip-gone": "{clip} (nothing left to move)",
351
+ "figure.text.clip-changed": "{clip} (moves differently now)",
352
+ "figure.button.let-clips-go": "Apply and remove clips",
353
+ "figure.text.clips-consent-stale": "The model changed while you were deciding, so nothing was applied. Try again.",
347
354
  "figure.text.does-not-block": "does not block",
348
355
  "figure.text.emissive-explained": "how bright the surface itself is. 0 is unlit, and it does not light its surroundings.",
349
356
  "figure.text.enter-a-type-name": "enter a type name.",
@@ -412,7 +419,7 @@
412
419
  "figure.text.pose-as-default-explained": "Writes the pose you have set as the parameters’ defaults, so the figure stands like this when nobody gives it a value.",
413
420
  "figure.text.preview-blocked-by-errors": "cannot show the preview because of format errors. see the maturity tab for the reason.",
414
421
  "figure.text.preview-needs-a-part": "add a part to see how it looks placed on a drawing.",
415
- "figure.text.put-on-floor": "drop it to the floor (Z=0).",
422
+ "figure.text.put-on-floor": "Moves the part once so its bottom is on the floor (Y=0). It does not stay there when the size changes; for that, use “Follow size, attached to the floor”.",
416
423
  "figure.text.range-needs-room": "the maximum must be above the minimum.",
417
424
  "figure.text.release-needs-a-save-first": "there are unsaved changes. save first.",
418
425
  "figure.text.releasing": "releasing…",
@@ -420,11 +427,11 @@
420
427
  "figure.text.repeat-pitch-explained": "centre-to-centre distance. it stays when the part size changes.",
421
428
  "figure.text.report-appears-when-you-add-a-part": "shows triangles, draw calls, and how many fit on one drawing. measured once you make a part.",
422
429
  "figure.text.reuse-score-explained": "how much headroom is left in the declared limits. the one closest to its cap sets the score.",
423
- "figure.text.revert-to-version-confirm": "revert to v{version}? what you are editing will be replaced by that version.",
430
+ "figure.text.revert-to-version-confirm": "revert to v{version}? the current draft is kept on the server and can be brought back with 'undo revert'.",
424
431
  "figure.text.rung-flow-note": "holds things and takes them in and out through ports. conveyors, chutes, sorters",
425
432
  "figure.text.rung-hold-note": "has slots to put things in. racks, pallets, benches",
426
433
  "figure.text.rung-none-note": "takes nothing. most figures belong here",
427
- "figure.text.save-new-figure-desc": "set the unique type code and display name for this figure.",
434
+ "figure.text.save-new-figure-desc": "Name the figure, and check the model identifier boards will call it by.",
428
435
  "figure.text.save-the-figure-before-releasing": "this figure has not been saved yet. save it and you can release it.",
429
436
  "figure.text.saving-figure": "saving",
430
437
  "figure.text.scene-reference-explained": "the kind of drawing the preview places the figure on. the figure's own placement does not change.",
@@ -473,6 +480,39 @@
473
480
  "figure.label.stands-on-plane": "stand on the mounting plane",
474
481
  "figure.label.facing-meet": "faces meet",
475
482
  "figure.label.facing-flush": "same plane",
483
+ "figure.text.overhang-out": "It comes past the edge of {on}'s {face}: {sides}. This is apart from the figure's room.",
484
+ "figure.text.overhang-larger": "Wider than {on}'s {face}, it comes past its edges: {sides}.",
485
+ "figure.text.overhang-lopsided": "It sits off to one side along {axes}.",
486
+ "figure.text.overhang-possible": "It may come past the edge of {on}'s {face}: it is fastened turned, so only its box was measured.",
487
+ "figure.text.overhang-unknown": "Whether it lies within the edges of {on}'s {face} could not be read.",
488
+ "figure.text.overhang-held": "Parts fastened to this one ({parts}) come, or may come, past the edge of the face they are on.",
489
+ "figure.text.overhang-side-low": "{axis} low side {mm} mm",
490
+ "figure.text.overhang-side-high": "{axis} high side {mm} mm",
491
+ "figure.button.fix-alignment": "change alignment and gap",
492
+ "figure.text.detach-stays": "Detached, it stays where it stands now; only its fastening to {from} goes.",
493
+ "figure.text.detach-moves": "Detached, it moves:",
494
+ "figure.text.detach-keeps-children": "Parts fastened to it ({parts}) stay fastened to it.",
495
+ "figure.text.detach-clips": "Detaching removes clips: {clips}. You will be asked when you detach.",
496
+ "figure.text.detach-refused": "It cannot be detached: {reason}",
497
+ "figure.text.preview-refused": "This cannot be attached as it is: {reason}",
498
+ "figure.text.preview-stays": "It stays where it is.",
499
+ "figure.text.preview-moves": "It moves {by} mm, in the figure's frame.",
500
+ "figure.text.preview-turns-named": "It turns {degrees}° about the figure's {axis} axis.",
501
+ "figure.text.preview-turns-slanted": "It turns {degrees}° about a slanted axis ({axis}) of the figure.",
502
+ "figure.text.preview-carries": "Moving with it: {parts}",
503
+ "figure.text.preview-copies": "{n} × {part}",
504
+ "figure.text.preview-clips": "Applying this removes clips: {clips}. You will be asked when you apply.",
505
+ "figure.text.preview-face-unknown": "This face cannot be shown on the canvas.",
506
+ "figure.text.target-would-loop": "{part} — attached to {mine}, cannot be chosen",
507
+ "figure.label.fasten-detail": "Details",
508
+ "figure.label.facing": "How faces meet",
509
+ "figure.text.fasten-summary-default": "Defaults (meeting · centred · gap 0 · twist 0)",
510
+ "figure.text.fasten-summary-edge-min": "{axis} lower edge",
511
+ "figure.text.fasten-summary-edge-max": "{axis} upper edge",
512
+ "figure.text.fasten-summary-off-centre": "{axis} {mm} mm off centre",
513
+ "figure.text.fasten-summary-follows": "{axis} follows a value",
514
+ "figure.text.fasten-summary-gap": "gap {mm} mm",
515
+ "figure.text.fasten-summary-twist": "twist {degrees}°",
476
516
  "figure.label.gap": "gap (mm)",
477
517
  "figure.label.align": "within the face",
478
518
  "figure.label.align-centre": "centred",
@@ -506,7 +546,7 @@
506
546
  "figure.button.propose-room": "Compute bounds",
507
547
  "figure.button.confirm-room": "Declare these bounds",
508
548
  "figure.label.room-undeclared": "not declared yet",
509
- "figure.label.room-declared": "declared",
549
+ "figure.label.room-declared": "Declared now",
510
550
  "figure.label.mounting-face": "Mounting face",
511
551
  "figure.text.mounting-face-explained": "The face the figure is mounted on. A separate choice from the room it takes up.",
512
552
  "figure.button.set-mounting-face": "This face",
@@ -611,17 +651,32 @@
611
651
  "figure.label.face-opening-left": "opening left",
612
652
  "figure.label.face-opening-right": "opening right",
613
653
  "figure.label.face-opening-top": "opening top",
614
- "figure.label.repeat-fills": "as many as fill the length",
615
- "figure.button.make-repeat": "make a row",
654
+ "figure.label.repeat-fills": "as many as fill the length (set the pitch)",
655
+ "figure.button.make-repeat": "arrange in a row",
616
656
  "figure.button.remove-repeat": "remove the row",
657
+ "figure.label.row-basis": "how many",
658
+ "figure.label.row-by-count": "a set count",
659
+ "figure.text.row-count-spreads": "A set count is spread evenly over the length. Check the spacing in the preview.",
660
+ "figure.text.row-blocked-unfastened": "Fasten {part} to another part to arrange it in a row along that part.",
661
+ "figure.text.row-blocked-on-plane": "Fasten it to another part, not the mounting plane, to arrange it in a row along that part.",
662
+ "figure.text.row-blocked-holds-parts": "Parts are fastened to this part, so it cannot be arranged in a row. Arrange it first; parts fastened after ride every copy.",
663
+ "figure.button.go-fasten": "go to fastening",
664
+ "figure.text.row-count-pitch": "{count} × {part} · along {axis} · pitch {pitch} mm (centre to centre)",
665
+ "figure.text.row-count-uneven": "{count} × {part} · along {axis} · unevenly spaced",
666
+ "figure.text.row-ends-centred": "centred · {mm} mm left at each end",
667
+ "figure.text.row-ends": "{low} mm left at the low end · {high} mm at the high end",
668
+ "figure.text.row-ends-unknown": "What is left at the ends could not be read.",
669
+ "figure.text.row-companions": "copied along: {parts}",
617
670
  "figure.label.twist": "twist (°)",
618
671
  "figure.text.instance-size-undeclared": "the figure has no size, so a board cannot resize it.",
619
672
  "figure.button.declare-instance-size": "declare the figure size",
620
673
  "figure.text.proposal-applied": "applied {n} commands as one step.",
674
+ "figure.text.proposal-saved-into": "Saved into: {names}",
621
675
  "figure.text.proposal-needs-modeller": "this proposal can be applied only while its figure is open in the modeller.",
622
676
  "figure.text.proposal-new-figure-unsaved": "a new figure is being made, so the proposal was not applied. save or discard it, then run it again.",
623
677
  "figure.text.proposal-not-opened": "a new figure could not be opened in the modeller, so the proposal was not applied.",
624
678
  "figure.text.proposal-refused": "the modeller did not apply the proposal: {reason}",
679
+ "figure.text.proposal-would-drop-clips": "Applying this proposal would remove clips ({clips}), so it was not applied. Edit by hand if you mean to remove them.",
625
680
  "figure.text.proposal-stale": "the model changed after the proposal was made, so it was not applied. ask again.",
626
681
  "figure.label.follows-plus": "plus (mm)",
627
682
  "figure.label.motion-travel": "travel",
@@ -663,5 +718,162 @@
663
718
  "figure.text.edit-refused": "This edit cannot be made. ({code})",
664
719
  "figure.text.edit-refused-node-limit": "The figure is too large to add more. It holds up to {max} nodes.",
665
720
  "figure.text.recipe-step-refused": "Stopped at step {step} of the recipe. {why} ({code})",
666
- "figure.text.removal-space-refitted": "The space is fitted to the parts left."
721
+ "figure.text.removal-space-refitted": "The space is fitted to the parts left.",
722
+ "figure.text.placement-intent-floor": "Floor placement: the bottom keeps its current distance from the floor (Y=0) as the size changes. Its place on the floor (X, Z) stays.",
723
+ "figure.text.placement-intent-ceiling": "Ceiling placement: the top keeps its current distance from the ceiling (Y=0) as the size changes. Its place under the ceiling (X, Z) stays.",
724
+ "figure.text.placement-intent-wall": "Wall placement: the back keeps its current distance from the wall (Z=0) as the size changes. Its place on the wall (X, Y) stays.",
725
+ "figure.text.placement-intent-center": "Centre placement: the centre stays where it is and only the size follows. Nothing is attached to a floor, ceiling or wall.",
726
+ "figure.label.resize-intent": "When the equipment is resized",
727
+ "figure.text.resize-intent": "Each direction shows its size now and what it follows. Choose the directions to follow below, and apply them with where the part stays.",
728
+ "figure.label.resize-diameter": "Diameter (X and Z)",
729
+ "figure.label.resize-x": "Width (X)",
730
+ "figure.label.resize-y": "Height (Y)",
731
+ "figure.label.resize-z": "Depth (Z)",
732
+ "figure.label.resize-custom": "Linked to another rule",
733
+ "figure.label.resize-following": "Follows equipment size",
734
+ "figure.label.resize-advanced": "Link to other parts · Advanced",
735
+ "figure.text.resize-uniform-warning": "This equipment uses uniform scaling, which takes precedence over individual axis changes. Switching this mode is not yet available.",
736
+ "figure.text.preview-setup": "Not resizing as expected? Choose a part to set which dimensions follow and where it stays attached. Preview controls do not change the saved model.",
737
+ "figure.label.resize-part": "Part to configure",
738
+ "figure.button.configure-size": "Configure this part’s resizing",
739
+ "figure.text.resize-room-unchanged": "Size response applied. The declared space was not changed.",
740
+ "figure.button.resize-choice-replace-position": "Replace the position rule and apply",
741
+ "figure.label.resize-place-floor": "floor",
742
+ "figure.label.resize-place-ceiling": "ceiling",
743
+ "figure.label.resize-place-wall": "wall",
744
+ "figure.label.resize-place-center": "centre",
745
+ "figure.text.resize-refused-held": "{part} is already attached to another part or the plane. Change that attachment directly.",
746
+ "figure.text.resize-refused-turned": "{part} is rotated, so this action cannot set it up. Link each direction in the advanced settings.",
747
+ "figure.text.resize-refused-uniform-policy": "This figure grows by one ratio. Change that first to give a part its own size response.",
748
+ "figure.text.resize-refused-shape-edit": "This action does not support the shape of {part} yet. Link each direction in the advanced settings.",
749
+ "figure.text.resize-refused-dimension-rule": "A dimension of {part} already follows another rule. Change that rule directly in the advanced settings.",
750
+ "figure.text.resize-refused-position-rule": "The {axis} position of {part} is set by an input or an expression. Applying this replaces it with the {place} relation.",
751
+ "figure.text.resize-refused-no-face": "{part} has no flat face to attach to the {place}.",
752
+ "figure.text.axis-held-by-rule": "Set by a rule",
753
+ "figure.label.room-only-inputs": "Used only to work out the placement space",
754
+ "figure.text.room-only-inputs": "These values do not move the part. The declared space is worked out from them.",
755
+ "figure.button.room-refit": "Work out the space again…",
756
+ "figure.label.room-refit": "Work out the space again",
757
+ "figure.label.room-proposed": "Worked out again",
758
+ "figure.label.room-at-authored": "Drawn size",
759
+ "figure.label.room-at-largest": "Largest size",
760
+ "figure.text.room-same": "same",
761
+ "figure.text.room-part-outside": "{part}: {mm} mm outside along {axis}",
762
+ "figure.text.room-nothing-outside": "no part outside at the sizes measured",
763
+ "figure.button.room-refit-confirm": "Work it out again",
764
+ "figure.text.resize-gap-off": "This part’s face is {mm} mm off the {place} plane.",
765
+ "figure.text.resize-gap-through": "This part reaches {mm} mm through the {place} plane.",
766
+ "figure.button.resize-keep-gap": "{scope}: follow size, keeping the {mm} mm gap",
767
+ "figure.button.resize-keep-through": "{scope}: follow size, still {mm} mm through",
768
+ "figure.button.resize-onto-plane-floor": "{scope}: follow size, brought onto the floor",
769
+ "figure.button.resize-onto-plane-ceiling": "{scope}: follow size, brought up to the ceiling",
770
+ "figure.button.resize-onto-plane-wall": "{scope}: follow size, brought onto the wall",
771
+ "figure.text.resize-refused-gap-choice": "The face of {part} is not on the {place} plane. Choose whether to keep the gap or bring it onto the plane.",
772
+ "figure.text.resize-replaces": "Applying this replaces the {fields} fields with the {place} attachment. Nothing moves now.",
773
+ "figure.text.room-drops": "Confirming removes the fields nothing reads any more: {fields}",
774
+ "figure.button.resize-unfollow": "Set back to fixed",
775
+ "figure.label.resize-pending": "Size response to apply",
776
+ "figure.text.resize-already-following": "(already following)",
777
+ "figure.text.resize-basis-suggested": "No direction is chosen yet, so all are ticked. Untick the ones you do not need.",
778
+ "figure.text.resize-basis-chosen": "Only the ticked directions follow. The others keep their size.",
779
+ "figure.text.resize-basis-none": "Tick at least one direction to follow.",
780
+ "figure.text.resize-scope-all-3": "All three directions",
781
+ "figure.text.resize-scope-all-2": "Both directions",
782
+ "figure.text.resize-scope-all-1": "This direction",
783
+ "figure.text.resize-scope-only": "Only {axes}",
784
+ "figure.button.resize-scoped-floor": "{scope}: follow size, attached to the floor",
785
+ "figure.button.resize-scoped-ceiling": "{scope}: follow size, attached to the ceiling",
786
+ "figure.button.resize-scoped-wall": "{scope}: follow size, attached to the wall",
787
+ "figure.button.resize-scoped-center": "{scope}: follow size, keeping the current centre",
788
+ "figure.text.resize-move": "(moves {mm} mm on {axis})",
789
+ "figure.text.axes-held-by-rule": "{group} {axes}: set by a rule, read-only",
790
+ "figure.text.held-by-rule": "A rule places this part.",
791
+ "figure.text.held-on-plane": "{face} kept on the {place} (gap {gap} mm)",
792
+ "figure.text.held-on-part": "Attached by its {face} to the {otherFace} of {other}",
793
+ "figure.button.open-fastening": "Open attachment settings",
794
+ "figure.button.detach-held": "Detach",
795
+ "figure.text.gizmo-size-turned-fastening": "{part} is turned off its plane or attached twisted, so the face kept while dragging and the one kept when written would differ. Type the size in its field instead -- the placement's face (or {extreme}) stays where it is.",
796
+ "figure.label.kept-extreme-floor": "lowest point",
797
+ "figure.label.kept-extreme-ceiling": "highest point",
798
+ "figure.label.kept-extreme-wall": "backmost point",
799
+ "figure.label.kept-extreme-center": "centre",
800
+ "figure.label.align-input": "Follows its field ({field})",
801
+ "figure.label.tab-short-properties": "Properties",
802
+ "figure.label.tab-short-capability": "Capability",
803
+ "figure.label.tab-short-motion": "Motion",
804
+ "figure.label.tab-short-verdict": "Check",
805
+ "figure.label.tab-short-view": "View",
806
+ "figure.label.tab-short-history": "History",
807
+ "figure.text.start-question": "What would you like to start with?",
808
+ "figure.label.start-shape": "Add a basic shape",
809
+ "figure.text.start-shape-more": "More shapes are in the list on the left.",
810
+ "figure.label.start-recipe": "Start from a recipe",
811
+ "figure.button.start-recipe": "Browse recipes",
812
+ "figure.label.start-ai": "Draft with AI",
813
+ "figure.button.start-ai": "Ask AI for a draft",
814
+ "figure.text.start-ai-optional": "Optional. You can build it yourself.",
815
+ "figure.text.empty-figure-next": "Add a part to see its size and placement.",
816
+ "figure.label.figure-info-later": "Figure information · you can set this later",
817
+ "figure.text.parts-panel-folded-narrow": "The screen is narrow, so the parts list is folded. The panel button in the toolbar opens it again.",
818
+ "figure.text.summary-follows": "{axes} follow the figure",
819
+ "figure.text.summary-ruled": "{axes} follow a rule",
820
+ "figure.text.summary-size-fixed": "Size fixed",
821
+ "figure.text.summary-free": "Placed by its own position · not attached",
822
+ "figure.text.ai-draft-request": "Please draft a new figure. The equipment: ",
823
+ "figure.text.start-no-recipes": "No recipes are available yet.",
824
+ "figure.label.start-placement": "Where does it go?",
825
+ "figure.text.placement-is-intent": "What the figure is authored from. You can choose it before any part; it does not change the declared space.",
826
+ "figure.button.show-model-settings": "Show model settings",
827
+ "figure.text.new-figure-name": "New figure",
828
+ "figure.label.panel-path": "What the panel shows",
829
+ "figure.label.model-settings": "Model settings",
830
+ "figure.text.fasten-editing": "Editing the current attachment: its {face} on {target}",
831
+ "figure.text.fasten-new": "Attach anew",
832
+ "figure.button.fasten-update": "Update this attachment",
833
+ "figure.button.align-to-floor": "Align to the floor",
834
+ "figure.button.align-to-ceiling": "Align to the ceiling",
835
+ "figure.button.align-to-wall": "Align to the wall",
836
+ "figure.button.align-to-center": "Align to the centre height",
837
+ "figure.text.align-to-floor": "Moves it once so its bottom is on the floor (Y=0). It is not attached.",
838
+ "figure.text.align-to-ceiling": "Moves it once so its top is on the ceiling (Y=0). It is not attached.",
839
+ "figure.text.align-to-wall": "Moves it once so its back is on the wall (Z=0). It is not attached.",
840
+ "figure.text.align-to-center": "Moves it once so its centre is at the origin height (Y=0). It is not attached.",
841
+ "figure.text.align-to-floor-tilted": "Keeps the tilt and aligns it to the floor (Y=0). Its lowest point or edge touches. It is not attached.",
842
+ "figure.text.align-to-floor-extreme": "Aligns it to the floor (Y=0). Its lowest part touches. It is not attached.",
843
+ "figure.text.aligned-tilted-floor": "Aligned to the floor, tilt kept. Its lowest point or edge touches.",
844
+ "figure.text.aligned-extreme-floor": "Aligned to the floor. Its lowest part touches.",
845
+ "figure.text.align-to-ceiling-tilted": "Keeps the tilt and aligns it to the ceiling (Y=0). Its highest point or edge touches. It is not attached.",
846
+ "figure.text.align-to-ceiling-extreme": "Aligns it to the ceiling (Y=0). Its highest part touches. It is not attached.",
847
+ "figure.text.aligned-tilted-ceiling": "Aligned to the ceiling, tilt kept. Its highest point or edge touches.",
848
+ "figure.text.aligned-extreme-ceiling": "Aligned to the ceiling. Its highest part touches.",
849
+ "figure.text.align-to-wall-tilted": "Keeps the tilt and aligns it to the wall (Z=0). Its backmost point or edge touches. It is not attached.",
850
+ "figure.text.align-to-wall-extreme": "Aligns it to the wall (Z=0). Its backmost part touches. It is not attached.",
851
+ "figure.text.aligned-tilted-wall": "Aligned to the wall, tilt kept. Its backmost point or edge touches.",
852
+ "figure.text.aligned-extreme-wall": "Aligned to the wall. Its backmost part touches.",
853
+ "figure.text.align-refused-held": "{part} is attached, so its attachment places it. Change it in the attachment settings.",
854
+ "figure.text.align-refused-position-rule": "A rule sets where {part} is, so there is no number to move.",
855
+ "figure.text.align-refused-no-face": "Where {part} is cannot be measured.",
856
+ "figure.text.save-unreachable": "Could not reach the server. Whether it was saved is not known. Your edits are still here; save again.",
857
+ "figure.text.released-now-draft": "The released figure was changed, so it is a draft again. Boards keep the released version until you release it again.",
858
+ "figure.text.revert-with-unsaved": "There are changes not saved. What should happen to them before going back to version {version}?",
859
+ "figure.button.revert-saving": "Save, then revert",
860
+ "figure.button.revert-discarding": "Discard and revert",
861
+ "figure.text.revert-held-unsaved": "The save did not complete, so nothing was reverted. {reason}",
862
+ "figure.label.kept-drafts": "drafts kept by reverts",
863
+ "figure.text.kept-before-revert": "before reverting to v{version}",
864
+ "figure.text.kept-before-undo": "before the revert was undone",
865
+ "figure.text.kept-restored": "brought back",
866
+ "figure.button.undo-revert": "undo revert",
867
+ "figure.button.redo-revert": "revert again",
868
+ "figure.text.undo-revert-with-unsaved": "There are changes not saved. What should happen to them before undoing the revert?",
869
+ "figure.button.save-and-continue": "Save, then continue",
870
+ "figure.button.discard-and-continue": "Discard and continue",
871
+ "figure.text.revert-needs-server-source": "The model on the server is not confirmed, so nothing was reverted. Open the model again.",
872
+ "figure.text.revert-unconfirmed": "No answer came from the server, so the result is not known. Press again to check it with the same request.",
873
+ "figure.label.figure-identifier": "Model identifier",
874
+ "figure.text.identifier-suggested": "A suggested identifier. It can be changed until the figure is released, and not after.",
875
+ "figure.text.release-state-released": "Released · v{version}",
876
+ "figure.text.release-state-draft-over": "Draft · boards use v{version}",
877
+ "figure.text.release-state-draft-new": "Draft · never released",
878
+ "figure.button.release": "Release"
667
879
  }