@things-factory/figure-ui 10.1.5 → 10.1.7

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 (79) hide show
  1. package/client/graphql/index.ts +36 -3
  2. package/client/modeller/figure-animations.ts +712 -0
  3. package/client/modeller/figure-ask.ts +5 -5
  4. package/client/modeller/figure-canvas.ts +1 -1
  5. package/client/modeller/figure-capabilities.ts +372 -0
  6. package/client/modeller/figure-history-panel.ts +171 -18
  7. package/client/modeller/figure-inspector.ts +439 -76
  8. package/client/modeller/figure-parts.ts +15 -15
  9. package/client/modeller/figure-preview.ts +2 -2
  10. package/client/modeller/figure-report.ts +102 -37
  11. package/client/modeller/figure-settings.ts +20 -20
  12. package/client/modeller/figure-side.ts +91 -15
  13. package/client/modeller/figure-source.test.ts +15 -1
  14. package/client/modeller/figure-source.ts +31 -15
  15. package/client/modeller/figure-thumbnail.ts +49 -4
  16. package/client/modeller/maturity.ts +10 -10
  17. package/client/pages/figure-list-page.ts +204 -66
  18. package/client/pages/figure-modeller-page.ts +158 -42
  19. package/client/types.ts +31 -0
  20. package/client/viewparts/figure-thumb.ts +250 -0
  21. package/dist-client/graphql/index.d.ts +8 -1
  22. package/dist-client/graphql/index.js +33 -3
  23. package/dist-client/graphql/index.js.map +1 -1
  24. package/dist-client/modeller/figure-animations.d.ts +93 -0
  25. package/dist-client/modeller/figure-animations.js +655 -0
  26. package/dist-client/modeller/figure-animations.js.map +1 -0
  27. package/dist-client/modeller/figure-ask.js +5 -5
  28. package/dist-client/modeller/figure-ask.js.map +1 -1
  29. package/dist-client/modeller/figure-canvas.js +1 -1
  30. package/dist-client/modeller/figure-canvas.js.map +1 -1
  31. package/dist-client/modeller/figure-capabilities.d.ts +42 -0
  32. package/dist-client/modeller/figure-capabilities.js +344 -0
  33. package/dist-client/modeller/figure-capabilities.js.map +1 -0
  34. package/dist-client/modeller/figure-history-panel.d.ts +15 -1
  35. package/dist-client/modeller/figure-history-panel.js +165 -18
  36. package/dist-client/modeller/figure-history-panel.js.map +1 -1
  37. package/dist-client/modeller/figure-inspector.d.ts +98 -0
  38. package/dist-client/modeller/figure-inspector.js +425 -75
  39. package/dist-client/modeller/figure-inspector.js.map +1 -1
  40. package/dist-client/modeller/figure-parts.js +15 -15
  41. package/dist-client/modeller/figure-parts.js.map +1 -1
  42. package/dist-client/modeller/figure-preview.js +2 -2
  43. package/dist-client/modeller/figure-preview.js.map +1 -1
  44. package/dist-client/modeller/figure-report.d.ts +18 -1
  45. package/dist-client/modeller/figure-report.js +105 -37
  46. package/dist-client/modeller/figure-report.js.map +1 -1
  47. package/dist-client/modeller/figure-settings.js +19 -19
  48. package/dist-client/modeller/figure-settings.js.map +1 -1
  49. package/dist-client/modeller/figure-side.d.ts +24 -0
  50. package/dist-client/modeller/figure-side.js +94 -14
  51. package/dist-client/modeller/figure-side.js.map +1 -1
  52. package/dist-client/modeller/figure-source.d.ts +15 -8
  53. package/dist-client/modeller/figure-source.js +16 -7
  54. package/dist-client/modeller/figure-source.js.map +1 -1
  55. package/dist-client/modeller/figure-thumbnail.js +40 -4
  56. package/dist-client/modeller/figure-thumbnail.js.map +1 -1
  57. package/dist-client/modeller/maturity.js +10 -10
  58. package/dist-client/modeller/maturity.js.map +1 -1
  59. package/dist-client/pages/figure-list-page.d.ts +11 -4
  60. package/dist-client/pages/figure-list-page.js +201 -63
  61. package/dist-client/pages/figure-list-page.js.map +1 -1
  62. package/dist-client/pages/figure-modeller-page.d.ts +33 -0
  63. package/dist-client/pages/figure-modeller-page.js +156 -42
  64. package/dist-client/pages/figure-modeller-page.js.map +1 -1
  65. package/dist-client/tsconfig.tsbuildinfo +1 -1
  66. package/dist-client/types.d.ts +29 -0
  67. package/dist-client/types.js.map +1 -1
  68. package/dist-client/viewparts/figure-thumb.d.ts +29 -0
  69. package/dist-client/viewparts/figure-thumb.js +242 -0
  70. package/dist-client/viewparts/figure-thumb.js.map +1 -0
  71. package/dist-server/tsconfig.tsbuildinfo +1 -1
  72. package/package.json +6 -5
  73. package/test/i18n-prefix-guard.test.ts +171 -0
  74. package/test/korean-register-guard.test.ts +83 -0
  75. package/translations/en.json +351 -264
  76. package/translations/ja.json +276 -264
  77. package/translations/ko.json +351 -264
  78. package/translations/ms.json +276 -264
  79. package/translations/zh.json +276 -264
