@things-factory/figure-ui 10.1.163 → 10.1.164

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.
@@ -26,6 +26,8 @@ export declare class FigureDataPanel extends FigureDataPanel_base {
26
26
  /** The binding opened to edit its rule, by id. */
27
27
  private opened;
28
28
  private porting;
29
+ /** The rotation card as filled in: the joint, and the fields for on, speed (and its most rpm) and direction. */
30
+ private rotating;
29
31
  /** The sample as typed, JSON; empty until edited, the schema's example shown until then. */
30
32
  private sample;
31
33
  private sampling;
@@ -50,6 +52,11 @@ export declare class FigureDataPanel extends FigureDataPanel_base {
50
52
  /** Which field of each element is its id, its type, its place, its height in the stack, its status. */
51
53
  private renderItemFields;
52
54
  private renderAddBinding;
55
+ /**
56
+ * 「+ 회전」: a joint that turns without end, turned by the data -- on, speed in rpm, direction -- in one step. The
57
+ * clips, the group and the bindings it writes are ordinary ones, edited one by one afterwards.
58
+ */
59
+ private renderRotation;
53
60
  private renderPorts;
54
61
  /** Data to try, read the way a placed figure reads it: what it moves, or why it is refused; in the preview, the figure running on it. */
55
62
  private renderSample;
@@ -4,7 +4,7 @@ import { css, html, LitElement, nothing } from 'lit';
4
4
  import { customElement, property, state } from 'lit/decorators.js';
5
5
  import { i18next, localize } from '@operato/i18n';
6
6
  import { FIGURE_UNITS, figureDataExample, inferFigureDataSchema } from '@hatiolab/figure-model';
7
- import { accessorOfRow, behaviorKeyOf, behaviorsOf, bindingDraftOf, domainOf, fieldAt, fieldOfKind, fitsField, partsOf, portDraftOf, sampleOf, schemaRowsOf, schemaWithField, schemaWithFieldReplaced, schemaWithoutField } from './data-interface.js';
7
+ import { accessorOfRow, behaviorKeyOf, behaviorsOf, bindingDraftOf, domainOf, endlessJointsOf, fieldAt, fieldOfKind, fitsField, partsOf, portDraftOf, rotationStepsOf, sampleOf, schemaRowsOf, schemaWithField, schemaWithFieldReplaced, schemaWithoutField } from './data-interface.js';
8
8
  import { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js';
9
9
  import { HelpToggles } from './help.js';
10
10
  const KINDS = ['number', 'boolean', 'text', 'object', 'list'];
@@ -32,6 +32,8 @@ let FigureDataPanel = class FigureDataPanel extends localize(i18next)(LitElement
32
32
  /** The binding opened to edit its rule, by id. */
33
33
  this.opened = '';
34
34
  this.porting = '';
35
+ /** The rotation card as filled in: the joint, and the fields for on, speed (and its most rpm) and direction. */
36
+ this.rotating = { input: '', on: '', speed: '', max: 0, direction: '', forward: '', reverse: '' };
35
37
  /** The sample as typed, JSON; empty until edited, the schema's example shown until then. */
36
38
  this.sample = '';
37
39
  this.sampling = false;
@@ -352,6 +354,7 @@ let FigureDataPanel = class FigureDataPanel extends localize(i18next)(LitElement
352
354
  ${this.help.hint('figure.text.data-bindings-explained')}
353
355
  ${bindings.map(b => this.renderBinding(asset, choices, b))}
354
356
  ${rows.length ? this.renderAddBinding(asset, rows, choices) : html `<p hint>${i18next.t('figure.text.data-no-fields')}</p>`}
357
+ ${this.renderRotation(asset, rows)}
355
358
  </section>`;
356
359
  }
357
360
  renderBinding(asset, choices, b) {
@@ -547,6 +550,80 @@ let FigureDataPanel = class FigureDataPanel extends localize(i18next)(LitElement
547
550
  <md-icon>add</md-icon>${i18next.t('figure.button.add-data-binding')}
548
551
  </button>`;
549
552
  }
553
+ /**
554
+ * 「+ 회전」: a joint that turns without end, turned by the data -- on, speed in rpm, direction -- in one step. The
555
+ * clips, the group and the bindings it writes are ordinary ones, edited one by one afterwards.
556
+ */
557
+ renderRotation(asset, rows) {
558
+ const joints = endlessJointsOf(asset);
559
+ if (!joints.length)
560
+ return nothing;
561
+ const r = this.rotating;
562
+ const joint = joints.find(j => j.input === r.input) ?? joints[0];
563
+ const values = rows.filter(row => !row.path.includes('[]'));
564
+ const of = (kind, closed = false) => values.filter(row => row.node.kind === kind && (!closed || domainOf(row.node).length > 0));
565
+ const speedRow = values.find(row => row.path === r.speed);
566
+ const speedMax = r.max || (speedRow?.node.kind === 'number' ? (speedRow.node.max ?? 0) : 0);
567
+ const directionRow = values.find(row => row.path === r.direction);
568
+ const directions = directionRow ? domainOf(directionRow.node).map(String) : [];
569
+ const forward = directions.includes(r.forward) ? r.forward : (directions[0] ?? '');
570
+ const reverse = directions.includes(r.reverse) ? r.reverse : (directions.find(v => v !== forward) ?? '');
571
+ const set = (patch) => (this.rotating = { ...r, ...patch });
572
+ const typed = (e) => e.target.value;
573
+ const pick = (rows, value, change) => html `<select ?disabled=${this.locked} @change=${(e) => change(typed(e))}>
574
+ <option value="" ?selected=${!value}>${i18next.t('figure.label.data-none')}</option>
575
+ ${rows.map(row => html `<option value=${row.path} ?selected=${row.path === value}>${row.path}</option>`)}
576
+ </select>`;
577
+ const choice = {
578
+ input: joint.input,
579
+ label: i18next.t('figure.label.data-rotation-of', { name: joint.label }),
580
+ ...(r.on ? { on: r.on } : {}),
581
+ ...(r.speed ? { speed: { path: r.speed, max: speedMax } } : {}),
582
+ ...(r.direction && forward && reverse ? { direction: { path: r.direction, forward, reverse } } : {})
583
+ };
584
+ const ready = !r.speed || speedMax > 0;
585
+ return html `<details>
586
+ <summary>${i18next.t('figure.label.data-rotation')}</summary>
587
+ <p hint>${i18next.t('figure.text.data-rotation-explained')}</p>
588
+ <div form>
589
+ <span>${i18next.t('figure.label.data-rotation-joint')}</span>
590
+ <select ?disabled=${this.locked} @change=${(e) => set({ input: typed(e) })}>
591
+ ${joints.map(j => html `<option value=${j.input} ?selected=${j === joint}>${j.label}</option>`)}
592
+ </select>
593
+ <span>${i18next.t('figure.label.data-rotation-on')}</span>
594
+ ${pick(of('boolean'), r.on, v => set({ on: v }))}
595
+ <span>${i18next.t('figure.label.data-rotation-speed')}</span>
596
+ ${pick(of('number'), r.speed, v => set({ speed: v, max: 0 }))}
597
+ ${r.speed
598
+ ? html `<span>${i18next.t('figure.label.data-rotation-max')}</span>
599
+ <input type="number" min="0" step="any" .value=${speedMax ? String(speedMax) : ''} ?disabled=${this.locked} @change=${(e) => set({ max: e.target.valueAsNumber || 0 })} />`
600
+ : nothing}
601
+ <span>${i18next.t('figure.label.data-rotation-direction')}</span>
602
+ ${pick(of('text', true), r.direction, v => set({ direction: v, forward: '', reverse: '' }))}
603
+ ${directions.length
604
+ ? html `<span>${i18next.t('figure.label.data-rotation-forward')}</span>
605
+ <select ?disabled=${this.locked} @change=${(e) => set({ forward: typed(e) })}>
606
+ ${directions.map(v => html `<option value=${v} ?selected=${v === forward}>${v}</option>`)}
607
+ </select>
608
+ <span>${i18next.t('figure.label.data-rotation-reverse')}</span>
609
+ <select ?disabled=${this.locked} @change=${(e) => set({ reverse: typed(e) })}>
610
+ ${directions.map(v => html `<option value=${v} ?selected=${v === reverse}>${v}</option>`)}
611
+ </select>`
612
+ : nothing}
613
+ </div>
614
+ ${ready ? nothing : html `<p hint>${i18next.t('figure.text.data-rotation-needs-max')}</p>`}
615
+ <button
616
+ act
617
+ ?disabled=${this.locked || !ready}
618
+ @click=${() => {
619
+ this.dispatchEvent(new CustomEvent('part-edits', { detail: { edits: rotationStepsOf(asset, choice) }, bubbles: true, composed: true }));
620
+ this.rotating = { input: '', on: '', speed: '', max: 0, direction: '', forward: '', reverse: '' };
621
+ }}
622
+ >
623
+ <md-icon>add</md-icon>${i18next.t('figure.button.data-add-rotation')}
624
+ </button>
625
+ </details>`;
626
+ }
550
627
  /* ---------------------------------------------------------------- status ports */
551
628
  renderPorts(asset) {
552
629
  const ports = asset.dataInterface?.ports ?? [];
@@ -689,6 +766,10 @@ __decorate([
689
766
  state(),
690
767
  __metadata("design:type", Object)
691
768
  ], FigureDataPanel.prototype, "porting", void 0);
769
+ __decorate([
770
+ state(),
771
+ __metadata("design:type", Object)
772
+ ], FigureDataPanel.prototype, "rotating", void 0);
692
773
  __decorate([
693
774
  state(),
694
775
  __metadata("design:type", Object)
@@ -1 +1 @@
1
- {"version":3,"file":"figure-data-panel.js","sourceRoot":"","sources":["../../client/modeller/figure-data-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { FIGURE_UNITS, figureDataExample, inferFigureDataSchema } from '@hatiolab/figure-model'\nimport type { FigureAsset, FigureDataBinding, FigureDataField, FigureDataNode, FigureDataRow, FigureDataValue, FigureStatusPort } from '@hatiolab/figure-model'\n\nimport {\n accessorOfRow,\n behaviorKeyOf,\n behaviorsOf,\n bindingDraftOf,\n domainOf,\n fieldAt,\n fieldOfKind,\n fitsField,\n partsOf,\n portDraftOf,\n sampleOf,\n schemaRowsOf,\n schemaWithField,\n schemaWithFieldReplaced,\n schemaWithoutField,\n type BehaviorChoice\n} from './data-interface.js'\nimport { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js'\nimport { HelpToggles } from './help.js'\n\nconst KINDS: FigureDataNode['kind'][] = ['number', 'boolean', 'text', 'object', 'list']\n\n/**\n * 데이터 -- the data a site sends this figure, in its own names, and what each value moves (ADR-0051 §8, data binding\n * design decision 4). The schema is free: fields the author names, a tree of objects and lists. A binding reads one place\n * of it and moves one thing the figure can do -- a control, a colour, a motion group's clip, speed or pause, a status\n * port, its position, the items in its places -- by the board's rules (value, map, range, scale). Every change is one\n * part edit, and whether it holds is the kernel's check.\n *\n * The sample is not saved: data tried here, read the one way a placed figure reads it, and -- in the preview -- the figure\n * running on it (`data-sample`).\n */\n@customElement('figure-data-panel')\nexport class FigureDataPanel extends localize(i18next)(LitElement) {\n private readonly help = new HelpToggles(this)\n static styles = [\n SidePanelStyles,\n css`\n :host {\n display: block;\n }\n ul[tree] {\n display: grid;\n gap: 2px;\n margin: 0;\n padding: 0;\n list-style: none;\n }\n ul[tree] > li > button[row] {\n display: flex;\n flex-wrap: wrap;\n gap: 0 6px;\n width: 100%;\n min-height: var(--figure-control-height);\n margin: 0;\n padding: 4px 6px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n align-items: center;\n cursor: pointer;\n }\n ul[tree] > li > button[row][selected] {\n border-color: var(--md-sys-color-primary);\n }\n ul[tree] > li > button[row] small {\n color: var(--md-sys-color-on-surface-variant);\n }\n /* What the field is and what reads it: beside the name when it fits, under it when not. */\n ul[tree] > li > button[row] small[meta] {\n margin-left: auto;\n text-align: right;\n }\n section[item] {\n display: grid;\n gap: 8px;\n padding: 8px;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 8px;\n }\n div[head] {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 30px;\n gap: 6px;\n align-items: center;\n }\n div[head] button[line] {\n min-width: 0;\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n overflow-wrap: anywhere;\n cursor: pointer;\n }\n div[head] button[act] {\n width: 30px;\n min-height: var(--figure-control-height);\n margin: 0;\n padding: 0;\n }\n div[cases] {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);\n gap: 4px 6px;\n align-items: center;\n }\n div[ranges] {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.4fr) 30px;\n gap: 4px 6px;\n align-items: center;\n }\n div[ranges] button[act] {\n width: 30px;\n margin: 0;\n padding: 0;\n }\n textarea {\n width: 100%;\n min-height: 96px;\n box-sizing: border-box;\n font-family: var(--ui-font-mono, monospace);\n font-size: inherit;\n }\n ul[result] {\n margin: 0;\n padding-left: 16px;\n }\n md-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n `\n ]\n\n @property({ attribute: false }) asset?: FigureAsset\n @property({ type: Boolean }) locked = false\n\n /** The schema row chosen, by its path; its field is edited under it. */\n @state() private chosen = ''\n @state() private adding = { name: '', kind: 'number' as FigureDataNode['kind'] }\n /** A site's data pasted to start the schema from; nothing is kept until the author says so. */\n @state() private pasted = ''\n @state() private connecting = { path: '', behavior: '' }\n /** The binding opened to edit its rule, by id. */\n @state() private opened = ''\n @state() private porting = ''\n /** The sample as typed, JSON; empty until edited, the schema's example shown until then. */\n @state() private sample = ''\n @state() private sampling = false\n\n render() {\n const asset = this.asset\n if (!asset) return nothing\n const rows = schemaRowsOf(asset)\n return html`\n ${this.renderSchema(asset, rows)} ${this.renderBindings(asset, rows)} ${this.renderPorts(asset)} ${rows.length ? this.renderSample(asset) : nothing}\n `\n }\n\n /* ---------------------------------------------------------------- the schema */\n\n private renderSchema(asset: FigureAsset, rows: FigureDataRow[]) {\n const schema = asset.dataInterface?.schema ?? []\n return html`<section>\n <h3>${i18next.t('figure.label.data-schema')}${this.help.button('figure.text.data-schema-explained')}</h3>\n ${this.help.hint('figure.text.data-schema-explained')}\n ${rows.length\n ? html`<ul tree>\n ${rows.map(\n row => html`<li>\n <button row ?selected=${row.path === this.chosen} style=\"padding-left: ${6 + row.depth * 14}px\" @click=${() => (this.chosen = row.path === this.chosen ? '' : row.path)}>\n <span>${row.name}${row.label ? html` <small>${row.label}</small>` : nothing}</span>\n <small meta>${this.kindWord(row.node)}${row.bindings.length ? ` · ${i18next.t('figure.label.data-bound', { count: row.bindings.length })}` : ''}</small>\n </button>\n ${row.path === this.chosen ? this.renderField(asset, schema, row) : nothing}\n </li>`\n )}\n </ul>`\n : html`<p hint>${i18next.t('figure.text.data-no-fields')}</p>`}\n ${this.renderAddField(schema, '')} ${this.renderFromSample(schema)}\n </section>`\n }\n\n private kindWord(node: FigureDataNode): string {\n const kind = i18next.t('figure.label.data-kind-' + node.kind)\n if (node.kind === 'number') {\n const range = node.min !== undefined || node.max !== undefined ? ` ${node.min ?? ''}~${node.max ?? ''}` : ''\n return `${kind}${node.unit ? ` ${node.unit}` : ''}${range}`\n }\n if (node.kind === 'text' && node.values) return `${kind} (${node.values.join(', ')})`\n if (node.kind === 'list') return `${kind} · ${i18next.t('figure.label.data-kind-' + node.item.kind)}`\n return kind\n }\n\n /** The chosen field's own settings, and a field added under it when it holds fields. */\n private renderField(asset: FigureAsset, schema: readonly FigureDataField[], row: FigureDataRow) {\n const field = fieldAt(schema, row.path)\n if (!field) return nothing\n const replace = (next: FigureDataField) => this.edit({ kind: 'set-data-schema', schema: schemaWithFieldReplaced(schema, row.path, next) })\n const set = (patch: Record<string, unknown>) => {\n const next = { ...field, ...patch } as Record<string, unknown>\n for (const [k, v] of Object.entries(patch)) if (v === undefined || (typeof v === 'number' && Number.isNaN(v))) delete next[k]\n replace(next as FigureDataField)\n }\n const value = (e: Event) => (e.target as HTMLInputElement | HTMLSelectElement).value\n const number = (e: Event) => (e.target as HTMLInputElement).valueAsNumber\n const rename = (to: string) => {\n if (!to || to === field.name) return\n /* A field outside any list is renamed with what reads it; inside a list it is the schema alone. */\n if (!row.path.includes('[]')) this.edit({ kind: 'rename-data-field', accessor: row.path, to })\n else replace({ ...field, name: to })\n }\n let holder: FigureDataNode = field\n while (holder.kind === 'list') holder = holder.item\n return html`<section item>\n <div head>\n <strong>${row.path}</strong>\n <button\n act\n ?disabled=${this.locked}\n title=${i18next.t('figure.button.remove-data-field')}\n @click=${() => {\n this.chosen = ''\n this.edit({ kind: 'set-data-schema', schema: schemaWithoutField(schema, row.path) })\n }}\n >\n <md-icon>close</md-icon>\n </button>\n </div>\n <div form>\n <span>${i18next.t('figure.label.data-name')}</span>\n <input .value=${field.name} ?disabled=${this.locked} @change=${(e: Event) => rename(value(e).trim())} />\n <span>${i18next.t('figure.label.data-label')}</span>\n <input .value=${field.label ?? ''} ?disabled=${this.locked} @change=${(e: Event) => set({ label: value(e).trim() || undefined })} />\n <span>${i18next.t('figure.label.data-kind')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => replace(fieldOfKind(field, value(e) as FigureDataNode['kind']))}>\n ${KINDS.map(k => html`<option value=${k} ?selected=${k === field.kind}>${i18next.t('figure.label.data-kind-' + k)}</option>`)}\n </select>\n ${field.kind === 'number'\n ? html`<span>${i18next.t('figure.label.data-unit')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ unit: value(e) || undefined })}>\n <option value=\"\" ?selected=${!field.unit}>-</option>\n ${FIGURE_UNITS.map(u => html`<option value=${u} ?selected=${u === field.unit}>${u}</option>`)}\n </select>\n <span>${i18next.t('figure.label.data-min')}</span>\n <input type=\"number\" step=\"any\" .value=${field.min === undefined ? '' : String(field.min)} ?disabled=${this.locked} @change=${(e: Event) => set({ min: number(e) })} />\n <span>${i18next.t('figure.label.data-max')}</span>\n <input type=\"number\" step=\"any\" .value=${field.max === undefined ? '' : String(field.max)} ?disabled=${this.locked} @change=${(e: Event) => set({ max: number(e) })} />\n <span>${i18next.t('figure.label.data-default')}</span>\n <input type=\"number\" step=\"any\" .value=${field.default === undefined ? '' : String(field.default)} ?disabled=${this.locked} @change=${(e: Event) => set({ default: number(e) })} />`\n : field.kind === 'boolean'\n ? html`<span>${i18next.t('figure.label.data-default')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ default: value(e) === '' ? undefined : value(e) === 'true' })}>\n <option value=\"\" ?selected=${field.default === undefined}>-</option>\n ${[false, true].map(b => html`<option value=${String(b)} ?selected=${b === field.default}>${i18next.t(b ? 'figure.label.data-true' : 'figure.label.data-false')}</option>`)}\n </select>`\n : field.kind === 'text'\n ? html`<span>${i18next.t('figure.label.data-values')}</span>\n <input\n .value=${(field.values ?? []).join(', ')}\n ?disabled=${this.locked}\n @change=${(e: Event) => {\n const values = value(e).split(',').map(v => v.trim()).filter(Boolean)\n set({ values: values.length ? values : undefined, default: field.default !== undefined && (!values.length || values.includes(field.default)) ? field.default : undefined })\n }}\n />\n <span>${i18next.t('figure.label.data-default')}</span>\n ${field.values\n ? html`<select ?disabled=${this.locked} @change=${(e: Event) => set({ default: value(e) || undefined })}>\n <option value=\"\" ?selected=${field.default === undefined}>-</option>\n ${field.values.map(v => html`<option value=${v} ?selected=${v === field.default}>${v}</option>`)}\n </select>`\n : html`<input .value=${field.default ?? ''} ?disabled=${this.locked} @change=${(e: Event) => set({ default: value(e) || undefined })} />`}`\n : html`<span></span>\n <label toggle>\n <input type=\"checkbox\" .checked=${!!field.json} ?disabled=${this.locked} @change=${(e: Event) => set({ json: (e.target as HTMLInputElement).checked ? true : undefined })} />\n ${i18next.t('figure.label.data-json')}\n </label>`}\n ${field.kind === 'list'\n ? html`<span>${i18next.t('figure.label.data-item-kind')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => replace({ ...field, item: nodeOfKind(value(e) as FigureDataNode['kind']) })}>\n ${KINDS.filter(k => k !== 'list').map(k => html`<option value=${k} ?selected=${k === field.item.kind}>${i18next.t('figure.label.data-kind-' + k)}</option>`)}\n </select>`\n : nothing}\n </div>\n ${holder.kind === 'object' ? this.renderAddField(schema, row.path) : nothing}\n </section>`\n }\n\n private renderAddField(schema: readonly FigureDataField[], under: string) {\n const a = this.adding\n const named = a.name.trim()\n return html`<div form>\n <span>${i18next.t('figure.label.data-name')}</span>\n <input .value=${a.name} @input=${(e: Event) => (this.adding = { ...a, name: (e.target as HTMLInputElement).value })} />\n <span>${i18next.t('figure.label.data-kind')}</span>\n <select @change=${(e: Event) => (this.adding = { ...a, kind: (e.target as HTMLSelectElement).value as FigureDataNode['kind'] })}>\n ${KINDS.map(k => html`<option value=${k} ?selected=${k === a.kind}>${i18next.t('figure.label.data-kind-' + k)}</option>`)}\n </select>\n </div>\n <button\n act\n ?disabled=${this.locked || !named}\n @click=${() => {\n this.edit({ kind: 'set-data-schema', schema: schemaWithField(schema, under, { name: named, ...nodeOfKind(a.kind) } as FigureDataField) })\n this.adding = { ...a, name: '' }\n }}\n >\n <md-icon>add</md-icon>${i18next.t(under ? 'figure.button.add-data-child' : 'figure.button.add-data-field', { parent: under })}\n </button>`\n }\n\n /** A site's data pasted: the schema guessed from it, kept only when the author says so -- units, ranges and closed values are theirs to set. */\n private renderFromSample(schema: readonly FigureDataField[]) {\n let guessed: FigureDataField[] | null = null\n let unreadable = false\n if (this.pasted.trim()) {\n try {\n guessed = inferFigureDataSchema(JSON.parse(this.pasted))\n } catch {\n unreadable = true\n }\n }\n return html`<details>\n <summary>${i18next.t('figure.label.data-from-sample')}</summary>\n <p hint>${i18next.t('figure.text.data-from-sample-explained')}</p>\n <textarea .value=${this.pasted} ?disabled=${this.locked} @input=${(e: Event) => (this.pasted = (e.target as HTMLTextAreaElement).value)}></textarea>\n ${unreadable ? html`<p hint>${i18next.t('figure.text.data-not-json')}</p>` : nothing}\n ${guessed ? html`<p hint>${i18next.t(schema.length ? 'figure.text.data-guessed-replaces' : 'figure.text.data-guessed', { count: guessed.length })}</p>` : nothing}\n <button\n act\n ?disabled=${this.locked || !guessed?.length}\n @click=${() => {\n this.edit({ kind: 'set-data-schema', schema: guessed! })\n this.pasted = ''\n }}\n >\n ${i18next.t('figure.button.data-use-guessed')}\n </button>\n </details>`\n }\n\n /* ---------------------------------------------------------------- the bindings */\n\n private behaviorName(asset: FigureAsset, choices: BehaviorChoice[], b: FigureDataBinding['behavior']): string {\n const key = behaviorKeyOf(b)\n const choice = choices.find(c => c.key === key)\n const name = b.kind === 'pose' ? i18next.t('figure.label.data-axis-' + b.axis) : (choice?.name ?? key.slice(key.indexOf(':') + 1))\n return i18next.t('figure.label.data-behavior-' + b.kind, { name })\n }\n\n private renderBindings(asset: FigureAsset, rows: FigureDataRow[]) {\n const bindings = asset.dataInterface?.bindings ?? []\n const choices = behaviorsOf(asset)\n return html`<section>\n <h3>${i18next.t('figure.label.data-bindings')}${this.help.button('figure.text.data-bindings-explained')}</h3>\n ${this.help.hint('figure.text.data-bindings-explained')}\n ${bindings.map(b => this.renderBinding(asset, choices, b))}\n ${rows.length ? this.renderAddBinding(asset, rows, choices) : html`<p hint>${i18next.t('figure.text.data-no-fields')}</p>`}\n </section>`\n }\n\n private renderBinding(asset: FigureAsset, choices: BehaviorChoice[], b: FigureDataBinding) {\n const open = this.opened === b.id\n const set = (patch: Partial<FigureDataBinding>) => {\n const next = { ...b, ...patch }\n if (patch.param === undefined && 'param' in patch) delete next.param\n this.edit({ kind: 'set-data-binding', binding: next })\n }\n return html`<section item>\n <div head>\n <button line aria-expanded=${open ? 'true' : 'false'} @click=${() => (this.opened = open ? '' : b.id)}>\n <strong>${b.accessor}</strong> → ${this.behaviorName(asset, choices, b.behavior)} <small>· ${i18next.t('figure.label.data-rule-' + b.rule)}</small>\n </button>\n <button act ?disabled=${this.locked} title=${i18next.t('figure.button.remove-data-binding')} @click=${() => this.edit({ kind: 'remove-data-binding', id: b.id })}>\n <md-icon>close</md-icon>\n </button>\n </div>\n ${open ? this.renderBindingDetail(asset, b, set) : nothing}\n </section>`\n }\n\n private renderBindingDetail(asset: FigureAsset, b: FigureDataBinding, set: (patch: Partial<FigureDataBinding>) => void) {\n const node = fieldAt(asset.dataInterface?.schema ?? [], b.accessor.replace(/\\[\\d+\\]/g, '[]'))\n const value = (e: Event) => (e.target as HTMLInputElement | HTMLSelectElement).value\n const behavior = b.behavior\n if (behavior.kind === 'items') return this.renderItemFields(asset, b, node, set)\n return html`<div form>\n <span>${i18next.t('figure.label.data-rule')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ rule: value(e) as FigureDataBinding['rule'], param: firstParamOf(value(e) as FigureDataBinding['rule'], node, b) })}>\n ${(['value', 'map', 'range', 'scale'] as const).map(r => html`<option value=${r} ?selected=${r === b.rule}>${i18next.t('figure.label.data-rule-' + r)}</option>`)}\n </select>\n ${behavior.kind === 'state'\n ? html`<span>${i18next.t('figure.label.data-source-mode')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ behavior: { ...behavior, sourceMode: value(e) as 'observed' | 'commanded' } })}>\n ${(['observed', 'commanded'] as const).map(m => html`<option value=${m} ?selected=${behavior.sourceMode === m}>${i18next.t('figure.label.data-' + m)}</option>`)}\n </select>`\n : nothing}\n ${behavior.kind === 'pose'\n ? html`<span>${i18next.t('figure.label.data-seconds')}</span>\n <input type=\"number\" min=\"0\" step=\"any\" .value=${String(behavior.seconds ?? 0)} ?disabled=${this.locked} @change=${(e: Event) => set({ behavior: { ...behavior, seconds: (e.target as HTMLInputElement).valueAsNumber || 0 } })} />`\n : nothing}\n ${b.rule === 'scale'\n ? html`<span>${i18next.t('figure.label.data-scale')}</span>\n <input type=\"number\" step=\"any\" .value=${String(b.param?.scale ?? 1)} ?disabled=${this.locked} @change=${(e: Event) => set({ param: { ...b.param, scale: (e.target as HTMLInputElement).valueAsNumber } })} />\n <span>${i18next.t('figure.label.data-offset')}</span>\n <input type=\"number\" step=\"any\" .value=${String(b.param?.offset ?? 0)} ?disabled=${this.locked} @change=${(e: Event) => set({ param: { ...b.param, offset: (e.target as HTMLInputElement).valueAsNumber } })} />`\n : nothing}\n </div>\n ${b.rule === 'map' ? this.renderCases(asset, b, node, set) : b.rule === 'range' ? this.renderRanges(asset, b, set) : nothing}`\n }\n\n /** A result editor fitting what the behavior takes: a colour, a clip of the group, true or false, a code, a number. */\n private renderResult(asset: FigureAsset, b: FigureDataBinding, value: FigureDataValue | undefined, write: (v: FigureDataValue | undefined) => void) {\n const behavior = b.behavior\n const typed = (e: Event) => (e.target as HTMLInputElement | HTMLSelectElement).value\n if (behavior.kind === 'palette')\n /* A colour not set is not black: it is offered, started at the colour the token has now. */\n return value === undefined\n ? html`<button act ?disabled=${this.locked} @click=${() => write(asset.palette[behavior.token] ?? '#000000')}>${i18next.t('figure.button.data-set-result')}</button>`\n : html`<input type=\"color\" .value=${String(value)} ?disabled=${this.locked} @change=${(e: Event) => write(typed(e))} />`\n if (behavior.kind === 'motion-clip') {\n const clips = (asset.motionGroups ?? []).find(g => g.id === behavior.group)?.clips ?? []\n return html`<select ?disabled=${this.locked} @change=${(e: Event) => write(typed(e))}>\n ${clips.map(clip => html`<option value=${clip} ?selected=${clip === value}>${clip}</option>`)}\n </select>`\n }\n if (behavior.kind === 'motion-paused')\n return html`<select ?disabled=${this.locked} @change=${(e: Event) => write(typed(e) === 'true')}>\n ${[false, true].map(v => html`<option value=${String(v)} ?selected=${v === value}>${i18next.t(v ? 'figure.label.data-paused' : 'figure.label.data-playing')}</option>`)}\n </select>`\n if (behavior.kind === 'status') return html`<input .value=${String(value ?? '')} ?disabled=${this.locked} @change=${(e: Event) => write(typed(e))} />`\n return html`<input type=\"number\" step=\"any\" .value=${value === undefined ? '' : String(value)} ?disabled=${this.locked} @change=${(e: Event) => write((e.target as HTMLInputElement).valueAsNumber)} />`\n }\n\n /** A result per value of a closed field, and one for every other value. */\n private renderCases(asset: FigureAsset, b: FigureDataBinding, node: FigureDataNode | undefined, set: (patch: Partial<FigureDataBinding>) => void) {\n const param = b.param ?? {}\n const domain = node ? domainOf(node).map(String) : []\n const keys = [...new Set([...domain, ...Object.keys(param).filter(k => k !== 'default')])]\n const write = (key: string) => (v: FigureDataValue | undefined) => {\n const next = { ...param }\n if (v === undefined || (typeof v === 'number' && Number.isNaN(v))) delete next[key]\n else next[key] = v\n set({ param: next })\n }\n const word = (k: string) => (node?.kind === 'boolean' ? i18next.t(k === 'true' ? 'figure.label.data-true' : 'figure.label.data-false') : k)\n /* Every value of a closed field has its own result: no other value comes, unless one was set before. */\n const covered = domain.length > 0 && domain.every(v => param[v] !== undefined)\n return html`<div cases>\n ${keys.map(k => html`<span>${word(k)}</span>${this.renderResult(asset, b, param[k], write(k))}`)}\n ${covered && param.default === undefined ? nothing : html`<span>${i18next.t('figure.label.data-otherwise')}</span>${this.renderResult(asset, b, param.default, write('default'))}`}\n </div>`\n }\n\n /** Intervals of a number, each from (inclusive) to (exclusive), either end left open, and one result for the rest. */\n private renderRanges(asset: FigureAsset, b: FigureDataBinding, set: (patch: Partial<FigureDataBinding>) => void) {\n const param = b.param ?? {}\n const entries = Object.entries(param).filter(([k]) => k !== 'default')\n const rebuild = (list: Array<[string, FigureDataValue]>) => set({ param: { ...Object.fromEntries(list), ...(param.default !== undefined ? { default: param.default } : {}) } })\n const ends = (key: string) => {\n const [from = '', to = ''] = key.split('~')\n return { from, to }\n }\n const rekey = (i: number, end: 'from' | 'to', typed: string) =>\n rebuild(\n entries.map(([k, v], j) => {\n if (j !== i) return [k, v]\n const e = ends(k)\n const next = { ...e, [end]: typed.trim() }\n return [`${next.from}~${next.to}`, v]\n })\n )\n return html`<div ranges>\n <small>${i18next.t('figure.label.data-range-from')}</small><small>${i18next.t('figure.label.data-range-to')}</small><small></small><span></span>\n ${entries.map(([k, v], i) => {\n const e = ends(k)\n return html`<input type=\"number\" step=\"any\" .value=${e.from} ?disabled=${this.locked} @change=${(ev: Event) => rekey(i, 'from', (ev.target as HTMLInputElement).value)} />\n <input type=\"number\" step=\"any\" .value=${e.to} ?disabled=${this.locked} @change=${(ev: Event) => rekey(i, 'to', (ev.target as HTMLInputElement).value)} />\n ${this.renderResult(asset, b, v, out => rebuild(entries.map(([kk, vv], j) => [kk, j === i ? (out as FigureDataValue) : vv])))}\n <button act ?disabled=${this.locked} title=${i18next.t('figure.button.remove-data-range')} @click=${() => rebuild(entries.filter((_, j) => j !== i))}><md-icon>close</md-icon></button>`\n })}\n </div>\n <div cases>\n <span>${i18next.t('figure.label.data-otherwise')}</span>${this.renderResult(asset, b, param.default, v => set({ param: { ...param, ...(v === undefined ? {} : { default: v }) } }))}\n </div>\n <button act ?disabled=${this.locked} @click=${() => rebuild([...entries, [freeRangeKey(entries.map(([k]) => k)), entries.at(-1)?.[1] ?? param.default ?? 0]])}>\n <md-icon>add</md-icon>${i18next.t('figure.button.add-data-range')}\n </button>`\n }\n\n /** Which field of each element is its id, its type, its place, its height in the stack, its status. */\n private renderItemFields(asset: FigureAsset, b: FigureDataBinding, node: FigureDataNode | undefined, set: (patch: Partial<FigureDataBinding>) => void) {\n const behavior = b.behavior\n if (behavior.kind !== 'items') return nothing\n let element: FigureDataNode | undefined = node\n while (element?.kind === 'list') element = element.item\n const fields = element?.kind === 'object' ? element.fields.filter(f => f.kind === 'number' || f.kind === 'text' || f.kind === 'boolean').map(f => f.name) : []\n const pick = (role: 'id' | 'type' | 'place' | 'stack' | 'status', typed: string) => {\n const next: Record<string, unknown> = { ...behavior, [role]: typed }\n if (!typed) delete next[role]\n set({ behavior: next as FigureDataBinding['behavior'] })\n }\n return html`<div form>\n ${node?.kind === 'list'\n ? (['id', 'type', 'place', 'stack', 'status'] as const).map(\n role => html`<span>${i18next.t('figure.label.data-item-' + role)}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => pick(role, (e.target as HTMLSelectElement).value)}>\n <option value=\"\" ?selected=${!behavior[role]}>-</option>\n ${fields.map(f => html`<option value=${f} ?selected=${f === behavior[role]}>${f}</option>`)}\n </select>`\n )\n : nothing}\n <span>${i18next.t('figure.label.data-item-slot')}</span>\n <input .value=${behavior.slot ?? ''} ?disabled=${this.locked} @change=${(e: Event) => {\n const slot = (e.target as HTMLInputElement).value.trim()\n const next: Record<string, unknown> = { ...behavior, slot }\n if (!slot) delete next.slot\n set({ behavior: next as FigureDataBinding['behavior'] })\n }} />\n </div>`\n }\n\n private renderAddBinding(asset: FigureAsset, rows: FigureDataRow[], choices: BehaviorChoice[]) {\n const bindable = rows.filter(r => r.node.kind !== 'object')\n if (!bindable.length) return nothing\n const a = this.connecting\n const row = bindable.find(r => r.path === a.path) ?? bindable[0]!\n const fitting = choices.filter(c => fitsField(row.node, c))\n const choice = fitting.find(c => c.key === a.behavior) ?? fitting[0]\n /* A list is read whole by items; one value of it, through its first element. */\n const accessor = row.node.kind === 'list' && choice?.kind === 'items' ? row.path.replace(/\\[\\]$/, '') : accessorOfRow(row.path)\n return html`<div form>\n <span>${i18next.t('figure.label.data-field')}</span>\n <select @change=${(e: Event) => (this.connecting = { ...a, path: (e.target as HTMLSelectElement).value })}>\n ${bindable.map(r => html`<option value=${r.path} ?selected=${r === row}>${r.path}</option>`)}\n </select>\n <span>${i18next.t('figure.label.data-behavior')}</span>\n <select ?disabled=${!fitting.length} @change=${(e: Event) => (this.connecting = { ...a, behavior: (e.target as HTMLSelectElement).value })}>\n ${fitting.map(c => html`<option value=${c.key} ?selected=${c === choice}>${this.behaviorName(asset, choices, c.behavior)}</option>`)}\n </select>\n </div>\n ${fitting.length ? nothing : html`<p hint>${i18next.t('figure.text.data-no-behavior')}</p>`}\n <button\n act\n ?disabled=${this.locked || !choice}\n @click=${() => {\n const binding = bindingDraftOf(asset, accessor, row.node, choice!)\n this.edit({ kind: 'set-data-binding', binding })\n this.opened = binding.id\n }}\n >\n <md-icon>add</md-icon>${i18next.t('figure.button.add-data-binding')}\n </button>`\n }\n\n /* ---------------------------------------------------------------- status ports */\n\n private renderPorts(asset: FigureAsset) {\n const ports = asset.dataInterface?.ports ?? []\n const tokens = Object.keys(asset.palette)\n const parts = partsOf(asset)\n const set = (port: FigureStatusPort, patch: Partial<FigureStatusPort>) => this.edit({ kind: 'set-status-port', port: { ...port, ...patch } })\n const chosen = (e: Event) => [...(e.target as HTMLSelectElement).selectedOptions].map(o => o.value)\n return html`<section>\n <h3>${i18next.t('figure.label.data-ports')}${this.help.button('figure.text.data-ports-explained')}</h3>\n ${this.help.hint('figure.text.data-ports-explained')}\n ${ports.map(\n port => html`<section item>\n <div head>\n <strong>${port.label}</strong>\n <button act ?disabled=${this.locked} title=${i18next.t('figure.button.remove-data-port')} @click=${() => this.edit({ kind: 'remove-status-port', id: port.id })}>\n <md-icon>close</md-icon>\n </button>\n </div>\n <div form>\n <span>${i18next.t('figure.label.data-label')}</span>\n <input .value=${port.label} ?disabled=${this.locked} @change=${(e: Event) => set(port, { label: (e.target as HTMLInputElement).value.trim() })} />\n <span>${i18next.t('figure.label.data-port-tokens')}</span>\n <select multiple size=${Math.min(4, Math.max(tokens.length, 1))} ?disabled=${this.locked} @change=${(e: Event) => set(port, { tokens: chosen(e) })}>\n ${tokens.map(t => html`<option value=${t} ?selected=${port.tokens.includes(t)}>${t}</option>`)}\n </select>\n <span>${i18next.t('figure.label.data-port-parts')}</span>\n <select multiple size=${Math.min(4, Math.max(parts.length, 1))} ?disabled=${this.locked} @change=${(e: Event) => set(port, { parts: chosen(e) })}>\n ${parts.map(p => html`<option value=${p} ?selected=${port.parts.includes(p)}>${p}</option>`)}\n </select>\n </div>\n </section>`\n )}\n <div form>\n <span>${i18next.t('figure.label.data-label')}</span>\n <input .value=${this.porting} @input=${(e: Event) => (this.porting = (e.target as HTMLInputElement).value)} />\n </div>\n <button\n act\n ?disabled=${this.locked || !this.porting.trim()}\n @click=${() => {\n this.edit({ kind: 'set-status-port', port: portDraftOf(asset, this.porting) })\n this.porting = ''\n }}\n >\n <md-icon>add</md-icon>${i18next.t('figure.button.add-data-port')}\n </button>\n </section>`\n }\n\n /* ---------------------------------------------------------------- the sample */\n\n /** Data to try, read the way a placed figure reads it: what it moves, or why it is refused; in the preview, the figure running on it. */\n private renderSample(asset: FigureAsset) {\n const text = this.sample || JSON.stringify(figureDataExample(asset.dataInterface!), null, 2)\n let data: unknown\n let unreadable = false\n try {\n data = JSON.parse(text)\n } catch {\n unreadable = true\n }\n const read = unreadable ? null : sampleOf(asset, data)\n const r = read?.result\n return html`<section>\n <h3>${i18next.t('figure.label.data-sample')}${this.help.button('figure.text.data-sample-explained')}</h3>\n ${this.help.hint('figure.text.data-sample-explained')}\n <textarea .value=${text} @input=${(e: Event) => this.try((e.target as HTMLTextAreaElement).value)}></textarea>\n ${unreadable\n ? html`<p hint>${i18next.t('figure.text.data-not-json')}</p>`\n : read!.issues.length\n ? html`<p hint>${read!.issues.map(i => i18next.t('figure.text.data-value-' + i.reason, { path: i.path || '-' })).join(' · ')}</p>`\n : html`<ul result>\n ${Object.entries(r!.states).map(([input, s]) => html`<li>${asset.stateInputs?.[input]?.label ?? input} = ${s.value}</li>`)}\n ${Object.entries(r!.palette).map(([token, colour]) => html`<li>${token} = ${colour}</li>`)}\n ${Object.entries(r!.motion).map(\n ([group, m]) =>\n html`<li>\n ${(asset.motionGroups ?? []).find(g => g.id === group)?.label ?? group}:\n ${[m.clip, m.speed === undefined ? '' : `× ${m.speed}`, m.paused ? i18next.t('figure.label.data-paused') : ''].filter(Boolean).join(' ')}\n </li>`\n )}\n ${Object.entries(r!.status).map(([port, code]) => html`<li>${(asset.dataInterface?.ports ?? []).find(p => p.id === port)?.label ?? port}: ${code}</li>`)}\n ${Object.entries(r!.pose).map(([axis, p]) => html`<li>${i18next.t('figure.label.data-axis-' + axis)} = ${p!.value}</li>`)}\n ${r!.items.map(i => html`<li>${i18next.t('figure.label.data-items-count', { count: i.records.length })}${i.records.length ? `: ${i.records.map(x => x.id).join(', ')}` : ''}</li>`)}\n </ul>`}\n ${r && Object.keys(r.pose).length ? html`<p hint>${i18next.t('figure.text.data-sample-moves-all')}</p>` : nothing}\n <label toggle>\n <input\n type=\"checkbox\"\n .checked=${this.sampling}\n @change=${(e: Event) => {\n this.sampling = (e.target as HTMLInputElement).checked\n this.tell(unreadable ? null : data)\n }}\n />\n ${i18next.t('figure.label.data-sample-in-preview')}\n </label>\n </section>`\n }\n\n private try(typed: string) {\n this.sample = typed\n try {\n this.tell(JSON.parse(typed))\n } catch {\n /* Not JSON yet: the preview keeps what it ran on. */\n }\n }\n\n /** The sample to the preview while it is asked for; null lets the preview's figure go back to its own values. */\n private tell(data: unknown) {\n this.dispatchEvent(new CustomEvent('data-sample', { detail: { data: this.sampling ? data : null }, bubbles: true, composed: true }))\n }\n\n private edit(edit: unknown) {\n this.dispatchEvent(new CustomEvent('part-edit', { detail: { edit }, bubbles: true, composed: true }))\n }\n}\n\n/** A node of a kind, started empty. */\nfunction nodeOfKind(kind: FigureDataNode['kind']): FigureDataNode {\n if (kind === 'object') return { kind, fields: [] }\n if (kind === 'list') return { kind, item: { kind: 'object', fields: [] } }\n return { kind } as FigureDataNode\n}\n\n/** The param a rule starts with when the author switches to it: one result per value, one open interval, a unit scale, or none. */\nfunction firstParamOf(rule: FigureDataBinding['rule'], node: FigureDataNode | undefined, b: FigureDataBinding): FigureDataBinding['param'] {\n const keep = b.param?.default\n if (rule === 'value') return undefined\n if (rule === 'scale') return { scale: 1, offset: 0 }\n if (rule === 'range') return { [`${node?.kind === 'number' ? (node.min ?? '') : ''}~`]: keep ?? 0 }\n const domain = node ? domainOf(node).map(String) : []\n return domain.length ? Object.fromEntries(domain.map(v => [v, keep ?? 0])) : { default: keep ?? 0 }\n}\n\n/** The next interval: from the last one's end, open above; open at both ends when there is none. */\nfunction freeRangeKey(taken: string[]): string {\n const end = taken.at(-1)?.split('~')[1] ?? ''\n return `${end}~`\n}\n"]}
1
+ {"version":3,"file":"figure-data-panel.js","sourceRoot":"","sources":["../../client/modeller/figure-data-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { FIGURE_UNITS, figureDataExample, inferFigureDataSchema } from '@hatiolab/figure-model'\nimport type { FigureAsset, FigureDataBinding, FigureDataField, FigureDataNode, FigureDataRow, FigureDataValue, FigureStatusPort } from '@hatiolab/figure-model'\n\nimport {\n accessorOfRow,\n behaviorKeyOf,\n behaviorsOf,\n bindingDraftOf,\n domainOf,\n endlessJointsOf,\n fieldAt,\n fieldOfKind,\n fitsField,\n partsOf,\n portDraftOf,\n rotationStepsOf,\n sampleOf,\n schemaRowsOf,\n type RotationChoice,\n schemaWithField,\n schemaWithFieldReplaced,\n schemaWithoutField,\n type BehaviorChoice\n} from './data-interface.js'\nimport { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js'\nimport { HelpToggles } from './help.js'\n\nconst KINDS: FigureDataNode['kind'][] = ['number', 'boolean', 'text', 'object', 'list']\n\n/**\n * 데이터 -- the data a site sends this figure, in its own names, and what each value moves (ADR-0051 §8, data binding\n * design decision 4). The schema is free: fields the author names, a tree of objects and lists. A binding reads one place\n * of it and moves one thing the figure can do -- a control, a colour, a motion group's clip, speed or pause, a status\n * port, its position, the items in its places -- by the board's rules (value, map, range, scale). Every change is one\n * part edit, and whether it holds is the kernel's check.\n *\n * The sample is not saved: data tried here, read the one way a placed figure reads it, and -- in the preview -- the figure\n * running on it (`data-sample`).\n */\n@customElement('figure-data-panel')\nexport class FigureDataPanel extends localize(i18next)(LitElement) {\n private readonly help = new HelpToggles(this)\n static styles = [\n SidePanelStyles,\n css`\n :host {\n display: block;\n }\n ul[tree] {\n display: grid;\n gap: 2px;\n margin: 0;\n padding: 0;\n list-style: none;\n }\n ul[tree] > li > button[row] {\n display: flex;\n flex-wrap: wrap;\n gap: 0 6px;\n width: 100%;\n min-height: var(--figure-control-height);\n margin: 0;\n padding: 4px 6px;\n border: 1px solid transparent;\n border-radius: 6px;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n align-items: center;\n cursor: pointer;\n }\n ul[tree] > li > button[row][selected] {\n border-color: var(--md-sys-color-primary);\n }\n ul[tree] > li > button[row] small {\n color: var(--md-sys-color-on-surface-variant);\n }\n /* What the field is and what reads it: beside the name when it fits, under it when not. */\n ul[tree] > li > button[row] small[meta] {\n margin-left: auto;\n text-align: right;\n }\n section[item] {\n display: grid;\n gap: 8px;\n padding: 8px;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: 8px;\n }\n div[head] {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 30px;\n gap: 6px;\n align-items: center;\n }\n div[head] button[line] {\n min-width: 0;\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n color: inherit;\n font: inherit;\n text-align: left;\n overflow-wrap: anywhere;\n cursor: pointer;\n }\n div[head] button[act] {\n width: 30px;\n min-height: var(--figure-control-height);\n margin: 0;\n padding: 0;\n }\n div[cases] {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);\n gap: 4px 6px;\n align-items: center;\n }\n div[ranges] {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.4fr) 30px;\n gap: 4px 6px;\n align-items: center;\n }\n div[ranges] button[act] {\n width: 30px;\n margin: 0;\n padding: 0;\n }\n textarea {\n width: 100%;\n min-height: 96px;\n box-sizing: border-box;\n font-family: var(--ui-font-mono, monospace);\n font-size: inherit;\n }\n ul[result] {\n margin: 0;\n padding-left: 16px;\n }\n md-icon {\n font-size: 16px;\n width: 16px;\n height: 16px;\n }\n `\n ]\n\n @property({ attribute: false }) asset?: FigureAsset\n @property({ type: Boolean }) locked = false\n\n /** The schema row chosen, by its path; its field is edited under it. */\n @state() private chosen = ''\n @state() private adding = { name: '', kind: 'number' as FigureDataNode['kind'] }\n /** A site's data pasted to start the schema from; nothing is kept until the author says so. */\n @state() private pasted = ''\n @state() private connecting = { path: '', behavior: '' }\n /** The binding opened to edit its rule, by id. */\n @state() private opened = ''\n @state() private porting = ''\n /** The rotation card as filled in: the joint, and the fields for on, speed (and its most rpm) and direction. */\n @state() private rotating = { input: '', on: '', speed: '', max: 0, direction: '', forward: '', reverse: '' }\n /** The sample as typed, JSON; empty until edited, the schema's example shown until then. */\n @state() private sample = ''\n @state() private sampling = false\n\n render() {\n const asset = this.asset\n if (!asset) return nothing\n const rows = schemaRowsOf(asset)\n return html`\n ${this.renderSchema(asset, rows)} ${this.renderBindings(asset, rows)} ${this.renderPorts(asset)} ${rows.length ? this.renderSample(asset) : nothing}\n `\n }\n\n /* ---------------------------------------------------------------- the schema */\n\n private renderSchema(asset: FigureAsset, rows: FigureDataRow[]) {\n const schema = asset.dataInterface?.schema ?? []\n return html`<section>\n <h3>${i18next.t('figure.label.data-schema')}${this.help.button('figure.text.data-schema-explained')}</h3>\n ${this.help.hint('figure.text.data-schema-explained')}\n ${rows.length\n ? html`<ul tree>\n ${rows.map(\n row => html`<li>\n <button row ?selected=${row.path === this.chosen} style=\"padding-left: ${6 + row.depth * 14}px\" @click=${() => (this.chosen = row.path === this.chosen ? '' : row.path)}>\n <span>${row.name}${row.label ? html` <small>${row.label}</small>` : nothing}</span>\n <small meta>${this.kindWord(row.node)}${row.bindings.length ? ` · ${i18next.t('figure.label.data-bound', { count: row.bindings.length })}` : ''}</small>\n </button>\n ${row.path === this.chosen ? this.renderField(asset, schema, row) : nothing}\n </li>`\n )}\n </ul>`\n : html`<p hint>${i18next.t('figure.text.data-no-fields')}</p>`}\n ${this.renderAddField(schema, '')} ${this.renderFromSample(schema)}\n </section>`\n }\n\n private kindWord(node: FigureDataNode): string {\n const kind = i18next.t('figure.label.data-kind-' + node.kind)\n if (node.kind === 'number') {\n const range = node.min !== undefined || node.max !== undefined ? ` ${node.min ?? ''}~${node.max ?? ''}` : ''\n return `${kind}${node.unit ? ` ${node.unit}` : ''}${range}`\n }\n if (node.kind === 'text' && node.values) return `${kind} (${node.values.join(', ')})`\n if (node.kind === 'list') return `${kind} · ${i18next.t('figure.label.data-kind-' + node.item.kind)}`\n return kind\n }\n\n /** The chosen field's own settings, and a field added under it when it holds fields. */\n private renderField(asset: FigureAsset, schema: readonly FigureDataField[], row: FigureDataRow) {\n const field = fieldAt(schema, row.path)\n if (!field) return nothing\n const replace = (next: FigureDataField) => this.edit({ kind: 'set-data-schema', schema: schemaWithFieldReplaced(schema, row.path, next) })\n const set = (patch: Record<string, unknown>) => {\n const next = { ...field, ...patch } as Record<string, unknown>\n for (const [k, v] of Object.entries(patch)) if (v === undefined || (typeof v === 'number' && Number.isNaN(v))) delete next[k]\n replace(next as FigureDataField)\n }\n const value = (e: Event) => (e.target as HTMLInputElement | HTMLSelectElement).value\n const number = (e: Event) => (e.target as HTMLInputElement).valueAsNumber\n const rename = (to: string) => {\n if (!to || to === field.name) return\n /* A field outside any list is renamed with what reads it; inside a list it is the schema alone. */\n if (!row.path.includes('[]')) this.edit({ kind: 'rename-data-field', accessor: row.path, to })\n else replace({ ...field, name: to })\n }\n let holder: FigureDataNode = field\n while (holder.kind === 'list') holder = holder.item\n return html`<section item>\n <div head>\n <strong>${row.path}</strong>\n <button\n act\n ?disabled=${this.locked}\n title=${i18next.t('figure.button.remove-data-field')}\n @click=${() => {\n this.chosen = ''\n this.edit({ kind: 'set-data-schema', schema: schemaWithoutField(schema, row.path) })\n }}\n >\n <md-icon>close</md-icon>\n </button>\n </div>\n <div form>\n <span>${i18next.t('figure.label.data-name')}</span>\n <input .value=${field.name} ?disabled=${this.locked} @change=${(e: Event) => rename(value(e).trim())} />\n <span>${i18next.t('figure.label.data-label')}</span>\n <input .value=${field.label ?? ''} ?disabled=${this.locked} @change=${(e: Event) => set({ label: value(e).trim() || undefined })} />\n <span>${i18next.t('figure.label.data-kind')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => replace(fieldOfKind(field, value(e) as FigureDataNode['kind']))}>\n ${KINDS.map(k => html`<option value=${k} ?selected=${k === field.kind}>${i18next.t('figure.label.data-kind-' + k)}</option>`)}\n </select>\n ${field.kind === 'number'\n ? html`<span>${i18next.t('figure.label.data-unit')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ unit: value(e) || undefined })}>\n <option value=\"\" ?selected=${!field.unit}>-</option>\n ${FIGURE_UNITS.map(u => html`<option value=${u} ?selected=${u === field.unit}>${u}</option>`)}\n </select>\n <span>${i18next.t('figure.label.data-min')}</span>\n <input type=\"number\" step=\"any\" .value=${field.min === undefined ? '' : String(field.min)} ?disabled=${this.locked} @change=${(e: Event) => set({ min: number(e) })} />\n <span>${i18next.t('figure.label.data-max')}</span>\n <input type=\"number\" step=\"any\" .value=${field.max === undefined ? '' : String(field.max)} ?disabled=${this.locked} @change=${(e: Event) => set({ max: number(e) })} />\n <span>${i18next.t('figure.label.data-default')}</span>\n <input type=\"number\" step=\"any\" .value=${field.default === undefined ? '' : String(field.default)} ?disabled=${this.locked} @change=${(e: Event) => set({ default: number(e) })} />`\n : field.kind === 'boolean'\n ? html`<span>${i18next.t('figure.label.data-default')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ default: value(e) === '' ? undefined : value(e) === 'true' })}>\n <option value=\"\" ?selected=${field.default === undefined}>-</option>\n ${[false, true].map(b => html`<option value=${String(b)} ?selected=${b === field.default}>${i18next.t(b ? 'figure.label.data-true' : 'figure.label.data-false')}</option>`)}\n </select>`\n : field.kind === 'text'\n ? html`<span>${i18next.t('figure.label.data-values')}</span>\n <input\n .value=${(field.values ?? []).join(', ')}\n ?disabled=${this.locked}\n @change=${(e: Event) => {\n const values = value(e).split(',').map(v => v.trim()).filter(Boolean)\n set({ values: values.length ? values : undefined, default: field.default !== undefined && (!values.length || values.includes(field.default)) ? field.default : undefined })\n }}\n />\n <span>${i18next.t('figure.label.data-default')}</span>\n ${field.values\n ? html`<select ?disabled=${this.locked} @change=${(e: Event) => set({ default: value(e) || undefined })}>\n <option value=\"\" ?selected=${field.default === undefined}>-</option>\n ${field.values.map(v => html`<option value=${v} ?selected=${v === field.default}>${v}</option>`)}\n </select>`\n : html`<input .value=${field.default ?? ''} ?disabled=${this.locked} @change=${(e: Event) => set({ default: value(e) || undefined })} />`}`\n : html`<span></span>\n <label toggle>\n <input type=\"checkbox\" .checked=${!!field.json} ?disabled=${this.locked} @change=${(e: Event) => set({ json: (e.target as HTMLInputElement).checked ? true : undefined })} />\n ${i18next.t('figure.label.data-json')}\n </label>`}\n ${field.kind === 'list'\n ? html`<span>${i18next.t('figure.label.data-item-kind')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => replace({ ...field, item: nodeOfKind(value(e) as FigureDataNode['kind']) })}>\n ${KINDS.filter(k => k !== 'list').map(k => html`<option value=${k} ?selected=${k === field.item.kind}>${i18next.t('figure.label.data-kind-' + k)}</option>`)}\n </select>`\n : nothing}\n </div>\n ${holder.kind === 'object' ? this.renderAddField(schema, row.path) : nothing}\n </section>`\n }\n\n private renderAddField(schema: readonly FigureDataField[], under: string) {\n const a = this.adding\n const named = a.name.trim()\n return html`<div form>\n <span>${i18next.t('figure.label.data-name')}</span>\n <input .value=${a.name} @input=${(e: Event) => (this.adding = { ...a, name: (e.target as HTMLInputElement).value })} />\n <span>${i18next.t('figure.label.data-kind')}</span>\n <select @change=${(e: Event) => (this.adding = { ...a, kind: (e.target as HTMLSelectElement).value as FigureDataNode['kind'] })}>\n ${KINDS.map(k => html`<option value=${k} ?selected=${k === a.kind}>${i18next.t('figure.label.data-kind-' + k)}</option>`)}\n </select>\n </div>\n <button\n act\n ?disabled=${this.locked || !named}\n @click=${() => {\n this.edit({ kind: 'set-data-schema', schema: schemaWithField(schema, under, { name: named, ...nodeOfKind(a.kind) } as FigureDataField) })\n this.adding = { ...a, name: '' }\n }}\n >\n <md-icon>add</md-icon>${i18next.t(under ? 'figure.button.add-data-child' : 'figure.button.add-data-field', { parent: under })}\n </button>`\n }\n\n /** A site's data pasted: the schema guessed from it, kept only when the author says so -- units, ranges and closed values are theirs to set. */\n private renderFromSample(schema: readonly FigureDataField[]) {\n let guessed: FigureDataField[] | null = null\n let unreadable = false\n if (this.pasted.trim()) {\n try {\n guessed = inferFigureDataSchema(JSON.parse(this.pasted))\n } catch {\n unreadable = true\n }\n }\n return html`<details>\n <summary>${i18next.t('figure.label.data-from-sample')}</summary>\n <p hint>${i18next.t('figure.text.data-from-sample-explained')}</p>\n <textarea .value=${this.pasted} ?disabled=${this.locked} @input=${(e: Event) => (this.pasted = (e.target as HTMLTextAreaElement).value)}></textarea>\n ${unreadable ? html`<p hint>${i18next.t('figure.text.data-not-json')}</p>` : nothing}\n ${guessed ? html`<p hint>${i18next.t(schema.length ? 'figure.text.data-guessed-replaces' : 'figure.text.data-guessed', { count: guessed.length })}</p>` : nothing}\n <button\n act\n ?disabled=${this.locked || !guessed?.length}\n @click=${() => {\n this.edit({ kind: 'set-data-schema', schema: guessed! })\n this.pasted = ''\n }}\n >\n ${i18next.t('figure.button.data-use-guessed')}\n </button>\n </details>`\n }\n\n /* ---------------------------------------------------------------- the bindings */\n\n private behaviorName(asset: FigureAsset, choices: BehaviorChoice[], b: FigureDataBinding['behavior']): string {\n const key = behaviorKeyOf(b)\n const choice = choices.find(c => c.key === key)\n const name = b.kind === 'pose' ? i18next.t('figure.label.data-axis-' + b.axis) : (choice?.name ?? key.slice(key.indexOf(':') + 1))\n return i18next.t('figure.label.data-behavior-' + b.kind, { name })\n }\n\n private renderBindings(asset: FigureAsset, rows: FigureDataRow[]) {\n const bindings = asset.dataInterface?.bindings ?? []\n const choices = behaviorsOf(asset)\n return html`<section>\n <h3>${i18next.t('figure.label.data-bindings')}${this.help.button('figure.text.data-bindings-explained')}</h3>\n ${this.help.hint('figure.text.data-bindings-explained')}\n ${bindings.map(b => this.renderBinding(asset, choices, b))}\n ${rows.length ? this.renderAddBinding(asset, rows, choices) : html`<p hint>${i18next.t('figure.text.data-no-fields')}</p>`}\n ${this.renderRotation(asset, rows)}\n </section>`\n }\n\n private renderBinding(asset: FigureAsset, choices: BehaviorChoice[], b: FigureDataBinding) {\n const open = this.opened === b.id\n const set = (patch: Partial<FigureDataBinding>) => {\n const next = { ...b, ...patch }\n if (patch.param === undefined && 'param' in patch) delete next.param\n this.edit({ kind: 'set-data-binding', binding: next })\n }\n return html`<section item>\n <div head>\n <button line aria-expanded=${open ? 'true' : 'false'} @click=${() => (this.opened = open ? '' : b.id)}>\n <strong>${b.accessor}</strong> → ${this.behaviorName(asset, choices, b.behavior)} <small>· ${i18next.t('figure.label.data-rule-' + b.rule)}</small>\n </button>\n <button act ?disabled=${this.locked} title=${i18next.t('figure.button.remove-data-binding')} @click=${() => this.edit({ kind: 'remove-data-binding', id: b.id })}>\n <md-icon>close</md-icon>\n </button>\n </div>\n ${open ? this.renderBindingDetail(asset, b, set) : nothing}\n </section>`\n }\n\n private renderBindingDetail(asset: FigureAsset, b: FigureDataBinding, set: (patch: Partial<FigureDataBinding>) => void) {\n const node = fieldAt(asset.dataInterface?.schema ?? [], b.accessor.replace(/\\[\\d+\\]/g, '[]'))\n const value = (e: Event) => (e.target as HTMLInputElement | HTMLSelectElement).value\n const behavior = b.behavior\n if (behavior.kind === 'items') return this.renderItemFields(asset, b, node, set)\n return html`<div form>\n <span>${i18next.t('figure.label.data-rule')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ rule: value(e) as FigureDataBinding['rule'], param: firstParamOf(value(e) as FigureDataBinding['rule'], node, b) })}>\n ${(['value', 'map', 'range', 'scale'] as const).map(r => html`<option value=${r} ?selected=${r === b.rule}>${i18next.t('figure.label.data-rule-' + r)}</option>`)}\n </select>\n ${behavior.kind === 'state'\n ? html`<span>${i18next.t('figure.label.data-source-mode')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ behavior: { ...behavior, sourceMode: value(e) as 'observed' | 'commanded' } })}>\n ${(['observed', 'commanded'] as const).map(m => html`<option value=${m} ?selected=${behavior.sourceMode === m}>${i18next.t('figure.label.data-' + m)}</option>`)}\n </select>`\n : nothing}\n ${behavior.kind === 'pose'\n ? html`<span>${i18next.t('figure.label.data-seconds')}</span>\n <input type=\"number\" min=\"0\" step=\"any\" .value=${String(behavior.seconds ?? 0)} ?disabled=${this.locked} @change=${(e: Event) => set({ behavior: { ...behavior, seconds: (e.target as HTMLInputElement).valueAsNumber || 0 } })} />`\n : nothing}\n ${b.rule === 'scale'\n ? html`<span>${i18next.t('figure.label.data-scale')}</span>\n <input type=\"number\" step=\"any\" .value=${String(b.param?.scale ?? 1)} ?disabled=${this.locked} @change=${(e: Event) => set({ param: { ...b.param, scale: (e.target as HTMLInputElement).valueAsNumber } })} />\n <span>${i18next.t('figure.label.data-offset')}</span>\n <input type=\"number\" step=\"any\" .value=${String(b.param?.offset ?? 0)} ?disabled=${this.locked} @change=${(e: Event) => set({ param: { ...b.param, offset: (e.target as HTMLInputElement).valueAsNumber } })} />`\n : nothing}\n </div>\n ${b.rule === 'map' ? this.renderCases(asset, b, node, set) : b.rule === 'range' ? this.renderRanges(asset, b, set) : nothing}`\n }\n\n /** A result editor fitting what the behavior takes: a colour, a clip of the group, true or false, a code, a number. */\n private renderResult(asset: FigureAsset, b: FigureDataBinding, value: FigureDataValue | undefined, write: (v: FigureDataValue | undefined) => void) {\n const behavior = b.behavior\n const typed = (e: Event) => (e.target as HTMLInputElement | HTMLSelectElement).value\n if (behavior.kind === 'palette')\n /* A colour not set is not black: it is offered, started at the colour the token has now. */\n return value === undefined\n ? html`<button act ?disabled=${this.locked} @click=${() => write(asset.palette[behavior.token] ?? '#000000')}>${i18next.t('figure.button.data-set-result')}</button>`\n : html`<input type=\"color\" .value=${String(value)} ?disabled=${this.locked} @change=${(e: Event) => write(typed(e))} />`\n if (behavior.kind === 'motion-clip') {\n const clips = (asset.motionGroups ?? []).find(g => g.id === behavior.group)?.clips ?? []\n return html`<select ?disabled=${this.locked} @change=${(e: Event) => write(typed(e))}>\n ${clips.map(clip => html`<option value=${clip} ?selected=${clip === value}>${clip}</option>`)}\n </select>`\n }\n if (behavior.kind === 'motion-paused')\n return html`<select ?disabled=${this.locked} @change=${(e: Event) => write(typed(e) === 'true')}>\n ${[false, true].map(v => html`<option value=${String(v)} ?selected=${v === value}>${i18next.t(v ? 'figure.label.data-paused' : 'figure.label.data-playing')}</option>`)}\n </select>`\n if (behavior.kind === 'status') return html`<input .value=${String(value ?? '')} ?disabled=${this.locked} @change=${(e: Event) => write(typed(e))} />`\n return html`<input type=\"number\" step=\"any\" .value=${value === undefined ? '' : String(value)} ?disabled=${this.locked} @change=${(e: Event) => write((e.target as HTMLInputElement).valueAsNumber)} />`\n }\n\n /** A result per value of a closed field, and one for every other value. */\n private renderCases(asset: FigureAsset, b: FigureDataBinding, node: FigureDataNode | undefined, set: (patch: Partial<FigureDataBinding>) => void) {\n const param = b.param ?? {}\n const domain = node ? domainOf(node).map(String) : []\n const keys = [...new Set([...domain, ...Object.keys(param).filter(k => k !== 'default')])]\n const write = (key: string) => (v: FigureDataValue | undefined) => {\n const next = { ...param }\n if (v === undefined || (typeof v === 'number' && Number.isNaN(v))) delete next[key]\n else next[key] = v\n set({ param: next })\n }\n const word = (k: string) => (node?.kind === 'boolean' ? i18next.t(k === 'true' ? 'figure.label.data-true' : 'figure.label.data-false') : k)\n /* Every value of a closed field has its own result: no other value comes, unless one was set before. */\n const covered = domain.length > 0 && domain.every(v => param[v] !== undefined)\n return html`<div cases>\n ${keys.map(k => html`<span>${word(k)}</span>${this.renderResult(asset, b, param[k], write(k))}`)}\n ${covered && param.default === undefined ? nothing : html`<span>${i18next.t('figure.label.data-otherwise')}</span>${this.renderResult(asset, b, param.default, write('default'))}`}\n </div>`\n }\n\n /** Intervals of a number, each from (inclusive) to (exclusive), either end left open, and one result for the rest. */\n private renderRanges(asset: FigureAsset, b: FigureDataBinding, set: (patch: Partial<FigureDataBinding>) => void) {\n const param = b.param ?? {}\n const entries = Object.entries(param).filter(([k]) => k !== 'default')\n const rebuild = (list: Array<[string, FigureDataValue]>) => set({ param: { ...Object.fromEntries(list), ...(param.default !== undefined ? { default: param.default } : {}) } })\n const ends = (key: string) => {\n const [from = '', to = ''] = key.split('~')\n return { from, to }\n }\n const rekey = (i: number, end: 'from' | 'to', typed: string) =>\n rebuild(\n entries.map(([k, v], j) => {\n if (j !== i) return [k, v]\n const e = ends(k)\n const next = { ...e, [end]: typed.trim() }\n return [`${next.from}~${next.to}`, v]\n })\n )\n return html`<div ranges>\n <small>${i18next.t('figure.label.data-range-from')}</small><small>${i18next.t('figure.label.data-range-to')}</small><small></small><span></span>\n ${entries.map(([k, v], i) => {\n const e = ends(k)\n return html`<input type=\"number\" step=\"any\" .value=${e.from} ?disabled=${this.locked} @change=${(ev: Event) => rekey(i, 'from', (ev.target as HTMLInputElement).value)} />\n <input type=\"number\" step=\"any\" .value=${e.to} ?disabled=${this.locked} @change=${(ev: Event) => rekey(i, 'to', (ev.target as HTMLInputElement).value)} />\n ${this.renderResult(asset, b, v, out => rebuild(entries.map(([kk, vv], j) => [kk, j === i ? (out as FigureDataValue) : vv])))}\n <button act ?disabled=${this.locked} title=${i18next.t('figure.button.remove-data-range')} @click=${() => rebuild(entries.filter((_, j) => j !== i))}><md-icon>close</md-icon></button>`\n })}\n </div>\n <div cases>\n <span>${i18next.t('figure.label.data-otherwise')}</span>${this.renderResult(asset, b, param.default, v => set({ param: { ...param, ...(v === undefined ? {} : { default: v }) } }))}\n </div>\n <button act ?disabled=${this.locked} @click=${() => rebuild([...entries, [freeRangeKey(entries.map(([k]) => k)), entries.at(-1)?.[1] ?? param.default ?? 0]])}>\n <md-icon>add</md-icon>${i18next.t('figure.button.add-data-range')}\n </button>`\n }\n\n /** Which field of each element is its id, its type, its place, its height in the stack, its status. */\n private renderItemFields(asset: FigureAsset, b: FigureDataBinding, node: FigureDataNode | undefined, set: (patch: Partial<FigureDataBinding>) => void) {\n const behavior = b.behavior\n if (behavior.kind !== 'items') return nothing\n let element: FigureDataNode | undefined = node\n while (element?.kind === 'list') element = element.item\n const fields = element?.kind === 'object' ? element.fields.filter(f => f.kind === 'number' || f.kind === 'text' || f.kind === 'boolean').map(f => f.name) : []\n const pick = (role: 'id' | 'type' | 'place' | 'stack' | 'status', typed: string) => {\n const next: Record<string, unknown> = { ...behavior, [role]: typed }\n if (!typed) delete next[role]\n set({ behavior: next as FigureDataBinding['behavior'] })\n }\n return html`<div form>\n ${node?.kind === 'list'\n ? (['id', 'type', 'place', 'stack', 'status'] as const).map(\n role => html`<span>${i18next.t('figure.label.data-item-' + role)}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => pick(role, (e.target as HTMLSelectElement).value)}>\n <option value=\"\" ?selected=${!behavior[role]}>-</option>\n ${fields.map(f => html`<option value=${f} ?selected=${f === behavior[role]}>${f}</option>`)}\n </select>`\n )\n : nothing}\n <span>${i18next.t('figure.label.data-item-slot')}</span>\n <input .value=${behavior.slot ?? ''} ?disabled=${this.locked} @change=${(e: Event) => {\n const slot = (e.target as HTMLInputElement).value.trim()\n const next: Record<string, unknown> = { ...behavior, slot }\n if (!slot) delete next.slot\n set({ behavior: next as FigureDataBinding['behavior'] })\n }} />\n </div>`\n }\n\n private renderAddBinding(asset: FigureAsset, rows: FigureDataRow[], choices: BehaviorChoice[]) {\n const bindable = rows.filter(r => r.node.kind !== 'object')\n if (!bindable.length) return nothing\n const a = this.connecting\n const row = bindable.find(r => r.path === a.path) ?? bindable[0]!\n const fitting = choices.filter(c => fitsField(row.node, c))\n const choice = fitting.find(c => c.key === a.behavior) ?? fitting[0]\n /* A list is read whole by items; one value of it, through its first element. */\n const accessor = row.node.kind === 'list' && choice?.kind === 'items' ? row.path.replace(/\\[\\]$/, '') : accessorOfRow(row.path)\n return html`<div form>\n <span>${i18next.t('figure.label.data-field')}</span>\n <select @change=${(e: Event) => (this.connecting = { ...a, path: (e.target as HTMLSelectElement).value })}>\n ${bindable.map(r => html`<option value=${r.path} ?selected=${r === row}>${r.path}</option>`)}\n </select>\n <span>${i18next.t('figure.label.data-behavior')}</span>\n <select ?disabled=${!fitting.length} @change=${(e: Event) => (this.connecting = { ...a, behavior: (e.target as HTMLSelectElement).value })}>\n ${fitting.map(c => html`<option value=${c.key} ?selected=${c === choice}>${this.behaviorName(asset, choices, c.behavior)}</option>`)}\n </select>\n </div>\n ${fitting.length ? nothing : html`<p hint>${i18next.t('figure.text.data-no-behavior')}</p>`}\n <button\n act\n ?disabled=${this.locked || !choice}\n @click=${() => {\n const binding = bindingDraftOf(asset, accessor, row.node, choice!)\n this.edit({ kind: 'set-data-binding', binding })\n this.opened = binding.id\n }}\n >\n <md-icon>add</md-icon>${i18next.t('figure.button.add-data-binding')}\n </button>`\n }\n\n /**\n * 「+ 회전」: a joint that turns without end, turned by the data -- on, speed in rpm, direction -- in one step. The\n * clips, the group and the bindings it writes are ordinary ones, edited one by one afterwards.\n */\n private renderRotation(asset: FigureAsset, rows: FigureDataRow[]) {\n const joints = endlessJointsOf(asset)\n if (!joints.length) return nothing\n const r = this.rotating\n const joint = joints.find(j => j.input === r.input) ?? joints[0]!\n const values = rows.filter(row => !row.path.includes('[]'))\n const of = (kind: FigureDataNode['kind'], closed = false) => values.filter(row => row.node.kind === kind && (!closed || domainOf(row.node).length > 0))\n const speedRow = values.find(row => row.path === r.speed)\n const speedMax = r.max || (speedRow?.node.kind === 'number' ? (speedRow.node.max ?? 0) : 0)\n const directionRow = values.find(row => row.path === r.direction)\n const directions = directionRow ? domainOf(directionRow.node).map(String) : []\n const forward = directions.includes(r.forward) ? r.forward : (directions[0] ?? '')\n const reverse = directions.includes(r.reverse) ? r.reverse : (directions.find(v => v !== forward) ?? '')\n const set = (patch: Partial<typeof r>) => (this.rotating = { ...r, ...patch })\n const typed = (e: Event) => (e.target as HTMLSelectElement | HTMLInputElement).value\n const pick = (rows: FigureDataRow[], value: string, change: (v: string) => void) =>\n html`<select ?disabled=${this.locked} @change=${(e: Event) => change(typed(e))}>\n <option value=\"\" ?selected=${!value}>${i18next.t('figure.label.data-none')}</option>\n ${rows.map(row => html`<option value=${row.path} ?selected=${row.path === value}>${row.path}</option>`)}\n </select>`\n const choice: RotationChoice = {\n input: joint.input,\n label: i18next.t('figure.label.data-rotation-of', { name: joint.label }),\n ...(r.on ? { on: r.on } : {}),\n ...(r.speed ? { speed: { path: r.speed, max: speedMax } } : {}),\n ...(r.direction && forward && reverse ? { direction: { path: r.direction, forward, reverse } } : {})\n }\n const ready = !r.speed || speedMax > 0\n return html`<details>\n <summary>${i18next.t('figure.label.data-rotation')}</summary>\n <p hint>${i18next.t('figure.text.data-rotation-explained')}</p>\n <div form>\n <span>${i18next.t('figure.label.data-rotation-joint')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ input: typed(e) })}>\n ${joints.map(j => html`<option value=${j.input} ?selected=${j === joint}>${j.label}</option>`)}\n </select>\n <span>${i18next.t('figure.label.data-rotation-on')}</span>\n ${pick(of('boolean'), r.on, v => set({ on: v }))}\n <span>${i18next.t('figure.label.data-rotation-speed')}</span>\n ${pick(of('number'), r.speed, v => set({ speed: v, max: 0 }))}\n ${r.speed\n ? html`<span>${i18next.t('figure.label.data-rotation-max')}</span>\n <input type=\"number\" min=\"0\" step=\"any\" .value=${speedMax ? String(speedMax) : ''} ?disabled=${this.locked} @change=${(e: Event) => set({ max: (e.target as HTMLInputElement).valueAsNumber || 0 })} />`\n : nothing}\n <span>${i18next.t('figure.label.data-rotation-direction')}</span>\n ${pick(of('text', true), r.direction, v => set({ direction: v, forward: '', reverse: '' }))}\n ${directions.length\n ? html`<span>${i18next.t('figure.label.data-rotation-forward')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ forward: typed(e) })}>\n ${directions.map(v => html`<option value=${v} ?selected=${v === forward}>${v}</option>`)}\n </select>\n <span>${i18next.t('figure.label.data-rotation-reverse')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ reverse: typed(e) })}>\n ${directions.map(v => html`<option value=${v} ?selected=${v === reverse}>${v}</option>`)}\n </select>`\n : nothing}\n </div>\n ${ready ? nothing : html`<p hint>${i18next.t('figure.text.data-rotation-needs-max')}</p>`}\n <button\n act\n ?disabled=${this.locked || !ready}\n @click=${() => {\n this.dispatchEvent(new CustomEvent('part-edits', { detail: { edits: rotationStepsOf(asset, choice) }, bubbles: true, composed: true }))\n this.rotating = { input: '', on: '', speed: '', max: 0, direction: '', forward: '', reverse: '' }\n }}\n >\n <md-icon>add</md-icon>${i18next.t('figure.button.data-add-rotation')}\n </button>\n </details>`\n }\n\n /* ---------------------------------------------------------------- status ports */\n\n private renderPorts(asset: FigureAsset) {\n const ports = asset.dataInterface?.ports ?? []\n const tokens = Object.keys(asset.palette)\n const parts = partsOf(asset)\n const set = (port: FigureStatusPort, patch: Partial<FigureStatusPort>) => this.edit({ kind: 'set-status-port', port: { ...port, ...patch } })\n const chosen = (e: Event) => [...(e.target as HTMLSelectElement).selectedOptions].map(o => o.value)\n return html`<section>\n <h3>${i18next.t('figure.label.data-ports')}${this.help.button('figure.text.data-ports-explained')}</h3>\n ${this.help.hint('figure.text.data-ports-explained')}\n ${ports.map(\n port => html`<section item>\n <div head>\n <strong>${port.label}</strong>\n <button act ?disabled=${this.locked} title=${i18next.t('figure.button.remove-data-port')} @click=${() => this.edit({ kind: 'remove-status-port', id: port.id })}>\n <md-icon>close</md-icon>\n </button>\n </div>\n <div form>\n <span>${i18next.t('figure.label.data-label')}</span>\n <input .value=${port.label} ?disabled=${this.locked} @change=${(e: Event) => set(port, { label: (e.target as HTMLInputElement).value.trim() })} />\n <span>${i18next.t('figure.label.data-port-tokens')}</span>\n <select multiple size=${Math.min(4, Math.max(tokens.length, 1))} ?disabled=${this.locked} @change=${(e: Event) => set(port, { tokens: chosen(e) })}>\n ${tokens.map(t => html`<option value=${t} ?selected=${port.tokens.includes(t)}>${t}</option>`)}\n </select>\n <span>${i18next.t('figure.label.data-port-parts')}</span>\n <select multiple size=${Math.min(4, Math.max(parts.length, 1))} ?disabled=${this.locked} @change=${(e: Event) => set(port, { parts: chosen(e) })}>\n ${parts.map(p => html`<option value=${p} ?selected=${port.parts.includes(p)}>${p}</option>`)}\n </select>\n </div>\n </section>`\n )}\n <div form>\n <span>${i18next.t('figure.label.data-label')}</span>\n <input .value=${this.porting} @input=${(e: Event) => (this.porting = (e.target as HTMLInputElement).value)} />\n </div>\n <button\n act\n ?disabled=${this.locked || !this.porting.trim()}\n @click=${() => {\n this.edit({ kind: 'set-status-port', port: portDraftOf(asset, this.porting) })\n this.porting = ''\n }}\n >\n <md-icon>add</md-icon>${i18next.t('figure.button.add-data-port')}\n </button>\n </section>`\n }\n\n /* ---------------------------------------------------------------- the sample */\n\n /** Data to try, read the way a placed figure reads it: what it moves, or why it is refused; in the preview, the figure running on it. */\n private renderSample(asset: FigureAsset) {\n const text = this.sample || JSON.stringify(figureDataExample(asset.dataInterface!), null, 2)\n let data: unknown\n let unreadable = false\n try {\n data = JSON.parse(text)\n } catch {\n unreadable = true\n }\n const read = unreadable ? null : sampleOf(asset, data)\n const r = read?.result\n return html`<section>\n <h3>${i18next.t('figure.label.data-sample')}${this.help.button('figure.text.data-sample-explained')}</h3>\n ${this.help.hint('figure.text.data-sample-explained')}\n <textarea .value=${text} @input=${(e: Event) => this.try((e.target as HTMLTextAreaElement).value)}></textarea>\n ${unreadable\n ? html`<p hint>${i18next.t('figure.text.data-not-json')}</p>`\n : read!.issues.length\n ? html`<p hint>${read!.issues.map(i => i18next.t('figure.text.data-value-' + i.reason, { path: i.path || '-' })).join(' · ')}</p>`\n : html`<ul result>\n ${Object.entries(r!.states).map(([input, s]) => html`<li>${asset.stateInputs?.[input]?.label ?? input} = ${s.value}</li>`)}\n ${Object.entries(r!.palette).map(([token, colour]) => html`<li>${token} = ${colour}</li>`)}\n ${Object.entries(r!.motion).map(\n ([group, m]) =>\n html`<li>\n ${(asset.motionGroups ?? []).find(g => g.id === group)?.label ?? group}:\n ${[m.clip, m.speed === undefined ? '' : `× ${m.speed}`, m.paused ? i18next.t('figure.label.data-paused') : ''].filter(Boolean).join(' ')}\n </li>`\n )}\n ${Object.entries(r!.status).map(([port, code]) => html`<li>${(asset.dataInterface?.ports ?? []).find(p => p.id === port)?.label ?? port}: ${code}</li>`)}\n ${Object.entries(r!.pose).map(([axis, p]) => html`<li>${i18next.t('figure.label.data-axis-' + axis)} = ${p!.value}</li>`)}\n ${r!.items.map(i => html`<li>${i18next.t('figure.label.data-items-count', { count: i.records.length })}${i.records.length ? `: ${i.records.map(x => x.id).join(', ')}` : ''}</li>`)}\n </ul>`}\n ${r && Object.keys(r.pose).length ? html`<p hint>${i18next.t('figure.text.data-sample-moves-all')}</p>` : nothing}\n <label toggle>\n <input\n type=\"checkbox\"\n .checked=${this.sampling}\n @change=${(e: Event) => {\n this.sampling = (e.target as HTMLInputElement).checked\n this.tell(unreadable ? null : data)\n }}\n />\n ${i18next.t('figure.label.data-sample-in-preview')}\n </label>\n </section>`\n }\n\n private try(typed: string) {\n this.sample = typed\n try {\n this.tell(JSON.parse(typed))\n } catch {\n /* Not JSON yet: the preview keeps what it ran on. */\n }\n }\n\n /** The sample to the preview while it is asked for; null lets the preview's figure go back to its own values. */\n private tell(data: unknown) {\n this.dispatchEvent(new CustomEvent('data-sample', { detail: { data: this.sampling ? data : null }, bubbles: true, composed: true }))\n }\n\n private edit(edit: unknown) {\n this.dispatchEvent(new CustomEvent('part-edit', { detail: { edit }, bubbles: true, composed: true }))\n }\n}\n\n/** A node of a kind, started empty. */\nfunction nodeOfKind(kind: FigureDataNode['kind']): FigureDataNode {\n if (kind === 'object') return { kind, fields: [] }\n if (kind === 'list') return { kind, item: { kind: 'object', fields: [] } }\n return { kind } as FigureDataNode\n}\n\n/** The param a rule starts with when the author switches to it: one result per value, one open interval, a unit scale, or none. */\nfunction firstParamOf(rule: FigureDataBinding['rule'], node: FigureDataNode | undefined, b: FigureDataBinding): FigureDataBinding['param'] {\n const keep = b.param?.default\n if (rule === 'value') return undefined\n if (rule === 'scale') return { scale: 1, offset: 0 }\n if (rule === 'range') return { [`${node?.kind === 'number' ? (node.min ?? '') : ''}~`]: keep ?? 0 }\n const domain = node ? domainOf(node).map(String) : []\n return domain.length ? Object.fromEntries(domain.map(v => [v, keep ?? 0])) : { default: keep ?? 0 }\n}\n\n/** The next interval: from the last one's end, open above; open at both ends when there is none. */\nfunction freeRangeKey(taken: string[]): string {\n const end = taken.at(-1)?.split('~')[1] ?? ''\n return `${end}~`\n}\n"]}