@things-factory/figure-ui 10.1.151 → 10.1.153
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.
- package/client/modeller/ai-proposal.ts +14 -13
- package/client/modeller/command-preview-controller.ts +210 -0
- package/client/modeller/editor-styles.ts +307 -0
- package/client/modeller/editor.ts +65 -634
- package/client/modeller/fasten-geometry.ts +32 -0
- package/client/modeller/figure-first-save.ts +9 -1
- package/client/modeller/figure-links.ts +32 -14
- package/client/modeller/mesh-import.ts +0 -10
- package/client/modeller/modeller-keys.ts +60 -0
- package/client/modeller/pane-fold.ts +61 -0
- package/client/modeller/panel-memory.ts +53 -0
- package/client/modeller/refusal-teller.ts +93 -0
- package/client/modeller/refusals.ts +32 -2
- package/dist-client/modeller/ai-proposal.d.ts +6 -5
- package/dist-client/modeller/ai-proposal.js +9 -9
- package/dist-client/modeller/ai-proposal.js.map +1 -1
- package/dist-client/modeller/clips.d.ts +1 -1
- package/dist-client/modeller/command-preview-controller.d.ts +75 -0
- package/dist-client/modeller/command-preview-controller.js +178 -0
- package/dist-client/modeller/command-preview-controller.js.map +1 -0
- package/dist-client/modeller/editor-styles.d.ts +2 -0
- package/dist-client/modeller/editor-styles.js +307 -0
- package/dist-client/modeller/editor-styles.js.map +1 -0
- package/dist-client/modeller/editor.d.ts +5 -56
- package/dist-client/modeller/editor.js +76 -656
- package/dist-client/modeller/editor.js.map +1 -1
- package/dist-client/modeller/fasten-geometry.d.ts +13 -0
- package/dist-client/modeller/fasten-geometry.js +29 -0
- package/dist-client/modeller/fasten-geometry.js.map +1 -1
- package/dist-client/modeller/figure-first-save.d.ts +1 -0
- package/dist-client/modeller/figure-first-save.js +8 -1
- package/dist-client/modeller/figure-first-save.js.map +1 -1
- package/dist-client/modeller/figure-links.d.ts +9 -2
- package/dist-client/modeller/figure-links.js +35 -14
- package/dist-client/modeller/figure-links.js.map +1 -1
- package/dist-client/modeller/mesh-import.d.ts +0 -2
- package/dist-client/modeller/mesh-import.js +0 -11
- package/dist-client/modeller/mesh-import.js.map +1 -1
- package/dist-client/modeller/modeller-keys.d.ts +22 -0
- package/dist-client/modeller/modeller-keys.js +43 -0
- package/dist-client/modeller/modeller-keys.js.map +1 -0
- package/dist-client/modeller/pane-fold.d.ts +15 -0
- package/dist-client/modeller/pane-fold.js +60 -0
- package/dist-client/modeller/pane-fold.js.map +1 -0
- package/dist-client/modeller/panel-memory.d.ts +15 -0
- package/dist-client/modeller/panel-memory.js +54 -0
- package/dist-client/modeller/panel-memory.js.map +1 -0
- package/dist-client/modeller/product-session.d.ts +4 -28
- package/dist-client/modeller/refusal-teller.d.ts +36 -0
- package/dist-client/modeller/refusal-teller.js +81 -0
- package/dist-client/modeller/refusal-teller.js.map +1 -0
- package/dist-client/modeller/refusals.d.ts +12 -1
- package/dist-client/modeller/refusals.js +26 -1
- package/dist-client/modeller/refusals.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/test/browser/build.mjs +7 -2
- package/test/browser/editing.check.mjs +14 -0
- package/test/browser/fix-alignment.check.mjs +112 -0
- package/test/browser/links.check.mjs +69 -13
- package/test/browser/mesh-select.check.mjs +91 -0
- package/test/browser/modeller-page.js +36 -0
- package/test/browser/modeller-revision.check.mjs +18 -6
- package/test/browser/modeller.check.mjs +25 -0
- package/test/browser/part-ids.check.mjs +24 -6
- package/test/browser/parts-page.js +9 -1
- package/test/browser/parts.check.mjs +61 -2
- package/test/browser/places-mesh.check.mjs +25 -9
- package/test/browser/product-page.check.mjs +42 -2
- package/test/browser/row-preview.check.mjs +81 -0
- package/test/browser/screen.check.mjs +35 -1
- package/test/clip-ai-proposal.test.ts +4 -1
- package/test/clip-consent.test.ts +9 -2
- package/test/fields.test.ts +5 -9
- package/test/fix-alignment.test.ts +32 -0
- package/test/layout.test.ts +3 -1
- package/test/mesh-import.test.ts +1 -8
- package/test/parts-wiring.test.ts +1 -5
- package/test/refusals.test.ts +46 -10
- package/test/theme.test.ts +5 -15
- package/translations/en.json +8 -0
- package/translations/es.json +8 -0
- package/translations/ja.json +8 -0
- package/translations/ko.json +8 -0
- package/translations/ms.json +8 -0
- package/translations/zh.json +8 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { css } from 'lit';
|
|
2
|
+
/** The modeller editor's own styles: the bar's tools, the panes, the start card, the side's tabs and panels. */
|
|
3
|
+
export const EditorStyles = css `
|
|
4
|
+
:host {
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
min-height: 0;
|
|
8
|
+
height: 100%;
|
|
9
|
+
/* The editor folds by the width it is given, not the window's (UX ruling, 2026-09-24). */
|
|
10
|
+
container-type: inline-size;
|
|
11
|
+
font: 13px sans-serif;
|
|
12
|
+
color: var(--md-sys-color-on-surface);
|
|
13
|
+
}
|
|
14
|
+
/* The bar over the work is ox-canvas-bar (ADR-0060 decision 8): the folds at its edges, undo, redo and
|
|
15
|
+
fit in the suite's places. What the editor puts in it - the mode switch, the status, save - is styled here. */
|
|
16
|
+
ox-canvas-bar button[mode] {
|
|
17
|
+
height: 28px;
|
|
18
|
+
padding: 0 10px;
|
|
19
|
+
border-radius: 999em;
|
|
20
|
+
border-color: transparent;
|
|
21
|
+
background: none;
|
|
22
|
+
}
|
|
23
|
+
ox-canvas-bar button[mode][aria-pressed='true'] {
|
|
24
|
+
border-color: var(--md-sys-color-primary);
|
|
25
|
+
}
|
|
26
|
+
/* The gizmo's tools, drawn as the bar's own icon buttons (undo, redo, fit). */
|
|
27
|
+
ox-canvas-bar .gizmo-tools {
|
|
28
|
+
display: inline-flex;
|
|
29
|
+
gap: 2px;
|
|
30
|
+
padding-left: 4px;
|
|
31
|
+
border-left: 1px solid var(--md-sys-color-outline-variant);
|
|
32
|
+
}
|
|
33
|
+
ox-canvas-bar button[tool] {
|
|
34
|
+
display: inline-grid;
|
|
35
|
+
place-items: center;
|
|
36
|
+
width: 32px;
|
|
37
|
+
height: 32px;
|
|
38
|
+
padding: 0;
|
|
39
|
+
border: none;
|
|
40
|
+
border-radius: var(--md-sys-shape-corner-small, 8px);
|
|
41
|
+
background: transparent;
|
|
42
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
43
|
+
cursor: pointer;
|
|
44
|
+
}
|
|
45
|
+
ox-canvas-bar button[tool]:hover:not(:disabled) {
|
|
46
|
+
background: var(--md-sys-color-surface-container-high);
|
|
47
|
+
color: var(--md-sys-color-on-surface);
|
|
48
|
+
}
|
|
49
|
+
ox-canvas-bar button[tool][aria-pressed='true'] {
|
|
50
|
+
background: var(--md-sys-color-secondary-container);
|
|
51
|
+
color: var(--md-sys-color-on-secondary-container);
|
|
52
|
+
}
|
|
53
|
+
ox-canvas-bar button[tool]:disabled {
|
|
54
|
+
opacity: 0.38;
|
|
55
|
+
cursor: default;
|
|
56
|
+
}
|
|
57
|
+
/*
|
|
58
|
+
Slotted into the bar from here, the tools do not get the bar's own icon size (20px, set inside its shadow): they
|
|
59
|
+
showed at md-icon's 24px, heavier than undo, redo and fit beside them. The same size, and the bar's focus ring.
|
|
60
|
+
*/
|
|
61
|
+
ox-canvas-bar button[tool] md-icon {
|
|
62
|
+
--md-icon-size: 20px;
|
|
63
|
+
}
|
|
64
|
+
ox-canvas-bar button[tool]:focus-visible {
|
|
65
|
+
outline: 2px solid var(--md-sys-color-primary);
|
|
66
|
+
outline-offset: 1px;
|
|
67
|
+
}
|
|
68
|
+
figure-preview {
|
|
69
|
+
min-width: 0;
|
|
70
|
+
min-height: 0;
|
|
71
|
+
}
|
|
72
|
+
/* The edit canvas stays standing while the preview is in front (a 3D scene costs a third of a second to make), out of sight. */
|
|
73
|
+
div[middle][hidden] {
|
|
74
|
+
display: none;
|
|
75
|
+
}
|
|
76
|
+
/* The preview, once made, stays standing out of sight too: its 3D scene is not made again each time it is asked for. */
|
|
77
|
+
figure-preview[hidden] {
|
|
78
|
+
display: none;
|
|
79
|
+
}
|
|
80
|
+
ox-canvas-bar .status {
|
|
81
|
+
padding: 0 8px;
|
|
82
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
83
|
+
}
|
|
84
|
+
ox-canvas-bar .status[dirty] {
|
|
85
|
+
color: var(--md-sys-color-primary);
|
|
86
|
+
font-weight: 600;
|
|
87
|
+
}
|
|
88
|
+
ox-canvas-bar button[save] {
|
|
89
|
+
height: 32px;
|
|
90
|
+
padding: 0 14px;
|
|
91
|
+
border: none;
|
|
92
|
+
border-radius: 999em;
|
|
93
|
+
color: var(--md-sys-color-on-primary);
|
|
94
|
+
background: var(--md-sys-color-primary);
|
|
95
|
+
}
|
|
96
|
+
/* The three panes are ox-three-pane's (ADR-0060 decision 8): widths 200 | 1fr | 340, 160 | 300 under
|
|
97
|
+
860px and one column with the middle first under 560px are the frame's, as are the dividers. */
|
|
98
|
+
ox-three-pane {
|
|
99
|
+
flex: 1;
|
|
100
|
+
min-height: 0;
|
|
101
|
+
}
|
|
102
|
+
figure-parts {
|
|
103
|
+
min-height: 0;
|
|
104
|
+
}
|
|
105
|
+
figure-canvas {
|
|
106
|
+
flex: 1;
|
|
107
|
+
min-width: 0;
|
|
108
|
+
min-height: 0;
|
|
109
|
+
}
|
|
110
|
+
div[middle] {
|
|
111
|
+
position: relative;
|
|
112
|
+
display: flex;
|
|
113
|
+
min-width: 0;
|
|
114
|
+
min-height: 0;
|
|
115
|
+
}
|
|
116
|
+
/* A new figure's first question, over the empty canvas. */
|
|
117
|
+
div[start] {
|
|
118
|
+
position: absolute;
|
|
119
|
+
inset: 50% auto auto 50%;
|
|
120
|
+
z-index: 10;
|
|
121
|
+
color: var(--md-sys-color-on-surface);
|
|
122
|
+
transform: translate(-50%, -50%);
|
|
123
|
+
width: min(440px, calc(100% - 32px));
|
|
124
|
+
box-sizing: border-box;
|
|
125
|
+
padding: 20px;
|
|
126
|
+
border-radius: 12px;
|
|
127
|
+
background: var(--md-sys-color-surface, #fff);
|
|
128
|
+
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.18);
|
|
129
|
+
}
|
|
130
|
+
div[start] button[start-button] {
|
|
131
|
+
width: auto;
|
|
132
|
+
margin: 0;
|
|
133
|
+
font-size: var(--ui-t-body);
|
|
134
|
+
height: 36px;
|
|
135
|
+
padding: 0 16px;
|
|
136
|
+
border: 1px solid var(--md-sys-color-outline);
|
|
137
|
+
border-radius: 999em;
|
|
138
|
+
color: var(--md-sys-color-primary);
|
|
139
|
+
background: var(--md-sys-color-surface, #fff);
|
|
140
|
+
cursor: pointer;
|
|
141
|
+
}
|
|
142
|
+
div[start] button[start-button]:hover:not(:disabled) {
|
|
143
|
+
background: var(--md-sys-color-primary-container);
|
|
144
|
+
}
|
|
145
|
+
div[start] button[start-button][pressed] {
|
|
146
|
+
color: var(--md-sys-color-on-primary);
|
|
147
|
+
background: var(--md-sys-color-primary);
|
|
148
|
+
border-color: var(--md-sys-color-primary);
|
|
149
|
+
}
|
|
150
|
+
div[start] button[start-button]:disabled {
|
|
151
|
+
opacity: 0.5;
|
|
152
|
+
cursor: default;
|
|
153
|
+
}
|
|
154
|
+
div[start] h2 {
|
|
155
|
+
margin: 0 0 12px;
|
|
156
|
+
font-size: var(--ui-t-title);
|
|
157
|
+
}
|
|
158
|
+
div[start-paths] {
|
|
159
|
+
display: grid;
|
|
160
|
+
gap: 14px;
|
|
161
|
+
}
|
|
162
|
+
div[start-paths] h3 {
|
|
163
|
+
margin: 0 0 6px;
|
|
164
|
+
font-size: var(--ui-t-body);
|
|
165
|
+
}
|
|
166
|
+
div[start-shapes] {
|
|
167
|
+
display: flex;
|
|
168
|
+
gap: 8px;
|
|
169
|
+
flex-wrap: wrap;
|
|
170
|
+
}
|
|
171
|
+
div[start] small {
|
|
172
|
+
display: block;
|
|
173
|
+
margin-top: 4px;
|
|
174
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
175
|
+
}
|
|
176
|
+
/* The side: tabs over one panel at a time, each using the whole height. */
|
|
177
|
+
aside {
|
|
178
|
+
display: flex;
|
|
179
|
+
flex-direction: column;
|
|
180
|
+
min-height: 0;
|
|
181
|
+
background: var(--md-sys-color-surface-container-lowest);
|
|
182
|
+
}
|
|
183
|
+
div[tabs] {
|
|
184
|
+
display: flex;
|
|
185
|
+
flex: none;
|
|
186
|
+
border-bottom: 1px solid var(--md-sys-color-outline-variant);
|
|
187
|
+
}
|
|
188
|
+
button[tab] {
|
|
189
|
+
flex: 1;
|
|
190
|
+
position: relative;
|
|
191
|
+
display: flex;
|
|
192
|
+
flex-direction: column;
|
|
193
|
+
align-items: center;
|
|
194
|
+
justify-content: center;
|
|
195
|
+
gap: 1px;
|
|
196
|
+
min-width: 0;
|
|
197
|
+
height: 48px;
|
|
198
|
+
padding: 0;
|
|
199
|
+
border: none;
|
|
200
|
+
border-radius: 0;
|
|
201
|
+
border-bottom: 2px solid transparent;
|
|
202
|
+
background: none;
|
|
203
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
204
|
+
}
|
|
205
|
+
button[tab]:hover:not([on]) {
|
|
206
|
+
background: var(--md-sys-color-surface-container);
|
|
207
|
+
}
|
|
208
|
+
button[tab][on] {
|
|
209
|
+
color: var(--md-sys-color-primary);
|
|
210
|
+
border-bottom-color: var(--md-sys-color-primary);
|
|
211
|
+
}
|
|
212
|
+
button[tab] md-icon {
|
|
213
|
+
font-size: 20px;
|
|
214
|
+
width: 20px;
|
|
215
|
+
height: 20px;
|
|
216
|
+
}
|
|
217
|
+
button[tab] span[tab-label] {
|
|
218
|
+
max-width: 100%;
|
|
219
|
+
overflow: hidden;
|
|
220
|
+
font-size: 0.66rem;
|
|
221
|
+
line-height: 1.2;
|
|
222
|
+
white-space: nowrap;
|
|
223
|
+
text-overflow: ellipsis;
|
|
224
|
+
}
|
|
225
|
+
span[badge] {
|
|
226
|
+
position: absolute;
|
|
227
|
+
top: 3px;
|
|
228
|
+
right: 2px;
|
|
229
|
+
padding: 0 5px;
|
|
230
|
+
font-size: 0.62rem;
|
|
231
|
+
font-weight: 700;
|
|
232
|
+
line-height: 1.5;
|
|
233
|
+
color: var(--md-sys-color-on-primary-container);
|
|
234
|
+
background: var(--md-sys-color-primary-container);
|
|
235
|
+
border-radius: 999em;
|
|
236
|
+
pointer-events: none;
|
|
237
|
+
}
|
|
238
|
+
/* The sections inside carry the margins (side-panel-styles); the panel only scrolls. */
|
|
239
|
+
div[panel] {
|
|
240
|
+
flex: 1;
|
|
241
|
+
min-height: 0;
|
|
242
|
+
overflow: auto;
|
|
243
|
+
padding: 0;
|
|
244
|
+
}
|
|
245
|
+
div[panel][flush] {
|
|
246
|
+
padding: 0;
|
|
247
|
+
}
|
|
248
|
+
/* Hidden, not removed: a panel keeps what it holds (the verdict its last answer) while another tab is open. */
|
|
249
|
+
[off] {
|
|
250
|
+
display: none !important;
|
|
251
|
+
}
|
|
252
|
+
/* Which part the panel speaks of. */
|
|
253
|
+
div[subject] {
|
|
254
|
+
position: sticky;
|
|
255
|
+
top: 0;
|
|
256
|
+
z-index: 1;
|
|
257
|
+
display: grid;
|
|
258
|
+
gap: 4px;
|
|
259
|
+
padding: 10px 12px;
|
|
260
|
+
background: var(--md-sys-color-surface-container-lowest);
|
|
261
|
+
border-bottom: 1px solid var(--md-sys-color-outline-variant);
|
|
262
|
+
}
|
|
263
|
+
/* The panel's three sizes (side-panel-styles): the part's kind at the title's, its two lines at the hint's. */
|
|
264
|
+
div[subject-summary] {
|
|
265
|
+
display: grid;
|
|
266
|
+
gap: 2px;
|
|
267
|
+
}
|
|
268
|
+
div[subject-summary] b {
|
|
269
|
+
font-size: var(--ui-t-body, 13px);
|
|
270
|
+
font-weight: 600;
|
|
271
|
+
}
|
|
272
|
+
div[subject-summary] b span {
|
|
273
|
+
font-weight: 400;
|
|
274
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
275
|
+
}
|
|
276
|
+
div[subject-summary] small {
|
|
277
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
278
|
+
}
|
|
279
|
+
button {
|
|
280
|
+
font: inherit;
|
|
281
|
+
box-sizing: border-box;
|
|
282
|
+
height: 32px;
|
|
283
|
+
border: 1px solid var(--md-sys-color-outline-variant);
|
|
284
|
+
border-radius: 6px;
|
|
285
|
+
background: var(--md-sys-color-surface);
|
|
286
|
+
color: inherit;
|
|
287
|
+
padding: 0 8px;
|
|
288
|
+
min-width: 0;
|
|
289
|
+
}
|
|
290
|
+
button {
|
|
291
|
+
cursor: pointer;
|
|
292
|
+
}
|
|
293
|
+
button:disabled {
|
|
294
|
+
opacity: 0.45;
|
|
295
|
+
cursor: default;
|
|
296
|
+
}
|
|
297
|
+
button[aria-pressed='true'] {
|
|
298
|
+
background: var(--md-sys-color-secondary-container);
|
|
299
|
+
color: var(--md-sys-color-on-secondary-container);
|
|
300
|
+
border-color: var(--md-sys-color-primary);
|
|
301
|
+
}
|
|
302
|
+
.hint {
|
|
303
|
+
color: var(--md-sys-color-on-surface-variant);
|
|
304
|
+
line-height: 1.5;
|
|
305
|
+
}
|
|
306
|
+
`;
|
|
307
|
+
//# sourceMappingURL=editor-styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-styles.js","sourceRoot":"","sources":["../../client/modeller/editor-styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,gHAAgH;AAChH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+S9B,CAAA","sourcesContent":["import { css } from 'lit'\n\n/** The modeller editor's own styles: the bar's tools, the panes, the start card, the side's tabs and panels. */\nexport const EditorStyles = css`\n :host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n /* The editor folds by the width it is given, not the window's (UX ruling, 2026-09-24). */\n container-type: inline-size;\n font: 13px sans-serif;\n color: var(--md-sys-color-on-surface);\n }\n /* The bar over the work is ox-canvas-bar (ADR-0060 decision 8): the folds at its edges, undo, redo and\n fit in the suite's places. What the editor puts in it - the mode switch, the status, save - is styled here. */\n ox-canvas-bar button[mode] {\n height: 28px;\n padding: 0 10px;\n border-radius: 999em;\n border-color: transparent;\n background: none;\n }\n ox-canvas-bar button[mode][aria-pressed='true'] {\n border-color: var(--md-sys-color-primary);\n }\n /* The gizmo's tools, drawn as the bar's own icon buttons (undo, redo, fit). */\n ox-canvas-bar .gizmo-tools {\n display: inline-flex;\n gap: 2px;\n padding-left: 4px;\n border-left: 1px solid var(--md-sys-color-outline-variant);\n }\n ox-canvas-bar button[tool] {\n display: inline-grid;\n place-items: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: var(--md-sys-shape-corner-small, 8px);\n background: transparent;\n color: var(--md-sys-color-on-surface-variant);\n cursor: pointer;\n }\n ox-canvas-bar button[tool]:hover:not(:disabled) {\n background: var(--md-sys-color-surface-container-high);\n color: var(--md-sys-color-on-surface);\n }\n ox-canvas-bar button[tool][aria-pressed='true'] {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n ox-canvas-bar button[tool]:disabled {\n opacity: 0.38;\n cursor: default;\n }\n /*\n Slotted into the bar from here, the tools do not get the bar's own icon size (20px, set inside its shadow): they\n showed at md-icon's 24px, heavier than undo, redo and fit beside them. The same size, and the bar's focus ring.\n */\n ox-canvas-bar button[tool] md-icon {\n --md-icon-size: 20px;\n }\n ox-canvas-bar button[tool]:focus-visible {\n outline: 2px solid var(--md-sys-color-primary);\n outline-offset: 1px;\n }\n figure-preview {\n min-width: 0;\n min-height: 0;\n }\n /* The edit canvas stays standing while the preview is in front (a 3D scene costs a third of a second to make), out of sight. */\n div[middle][hidden] {\n display: none;\n }\n /* The preview, once made, stays standing out of sight too: its 3D scene is not made again each time it is asked for. */\n figure-preview[hidden] {\n display: none;\n }\n ox-canvas-bar .status {\n padding: 0 8px;\n color: var(--md-sys-color-on-surface-variant);\n }\n ox-canvas-bar .status[dirty] {\n color: var(--md-sys-color-primary);\n font-weight: 600;\n }\n ox-canvas-bar button[save] {\n height: 32px;\n padding: 0 14px;\n border: none;\n border-radius: 999em;\n color: var(--md-sys-color-on-primary);\n background: var(--md-sys-color-primary);\n }\n /* The three panes are ox-three-pane's (ADR-0060 decision 8): widths 200 | 1fr | 340, 160 | 300 under\n 860px and one column with the middle first under 560px are the frame's, as are the dividers. */\n ox-three-pane {\n flex: 1;\n min-height: 0;\n }\n figure-parts {\n min-height: 0;\n }\n figure-canvas {\n flex: 1;\n min-width: 0;\n min-height: 0;\n }\n div[middle] {\n position: relative;\n display: flex;\n min-width: 0;\n min-height: 0;\n }\n /* A new figure's first question, over the empty canvas. */\n div[start] {\n position: absolute;\n inset: 50% auto auto 50%;\n z-index: 10;\n color: var(--md-sys-color-on-surface);\n transform: translate(-50%, -50%);\n width: min(440px, calc(100% - 32px));\n box-sizing: border-box;\n padding: 20px;\n border-radius: 12px;\n background: var(--md-sys-color-surface, #fff);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.18);\n }\n div[start] button[start-button] {\n width: auto;\n margin: 0;\n font-size: var(--ui-t-body);\n height: 36px;\n padding: 0 16px;\n border: 1px solid var(--md-sys-color-outline);\n border-radius: 999em;\n color: var(--md-sys-color-primary);\n background: var(--md-sys-color-surface, #fff);\n cursor: pointer;\n }\n div[start] button[start-button]:hover:not(:disabled) {\n background: var(--md-sys-color-primary-container);\n }\n div[start] button[start-button][pressed] {\n color: var(--md-sys-color-on-primary);\n background: var(--md-sys-color-primary);\n border-color: var(--md-sys-color-primary);\n }\n div[start] button[start-button]:disabled {\n opacity: 0.5;\n cursor: default;\n }\n div[start] h2 {\n margin: 0 0 12px;\n font-size: var(--ui-t-title);\n }\n div[start-paths] {\n display: grid;\n gap: 14px;\n }\n div[start-paths] h3 {\n margin: 0 0 6px;\n font-size: var(--ui-t-body);\n }\n div[start-shapes] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n }\n div[start] small {\n display: block;\n margin-top: 4px;\n color: var(--md-sys-color-on-surface-variant);\n }\n /* The side: tabs over one panel at a time, each using the whole height. */\n aside {\n display: flex;\n flex-direction: column;\n min-height: 0;\n background: var(--md-sys-color-surface-container-lowest);\n }\n div[tabs] {\n display: flex;\n flex: none;\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n }\n button[tab] {\n flex: 1;\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 1px;\n min-width: 0;\n height: 48px;\n padding: 0;\n border: none;\n border-radius: 0;\n border-bottom: 2px solid transparent;\n background: none;\n color: var(--md-sys-color-on-surface-variant);\n }\n button[tab]:hover:not([on]) {\n background: var(--md-sys-color-surface-container);\n }\n button[tab][on] {\n color: var(--md-sys-color-primary);\n border-bottom-color: var(--md-sys-color-primary);\n }\n button[tab] md-icon {\n font-size: 20px;\n width: 20px;\n height: 20px;\n }\n button[tab] span[tab-label] {\n max-width: 100%;\n overflow: hidden;\n font-size: 0.66rem;\n line-height: 1.2;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n span[badge] {\n position: absolute;\n top: 3px;\n right: 2px;\n padding: 0 5px;\n font-size: 0.62rem;\n font-weight: 700;\n line-height: 1.5;\n color: var(--md-sys-color-on-primary-container);\n background: var(--md-sys-color-primary-container);\n border-radius: 999em;\n pointer-events: none;\n }\n /* The sections inside carry the margins (side-panel-styles); the panel only scrolls. */\n div[panel] {\n flex: 1;\n min-height: 0;\n overflow: auto;\n padding: 0;\n }\n div[panel][flush] {\n padding: 0;\n }\n /* Hidden, not removed: a panel keeps what it holds (the verdict its last answer) while another tab is open. */\n [off] {\n display: none !important;\n }\n /* Which part the panel speaks of. */\n div[subject] {\n position: sticky;\n top: 0;\n z-index: 1;\n display: grid;\n gap: 4px;\n padding: 10px 12px;\n background: var(--md-sys-color-surface-container-lowest);\n border-bottom: 1px solid var(--md-sys-color-outline-variant);\n }\n /* The panel's three sizes (side-panel-styles): the part's kind at the title's, its two lines at the hint's. */\n div[subject-summary] {\n display: grid;\n gap: 2px;\n }\n div[subject-summary] b {\n font-size: var(--ui-t-body, 13px);\n font-weight: 600;\n }\n div[subject-summary] b span {\n font-weight: 400;\n color: var(--md-sys-color-on-surface-variant);\n }\n div[subject-summary] small {\n color: var(--md-sys-color-on-surface-variant);\n }\n button {\n font: inherit;\n box-sizing: border-box;\n height: 32px;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 6px;\n background: var(--md-sys-color-surface);\n color: inherit;\n padding: 0 8px;\n min-width: 0;\n }\n button {\n cursor: pointer;\n }\n button:disabled {\n opacity: 0.45;\n cursor: default;\n }\n button[aria-pressed='true'] {\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n border-color: var(--md-sys-color-primary);\n }\n .hint {\n color: var(--md-sys-color-on-surface-variant);\n line-height: 1.5;\n }\n`\n"]}
|
|
@@ -77,43 +77,19 @@ export declare class FigureEditor extends LitElement {
|
|
|
77
77
|
private live;
|
|
78
78
|
/** The part whose drawn section is open in the section editor (ADR-0100 §3.2), or null. */
|
|
79
79
|
private sectionEditing;
|
|
80
|
-
/**
|
|
81
|
-
* A command seen before it is done (ADR-0097 §5.5): worked out on a copy for the figure, version, part and command it
|
|
82
|
-
* names, and shown only while all four are still the ones on screen. Nothing of it is saved or undone.
|
|
83
|
-
*/
|
|
84
|
-
private preview?;
|
|
85
|
-
private previewDrawn?;
|
|
86
80
|
private lastContext;
|
|
81
|
+
private commandPreview;
|
|
87
82
|
/**
|
|
88
83
|
* Move, turn and size on the canvas, in the bar's tools: the gizmo the W · E · R keys give, found without knowing the
|
|
89
84
|
* keys (2026-09-26 -- a person dragging the part turned the camera). Each is offered only where the part's own
|
|
90
85
|
* numbers can take it (`gizmoReachOf`).
|
|
91
86
|
*/
|
|
92
87
|
private renderGizmoTools;
|
|
93
|
-
|
|
94
|
-
private
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
private static readonly FOLD_START_UNDER;
|
|
98
|
-
private foldedForWidth;
|
|
99
|
-
private keptOpenByAuthor;
|
|
100
|
-
private widthWatch;
|
|
101
|
-
private fitPanesTo;
|
|
102
|
-
/**
|
|
103
|
-
* Refusals and notices go to the app's shared surfaces, as every screen's do (user, 2026-09-27: 「왜 모두가 사용하는
|
|
104
|
-
* notification 오류 표현 방법을 사용하지 않고」 · 「혹은 oxprompt 에서 확인하고 진행하던지」). A refusal with a way on --
|
|
105
|
-
* delete and fit the space again, narrow the range -- asks in the app's prompt and goes on when confirmed; any
|
|
106
|
-
* other refusal is the app's notification, which stays until it is closed.
|
|
107
|
-
*/
|
|
108
|
-
private toldViewError;
|
|
109
|
-
private tell;
|
|
110
|
-
private askClipLoss;
|
|
111
|
-
private confirmClipLoss;
|
|
112
|
-
private ask;
|
|
88
|
+
private keys;
|
|
89
|
+
private keyAction;
|
|
90
|
+
private paneFold;
|
|
91
|
+
private refusals;
|
|
113
92
|
private panelMemory;
|
|
114
|
-
private restorePanelFor?;
|
|
115
|
-
private propertiesPanel;
|
|
116
|
-
private foldsOf;
|
|
117
93
|
/** The preview is made when first asked for, and kept (hidden) after that; it is taken down with the editor. */
|
|
118
94
|
private previewMounted;
|
|
119
95
|
protected willUpdate(_changed: PropertyValues): void;
|
|
@@ -146,12 +122,6 @@ export declare class FigureEditor extends LitElement {
|
|
|
146
122
|
* defaults put every other joint back to its saved angle while one slider moved (user, 2026-09-24).
|
|
147
123
|
*/
|
|
148
124
|
private shown;
|
|
149
|
-
/**
|
|
150
|
-
* The figure's parts by id, one per authored part as the parts list shows them. Not the drawn bodies: a row's copies
|
|
151
|
-
* are drawn under ids of their own, so a part made into a row was missing from those and its id was offered to the
|
|
152
|
-
* next part, which figure-model refused (DUPLICATE_PART).
|
|
153
|
-
*/
|
|
154
|
-
private partIds;
|
|
155
125
|
/** A value in hand: an input's value (design or pose) or a part edit. Nothing is recorded. */
|
|
156
126
|
private hold;
|
|
157
127
|
private closeSectionEditor;
|
|
@@ -215,8 +185,6 @@ export declare class FigureEditor extends LitElement {
|
|
|
215
185
|
private renderRepeatNote;
|
|
216
186
|
private renamePart;
|
|
217
187
|
/** Size response, fastening and motion for the selected part, as authoring commands. */
|
|
218
|
-
private previewWordsSaid?;
|
|
219
|
-
private previewWordsNow;
|
|
220
188
|
private renderLinks;
|
|
221
189
|
/**
|
|
222
190
|
* The face a size drag keeps for the selected part, figure-model's rule (`figureScaleAnchorOf`): the gizmo shows it
|
|
@@ -279,25 +247,6 @@ export declare class FigureEditor extends LitElement {
|
|
|
279
247
|
private releaseWords;
|
|
280
248
|
/** To the release that exists: the history tab's release section, not a second one here. */
|
|
281
249
|
private goRelease;
|
|
282
|
-
/** The fastening form's command, seen before it is done; null clears what was shown. */
|
|
283
|
-
/**
|
|
284
|
-
* What a command would do is worked out on a copy of the figure -- several compiles of it -- so it waits for the field to
|
|
285
|
-
* rest: a number typed digit by digit asks once, for the number it ends on. Clearing is at once, and the same question on
|
|
286
|
-
* the same version is not asked again.
|
|
287
|
-
*/
|
|
288
|
-
private previewTimer?;
|
|
289
|
-
private previewCommand;
|
|
290
|
-
private computePreview;
|
|
291
|
-
/** The preview, while it still speaks of what is on screen: this figure, this version, this part. */
|
|
292
|
-
private currentPreview;
|
|
293
|
-
private detachTimer?;
|
|
294
|
-
private detachAsked?;
|
|
295
|
-
/**
|
|
296
|
-
* Said once the figure has rested: working it out is a preview of the command on a copy (tens of milliseconds), and the
|
|
297
|
-
* edit that made this version should be on screen before it. Until then nothing is said, as for a part with no joint.
|
|
298
|
-
*/
|
|
299
|
-
private detachWords;
|
|
300
|
-
private computeDetachWords;
|
|
301
250
|
private overhangOf;
|
|
302
251
|
/** The selected part's motion at both ends of its range, made once per version and part. */
|
|
303
252
|
private motionEnds;
|