@things-factory/figure-ui 10.1.161 → 10.1.163

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/client/modeller/data-interface.ts +235 -67
  2. package/client/modeller/editor.ts +3 -3
  3. package/client/modeller/figure-data-panel.ts +602 -193
  4. package/client/modeller/figure-preview.ts +78 -26
  5. package/client/modeller/refusals.ts +18 -14
  6. package/dist-client/modeller/data-interface.d.ts +59 -27
  7. package/dist-client/modeller/data-interface.js +237 -60
  8. package/dist-client/modeller/data-interface.js.map +1 -1
  9. package/dist-client/modeller/editor.d.ts +1 -1
  10. package/dist-client/modeller/editor.js +2 -2
  11. package/dist-client/modeller/editor.js.map +1 -1
  12. package/dist-client/modeller/figure-data-panel.d.ts +35 -13
  13. package/dist-client/modeller/figure-data-panel.js +598 -186
  14. package/dist-client/modeller/figure-data-panel.js.map +1 -1
  15. package/dist-client/modeller/figure-preview.d.ts +10 -3
  16. package/dist-client/modeller/figure-preview.js +81 -26
  17. package/dist-client/modeller/figure-preview.js.map +1 -1
  18. package/dist-client/modeller/refusals.d.ts +2 -2
  19. package/dist-client/modeller/refusals.js +24 -18
  20. package/dist-client/modeller/refusals.js.map +1 -1
  21. package/dist-client/tsconfig.tsbuildinfo +1 -1
  22. package/package.json +6 -6
  23. package/test/browser/product-page.check.mjs +1 -1
  24. package/test/browser/screen.check.mjs +7 -7
  25. package/test/data-motion.test.ts +143 -50
  26. package/translations/en.json +109 -43
  27. package/translations/es.json +109 -43
  28. package/translations/ja.json +109 -43
  29. package/translations/ko.json +109 -43
  30. package/translations/ms.json +109 -43
  31. package/translations/zh.json +109 -43