@@ -1,266 +1,353 @@
1
1
  {
2
- "button.ask": "ask",
3
- "button.attach-a-picture": "image",
4
- "button.center-x": "centre X",
5
- "button.center-z": "centre Z",
6
- "button.clear-filters": "clear filters",
7
- "button.close": "close",
8
- "button.delete": "delete",
9
- "button.discard": "discard",
10
- "button.duplicate-part": "duplicate",
11
- "button.mirror-x": "mirror X",
12
- "button.mirror-z": "mirror Z",
13
- "button.move-part-down": "move down",
14
- "button.move-part-up": "move up",
15
- "button.new-figure": "new figure",
16
- "button.release": "release",
17
- "button.remove-part": "delete",
18
- "button.reset-view": "reset",
19
- "button.revert": "revert",
20
- "button.save": "save",
21
- "button.see-the-trend-chart": "see the trend chart",
22
- "button.snap": "snap",
23
- "button.take-it": "apply",
24
- "button.take-n-changes": "apply {n}",
25
- "button.to-floor": "to floor",
26
- "button.try-again": "try again",
27
- "label.all": "all",
28
- "label.axis-consistency": "visual consistency",
29
- "label.axis-consistency-short": "consistency",
30
- "label.axis-depth": "depth",
31
- "label.axis-detail": "level fidelity",
32
- "label.axis-detail-short": "fidelity",
33
- "label.axis-height": "height",
34
- "label.axis-labels": "axis labels",
35
- "label.axis-reactive": "state display",
36
- "label.axis-reactive-short": "state",
37
- "label.axis-readable": "recognisability",
38
- "label.axis-readable-short": "recognition",
39
- "label.axis-reuse": "shape reuse",
40
- "label.axis-reuse-short": "reuse",
41
- "label.axis-scale": "scale",
42
- "label.axis-scale-short": "scale",
43
- "label.axis-width": "width",
44
- "label.budget-animations": "animation points",
45
- "label.budget-groups": "material groups",
46
- "label.budget-parts": "part count",
47
- "label.budget-surface": "surfaces outside the palette",
48
- "label.budget-transparent": "transparent materials",
49
- "label.budgets": "budgets",
50
- "label.by-axis": "maturity by axis",
51
- "label.capacity": "placement limit",
52
- "label.cast-shadow": "cast shadow",
53
- "label.coordinate-ground": "coordinate ground",
54
- "label.corner-round": "corner round",
55
- "label.detail-L": "detailed",
56
- "label.detail-M": "normal",
57
- "label.detail-S": "simple",
58
- "label.detail-level": "detail level",
59
- "label.distinct-materials": "distinct materials",
60
- "label.distinct-shapes": "distinct shapes",
61
- "label.draft": "draft",
62
- "label.draw-calls-at-100": "draw calls for 100",
63
- "label.draw-calls-at-10k": "draw calls at 10k instances",
64
- "label.emissive": "emissive",
65
- "label.emissive-color": "lit color",
66
- "label.environment": "environment",
67
- "label.environment-cloudy": "cloudy",
68
- "label.environment-factory": "factory",
69
- "label.environment-home": "home",
70
- "label.environment-office": "office",
71
- "label.environment-rainy": "rainy",
72
- "label.environment-studio": "studio",
73
- "label.environment-sunny": "sunny",
74
- "label.environment-warehouse": "warehouse",
75
- "label.figure": "figure",
76
- "label.findings": "findings",
77
- "label.flat-shading": "flat shading",
78
- "label.floor": "floor",
79
- "label.follow-camera": "follow camera",
80
- "label.guides": "guides",
81
- "label.hemisphere-light": "hemisphere light",
82
- "label.history": "history",
83
- "label.hollow-floor": "floor thickness",
84
- "label.hollow-wall": "wall thickness",
85
- "label.intensity": "intensity",
86
- "label.keep-round": "section",
87
- "label.key-light": "key light",
88
- "label.material": "material",
89
- "label.maturity": "maturity",
90
- "label.mode-edit": "edit",
91
- "label.mode-preview": "preview",
92
- "label.name": "name",
93
- "label.no-color-chosen": "no color set",
94
- "label.none": "none",
95
- "label.now": "current",
96
- "label.on-by-default": "on by default",
97
- "label.palette-token": "palette token",
98
- "label.part": "part",
99
- "label.parts": "parts",
100
- "label.placement": "position and size",
101
- "label.position": "position (centre)",
102
- "label.preset": "preset",
103
- "label.preset-ceramic": "ceramic",
104
- "label.preset-default": "default",
105
- "label.preset-glass": "glass",
106
- "label.preset-metal": "metal",
107
- "label.preset-plastic": "plastic",
108
- "label.preset-rubber": "rubber",
109
- "label.preset-wood": "wood",
110
- "label.primitive-cube": "box",
111
- "label.primitive-cylinder": "cylinder",
112
- "label.primitive-polygon": "polygon",
113
- "label.primitive-rect": "rectangle",
114
- "label.primitive-sphere": "sphere",
115
- "label.primitive-wall": "wall",
116
- "label.properties": "properties",
117
- "label.proposed": "proposed",
118
- "label.release": "release",
119
- "label.released": "released",
120
- "label.released-versions": "released versions",
121
- "label.repeat-axis": "axis it repeats along",
122
- "label.repeat-pitch": "pitch",
123
- "label.reuse-trend": "reuse trend",
124
- "label.rotation-degrees": "rotation (degrees)",
125
- "label.same-as-off": "same as unlit",
126
- "label.segments": "segments",
127
- "label.shape": "shape",
128
- "label.shape-detail": "shape detail",
129
- "label.shapes": "shapes",
130
- "label.size": "size",
131
- "label.sizing-fixed": "keeps its size",
132
- "label.sizing-repeat": "repeats",
133
- "label.sizing-rule": "when the size changes",
134
- "label.sizing-scale": "scales proportionally",
135
- "label.sizing-stretch": "stretches on one axis",
136
- "label.sky-color": "sky color",
137
- "label.state": "state",
138
- "label.status-colors": "lit colors (lamps · indicators)",
139
- "label.tools": "align",
140
- "label.transparent": "transparent",
141
- "label.triangles": "triangles",
142
- "label.triangles-at-100": "triangles for 100",
143
- "label.triangles-at-10k": "triangles at 10k instances",
144
- "label.type": "type",
145
- "label.view": "settings",
146
- "label.weight": "weight",
147
- "text.add-a-shape": "click to add a part",
148
- "text.all-lights-off": "both lights are off. only self-lit surfaces show; everything else goes black — this is how you check whether a lamp is lit.",
149
- "text.already-released-edit-to-release-again": "already released. edit and save to go back to draft, then release again.",
150
- "text.ask-create-example": "e.g. a three-tier conveyor sorter",
151
- "text.ask-revise-example": "e.g. bring it down to two material groups",
152
- "text.ask-to-create": "create",
153
- "text.ask-to-revise": "revise",
154
- "text.asking": "working…",
155
- "text.assistant-proposed-a-figure": "here is a proposal — the result is on the right.",
156
- "text.axes-not-measurable-yet": "axes that cannot be measured yet are left off the chart — {axes}. the reason is listed below.",
157
- "text.bound-by-drawCalls": "draw calls reach the limit first — {per} per instance, against {budget} for a board.",
158
- "text.bound-by-triangles": "triangles reach the limit first — {per} per instance, against {budget} for a board.",
159
- "text.budget-not-measured-yet": "this target has not been measured yet.",
160
- "text.canvas-appears-once-a-part-exists": "the canvas appears once the figure has a part.",
161
- "text.center-on-x": "move to the centre of the base box on X.",
162
- "text.center-on-z": "move to the centre of the base box on Z.",
163
- "text.change-added": "a new part",
164
- "text.change-anchor": "the anchor",
165
- "text.change-base": "the base size",
166
- "text.change-changed": "a changed part",
167
- "text.change-detail": "the detail level",
168
- "text.change-removed": "a part being removed",
169
- "text.change-styleKit": "the style kit",
170
- "text.collapse-parts-pane": "collapse the part list",
171
- "text.collapse-properties-pane": "collapse the property pane",
172
- "text.coordinate-ground-explained": "draws the origin and a grid on the floor",
173
- "text.could-not-load-figures": "could not load the figures",
174
- "text.delete-figure-confirm": "delete {name}? boards already using this type will no longer find it.",
175
- "text.detail-level-explained": "declares how detailed this figure is meant to be. S simple suits signs and posts, M normal suits most equipment, L detailed suits the large equipment a view is built around. the level sets the part limit, and maturity checks whether the figure lives up to it.",
176
- "text.editing-tools-come-next": "the shape palette and part editor are not built yet — for now you can open, review and save.",
177
- "text.emissive-explained": "the surface lights itself. 0 means it is not a lamp. it does not spill onto its surroundings.",
178
- "text.environment-explained": "sets what metal surfaces reflect. it does not change the shape.",
179
- "text.expand-parts-pane": "expand the part list",
180
- "text.expand-properties-pane": "expand the property pane",
181
- "text.figure-count": "{count} figures",
182
- "text.figure-display-name": "display name",
183
- "text.fits-n-instances": "up to {n}",
184
- "text.floor-explained": "overlaps the coordinate ground, so usually off",
185
- "text.follow-camera-explained": "turn off to fix the shadow direction",
186
- "text.grade-decided-by": "what decided the grade",
187
- "text.grade-explained": "the grade comes from how much of a declared limit is used, taking the one closest to its cap. averaging would hide a full limit behind the loose ones.",
188
- "text.grade-scale-lead": "grade scale (limit used)",
189
- "text.headroom-percent": "{percent}% headroom",
190
- "text.hemisphere-light-explained": "even light from sky and ground. it lifts the shaded faces.",
191
- "text.hide-all-parts": "hide all",
192
- "text.hide-this-part": "hide this part while you work. not saved",
193
- "text.how-many-fit": "how many one drawing holds before the overhead shows",
194
- "text.instances-unit": "instances",
195
- "text.keep-round-cost": "1 draw call",
196
- "text.keep-round-merged": "merged into a group",
197
- "text.keep-round-off": "off",
198
- "text.keep-round-on": "keep round",
199
- "text.limit-comes-from-level": "the detail level sets this limit.",
200
- "text.maturity-blocked-needs-render": "this can only be known by rendering. the top-view silhouette measurement is not built yet.",
201
- "text.maturity-blocked-no-binding": "the format has no way to connect a state value to a part yet, and the renderer does not read it.",
202
- "text.maturity-blocked-no-parts": "nothing to measurethere are no parts.",
203
- "text.maturity-consistency-because": "checks textures, segment presets and material count what it takes to sit well with other assets and stay crisp when zoomed.",
204
- "text.maturity-consistency-clean": "no issues",
205
- "text.maturity-consistency-faults": "has issues",
206
- "text.maturity-detail-because": "how much of the declared level you actually used.",
207
- "text.maturity-readable-because": "how many distinct colour regions are visible from directly above, and how evenly. Viewpoint entropy (Vazquez et al.) computed over colour regions rather than faces — counting faces would reward raising the segment count alone.",
208
- "text.maturity-reuse-because": "shapes saved because several parts share one. a low number is not a fault.",
209
- "text.maturity-scale-because": "measured against a board holding 500 assets.",
210
- "text.mirror-explained": "adds a mirrored copy on the other side — for parts that come in pairs, like legs or arms.",
211
- "text.mirror-would-overlap": "already centred — a mirror would land in the same place and overlap.",
212
- "text.mode-edit-explained": "place and edit parts. always at the base size.",
213
- "text.mode-preview-explained": "how it looks placed on a board. base size next to the enlarged ones.",
214
- "text.n-of-limit": "{used} / {limit}",
215
- "text.n-parts-at-most": "up to {limit} parts",
216
- "text.n-triangles": "{count} triangles",
217
- "text.no-figure-matches-the-filter": "nothing matches",
218
- "text.no-figure-yet": "no figures yet",
219
- "text.no-findings": "nothing to report.",
220
- "text.not-measurable-yet": "not measurable",
221
- "text.not-measured-yet": "not measured",
222
- "text.nothing-released-yet": "nothing released yet. releasing keeps the figure as it is now, as a version.",
223
- "text.on-by-default-explained": "the starting state when placed on a board. an instance switching it wins.",
224
- "text.other-segment-count": "enter a value",
225
- "text.part-limit-reached": "the detail level allows no more parts — raise the level or remove a part.",
226
- "text.part-limit-reached-short": "level {level} allows {limit} parts. Raise the level or remove a part.",
227
- "text.pick-a-shape-above-to-start": "pick a shape above to add the first part.",
228
- "text.picked-changes-do-not-validate": "the selected changes do not make a valid figure",
229
- "text.picture-is-for-proportions": "used for proportions and form, not for surface detail.",
230
- "text.preview-blocked-by-errors": "cannot build — the figure breaks the format. the maturity tab has the reason.",
231
- "text.preview-needs-a-part": "add a part and the board view appears here.",
232
- "text.put-on-floor": "drop it to the floor (Z=0).",
233
- "text.release-needs-a-save-first": "there are unsaved changes. a release publishes what was saved, so save first.",
234
- "text.releasing": "releasing…",
235
- "text.renaming-a-part-breaks-bindings": "the name is a stored identifier changing it breaks bindings on instances already placed.",
236
- "text.repeat-edits-the-unit": "you author one unit even though several appear. the gizmo moves the whole run, while size and rotation apply to that one unit — the pitch is declared separately so the layout stays. a single copy cannot be edited on its own.",
237
- "text.repeat-pitch-explained": "centre to centre distance. it does not depend on the part size, so widening or turning the part leaves the layout alone.",
238
- "text.report-appears-when-you-add-a-part": "weight and score appear once the figure has a part.",
239
- "text.reuse-score-explained": "how much headroom is left in the declared limits. the one closest to its cap sets the score.",
240
- "text.revert-to-version-confirm": "revert to v{version}? what you are working on will be replaced by that version.",
241
- "text.save-the-figure-before-releasing": "this figure has not been saved yet. save it and you can release it.",
242
- "text.saving": "saving",
243
- "text.search-figure-by-name-or-type": "search by name or type",
244
- "text.select-a-part-to-edit": "select a part to edit it here.",
245
- "text.show-all-parts": "show all",
246
- "text.show-this-part": "show this part again",
247
- "text.sizing-costs-one-draw-call": "a part that does not scale proportionally cannot be merged with the others, so it costs one more draw call. that shows up in the group count under maturity.",
248
- "text.sizing-fixed-explained": "the size stays, only the position follows like a motor or a gauge.",
249
- "text.sizing-repeat-explained": "the count grows instead of the size. the shape is shared so vertices do not grow, but each copy costs one draw call.",
250
- "text.sizing-scale-explained": "this part grows with the instance.",
251
- "text.sizing-stretch-explained": "only one axis stretches — like a frame, a belt or a rail.",
252
- "text.snap-explained": "rounds position and size to the grid — the same spacing you see on the canvas.",
253
- "text.stretch-axis-now": "the {axis} axis stretches. it is the longest axis of this part.",
254
- "text.thumbnail-not-made-yet": "no thumbnail yet",
255
- "text.triangle-count": "{count} triangles",
256
- "text.try-clearing-the-search-or-state-filter": "clear the search box or the state filter to see everything.",
257
- "text.type-name-already-taken": "the type name {type} is already in use. pick another one — it cannot be changed later.",
258
- "text.type-name-cannot-change": "the type name is a stored identifier and cannot be changed after creation.",
259
- "text.unsaved-changes": "unsaved",
260
- "text.version-number": "v{version}",
261
- "text.view-settings-are-not-saved": "these settings are not saved. they make the view comfortable to work in and do not travel with the asset.",
262
- "text.what-a-figure-is": "a Figure is a 3D component you author. Compose it from simple shapes and it becomes a component you can place on a board, sharing shape and material across every instance.",
263
- "text.what-changed-in-this-release": "what changed in this release",
264
- "title.figures": "figures",
265
- "title.new-figure": "new figure"
2
+ "figure.button.add-channel": "add channel",
3
+ "figure.button.add-clip": "add clip",
4
+ "figure.button.add-key": "add key",
5
+ "figure.button.ask": "ask",
6
+ "figure.button.attach-a-picture": "image",
7
+ "figure.button.center-x": "centre X",
8
+ "figure.button.center-z": "centre Z",
9
+ "figure.button.close": "close",
10
+ "figure.button.delete-figure": "delete",
11
+ "figure.button.discard": "discard",
12
+ "figure.button.duplicate-part": "duplicate",
13
+ "figure.button.mirror-x": "mirror X",
14
+ "figure.button.mirror-z": "mirror Z",
15
+ "figure.button.move-part-down": "move down",
16
+ "figure.button.move-part-up": "move up",
17
+ "figure.button.new-figure": "new figure",
18
+ "figure.button.pivot-clear": "part centre",
19
+ "figure.button.pivot-set": "set",
20
+ "figure.button.release-figure": "release",
21
+ "figure.button.remove": "remove",
22
+ "figure.button.remove-part": "delete",
23
+ "figure.button.reset-view": "reset",
24
+ "figure.button.revert": "revert",
25
+ "figure.button.save": "save",
26
+ "figure.button.see-the-trend-chart": "see the trend chart",
27
+ "figure.button.snap": "snap",
28
+ "figure.button.take-n-changes": "apply {n}",
29
+ "figure.button.to-floor": "to floor",
30
+ "figure.label.accepts": "accepts",
31
+ "figure.label.anchor": "holds which face",
32
+ "figure.label.anchor-aspect-x": "grows only as much as x does (keeps ratio)",
33
+ "figure.label.anchor-aspect-y": "grows only as much as y does (keeps ratio)",
34
+ "figure.label.anchor-aspect-z": "grows only as much as z does (keeps ratio)",
35
+ "figure.label.anchor-auto": "automatic ({rule})",
36
+ "figure.label.anchor-center": "stays centred, keeps its size",
37
+ "figure.label.anchor-max": "stays on the upper face",
38
+ "figure.label.anchor-max-x": "stays on the right face",
39
+ "figure.label.anchor-max-y": "stays on the top face",
40
+ "figure.label.anchor-max-z": "stays on the front face",
41
+ "figure.label.anchor-min": "stays on the lower face",
42
+ "figure.label.anchor-min-x": "stays on the left face",
43
+ "figure.label.anchor-min-y": "stays on the bottom face",
44
+ "figure.label.anchor-min-z": "stays on the back face",
45
+ "figure.label.anchor-scale": "grows with the box",
46
+ "figure.label.anchor-span": "touches both faces, fills between",
47
+ "figure.label.animation": "animation",
48
+ "figure.label.axis-consistency": "visual consistency",
49
+ "figure.label.axis-consistency-short": "consistency",
50
+ "figure.label.axis-depth": "depth",
51
+ "figure.label.axis-detail": "level fidelity",
52
+ "figure.label.axis-detail-short": "fidelity",
53
+ "figure.label.axis-height": "height",
54
+ "figure.label.axis-labels": "axis labels",
55
+ "figure.label.axis-reactive": "state display",
56
+ "figure.label.axis-reactive-short": "state",
57
+ "figure.label.axis-readable": "recognisability",
58
+ "figure.label.axis-readable-short": "recognition",
59
+ "figure.label.axis-reuse": "shape reuse",
60
+ "figure.label.axis-reuse-short": "reuse",
61
+ "figure.label.axis-scale": "scale",
62
+ "figure.label.axis-scale-short": "scale",
63
+ "figure.label.axis-width": "width",
64
+ "figure.label.budget-animations": "moving parts",
65
+ "figure.label.budget-groups": "material groups",
66
+ "figure.label.budget-parts": "part count",
67
+ "figure.label.budget-surface": "surfaces outside the palette",
68
+ "figure.label.budget-transparent": "transparent materials",
69
+ "figure.label.budgets": "budgets",
70
+ "figure.label.by-axis": "maturity by axis",
71
+ "figure.label.cast-shadow": "cast shadow",
72
+ "figure.label.category": "category",
73
+ "figure.label.channel-path": "moves",
74
+ "figure.label.channel-pivot": "pivot",
75
+ "figure.label.channel-target": "part",
76
+ "figure.label.channels": "channels",
77
+ "figure.label.clip-name": "clip name",
78
+ "figure.label.coordinate-ground": "coordinate ground",
79
+ "figure.label.corner-round": "corner round",
80
+ "figure.label.detail-L": "detailed",
81
+ "figure.label.detail-M": "normal",
82
+ "figure.label.detail-S": "simple",
83
+ "figure.label.detail-level": "detail level",
84
+ "figure.label.distinct-materials": "distinct materials",
85
+ "figure.label.distinct-shapes": "distinct shapes",
86
+ "figure.label.draft": "draft",
87
+ "figure.label.draw-calls-at-100": "draw calls for 100",
88
+ "figure.label.draw-calls-at-10k": "draw calls at 10k instances",
89
+ "figure.label.drive-hold": "position",
90
+ "figure.label.drive-loop": "speed",
91
+ "figure.label.emissive": "emissive",
92
+ "figure.label.emissive-color": "lit color",
93
+ "figure.label.environment": "environment",
94
+ "figure.label.environment-cloudy": "cloudy",
95
+ "figure.label.environment-factory": "factory",
96
+ "figure.label.environment-home": "home",
97
+ "figure.label.environment-office": "office",
98
+ "figure.label.environment-rainy": "rainy",
99
+ "figure.label.environment-studio": "studio",
100
+ "figure.label.environment-sunny": "sunny",
101
+ "figure.label.environment-warehouse": "warehouse",
102
+ "figure.label.figure": "figure",
103
+ "figure.label.figure-released": "released",
104
+ "figure.label.figure-type": "type",
105
+ "figure.label.findings": "findings",
106
+ "figure.label.flat-shading": "flat shading",
107
+ "figure.label.follow-camera": "follow camera",
108
+ "figure.label.guides": "guides",
109
+ "figure.label.help": "help",
110
+ "figure.label.hemisphere-light": "hemisphere light",
111
+ "figure.label.history": "history",
112
+ "figure.label.hollow-floor": "floor thickness",
113
+ "figure.label.hollow-wall": "wall thickness",
114
+ "figure.label.intensity": "intensity",
115
+ "figure.label.interpolation-linear": "smooth",
116
+ "figure.label.interpolation-step": "stepped",
117
+ "figure.label.keep-round": "section",
118
+ "figure.label.key-at": "at (s)",
119
+ "figure.label.key-light": "key light",
120
+ "figure.label.maturity": "maturity",
121
+ "figure.label.mode-edit": "edit",
122
+ "figure.label.mode-preview": "preview",
123
+ "figure.label.name": "name",
124
+ "figure.label.no-color-chosen": "no color set",
125
+ "figure.label.none": "none",
126
+ "figure.label.now": "current",
127
+ "figure.label.on-by-default": "on by default",
128
+ "figure.label.palette-token": "palette token",
129
+ "figure.label.part": "part",
130
+ "figure.label.part-material": "material",
131
+ "figure.label.part-position": "position (centre)",
132
+ "figure.label.part-size": "size",
133
+ "figure.label.parts": "parts",
134
+ "figure.label.path-rotation": "rotation",
135
+ "figure.label.path-scale": "scale",
136
+ "figure.label.path-translation": "offset",
137
+ "figure.label.placement": "position and size",
138
+ "figure.label.placement-limit": "placement limit",
139
+ "figure.label.preset": "preset",
140
+ "figure.label.preset-ceramic": "ceramic",
141
+ "figure.label.preset-default": "default",
142
+ "figure.label.preset-glass": "glass",
143
+ "figure.label.preset-metal": "metal",
144
+ "figure.label.preset-plastic": "plastic",
145
+ "figure.label.preset-rubber": "rubber",
146
+ "figure.label.preset-wood": "wood",
147
+ "figure.label.primitive-cube": "box",
148
+ "figure.label.primitive-cylinder": "cylinder",
149
+ "figure.label.primitive-polygon": "polygon",
150
+ "figure.label.primitive-rect": "rectangle",
151
+ "figure.label.primitive-sphere": "sphere",
152
+ "figure.label.primitive-wall": "wall",
153
+ "figure.label.properties": "properties",
154
+ "figure.label.proposed": "proposed",
155
+ "figure.label.release": "release",
156
+ "figure.label.released-versions": "released versions",
157
+ "figure.label.repeat-axis": "axis it repeats along",
158
+ "figure.label.repeat-count": "count",
159
+ "figure.label.repeat-pitch": "pitch",
160
+ "figure.label.reuse-trend": "reuse trend",
161
+ "figure.label.role-in-capability": "role in the capability",
162
+ "figure.label.role-port-in": "inbound port",
163
+ "figure.label.role-port-out": "outbound port",
164
+ "figure.label.role-slot": "slot",
165
+ "figure.label.rotation-degrees": "rotation (degrees)",
166
+ "figure.label.rung-flow": "things flow through",
167
+ "figure.label.rung-hold": "holds things",
168
+ "figure.label.rung-none": "draws only",
169
+ "figure.label.same-as-off": "same as unlit",
170
+ "figure.label.scene-floor": "floor",
171
+ "figure.label.segments": "segments",
172
+ "figure.label.shape": "shape",
173
+ "figure.label.shape-detail": "shape detail",
174
+ "figure.label.shapes": "shapes",
175
+ "figure.label.sizing-fixed": "keeps its size",
176
+ "figure.label.sizing-repeat": "repeats",
177
+ "figure.label.sizing-rule": "when the size changes",
178
+ "figure.label.sizing-scale": "scales proportionally",
179
+ "figure.label.sizing-stretch": "stretches on one axis",
180
+ "figure.label.sky-color": "sky color",
181
+ "figure.label.slot-capacity": "capacity",
182
+ "figure.label.slots-and-ports": "slots and ports",
183
+ "figure.label.state": "state",
184
+ "figure.label.status-colors": "lit colors (lamps · indicators)",
185
+ "figure.label.tab-capability": "capability",
186
+ "figure.label.tab-environment": "environment",
187
+ "figure.label.tags": "tags",
188
+ "figure.label.tools": "align",
189
+ "figure.label.transparent": "transparent",
190
+ "figure.label.triangles": "triangles",
191
+ "figure.label.triangles-at-100": "triangles for 100",
192
+ "figure.label.triangles-at-10k": "triangles at 10k instances",
193
+ "figure.label.weight": "drawing cost",
194
+ "figure.label.what-this-does": "what this figure does",
195
+ "figure.text.accepts-anything": "empty means anything",
196
+ "figure.text.accepts-explained": "only these types can be placed here. empty means no restriction. separate several with commas",
197
+ "figure.text.add-a-shape": "click to add a part",
198
+ "figure.text.all-lights-off": "both lights are off. only self-lit surfaces show; everything else goes black — this is how you check whether a lamp is lit.",
199
+ "figure.text.already-released-edit-to-release-again": "already released. edit and save to go back to draft, then release again.",
200
+ "figure.text.anchor-explained": "where this part stays as the box grows. Two touching parts on different faces drift apart as it grows.",
201
+ "figure.text.anchors-are-not-drawn": "a slot is where things are placed, a port is where things enter and leave. neither is drawn on a board; the editor shows their positions",
202
+ "figure.text.animated-parts-cost": "A moving part is drawn on its own one more draw call each, and a matrix update every frame.",
203
+ "figure.text.animated-parts-over": "Over the limit. Nothing is blocked, but many of these on one board will cost frames.",
204
+ "figure.text.animation-empty-examples": "A turning roller · a sliding door leaf · a rising lift · a blinking beacon.",
205
+ "figure.text.animation-empty-what-it-is": "This figure does not move yet. A clip is one set of motion across several parts — a door opening is the two leaves sliding apart, not two separate things.",
206
+ "figure.text.animation-is-driven-by-a-fact": "One clip moves several parts together. On a board a fact sets its value — “this door is 40% open”.",
207
+ "figure.text.animation-needs-a-named-part": "Add a part first. A channel names the part it moves.",
208
+ "figure.text.ask-create-example": "e.g. a three-tier conveyor sorter",
209
+ "figure.text.ask-revise-example": "e.g. bring it down to two material groups",
210
+ "figure.text.ask-to-create": "create",
211
+ "figure.text.ask-to-revise": "revise",
212
+ "figure.text.asking": "working…",
213
+ "figure.text.assistant-proposed-a-figure": "here is a proposal the result is on the right.",
214
+ "figure.text.axes-not-measurable-yet": "axes that cannot be measured yet are left off the chart — {axes}. the reason is listed below.",
215
+ "figure.text.bound-by-drawCalls": "draw calls reach the limit first — {per} per instance, against {budget} for a board.",
216
+ "figure.text.bound-by-triangles": "triangles reach the limit first — {per} per instance, against {budget} for a board.",
217
+ "figure.text.budget-not-measured-yet": "this target has not been measured yet.",
218
+ "figure.text.cannot-release-now": "cannot be released yet",
219
+ "figure.text.canvas-appears-once-a-part-exists": "the editing area where you place and move parts. pick one from shapes on the left to start.",
220
+ "figure.text.capability-hand-written": "these capabilities were set by hand and match no rung. the names below are what gets stored",
221
+ "figure.text.capacity-from-repeat": "capacity comes from the repeat setting and the instance size",
222
+ "figure.text.category-explained": "how the palette groups figures. one per figure — a figure in two groups meets the author twice.",
223
+ "figure.text.category-placeholder": "e.g. conveyor",
224
+ "figure.text.center-on-x": "move to the centre of the base box on X.",
225
+ "figure.text.center-on-z": "move to the centre of the base box on Z.",
226
+ "figure.text.change-added": "a new part",
227
+ "figure.text.change-anchor": "the anchor",
228
+ "figure.text.change-base": "the base size",
229
+ "figure.text.change-changed": "a changed part",
230
+ "figure.text.change-detail": "the detail level",
231
+ "figure.text.change-removed": "a part being removed",
232
+ "figure.text.change-styleKit": "the style kit",
233
+ "figure.text.channel-target-is-gone": "No such part. If you renamed the part, pick it again here.",
234
+ "figure.text.clip-name-is-how-it-is-driven": "An instance drives the clip by this name.",
235
+ "figure.text.clip-name-taken": "Another clip already has this name. Instances drive by name, so two cannot share one.",
236
+ "figure.text.clip-needs-a-channel": "With no channel there is nothing to move.",
237
+ "figure.text.clip-needs-a-name": "Without a name nothing can drive it.",
238
+ "figure.text.collapse-parts-pane": "collapse the part list",
239
+ "figure.text.collapse-properties-pane": "collapse the property pane",
240
+ "figure.text.coordinate-ground-explained": "draws the origin and a grid on the floor",
241
+ "figure.text.delete-figure-confirm": "delete {name}? boards already using this type will no longer find it.",
242
+ "figure.text.designate-in-properties": "nothing designated yet. select a part and set its role in the properties tab",
243
+ "figure.text.detail-level-explained": "declares how detailed this figure is meant to be. S simple suits signs and posts, M normal suits most equipment, L detailed suits the large equipment a view is built around. the level sets the part limit, and maturity checks whether the figure lives up to it.",
244
+ "figure.text.discard-changes-and-start-new": "there are unsaved changes. discard them and start a new figure?",
245
+ "figure.text.does-not-block": "does not block",
246
+ "figure.text.drive-explained": "How the value an instance gives is read.",
247
+ "figure.text.drive-hold-note": "Time is held. The value an instance gives is a position from 0 to 1 how far open a door is.",
248
+ "figure.text.drive-loop-note": "Time runs. The value an instance gives is a speed a turning roller works this way.",
249
+ "figure.text.emissive-explained": "the surface lights itself. 0 means it is not a lamp. it does not spill onto its surroundings.",
250
+ "figure.text.environment-explained": "sets what metal surfaces reflect. it does not change the shape.",
251
+ "figure.text.expand-parts-pane": "expand the part list",
252
+ "figure.text.expand-properties-pane": "expand the property pane",
253
+ "figure.text.figure-display-name": "display name",
254
+ "figure.text.find-by-this-tag": "find by this tag",
255
+ "figure.text.fits-n-instances": "up to {n}",
256
+ "figure.text.floor-explained": "overlaps the coordinate ground, so usually off",
257
+ "figure.text.follow-camera-explained": "turn off to fix the shadow direction",
258
+ "figure.text.grade-decided-by": "what decided the grade",
259
+ "figure.text.grade-explained": "the grade comes from how much of a declared limit is used, taking the one closest to its cap. averaging would hide a full limit behind the loose ones.",
260
+ "figure.text.grade-scale-lead": "grade scale (limit used)",
261
+ "figure.text.headroom-percent": "{percent}% headroom",
262
+ "figure.text.hemisphere-light-explained": "even light from sky and ground. it lifts the shaded faces.",
263
+ "figure.text.hide-all-parts": "hide all",
264
+ "figure.text.hide-this-part": "hide this part while you work. not saved",
265
+ "figure.text.how-many-fit": "how many fit on one board before it slows down",
266
+ "figure.text.instances-unit": "instances",
267
+ "figure.text.interpolation-explained": "How the gap between keys is filled.",
268
+ "figure.text.keep-round-cost": "1 draw call",
269
+ "figure.text.keep-round-merged": "merged into a group",
270
+ "figure.text.keep-round-off": "off",
271
+ "figure.text.keep-round-on": "keep round",
272
+ "figure.text.keys-must-rise": "Each key must come after the one before it.",
273
+ "figure.text.limit-comes-from-level": "the detail level sets this limit.",
274
+ "figure.text.maturity-blocked-no-binding": "the format has no way to connect a state value to a part yet, and the renderer does not read it.",
275
+ "figure.text.maturity-blocked-no-parts": "nothing to measure — there are no parts.",
276
+ "figure.text.maturity-consistency-because": "checks textures, segment presets and material count — what it takes to sit well with other assets and stay crisp when zoomed.",
277
+ "figure.text.maturity-consistency-clean": "no issues",
278
+ "figure.text.maturity-consistency-faults": "has issues",
279
+ "figure.text.maturity-detail-because": "how much of the declared level you actually used.",
280
+ "figure.text.maturity-readable-because": "how many distinct colour regions are visible from directly above, and how evenly. Viewpoint entropy (Vazquez et al.) computed over colour regions rather than faces — counting faces would reward raising the segment count alone.",
281
+ "figure.text.maturity-reuse-because": "shapes saved because several parts share one. a low number is not a fault.",
282
+ "figure.text.maturity-scale-because": "measured against a board holding 500 assets.",
283
+ "figure.text.mirror-explained": "adds a mirrored copy on the other side — for parts that come in pairs, like legs or arms.",
284
+ "figure.text.mirror-would-overlap": "already centred — a mirror would land in the same place and overlap.",
285
+ "figure.text.mode-edit-explained": "place and edit parts. always at the base size.",
286
+ "figure.text.mode-preview-explained": "how it looks placed on a board. base size next to the enlarged ones.",
287
+ "figure.text.must-fix-to-release": "fix these first",
288
+ "figure.text.n-of-limit": "{used} / {limit}",
289
+ "figure.text.n-parts-at-most": "up to {limit} parts",
290
+ "figure.text.n-triangles": "{count} triangles",
291
+ "figure.text.no-figure-yet": "no figures yet",
292
+ "figure.text.no-findings": "nothing to report.",
293
+ "figure.text.not-measurable-yet": "not measurable",
294
+ "figure.text.not-measured-yet": "not measured",
295
+ "figure.text.nothing-released-yet": "nothing released yet. releasing keeps the figure as it is now, as a version.",
296
+ "figure.text.on-by-default-explained": "the starting state when placed on a board. an instance switching it wins.",
297
+ "figure.text.other-segment-count": "enter a value",
298
+ "figure.text.part-limit-reached": "the detail level allows no more parts — raise the level or remove a part.",
299
+ "figure.text.part-limit-reached-short": "level {level} allows {limit} parts. Raise the level or remove a part.",
300
+ "figure.text.path-rotation-unit": "Euler degrees — the same convention as the part's own rotation.",
301
+ "figure.text.path-scale-unit": "A ratio. 1 is full size; 0 makes the part vanish.",
302
+ "figure.text.path-translation-unit": "Offset from where the part sits. 0 leaves it in place.",
303
+ "figure.text.pick-a-shape-above-to-start": "pick a shape above to add the first part.",
304
+ "figure.text.picked-changes-do-not-validate": "the selected changes do not make a valid figure",
305
+ "figure.text.picture-is-for-proportions": "used for proportions and form, not for surface detail.",
306
+ "figure.text.pivot-defaults-to-the-part-centre": "Left unset, the part turns about its own centre. Coordinates are local to the part.",
307
+ "figure.text.preview-blocked-by-errors": "cannot build — the figure breaks the format. the maturity tab has the reason.",
308
+ "figure.text.preview-needs-a-part": "shows how it looks placed on a board. appears once you make a part.",
309
+ "figure.text.put-on-floor": "drop it to the floor (Z=0).",
310
+ "figure.text.release-needs-a-save-first": "there are unsaved changes. a release publishes what was saved, so save first.",
311
+ "figure.text.releasing": "releasing…",
312
+ "figure.text.renaming-a-part-breaks-bindings": "the name is a stored identifier — changing it breaks bindings on instances already placed.",
313
+ "figure.text.repeat-count-capped": "stops at {limit} — each copy is one draw call",
314
+ "figure.text.repeat-count-now": "{count} at the authored size",
315
+ "figure.text.repeat-edits-the-unit": "you author one unit even though several appear. the gizmo moves the whole run, while size and rotation apply to that one unit — the pitch is declared separately so the layout stays. a single copy cannot be edited on its own.",
316
+ "figure.text.repeat-grows-with-instance": "the count grows as the instance grows on this axis. the pitch stays",
317
+ "figure.text.repeat-keeps-count": "the count stays and each copy grows, because this axis anchors to scale",
318
+ "figure.text.repeat-pitch-explained": "centre to centre distance. it does not depend on the part size, so widening or turning the part leaves the layout alone.",
319
+ "figure.text.report-appears-when-you-add-a-part": "shows triangles, draw calls, and how many fit on one board. measured once you make a part.",
320
+ "figure.text.reuse-score-explained": "how much headroom is left in the declared limits. the one closest to its cap sets the score.",
321
+ "figure.text.revert-to-version-confirm": "revert to v{version}? what you are working on will be replaced by that version.",
322
+ "figure.text.role-none-means-drawn": "with none checked this is just a drawn part",
323
+ "figure.text.rung-flow-note": "holds, and takes in and sends out through ports. conveyors, chutes, sorters",
324
+ "figure.text.rung-hold-note": "has places to put things. racks, pallets, benches",
325
+ "figure.text.rung-none-note": "takes nothing. most figures belong here",
326
+ "figure.text.save-the-figure-before-releasing": "this figure has not been saved yet. save it and you can release it.",
327
+ "figure.text.saving-figure": "saving",
328
+ "figure.text.search-figure": "search by name, type, description, category or tag",
329
+ "figure.text.select-a-part-to-edit": "select a part to edit it here.",
330
+ "figure.text.show-all-parts": "show all",
331
+ "figure.text.show-this-part": "show this part again",
332
+ "figure.text.sizing-costs-one-draw-call": "a part that does not scale proportionally cannot be merged with the others, so it costs one more draw call. that shows up in the group count under maturity.",
333
+ "figure.text.sizing-fixed-explained": "the size stays, only the position follows — like a motor or a gauge.",
334
+ "figure.text.sizing-repeat-explained": "the count grows instead of the size. the shape is shared so vertices do not grow, but each copy costs one draw call.",
335
+ "figure.text.sizing-scale-explained": "this part grows with the instance.",
336
+ "figure.text.sizing-stretch-explained": "only one axis stretches — like a frame, a belt or a rail.",
337
+ "figure.text.slots-need-capability": "select \"holds things\" or above before designating a slot",
338
+ "figure.text.snap-explained": "rounds position and size to the grid — the same spacing you see on the canvas.",
339
+ "figure.text.tags-explained": "for the finding a single category cannot do. a figure may carry several — a conveyor that is also outbound. separate them with commas.",
340
+ "figure.text.tags-placeholder": "e.g. outbound, automatic, level 2",
341
+ "figure.text.thumbnail-not-made-yet": "no thumbnail yet",
342
+ "figure.text.triangle-count": "{count} triangles",
343
+ "figure.text.two-keys-at-least": "A channel needs two keys. With one it is not motion, it is a single pose.",
344
+ "figure.text.type-name-already-taken": "the type name {type} is already in use. pick another one — it cannot be changed later.",
345
+ "figure.text.type-name-cannot-change": "the type name is a stored identifier and cannot be changed after creation.",
346
+ "figure.text.unsaved-changes": "unsaved",
347
+ "figure.text.version-number": "v{version}",
348
+ "figure.text.view-settings-are-not-saved": "these settings are not saved. they make the view comfortable to work in and do not travel with the asset.",
349
+ "figure.text.what-a-figure-is": "a Figure is a 3D component you author. Compose it from simple shapes and it becomes a component you can place on a board, sharing shape and material across every instance.",
350
+ "figure.text.what-changed-in-this-release": "what changed in this release",
351
+ "figure.title.figures": "figures",
352
+ "figure.title.new-figure": "new figure"
266
353
  }