@things-factory/figure-ui 10.1.210 → 10.1.211

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.
@@ -65,6 +65,8 @@ export declare class FigureLinks extends FigureLinks_base {
65
65
  private row;
66
66
  /** The motion form is open over the part's own motion, to change it where it is. */
67
67
  private editingMotion;
68
+ /** Which of the joint's axes the form is over (ADR-0159); one past the last is a new axis. */
69
+ private motionAxis;
68
70
  private loadedFor?;
69
71
  willUpdate(changed: Map<string, unknown>): void;
70
72
  updated(): void;
@@ -6,8 +6,8 @@ import './figure-slot-layout-panel.js';
6
6
  import './figure-size-editor.js';
7
7
  import { customElement, property, state } from 'lit/decorators.js';
8
8
  import { i18next, localize } from '@operato/i18n';
9
- import { figureFaceOverhangOf } from '@hatiolab/figure-model';
10
- import { acceptsOf, AXES, canFasten, canFollow, positionIsShare, heldBy, shownWhenOf, visibilityControlsOf, fasteningOf, hasInstanceSize, holdsThings, leadersFor, motionOf, motionFormOf, motionFormRefusalOf, endPlaceKeyOf, motionJoint, placeFacesOf, placeIdFor, placesOn, rowAxesOf, rowBlockOf, fixedJointOf, rowOf, positionsWorkedOut } from './links.js';
9
+ import { figureFaceOverhangOf, figureMotionsOf, motionIdOf } from '@hatiolab/figure-model';
10
+ import { acceptsOf, AXES, canFasten, canFollow, positionIsShare, heldBy, shownWhenOf, visibilityControlsOf, fasteningOf, hasInstanceSize, holdsThings, leadersFor, motionOf, motionFormOf, motionFormRefusalOf, endPlaceKeyOf, motionJoint, controlIdFor, withoutAxis, placeFacesOf, placeIdFor, placesOn, rowAxesOf, rowBlockOf, fixedJointOf, rowOf, positionsWorkedOut } from './links.js';
11
11
  import { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js';
12
12
  import { insideAlignmentOf } from './fasten-geometry.js';
13
13
  import { fastenFormOf, fastenPlanOf, fastenSentenceOf } from './fasten-form.js';
@@ -66,6 +66,8 @@ let FigureLinks = class FigureLinks extends localize(i18next)(LitElement) {
66
66
  this.row = freshRow();
67
67
  /** The motion form is open over the part's own motion, to change it where it is. */
68
68
  this.editingMotion = false;
69
+ /** Which of the joint's axes the form is over (ADR-0159); one past the last is a new axis. */
70
+ this.motionAxis = 0;
69
71
  }
70
72
  static { this.styles = [SidePanelStyles, GroupMenuStyles, css `
71
73
  :host {
@@ -153,6 +155,7 @@ let FigureLinks = class FigureLinks extends localize(i18next)(LitElement) {
153
155
  this.rowOpen = false;
154
156
  this.rowCandidate = undefined;
155
157
  this.editingMotion = false;
158
+ this.motionAxis = 0;
156
159
  }
157
160
  }
158
161
  updated() {
@@ -562,6 +565,45 @@ let FigureLinks = class FigureLinks extends localize(i18next)(LitElement) {
562
565
  /* Which part moves, against what, which way, how far -- by name (ADR-0097 §5.5). */
563
566
  const against = joint ? ('plane' in joint.body0 ? i18next.t('figure.label.mounting-plane') : joint.body0.part) : '';
564
567
  const ends = this.motionEnds;
568
+ /* One row an axis (ADR-0159): how it moves and by what, changed or taken away where it is; more added under them. */
569
+ const count = joint ? figureMotionsOf(joint).length : 1;
570
+ const edit = (k) => {
571
+ if (!joint)
572
+ return;
573
+ this.motionAxis = k;
574
+ this.motion = motionFormOf(joint, k);
575
+ this.editingMotion = true;
576
+ };
577
+ const row = (k) => {
578
+ const it = k === 0 ? now : motionOf(asset, this.partId, k);
579
+ if (!it)
580
+ return nothing;
581
+ return html `<div pair motion-axis=${k}>
582
+ <span>
583
+ ${count > 1 ? html `<b>${i18next.t('figure.label.motion-axis-n', { n: k + 1 })}</b> ` : nothing}${i18next.t('figure.label.motion-' + it.kind)} · ${it.vector ? jointAxisWord(it.vector) : String(it.axis).toUpperCase()}
584
+ ${it.travel
585
+ ? html `<small>${i18next.t('figure.label.motion-travel-is', { part: it.travel.part, axis: it.travel.axis.toUpperCase(), plus: it.travel.plus ?? 0 })}</small>`
586
+ : nothing}
587
+ ${it.follows?.sum.length === 1
588
+ ? html `<small>${i18next.t('figure.label.motion-follows', { joint: it.follows.sum[0].joint, multiplier: it.follows.sum[0].multiplier, offset: it.follows.offset })}</small>`
589
+ : it.follows
590
+ ? html `<small>${i18next.t('figure.label.motion-follow')}: ${it.follows.sum.map(t => `${t.joint} × ${t.multiplier}`).join(' + ')} + ${it.follows.offset}</small>`
591
+ : it.control
592
+ ? html `<small>${it.control.id} (${it.control.unit}) ${it.control.min} … ${it.control.max}</small>`
593
+ : nothing}
594
+ </span>
595
+ ${count > 1
596
+ ? html `<button act remove-axis ?disabled=${this.locked || !joint} @click=${() => joint && this.command({ kind: 'set-joint', joint: withoutAxis(joint, k) })}>
597
+ <md-icon>close</md-icon>${i18next.t('figure.button.remove-axis')}
598
+ </button>`
599
+ : html `<button act ?disabled=${this.locked || !joint} @click=${() => joint && this.command({ kind: 'set-joint', joint: fixedJointOf(joint) })}>
600
+ <md-icon>close</md-icon>${i18next.t('figure.button.remove-motion')}
601
+ </button>`}
602
+ <button act ?disabled=${this.locked || !joint} @click=${() => edit(k)}>
603
+ <md-icon>edit</md-icon>${i18next.t('figure.button.change-motion')}
604
+ </button>
605
+ </div>`;
606
+ };
565
607
  return html `<p motion-summary>
566
608
  ${i18next.t('figure.text.motion-summary', {
567
609
  part: this.partId,
@@ -573,40 +615,17 @@ let FigureLinks = class FigureLinks extends localize(i18next)(LitElement) {
573
615
  ${ends
574
616
  ? html `<p hint motion-ends>${i18next.t('figure.text.motion-ends-shown', { min: String(ends.min), max: String(ends.max), unit: ends.unit })}</p>`
575
617
  : nothing}
618
+ ${Array.from({ length: count }, (_, k) => row(k))}
576
619
  <div pair>
577
- <span>
578
- ${i18next.t('figure.label.motion-' + now.kind)} · ${now.vector ? jointAxisWord(now.vector) : String(now.axis).toUpperCase()}
579
- ${now.travel
580
- ? html `<small>${i18next.t('figure.label.motion-travel-is', { part: now.travel.part, axis: now.travel.axis.toUpperCase(), plus: now.travel.plus ?? 0 })}</small>`
620
+ <button act add-axis ?disabled=${this.locked || !joint} @click=${() => edit(count)}>
621
+ <md-icon>add</md-icon>${i18next.t('figure.button.add-axis')}
622
+ </button>
623
+ ${count > 1
624
+ ? html `<button act ?disabled=${this.locked || !joint} @click=${() => joint && this.command({ kind: 'set-joint', joint: fixedJointOf(joint) })}>
625
+ <md-icon>close</md-icon>${i18next.t('figure.button.remove-motion')}
626
+ </button>`
581
627
  : nothing}
582
- ${now.follows?.sum.length === 1
583
- ? html `<small>${i18next.t('figure.label.motion-follows', { joint: now.follows.sum[0].joint, multiplier: now.follows.sum[0].multiplier, offset: now.follows.offset })}</small>`
584
- : now.follows
585
- ? html `<small>${i18next.t('figure.label.motion-follow')}: ${now.follows.sum.map(t => `${t.joint} × ${t.multiplier}`).join(' + ')} + ${now.follows.offset}</small>`
586
- : now.control
587
- ? html `<small>${now.control.id} (${now.control.unit}) ${now.control.min} … ${now.control.max}</small>`
588
- : nothing}
589
- </span>
590
- <button
591
- act
592
- ?disabled=${this.locked || !joint}
593
- @click=${() => joint && this.command({ kind: 'set-joint', joint: fixedJointOf(joint) })}
594
- >
595
- <md-icon>close</md-icon>${i18next.t('figure.button.remove-motion')}
596
- </button>
597
- <button
598
- act
599
- ?disabled=${this.locked || !joint}
600
- @click=${() => {
601
- if (!joint)
602
- return;
603
- this.motion = motionFormOf(joint);
604
- this.editingMotion = true;
605
- }}
606
- >
607
- <md-icon>edit</md-icon>${i18next.t('figure.button.change-motion')}
608
- </button>
609
- </div>`;
628
+ </div>`;
610
629
  }
611
630
  /* A joint needs a parent (URDF): a part fastened to nothing is fastened first. */
612
631
  if (!joint)
@@ -617,10 +636,13 @@ let FigureLinks = class FigureLinks extends localize(i18next)(LitElement) {
617
636
  const m = this.motion;
618
637
  const unit = m.kind === 'slide' ? 'mm' : 'deg';
619
638
  /* A follower follows a joint that moves the same way; a choice the kind no longer allows is dropped. */
620
- const leaders = leadersFor(asset, this.partId, m.kind);
639
+ const k = this.motionAxis;
640
+ const leaders = leadersFor(asset, this.partId, m.kind, motionIdOf(joint, k));
641
+ const adding = k > 0 && k >= figureMotionsOf(joint).length;
621
642
  const follow = leaders.some(j => j.id === m.follow) ? m.follow : '';
622
643
  const refusal = motionFormRefusalOf(m, follow);
623
644
  return html `
645
+ ${k > 0 ? html `<p motion-axis-heading><b>${i18next.t('figure.label.motion-axis-n', { n: k + 1 })}</b></p>` : nothing}
624
646
  <div pair>
625
647
  <select @change=${(e) => this.setKind(e.target.value)}>
626
648
  <option value="slide" ?selected=${m.kind === 'slide'}>${i18next.t('figure.label.motion-slide')}</option>
@@ -676,7 +698,7 @@ let FigureLinks = class FigureLinks extends localize(i18next)(LitElement) {
676
698
  : nothing}`
677
699
  : nothing}
678
700
  <span>${i18next.t('figure.label.control-id')}</span>
679
- <input .value=${m.id} placeholder=${`${this.partId}-${m.kind}`} @change=${(e) => (this.motion = { ...m, id: e.target.value.trim() })} />
701
+ <input .value=${m.id} placeholder=${controlIdFor(this.partId, m.kind, k)} @change=${(e) => (this.motion = { ...m, id: e.target.value.trim() })} />
680
702
  ${m.kind === 'continuous' || (m.kind === 'slide' && (m.travel || m.travelSum))
681
703
  ? nothing
682
704
  : html `<span>${i18next.t('figure.label.control-range')} (${unit})</span>
@@ -690,14 +712,15 @@ let FigureLinks = class FigureLinks extends localize(i18next)(LitElement) {
690
712
  ?disabled=${this.locked || !!refusal}
691
713
  title=${refusal === 'range' ? i18next.t('figure.text.range-needs-room') : ''}
692
714
  @click=${() => {
693
- this.command({ kind: 'set-joint', joint: motionJoint(joint, { ...m, follow }, this.partId) });
715
+ this.command({ kind: 'set-joint', joint: motionJoint(joint, { ...m, follow }, this.partId, k) });
694
716
  this.editingMotion = false;
717
+ this.motionAxis = 0;
695
718
  }}
696
719
  >
697
- <md-icon>animation</md-icon>${i18next.t(this.editingMotion ? 'figure.button.apply-motion-change' : 'figure.button.add-motion')}
720
+ <md-icon>animation</md-icon>${i18next.t(adding ? 'figure.button.add-axis' : this.editingMotion ? 'figure.button.apply-motion-change' : 'figure.button.add-motion')}
698
721
  </button>
699
722
  ${this.editingMotion
700
- ? html `<button act @click=${() => (this.editingMotion = false)}><md-icon>undo</md-icon>${i18next.t('figure.button.cancel-motion-change')}</button>`
723
+ ? html `<button act @click=${() => ((this.editingMotion = false), (this.motionAxis = 0))}><md-icon>undo</md-icon>${i18next.t('figure.button.cancel-motion-change')}</button>`
701
724
  : nothing}
702
725
  `;
703
726
  }
@@ -776,6 +799,10 @@ __decorate([
776
799
  state(),
777
800
  __metadata("design:type", Object)
778
801
  ], FigureLinks.prototype, "editingMotion", void 0);
802
+ __decorate([
803
+ state(),
804
+ __metadata("design:type", Object)
805
+ ], FigureLinks.prototype, "motionAxis", void 0);
779
806
  FigureLinks = __decorate([
780
807
  customElement('figure-links')
781
808
  ], FigureLinks);
@@ -1 +1 @@
1
- {"version":3,"file":"figure-links.js","sourceRoot":"","sources":["../../client/modeller/figure-links.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { css, html, LitElement, nothing } from 'lit'\nimport '@operato/input/ox-input-select-buttons.js'\nimport './figure-slot-layout-panel.js'\nimport './figure-size-editor.js'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { figureFaceOverhangOf } from '@hatiolab/figure-model'\nimport type { FigureAsset, FigureAuthoringAction, FigureFace } from '@hatiolab/figure-model'\n\nimport {\n acceptsOf,\n AXES,\n canFasten,\n canFollow,\n positionIsShare,\n heldBy,\n shownWhenOf,\n visibilityControlsOf,\n fasteningOf,\n hasInstanceSize,\n holdsThings,\n leadersFor,\n motionOf,\n motionFormOf,\n motionFormRefusalOf,\n endPlaceKeyOf,\n motionJoint,\n placeFacesOf,\n placeIdFor,\n placesOn,\n rowAxesOf,\n rowBlockOf,\n fixedJointOf,\n rowOf,\n positionsWorkedOut,\n type Axis,\n type MotionForm\n} from './links.js'\nimport { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js'\nimport { insideAlignmentOf } from './fasten-geometry.js'\nimport { fastenFormOf, fastenPlanOf, fastenSentenceOf } from './fasten-form.js'\nimport type { FigureRevision } from './revision.js'\nimport { HelpToggles } from './help.js'\nimport { groupMenu, GroupMenuStyles } from './group-menu.js'\nimport { jointAxisWord } from './joint-axis.js'\nimport { placeTerms } from '@things-factory/figure-viewer/dist-client/detail-facts.js'\n\nconst freshMotion = (): MotionForm => ({ kind: 'slide', axis: 'x', id: '', min: 0, max: 500, follow: '', multiplier: 1, offset: 0, travel: '', travelPlus: 0 })\nconst freshRow = () => ({ axis: '' as Axis | '', pitch: 200, fills: true, count: 5 })\nconst freshPlace = () => ({ role: 'grip' as 'seat' | 'grip', face: 'top' as FigureFace, label: '', accepts: '', capacity: 1 })\n\n/**\n * What a part is tied to — its size response, what it is fastened to, how it moves.\n *\n * 「Build Once, Fit Anywhere」 lives here: a dimension that follows the instance size or another part is what lets\n * a figure be placed at any size, and a part fastened to the face it rests on is what keeps it there when that\n * happens. The release gate refuses a figure that falls apart when resized, and tells the author to fasten the\n * parts that come away — this is where they do it. Motion is a joint: a slide or a turn driven by a control.\n *\n * The sections are dimensions, placement and joint, in that order. Every\n * change is one figure-model authoring command, sent as `command` and run by the editor through the session — one\n * step of the undo history. The fastening is said here in one line; it is chosen in the fastening window\n * (`figure-fasten-dialog.ts`), which the editor opens when this asks (`fasten-open`). Choices the command would refuse (a round body fastened, a size following an instance\n * size the figure does not declare) are not offered, so the author is not sent into a refusal.\n */\n@customElement('figure-links')\nexport class FigureLinks extends localize(i18next)(LitElement) {\n private readonly help = new HelpToggles(this)\n static styles = [SidePanelStyles, GroupMenuStyles, css`\n :host {\n display: block;\n }\n /* A group's sub-question, under its title: quieter than the title, as a label is. */\n p[group-question] {\n margin: 4px 0 0;\n color: var(--md-sys-color-on-surface-variant);\n }\n /* The fastening a part has, in one line, and 「바꾸기」 at its end. */\n div[fastened-summary] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n div[fastened-summary] > p {\n flex: 1;\n margin: 0;\n }\n /* Opening the form is an action: the primary colour, at the line's end. */\n div[fastened-summary] > button[act] {\n flex: none;\n margin: 0 -6px 0 0;\n }\n /* The measure's name, then its rule: X, or a cylinder's 반지름 · 길이, on one line. */\n div[row] > b {\n white-space: nowrap;\n }\n div[row] {\n display: grid;\n grid-template-columns: minmax(24px, max-content) minmax(0, 1fr);\n gap: 6px;\n align-items: center;\n }\n b[bound] {\n font-weight: 600;\n }\n /* What each direction does now: read-only rows. */\n div[resize-now] { display: grid; grid-template-columns: 1fr auto auto auto; gap: 4px 8px; margin: 12px 0; }\n div[resize-now] div[row] { grid-column: 1 / -1; grid-template-columns: subgrid; align-items: center; }\n div[resize-now] span[measure] { font-variant-numeric: tabular-nums; }\n /* Size behaviour is a choice about dimensions only. It never implies a placement or a fastening. */\n /* One of the size group's rows: the group's gap spaces it, as it does the rest (a margin on top of it left a hole). */\n details[resize-choice] { margin: 0; padding: 0; border: 0; }\n details[resize-choice] > div { display: grid; gap: 8px; padding: 8px 0; }\n p[fasten-mode] { margin: 0; font-weight: 600; }\n details { margin-top: 8px; }\n details[row-fold] { margin: 0; }\n details[row-fold] > summary { padding: 0; color: var(--md-sys-color-on-surface); }\n details[row-fold] > summary h3 { margin: 0; flex: 1; }\n details[row-fold][open] > summary { margin-bottom: 8px; }\n /* What the command would do, said beside the result drawn on the canvas. */\n ul[preview-words] { margin: 8px 0; padding: 8px 12px 8px 26px; border-radius: 6px; background: var(--md-sys-color-surface-container, #8881); display: grid; gap: 4px; }\n p[preview-words] { margin: 8px 0; padding: 8px 12px; border-radius: 6px; background: var(--md-sys-color-surface-container, #8881); }\n div[overhang] { display: grid; gap: 6px; margin: 8px 0; padding: 8px 12px; border-radius: 6px; border: 1px solid var(--md-sys-color-outline-variant, #8884); }\n div[overhang] p { margin: 0; }\n ul[detach-words] { margin: 4px 0 10px; padding-left: 20px; display: grid; gap: 2px; }\n /* The difference a following measure keeps: under its choice, on the same line as its words. */\n label[inline-plus] {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n label[inline-plus] input {\n flex: 1;\n min-width: 0;\n }\n `]\n\n /** The figure at the version on screen. */\n @property({ attribute: false }) revision?: FigureRevision\n private get asset(): FigureAsset | undefined {\n return this.revision?.asset\n }\n /** The selected part. */\n @property() partId = ''\n @property({ type: Boolean }) locked = false\n /** Which ties this shows: the part's shape (size and placement, in 속성), its places (자리·능력) or its motion (움직임). */\n @property() section: 'shape' | 'response' | 'places' | 'motion' = 'shape'\n /**\n * Its tab is the one shown, and no window over it speaks instead. The response's row speaks of what a command would\n * draw, and the properties' says there is none: only the one in sight may, as the hidden one's silence would clear what\n * the shown one draws. While the fastening window is open it alone speaks (the editor sets this false).\n */\n @property({ type: Boolean }) active = true\n /** What the row's command would do, in words (the editor works it out: `command-preview.ts`). */\n @property({ attribute: false }) previewWords: string[] = []\n /** Where the selected part's motion takes it, at both ends of its range (the editor draws them on the canvas). */\n @property({ attribute: false }) motionEnds: { control: string; min: number; max: number; unit: string } | null = null\n /** Past the edge of the face it is fastened to, or parts fastened to it past theirs (ADR-0097 §5.5, Q3). */\n @property({ attribute: false }) overhangWords: string[] = []\n /** Wider than the face it is fastened to: how far past each edge, and whether off to one side -- a fact, not a warning. */\n @property({ attribute: false }) overhangNote: string[] = []\n /** What taking this part off would do, said beside the buttons that do it (worked out on a copy by the editor). */\n @property({ attribute: false }) detachWords: string[] = []\n /*\n What a section speaks of on the canvas: the response's row while its fold is open; the properties', the fastening the\n part has -- its face lit, as the one-line result says it.\n */\n private candidate?: { action: FigureAuthoringAction; face?: { part: string; face: string } }\n private fastenCandidate?: { action: FigureAuthoringAction; face?: { part: string; face: string } }\n private told = ''\n @state() private rowOpen = false\n private rowCandidate?: FigureAuthoringAction\n\n /** Why 정렬·간격 고치기 moved nothing, said under it; empty once it moved the part or the part changed. */\n @state() private fixNote = ''\n @state() private motion: MotionForm = freshMotion()\n @state() private place = freshPlace()\n /** How places are made here: one at a time, or by the figure's rule. Unset: by the rule when the figure has one. */\n @state() private placesBy?: 'one' | 'rule'\n @state() private row = freshRow()\n /** The motion form is open over the part's own motion, to change it where it is. */\n @state() private editingMotion = false\n\n /*\n The forms describe the next command for the selected part, so another part starts from the defaults: carrying the\n last part's choices over fastened a shutter curtain level with a right edge nobody chose for it (2026-09-25).\n */\n /* The part the forms were loaded for. A panel made with a part already chosen loaded nothing, and said \"editing the\n fastening it has\" over an empty target (2026-09-27, :3391, the doors). */\n private loadedFor?: string\n willUpdate(changed: Map<string, unknown>) {\n /* Its tab shown again: what it would draw is said again, over whatever the other tab left. */\n if (changed.has('active') && this.active && changed.get('active') === false) this.told = ''\n /* What 고치기 said is about the figure as it was: another step or another part, and it no longer holds. */\n if (changed.has('asset') || changed.has('partId')) this.fixNote = ''\n if (this.asset && this.partId && this.partId !== this.loadedFor) {\n this.loadedFor = this.partId\n this.motion = freshMotion()\n this.place = freshPlace()\n this.row = freshRow()\n this.rowOpen = false\n this.rowCandidate = undefined\n this.editingMotion = false\n }\n }\n\n updated() {\n /* Only the sections that hold a form speak of what it would do, and only while their tab is shown: the panel has\n one of these per section, and the others' silence cleared what it showed (2026-09-27, :3391). */\n const speaks = this.active && (this.section === 'shape' || this.section === 'response')\n if (!speaks) return\n const said = JSON.stringify(this.candidate ?? null)\n if (said === this.told) return\n this.told = said\n this.dispatchEvent(new CustomEvent('preview-command', { detail: this.candidate ?? null, bubbles: true, composed: true }))\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n /* The panel left: what it showed goes with it. */\n if (this.told && this.told !== 'null') this.dispatchEvent(new CustomEvent('preview-command', { detail: null, bubbles: true, composed: true }))\n this.told = ''\n }\n\n render() {\n const asset = this.asset\n this.candidate = undefined\n this.fastenCandidate = undefined\n this.rowCandidate = undefined\n if (!asset || !this.partId) return nothing\n if (this.section === 'motion')\n return html`<section><h3>${i18next.t('figure.label.motion')}${this.help.button('figure.text.motion-explained')}</h3>${this.help.hint('figure.text.motion-explained')}\n ${this.renderMotion(asset)}${this.renderShown(asset)}</section>`\n if (this.section === 'places') {\n /*\n One idea, places, two ways to make them (ADR-0118): one at a time on this part, or many by a rule -- the figure's\n slot layout. One section with a choice, not two screens for the same thing (chief architect, 2026-10-11).\n */\n const byRule = (this.placesBy ?? (asset.document.capabilities.slotLayout ? 'rule' : 'one')) === 'rule'\n return html`<section><h3>${i18next.t('figure.label.places-on-part', { part: this.partId })}${this.help.button('figure.text.place-explained')}</h3>${this.help.hint('figure.text.place-explained')}\n <ox-input-select-buttons\n places-by\n .value=${byRule ? 'rule' : 'one'}\n .options=${[\n { value: 'one', display: i18next.t('figure.label.places-one') },\n { value: 'rule', display: i18next.t('figure.label.places-by-rule') }\n ]}\n @change=${(e: CustomEvent) => (this.placesBy = e.detail === 'rule' ? 'rule' : 'one')}\n ></ox-input-select-buttons>\n ${byRule\n ? html`<figure-slot-layout-panel .asset=${asset} .partId=${this.partId} ?locked=${this.locked}></figure-slot-layout-panel>`\n : placeFacesOf(asset, this.partId).length\n ? this.renderPlaces(asset)\n : html`<p hint>${i18next.t('figure.text.places-need-a-box')}</p>`}</section>`\n }\n /*\n Three groups in one order whatever the part's state (chief architect 2026-10-16): its size, its place, its row. The\n editor's own numbers go in through the slots, so a group keeps its place when a rule or a fastening takes them over.\n */\n /* Fastened, by a face or by an origin: either can be taken off, from the place group's 「⋯」. */\n const held = !!heldBy(asset, this.partId) || !!(this.revision && fasteningOf(this.revision, this.partId)?.atOrigin)\n if (this.section === 'response') {\n /*\n How the part answers a size it is placed at (user 2026-10-17, the 「반응형」 tab): its own measures, where it\n stands, and the row it may make -- what Build Once, Fit Anywhere is authored with, in one place.\n */\n const positions = held ? [] : positionsWorkedOut(asset, this.partId)\n this.rowCandidate = undefined\n const response = html`\n ${canFollow(asset, this.partId) ? html`<section size>\n <h3>${i18next.t('figure.label.group-size')}</h3>\n <figure-size-editor .revision=${this.revision} .partId=${this.partId} ?locked=${this.locked}></figure-size-editor>\n <slot name=\"size-note\"></slot>\n </section>` : nothing}\n ${positions.length\n ? html`<section position-response>\n <h3>${i18next.t('figure.label.group-position-response')}</h3>\n ${this.renderPositions(asset)}\n </section>`\n : nothing}\n ${rowOf(asset, this.partId) ? html`<slot name=\"row\"></slot>` : this.renderRow(asset)}\n `\n this.candidate = this.rowOpen && this.rowCandidate ? { action: this.rowCandidate } : undefined\n return response\n }\n const shown = html`\n <slot name=\"size\"></slot>\n <section fastening>\n <h3>\n ${i18next.t('figure.label.group-place')}${this.help.button('figure.text.fastening-explained')}\n ${groupMenu([{ label: i18next.t('figure.button.detach'), icon: 'link_off', disabled: this.locked || !held, run: () => this.command({ kind: 'detach', part: this.partId }) }])}\n </h3>${this.help.hint('figure.text.fastening-explained')}\n <slot name=\"place\"></slot>\n ${canFasten(asset, this.partId) ? this.renderFastening(asset) : html`<p hint>${i18next.t('figure.text.part-cannot-fasten')}</p>`}\n </section>\n `\n this.candidate = this.fastenCandidate\n return shown\n }\n\n /** Where things are held on this part: a seat things rest on, or a grip things are held in. */\n private renderPlaces(asset: FigureAsset) {\n const faces = placeFacesOf(asset, this.partId)\n const p = this.place\n const face = faces.includes(p.face) ? p.face : faces[0]!\n const accepts = acceptsOf(p.accepts)\n const capacityOk = Number.isSafeInteger(p.capacity) && p.capacity >= 1\n const roleName = (role: string) => i18next.t('figure.label.place-' + role)\n return html`\n ${placesOn(asset, this.partId).map(\n one => html`<div pair>\n <span>\n <b bound>${one.label}</b>\n <small>${one.face ? i18next.t('figure.label.face-' + one.face) + ' · ' : ''}${placeTerms(one, (key, params) => i18next.t(key, params))}</small>\n </span>\n <button quiet ?disabled=${this.locked} @click=${() => this.command({ kind: 'remove-binding', id: one.id })}>\n <md-icon>close</md-icon>${i18next.t('figure.button.remove-place')}\n </button>\n </div>`\n )}\n ${holdsThings(asset)\n ? nothing\n : html`<p hint>${i18next.t('figure.text.place-needs-holding')}</p>\n <button act ?disabled=${this.locked} @click=${() => this.declareHolding(asset)}>\n <md-icon>inventory_2</md-icon>${i18next.t('figure.button.declare-holding')}\n </button>`}\n <div pair>\n <select @change=${(e: Event) => (this.place = { ...p, role: (e.target as HTMLSelectElement).value as 'seat' | 'grip' })}>\n <option value=\"grip\" ?selected=${p.role === 'grip'}>${roleName('grip')}</option>\n <option value=\"seat\" ?selected=${p.role === 'seat'}>${roleName('seat')}</option>\n </select>\n <select @change=${(e: Event) => (this.place = { ...p, face: (e.target as HTMLSelectElement).value as FigureFace })}>\n ${faces.map(one => html`<option value=${one} ?selected=${one === face}>${i18next.t('figure.label.face-' + one)}</option>`)}\n </select>\n </div>\n <div form>\n <span>${i18next.t('figure.label.place-name')}</span>\n <input .value=${p.label} placeholder=${roleName(p.role)} @change=${(e: Event) => (this.place = { ...p, label: (e.target as HTMLInputElement).value })} />\n <span>${i18next.t('figure.label.place-accepts')}</span>\n <input .value=${p.accepts} placeholder=\"BOX, TOTE\" @input=${(e: Event) => (this.place = { ...p, accepts: (e.target as HTMLInputElement).value })} />\n <span>${i18next.t('figure.label.place-capacity')}</span>\n <input type=\"number\" min=\"1\" step=\"1\" .value=${String(p.capacity)} @change=${(e: Event) => (this.place = { ...p, capacity: (e.target as HTMLInputElement).valueAsNumber })} />\n </div>\n ${accepts.length ? nothing : html`<small>${i18next.t('figure.text.place-accepts-needed')}</small>`}\n <button\n act\n ?disabled=${this.locked || !accepts.length || !capacityOk}\n @click=${() =>\n this.command({\n kind: 'add-binding',\n id: placeIdFor(asset, this.partId, p.role),\n label: p.label.trim() || roleName(p.role),\n role: p.role,\n part: this.partId,\n face,\n accepts,\n capacity: p.capacity\n })}\n >\n <md-icon>back_hand</md-icon>${i18next.t('figure.button.add-place')}\n </button>\n `\n }\n\n /** The figure holds things: `Capacity` and `Holdable`, the ladder's middle rung. One part edit, one undo step. */\n private declareHolding(asset: FigureAsset) {\n const names = [...new Set([...(asset.document.capabilities.names ?? []), 'Capacity', 'Holdable'])]\n this.dispatchEvent(new CustomEvent('part-edit', { detail: { edit: { kind: 'set-capabilities', names } }, bubbles: true, composed: true }))\n }\n\n /**\n * 정렬·간격 고치기: the part moved inside the face it is fastened on, as one step -- the least move on each side it is\n * out, or centred when it is wider than the face. When nothing of it can be moved, why is said under the button, not\n * nothing at all (:3300, 2026-10-11: the button only scrolled to the drawing, which was already in view). The command\n * is the fastening window's for the same choice (`fasten-form.ts`), with only the place across the face changed.\n */\n private fixAlignment() {\n const revision = this.revision\n if (!revision) return\n const form = fastenFormOf(revision, this.partId)\n /* Whether it is out, and the least move that brings it in, are the kernel's measure (ADR-0140 3.8). */\n const own = figureFaceOverhangOf(revision.asset, this.partId, revision.inputs)\n const fixed =\n own?.state === 'unknown'\n ? ({ cannot: 'unmeasured' } as const)\n : own?.state === 'out' || own?.state === 'possible'\n ? insideAlignmentOf(fastenPlanOf(revision, this.partId, form).view, form.align, form.alignMm)\n : ({ cannot: 'inside' } as const)\n if ('cannot' in fixed) {\n this.fixNote = i18next.t(`figure.text.fix-alignment-${fixed.cannot}`, { part: this.partId, on: form.target })\n return\n }\n this.fixNote = ''\n const action = fastenPlanOf(revision, this.partId, { ...form, align: fixed.align, alignMm: fixed.alignMm }).action\n if (action) this.command(action)\n }\n\n /** The fastening window, asked of the editor: it opens over the canvas on what the part has now. */\n private openFastening() {\n this.dispatchEvent(new CustomEvent('fasten-open', { bubbles: true, composed: true }))\n }\n\n /**\n * What holds the part, said as its state -- 「바닥에 붙어 있음」 -- with the ways to change it: open the fastening,\n * or take it off. Right after \"follow size, attached\" this is the result, not a refusal (designer 2026-09-27).\n */\n private heldWords(asset: FigureAsset) {\n const joint = (asset.joints ?? []).find(j => j.body1.part === this.partId)\n const gap = joint?.origin?.gap ?? 0\n const place = i18next.t(`figure.label.resize-place-${asset.placement ?? 'floor'}`)\n const where = !joint\n ? i18next.t('figure.text.held-by-rule')\n : 'plane' in joint.body0\n ? typeof gap === 'number'\n ? i18next.t('figure.text.held-on-plane', { place, gap: String(gap) })\n : i18next.t('figure.text.held-on-plane-worked-out', { place })\n : i18next.t('figure.text.held-on-part', { other: joint.body0.part, otherFace: i18next.t(endPlaceKeyOf(joint.body0)) })\n return where\n }\n\n /**\n * Positions worked out from other values, each with the way to\n * keep it where it is. This is the way out the release gate names when a resize leaves a part in the air.\n */\n private renderPositions(asset: FigureAsset) {\n return positionsWorkedOut(asset, this.partId).map(\n axis => html`<div pair>\n <span>${axis.toUpperCase()} · ${i18next.t(positionIsShare(asset, this.partId, axis) ? 'figure.label.position-in-proportion' : 'figure.label.position-worked-out')}</span>\n <button act ?disabled=${this.locked} @click=${() => this.command({ kind: 'fix-position', part: this.partId, axis })}>\n <md-icon>push_pin</md-icon>${i18next.t('figure.button.fix-position')}\n </button>\n ${hasInstanceSize(asset, axis) && !positionIsShare(asset, this.partId, axis)\n ? html`<button act ?disabled=${this.locked} title=${i18next.t('figure.text.scale-position-explained')} @click=${() => this.command({ kind: 'scale-position', part: this.partId, axis })}>\n <md-icon>open_in_full</md-icon>${i18next.t('figure.button.scale-position')}\n </button>`\n : nothing}\n </div>`\n )\n }\n\n /**\n * The fastening in one line -- what, on which face, how -- and 「바꾸기」 to open the window where it is chosen (chief\n * architect 2026-10-16; user 2026-10-17: the result here, the editing in a window with room). Taking it off is in the\n * group's 「⋯」. What hangs over the face, and the way to fix it, stay here: they are about the fastening as it is now.\n */\n private renderFastening(asset: FigureAsset) {\n const revision = this.revision!\n const own = fasteningOf(revision, this.partId)\n /* Placed by an origin (ADR-0107 decision 4): attach writes faces, so the window would move it off its origin. Said, and taken off only. */\n if (own?.atOrigin)\n return html`<div fastened fasten-at-origin>\n <p>${this.heldWords(asset)}</p>\n ${this.renderDetachWords()}\n </div>`\n const overhang = html`${this.overhangNote.length ? html`<p hint overhang-note>${this.overhangNote.join(' ')}</p>` : nothing}\n ${this.overhangWords.length\n ? html`<div overhang role=\"status\">\n ${this.overhangWords.map(line => html`<p>${line}</p>`)}\n ${own\n ? html`<button act fix-alignment ?disabled=${this.locked} @click=${() => this.fixAlignment()}>\n <md-icon>tune</md-icon>${i18next.t('figure.button.fix-alignment')}\n </button>\n ${this.fixNote ? html`<p hint fix-note>${this.fixNote}</p>` : nothing}`\n : nothing}\n </div>`\n : nothing}`\n if (own && heldBy(asset, this.partId)) {\n const form = fastenFormOf(revision, this.partId)\n const plan = fastenPlanOf(revision, this.partId, form)\n if (plan.action) this.fastenCandidate = { action: plan.action, ...(plan.face ? { face: plan.face } : {}) }\n const planeWord = i18next.t('figure.label.resize-place-' + (asset.placement ?? 'floor'))\n return html`\n ${overhang}\n <div fastened-summary>\n <p fasten-sentence>${fastenSentenceOf(form, plan, planeWord, (key, params) => i18next.t(key, params))}</p>\n <button act change-fastening ?disabled=${this.locked} @click=${() => this.openFastening()}>${i18next.t('figure.button.change-fastening')}</button>\n </div>\n ${this.renderDetachWords()}\n `\n }\n /* A blank attachment is not a form to decipher: what it does, and the way to the window. */\n return html`\n ${overhang}\n <p hint>${i18next.t('figure.text.fasten-start')}</p>\n <button act fasten-start ?disabled=${this.locked} @click=${() => this.openFastening()}>\n <md-icon>link</md-icon>${i18next.t('figure.button.fasten-start')}\n </button>\n `\n }\n\n private renderDetachWords() {\n /* One thing to say is a line, not a list of one. */\n if (this.detachWords.length === 1) return html`<p hint detach-words>${this.detachWords[0]}</p>`\n return this.detachWords.length ? html`<ul detach-words>${this.detachWords.map(line => html`<li>${line}</li>`)}</ul>` : nothing\n }\n\n /**\n * Making the part a row across what it is fastened to (figure-model `make-repeat`): along one of the axes across its\n * face, copies a pitch apart filling the parent's length, or a count spread over it. Once made, the row's own section\n * (the editor's) shows it and takes it away.\n */\n private renderPreviewWords() {\n if (this.previewWords.length === 1) return html`<p preview-words role=\"status\">${this.previewWords[0]}</p>`\n return this.previewWords.length ? html`<ul preview-words role=\"status\">${this.previewWords.map(line => html`<li>${line}</li>`)}</ul>` : nothing\n }\n\n /**\n * A row (ADR-0097 §5.5): said as what it makes, \"arranged in a row\". Where it cannot be made here, why, rather than\n * nothing. Filling the length, the centre spacing is the author's; a count of their own is spread evenly over the\n * length -- figure-model draws it so, and the form does not ask for a spacing it would not use.\n */\n private renderRow(asset: FigureAsset) {\n if (rowOf(asset, this.partId)) return nothing\n const blocked = rowBlockOf(asset, this.partId)\n const axes = rowAxesOf(asset, this.partId)\n const r = this.row\n /*\n Folded, open while it is being worked (2026-10-02): a row is made now and then, and most parts stand on the plane,\n where the section said its reason open on every one. Opened, it says why or asks how.\n */\n const head = html`<summary><h3>${i18next.t('figure.label.repeat')} <span section-state>${i18next.t('figure.label.repeat-inactive')}</span></h3></summary>`\n if (blocked || !axes.length)\n return html`<section row><details row-fold open>\n ${head}\n <p hint row-blocked>${i18next.t(`figure.text.row-blocked-${blocked ?? 'unfastened'}`, { part: this.partId })}</p>\n ${blocked === 'unfastened'\n ? html`<button act @click=${() => this.dispatchEvent(new CustomEvent('go-fasten', { bubbles: true, composed: true }))}><md-icon>link</md-icon>${i18next.t('figure.button.go-fasten')}</button>`\n : nothing}\n </details></section>`\n const axis = axes.includes(r.axis as Axis) ? (r.axis as Axis) : axes[0]!\n const ok = r.fills ? r.pitch > 0 : Number.isSafeInteger(r.count) && r.count >= 1\n const action = ok\n ? ({ kind: 'make-repeat', part: this.partId, axis, pitch: r.fills ? r.pitch : Math.max(r.pitch, 1), ...(r.fills ? {} : { count: r.count }) } as FigureAuthoringAction)\n : undefined\n this.rowCandidate = action\n const set = (next: typeof r) => ((this.row = next), (this.rowOpen = true))\n /*\n Whether the row is being worked follows the fold's own toggle. A press on the heading focuses it before the click;\n set on focus, the fold opened there and the click then folded it again (2026-10-11: it took two clicks to open).\n */\n const toggled = (e: Event) => (this.rowOpen = (e.target as HTMLDetailsElement).open)\n return html`<section row><details row-fold ?open=${this.rowOpen} @toggle=${toggled}>\n ${head}\n <p hint>${i18next.t('figure.text.repeat-intro')}</p>\n <div form>\n <span>${i18next.t('figure.label.repeat-axis')}</span>\n <select aria-label=${i18next.t('figure.label.repeat-axis')} ?disabled=${this.locked} @change=${(e: Event) => set({ ...r, axis: (e.target as HTMLSelectElement).value as Axis })}>\n ${axes.map(a => html`<option value=${a} ?selected=${a === axis}>${a.toUpperCase()}</option>`)}\n </select>\n </div>\n <p hint>${i18next.t('figure.text.repeat-direction')}</p>\n <div choice-row role=\"radiogroup\" aria-label=${i18next.t('figure.label.row-basis')}>\n <label toggle><input type=\"radio\" name=\"row-basis\" ?disabled=${this.locked} .checked=${r.fills} @change=${() => set({ ...r, fills: true })} />${i18next.t('figure.label.repeat-fills')}</label>\n <label toggle><input type=\"radio\" name=\"row-basis\" ?disabled=${this.locked} .checked=${!r.fills} @change=${() => set({ ...r, fills: false })} />${i18next.t('figure.label.row-by-count')}</label>\n </div>\n ${r.fills\n ? html`<div form>\n <span>${i18next.t('figure.label.repeat-pitch')} · mm</span>\n <input aria-label=${i18next.t('figure.label.repeat-pitch')} ?disabled=${this.locked} type=\"number\" step=\"any\" min=\"0\" .value=${String(r.pitch)} @change=${(e: Event) => set({ ...r, pitch: Number((e.target as HTMLInputElement).value) })} />\n </div>`\n : html`<div form>\n <span>${i18next.t('figure.label.repeat-count')}</span>\n <input aria-label=${i18next.t('figure.label.repeat-count')} ?disabled=${this.locked} type=\"number\" step=\"1\" min=\"1\" .value=${String(r.count)} @change=${(e: Event) => set({ ...r, count: Number((e.target as HTMLInputElement).value) })} />\n </div>\n <p hint>${i18next.t('figure.text.row-count-spreads')}</p>`}\n ${action && this.rowOpen ? html`<p hint>${i18next.t('figure.text.repeat-draft')}</p>${this.renderPreviewWords()}` : nothing}\n <button act ?disabled=${this.locked || !action} @click=${() => action && this.command(action)}>\n <md-icon>view_week</md-icon>${i18next.t('figure.button.make-repeat')}\n </button>\n </details></section>`\n }\n\n /**\n * When the part is drawn: always, or while a control is at least a value -- a lamp lit while the gate is open. One\n * part edit (`set-visibility`), one step. Offered once the figure has a control; a motion is what makes one.\n */\n private renderShown(asset: FigureAsset) {\n const controls = visibilityControlsOf(asset)\n if (!controls.length) return nothing\n const now = shownWhenOf(asset, this.partId)\n const send = (shownWhen: { input: string; atLeast: number } | null) =>\n this.dispatchEvent(new CustomEvent('part-edit', { detail: { edit: { kind: 'set-visibility', target: this.partId, shownWhen } }, bubbles: true, composed: true }))\n const first = (id: string) => {\n const c = controls.find(one => one.id === id)!\n return Math.round((c.min + (c.max - c.min) * 0.01) * 1000) / 1000\n }\n const unit = now ? controls.find(c => c.id === now.input)?.unit : ''\n return html`<div form>\n <span>${i18next.t('figure.label.shown-when')}</span>\n <select\n ?disabled=${this.locked}\n @change=${(e: Event) => {\n const id = (e.target as HTMLSelectElement).value\n send(id ? { input: id, atLeast: now?.input === id ? now.atLeast : first(id) } : null)\n }}\n >\n <option value=\"\" ?selected=${!now}>${i18next.t('figure.label.shown-always')}</option>\n ${controls.map(c => html`<option value=${c.id} ?selected=${now?.input === c.id}>${i18next.t('figure.label.shown-while', { control: c.label })}</option>`)}\n </select>\n ${now\n ? html`<span>${i18next.t('figure.label.shown-at-least')}${unit ? ` (${unit})` : ''}</span>\n <input\n type=\"number\"\n step=\"any\"\n ?disabled=${this.locked}\n .value=${String(now.atLeast)}\n @change=${(e: Event) => {\n const v = (e.target as HTMLInputElement).valueAsNumber\n if (Number.isFinite(v)) send({ input: now.input, atLeast: v })\n }}\n />`\n : nothing}\n </div>`\n }\n\n private renderMotion(asset: FigureAsset) {\n const now = motionOf(asset, this.partId)\n const joint = asset.joints?.find(j => j.body1.part === this.partId)\n if (now && !(this.editingMotion && joint)) {\n /* Which part moves, against what, which way, how far -- by name (ADR-0097 §5.5). */\n const against = joint ? ('plane' in joint.body0 ? i18next.t('figure.label.mounting-plane') : joint.body0.part) : ''\n const ends = this.motionEnds\n return html`<p motion-summary>\n ${i18next.t('figure.text.motion-summary', {\n part: this.partId,\n against,\n kind: i18next.t('figure.label.motion-' + now.kind),\n axis: now.vector ? jointAxisWord(now.vector) : String(now.axis).toUpperCase()\n })}\n </p>\n ${ends\n ? html`<p hint motion-ends>${i18next.t('figure.text.motion-ends-shown', { min: String(ends.min), max: String(ends.max), unit: ends.unit })}</p>`\n : nothing}\n <div pair>\n <span>\n ${i18next.t('figure.label.motion-' + now.kind)} · ${now.vector ? jointAxisWord(now.vector) : String(now.axis).toUpperCase()}\n ${now.travel\n ? html`<small>${i18next.t('figure.label.motion-travel-is', { part: now.travel.part, axis: now.travel.axis.toUpperCase(), plus: now.travel.plus ?? 0 })}</small>`\n : nothing}\n ${now.follows?.sum.length === 1\n ? html`<small>${i18next.t('figure.label.motion-follows', { joint: now.follows.sum[0]!.joint, multiplier: now.follows.sum[0]!.multiplier, offset: now.follows.offset })}</small>`\n : now.follows\n ? html`<small>${i18next.t('figure.label.motion-follow')}: ${now.follows.sum.map(t => `${t.joint} × ${t.multiplier}`).join(' + ')} + ${now.follows.offset}</small>`\n : now.control\n ? html`<small>${now.control.id} (${now.control.unit}) ${now.control.min} … ${now.control.max}</small>`\n : nothing}\n </span>\n <button\n act\n ?disabled=${this.locked || !joint}\n @click=${() => joint && this.command({ kind: 'set-joint', joint: fixedJointOf(joint) })}\n >\n <md-icon>close</md-icon>${i18next.t('figure.button.remove-motion')}\n </button>\n <button\n act\n ?disabled=${this.locked || !joint}\n @click=${() => {\n if (!joint) return\n this.motion = motionFormOf(joint)\n this.editingMotion = true\n }}\n >\n <md-icon>edit</md-icon>${i18next.t('figure.button.change-motion')}\n </button>\n </div>`\n }\n /* A joint needs a parent (URDF): a part fastened to nothing is fastened first. */\n if (!joint)\n return html`<p hint>${i18next.t('figure.text.fasten-before-moving')}</p>\n <button act go-fasten @click=${() => this.dispatchEvent(new CustomEvent('go-fasten', { bubbles: true, composed: true }))}>\n <md-icon>link</md-icon>${i18next.t('figure.button.go-fasten')}\n </button>`\n const m = this.motion\n const unit = m.kind === 'slide' ? 'mm' : 'deg'\n /* A follower follows a joint that moves the same way; a choice the kind no longer allows is dropped. */\n const leaders = leadersFor(asset, this.partId, m.kind)\n const follow = leaders.some(j => j.id === m.follow) ? m.follow : ''\n const refusal = motionFormRefusalOf(m, follow)\n return html`\n <div pair>\n <select @change=${(e: Event) => this.setKind((e.target as HTMLSelectElement).value as 'slide' | 'turn' | 'continuous')}>\n <option value=\"slide\" ?selected=${m.kind === 'slide'}>${i18next.t('figure.label.motion-slide')}</option>\n <option value=\"turn\" ?selected=${m.kind === 'turn'}>${i18next.t('figure.label.motion-turn')}</option>\n <option value=\"continuous\" ?selected=${m.kind === 'continuous'}>${i18next.t('figure.label.motion-continuous')}</option>\n </select>\n ${m.axisVector\n ? html`<span motion-axis-vector>${i18next.t('figure.label.motion-axis')} ${jointAxisWord(m.axisVector)}</span>`\n : html`<select @change=${(e: Event) => (this.motion = { ...m, axis: (e.target as HTMLSelectElement).value as Axis })}>\n ${AXES.map(a => html`<option value=${a} ?selected=${a === m.axis}>${i18next.t('figure.label.motion-axis')} ${a.toUpperCase()}</option>`)}\n </select>`}\n </div>\n ${m.followSum\n ? html`<div form>\n <span>${i18next.t('figure.label.motion-follow')}</span>\n <span>${m.followSum.map(t => `${t.joint} × ${t.multiplier}`).join(' + ')}</span>\n <span>${i18next.t('figure.label.motion-offset')} (${unit})</span>\n <input type=\"number\" step=\"any\" .value=${String(m.offset)} @change=${(e: Event) => (this.motion = { ...m, offset: Number((e.target as HTMLInputElement).value) || 0 })} />\n </div>`\n : leaders.length\n ? html`<div form>\n <span>${i18next.t('figure.label.motion-follow')}</span>\n <select @change=${(e: Event) => (this.motion = { ...m, follow: (e.target as HTMLSelectElement).value })}>\n <option value=\"\" ?selected=${!follow}>${i18next.t('figure.label.motion-own-control')}</option>\n ${leaders.map(j => html`<option value=${j.id} ?selected=${j.id === follow}>${j.part}${j.state?.id ? ` · ${j.state.id}` : j.id !== j.part ? ` · ${j.id}` : ''}</option>`)}\n </select>\n </div>`\n : nothing}\n ${m.followSum\n ? nothing\n : follow\n ? html`<div form>\n <span>${i18next.t('figure.label.motion-multiplier')}</span>\n <input type=\"number\" step=\"any\" .value=${String(m.multiplier)} @change=${(e: Event) => (this.motion = { ...m, multiplier: Number((e.target as HTMLInputElement).value) })} />\n <span>${i18next.t('figure.label.motion-offset')} (${unit})</span>\n <input type=\"number\" step=\"any\" .value=${String(m.offset)} @change=${(e: Event) => (this.motion = { ...m, offset: Number((e.target as HTMLInputElement).value) || 0 })} />\n </div>`\n : html`<div form>\n ${m.kind === 'slide'\n ? html`<span>${i18next.t('figure.label.motion-travel')}</span>\n <select @change=${(e: Event) => (this.motion = { ...m, travel: (e.target as HTMLSelectElement).value })}>\n ${m.travelSum\n ? html`<option value=\"\" ?selected=${!m.travel}>${m.travelSum.sum.map(t => `${t.from.of === 'input' ? t.from.input : `${t.from.of === 'part' ? t.from.part : i18next.t('figure.label.motion-travel')} · ${t.from.axis.toUpperCase()}`}${t.times !== undefined && t.times !== 1 ? ` × ${t.times}` : ''}`).join(' + ')}</option>`\n : html`<option value=\"\" ?selected=${!m.travel}>${i18next.t('figure.label.motion-travel-mm')}</option>`}\n ${asset.appearance\n .map(look => look.target)\n .filter(one => canFollow(asset, one))\n .flatMap(one => AXES.map(a => html`<option value=${`${one}:${a}`} ?selected=${m.travel === `${one}:${a}`}>${one} · ${a.toUpperCase()}</option>`))}\n </select>\n ${m.travel\n ? html`<span>${i18next.t('figure.label.follows-plus')}</span>\n <input type=\"number\" step=\"any\" .value=${String(m.travelPlus ?? 0)} @change=${(e: Event) => (this.motion = { ...m, travelPlus: Number((e.target as HTMLInputElement).value) || 0 })} />`\n : nothing}`\n : nothing}\n <span>${i18next.t('figure.label.control-id')}</span>\n <input .value=${m.id} placeholder=${`${this.partId}-${m.kind}`} @change=${(e: Event) => (this.motion = { ...m, id: (e.target as HTMLInputElement).value.trim() })} />\n ${m.kind === 'continuous' || (m.kind === 'slide' && (m.travel || m.travelSum))\n ? nothing\n : html`<span>${i18next.t('figure.label.control-range')} (${unit})</span>\n <div pair>\n <input type=\"number\" step=\"any\" .value=${String(m.min)} @change=${(e: Event) => (this.motion = { ...m, min: Number((e.target as HTMLInputElement).value) })} />\n <input type=\"number\" step=\"any\" .value=${String(m.max)} @change=${(e: Event) => (this.motion = { ...m, max: Number((e.target as HTMLInputElement).value) })} />\n </div>`}\n </div>`}\n <button\n act\n ?disabled=${this.locked || !!refusal}\n title=${refusal === 'range' ? i18next.t('figure.text.range-needs-room') : ''}\n @click=${() => {\n this.command({ kind: 'set-joint', joint: motionJoint(joint, { ...m, follow }, this.partId) })\n this.editingMotion = false\n }}\n >\n <md-icon>animation</md-icon>${i18next.t(this.editingMotion ? 'figure.button.apply-motion-change' : 'figure.button.add-motion')}\n </button>\n ${this.editingMotion\n ? html`<button act @click=${() => (this.editingMotion = false)}><md-icon>undo</md-icon>${i18next.t('figure.button.cancel-motion-change')}</button>`\n : nothing}\n `\n }\n\n private setKind(kind: 'slide' | 'turn' | 'continuous') {\n this.motion = kind === 'slide' ? { ...this.motion, kind, min: 0, max: 500 } : { ...this.motion, kind, min: -90, max: 90 }\n }\n\n private command(action: FigureAuthoringAction) {\n this.dispatchEvent(new CustomEvent('command', { detail: { action }, bubbles: true, composed: true }))\n }\n}\n"]}
1
+ {"version":3,"file":"figure-links.js","sourceRoot":"","sources":["../../client/modeller/figure-links.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { css, html, LitElement, nothing } from 'lit'\nimport '@operato/input/ox-input-select-buttons.js'\nimport './figure-slot-layout-panel.js'\nimport './figure-size-editor.js'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { figureFaceOverhangOf, figureMotionsOf, motionIdOf } from '@hatiolab/figure-model'\nimport type { FigureAsset, FigureAuthoringAction, FigureFace } from '@hatiolab/figure-model'\n\nimport {\n acceptsOf,\n AXES,\n canFasten,\n canFollow,\n positionIsShare,\n heldBy,\n shownWhenOf,\n visibilityControlsOf,\n fasteningOf,\n hasInstanceSize,\n holdsThings,\n leadersFor,\n motionOf,\n motionFormOf,\n motionFormRefusalOf,\n endPlaceKeyOf,\n motionJoint,\n controlIdFor,\n withoutAxis,\n placeFacesOf,\n placeIdFor,\n placesOn,\n rowAxesOf,\n rowBlockOf,\n fixedJointOf,\n rowOf,\n positionsWorkedOut,\n type Axis,\n type MotionForm\n} from './links.js'\nimport { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js'\nimport { insideAlignmentOf } from './fasten-geometry.js'\nimport { fastenFormOf, fastenPlanOf, fastenSentenceOf } from './fasten-form.js'\nimport type { FigureRevision } from './revision.js'\nimport { HelpToggles } from './help.js'\nimport { groupMenu, GroupMenuStyles } from './group-menu.js'\nimport { jointAxisWord } from './joint-axis.js'\nimport { placeTerms } from '@things-factory/figure-viewer/dist-client/detail-facts.js'\n\nconst freshMotion = (): MotionForm => ({ kind: 'slide', axis: 'x', id: '', min: 0, max: 500, follow: '', multiplier: 1, offset: 0, travel: '', travelPlus: 0 })\nconst freshRow = () => ({ axis: '' as Axis | '', pitch: 200, fills: true, count: 5 })\nconst freshPlace = () => ({ role: 'grip' as 'seat' | 'grip', face: 'top' as FigureFace, label: '', accepts: '', capacity: 1 })\n\n/**\n * What a part is tied to — its size response, what it is fastened to, how it moves.\n *\n * 「Build Once, Fit Anywhere」 lives here: a dimension that follows the instance size or another part is what lets\n * a figure be placed at any size, and a part fastened to the face it rests on is what keeps it there when that\n * happens. The release gate refuses a figure that falls apart when resized, and tells the author to fasten the\n * parts that come away — this is where they do it. Motion is a joint: a slide or a turn driven by a control.\n *\n * The sections are dimensions, placement and joint, in that order. Every\n * change is one figure-model authoring command, sent as `command` and run by the editor through the session — one\n * step of the undo history. The fastening is said here in one line; it is chosen in the fastening window\n * (`figure-fasten-dialog.ts`), which the editor opens when this asks (`fasten-open`). Choices the command would refuse (a round body fastened, a size following an instance\n * size the figure does not declare) are not offered, so the author is not sent into a refusal.\n */\n@customElement('figure-links')\nexport class FigureLinks extends localize(i18next)(LitElement) {\n private readonly help = new HelpToggles(this)\n static styles = [SidePanelStyles, GroupMenuStyles, css`\n :host {\n display: block;\n }\n /* A group's sub-question, under its title: quieter than the title, as a label is. */\n p[group-question] {\n margin: 4px 0 0;\n color: var(--md-sys-color-on-surface-variant);\n }\n /* The fastening a part has, in one line, and 「바꾸기」 at its end. */\n div[fastened-summary] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n div[fastened-summary] > p {\n flex: 1;\n margin: 0;\n }\n /* Opening the form is an action: the primary colour, at the line's end. */\n div[fastened-summary] > button[act] {\n flex: none;\n margin: 0 -6px 0 0;\n }\n /* The measure's name, then its rule: X, or a cylinder's 반지름 · 길이, on one line. */\n div[row] > b {\n white-space: nowrap;\n }\n div[row] {\n display: grid;\n grid-template-columns: minmax(24px, max-content) minmax(0, 1fr);\n gap: 6px;\n align-items: center;\n }\n b[bound] {\n font-weight: 600;\n }\n /* What each direction does now: read-only rows. */\n div[resize-now] { display: grid; grid-template-columns: 1fr auto auto auto; gap: 4px 8px; margin: 12px 0; }\n div[resize-now] div[row] { grid-column: 1 / -1; grid-template-columns: subgrid; align-items: center; }\n div[resize-now] span[measure] { font-variant-numeric: tabular-nums; }\n /* Size behaviour is a choice about dimensions only. It never implies a placement or a fastening. */\n /* One of the size group's rows: the group's gap spaces it, as it does the rest (a margin on top of it left a hole). */\n details[resize-choice] { margin: 0; padding: 0; border: 0; }\n details[resize-choice] > div { display: grid; gap: 8px; padding: 8px 0; }\n p[fasten-mode] { margin: 0; font-weight: 600; }\n details { margin-top: 8px; }\n details[row-fold] { margin: 0; }\n details[row-fold] > summary { padding: 0; color: var(--md-sys-color-on-surface); }\n details[row-fold] > summary h3 { margin: 0; flex: 1; }\n details[row-fold][open] > summary { margin-bottom: 8px; }\n /* What the command would do, said beside the result drawn on the canvas. */\n ul[preview-words] { margin: 8px 0; padding: 8px 12px 8px 26px; border-radius: 6px; background: var(--md-sys-color-surface-container, #8881); display: grid; gap: 4px; }\n p[preview-words] { margin: 8px 0; padding: 8px 12px; border-radius: 6px; background: var(--md-sys-color-surface-container, #8881); }\n div[overhang] { display: grid; gap: 6px; margin: 8px 0; padding: 8px 12px; border-radius: 6px; border: 1px solid var(--md-sys-color-outline-variant, #8884); }\n div[overhang] p { margin: 0; }\n ul[detach-words] { margin: 4px 0 10px; padding-left: 20px; display: grid; gap: 2px; }\n /* The difference a following measure keeps: under its choice, on the same line as its words. */\n label[inline-plus] {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n label[inline-plus] input {\n flex: 1;\n min-width: 0;\n }\n `]\n\n /** The figure at the version on screen. */\n @property({ attribute: false }) revision?: FigureRevision\n private get asset(): FigureAsset | undefined {\n return this.revision?.asset\n }\n /** The selected part. */\n @property() partId = ''\n @property({ type: Boolean }) locked = false\n /** Which ties this shows: the part's shape (size and placement, in 속성), its places (자리·능력) or its motion (움직임). */\n @property() section: 'shape' | 'response' | 'places' | 'motion' = 'shape'\n /**\n * Its tab is the one shown, and no window over it speaks instead. The response's row speaks of what a command would\n * draw, and the properties' says there is none: only the one in sight may, as the hidden one's silence would clear what\n * the shown one draws. While the fastening window is open it alone speaks (the editor sets this false).\n */\n @property({ type: Boolean }) active = true\n /** What the row's command would do, in words (the editor works it out: `command-preview.ts`). */\n @property({ attribute: false }) previewWords: string[] = []\n /** Where the selected part's motion takes it, at both ends of its range (the editor draws them on the canvas). */\n @property({ attribute: false }) motionEnds: { control: string; min: number; max: number; unit: string } | null = null\n /** Past the edge of the face it is fastened to, or parts fastened to it past theirs (ADR-0097 §5.5, Q3). */\n @property({ attribute: false }) overhangWords: string[] = []\n /** Wider than the face it is fastened to: how far past each edge, and whether off to one side -- a fact, not a warning. */\n @property({ attribute: false }) overhangNote: string[] = []\n /** What taking this part off would do, said beside the buttons that do it (worked out on a copy by the editor). */\n @property({ attribute: false }) detachWords: string[] = []\n /*\n What a section speaks of on the canvas: the response's row while its fold is open; the properties', the fastening the\n part has -- its face lit, as the one-line result says it.\n */\n private candidate?: { action: FigureAuthoringAction; face?: { part: string; face: string } }\n private fastenCandidate?: { action: FigureAuthoringAction; face?: { part: string; face: string } }\n private told = ''\n @state() private rowOpen = false\n private rowCandidate?: FigureAuthoringAction\n\n /** Why 정렬·간격 고치기 moved nothing, said under it; empty once it moved the part or the part changed. */\n @state() private fixNote = ''\n @state() private motion: MotionForm = freshMotion()\n @state() private place = freshPlace()\n /** How places are made here: one at a time, or by the figure's rule. Unset: by the rule when the figure has one. */\n @state() private placesBy?: 'one' | 'rule'\n @state() private row = freshRow()\n /** The motion form is open over the part's own motion, to change it where it is. */\n @state() private editingMotion = false\n /** Which of the joint's axes the form is over (ADR-0159); one past the last is a new axis. */\n @state() private motionAxis = 0\n\n /*\n The forms describe the next command for the selected part, so another part starts from the defaults: carrying the\n last part's choices over fastened a shutter curtain level with a right edge nobody chose for it (2026-09-25).\n */\n /* The part the forms were loaded for. A panel made with a part already chosen loaded nothing, and said \"editing the\n fastening it has\" over an empty target (2026-09-27, :3391, the doors). */\n private loadedFor?: string\n willUpdate(changed: Map<string, unknown>) {\n /* Its tab shown again: what it would draw is said again, over whatever the other tab left. */\n if (changed.has('active') && this.active && changed.get('active') === false) this.told = ''\n /* What 고치기 said is about the figure as it was: another step or another part, and it no longer holds. */\n if (changed.has('asset') || changed.has('partId')) this.fixNote = ''\n if (this.asset && this.partId && this.partId !== this.loadedFor) {\n this.loadedFor = this.partId\n this.motion = freshMotion()\n this.place = freshPlace()\n this.row = freshRow()\n this.rowOpen = false\n this.rowCandidate = undefined\n this.editingMotion = false\n this.motionAxis = 0\n }\n }\n\n updated() {\n /* Only the sections that hold a form speak of what it would do, and only while their tab is shown: the panel has\n one of these per section, and the others' silence cleared what it showed (2026-09-27, :3391). */\n const speaks = this.active && (this.section === 'shape' || this.section === 'response')\n if (!speaks) return\n const said = JSON.stringify(this.candidate ?? null)\n if (said === this.told) return\n this.told = said\n this.dispatchEvent(new CustomEvent('preview-command', { detail: this.candidate ?? null, bubbles: true, composed: true }))\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n /* The panel left: what it showed goes with it. */\n if (this.told && this.told !== 'null') this.dispatchEvent(new CustomEvent('preview-command', { detail: null, bubbles: true, composed: true }))\n this.told = ''\n }\n\n render() {\n const asset = this.asset\n this.candidate = undefined\n this.fastenCandidate = undefined\n this.rowCandidate = undefined\n if (!asset || !this.partId) return nothing\n if (this.section === 'motion')\n return html`<section><h3>${i18next.t('figure.label.motion')}${this.help.button('figure.text.motion-explained')}</h3>${this.help.hint('figure.text.motion-explained')}\n ${this.renderMotion(asset)}${this.renderShown(asset)}</section>`\n if (this.section === 'places') {\n /*\n One idea, places, two ways to make them (ADR-0118): one at a time on this part, or many by a rule -- the figure's\n slot layout. One section with a choice, not two screens for the same thing (chief architect, 2026-10-11).\n */\n const byRule = (this.placesBy ?? (asset.document.capabilities.slotLayout ? 'rule' : 'one')) === 'rule'\n return html`<section><h3>${i18next.t('figure.label.places-on-part', { part: this.partId })}${this.help.button('figure.text.place-explained')}</h3>${this.help.hint('figure.text.place-explained')}\n <ox-input-select-buttons\n places-by\n .value=${byRule ? 'rule' : 'one'}\n .options=${[\n { value: 'one', display: i18next.t('figure.label.places-one') },\n { value: 'rule', display: i18next.t('figure.label.places-by-rule') }\n ]}\n @change=${(e: CustomEvent) => (this.placesBy = e.detail === 'rule' ? 'rule' : 'one')}\n ></ox-input-select-buttons>\n ${byRule\n ? html`<figure-slot-layout-panel .asset=${asset} .partId=${this.partId} ?locked=${this.locked}></figure-slot-layout-panel>`\n : placeFacesOf(asset, this.partId).length\n ? this.renderPlaces(asset)\n : html`<p hint>${i18next.t('figure.text.places-need-a-box')}</p>`}</section>`\n }\n /*\n Three groups in one order whatever the part's state (chief architect 2026-10-16): its size, its place, its row. The\n editor's own numbers go in through the slots, so a group keeps its place when a rule or a fastening takes them over.\n */\n /* Fastened, by a face or by an origin: either can be taken off, from the place group's 「⋯」. */\n const held = !!heldBy(asset, this.partId) || !!(this.revision && fasteningOf(this.revision, this.partId)?.atOrigin)\n if (this.section === 'response') {\n /*\n How the part answers a size it is placed at (user 2026-10-17, the 「반응형」 tab): its own measures, where it\n stands, and the row it may make -- what Build Once, Fit Anywhere is authored with, in one place.\n */\n const positions = held ? [] : positionsWorkedOut(asset, this.partId)\n this.rowCandidate = undefined\n const response = html`\n ${canFollow(asset, this.partId) ? html`<section size>\n <h3>${i18next.t('figure.label.group-size')}</h3>\n <figure-size-editor .revision=${this.revision} .partId=${this.partId} ?locked=${this.locked}></figure-size-editor>\n <slot name=\"size-note\"></slot>\n </section>` : nothing}\n ${positions.length\n ? html`<section position-response>\n <h3>${i18next.t('figure.label.group-position-response')}</h3>\n ${this.renderPositions(asset)}\n </section>`\n : nothing}\n ${rowOf(asset, this.partId) ? html`<slot name=\"row\"></slot>` : this.renderRow(asset)}\n `\n this.candidate = this.rowOpen && this.rowCandidate ? { action: this.rowCandidate } : undefined\n return response\n }\n const shown = html`\n <slot name=\"size\"></slot>\n <section fastening>\n <h3>\n ${i18next.t('figure.label.group-place')}${this.help.button('figure.text.fastening-explained')}\n ${groupMenu([{ label: i18next.t('figure.button.detach'), icon: 'link_off', disabled: this.locked || !held, run: () => this.command({ kind: 'detach', part: this.partId }) }])}\n </h3>${this.help.hint('figure.text.fastening-explained')}\n <slot name=\"place\"></slot>\n ${canFasten(asset, this.partId) ? this.renderFastening(asset) : html`<p hint>${i18next.t('figure.text.part-cannot-fasten')}</p>`}\n </section>\n `\n this.candidate = this.fastenCandidate\n return shown\n }\n\n /** Where things are held on this part: a seat things rest on, or a grip things are held in. */\n private renderPlaces(asset: FigureAsset) {\n const faces = placeFacesOf(asset, this.partId)\n const p = this.place\n const face = faces.includes(p.face) ? p.face : faces[0]!\n const accepts = acceptsOf(p.accepts)\n const capacityOk = Number.isSafeInteger(p.capacity) && p.capacity >= 1\n const roleName = (role: string) => i18next.t('figure.label.place-' + role)\n return html`\n ${placesOn(asset, this.partId).map(\n one => html`<div pair>\n <span>\n <b bound>${one.label}</b>\n <small>${one.face ? i18next.t('figure.label.face-' + one.face) + ' · ' : ''}${placeTerms(one, (key, params) => i18next.t(key, params))}</small>\n </span>\n <button quiet ?disabled=${this.locked} @click=${() => this.command({ kind: 'remove-binding', id: one.id })}>\n <md-icon>close</md-icon>${i18next.t('figure.button.remove-place')}\n </button>\n </div>`\n )}\n ${holdsThings(asset)\n ? nothing\n : html`<p hint>${i18next.t('figure.text.place-needs-holding')}</p>\n <button act ?disabled=${this.locked} @click=${() => this.declareHolding(asset)}>\n <md-icon>inventory_2</md-icon>${i18next.t('figure.button.declare-holding')}\n </button>`}\n <div pair>\n <select @change=${(e: Event) => (this.place = { ...p, role: (e.target as HTMLSelectElement).value as 'seat' | 'grip' })}>\n <option value=\"grip\" ?selected=${p.role === 'grip'}>${roleName('grip')}</option>\n <option value=\"seat\" ?selected=${p.role === 'seat'}>${roleName('seat')}</option>\n </select>\n <select @change=${(e: Event) => (this.place = { ...p, face: (e.target as HTMLSelectElement).value as FigureFace })}>\n ${faces.map(one => html`<option value=${one} ?selected=${one === face}>${i18next.t('figure.label.face-' + one)}</option>`)}\n </select>\n </div>\n <div form>\n <span>${i18next.t('figure.label.place-name')}</span>\n <input .value=${p.label} placeholder=${roleName(p.role)} @change=${(e: Event) => (this.place = { ...p, label: (e.target as HTMLInputElement).value })} />\n <span>${i18next.t('figure.label.place-accepts')}</span>\n <input .value=${p.accepts} placeholder=\"BOX, TOTE\" @input=${(e: Event) => (this.place = { ...p, accepts: (e.target as HTMLInputElement).value })} />\n <span>${i18next.t('figure.label.place-capacity')}</span>\n <input type=\"number\" min=\"1\" step=\"1\" .value=${String(p.capacity)} @change=${(e: Event) => (this.place = { ...p, capacity: (e.target as HTMLInputElement).valueAsNumber })} />\n </div>\n ${accepts.length ? nothing : html`<small>${i18next.t('figure.text.place-accepts-needed')}</small>`}\n <button\n act\n ?disabled=${this.locked || !accepts.length || !capacityOk}\n @click=${() =>\n this.command({\n kind: 'add-binding',\n id: placeIdFor(asset, this.partId, p.role),\n label: p.label.trim() || roleName(p.role),\n role: p.role,\n part: this.partId,\n face,\n accepts,\n capacity: p.capacity\n })}\n >\n <md-icon>back_hand</md-icon>${i18next.t('figure.button.add-place')}\n </button>\n `\n }\n\n /** The figure holds things: `Capacity` and `Holdable`, the ladder's middle rung. One part edit, one undo step. */\n private declareHolding(asset: FigureAsset) {\n const names = [...new Set([...(asset.document.capabilities.names ?? []), 'Capacity', 'Holdable'])]\n this.dispatchEvent(new CustomEvent('part-edit', { detail: { edit: { kind: 'set-capabilities', names } }, bubbles: true, composed: true }))\n }\n\n /**\n * 정렬·간격 고치기: the part moved inside the face it is fastened on, as one step -- the least move on each side it is\n * out, or centred when it is wider than the face. When nothing of it can be moved, why is said under the button, not\n * nothing at all (:3300, 2026-10-11: the button only scrolled to the drawing, which was already in view). The command\n * is the fastening window's for the same choice (`fasten-form.ts`), with only the place across the face changed.\n */\n private fixAlignment() {\n const revision = this.revision\n if (!revision) return\n const form = fastenFormOf(revision, this.partId)\n /* Whether it is out, and the least move that brings it in, are the kernel's measure (ADR-0140 3.8). */\n const own = figureFaceOverhangOf(revision.asset, this.partId, revision.inputs)\n const fixed =\n own?.state === 'unknown'\n ? ({ cannot: 'unmeasured' } as const)\n : own?.state === 'out' || own?.state === 'possible'\n ? insideAlignmentOf(fastenPlanOf(revision, this.partId, form).view, form.align, form.alignMm)\n : ({ cannot: 'inside' } as const)\n if ('cannot' in fixed) {\n this.fixNote = i18next.t(`figure.text.fix-alignment-${fixed.cannot}`, { part: this.partId, on: form.target })\n return\n }\n this.fixNote = ''\n const action = fastenPlanOf(revision, this.partId, { ...form, align: fixed.align, alignMm: fixed.alignMm }).action\n if (action) this.command(action)\n }\n\n /** The fastening window, asked of the editor: it opens over the canvas on what the part has now. */\n private openFastening() {\n this.dispatchEvent(new CustomEvent('fasten-open', { bubbles: true, composed: true }))\n }\n\n /**\n * What holds the part, said as its state -- 「바닥에 붙어 있음」 -- with the ways to change it: open the fastening,\n * or take it off. Right after \"follow size, attached\" this is the result, not a refusal (designer 2026-09-27).\n */\n private heldWords(asset: FigureAsset) {\n const joint = (asset.joints ?? []).find(j => j.body1.part === this.partId)\n const gap = joint?.origin?.gap ?? 0\n const place = i18next.t(`figure.label.resize-place-${asset.placement ?? 'floor'}`)\n const where = !joint\n ? i18next.t('figure.text.held-by-rule')\n : 'plane' in joint.body0\n ? typeof gap === 'number'\n ? i18next.t('figure.text.held-on-plane', { place, gap: String(gap) })\n : i18next.t('figure.text.held-on-plane-worked-out', { place })\n : i18next.t('figure.text.held-on-part', { other: joint.body0.part, otherFace: i18next.t(endPlaceKeyOf(joint.body0)) })\n return where\n }\n\n /**\n * Positions worked out from other values, each with the way to\n * keep it where it is. This is the way out the release gate names when a resize leaves a part in the air.\n */\n private renderPositions(asset: FigureAsset) {\n return positionsWorkedOut(asset, this.partId).map(\n axis => html`<div pair>\n <span>${axis.toUpperCase()} · ${i18next.t(positionIsShare(asset, this.partId, axis) ? 'figure.label.position-in-proportion' : 'figure.label.position-worked-out')}</span>\n <button act ?disabled=${this.locked} @click=${() => this.command({ kind: 'fix-position', part: this.partId, axis })}>\n <md-icon>push_pin</md-icon>${i18next.t('figure.button.fix-position')}\n </button>\n ${hasInstanceSize(asset, axis) && !positionIsShare(asset, this.partId, axis)\n ? html`<button act ?disabled=${this.locked} title=${i18next.t('figure.text.scale-position-explained')} @click=${() => this.command({ kind: 'scale-position', part: this.partId, axis })}>\n <md-icon>open_in_full</md-icon>${i18next.t('figure.button.scale-position')}\n </button>`\n : nothing}\n </div>`\n )\n }\n\n /**\n * The fastening in one line -- what, on which face, how -- and 「바꾸기」 to open the window where it is chosen (chief\n * architect 2026-10-16; user 2026-10-17: the result here, the editing in a window with room). Taking it off is in the\n * group's 「⋯」. What hangs over the face, and the way to fix it, stay here: they are about the fastening as it is now.\n */\n private renderFastening(asset: FigureAsset) {\n const revision = this.revision!\n const own = fasteningOf(revision, this.partId)\n /* Placed by an origin (ADR-0107 decision 4): attach writes faces, so the window would move it off its origin. Said, and taken off only. */\n if (own?.atOrigin)\n return html`<div fastened fasten-at-origin>\n <p>${this.heldWords(asset)}</p>\n ${this.renderDetachWords()}\n </div>`\n const overhang = html`${this.overhangNote.length ? html`<p hint overhang-note>${this.overhangNote.join(' ')}</p>` : nothing}\n ${this.overhangWords.length\n ? html`<div overhang role=\"status\">\n ${this.overhangWords.map(line => html`<p>${line}</p>`)}\n ${own\n ? html`<button act fix-alignment ?disabled=${this.locked} @click=${() => this.fixAlignment()}>\n <md-icon>tune</md-icon>${i18next.t('figure.button.fix-alignment')}\n </button>\n ${this.fixNote ? html`<p hint fix-note>${this.fixNote}</p>` : nothing}`\n : nothing}\n </div>`\n : nothing}`\n if (own && heldBy(asset, this.partId)) {\n const form = fastenFormOf(revision, this.partId)\n const plan = fastenPlanOf(revision, this.partId, form)\n if (plan.action) this.fastenCandidate = { action: plan.action, ...(plan.face ? { face: plan.face } : {}) }\n const planeWord = i18next.t('figure.label.resize-place-' + (asset.placement ?? 'floor'))\n return html`\n ${overhang}\n <div fastened-summary>\n <p fasten-sentence>${fastenSentenceOf(form, plan, planeWord, (key, params) => i18next.t(key, params))}</p>\n <button act change-fastening ?disabled=${this.locked} @click=${() => this.openFastening()}>${i18next.t('figure.button.change-fastening')}</button>\n </div>\n ${this.renderDetachWords()}\n `\n }\n /* A blank attachment is not a form to decipher: what it does, and the way to the window. */\n return html`\n ${overhang}\n <p hint>${i18next.t('figure.text.fasten-start')}</p>\n <button act fasten-start ?disabled=${this.locked} @click=${() => this.openFastening()}>\n <md-icon>link</md-icon>${i18next.t('figure.button.fasten-start')}\n </button>\n `\n }\n\n private renderDetachWords() {\n /* One thing to say is a line, not a list of one. */\n if (this.detachWords.length === 1) return html`<p hint detach-words>${this.detachWords[0]}</p>`\n return this.detachWords.length ? html`<ul detach-words>${this.detachWords.map(line => html`<li>${line}</li>`)}</ul>` : nothing\n }\n\n /**\n * Making the part a row across what it is fastened to (figure-model `make-repeat`): along one of the axes across its\n * face, copies a pitch apart filling the parent's length, or a count spread over it. Once made, the row's own section\n * (the editor's) shows it and takes it away.\n */\n private renderPreviewWords() {\n if (this.previewWords.length === 1) return html`<p preview-words role=\"status\">${this.previewWords[0]}</p>`\n return this.previewWords.length ? html`<ul preview-words role=\"status\">${this.previewWords.map(line => html`<li>${line}</li>`)}</ul>` : nothing\n }\n\n /**\n * A row (ADR-0097 §5.5): said as what it makes, \"arranged in a row\". Where it cannot be made here, why, rather than\n * nothing. Filling the length, the centre spacing is the author's; a count of their own is spread evenly over the\n * length -- figure-model draws it so, and the form does not ask for a spacing it would not use.\n */\n private renderRow(asset: FigureAsset) {\n if (rowOf(asset, this.partId)) return nothing\n const blocked = rowBlockOf(asset, this.partId)\n const axes = rowAxesOf(asset, this.partId)\n const r = this.row\n /*\n Folded, open while it is being worked (2026-10-02): a row is made now and then, and most parts stand on the plane,\n where the section said its reason open on every one. Opened, it says why or asks how.\n */\n const head = html`<summary><h3>${i18next.t('figure.label.repeat')} <span section-state>${i18next.t('figure.label.repeat-inactive')}</span></h3></summary>`\n if (blocked || !axes.length)\n return html`<section row><details row-fold open>\n ${head}\n <p hint row-blocked>${i18next.t(`figure.text.row-blocked-${blocked ?? 'unfastened'}`, { part: this.partId })}</p>\n ${blocked === 'unfastened'\n ? html`<button act @click=${() => this.dispatchEvent(new CustomEvent('go-fasten', { bubbles: true, composed: true }))}><md-icon>link</md-icon>${i18next.t('figure.button.go-fasten')}</button>`\n : nothing}\n </details></section>`\n const axis = axes.includes(r.axis as Axis) ? (r.axis as Axis) : axes[0]!\n const ok = r.fills ? r.pitch > 0 : Number.isSafeInteger(r.count) && r.count >= 1\n const action = ok\n ? ({ kind: 'make-repeat', part: this.partId, axis, pitch: r.fills ? r.pitch : Math.max(r.pitch, 1), ...(r.fills ? {} : { count: r.count }) } as FigureAuthoringAction)\n : undefined\n this.rowCandidate = action\n const set = (next: typeof r) => ((this.row = next), (this.rowOpen = true))\n /*\n Whether the row is being worked follows the fold's own toggle. A press on the heading focuses it before the click;\n set on focus, the fold opened there and the click then folded it again (2026-10-11: it took two clicks to open).\n */\n const toggled = (e: Event) => (this.rowOpen = (e.target as HTMLDetailsElement).open)\n return html`<section row><details row-fold ?open=${this.rowOpen} @toggle=${toggled}>\n ${head}\n <p hint>${i18next.t('figure.text.repeat-intro')}</p>\n <div form>\n <span>${i18next.t('figure.label.repeat-axis')}</span>\n <select aria-label=${i18next.t('figure.label.repeat-axis')} ?disabled=${this.locked} @change=${(e: Event) => set({ ...r, axis: (e.target as HTMLSelectElement).value as Axis })}>\n ${axes.map(a => html`<option value=${a} ?selected=${a === axis}>${a.toUpperCase()}</option>`)}\n </select>\n </div>\n <p hint>${i18next.t('figure.text.repeat-direction')}</p>\n <div choice-row role=\"radiogroup\" aria-label=${i18next.t('figure.label.row-basis')}>\n <label toggle><input type=\"radio\" name=\"row-basis\" ?disabled=${this.locked} .checked=${r.fills} @change=${() => set({ ...r, fills: true })} />${i18next.t('figure.label.repeat-fills')}</label>\n <label toggle><input type=\"radio\" name=\"row-basis\" ?disabled=${this.locked} .checked=${!r.fills} @change=${() => set({ ...r, fills: false })} />${i18next.t('figure.label.row-by-count')}</label>\n </div>\n ${r.fills\n ? html`<div form>\n <span>${i18next.t('figure.label.repeat-pitch')} · mm</span>\n <input aria-label=${i18next.t('figure.label.repeat-pitch')} ?disabled=${this.locked} type=\"number\" step=\"any\" min=\"0\" .value=${String(r.pitch)} @change=${(e: Event) => set({ ...r, pitch: Number((e.target as HTMLInputElement).value) })} />\n </div>`\n : html`<div form>\n <span>${i18next.t('figure.label.repeat-count')}</span>\n <input aria-label=${i18next.t('figure.label.repeat-count')} ?disabled=${this.locked} type=\"number\" step=\"1\" min=\"1\" .value=${String(r.count)} @change=${(e: Event) => set({ ...r, count: Number((e.target as HTMLInputElement).value) })} />\n </div>\n <p hint>${i18next.t('figure.text.row-count-spreads')}</p>`}\n ${action && this.rowOpen ? html`<p hint>${i18next.t('figure.text.repeat-draft')}</p>${this.renderPreviewWords()}` : nothing}\n <button act ?disabled=${this.locked || !action} @click=${() => action && this.command(action)}>\n <md-icon>view_week</md-icon>${i18next.t('figure.button.make-repeat')}\n </button>\n </details></section>`\n }\n\n /**\n * When the part is drawn: always, or while a control is at least a value -- a lamp lit while the gate is open. One\n * part edit (`set-visibility`), one step. Offered once the figure has a control; a motion is what makes one.\n */\n private renderShown(asset: FigureAsset) {\n const controls = visibilityControlsOf(asset)\n if (!controls.length) return nothing\n const now = shownWhenOf(asset, this.partId)\n const send = (shownWhen: { input: string; atLeast: number } | null) =>\n this.dispatchEvent(new CustomEvent('part-edit', { detail: { edit: { kind: 'set-visibility', target: this.partId, shownWhen } }, bubbles: true, composed: true }))\n const first = (id: string) => {\n const c = controls.find(one => one.id === id)!\n return Math.round((c.min + (c.max - c.min) * 0.01) * 1000) / 1000\n }\n const unit = now ? controls.find(c => c.id === now.input)?.unit : ''\n return html`<div form>\n <span>${i18next.t('figure.label.shown-when')}</span>\n <select\n ?disabled=${this.locked}\n @change=${(e: Event) => {\n const id = (e.target as HTMLSelectElement).value\n send(id ? { input: id, atLeast: now?.input === id ? now.atLeast : first(id) } : null)\n }}\n >\n <option value=\"\" ?selected=${!now}>${i18next.t('figure.label.shown-always')}</option>\n ${controls.map(c => html`<option value=${c.id} ?selected=${now?.input === c.id}>${i18next.t('figure.label.shown-while', { control: c.label })}</option>`)}\n </select>\n ${now\n ? html`<span>${i18next.t('figure.label.shown-at-least')}${unit ? ` (${unit})` : ''}</span>\n <input\n type=\"number\"\n step=\"any\"\n ?disabled=${this.locked}\n .value=${String(now.atLeast)}\n @change=${(e: Event) => {\n const v = (e.target as HTMLInputElement).valueAsNumber\n if (Number.isFinite(v)) send({ input: now.input, atLeast: v })\n }}\n />`\n : nothing}\n </div>`\n }\n\n private renderMotion(asset: FigureAsset) {\n const now = motionOf(asset, this.partId)\n const joint = asset.joints?.find(j => j.body1.part === this.partId)\n if (now && !(this.editingMotion && joint)) {\n /* Which part moves, against what, which way, how far -- by name (ADR-0097 §5.5). */\n const against = joint ? ('plane' in joint.body0 ? i18next.t('figure.label.mounting-plane') : joint.body0.part) : ''\n const ends = this.motionEnds\n /* One row an axis (ADR-0159): how it moves and by what, changed or taken away where it is; more added under them. */\n const count = joint ? figureMotionsOf(joint).length : 1\n const edit = (k: number) => {\n if (!joint) return\n this.motionAxis = k\n this.motion = motionFormOf(joint, k)\n this.editingMotion = true\n }\n const row = (k: number) => {\n const it = k === 0 ? now : motionOf(asset, this.partId, k)\n if (!it) return nothing\n return html`<div pair motion-axis=${k}>\n <span>\n ${count > 1 ? html`<b>${i18next.t('figure.label.motion-axis-n', { n: k + 1 })}</b> ` : nothing}${i18next.t('figure.label.motion-' + it.kind)} · ${it.vector ? jointAxisWord(it.vector) : String(it.axis).toUpperCase()}\n ${it.travel\n ? html`<small>${i18next.t('figure.label.motion-travel-is', { part: it.travel.part, axis: it.travel.axis.toUpperCase(), plus: it.travel.plus ?? 0 })}</small>`\n : nothing}\n ${it.follows?.sum.length === 1\n ? html`<small>${i18next.t('figure.label.motion-follows', { joint: it.follows.sum[0]!.joint, multiplier: it.follows.sum[0]!.multiplier, offset: it.follows.offset })}</small>`\n : it.follows\n ? html`<small>${i18next.t('figure.label.motion-follow')}: ${it.follows.sum.map(t => `${t.joint} × ${t.multiplier}`).join(' + ')} + ${it.follows.offset}</small>`\n : it.control\n ? html`<small>${it.control.id} (${it.control.unit}) ${it.control.min} … ${it.control.max}</small>`\n : nothing}\n </span>\n ${count > 1\n ? html`<button act remove-axis ?disabled=${this.locked || !joint} @click=${() => joint && this.command({ kind: 'set-joint', joint: withoutAxis(joint, k) })}>\n <md-icon>close</md-icon>${i18next.t('figure.button.remove-axis')}\n </button>`\n : html`<button act ?disabled=${this.locked || !joint} @click=${() => joint && this.command({ kind: 'set-joint', joint: fixedJointOf(joint) })}>\n <md-icon>close</md-icon>${i18next.t('figure.button.remove-motion')}\n </button>`}\n <button act ?disabled=${this.locked || !joint} @click=${() => edit(k)}>\n <md-icon>edit</md-icon>${i18next.t('figure.button.change-motion')}\n </button>\n </div>`\n }\n return html`<p motion-summary>\n ${i18next.t('figure.text.motion-summary', {\n part: this.partId,\n against,\n kind: i18next.t('figure.label.motion-' + now.kind),\n axis: now.vector ? jointAxisWord(now.vector) : String(now.axis).toUpperCase()\n })}\n </p>\n ${ends\n ? html`<p hint motion-ends>${i18next.t('figure.text.motion-ends-shown', { min: String(ends.min), max: String(ends.max), unit: ends.unit })}</p>`\n : nothing}\n ${Array.from({ length: count }, (_, k) => row(k))}\n <div pair>\n <button act add-axis ?disabled=${this.locked || !joint} @click=${() => edit(count)}>\n <md-icon>add</md-icon>${i18next.t('figure.button.add-axis')}\n </button>\n ${count > 1\n ? html`<button act ?disabled=${this.locked || !joint} @click=${() => joint && this.command({ kind: 'set-joint', joint: fixedJointOf(joint) })}>\n <md-icon>close</md-icon>${i18next.t('figure.button.remove-motion')}\n </button>`\n : nothing}\n </div>`\n }\n /* A joint needs a parent (URDF): a part fastened to nothing is fastened first. */\n if (!joint)\n return html`<p hint>${i18next.t('figure.text.fasten-before-moving')}</p>\n <button act go-fasten @click=${() => this.dispatchEvent(new CustomEvent('go-fasten', { bubbles: true, composed: true }))}>\n <md-icon>link</md-icon>${i18next.t('figure.button.go-fasten')}\n </button>`\n const m = this.motion\n const unit = m.kind === 'slide' ? 'mm' : 'deg'\n /* A follower follows a joint that moves the same way; a choice the kind no longer allows is dropped. */\n const k = this.motionAxis\n const leaders = leadersFor(asset, this.partId, m.kind, motionIdOf(joint, k))\n const adding = k > 0 && k >= figureMotionsOf(joint).length\n const follow = leaders.some(j => j.id === m.follow) ? m.follow : ''\n const refusal = motionFormRefusalOf(m, follow)\n return html`\n ${k > 0 ? html`<p motion-axis-heading><b>${i18next.t('figure.label.motion-axis-n', { n: k + 1 })}</b></p>` : nothing}\n <div pair>\n <select @change=${(e: Event) => this.setKind((e.target as HTMLSelectElement).value as 'slide' | 'turn' | 'continuous')}>\n <option value=\"slide\" ?selected=${m.kind === 'slide'}>${i18next.t('figure.label.motion-slide')}</option>\n <option value=\"turn\" ?selected=${m.kind === 'turn'}>${i18next.t('figure.label.motion-turn')}</option>\n <option value=\"continuous\" ?selected=${m.kind === 'continuous'}>${i18next.t('figure.label.motion-continuous')}</option>\n </select>\n ${m.axisVector\n ? html`<span motion-axis-vector>${i18next.t('figure.label.motion-axis')} ${jointAxisWord(m.axisVector)}</span>`\n : html`<select @change=${(e: Event) => (this.motion = { ...m, axis: (e.target as HTMLSelectElement).value as Axis })}>\n ${AXES.map(a => html`<option value=${a} ?selected=${a === m.axis}>${i18next.t('figure.label.motion-axis')} ${a.toUpperCase()}</option>`)}\n </select>`}\n </div>\n ${m.followSum\n ? html`<div form>\n <span>${i18next.t('figure.label.motion-follow')}</span>\n <span>${m.followSum.map(t => `${t.joint} × ${t.multiplier}`).join(' + ')}</span>\n <span>${i18next.t('figure.label.motion-offset')} (${unit})</span>\n <input type=\"number\" step=\"any\" .value=${String(m.offset)} @change=${(e: Event) => (this.motion = { ...m, offset: Number((e.target as HTMLInputElement).value) || 0 })} />\n </div>`\n : leaders.length\n ? html`<div form>\n <span>${i18next.t('figure.label.motion-follow')}</span>\n <select @change=${(e: Event) => (this.motion = { ...m, follow: (e.target as HTMLSelectElement).value })}>\n <option value=\"\" ?selected=${!follow}>${i18next.t('figure.label.motion-own-control')}</option>\n ${leaders.map(j => html`<option value=${j.id} ?selected=${j.id === follow}>${j.part}${j.state?.id ? ` · ${j.state.id}` : j.id !== j.part ? ` · ${j.id}` : ''}</option>`)}\n </select>\n </div>`\n : nothing}\n ${m.followSum\n ? nothing\n : follow\n ? html`<div form>\n <span>${i18next.t('figure.label.motion-multiplier')}</span>\n <input type=\"number\" step=\"any\" .value=${String(m.multiplier)} @change=${(e: Event) => (this.motion = { ...m, multiplier: Number((e.target as HTMLInputElement).value) })} />\n <span>${i18next.t('figure.label.motion-offset')} (${unit})</span>\n <input type=\"number\" step=\"any\" .value=${String(m.offset)} @change=${(e: Event) => (this.motion = { ...m, offset: Number((e.target as HTMLInputElement).value) || 0 })} />\n </div>`\n : html`<div form>\n ${m.kind === 'slide'\n ? html`<span>${i18next.t('figure.label.motion-travel')}</span>\n <select @change=${(e: Event) => (this.motion = { ...m, travel: (e.target as HTMLSelectElement).value })}>\n ${m.travelSum\n ? html`<option value=\"\" ?selected=${!m.travel}>${m.travelSum.sum.map(t => `${t.from.of === 'input' ? t.from.input : `${t.from.of === 'part' ? t.from.part : i18next.t('figure.label.motion-travel')} · ${t.from.axis.toUpperCase()}`}${t.times !== undefined && t.times !== 1 ? ` × ${t.times}` : ''}`).join(' + ')}</option>`\n : html`<option value=\"\" ?selected=${!m.travel}>${i18next.t('figure.label.motion-travel-mm')}</option>`}\n ${asset.appearance\n .map(look => look.target)\n .filter(one => canFollow(asset, one))\n .flatMap(one => AXES.map(a => html`<option value=${`${one}:${a}`} ?selected=${m.travel === `${one}:${a}`}>${one} · ${a.toUpperCase()}</option>`))}\n </select>\n ${m.travel\n ? html`<span>${i18next.t('figure.label.follows-plus')}</span>\n <input type=\"number\" step=\"any\" .value=${String(m.travelPlus ?? 0)} @change=${(e: Event) => (this.motion = { ...m, travelPlus: Number((e.target as HTMLInputElement).value) || 0 })} />`\n : nothing}`\n : nothing}\n <span>${i18next.t('figure.label.control-id')}</span>\n <input .value=${m.id} placeholder=${controlIdFor(this.partId, m.kind, k)} @change=${(e: Event) => (this.motion = { ...m, id: (e.target as HTMLInputElement).value.trim() })} />\n ${m.kind === 'continuous' || (m.kind === 'slide' && (m.travel || m.travelSum))\n ? nothing\n : html`<span>${i18next.t('figure.label.control-range')} (${unit})</span>\n <div pair>\n <input type=\"number\" step=\"any\" .value=${String(m.min)} @change=${(e: Event) => (this.motion = { ...m, min: Number((e.target as HTMLInputElement).value) })} />\n <input type=\"number\" step=\"any\" .value=${String(m.max)} @change=${(e: Event) => (this.motion = { ...m, max: Number((e.target as HTMLInputElement).value) })} />\n </div>`}\n </div>`}\n <button\n act\n ?disabled=${this.locked || !!refusal}\n title=${refusal === 'range' ? i18next.t('figure.text.range-needs-room') : ''}\n @click=${() => {\n this.command({ kind: 'set-joint', joint: motionJoint(joint, { ...m, follow }, this.partId, k) })\n this.editingMotion = false\n this.motionAxis = 0\n }}\n >\n <md-icon>animation</md-icon>${i18next.t(adding ? 'figure.button.add-axis' : this.editingMotion ? 'figure.button.apply-motion-change' : 'figure.button.add-motion')}\n </button>\n ${this.editingMotion\n ? html`<button act @click=${() => ((this.editingMotion = false), (this.motionAxis = 0))}><md-icon>undo</md-icon>${i18next.t('figure.button.cancel-motion-change')}</button>`\n : nothing}\n `\n }\n\n private setKind(kind: 'slide' | 'turn' | 'continuous') {\n this.motion = kind === 'slide' ? { ...this.motion, kind, min: 0, max: 500 } : { ...this.motion, kind, min: -90, max: 90 }\n }\n\n private command(action: FigureAuthoringAction) {\n this.dispatchEvent(new CustomEvent('command', { detail: { action }, bubbles: true, composed: true }))\n }\n}\n"]}
@@ -5,7 +5,8 @@ declare const FigureSizeEditor_base: (new (...args: any[]) => LitElement) & type
5
5
  * A part's measures and what each follows, one row an axis (ADR-0159 3). Made to follow, a measure takes what the part
6
6
  * hangs from, along the axis its own axis lies on as it stands -- the author turns it on, nothing more. Another source
7
7
  * is there when asked for, or when there is no such axis (the part lies at an angle) or the measure already follows
8
- * something else; each way of following says what it will do, in millimetres.
8
+ * something else; each way of following says what it will do, in millimetres. A measure of the part's own is a value in
9
+ * hand as on any field (user 2026-09-24): drawn while it is typed or its label is dragged, written once on the release.
9
10
  */
10
11
  export declare class FigureSizeEditor extends FigureSizeEditor_base {
11
12
  revision?: FigureRevision;
@@ -15,6 +16,7 @@ export declare class FigureSizeEditor extends FigureSizeEditor_base {
15
16
  private choosing;
16
17
  private equivalentModes;
17
18
  static styles: import("lit").CSSResult[];
19
+ private tell;
18
20
  private apply;
19
21
  private configure;
20
22
  private choose;