@@ -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 } from '@hatiolab/figure-model'\nimport type { FigureAsset, FigureDataConnection, FigureDataProperty, FigureDataValue } from '@hatiolab/figure-model'\n\nimport { connectionDraftOf, dataSampleOf, dataTargetsOf, domainOf, propertyDraftOf, sampleValueOf, targetKeyOf, type DataTargetChoice } from './data-interface.js'\nimport { SidePanelStyles } from '@things-factory/figure-viewer/dist-client/side-panel-styles.js'\nimport { HelpToggles } from './help.js'\n\n/**\n * 데이터 -- the figure's public data properties and what each moves inside it (ADR-0051 §2.2). A property is a value a\n * consumer maps its own data onto, by its id: a number with a unit and a range, a boolean, or an enum. A connection\n * makes a property move a control, a colour, or which clip of a motion group plays and how fast. Every change is one\n * part edit, and whether it holds is the kernel's check.\n *\n * The sample is not saved: values tried here, what they would move (figure-model's evaluation), and -- in the preview --\n * the figure running on them (`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 = [SidePanelStyles, css`\n :host {\n display: block;\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] strong {\n min-width: 0;\n overflow-wrap: anywhere;\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 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 @property({ attribute: false }) asset?: FigureAsset\n @property({ type: Boolean }) locked = false\n\n @state() private adding = { label: '', kind: 'number' as FigureDataProperty['kind'] }\n @state() private connecting = { property: '', target: '' }\n /** The sample's values as typed, by property id; a property left out reads its default. */\n @state() private sample: Record<string, FigureDataValue> = {}\n @state() private sampling = false\n\n render() {\n const asset = this.asset\n if (!asset) return nothing\n const properties = asset.dataInterface?.properties ?? []\n const connections = asset.dataInterface?.connections ?? []\n return html`\n <section>\n <h3>${i18next.t('figure.label.data-properties')}${this.help.button('figure.text.data-properties-explained')}</h3>\n ${this.help.hint('figure.text.data-properties-explained')}\n ${properties.map(p => this.renderProperty(p))}\n ${this.renderAddProperty(asset)}\n </section>\n <section>\n <h3>${i18next.t('figure.label.data-connections')}${this.help.button('figure.text.data-connections-explained')}</h3>\n ${this.help.hint('figure.text.data-connections-explained')}\n ${connections.map(c => this.renderConnection(asset, c, properties.find(p => p.id === c.property)))}\n ${properties.length ? this.renderAddConnection(asset, properties) : html`<p hint>${i18next.t('figure.text.data-no-properties')}</p>`}\n </section>\n ${properties.length ? this.renderSample(asset, properties) : nothing}\n `\n }\n\n private renderProperty(p: FigureDataProperty) {\n const set = (patch: Partial<FigureDataProperty>) => this.edit({ kind: 'set-data-property', property: { ...p, ...patch } as FigureDataProperty })\n const value = (e: Event) => (e.target as HTMLInputElement | HTMLSelectElement).value\n const number = (e: Event) => (e.target as HTMLInputElement).valueAsNumber\n return html`<section item>\n <div head>\n <strong>${p.label} <small>(${i18next.t('figure.label.data-kind-' + p.kind)})</small></strong>\n <button act ?disabled=${this.locked} title=${i18next.t('figure.button.remove-data-property')} @click=${() => this.edit({ kind: 'remove-data-property', id: p.id })}>\n <md-icon>close</md-icon>\n </button>\n </div>\n <div form>\n <span>${i18next.t('figure.label.data-id')}</span>\n <input .value=${p.id} ?disabled=${this.locked} @change=${(e: Event) => value(e).trim() !== p.id && this.edit({ kind: 'rename-data-property', id: p.id, to: value(e).trim() })} />\n <span>${i18next.t('figure.label.name')}</span>\n <input .value=${p.label} ?disabled=${this.locked} @change=${(e: Event) => value(e).trim() && set({ label: value(e).trim() })} />\n ${p.kind === 'number'\n ? html`<span>${i18next.t('figure.label.data-unit')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ unit: value(e) as never })}>\n ${FIGURE_UNITS.map(u => html`<option value=${u} ?selected=${u === p.unit}>${u}</option>`)}\n </select>\n <span>${i18next.t('figure.label.data-min')}</span>\n <input type=\"number\" step=\"any\" .value=${String(p.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=${String(p.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=${String(p.default)} ?disabled=${this.locked} @change=${(e: Event) => set({ default: number(e) })} />`\n : p.kind === 'boolean'\n ? html`<span>${i18next.t('figure.label.data-default')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ default: value(e) === 'true' })}>\n ${[false, true].map(b => html`<option value=${String(b)} ?selected=${b === p.default}>${i18next.t(b ? 'figure.label.data-true' : 'figure.label.data-false')}</option>`)}\n </select>`\n : html`<span>${i18next.t('figure.label.data-values')}</span>\n <input\n .value=${p.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, default: values.includes(p.default) ? p.default : values[0]! } as never)\n }}\n />\n <span>${i18next.t('figure.label.data-default')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ default: value(e) })}>\n ${p.values.map(v => html`<option value=${v} ?selected=${v === p.default}>${v}</option>`)}\n </select>`}\n </div>\n </section>`\n }\n\n private renderAddProperty(asset: FigureAsset) {\n const a = this.adding\n return html`<div form>\n <span>${i18next.t('figure.label.name')}</span>\n <input .value=${a.label} @input=${(e: Event) => (this.adding = { ...a, label: (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 FigureDataProperty['kind'] })}>\n ${(['number', 'boolean', 'enum'] as const).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 || !a.label.trim()}\n @click=${() => {\n this.edit({ kind: 'set-data-property', property: propertyDraftOf(asset, a.label.trim(), a.kind) })\n this.adding = { ...a, label: '' }\n }}\n >\n <md-icon>add</md-icon>${i18next.t('figure.button.add-data-property')}\n </button>`\n }\n\n private targetName(asset: FigureAsset, c: FigureDataConnection, property?: FigureDataProperty): string {\n const choice = property ? dataTargetsOf(asset, property.kind).find(t => t.key === targetKeyOf(c.target)) : undefined\n const name = choice?.name ?? targetKeyOf(c.target)\n return i18next.t('figure.label.data-target-' + c.target.kind, { name })\n }\n\n private renderConnection(asset: FigureAsset, c: FigureDataConnection, property?: FigureDataProperty) {\n const set = (patch: Partial<FigureDataConnection>) => this.edit({ kind: 'set-data-connection', connection: { ...c, ...patch } })\n const number = (e: Event) => (e.target as HTMLInputElement).valueAsNumber\n const t = c.transform\n return html`<section item>\n <div head>\n <strong>${property?.label ?? c.property} → ${this.targetName(asset, c, property)}</strong>\n <button act ?disabled=${this.locked} title=${i18next.t('figure.button.remove-data-connection')} @click=${() => this.edit({ kind: 'remove-data-connection', id: c.id })}>\n <md-icon>close</md-icon>\n </button>\n </div>\n <div form>\n ${c.target.kind === 'state'\n ? html`<span>${i18next.t('figure.label.data-source-mode')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ target: { ...(c.target as { kind: 'state'; input: string }), sourceMode: (e.target as HTMLSelectElement).value as 'observed' | 'commanded' } })}>\n ${(['observed', 'commanded'] as const).map(m => html`<option value=${m} ?selected=${c.target.kind === 'state' && c.target.sourceMode === m}>${i18next.t('figure.label.data-' + m)}</option>`)}\n </select>`\n : nothing}\n ${t.kind === 'lookup'\n ? nothing\n : html`<span>${i18next.t('figure.label.data-transform')}</span>\n <select ?disabled=${this.locked} @change=${(e: Event) => set({ transform: (e.target as HTMLSelectElement).value === 'affine' ? { kind: 'affine', scale: 1, offset: 0 } : { kind: 'identity' } })}>\n <option value=\"identity\" ?selected=${t.kind === 'identity'}>${i18next.t('figure.label.data-identity')}</option>\n <option value=\"affine\" ?selected=${t.kind === 'affine'}>${i18next.t('figure.label.data-affine')}</option>\n </select>`}\n ${t.kind === 'affine'\n ? html`<span>${i18next.t('figure.label.data-scale')}</span>\n <input type=\"number\" step=\"any\" .value=${String(t.scale)} ?disabled=${this.locked} @change=${(e: Event) => set({ transform: { ...t, scale: number(e) } })} />\n <span>${i18next.t('figure.label.data-offset')}</span>\n <input type=\"number\" step=\"any\" .value=${String(t.offset)} ?disabled=${this.locked} @change=${(e: Event) => set({ transform: { ...t, offset: number(e) } })} />`\n : nothing}\n </div>\n ${t.kind === 'lookup' ? this.renderCases(asset, c, set) : nothing}\n </section>`\n }\n\n /** A case per value of the property: what the target takes for it -- a number, a colour, or a clip of the group. */\n private renderCases(asset: FigureAsset, c: FigureDataConnection, set: (patch: Partial<FigureDataConnection>) => void) {\n if (c.transform.kind !== 'lookup') return nothing\n const cases = c.transform.cases\n const write = (i: number, value: FigureDataValue) => set({ transform: { kind: 'lookup', cases: cases.map((k, j) => (j === i ? { ...k, value } : k)) } })\n const clips = c.target.kind === 'motion-clip' ? ((asset.motionGroups ?? []).find(g => c.target.kind === 'motion-clip' && g.id === c.target.group)?.clips ?? []) : []\n return html`<div cases>\n ${cases.map(\n (k, i) => html`<span>${typeof k.when === 'boolean' ? i18next.t(k.when ? 'figure.label.data-true' : 'figure.label.data-false') : String(k.when)}</span>\n ${c.target.kind === 'palette'\n ? html`<input type=\"color\" .value=${String(k.value)} ?disabled=${this.locked} @change=${(e: Event) => write(i, (e.target as HTMLInputElement).value)} />`\n : c.target.kind === 'motion-clip'\n ? html`<select ?disabled=${this.locked} @change=${(e: Event) => write(i, (e.target as HTMLSelectElement).value)}>\n ${clips.map(clip => html`<option value=${clip} ?selected=${clip === k.value}>${clip}</option>`)}\n </select>`\n : html`<input type=\"number\" step=\"any\" .value=${String(k.value)} ?disabled=${this.locked} @change=${(e: Event) => write(i, (e.target as HTMLInputElement).valueAsNumber)} />`}`\n )}\n </div>`\n }\n\n private renderAddConnection(asset: FigureAsset, properties: FigureDataProperty[]) {\n const a = this.connecting\n const property = properties.find(p => p.id === a.property) ?? properties[0]!\n const targets = dataTargetsOf(asset, property.kind)\n const choice = targets.find(t => t.key === a.target) ?? targets[0]\n return html`<div form>\n <span>${i18next.t('figure.label.data-property')}</span>\n <select @change=${(e: Event) => (this.connecting = { ...a, property: (e.target as HTMLSelectElement).value })}>\n ${properties.map(p => html`<option value=${p.id} ?selected=${p === property}>${p.label}</option>`)}\n </select>\n <span>${i18next.t('figure.label.data-target')}</span>\n <select ?disabled=${!targets.length} @change=${(e: Event) => (this.connecting = { ...a, target: (e.target as HTMLSelectElement).value })}>\n ${targets.map((t: DataTargetChoice) => html`<option value=${t.key} ?selected=${t === choice}>${i18next.t('figure.label.data-target-' + t.target.kind, { name: t.name })}</option>`)}\n </select>\n </div>\n <button act ?disabled=${this.locked || !choice} @click=${() => this.edit({ kind: 'set-data-connection', connection: connectionDraftOf(asset, property, choice!) })}>\n <md-icon>add</md-icon>${i18next.t('figure.button.add-data-connection')}\n </button>`\n }\n\n /** Values to try: what they move, by figure-model's evaluation; in the preview, the figure running on them. */\n private renderSample(asset: FigureAsset, properties: FigureDataProperty[]) {\n const values = Object.fromEntries(properties.map(p => [p.id, this.sample[p.id] ?? p.default]))\n const outcome = dataSampleOf(asset, values)\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 <div form>\n ${properties.map(\n p => html`<span>${p.label}</span>\n ${p.kind === 'number'\n ? html`<input type=\"number\" step=\"any\" .value=${String(values[p.id])} @change=${(e: Event) => this.try(p, (e.target as HTMLInputElement).value)} />`\n : html`<select @change=${(e: Event) => this.try(p, (e.target as HTMLSelectElement).value)}>\n ${domainOf(p).map(v => html`<option value=${String(v)} ?selected=${v === values[p.id]}>${typeof v === 'boolean' ? i18next.t(v ? 'figure.label.data-true' : 'figure.label.data-false') : v}</option>`)}\n </select>`}`\n )}\n </div>\n ${'issues' in outcome\n ? html`<p hint>${outcome.issues.map(i => i18next.t('figure.text.data-value-' + i.reason, { property: i.property ?? '' })).join(' · ')}</p>`\n : html`<ul result>\n ${Object.entries(outcome.result.states).map(([input, s]) => html`<li>${asset.stateInputs?.[input]?.label ?? input} = ${s.value}</li>`)}\n ${Object.entries(outcome.result.palette).map(([token, colour]) => html`<li>${token} = ${colour}</li>`)}\n ${Object.entries(outcome.result.motion).map(\n ([group, m]) => html`<li>${(asset.motionGroups ?? []).find(g => g.id === group)?.label ?? group}: ${[m.clip, m.speed === undefined ? '' : `× ${m.speed}`].filter(Boolean).join(' ')}</li>`\n )}\n </ul>`}\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(values)\n }}\n />\n ${i18next.t('figure.label.data-sample-in-preview')}\n </label>\n </section>`\n }\n\n private try(property: FigureDataProperty, typed: string) {\n this.sample = { ...this.sample, [property.id]: sampleValueOf(property, typed) }\n const properties = this.asset?.dataInterface?.properties ?? []\n this.tell(Object.fromEntries(properties.map(p => [p.id, this.sample[p.id] ?? p.default])))\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(values: Record<string, FigureDataValue>) {\n this.dispatchEvent(new CustomEvent('data-sample', { detail: { values: this.sampling ? values : 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"]}
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"]}
@@ -26,8 +26,10 @@ export declare class FigurePreview extends FigurePreview_base {
26
26
  private giving;
27
27
  /** Per motion group, the clip played here and how fast (ADR-0051 §3.2) -- the preview's, as a board's \`motion\`. */
28
28
  private moving;
29
- /** Data values tried in the data tab: the preview's figures run on them as a live snapshot; null when none are. */
30
- sample: Record<string, unknown> | null;
29
+ /** Data values given here by accessor, as a board's saved `figureValues`: what moves a group whose clip or speed the data writes. */
30
+ private valuing;
31
+ /** Data tried in the data tab: the preview's figures take it as their \`data\`, as a board's data source gives it; null when none is. */
32
+ sample: unknown;
31
33
  /** The part chosen in the editor. The size help starts on it, so the help speaks of the part the author was working on. */
32
34
  selected: string;
33
35
  private setupPart;
@@ -42,13 +44,18 @@ export declare class FigurePreview extends FigurePreview_base {
42
44
  private watcher?;
43
45
  render(): import("lit-html").TemplateResult<1>;
44
46
  private renderDrivers;
47
+ /** A value the data's bindings read, as the board's saved values give it: a number on a slider when it has a range, a choice when it is closed. */
48
+ private renderDataValue;
49
+ private value;
45
50
  private move;
46
51
  private renderDial;
47
52
  private drive;
48
53
  private give;
49
54
  private poseAsDefault;
50
55
  private tellInstances;
51
- /** The data sample to the figures standing now: a live snapshot, transient on each, never saved with the board. */
56
+ /** The tried data to the figures standing now, as their \`data\`: the preview's board is not saved. */
57
+ private tellData;
58
+ /** The data sample to the figures standing now. */
52
59
  private tellSample;
53
60
  willUpdate(changed: Map<string, unknown>): void;
54
61
  firstUpdated(): void;
@@ -6,6 +6,7 @@ import { compileFigureAsset } from '@hatiolab/figure-model';
6
6
  import { create, registerFigure, unregisterFigure } from '@hatiolab/things-scene';
7
7
  import { DEFAULT_VIEW, previewBoardDepth, sceneLook, WORKBENCH } from '@things-factory/figure-viewer/dist-client/figure-view.js';
8
8
  import { dialShape } from './angle-dial.js';
9
+ import { domainOf, motionWrittenByData, typedValueOf, valueRowsOf } from './data-interface.js';
9
10
  import { derivedOf } from './revision.js';
10
11
  import { authoredSizeOf, PREVIEW_FACTOR, PREVIEW_WAYS, previewClampsOf, previewInstances, previewTypeOf, setupPartOf } from '@things-factory/figure-viewer/dist-client/preview-model.js';
11
12
  let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
@@ -27,7 +28,9 @@ let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
27
28
  this.giving = {};
28
29
  /** Per motion group, the clip played here and how fast (ADR-0051 §3.2) -- the preview's, as a board's \`motion\`. */
29
30
  this.moving = {};
30
- /** Data values tried in the data tab: the preview's figures run on them as a live snapshot; null when none are. */
31
+ /** Data values given here by accessor, as a board's saved `figureValues`: what moves a group whose clip or speed the data writes. */
32
+ this.valuing = {};
33
+ /** Data tried in the data tab: the preview's figures take it as their \`data\`, as a board's data source gives it; null when none is. */
31
34
  this.sample = null;
32
35
  /** The part chosen in the editor. The size help starts on it, so the help speaks of the part the author was working on. */
33
36
  this.selected = '';
@@ -223,7 +226,7 @@ let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
223
226
  </select>
224
227
  <button @click=${() => this.dispatchEvent(new CustomEvent('configure-size', { detail: { part: setupPart }, bubbles: true, composed: true }))}>${i18next.t('figure.button.configure-size')}</button>
225
228
  </div>` : nothing}
226
- ${controls.length + clips.length + (asset?.motionGroups?.length ?? 0) ? this.renderDrivers(asset, controls, clips) : nothing}</div>`}`;
229
+ ${controls.length + clips.length + (asset?.motionGroups?.length ?? 0) + (asset ? valueRowsOf(asset).length : 0) ? this.renderDrivers(asset, controls, clips) : nothing}</div>`}`;
227
230
  }
228
231
  renderDrivers(asset, controls, clips) {
229
232
  const changed = controls.filter(c => this.giving[c.id] !== undefined && this.giving[c.id] !== asset.stateDefaults[c.id]);
@@ -264,23 +267,71 @@ let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
264
267
  <output>${value.toFixed(2)}</output>
265
268
  </label>`;
