@things-factory/figure-ui 10.1.271 → 10.1.273
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/canvas.ts +4 -2
- package/client/modeller/clips.ts +74 -4
- package/client/modeller/data-interface.ts +30 -18
- package/client/modeller/editor-styles.ts +17 -6
- package/client/modeller/editor.ts +2 -0
- package/client/modeller/fasten-form.ts +81 -6
- package/client/modeller/fasten-geometry.ts +5 -3
- package/client/modeller/figure-cavity-drawing.ts +1 -3
- package/client/modeller/figure-clips.ts +101 -8
- package/client/modeller/figure-data-panel.ts +384 -200
- package/client/modeller/figure-fasten-dialog.ts +41 -30
- package/client/modeller/figure-fasten-drawing.ts +24 -14
- package/client/modeller/figure-first-save.ts +4 -3
- package/client/modeller/figure-links.ts +109 -37
- package/client/modeller/figure-parts.ts +7 -11
- package/client/modeller/figure-preview.ts +299 -79
- package/client/modeller/figure-size-editor.ts +7 -2
- package/client/modeller/first-save.ts +8 -0
- package/client/modeller/focus-on-render.ts +4 -0
- package/client/modeller/pivot.ts +76 -0
- package/client/modeller/size-response.ts +14 -0
- package/client/modeller/stage-model.ts +50 -6
- package/dist-client/modeller/canvas.d.ts +1 -0
- package/dist-client/modeller/canvas.js +3 -2
- package/dist-client/modeller/canvas.js.map +1 -1
- package/dist-client/modeller/clips.d.ts +17 -3
- package/dist-client/modeller/clips.js +69 -4
- package/dist-client/modeller/clips.js.map +1 -1
- package/dist-client/modeller/data-interface.d.ts +11 -8
- package/dist-client/modeller/data-interface.js +27 -17
- package/dist-client/modeller/data-interface.js.map +1 -1
- package/dist-client/modeller/editor-styles.js +17 -6
- package/dist-client/modeller/editor-styles.js.map +1 -1
- package/dist-client/modeller/editor.js +2 -0
- package/dist-client/modeller/editor.js.map +1 -1
- package/dist-client/modeller/fasten-form.d.ts +13 -0
- package/dist-client/modeller/fasten-form.js +72 -7
- package/dist-client/modeller/fasten-form.js.map +1 -1
- package/dist-client/modeller/fasten-geometry.d.ts +3 -2
- package/dist-client/modeller/fasten-geometry.js +5 -3
- package/dist-client/modeller/fasten-geometry.js.map +1 -1
- package/dist-client/modeller/figure-cavity-drawing.js +1 -3
- package/dist-client/modeller/figure-cavity-drawing.js.map +1 -1
- package/dist-client/modeller/figure-clips.d.ts +9 -0
- package/dist-client/modeller/figure-clips.js +104 -8
- package/dist-client/modeller/figure-clips.js.map +1 -1
- package/dist-client/modeller/figure-data-panel.d.ts +10 -19
- package/dist-client/modeller/figure-data-panel.js +382 -190
- package/dist-client/modeller/figure-data-panel.js.map +1 -1
- package/dist-client/modeller/figure-fasten-dialog.js +39 -24
- package/dist-client/modeller/figure-fasten-dialog.js.map +1 -1
- package/dist-client/modeller/figure-fasten-drawing.js +24 -14
- package/dist-client/modeller/figure-fasten-drawing.js.map +1 -1
- package/dist-client/modeller/figure-first-save.js +4 -3
- package/dist-client/modeller/figure-first-save.js.map +1 -1
- package/dist-client/modeller/figure-links.d.ts +9 -0
- package/dist-client/modeller/figure-links.js +120 -51
- package/dist-client/modeller/figure-links.js.map +1 -1
- package/dist-client/modeller/figure-parts.js +7 -11
- package/dist-client/modeller/figure-parts.js.map +1 -1
- package/dist-client/modeller/figure-preview.d.ts +13 -0
- package/dist-client/modeller/figure-preview.js +296 -80
- package/dist-client/modeller/figure-preview.js.map +1 -1
- package/dist-client/modeller/figure-size-editor.js +7 -3
- package/dist-client/modeller/figure-size-editor.js.map +1 -1
- package/dist-client/modeller/first-save.d.ts +5 -0
- package/dist-client/modeller/first-save.js +7 -0
- package/dist-client/modeller/first-save.js.map +1 -1
- package/dist-client/modeller/focus-on-render.d.ts +2 -0
- package/dist-client/modeller/focus-on-render.js +4 -0
- package/dist-client/modeller/focus-on-render.js.map +1 -0
- package/dist-client/modeller/pivot.d.ts +12 -0
- package/dist-client/modeller/pivot.js +59 -0
- package/dist-client/modeller/pivot.js.map +1 -0
- package/dist-client/modeller/size-response.d.ts +6 -0
- package/dist-client/modeller/size-response.js +14 -0
- package/dist-client/modeller/size-response.js.map +1 -1
- package/dist-client/modeller/stage-model.d.ts +17 -3
- package/dist-client/modeller/stage-model.js +44 -6
- package/dist-client/modeller/stage-model.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -7
- package/test/browser/editing-page.js +1 -1
- package/test/browser/editing.check.mjs +6 -5
- package/test/browser/links.check.mjs +30 -0
- package/test/browser/modeller.check.mjs +2 -2
- package/test/browser/parts-page.js +4 -0
- package/test/browser/parts.check.mjs +16 -10
- package/test/browser/screen-page.js +12 -1
- package/test/browser/screen.check.mjs +142 -11
- package/test/browser/section.check.mjs +21 -0
- package/test/browser/serve-response.mjs +5 -2
- package/test/browser/side-panel-sweep.check.mjs +171 -10
- package/test/clips.test.ts +49 -4
- package/test/data-motion.test.ts +39 -8
- package/test/fasten-form.test.ts +69 -0
- package/test/fasten-geometry.test.ts +13 -0
- package/test/first-save.test.ts +11 -1
- package/test/pivot.test.ts +57 -0
- package/test/size-response.test.ts +10 -2
- package/test/stage-model.test.ts +23 -1
- package/translations/en.json +31 -11
- package/translations/es.json +30 -10
- package/translations/ja.json +30 -10
- package/translations/ko.json +32 -12
- package/translations/ms.json +30 -10
- package/translations/zh.json +30 -10
- package/tutorial/humanoid/README.md +22 -0
- package/tutorial/humanoid/chapters.mjs +247 -0
- package/tutorial/humanoid/encode.mjs +26 -0
- package/tutorial/humanoid/lib.mjs +197 -0
- package/tutorial/humanoid/record.mjs +65 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"figure-fasten-drawing.js","sourceRoot":"","sources":["../../client/modeller/figure-fasten-drawing.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, nothing, svg } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js'\nimport { figureAroundNormalOf, figureAroundOf, figureCaughtAngleOf, figureSurfaceAnglesOf, figureSurfacePlaceOf } from '@hatiolab/figure-model'\nimport type { FigureFace, FigureSurfacePlace } from '@hatiolab/figure-model'\n\nimport { alignmentAt, drawingSpanOf, fastenLabelsOf, offsetOf, overhangOf, screenOf, type FaceView, type FastenMode } from './fasten-geometry.js'\nimport type { Alignment } from './links.js'\n\ntype Axis = 'x' | 'y' | 'z'\nconst AXES: Axis[] = ['x', 'y', 'z']\ntype SidePlace = Extract<FigureSurfacePlace, { around: number }>\ntype RoundPlace = Extract<FigureSurfacePlace, { toward: unknown }>\n\n/** A change the drawing asks of the fastening form. */\nexport type FastenChange =\n | { targetFace: string }\n | { onSurface: true }\n | { surface: FigureSurfacePlace }\n | { mode: FastenMode }\n | { axis: Axis; how: Alignment; mm?: number }\n | { gap: number }\n\nconst SEEN: Array<[FigureFace, string]> = [\n ['top', 'M60 30 L100 10 L200 10 L160 30 Z'],\n ['front', 'M60 30 L160 30 L160 100 L60 100 Z'],\n ['right', 'M160 30 L200 10 L200 80 L160 100 Z']\n]\n/** The faces the drawing cannot show on the box, as tags beside it where they are. */\n/* The box is drawn a little left of its picture's middle, and the viewBox shifts it back to the panel's centre. */\nconst HIDDEN: Array<[FigureFace, number, number]> = [\n ['bottom', 30, 114],\n ['left', 24, 62],\n ['back', 236, 14]\n]\nconst PANEL_W = 300\n/* The face seen from above, beside the box in the fastening window: taller than the panel's was, for a long face's parts. */\nconst WHERE_W = 360\nconst WHERE_H = 200\n\n\n/**\n * 붙이기 그림 (user 2026-10-01) — which face of what the part is fastened to, how, and where on it; each of them chosen\n * by pressing or dragging the drawing, none by a list of faces.\n *\n * The target is drawn as a box whose faces are pressed (the three it hides as tags beside it), or as the one plane the\n * figure stands by. How is three small side views -- set on it, flush with it, its centre on it (only for a part that\n * turns about a joint) -- and the chosen one's gap is dragged. Where is the face seen from above with the part's\n * footprint on it: dragged, caught at the centre and at the edges from inside and outside, a guide drawn where it is\n * caught and a dimension where it is not, which is pressed to type the number. It may go past the edges: the part that\n * does is shaded, and a part off the face altogether is said so. Nothing is decided here: every change goes to the form\n * (`fasten-change`), and a press or a drag let go says so (`fasten-release`). The window draws it twice, under its own\n * questions: the face (`show=\"face\"`: the box and the face seen from above, side by side) and the way (`show=\"how\"`).\n */\n@customElement('figure-fasten-drawing')\nexport class FigureFastenDrawing extends localize(i18next)(LitElement) {\n /* The panel's own field rows (where along a cylinder's side), as the window's other rows are. */\n static styles = [SidePanelStyles, css`\n :host {\n display: grid;\n gap: 8px;\n outline: none;\n }\n svg {\n width: 100%;\n display: block;\n touch-action: none;\n user-select: none;\n }\n svg text {\n font: inherit;\n }\n div[modes] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(72px, 1fr));\n gap: 6px;\n }\n div[modes] svg {\n width: 48px;\n height: 33px;\n }\n /* A choice drawn, not a box to press (the side's rule: no boxed buttons): the chosen one on the primary's ground. */\n div[modes] button {\n display: grid;\n justify-items: center;\n align-content: center;\n gap: 2px;\n padding: 4px 4px 6px;\n font: inherit;\n color: var(--md-sys-color-on-surface);\n background: none;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n }\n div[modes] button:hover:not([on]):not(:disabled) {\n background: var(--md-sys-color-surface-container);\n }\n /* Faces beyond the box's six and a curved surface: tags as the hidden faces are drawn beside the box -- one look for every face. */\n div[face-tags] {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 6px;\n }\n button[face-tag] {\n height: 20px;\n padding: 0 10px;\n font: inherit;\n font-size: var(--ui-t-small, 11.5px);\n color: var(--md-sys-color-on-surface-variant);\n background: transparent;\n border: 1px dashed var(--md-sys-color-outline);\n border-radius: 10px;\n cursor: pointer;\n }\n button[face-tag][on] {\n color: var(--md-sys-color-on-primary-container);\n background: var(--md-sys-color-primary-container);\n border: 1px solid var(--md-sys-color-primary);\n }\n div[modes] button[on] {\n background: var(--md-sys-color-primary-container);\n color: var(--md-sys-color-on-primary-container);\n }\n /* The box and the face seen from above side by side, one under the other where the window is narrow. */\n div[face-row] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 12px;\n align-items: start;\n }\n div[face-row] > div {\n display: grid;\n gap: 8px;\n }\n /* The place is drawn at its own size, never blown up past it: its words stay the window's size. */\n div[where] {\n position: relative;\n width: 100%;\n max-width: 360px;\n justify-self: center;\n }\n div[where] input {\n position: absolute;\n width: 72px;\n font: inherit;\n }\n small[warn] {\n color: var(--md-sys-color-tertiary);\n }\n small[off] {\n color: var(--md-sys-color-error);\n }\n `]\n\n /** The target's name, or empty for the plane the figure stands by. */\n @property() target = ''\n /** The plane's name by the figure's placement: 바닥 · 천장 · 벽 · 중심. */\n @property() planeWord = ''\n @property({ attribute: false }) faces: string[] = []\n /** The target's own face at each place of the box, as it is drawn: a turned target's faces where they are seen. */\n @property({ attribute: false }) drawnFaces?: Partial<Record<FigureFace, FigureFace>>\n @property() face = ''\n @property({ attribute: false }) modes: FastenMode[] = ['meet', 'flush']\n @property() mode: FastenMode = 'meet'\n @property({ attribute: false }) view?: FaceView\n @property({ attribute: false }) align: Partial<Record<Axis, Alignment>> = {}\n @property({ attribute: false }) alignMm: Partial<Record<Axis, number>> = {}\n @property({ type: Number }) gap = 0\n /** The part being fastened (not `part`: that is every element's own). */\n @property() partName = ''\n @property({ type: Boolean }) locked = false\n /** The form already says how the fastening it has lies on the face: the drawing says it only while dragging. */\n @property({ type: Boolean }) said = false\n /** Which of its questions it draws: the face, or the way. */\n @property() show: 'face' | 'how' = 'face'\n /** The curved surface the target offers to be fastened to at a point (ADR-0140 3.9), if any. */\n @property() surfaceForm: 'around' | 'toward' | '' = ''\n /** Fastened to a point of that surface: which, about which axis, and where; undefined while on a face. */\n @property({ attribute: false }) surface?: { form: 'around' | 'toward'; axis: Axis; place: FigureSurfacePlace }\n /** The angles while one is dragged round the surface, told to the form when let go. */\n @state() private turning?: { around?: number; azimuth?: number; elevation?: number }\n\n /** Where the footprint is while dragging, and what it is caught by; undefined when nothing is dragged. */\n @state() private dragged?: { at: Record<Axis, number>; caught: Partial<Record<Axis, string>> }\n @state() private typing?: Axis\n private scale = 1\n private gapFrom?: { y: number; gap: number }\n\n private change(detail: FastenChange) {\n this.dispatchEvent(new CustomEvent('fasten-change', { detail, bubbles: true, composed: true }))\n }\n private released() {\n this.dispatchEvent(new CustomEvent('fasten-release', { bubbles: true, composed: true }))\n }\n\n render() {\n if (this.show === 'how') return this.renderModes()\n /* A part with no face (a sphere) has only its surface: its tag above, the place across the whole width. */\n if (this.target && !this.faces.length) return html`${this.renderTarget()}<div>${this.renderWhere()}</div>`\n return html`<div face-row>${this.target ? html`<div>${this.renderTarget()}</div>` : nothing}<div>${this.renderWhere()}</div></div>`\n }\n\n /** The target box, its faces pressed; or the plane. */\n private renderTarget() {\n /* The plane is one face, named in the list and on the face drawn below: nothing to pick, so no picture of it. */\n if (!this.target) return nothing\n const has = (f: string) => this.faces.includes(f)\n /* A press is a whole change, as a drag let go is: the form applies a fastening the part already has. */\n const pick = (f: string) => () => {\n if (this.locked || !has(f) || (!this.surface && f === this.face)) return\n this.change({ targetFace: f })\n this.released()\n }\n /* The face at each place as the target is drawn: its own name, pressed as its own. */\n const own = (place: FigureFace) => this.drawnFaces?.[place] ?? place\n const seen = SEEN.map(([place, d]) => {\n const f = own(place)\n const on = !this.surface && this.face === f\n return svg`<path face=${f} place=${place} d=${d} @click=${pick(f)}\n style=${`cursor:${has(f) ? 'pointer' : 'default'};fill:${on ? 'var(--md-sys-color-primary-container)' : 'var(--md-sys-color-surface-container)'};fill-opacity:${has(f) ? 1 : 0.4};stroke:${on ? 'var(--md-sys-color-primary)' : 'var(--md-sys-color-outline)'};stroke-width:${on ? 2 : 1}`}>\n <title>${i18next.t('figure.label.face-' + f)}</title></path>`\n })\n const hidden = HIDDEN.map(([place, x, y]) => {\n const f = own(place)\n const on = !this.surface && this.face === f\n return svg`<g face=${f} place=${place} @click=${pick(f)} style=${`cursor:${has(f) ? 'pointer' : 'default'};opacity:${has(f) ? 1 : 0.35}`}>\n <rect x=${x - 26} y=${y - 10} width=\"52\" height=\"20\" rx=\"10\"\n style=${`fill:${on ? 'var(--md-sys-color-primary-container)' : 'transparent'};stroke:${on ? 'var(--md-sys-color-primary)' : 'var(--md-sys-color-outline)'};stroke-dasharray:${on ? '' : '3 2'}`} />\n <text x=${x} y=${y + 4} text-anchor=\"middle\" font-size=\"11\" style=${`fill:${on ? 'var(--md-sys-color-on-primary-container)' : 'var(--md-sys-color-on-surface-variant)'}`}>${i18next.t('figure.label.face-' + f)}</text>\n </g>`\n })\n /* A shape's faces beyond its six outer ones -- a door frame's opening -- are tags of their own under the box. */\n const others = this.faces.filter(f => !SEEN.some(([s]) => own(s) === f) && !HIDDEN.some(([h]) => own(h) === f))\n /* A sphere has no face: no box of faces it has not, only its surface. */\n return html`${this.faces.length\n ? svg`<svg viewBox=\"-20 0 ${PANEL_W} 126\" role=\"img\" aria-label=${this.target}>\n ${seen}\n <text x=\"110\" y=\"70\" text-anchor=\"middle\" font-size=\"12\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-on-surface)\">${this.target}</text>\n ${hidden}\n </svg>`\n : nothing}\n ${others.length || this.surfaceForm\n ? html`<div face-tags>\n ${others.map(f => html`<button face-tag ?on=${!this.surface && f === this.face} ?disabled=${this.locked} @click=${pick(f)}>${i18next.t('figure.label.face-' + f, { defaultValue: f })}</button>`)}\n ${this.surfaceForm\n ? html`<button face-tag surface ?on=${!!this.surface} ?disabled=${this.locked}\n @click=${() => {\n if (this.locked || this.surface) return\n this.change({ onSurface: true })\n this.released()\n }}>${i18next.t('figure.label.surface-' + this.surfaceForm)}</button>`\n : nothing}\n </div>`\n : nothing}`\n }\n\n /** How: three side views; the chosen one's gap is dragged. */\n private renderModes() {\n /* One way only (the plane is set on): the sentence says it; a single choice is not offered as a button. */\n if (this.modes.length < 2) return nothing\n const icon = (m: FastenMode, on: boolean) => {\n const g = on && m !== 'centre' ? Math.min(this.gap / 4, 10) : 0\n const base = svg`<rect x=\"6\" y=\"30\" width=\"52\" height=\"14\" style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary)\" />`\n const gapDrag = on && !this.locked ? 'ns-resize' : 'pointer'\n if (m === 'meet')\n return svg`<svg viewBox=\"0 0 64 48\">${base}<rect gap x=\"22\" y=${18 - g} width=\"20\" height=\"12\" style=${`fill:var(--md-sys-color-surface);stroke:currentColor;cursor:${gapDrag}`} />\n ${g ? svg`<text x=\"46\" y=${26 - g / 2} font-size=\"10\" style=\"fill:currentColor\">${this.gap}</text>` : nothing}</svg>`\n if (m === 'flush')\n return svg`<svg viewBox=\"0 0 64 48\">${base}<rect gap x=\"22\" y=${30 - g} width=\"20\" height=\"10\" style=${`fill:var(--md-sys-color-surface);stroke:currentColor;cursor:${gapDrag}`} />\n <line x1=\"4\" y1=\"30\" x2=\"60\" y2=\"30\" style=\"stroke:currentColor;stroke-dasharray:2 2\" /></svg>`\n return svg`<svg viewBox=\"0 0 64 48\">${base}<circle cx=\"32\" cy=\"30\" r=\"11\" style=\"fill:var(--md-sys-color-surface);fill-opacity:.85;stroke:currentColor\" /><circle cx=\"32\" cy=\"30\" r=\"2\" style=\"fill:currentColor\" /></svg>`\n }\n return html`<div modes>\n ${this.modes.map(m => {\n const on = m === this.mode\n return html`<button mode=${m} ?on=${on} ?disabled=${this.locked}\n @click=${() => {\n if (on) return\n this.change({ mode: m })\n this.released()\n }}\n @pointerdown=${(ev: PointerEvent) => {\n if (!on || this.locked || !(ev.target as Element).hasAttribute?.('gap')) return\n ev.preventDefault()\n ;(ev.currentTarget as Element).setPointerCapture(ev.pointerId)\n this.gapFrom = { y: ev.clientY, gap: this.gap }\n }}\n @pointermove=${(ev: PointerEvent) => {\n if (!this.gapFrom) return\n this.change({ gap: Math.max(0, Math.round(this.gapFrom.gap + (this.gapFrom.y - ev.clientY) * 2)) })\n }}\n @pointerup=${() => {\n if (!this.gapFrom) return\n this.gapFrom = undefined\n this.released()\n }}>\n ${icon(m, on)}<span>${i18next.t('figure.label.fasten-mode-' + m)}</span>\n </button>`\n })}\n </div>`\n }\n\n /** Where the part's centre is on each axis now: the drag's, or the form's. */\n private centreOf(view: FaceView): Record<Axis, number> {\n if (this.dragged) return this.dragged.at\n const at = { x: 0, y: 0, z: 0 }\n for (const a of view.axes) at[a] = offsetOf(this.align[a], this.alignMm[a], view.face[a], view.part[a])\n return at\n }\n\n /** What each axis is caught by now: at the centre, level with an edge, touching one from outside, or nothing. */\n private caughtOf(view: FaceView, at: Record<Axis, number>): Partial<Record<Axis, string>> {\n if (this.dragged) return this.dragged.caught\n const out: Partial<Record<Axis, string>> = {}\n for (const a of view.axes) {\n const how = this.align[a] ?? 'centre'\n if (how === 'centre') out[a] = 'centre'\n else if (how === 'min' || how === 'max') out[a] = 'inside'\n else if (view.face[a] !== undefined && Math.abs(Math.abs(at[a]) - (view.face[a]! + view.part[a]) / 2) < 0.5) out[a] = 'outside'\n }\n return out\n }\n\n private renderWhere() {\n if (this.surface) return this.renderSurfaceWhere(this.surface)\n const view = this.view\n if (!view) return nothing\n const { h, v, sign } = screenOf(view.axes)\n const W = WHERE_W,\n H = WHERE_H\n const span = (a: Axis) => drawingSpanOf(view.face[a], view.part[a])\n const k = Math.min((W - 40) / span(h), (H - 40) / span(v))\n this.scale = k\n const cx = W / 2,\n cy = H / 2\n const at = this.centreOf(view)\n const caught = this.caughtOf(view, at)\n const fw = (view.face[h] ?? 0) * k,\n fh = (view.face[v] ?? 0) * k\n const pw = view.part[h] * k,\n ph = view.part[v] * k\n const px = cx + sign[h] * at[h] * k - pw / 2,\n py = cy + sign[v] * at[v] * k - ph / 2\n const faceSized = view.face[h] !== undefined && view.face[v] !== undefined\n /* An end disc is drawn as the disc it is: its overhang is measured on it (ADR-0140 3.9). */\n const disc = !!view.measure.disc\n const fx = cx - fw / 2,\n fy = cy - fh / 2\n const ix = Math.max(fx, px),\n iy = Math.max(fy, py)\n const iw = Math.min(fx + fw, px + pw) - ix,\n ih = Math.min(fy + fh, py + ph) - iy\n const { touching, sides } = faceSized ? overhangOf(view, at) : { touching: true, sides: [] as ReturnType<typeof overhangOf>['sides'] }\n const round = this.mode === 'centre'\n const guide = (a: Axis) => {\n const c = caught[a]\n if (!c) return nothing\n const along = a === h\n const edge = c === 'centre' ? 0 : Math.sign(at[a]) * (view.face[a] ?? 0) / 2\n const pos = (along ? cx : cy) + sign[a] * edge * k\n const style = `stroke:var(--md-sys-color-primary);stroke-width:${c === 'centre' ? 1 : 2.5};stroke-dasharray:${c === 'centre' ? '4 3' : ''}`\n return along ? svg`<line x1=${pos} y1=\"4\" x2=${pos} y2=${H - 4} style=${style} />` : svg`<line x1=\"4\" y1=${pos} x2=${W - 4} y2=${pos} style=${style} />`\n }\n const dim = (a: Axis) => {\n /* Caught by the centre or an edge, the guide says where it is; a number only where nothing caught it. */\n if (caught[a]) return nothing\n const along = a === h\n const mm = Math.round(at[a])\n const label = `${mm > 0 ? '+' : ''}${mm} mm`\n const to = sign[a] * at[a] * k\n const tx = along ? cx + to / 2 : 8,\n ty = along ? H - 6 : cy + to / 2 + 4\n return svg`${along\n ? svg`<line x1=${cx} y1=${H - 16} x2=${cx + to} y2=${H - 16} style=\"stroke:var(--md-sys-color-on-surface)\" />`\n : svg`<line x1=\"20\" y1=${cy} x2=\"20\" y2=${cy + to} style=\"stroke:var(--md-sys-color-on-surface)\" />`}\n <text dim=${a} x=${tx} y=${ty} font-size=\"11\" text-anchor=${along ? 'middle' : 'start'}\n style=\"fill:var(--md-sys-color-primary);cursor:text;text-decoration:underline dotted\" @click=${() => !this.locked && (this.typing = a)}>${label}</text>`\n }\n const faceName = this.target ? `${this.target} ${i18next.t('figure.label.face-' + this.face)}` : this.planeWord\n const sizeWords = faceSized ? ` ${Math.round(view.face[h]!)} × ${Math.round(view.face[v]!)}` : ''\n const labels = fastenLabelsOf(faceSized ? { x: fx, y: fy, w: fw, h: fh } : { x: 6, y: 4, w: W - 12, h: H - 8 }, { x: px, y: py, w: pw, h: ph }, this.partName, H)\n return html`<div where tabindex=\"0\" @keydown=${(ev: KeyboardEvent) => this.keys(ev, view)}>\n ${svg`<svg viewBox=\"0 0 ${W} ${H}\" role=\"img\" aria-label=${faceName}\n @pointermove=${(ev: PointerEvent) => this.drag(ev, view, cx, cy)}\n @pointerup=${() => this.drop()} @pointercancel=${() => this.drop()}>\n ${faceSized\n ? svg`<rect x=${fx} y=${fy} width=${fw} height=${fh} rx=${disc ? fw / 2 : 4} ry=${disc ? fh / 2 : 4} style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary);stroke-width:2\" />`\n : svg`<rect x=\"1\" y=\"1\" width=${W - 2} height=${H - 2} rx=\"8\" style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary);stroke-width:2\" />`}\n <text face-name x=${labels.face.x} y=${labels.face.y} font-size=\"11\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-primary)\">${faceName}${sizeWords}</text>\n ${guide(h)}${guide(v)}\n <g footprint style=${`cursor:${this.locked ? 'default' : 'grab'}`} @pointerdown=${(ev: PointerEvent) => this.grab(ev, at, caught)}>\n <rect x=${px} y=${py} width=${pw} height=${ph} rx=${round ? pw / 2 : 2} style=\"fill:var(--md-sys-color-tertiary-container)\" />\n ${faceSized && iw > 0 && ih > 0\n ? svg`<rect x=${ix} y=${iy} width=${iw} height=${ih} rx=${round ? Math.min(iw, ih) / 2 : 2} style=\"fill:var(--md-sys-color-surface)\" />`\n : !faceSized\n ? svg`<rect x=${px} y=${py} width=${pw} height=${ph} rx=${round ? pw / 2 : 2} style=\"fill:var(--md-sys-color-surface)\" />`\n : nothing}\n <rect x=${px} y=${py} width=${pw} height=${ph} rx=${round ? pw / 2 : 2}\n style=${`fill:none;stroke:var(--md-sys-color-on-surface);stroke-width:1.5;stroke-dasharray:${touching ? '' : '4 3'}`} />\n <text part-name x=${labels.part.x} y=${labels.part.y} text-anchor=\"middle\" font-size=\"12\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-on-surface)\">${this.partName}</text>\n </g>\n ${dim(h)}${dim(v)}\n </svg>`}\n ${this.typing ? this.renderTyping(view, this.typing, at) : nothing}\n </div>\n ${this.said && !this.dragged\n ? nothing\n : !touching\n ? html`<small off role=\"status\">${i18next.t('figure.text.fasten-off-face', { face: faceName })}</small>`\n : sides.length\n ? html`<small warn role=\"status\">${i18next.t('figure.text.fasten-past-edges', {\n sides: sides.map(s => i18next.t(`figure.text.overhang-side-${s.side}`, { axis: s.axis.toUpperCase(), mm: String(s.mm) })).join(' · ')\n })}</small>`\n : nothing}`\n }\n\n private renderTyping(view: FaceView, a: Axis, at: Record<Axis, number>) {\n const along = a === screenOf(view.axes).h\n return html`<input type=\"number\" step=\"1\" aria-label=${`${a.toUpperCase()} mm`} .value=${String(Math.round(at[a]))}\n style=${along ? 'left: calc(50% - 36px); bottom: 0' : 'left: 4px; top: calc(50% - 12px)'}\n @keydown=${(ev: KeyboardEvent) => {\n ev.stopPropagation()\n if (ev.key === 'Escape') this.typing = undefined\n if (ev.key !== 'Enter') return\n const value = Number((ev.target as HTMLInputElement).value)\n this.typing = undefined\n if (!Number.isFinite(value)) return\n this.change({ axis: a, how: 'mm', mm: Math.round(value) })\n this.released()\n }}\n @blur=${() => (this.typing = undefined)} />`\n }\n\n private grab(ev: PointerEvent, at: Record<Axis, number>, caught: Partial<Record<Axis, string>>) {\n if (this.locked) return\n ;(ev.currentTarget as Element).closest('svg')!.setPointerCapture(ev.pointerId)\n this.dragged = { at: { ...at }, caught: { ...caught } }\n }\n\n /** The footprint follows the pointer, caught at the centre and edges within a few pixels. */\n private drag(ev: PointerEvent, view: FaceView, cx: number, cy: number) {\n if (!this.dragged) return\n const svgEl = ev.currentTarget as SVGSVGElement\n const pt = svgEl.createSVGPoint()\n pt.x = ev.clientX\n pt.y = ev.clientY\n const p = pt.matrixTransform(svgEl.getScreenCTM()!.inverse())\n const { h, v, sign } = screenOf(view.axes)\n const at = { ...this.dragged.at },\n caught: Partial<Record<Axis, string>> = {}\n for (const [a, d] of [\n [h, (sign[h] * (p.x - cx)) / this.scale],\n [v, (sign[v] * (p.y - cy)) / this.scale]\n ] as const) {\n const got = alignmentAt(d, view.face[a], view.part[a], view.edges[a], 8 / this.scale)\n at[a] = offsetOf(got.how, got.mm, view.face[a], view.part[a])\n if (got.caught) caught[a] = got.caught\n }\n this.dragged = { at, caught }\n }\n\n private drop() {\n const d = this.dragged\n if (!d || !this.view) return\n this.dragged = undefined\n for (const a of this.view.axes) {\n const got = alignmentAt(d.at[a], this.view.face[a], this.view.part[a], this.view.edges[a], 0.5)\n this.change({ axis: a, how: got.how, ...(got.how === 'mm' ? { mm: got.mm } : {}) })\n }\n this.released()\n }\n\n /** Arrows move the part a millimetre, ten with Shift; the centre and edges still catch it. */\n private keys(ev: KeyboardEvent, view: FaceView) {\n const step = { ArrowLeft: [-1, 0], ArrowRight: [1, 0], ArrowUp: [0, -1], ArrowDown: [0, 1] }[ev.key]\n if (!step || this.locked || this.typing) return\n ev.preventDefault()\n ev.stopPropagation()\n const by = ev.shiftKey ? 10 : 1\n const at = this.centreOf(view)\n const { h, v, sign } = screenOf(view.axes)\n ;[h, v].forEach((a, i) => {\n if (!step[i]) return\n /* Up the screen is up the face: a Y that rises goes up with the arrow. */\n const got = alignmentAt(at[a] + sign[a] * step[i]! * by, view.face[a], view.part[a], view.edges[a], by / 2)\n this.change({ axis: a, how: got.how, ...(got.how === 'mm' ? { mm: got.mm } : {}) })\n })\n this.released()\n }\n\n /**\n * Where on a curved surface (ADR-0140 3.9). A cylinder's side is seen from its end: its section a circle, the point\n * on its rim at the angle `around`, dragged round it -- caught at every 45°, where the faces it had are named -- and\n * along its length chosen below it. A sphere is seen from above and from the side: its point dragged round the\n * first for the direction across its axis, along the second for how high. Nothing is told the form until let go.\n */\n private renderSurfaceWhere(surface: { form: 'around' | 'toward'; axis: Axis; place: FigureSurfacePlace }) {\n const R = 56\n const axis = surface.axis\n const across = (['x', 'y', 'z'] as Axis[]).filter(a => a !== axis) as [Axis, Axis]\n const { h, v, sign } = screenOf(across)\n const deg = (r: number) => (r * 180) / Math.PI\n const rad = (d: number) => (d * Math.PI) / 180\n /* A direction across the axis on the circle drawn at (cx, cy): its point there, and the way back from a pointer. */\n const onCircle = (n: number[], cx: number, cy: number, r = R) => ({ x: cx + sign[h] * n[AXES.indexOf(h)]! * r, y: cy + sign[v] * n[AXES.indexOf(v)]! * r })\n const angleAt = (p: { x: number; y: number }, cx: number, cy: number) => {\n const d = [0, 0, 0]\n d[AXES.indexOf(h)] = sign[h] * (p.x - cx)\n d[AXES.indexOf(v)] = sign[v] * (p.y - cy)\n return figureAroundOf(axis, d)\n }\n const caught = (a: number) => figureCaughtAngleOf(a) % 360\n /* The faces the four quarters were named by, round the circle: where a part fastened to one of them now stands. */\n const FACE_AT: Record<Axis, [string, string]> = { x: ['left', 'right'], y: ['bottom', 'top'], z: ['back', 'front'] }\n const ticks = (cx: number, cy: number) =>\n [0, 90, 180, 270].map(t => {\n const n = figureAroundNormalOf(axis, t)\n const k = n.findIndex(c => Math.abs(c) > 0.5)\n const word = i18next.t('figure.label.face-' + FACE_AT[AXES[k]!][n[k]! > 0 ? 1 : 0])\n const p = onCircle(n, cx, cy, R + 16)\n return svg`<text x=${p.x} y=${p.y + 4} text-anchor=\"middle\" font-size=\"10\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-on-surface-variant)\">${word}</text>`\n })\n const marker = (p: { x: number; y: number }, cx: number, cy: number, label: string) => svg`\n <line x1=${cx} y1=${cy} x2=${p.x} y2=${p.y} style=\"stroke:var(--md-sys-color-primary);stroke-dasharray:3 2\" />\n <circle marker cx=${p.x} cy=${p.y} r=\"8\" style=${`fill:var(--md-sys-color-tertiary-container);stroke:var(--md-sys-color-on-surface);cursor:${this.locked ? 'default' : 'grab'}`} />\n <text x=${cx} y=${Math.hypot(p.x - cx, p.y - cy) < 16 ? cy - 14 : cy + 4} text-anchor=\"middle\" font-size=\"11\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-primary)\">${label}</text>`\n const drag = (on: (p: { x: number; y: number }) => void) => ({\n down: (ev: PointerEvent) => {\n if (this.locked) return\n ;(ev.currentTarget as Element).setPointerCapture(ev.pointerId)\n on(this.pointIn(ev))\n },\n move: (ev: PointerEvent) => {\n if (!this.turning || !(ev.currentTarget as Element).hasPointerCapture?.(ev.pointerId)) return\n on(this.pointIn(ev))\n },\n up: () => this.letGo(surface)\n })\n if (surface.form === 'around') {\n const place = surface.place as SidePlace\n const around = this.turning?.around ?? place.around\n /* The section in the middle under its name, the ticks clear of both. */\n const cx = WHERE_W / 2,\n cy = 110\n const d = drag(p => (this.turning = { around: caught(angleAt(p, cx, cy)) }))\n return html`<div where surface tabindex=\"0\" @keydown=${(ev: KeyboardEvent) => this.turnKeys(ev, surface)}>\n ${svg`<svg viewBox=\"0 0 ${WHERE_W} ${WHERE_H}\" role=\"img\" aria-label=${i18next.t('figure.label.surface-seen-end', { part: this.target })}\n @pointerdown=${d.down} @pointermove=${d.move} @pointerup=${d.up} @pointercancel=${d.up}>\n <text x=${WHERE_W / 2} y=\"14\" text-anchor=\"middle\" font-size=\"11\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-primary)\">${i18next.t('figure.label.surface-seen-end', { part: this.target })}</text>\n <circle cx=${cx} cy=${cy} r=${R} style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary);stroke-width:2\" />\n ${ticks(cx, cy)}\n ${marker(onCircle(figureAroundNormalOf(axis, around), cx, cy), cx, cy, `${Math.round(around)}°`)}\n </svg>`}\n </div>\n ${this.renderAlong(surface.axis, place.along)}`\n }\n /* A sphere: its direction across its axis (the azimuth, by the same rule as a cylinder's around) and how high. */\n const now = figureSurfaceAnglesOf(surface, surface.place) as { azimuth: number; elevation: number }\n const azimuth = this.turning?.azimuth ?? now.azimuth\n const elevation = this.turning?.elevation ?? now.elevation\n const ax = 110,\n ay = 110,\n sx = 250,\n sy = 110\n const aboveAt = onCircle(figureAroundNormalOf(axis, azimuth), ax, ay, R * Math.cos(rad(elevation)) || 0)\n const sideAt = { x: sx + R * Math.cos(rad(elevation)), y: sy - R * Math.sin(rad(elevation)) }\n const d = drag(p => {\n const above = Math.hypot(p.x - ax, p.y - ay) <= R + 16 && p.x < (ax + sx) / 2\n this.turning = above\n ? { azimuth: caught(angleAt(p, ax, ay)), elevation }\n : { azimuth, elevation: Math.max(-90, Math.min(90, figureCaughtAngleOf(deg(Math.atan2(sy - p.y, Math.max(0, p.x - sx)))))) }\n })\n return html`<div where surface tabindex=\"0\" @keydown=${(ev: KeyboardEvent) => this.turnKeys(ev, surface)}>\n ${svg`<svg viewBox=\"0 0 ${WHERE_W} ${WHERE_H}\" role=\"img\" aria-label=${i18next.t('figure.label.surface-toward')}\n @pointerdown=${d.down} @pointermove=${d.move} @pointerup=${d.up} @pointercancel=${d.up}>\n <text x=${ax} y=\"14\" text-anchor=\"middle\" font-size=\"11\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-primary)\">${i18next.t('figure.label.surface-seen-above')}</text>\n <circle cx=${ax} cy=${ay} r=${R} style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary);stroke-width:2\" />\n ${ticks(ax, ay)}\n ${marker(aboveAt, ax, ay, `${Math.round(azimuth)}°`)}\n <text x=${sx + R / 2} y=\"14\" text-anchor=\"middle\" font-size=\"11\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-primary)\">${i18next.t('figure.label.surface-seen-side')}</text>\n <path d=${`M ${sx} ${sy - R} A ${R} ${R} 0 0 1 ${sx} ${sy + R}`} style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary);stroke-width:2\" />\n <line x1=${sx} y1=${sy - R} x2=${sx} y2=${sy + R} style=\"stroke:var(--md-sys-color-primary)\" />\n ${marker(sideAt, sx, sy, `${Math.round(elevation)}°`)}\n </svg>`}\n </div>`\n }\n\n /** Where along a cylinder's side: centred, level with an end, or a distance from the middle -- its alignment words. */\n private renderAlong(axis: Axis, along: unknown) {\n const how = along === 'min' || along === 'max' ? along : along && typeof along === 'object' ? 'mm' : 'centre'\n const mm = how === 'mm' ? Number((along as { mm: number }).mm) || 0 : 0\n const place = this.surface!.place as SidePlace\n const tell = (next: unknown) => {\n this.change({ surface: { around: place.around, along: next as never } })\n this.released()\n }\n return html`<div form along>\n <span>${i18next.t('figure.label.align-' + axis)}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => {\n const v = (e.target as HTMLSelectElement).value\n tell(v === 'mm' ? { mm } : v)\n }}>\n <option value=\"centre\" ?selected=${how === 'centre'}>${i18next.t('figure.label.align-centre')}</option>\n <option value=\"min\" ?selected=${how === 'min'}>${i18next.t(`figure.label.align-${axis}-min`)}</option>\n <option value=\"max\" ?selected=${how === 'max'}>${i18next.t(`figure.label.align-${axis}-max`)}</option>\n <option value=\"mm\" ?selected=${how === 'mm'}>${i18next.t('figure.label.align-mm')}</option>\n </select>\n ${how === 'mm'\n ? html`<span></span><input type=\"number\" step=\"any\" aria-label=${i18next.t('figure.label.align-mm')} .value=${String(mm)}\n ?disabled=${this.locked} @change=${(e: Event) => tell({ mm: Number((e.target as HTMLInputElement).value) || 0 })} />`\n : nothing}\n </div>`\n }\n\n /** A pointer's place in the drawing's own units. */\n private pointIn(ev: PointerEvent) {\n const svgEl = (ev.currentTarget as Element).closest('svg') as SVGSVGElement\n const pt = svgEl.createSVGPoint()\n pt.x = ev.clientX\n pt.y = ev.clientY\n return pt.matrixTransform(svgEl.getScreenCTM()!.inverse())\n }\n\n /** Let go: the angles dragged become the place, told to the form once. */\n private letGo(surface: { form: 'around' | 'toward'; axis: Axis; place: FigureSurfacePlace }) {\n const t = this.turning\n if (!t) return\n this.turning = undefined\n this.change({ surface: this.placeOf(surface, t) })\n this.released()\n }\n\n /** The place the angles come to: the kernel's (`figureSurfacePlaceOf`), along a side kept. */\n private placeOf(surface: { form: 'around' | 'toward'; axis: Axis; place: FigureSurfacePlace }, t: { around?: number; azimuth?: number; elevation?: number }): FigureSurfacePlace {\n const now = figureSurfaceAnglesOf(surface, surface.place) as { around?: number; azimuth?: number; elevation?: number }\n const angles = surface.form === 'around' ? { around: t.around ?? now.around! } : { azimuth: t.azimuth ?? now.azimuth!, elevation: t.elevation ?? now.elevation! }\n return figureSurfacePlaceOf(surface, surface.place, angles)\n }\n\n /** Arrows turn it a degree, fifteen with Shift: round the side, or round and up and down a sphere. */\n private turnKeys(ev: KeyboardEvent, surface: { form: 'around' | 'toward'; axis: Axis; place: FigureSurfacePlace }) {\n const step = { ArrowLeft: [-1, 0], ArrowRight: [1, 0], ArrowUp: [0, 1], ArrowDown: [0, -1] }[ev.key]\n if (!step || this.locked) return\n ev.preventDefault()\n ev.stopPropagation()\n const by = ev.shiftKey ? 15 : 1\n const now = figureSurfaceAnglesOf(surface, surface.place) as { around?: number; azimuth?: number; elevation?: number }\n if (surface.form === 'around') {\n if (!step[0]) return\n this.change({ surface: this.placeOf(surface, { around: now.around! + step[0] * by }) })\n } else this.change({ surface: this.placeOf(surface, { azimuth: now.azimuth! + step[0] * by, elevation: Math.max(-90, Math.min(90, now.elevation! + step[1] * by)) }) })\n this.released()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"figure-fasten-drawing.js","sourceRoot":"","sources":["../../client/modeller/figure-fasten-drawing.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, nothing, svg } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js'\nimport { figureAroundNormalOf, figureAroundOf, figureCaughtAngleOf, figureSurfaceAnglesOf, figureSurfacePlaceOf } from '@hatiolab/figure-model'\nimport type { FigureFace, FigureSurfacePlace } from '@hatiolab/figure-model'\n\nimport { focusOnRender } from './focus-on-render.js'\nimport { alignmentAt, drawingSpanOf, fastenLabelsOf, offsetOf, overhangOf, screenOf, type FaceView, type FastenMode } from './fasten-geometry.js'\nimport type { Alignment } from './links.js'\n\ntype Axis = 'x' | 'y' | 'z'\nconst AXES: Axis[] = ['x', 'y', 'z']\ntype SidePlace = Extract<FigureSurfacePlace, { around: number }>\ntype RoundPlace = Extract<FigureSurfacePlace, { toward: unknown }>\n\n/** A change the drawing asks of the fastening form. */\nexport type FastenChange =\n | { targetFace: string }\n | { onSurface: true }\n | { surface: FigureSurfacePlace }\n | { mode: FastenMode }\n | { axis: Axis; how: Alignment; mm?: number }\n | { gap: number }\n\nconst SEEN: Array<[FigureFace, string]> = [\n ['top', 'M60 30 L100 10 L200 10 L160 30 Z'],\n ['front', 'M60 30 L160 30 L160 100 L60 100 Z'],\n ['right', 'M160 30 L200 10 L200 80 L160 100 Z']\n]\n/** The faces the drawing cannot show on the box, as tags beside it where they are. */\n/* The box is drawn a little left of its picture's middle, and the viewBox shifts it back to the panel's centre. */\nconst HIDDEN: Array<[FigureFace, number, number]> = [\n ['bottom', 30, 114],\n ['left', 24, 62],\n ['back', 236, 14]\n]\nconst PANEL_W = 300\n/* The face seen from above, beside the box in the fastening window: taller than the panel's was, for a long face's parts. */\nconst WHERE_W = 360\nconst WHERE_H = 200\n\n\n/**\n * 붙이기 그림 (user 2026-10-01) — which face of what the part is fastened to, how, and where on it; each of them chosen\n * by pressing or dragging the drawing, none by a list of faces.\n *\n * The target is drawn as a box whose faces are pressed (the three it hides as tags beside it), or as the one plane the\n * figure stands by. How is three small side views -- set on it, flush with it, its centre on it (only for a part that\n * turns about a joint) -- and the chosen one's gap is dragged. Where is the face seen from above with the part's\n * footprint on it: dragged, caught at the centre and at the edges from inside and outside, a guide drawn where it is\n * caught and a dimension where it is not, which is pressed to type the number. It may go past the edges: the part that\n * does is shaded, and a part off the face altogether is said so. Nothing is decided here: every change goes to the form\n * (`fasten-change`), and a press or a drag let go says so (`fasten-release`). The window draws it twice, under its own\n * questions: the face (`show=\"face\"`: the box and the face seen from above, side by side) and the way (`show=\"how\"`).\n */\n@customElement('figure-fasten-drawing')\nexport class FigureFastenDrawing extends localize(i18next)(LitElement) {\n /* The panel's own field rows (where along a cylinder's side), as the window's other rows are. */\n static styles = [SidePanelStyles, css`\n :host {\n display: grid;\n gap: 8px;\n outline: none;\n }\n svg {\n width: 100%;\n display: block;\n touch-action: none;\n user-select: none;\n }\n svg text {\n font: inherit;\n }\n /*\n The ways on one line, a small side view beside each word: three cards of a drawing over a word made the window\n tall, and the fasten button below went off a laptop's screen (user 2026-11-12). The chosen one's gap is dragged\n on its small view still; the gap's field is in the details.\n */\n div[modes] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n }\n div[modes] svg {\n flex: none;\n width: 28px;\n height: 20px;\n }\n /* A choice drawn, not a box to press (the side's rule: no boxed buttons): the chosen one on the primary's ground. */\n div[modes] button {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px 2px 4px;\n white-space: nowrap;\n font: inherit;\n color: var(--md-sys-color-on-surface);\n background: none;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n }\n div[modes] button:hover:not([on]):not(:disabled) {\n background: var(--md-sys-color-surface-container);\n }\n /* Faces beyond the box's six and a curved surface: tags as the hidden faces are drawn beside the box -- one look for every face. */\n div[face-tags] {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 6px;\n }\n button[face-tag] {\n height: 20px;\n padding: 0 10px;\n font: inherit;\n font-size: var(--ui-t-small, 11.5px);\n color: var(--md-sys-color-on-surface-variant);\n background: transparent;\n border: 1px dashed var(--md-sys-color-outline);\n border-radius: 10px;\n cursor: pointer;\n }\n button[face-tag][on] {\n color: var(--md-sys-color-on-primary-container);\n background: var(--md-sys-color-primary-container);\n border: 1px solid var(--md-sys-color-primary);\n }\n div[modes] button[on] {\n background: var(--md-sys-color-primary-container, #d8e2ff);\n color: var(--md-sys-color-on-primary-container, #001a41);\n }\n /* The box and the face seen from above side by side, one under the other where the window is narrow. */\n div[face-row] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n gap: 12px;\n align-items: start;\n }\n div[face-row] > div {\n display: grid;\n gap: 8px;\n }\n /* The place is drawn at its own size, never blown up past it: its words stay the window's size. */\n div[where] {\n position: relative;\n width: 100%;\n max-width: 360px;\n justify-self: center;\n }\n div[where] input {\n position: absolute;\n width: 72px;\n font: inherit;\n }\n small[warn] {\n color: var(--md-sys-color-tertiary);\n }\n small[off] {\n color: var(--md-sys-color-error);\n }\n `]\n\n /** The target's name, or empty for the plane the figure stands by. */\n @property() target = ''\n /** The plane's name by the figure's placement: 바닥 · 천장 · 벽 · 중심. */\n @property() planeWord = ''\n @property({ attribute: false }) faces: string[] = []\n /** The target's own face at each place of the box, as it is drawn: a turned target's faces where they are seen. */\n @property({ attribute: false }) drawnFaces?: Partial<Record<FigureFace, FigureFace>>\n @property() face = ''\n @property({ attribute: false }) modes: FastenMode[] = ['meet', 'flush']\n @property() mode: FastenMode = 'meet'\n @property({ attribute: false }) view?: FaceView\n @property({ attribute: false }) align: Partial<Record<Axis, Alignment>> = {}\n @property({ attribute: false }) alignMm: Partial<Record<Axis, number>> = {}\n @property({ type: Number }) gap = 0\n /** The part being fastened (not `part`: that is every element's own). */\n @property() partName = ''\n @property({ type: Boolean }) locked = false\n /** The form already says how the fastening it has lies on the face: the drawing says it only while dragging. */\n @property({ type: Boolean }) said = false\n /** Which of its questions it draws: the face, or the way. */\n @property() show: 'face' | 'how' = 'face'\n /** The curved surface the target offers to be fastened to at a point (ADR-0140 3.9), if any. */\n @property() surfaceForm: 'around' | 'toward' | '' = ''\n /** Fastened to a point of that surface: which, about which axis, and where; undefined while on a face. */\n @property({ attribute: false }) surface?: { form: 'around' | 'toward'; axis: Axis; place: FigureSurfacePlace }\n /** The angles while one is dragged round the surface, told to the form when let go. */\n @state() private turning?: { around?: number; azimuth?: number; elevation?: number }\n\n /** Where the footprint is while dragging, and what it is caught by; undefined when nothing is dragged. */\n @state() private dragged?: { at: Record<Axis, number>; caught: Partial<Record<Axis, string>> }\n @state() private typing?: Axis\n private scale = 1\n private gapFrom?: { y: number; gap: number }\n\n private change(detail: FastenChange) {\n this.dispatchEvent(new CustomEvent('fasten-change', { detail, bubbles: true, composed: true }))\n }\n private released() {\n this.dispatchEvent(new CustomEvent('fasten-release', { bubbles: true, composed: true }))\n }\n\n render() {\n if (this.show === 'how') return this.renderModes()\n /* A part with no face (a sphere) has only its surface: its tag above, the place across the whole width. */\n if (this.target && !this.faces.length) return html`${this.renderTarget()}<div>${this.renderWhere()}</div>`\n return html`<div face-row>${this.target ? html`<div>${this.renderTarget()}</div>` : nothing}<div>${this.renderWhere()}</div></div>`\n }\n\n /** The target box, its faces pressed; or the plane. */\n private renderTarget() {\n /* The plane is one face, named in the list and on the face drawn below: nothing to pick, so no picture of it. */\n if (!this.target) return nothing\n const has = (f: string) => this.faces.includes(f)\n /* A press is a whole change, as a drag let go is: the form applies a fastening the part already has. */\n const pick = (f: string) => () => {\n if (this.locked || !has(f) || (!this.surface && f === this.face)) return\n this.change({ targetFace: f })\n this.released()\n }\n /* The face at each place as the target is drawn: its own name, pressed as its own. */\n const own = (place: FigureFace) => this.drawnFaces?.[place] ?? place\n const seen = SEEN.map(([place, d]) => {\n const f = own(place)\n const on = !this.surface && this.face === f\n return svg`<path face=${f} place=${place} d=${d} @click=${pick(f)}\n style=${`cursor:${has(f) ? 'pointer' : 'default'};fill:${on ? 'var(--md-sys-color-primary-container)' : 'var(--md-sys-color-surface-container)'};fill-opacity:${has(f) ? 1 : 0.4};stroke:${on ? 'var(--md-sys-color-primary)' : 'var(--md-sys-color-outline)'};stroke-width:${on ? 2 : 1}`}>\n <title>${i18next.t('figure.label.face-' + f)}</title></path>`\n })\n const hidden = HIDDEN.map(([place, x, y]) => {\n const f = own(place)\n const on = !this.surface && this.face === f\n return svg`<g face=${f} place=${place} @click=${pick(f)} style=${`cursor:${has(f) ? 'pointer' : 'default'};opacity:${has(f) ? 1 : 0.35}`}>\n <rect x=${x - 26} y=${y - 10} width=\"52\" height=\"20\" rx=\"10\"\n style=${`fill:${on ? 'var(--md-sys-color-primary-container)' : 'transparent'};stroke:${on ? 'var(--md-sys-color-primary)' : 'var(--md-sys-color-outline)'};stroke-dasharray:${on ? '' : '3 2'}`} />\n <text x=${x} y=${y + 4} text-anchor=\"middle\" font-size=\"11\" style=${`fill:${on ? 'var(--md-sys-color-on-primary-container)' : 'var(--md-sys-color-on-surface-variant)'}`}>${i18next.t('figure.label.face-' + f)}</text>\n </g>`\n })\n /* A shape's faces beyond its six outer ones -- a door frame's opening -- are tags of their own under the box. */\n const others = this.faces.filter(f => !SEEN.some(([s]) => own(s) === f) && !HIDDEN.some(([h]) => own(h) === f))\n /* A sphere has no face: no box of faces it has not, only its surface. */\n return html`${this.faces.length\n ? svg`<svg viewBox=\"-20 0 ${PANEL_W} 126\" role=\"img\" aria-label=${this.target}>\n ${seen}\n <text x=\"110\" y=\"70\" text-anchor=\"middle\" font-size=\"12\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-on-surface)\">${this.target}</text>\n ${hidden}\n </svg>`\n : nothing}\n ${others.length || this.surfaceForm\n ? html`<div face-tags>\n ${others.map(f => html`<button face-tag ?on=${!this.surface && f === this.face} ?disabled=${this.locked} @click=${pick(f)}>${i18next.t('figure.label.face-' + f, { defaultValue: f })}</button>`)}\n ${this.surfaceForm\n ? html`<button face-tag surface ?on=${!!this.surface} ?disabled=${this.locked}\n @click=${() => {\n if (this.locked || this.surface) return\n this.change({ onSurface: true })\n this.released()\n }}>${i18next.t('figure.label.surface-' + this.surfaceForm)}</button>`\n : nothing}\n </div>`\n : nothing}`\n }\n\n /** How: three side views; the chosen one's gap is dragged. */\n private renderModes() {\n /* One way only (the plane is set on): the sentence says it; a single choice is not offered as a button. */\n if (this.modes.length < 2) return nothing\n const icon = (m: FastenMode, on: boolean) => {\n const g = on && m !== 'centre' ? Math.min(this.gap / 4, 10) : 0\n const base = svg`<rect x=\"6\" y=\"30\" width=\"52\" height=\"14\" style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary)\" />`\n const gapDrag = on && !this.locked ? 'ns-resize' : 'pointer'\n if (m === 'meet')\n return svg`<svg viewBox=\"0 0 64 48\">${base}<rect gap x=\"22\" y=${18 - g} width=\"20\" height=\"12\" style=${`fill:var(--md-sys-color-surface);stroke:currentColor;cursor:${gapDrag}`} />\n ${g ? svg`<text x=\"46\" y=${26 - g / 2} font-size=\"10\" style=\"fill:currentColor\">${this.gap}</text>` : nothing}</svg>`\n if (m === 'flush')\n return svg`<svg viewBox=\"0 0 64 48\">${base}<rect gap x=\"22\" y=${30 - g} width=\"20\" height=\"10\" style=${`fill:var(--md-sys-color-surface);stroke:currentColor;cursor:${gapDrag}`} />\n <line x1=\"4\" y1=\"30\" x2=\"60\" y2=\"30\" style=\"stroke:currentColor;stroke-dasharray:2 2\" /></svg>`\n return svg`<svg viewBox=\"0 0 64 48\">${base}<circle cx=\"32\" cy=\"30\" r=\"11\" style=\"fill:var(--md-sys-color-surface);fill-opacity:.85;stroke:currentColor\" /><circle cx=\"32\" cy=\"30\" r=\"2\" style=\"fill:currentColor\" /></svg>`\n }\n return html`<div modes>\n ${this.modes.map(m => {\n const on = m === this.mode\n return html`<button mode=${m} ?on=${on} ?disabled=${this.locked}\n @click=${() => {\n if (on) return\n this.change({ mode: m })\n this.released()\n }}\n @pointerdown=${(ev: PointerEvent) => {\n if (!on || this.locked || !(ev.target as Element).hasAttribute?.('gap')) return\n ev.preventDefault()\n ;(ev.currentTarget as Element).setPointerCapture(ev.pointerId)\n this.gapFrom = { y: ev.clientY, gap: this.gap }\n }}\n @pointermove=${(ev: PointerEvent) => {\n if (!this.gapFrom) return\n this.change({ gap: Math.max(0, Math.round(this.gapFrom.gap + (this.gapFrom.y - ev.clientY) * 2)) })\n }}\n @pointerup=${() => {\n if (!this.gapFrom) return\n this.gapFrom = undefined\n this.released()\n }}>\n ${icon(m, on)}<span>${i18next.t('figure.label.fasten-mode-' + m)}</span>\n </button>`\n })}\n </div>`\n }\n\n /** Where the part's centre is on each axis now: the drag's, or the form's. */\n private centreOf(view: FaceView): Record<Axis, number> {\n if (this.dragged) return this.dragged.at\n const at = { x: 0, y: 0, z: 0 }\n for (const a of view.axes) at[a] = offsetOf(this.align[a], this.alignMm[a], view.face[a], view.part[a])\n return at\n }\n\n /** What each axis is caught by now: at the centre, level with an edge, touching one from outside, or nothing. */\n private caughtOf(view: FaceView, at: Record<Axis, number>): Partial<Record<Axis, string>> {\n if (this.dragged) return this.dragged.caught\n const out: Partial<Record<Axis, string>> = {}\n for (const a of view.axes) {\n const how = this.align[a] ?? 'centre'\n if (how === 'centre') out[a] = 'centre'\n else if (how === 'min' || how === 'max') out[a] = 'inside'\n else if (view.face[a] !== undefined && Math.abs(Math.abs(at[a]) - (view.face[a]! + view.part[a]) / 2) < 0.5) out[a] = 'outside'\n }\n return out\n }\n\n private renderWhere() {\n if (this.surface) return this.renderSurfaceWhere(this.surface)\n const view = this.view\n if (!view) return nothing\n const { h, v, sign } = screenOf(view.axes)\n const W = WHERE_W,\n H = WHERE_H\n /* Where the part is set, not where it is being dragged: the drawing's scale holds still under the pointer. */\n const set = (a: Axis) => offsetOf(this.align[a], this.alignMm[a], view.face[a], view.part[a])\n const span = (a: Axis) => drawingSpanOf(view.face[a], view.part[a], set(a))\n const k = Math.min((W - 40) / span(h), (H - 40) / span(v))\n this.scale = k\n const cx = W / 2,\n cy = H / 2\n const at = this.centreOf(view)\n const caught = this.caughtOf(view, at)\n const fw = (view.face[h] ?? 0) * k,\n fh = (view.face[v] ?? 0) * k\n const pw = view.part[h] * k,\n ph = view.part[v] * k\n const px = cx + sign[h] * at[h] * k - pw / 2,\n py = cy + sign[v] * at[v] * k - ph / 2\n const faceSized = view.face[h] !== undefined && view.face[v] !== undefined\n /* An end disc is drawn as the disc it is: its overhang is measured on it (ADR-0140 3.9). */\n const disc = !!view.measure.disc\n const fx = cx - fw / 2,\n fy = cy - fh / 2\n const ix = Math.max(fx, px),\n iy = Math.max(fy, py)\n const iw = Math.min(fx + fw, px + pw) - ix,\n ih = Math.min(fy + fh, py + ph) - iy\n const { touching, sides } = faceSized ? overhangOf(view, at) : { touching: true, sides: [] as ReturnType<typeof overhangOf>['sides'] }\n const round = this.mode === 'centre'\n const guide = (a: Axis) => {\n const c = caught[a]\n if (!c) return nothing\n const along = a === h\n const edge = c === 'centre' ? 0 : Math.sign(at[a]) * (view.face[a] ?? 0) / 2\n const pos = (along ? cx : cy) + sign[a] * edge * k\n const style = `stroke:var(--md-sys-color-primary);stroke-width:${c === 'centre' ? 1 : 2.5};stroke-dasharray:${c === 'centre' ? '4 3' : ''}`\n return along ? svg`<line x1=${pos} y1=\"4\" x2=${pos} y2=${H - 4} style=${style} />` : svg`<line x1=\"4\" y1=${pos} x2=${W - 4} y2=${pos} style=${style} />`\n }\n const dim = (a: Axis) => {\n /* Caught by the centre or an edge, the guide says where it is; a number only where nothing caught it. */\n if (caught[a]) return nothing\n const along = a === h\n const mm = Math.round(at[a])\n const label = `${mm > 0 ? '+' : ''}${mm} mm`\n const to = sign[a] * at[a] * k\n const tx = along ? cx + to / 2 : 8,\n ty = along ? H - 6 : cy + to / 2 + 4\n return svg`${along\n ? svg`<line x1=${cx} y1=${H - 16} x2=${cx + to} y2=${H - 16} style=\"stroke:var(--md-sys-color-on-surface)\" />`\n : svg`<line x1=\"20\" y1=${cy} x2=\"20\" y2=${cy + to} style=\"stroke:var(--md-sys-color-on-surface)\" />`}\n <text dim=${a} x=${tx} y=${ty} font-size=\"11\" text-anchor=${along ? 'middle' : 'start'}\n style=\"fill:var(--md-sys-color-primary);cursor:text;text-decoration:underline dotted\" @click=${() => !this.locked && (this.typing = a)}>${label}</text>`\n }\n const faceName = this.target ? `${this.target} ${i18next.t('figure.label.face-' + this.face)}` : this.planeWord\n const sizeWords = faceSized ? ` ${Math.round(view.face[h]!)} × ${Math.round(view.face[v]!)}` : ''\n const labels = fastenLabelsOf(faceSized ? { x: fx, y: fy, w: fw, h: fh } : { x: 6, y: 4, w: W - 12, h: H - 8 }, { x: px, y: py, w: pw, h: ph }, this.partName, H)\n return html`<div where tabindex=\"0\" @keydown=${(ev: KeyboardEvent) => this.keys(ev, view)}>\n ${svg`<svg viewBox=\"0 0 ${W} ${H}\" role=\"img\" aria-label=${faceName}\n @pointermove=${(ev: PointerEvent) => this.drag(ev, view, cx, cy)}\n @pointerup=${() => this.drop()} @pointercancel=${() => this.drop()}>\n ${faceSized\n ? svg`<rect x=${fx} y=${fy} width=${fw} height=${fh} rx=${disc ? fw / 2 : 4} ry=${disc ? fh / 2 : 4} style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary);stroke-width:2\" />`\n : svg`<rect x=\"1\" y=\"1\" width=${W - 2} height=${H - 2} rx=\"8\" style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary);stroke-width:2\" />`}\n <text face-name x=${labels.face.x} y=${labels.face.y} font-size=\"11\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-primary)\">${faceName}${sizeWords}</text>\n ${guide(h)}${guide(v)}\n <g footprint style=${`cursor:${this.locked ? 'default' : 'grab'}`} @pointerdown=${(ev: PointerEvent) => this.grab(ev, at, caught)}>\n <rect x=${px} y=${py} width=${pw} height=${ph} rx=${round ? pw / 2 : 2} style=\"fill:var(--md-sys-color-tertiary-container)\" />\n ${faceSized && iw > 0 && ih > 0\n ? svg`<rect x=${ix} y=${iy} width=${iw} height=${ih} rx=${round ? Math.min(iw, ih) / 2 : 2} style=\"fill:var(--md-sys-color-surface)\" />`\n : !faceSized\n ? svg`<rect x=${px} y=${py} width=${pw} height=${ph} rx=${round ? pw / 2 : 2} style=\"fill:var(--md-sys-color-surface)\" />`\n : nothing}\n <rect x=${px} y=${py} width=${pw} height=${ph} rx=${round ? pw / 2 : 2}\n style=${`fill:none;stroke:var(--md-sys-color-on-surface);stroke-width:1.5;stroke-dasharray:${touching ? '' : '4 3'}`} />\n <text part-name x=${labels.part.x} y=${labels.part.y} text-anchor=\"middle\" font-size=\"12\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-on-surface)\">${this.partName}</text>\n </g>\n ${dim(h)}${dim(v)}\n </svg>`}\n ${this.typing ? this.renderTyping(view, this.typing, at) : nothing}\n </div>\n ${this.said && !this.dragged\n ? nothing\n : !touching\n ? html`<small off role=\"status\">${i18next.t('figure.text.fasten-off-face', { face: faceName })}</small>`\n : sides.length\n ? html`<small warn role=\"status\">${i18next.t('figure.text.fasten-past-edges', {\n sides: sides.map(s => i18next.t(`figure.text.overhang-side-${s.side}`, { axis: s.axis.toUpperCase(), mm: String(s.mm) })).join(' · ')\n })}</small>`\n : nothing}`\n }\n\n private renderTyping(view: FaceView, a: Axis, at: Record<Axis, number>) {\n const along = a === screenOf(view.axes).h\n return html`<input type=\"number\" step=\"1\" aria-label=${`${a.toUpperCase()} mm`} .value=${String(Math.round(at[a]))}\n style=${along ? 'left: calc(50% - 36px); bottom: 0' : 'left: 4px; top: calc(50% - 12px)'}\n @keydown=${(ev: KeyboardEvent) => {\n ev.stopPropagation()\n if (ev.key === 'Escape') this.typing = undefined\n if (ev.key !== 'Enter') return\n const value = Number((ev.target as HTMLInputElement).value)\n this.typing = undefined\n if (!Number.isFinite(value)) return\n this.change({ axis: a, how: 'mm', mm: Math.round(value) })\n this.released()\n }}\n @blur=${() => (this.typing = undefined)}\n ${focusOnRender()} />`\n }\n\n private grab(ev: PointerEvent, at: Record<Axis, number>, caught: Partial<Record<Axis, string>>) {\n if (this.locked) return\n ;(ev.currentTarget as Element).closest('svg')!.setPointerCapture(ev.pointerId)\n this.dragged = { at: { ...at }, caught: { ...caught } }\n }\n\n /** The footprint follows the pointer, caught at the centre and edges within a few pixels. */\n private drag(ev: PointerEvent, view: FaceView, cx: number, cy: number) {\n if (!this.dragged) return\n const svgEl = ev.currentTarget as SVGSVGElement\n const pt = svgEl.createSVGPoint()\n pt.x = ev.clientX\n pt.y = ev.clientY\n const p = pt.matrixTransform(svgEl.getScreenCTM()!.inverse())\n const { h, v, sign } = screenOf(view.axes)\n const at = { ...this.dragged.at },\n caught: Partial<Record<Axis, string>> = {}\n for (const [a, d] of [\n [h, (sign[h] * (p.x - cx)) / this.scale],\n [v, (sign[v] * (p.y - cy)) / this.scale]\n ] as const) {\n const got = alignmentAt(d, view.face[a], view.part[a], view.edges[a], 8 / this.scale)\n at[a] = offsetOf(got.how, got.mm, view.face[a], view.part[a])\n if (got.caught) caught[a] = got.caught\n }\n this.dragged = { at, caught }\n }\n\n private drop() {\n const d = this.dragged\n if (!d || !this.view) return\n this.dragged = undefined\n for (const a of this.view.axes) {\n const got = alignmentAt(d.at[a], this.view.face[a], this.view.part[a], this.view.edges[a], 0.5)\n this.change({ axis: a, how: got.how, ...(got.how === 'mm' ? { mm: got.mm } : {}) })\n }\n this.released()\n }\n\n /** Arrows move the part a millimetre, ten with Shift; the centre and edges still catch it. */\n private keys(ev: KeyboardEvent, view: FaceView) {\n const step = { ArrowLeft: [-1, 0], ArrowRight: [1, 0], ArrowUp: [0, -1], ArrowDown: [0, 1] }[ev.key]\n if (!step || this.locked || this.typing) return\n ev.preventDefault()\n ev.stopPropagation()\n const by = ev.shiftKey ? 10 : 1\n const at = this.centreOf(view)\n const { h, v, sign } = screenOf(view.axes)\n ;[h, v].forEach((a, i) => {\n if (!step[i]) return\n /* Up the screen is up the face: a Y that rises goes up with the arrow. */\n const got = alignmentAt(at[a] + sign[a] * step[i]! * by, view.face[a], view.part[a], view.edges[a], by / 2)\n this.change({ axis: a, how: got.how, ...(got.how === 'mm' ? { mm: got.mm } : {}) })\n })\n this.released()\n }\n\n /**\n * Where on a curved surface (ADR-0140 3.9). A cylinder's side is seen from its end: its section a circle, the point\n * on its rim at the angle `around`, dragged round it -- caught at every 45°, where the faces it had are named -- and\n * along its length chosen below it. A sphere is seen from above and from the side: its point dragged round the\n * first for the direction across its axis, along the second for how high. Nothing is told the form until let go.\n */\n private renderSurfaceWhere(surface: { form: 'around' | 'toward'; axis: Axis; place: FigureSurfacePlace }) {\n const R = 56\n const axis = surface.axis\n const across = (['x', 'y', 'z'] as Axis[]).filter(a => a !== axis) as [Axis, Axis]\n const { h, v, sign } = screenOf(across)\n const deg = (r: number) => (r * 180) / Math.PI\n const rad = (d: number) => (d * Math.PI) / 180\n /* A direction across the axis on the circle drawn at (cx, cy): its point there, and the way back from a pointer. */\n const onCircle = (n: number[], cx: number, cy: number, r = R) => ({ x: cx + sign[h] * n[AXES.indexOf(h)]! * r, y: cy + sign[v] * n[AXES.indexOf(v)]! * r })\n const angleAt = (p: { x: number; y: number }, cx: number, cy: number) => {\n const d = [0, 0, 0]\n d[AXES.indexOf(h)] = sign[h] * (p.x - cx)\n d[AXES.indexOf(v)] = sign[v] * (p.y - cy)\n return figureAroundOf(axis, d)\n }\n const caught = (a: number) => figureCaughtAngleOf(a) % 360\n /* The faces the four quarters were named by, round the circle: where a part fastened to one of them now stands. */\n const FACE_AT: Record<Axis, [string, string]> = { x: ['left', 'right'], y: ['bottom', 'top'], z: ['back', 'front'] }\n const ticks = (cx: number, cy: number) =>\n [0, 90, 180, 270].map(t => {\n const n = figureAroundNormalOf(axis, t)\n const k = n.findIndex(c => Math.abs(c) > 0.5)\n const word = i18next.t('figure.label.face-' + FACE_AT[AXES[k]!][n[k]! > 0 ? 1 : 0])\n const p = onCircle(n, cx, cy, R + 16)\n return svg`<text x=${p.x} y=${p.y + 4} text-anchor=\"middle\" font-size=\"10\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-on-surface-variant)\">${word}</text>`\n })\n const marker = (p: { x: number; y: number }, cx: number, cy: number, label: string) => svg`\n <line x1=${cx} y1=${cy} x2=${p.x} y2=${p.y} style=\"stroke:var(--md-sys-color-primary);stroke-dasharray:3 2\" />\n <circle marker cx=${p.x} cy=${p.y} r=\"8\" style=${`fill:var(--md-sys-color-tertiary-container);stroke:var(--md-sys-color-on-surface);cursor:${this.locked ? 'default' : 'grab'}`} />\n <text x=${cx} y=${Math.hypot(p.x - cx, p.y - cy) < 16 ? cy - 14 : cy + 4} text-anchor=\"middle\" font-size=\"11\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-primary)\">${label}</text>`\n const drag = (on: (p: { x: number; y: number }) => void) => ({\n down: (ev: PointerEvent) => {\n if (this.locked) return\n ;(ev.currentTarget as Element).setPointerCapture(ev.pointerId)\n on(this.pointIn(ev))\n },\n move: (ev: PointerEvent) => {\n if (!this.turning || !(ev.currentTarget as Element).hasPointerCapture?.(ev.pointerId)) return\n on(this.pointIn(ev))\n },\n up: () => this.letGo(surface)\n })\n if (surface.form === 'around') {\n const place = surface.place as SidePlace\n const around = this.turning?.around ?? place.around\n /* The section in the middle under its name, the ticks clear of both. */\n const cx = WHERE_W / 2,\n cy = 110\n const d = drag(p => (this.turning = { around: caught(angleAt(p, cx, cy)) }))\n return html`<div where surface tabindex=\"0\" @keydown=${(ev: KeyboardEvent) => this.turnKeys(ev, surface)}>\n ${svg`<svg viewBox=\"0 0 ${WHERE_W} ${WHERE_H}\" role=\"img\" aria-label=${i18next.t('figure.label.surface-seen-end', { part: this.target })}\n @pointerdown=${d.down} @pointermove=${d.move} @pointerup=${d.up} @pointercancel=${d.up}>\n <text x=${WHERE_W / 2} y=\"14\" text-anchor=\"middle\" font-size=\"11\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-primary)\">${i18next.t('figure.label.surface-seen-end', { part: this.target })}</text>\n <circle cx=${cx} cy=${cy} r=${R} style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary);stroke-width:2\" />\n ${ticks(cx, cy)}\n ${marker(onCircle(figureAroundNormalOf(axis, around), cx, cy), cx, cy, `${Math.round(around)}°`)}\n </svg>`}\n </div>\n ${this.renderAlong(surface.axis, place.along)}`\n }\n /* A sphere: its direction across its axis (the azimuth, by the same rule as a cylinder's around) and how high. */\n const now = figureSurfaceAnglesOf(surface, surface.place) as { azimuth: number; elevation: number }\n const azimuth = this.turning?.azimuth ?? now.azimuth\n const elevation = this.turning?.elevation ?? now.elevation\n const ax = 110,\n ay = 110,\n sx = 250,\n sy = 110\n const aboveAt = onCircle(figureAroundNormalOf(axis, azimuth), ax, ay, R * Math.cos(rad(elevation)) || 0)\n const sideAt = { x: sx + R * Math.cos(rad(elevation)), y: sy - R * Math.sin(rad(elevation)) }\n const d = drag(p => {\n const above = Math.hypot(p.x - ax, p.y - ay) <= R + 16 && p.x < (ax + sx) / 2\n this.turning = above\n ? { azimuth: caught(angleAt(p, ax, ay)), elevation }\n : { azimuth, elevation: Math.max(-90, Math.min(90, figureCaughtAngleOf(deg(Math.atan2(sy - p.y, Math.max(0, p.x - sx)))))) }\n })\n return html`<div where surface tabindex=\"0\" @keydown=${(ev: KeyboardEvent) => this.turnKeys(ev, surface)}>\n ${svg`<svg viewBox=\"0 0 ${WHERE_W} ${WHERE_H}\" role=\"img\" aria-label=${i18next.t('figure.label.surface-toward')}\n @pointerdown=${d.down} @pointermove=${d.move} @pointerup=${d.up} @pointercancel=${d.up}>\n <text x=${ax} y=\"14\" text-anchor=\"middle\" font-size=\"11\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-primary)\">${i18next.t('figure.label.surface-seen-above')}</text>\n <circle cx=${ax} cy=${ay} r=${R} style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary);stroke-width:2\" />\n ${ticks(ax, ay)}\n ${marker(aboveAt, ax, ay, `${Math.round(azimuth)}°`)}\n <text x=${sx + R / 2} y=\"14\" text-anchor=\"middle\" font-size=\"11\" pointer-events=\"none\" style=\"fill:var(--md-sys-color-primary)\">${i18next.t('figure.label.surface-seen-side')}</text>\n <path d=${`M ${sx} ${sy - R} A ${R} ${R} 0 0 1 ${sx} ${sy + R}`} style=\"fill:var(--md-sys-color-primary-container);stroke:var(--md-sys-color-primary);stroke-width:2\" />\n <line x1=${sx} y1=${sy - R} x2=${sx} y2=${sy + R} style=\"stroke:var(--md-sys-color-primary)\" />\n ${marker(sideAt, sx, sy, `${Math.round(elevation)}°`)}\n </svg>`}\n </div>`\n }\n\n /** Where along a cylinder's side: centred, level with an end, or a distance from the middle -- its alignment words. */\n private renderAlong(axis: Axis, along: unknown) {\n const how = along === 'min' || along === 'max' ? along : along && typeof along === 'object' ? 'mm' : 'centre'\n const mm = how === 'mm' ? Number((along as { mm: number }).mm) || 0 : 0\n const place = this.surface!.place as SidePlace\n const tell = (next: unknown) => {\n this.change({ surface: { around: place.around, along: next as never } })\n this.released()\n }\n return html`<div form along>\n <span>${i18next.t('figure.label.align-' + axis)}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => {\n const v = (e.target as HTMLSelectElement).value\n tell(v === 'mm' ? { mm } : v)\n }}>\n <option value=\"centre\" ?selected=${how === 'centre'}>${i18next.t('figure.label.align-centre')}</option>\n <option value=\"min\" ?selected=${how === 'min'}>${i18next.t(`figure.label.align-${axis}-min`)}</option>\n <option value=\"max\" ?selected=${how === 'max'}>${i18next.t(`figure.label.align-${axis}-max`)}</option>\n <option value=\"mm\" ?selected=${how === 'mm'}>${i18next.t('figure.label.align-mm')}</option>\n </select>\n ${how === 'mm'\n ? html`<span></span><input type=\"number\" step=\"any\" aria-label=${i18next.t('figure.label.align-mm')} .value=${String(mm)}\n ?disabled=${this.locked} @change=${(e: Event) => tell({ mm: Number((e.target as HTMLInputElement).value) || 0 })} />`\n : nothing}\n </div>`\n }\n\n /** A pointer's place in the drawing's own units. */\n private pointIn(ev: PointerEvent) {\n const svgEl = (ev.currentTarget as Element).closest('svg') as SVGSVGElement\n const pt = svgEl.createSVGPoint()\n pt.x = ev.clientX\n pt.y = ev.clientY\n return pt.matrixTransform(svgEl.getScreenCTM()!.inverse())\n }\n\n /** Let go: the angles dragged become the place, told to the form once. */\n private letGo(surface: { form: 'around' | 'toward'; axis: Axis; place: FigureSurfacePlace }) {\n const t = this.turning\n if (!t) return\n this.turning = undefined\n this.change({ surface: this.placeOf(surface, t) })\n this.released()\n }\n\n /** The place the angles come to: the kernel's (`figureSurfacePlaceOf`), along a side kept. */\n private placeOf(surface: { form: 'around' | 'toward'; axis: Axis; place: FigureSurfacePlace }, t: { around?: number; azimuth?: number; elevation?: number }): FigureSurfacePlace {\n const now = figureSurfaceAnglesOf(surface, surface.place) as { around?: number; azimuth?: number; elevation?: number }\n const angles = surface.form === 'around' ? { around: t.around ?? now.around! } : { azimuth: t.azimuth ?? now.azimuth!, elevation: t.elevation ?? now.elevation! }\n return figureSurfacePlaceOf(surface, surface.place, angles)\n }\n\n /** Arrows turn it a degree, fifteen with Shift: round the side, or round and up and down a sphere. */\n private turnKeys(ev: KeyboardEvent, surface: { form: 'around' | 'toward'; axis: Axis; place: FigureSurfacePlace }) {\n const step = { ArrowLeft: [-1, 0], ArrowRight: [1, 0], ArrowUp: [0, 1], ArrowDown: [0, -1] }[ev.key]\n if (!step || this.locked) return\n ev.preventDefault()\n ev.stopPropagation()\n const by = ev.shiftKey ? 15 : 1\n const now = figureSurfaceAnglesOf(surface, surface.place) as { around?: number; azimuth?: number; elevation?: number }\n if (surface.form === 'around') {\n if (!step[0]) return\n this.change({ surface: this.placeOf(surface, { around: now.around! + step[0] * by }) })\n } else this.change({ surface: this.placeOf(surface, { azimuth: now.azimuth! + step[0] * by, elevation: Math.max(-90, Math.min(90, now.elevation! + step[1] * by)) }) })\n this.released()\n }\n}\n"]}
|
|
@@ -7,7 +7,7 @@ import '@operato/popup/ox-popup-actions.js';
|
|
|
7
7
|
import { CommonPopupStyles, FormFieldStyles } from '@operato/styles';
|
|
8
8
|
import '@material/web/button/filled-button.js';
|
|
9
9
|
import '@material/web/button/text-button.js';
|
|
10
|
-
import { firstSaveRefusalOf, offeredTypeOf, releasableType, typeOf } from './first-save.js';
|
|
10
|
+
import { firstSaveRefusalOf, offeredTypeOf, releasableType, typeOf, typingTypeOf } from './first-save.js';
|
|
11
11
|
/**
|
|
12
12
|
* The first save of a new figure: its type and its name, asked once, in the suite's popup look.
|
|
13
13
|
* Closes with the answer, or with nothing when cancelled -- then nothing is saved.
|
|
@@ -31,6 +31,7 @@ let FigureFirstSave = class FigureFirstSave extends LitElement {
|
|
|
31
31
|
this.confirm();
|
|
32
32
|
};
|
|
33
33
|
this.confirm = () => {
|
|
34
|
+
this.type = typeOf(this.type);
|
|
34
35
|
this.refusal = firstSaveRefusalOf(this.type, this.taken);
|
|
35
36
|
if (this.refusal)
|
|
36
37
|
return;
|
|
@@ -107,13 +108,13 @@ let FigureFirstSave = class FigureFirstSave extends LitElement {
|
|
|
107
108
|
.value=${this.type}
|
|
108
109
|
placeholder=${i18next.t('figure.text.figure-type-example')}
|
|
109
110
|
@input=${(e) => {
|
|
110
|
-
this.type =
|
|
111
|
+
this.type = typingTypeOf(e.target.value);
|
|
111
112
|
e.target.value = this.type;
|
|
112
113
|
this.refusal = null;
|
|
113
114
|
}}
|
|
114
115
|
@keydown=${this.onKey}
|
|
115
116
|
/>
|
|
116
|
-
${this.type && !releasableType(this.type)
|
|
117
|
+
${typeOf(this.type) && !releasableType(typeOf(this.type))
|
|
117
118
|
? html `<div class="note">${i18next.t('figure.text.type-name-will-not-release')}</div>`
|
|
118
119
|
: this.suggested && this.type === this.suggested
|
|
119
120
|
? html `<div class="note">${i18next.t('figure.text.identifier-suggested')}</div>`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"figure-first-save.js","sourceRoot":"","sources":["../../client/modeller/figure-first-save.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { closePopup } from '@operato/popup'\nimport '@operato/popup/ox-popup-actions.js'\nimport { CommonPopupStyles, FormFieldStyles } from '@operato/styles'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\n\nimport { firstSaveRefusalOf, offeredTypeOf, releasableType, typeOf, type FirstSave } from './first-save.js'\n\n/**\n * The first save of a new figure: its type and its name, asked once, in the suite's popup look.\n * Closes with the answer, or with nothing when cancelled -- then nothing is saved.\n */\n@customElement('figure-first-save')\nexport class FigureFirstSave extends LitElement {\n static styles = [\n FormFieldStyles,\n CommonPopupStyles,\n css`\n /* The popup's height is a share of the window (small is 40%): on a low window the buttons must still be reached. */\n :host {\n overflow-y: auto;\n }\n div[field] {\n display: grid;\n gap: 4px;\n }\n div[field] label {\n font-size: var(--popup-font-size-small);\n color: var(--md-sys-color-on-surface-variant);\n }\n div[field] input,\n div[field] select {\n box-sizing: border-box;\n width: 100%;\n }\n [type-field] {\n font-family: var(--ui-mono, ui-monospace, monospace);\n }\n `\n ]\n\n /** The type the figure has so far -- empty for a temporary one, which is not offered. */\n @property() type = ''\n @property() name = ''\n /** Type names already used in this domain. */\n @property({ attribute: false }) taken: string[] = []\n /** The domain's active namespaces, its default first. Asked only when there are several (LV figure-server design G1). */\n @property({ attribute: false }) namespaces: { name: string; isDefault: boolean }[] = []\n @state() private namespace = ''\n @state() private refusal: { key: string; type?: string } | null = null\n /** The identifier offered, while the author has not changed it. */\n @state() private suggested = ''\n\n /*\n Asked for a name first, with a valid identifier already there to keep or change (Q-D3). The identifier is not the\n name: renaming does not change it, and a retried first save opens on the one answered before (the page keeps it).\n Only an offered one found taken -- told by the server, or in the list -- is offered again; one the author typed is\n kept as typed, and its refusal said.\n */\n willUpdate(changed: Map<string, unknown>) {\n if (!(changed.has('type') || changed.has('taken'))) return\n const offer = offeredTypeOf(this.type, this.name, this.taken)\n this.type = offer.type\n if (offer.suggested !== undefined) this.suggested = offer.suggested\n }\n\n /*\n The name is focused here, each time the question opens. The browser honours `autofocus` once per document: the\n question asked again opened with nothing focused, and any autofocus taken earlier on the page left even the first\n opening unfocused (2026-10-11, product-page check).\n */\n firstUpdated() {\n this.renderRoot.querySelector<HTMLInputElement>('#name')?.focus()\n }\n\n render() {\n return html`\n <div class=\"what\">${i18next.t('figure.text.save-new-figure-desc')}</div>\n <div field>\n <label for=\"name\">${i18next.t('figure.label.name')}</label>\n <input\n id=\"name\"\n .value=${this.name}\n placeholder=${i18next.t('figure.text.figure-name-example')}\n @input=${(e: Event) => (this.name = (e.target as HTMLInputElement).value)}\n @keydown=${this.onKey}\n />\n </div>\n <div field>\n <label for=\"type\">${i18next.t('figure.label.figure-identifier')}</label>\n <input\n id=\"type\"\n type-field\n .value=${this.type}\n placeholder=${i18next.t('figure.text.figure-type-example')}\n @input=${(e: Event) => {\n this.type = typeOf((e.target as HTMLInputElement).value)\n ;(e.target as HTMLInputElement).value = this.type\n this.refusal = null\n }}\n @keydown=${this.onKey}\n />\n ${this.type && !releasableType(this.type)\n ? html`<div class=\"note\">${i18next.t('figure.text.type-name-will-not-release')}</div>`\n : this.suggested && this.type === this.suggested\n ? html`<div class=\"note\">${i18next.t('figure.text.identifier-suggested')}</div>`\n : nothing}\n </div>\n ${this.namespaces.length > 1\n ? html`<div field>\n <label for=\"namespace\">${i18next.t('figure.label.namespace')}</label>\n <select id=\"namespace\" type-field @change=${(e: Event) => (this.namespace = (e.target as HTMLSelectElement).value)}>\n ${this.namespaces.map(\n namespace => html`<option value=${namespace.name} ?selected=${namespace.name === this.chosenNamespace}>${namespace.name}</option>`\n )}\n </select>\n </div>`\n : nothing}\n ${this.refusal ? html`<div class=\"failure\" role=\"alert\">${i18next.t(this.refusal.key, { type: this.refusal.type })}</div>` : nothing}\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => closePopup(this)}>${i18next.t('figure.button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" ?disabled=${!this.type} @click=${this.confirm}>${i18next.t('figure.button.save')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n private onKey = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.isComposing) this.confirm()\n }\n\n private confirm = () => {\n this.refusal = firstSaveRefusalOf(this.type, this.taken)\n if (this.refusal) return\n const namespace = this.namespaces.length > 1 ? this.chosenNamespace : undefined\n closePopup(this, { type: this.type, name: this.name.trim() || this.type, ...(namespace ? { namespace } : {}) } satisfies FirstSave)\n }\n\n /** The namespace chosen, or the domain's default until one is. */\n private get chosenNamespace(): string {\n return this.namespace || this.namespaces.find(namespace => namespace.isDefault)?.name || this.namespaces[0]?.name || ''\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"figure-first-save.js","sourceRoot":"","sources":["../../client/modeller/figure-first-save.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { i18next } from '@operato/i18n'\nimport { closePopup } from '@operato/popup'\nimport '@operato/popup/ox-popup-actions.js'\nimport { CommonPopupStyles, FormFieldStyles } from '@operato/styles'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\n\nimport { firstSaveRefusalOf, offeredTypeOf, releasableType, typeOf, typingTypeOf, type FirstSave } from './first-save.js'\n\n/**\n * The first save of a new figure: its type and its name, asked once, in the suite's popup look.\n * Closes with the answer, or with nothing when cancelled -- then nothing is saved.\n */\n@customElement('figure-first-save')\nexport class FigureFirstSave extends LitElement {\n static styles = [\n FormFieldStyles,\n CommonPopupStyles,\n css`\n /* The popup's height is a share of the window (small is 40%): on a low window the buttons must still be reached. */\n :host {\n overflow-y: auto;\n }\n div[field] {\n display: grid;\n gap: 4px;\n }\n div[field] label {\n font-size: var(--popup-font-size-small);\n color: var(--md-sys-color-on-surface-variant);\n }\n div[field] input,\n div[field] select {\n box-sizing: border-box;\n width: 100%;\n }\n [type-field] {\n font-family: var(--ui-mono, ui-monospace, monospace);\n }\n `\n ]\n\n /** The type the figure has so far -- empty for a temporary one, which is not offered. */\n @property() type = ''\n @property() name = ''\n /** Type names already used in this domain. */\n @property({ attribute: false }) taken: string[] = []\n /** The domain's active namespaces, its default first. Asked only when there are several (LV figure-server design G1). */\n @property({ attribute: false }) namespaces: { name: string; isDefault: boolean }[] = []\n @state() private namespace = ''\n @state() private refusal: { key: string; type?: string } | null = null\n /** The identifier offered, while the author has not changed it. */\n @state() private suggested = ''\n\n /*\n Asked for a name first, with a valid identifier already there to keep or change (Q-D3). The identifier is not the\n name: renaming does not change it, and a retried first save opens on the one answered before (the page keeps it).\n Only an offered one found taken -- told by the server, or in the list -- is offered again; one the author typed is\n kept as typed, and its refusal said.\n */\n willUpdate(changed: Map<string, unknown>) {\n if (!(changed.has('type') || changed.has('taken'))) return\n const offer = offeredTypeOf(this.type, this.name, this.taken)\n this.type = offer.type\n if (offer.suggested !== undefined) this.suggested = offer.suggested\n }\n\n /*\n The name is focused here, each time the question opens. The browser honours `autofocus` once per document: the\n question asked again opened with nothing focused, and any autofocus taken earlier on the page left even the first\n opening unfocused (2026-10-11, product-page check).\n */\n firstUpdated() {\n this.renderRoot.querySelector<HTMLInputElement>('#name')?.focus()\n }\n\n render() {\n return html`\n <div class=\"what\">${i18next.t('figure.text.save-new-figure-desc')}</div>\n <div field>\n <label for=\"name\">${i18next.t('figure.label.name')}</label>\n <input\n id=\"name\"\n .value=${this.name}\n placeholder=${i18next.t('figure.text.figure-name-example')}\n @input=${(e: Event) => (this.name = (e.target as HTMLInputElement).value)}\n @keydown=${this.onKey}\n />\n </div>\n <div field>\n <label for=\"type\">${i18next.t('figure.label.figure-identifier')}</label>\n <input\n id=\"type\"\n type-field\n .value=${this.type}\n placeholder=${i18next.t('figure.text.figure-type-example')}\n @input=${(e: Event) => {\n this.type = typingTypeOf((e.target as HTMLInputElement).value)\n ;(e.target as HTMLInputElement).value = this.type\n this.refusal = null\n }}\n @keydown=${this.onKey}\n />\n ${typeOf(this.type) && !releasableType(typeOf(this.type))\n ? html`<div class=\"note\">${i18next.t('figure.text.type-name-will-not-release')}</div>`\n : this.suggested && this.type === this.suggested\n ? html`<div class=\"note\">${i18next.t('figure.text.identifier-suggested')}</div>`\n : nothing}\n </div>\n ${this.namespaces.length > 1\n ? html`<div field>\n <label for=\"namespace\">${i18next.t('figure.label.namespace')}</label>\n <select id=\"namespace\" type-field @change=${(e: Event) => (this.namespace = (e.target as HTMLSelectElement).value)}>\n ${this.namespaces.map(\n namespace => html`<option value=${namespace.name} ?selected=${namespace.name === this.chosenNamespace}>${namespace.name}</option>`\n )}\n </select>\n </div>`\n : nothing}\n ${this.refusal ? html`<div class=\"failure\" role=\"alert\">${i18next.t(this.refusal.key, { type: this.refusal.type })}</div>` : nothing}\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => closePopup(this)}>${i18next.t('figure.button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" ?disabled=${!this.type} @click=${this.confirm}>${i18next.t('figure.button.save')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n private onKey = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.isComposing) this.confirm()\n }\n\n private confirm = () => {\n this.type = typeOf(this.type)\n this.refusal = firstSaveRefusalOf(this.type, this.taken)\n if (this.refusal) return\n const namespace = this.namespaces.length > 1 ? this.chosenNamespace : undefined\n closePopup(this, { type: this.type, name: this.name.trim() || this.type, ...(namespace ? { namespace } : {}) } satisfies FirstSave)\n }\n\n /** The namespace chosen, or the domain's default until one is. */\n private get chosenNamespace(): string {\n return this.namespace || this.namespaces.find(namespace => namespace.isDefault)?.name || this.namespaces[0]?.name || ''\n }\n}\n"]}
|
|
@@ -3,7 +3,14 @@ import { LitElement, nothing } from 'lit';
|
|
|
3
3
|
import '@operato/input/ox-input-select-buttons.js';
|
|
4
4
|
import './figure-slot-layout-panel.js';
|
|
5
5
|
import './figure-size-editor.js';
|
|
6
|
+
import { type MotionForm } from './links.js';
|
|
6
7
|
import type { FigureRevision } from './revision.js';
|
|
8
|
+
/**
|
|
9
|
+
* The motion a part's form starts from: a part hung on another part most often turns there -- a thigh at the hip, a door
|
|
10
|
+
* at its frame -- so it starts as a turn; a part on the plane, or on nothing, as a slide (review 2026-11-11: eight
|
|
11
|
+
* joints of a humanoid, each changed from slide to turn by hand).
|
|
12
|
+
*/
|
|
13
|
+
export declare function motionStartOf(revision: FigureRevision | undefined, part: string): MotionForm;
|
|
7
14
|
declare const FigureLinks_base: (new (...args: any[]) => LitElement) & typeof LitElement;
|
|
8
15
|
/**
|
|
9
16
|
* What a part is tied to — its size response, what it is fastened to, how it moves.
|
|
@@ -135,6 +142,8 @@ export declare class FigureLinks extends FigureLinks_base {
|
|
|
135
142
|
* the middle of its round cover, not its edge. Before, a hidden part stood in for the point (robot dog, 2026-11-03).
|
|
136
143
|
*/
|
|
137
144
|
private renderThrough;
|
|
145
|
+
private pivotCache?;
|
|
146
|
+
private renderPivotPoints;
|
|
138
147
|
private renderMotion;
|
|
139
148
|
private setKind;
|
|
140
149
|
private command;
|