266
269
  })}
270
+ ${valueRowsOf(asset).map(row => this.renderDataValue(row))}
267
271
  ${(asset.motionGroups ?? []).map(group => {
268
272
  const playing = this.moving[group.id] ?? { clip: group.defaultClip, speed: 0 };
269
- return html `<label>
270
- <span>${group.label} <span drive>${i18next.t('figure.label.clip')}</span></span>
271
- <select aria-label=${group.label} @change=${(e) => this.move(group.id, { ...playing, clip: e.target.value })}>
272
- ${group.clips.map(c => html `<option value=${c} ?selected=${c === playing.clip}>${c}</option>`)}
273
- </select>
274
- </label>
275
- <label>
276
- <span>${group.label} <span drive>${i18next.t('figure.label.playback-speed')}</span></span>
277
- <span></span>
278
- <input type="range" min="0" max="3" step="0.05" .value=${String(playing.speed)} @input=${(e) => this.move(group.id, { ...playing, speed: Number(e.target.value) })} />
279
- <output>${playing.speed.toFixed(2)}</output>
280
- </label>`;
273
+ /* A field the data writes wins over the group's own setting, here as on a board: it is moved by the data values above. */
274
+ const byData = motionWrittenByData(asset)[group.id] ?? { clip: false, speed: false };
275
+ return html `${byData.clip
276
+ ? nothing
277
+ : html `<label>
278
+ <span>${group.label} <span drive>${i18next.t('figure.label.clip')}</span></span>
279
+ <select aria-label=${group.label} @change=${(e) => this.move(group.id, { ...playing, clip: e.target.value })}>
280
+ ${group.clips.map(c => html `<option value=${c} ?selected=${c === playing.clip}>${c}</option>`)}
281
+ </select>
282
+ </label>`}
283
+ ${byData.speed
284
+ ? nothing
285
+ : html `<label>
286
+ <span>${group.label} <span drive>${i18next.t('figure.label.playback-speed')}</span></span>
287
+ <span></span>
288
+ <input type="range" min="0" max="3" step="0.05" .value=${String(playing.speed)} @input=${(e) => this.move(group.id, { ...playing, speed: Number(e.target.value) })} />
289
+ <output>${playing.speed.toFixed(2)}</output>
290
+ </label>`}`;
281
291
  })}
282
292
  </div>`;
283
293
  }
294
+ /** A value the data's bindings read, as the board's saved values give it: a number on a slider when it has a range, a choice when it is closed. */
295
+ renderDataValue(row) {
296
+ const node = row.node;
297
+ const label = row.label ?? row.path;
298
+ const fallback = 'default' in node ? node.default : undefined;
299
+ const value = this.valuing[row.path] ?? fallback;
300
+ if (node.kind === 'number') {
301
+ const ranged = node.min !== undefined && node.max !== undefined && node.max > node.min;
302
+ return html `<label>
303
+ <span>${label} <span drive>${node.unit ?? ''}</span></span>
304
+ <span></span>
305
+ ${ranged
306
+ ? html `<input type="range" min=${node.min} max=${node.max} step=${Math.max((node.max - node.min) / 100, 0.01)} .value=${String(value ?? node.min)} @input=${(e) => this.value(row, e.target.value)} />
307
+ <output>${value === undefined ? '' : Number(value).toFixed(2)}</output>`
308
+ : html `<input type="number" step="any" .value=${value === undefined ? '' : String(value)} @change=${(e) => this.value(row, e.target.value)} />
309
+ <span></span>`}
310
+ </label>`;
311
+ }
312
+ const domain = domainOf(node);
313
+ if (!domain.length)
314
+ return html `<label>
315
+ <span>${label}</span>
316
+ <input aria-label=${label} .value=${value === undefined ? '' : String(value)} @change=${(e) => this.value(row, e.target.value)} />
317
+ </label>`;
318
+ return html `<label>
319
+ <span>${label}</span>
320
+ <select aria-label=${label} @change=${(e) => this.value(row, e.target.value)}>
321
+ ${domain.map(v => html `<option value=${String(v)} ?selected=${v === value}>${typeof v === 'boolean' ? i18next.t(v ? 'figure.label.data-true' : 'figure.label.data-false') : v}</option>`)}
322
+ </select>
323
+ </label>`;
324
+ }
325
+ value(row, typed) {
326
+ const value = typedValueOf(row.node, typed);
327
+ const next = { ...this.valuing };
328
+ if (typeof value === 'number' && Number.isNaN(value))
329
+ delete next[row.path];
330
+ else
331
+ next[row.path] = value;
332
+ this.valuing = next;
333
+ this.tellInstances('figureValues', this.valuing);
334
+ }
284
335
  move(group, playing) {
285
336
  this.moving = { ...this.moving, [group]: playing };
286
337
  this.tellInstances('motion', Object.fromEntries(Object.entries(this.moving).map(([id, m]) => [id, { ...m, paused: false }])));
@@ -309,23 +360,22 @@ let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
309
360
  this.giving = {};
310
361
  }
311
362
  tellInstances(key, values) {
312
- for (const component of this.scene?.root?.components ?? []) {
313
- const value = values === null ? null : { ...values };
314
- /* A live snapshot is transient on the figure (its \`figureData\` accessor), never written into the saved model. */
315
- if (key === 'figureData')
316
- component.figureData = value;
317
- else
318
- component.set?.(key, value);
319
- }
363
+ for (const component of this.scene?.root?.components ?? [])
364
+ component.set?.(key, values === null ? null : { ...values });
365
+ }
366
+ /** The tried data to the figures standing now, as their \`data\`: the preview's board is not saved. */
367
+ tellData(data) {
368
+ for (const component of this.scene?.root?.components ?? [])
369
+ component.set?.('data', data === null || data === undefined ? null : structuredClone(data));
320
370
  }
321
- /** The data sample to the figures standing now: a live snapshot, transient on each, never saved with the board. */
371
+ /** The data sample to the figures standing now. */
322
372
  tellSample() {
323
- if (this.sample)
324
- this.tellInstances('figureData', { ...this.sample });
373
+ if (this.sample !== null && this.sample !== undefined)
374
+ this.tellData(this.sample);
325
375
  }
326
376
  willUpdate(changed) {
327
377
  if (changed.has('sample') && this.scene)
328
- this.tellInstances('figureData', this.sample ? { ...this.sample } : null);
378
+ this.tellData(this.sample);
329
379
  if (!this.hasUpdated)
330
380
  return;
331
381
  if (!this.active) {
@@ -398,6 +448,7 @@ let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
398
448
  this.teardown();
399
449
  this.driving = {};
400
450
  this.moving = {};
451
+ this.valuing = {};
401
452
  registerFigure(type, asset);
402
453
  this.registered = type;
403
454
  const { components, board } = previewInstances(type, size);
@@ -489,6 +540,10 @@ __decorate([
489
540
  state(),
490
541
  __metadata("design:type", Object)
491
542
  ], FigurePreview.prototype, "moving", void 0);
543
+ __decorate([
544
+ state(),
545
+ __metadata("design:type", Object)
546
+ ], FigurePreview.prototype, "valuing", void 0);
492
547
  __decorate([
493
548
  property({ attribute: false }),
494
549
  __metadata("design:type", Object)