@things-factory/figure-ui 10.1.162 → 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.
- package/client/modeller/data-interface.ts +334 -79
- package/client/modeller/editor.ts +4 -3
- package/client/modeller/figure-data-panel.ts +683 -193
- package/client/modeller/figure-preview.ts +46 -30
- package/client/modeller/refusals.ts +18 -14
- package/client/viewparts/figure-detail-dock.ts +9 -3
- package/dist-client/modeller/data-interface.d.ts +91 -30
- package/dist-client/modeller/data-interface.js +314 -71
- package/dist-client/modeller/data-interface.js.map +1 -1
- package/dist-client/modeller/editor.d.ts +1 -1
- package/dist-client/modeller/editor.js +3 -2
- package/dist-client/modeller/editor.js.map +1 -1
- package/dist-client/modeller/figure-data-panel.d.ts +42 -13
- package/dist-client/modeller/figure-data-panel.js +679 -186
- package/dist-client/modeller/figure-data-panel.js.map +1 -1
- package/dist-client/modeller/figure-preview.d.ts +7 -5
- package/dist-client/modeller/figure-preview.js +47 -30
- package/dist-client/modeller/figure-preview.js.map +1 -1
- package/dist-client/modeller/refusals.d.ts +2 -2
- package/dist-client/modeller/refusals.js +24 -18
- package/dist-client/modeller/refusals.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/viewparts/figure-detail-dock.js +9 -3
- package/dist-client/viewparts/figure-detail-dock.js.map +1 -1
- package/package.json +7 -7
- package/test/browser/build.mjs +9 -0
- package/test/browser/detail-tabs-page.js +36 -0
- package/test/browser/detail-tabs.check.mjs +123 -0
- package/test/data-motion.test.ts +173 -53
- package/translations/en.json +122 -43
- package/translations/es.json +122 -43
- package/translations/ja.json +122 -43
- package/translations/ko.json +122 -43
- package/translations/ms.json +122 -43
- package/translations/zh.json +122 -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 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"]}
|
|
@@ -26,10 +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 given here, as a board's saved `figureValues`: what moves a group whose clip or speed the data writes. */
|
|
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
30
|
private valuing;
|
|
31
|
-
/** Data
|
|
32
|
-
sample:
|
|
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;
|
|
33
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. */
|
|
34
34
|
selected: string;
|
|
35
35
|
private setupPart;
|
|
@@ -44,7 +44,7 @@ export declare class FigurePreview extends FigurePreview_base {
|
|
|
44
44
|
private watcher?;
|
|
45
45
|
render(): import("lit-html").TemplateResult<1>;
|
|
46
46
|
private renderDrivers;
|
|
47
|
-
/** A data
|
|
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
48
|
private renderDataValue;
|
|
49
49
|
private value;
|
|
50
50
|
private move;
|
|
@@ -53,7 +53,9 @@ export declare class FigurePreview extends FigurePreview_base {
|
|
|
53
53
|
private give;
|
|
54
54
|
private poseAsDefault;
|
|
55
55
|
private tellInstances;
|
|
56
|
-
/** The data
|
|
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. */
|
|
57
59
|
private tellSample;
|
|
58
60
|
willUpdate(changed: Map<string, unknown>): void;
|
|
59
61
|
firstUpdated(): void;
|
|
@@ -6,7 +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,
|
|
9
|
+
import { domainOf, motionWrittenByData, typedValueOf, valueRowsOf } from './data-interface.js';
|
|
10
10
|
import { derivedOf } from './revision.js';
|
|
11
11
|
import { authoredSizeOf, PREVIEW_FACTOR, PREVIEW_WAYS, previewClampsOf, previewInstances, previewTypeOf, setupPartOf } from '@things-factory/figure-viewer/dist-client/preview-model.js';
|
|
12
12
|
let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
|
|
@@ -28,9 +28,9 @@ let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
|
|
|
28
28
|
this.giving = {};
|
|
29
29
|
/** Per motion group, the clip played here and how fast (ADR-0051 §3.2) -- the preview's, as a board's \`motion\`. */
|
|
30
30
|
this.moving = {};
|
|
31
|
-
/** Data values given here, as a board's saved `figureValues`: what moves a group whose clip or speed the data writes. */
|
|
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
32
|
this.valuing = {};
|
|
33
|
-
/** Data
|
|
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. */
|
|
34
34
|
this.sample = null;
|
|
35
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. */
|
|
36
36
|
this.selected = '';
|
|
@@ -226,7 +226,7 @@ let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
|
|
|
226
226
|
</select>
|
|
227
227
|
<button @click=${() => this.dispatchEvent(new CustomEvent('configure-size', { detail: { part: setupPart }, bubbles: true, composed: true }))}>${i18next.t('figure.button.configure-size')}</button>
|
|
228
228
|
</div>` : nothing}
|
|
229
|
-
${controls.length + clips.length + (asset?.motionGroups?.length ?? 0) + (asset
|
|
229
|
+
${controls.length + clips.length + (asset?.motionGroups?.length ?? 0) + (asset ? valueRowsOf(asset).length : 0) ? this.renderDrivers(asset, controls, clips) : nothing}</div>`}`;
|
|
230
230
|
}
|
|
231
231
|
renderDrivers(asset, controls, clips) {
|
|
232
232
|
const changed = controls.filter(c => this.giving[c.id] !== undefined && this.giving[c.id] !== asset.stateDefaults[c.id]);
|
|
@@ -267,7 +267,7 @@ let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
|
|
|
267
267
|
<output>${value.toFixed(2)}</output>
|
|
268
268
|
</label>`;
|
|
269
269
|
})}
|
|
270
|
-
${(asset
|
|
270
|
+
${valueRowsOf(asset).map(row => this.renderDataValue(row))}
|
|
271
271
|
${(asset.motionGroups ?? []).map(group => {
|
|
272
272
|
const playing = this.moving[group.id] ?? { clip: group.defaultClip, speed: 0 };
|
|
273
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. */
|
|
@@ -291,27 +291,45 @@ let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
|
|
|
291
291
|
})}
|
|
292
292
|
</div>`;
|
|
293
293
|
}
|
|
294
|
-
/** A data
|
|
295
|
-
renderDataValue(
|
|
296
|
-
const
|
|
297
|
-
|
|
298
|
-
|
|
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;
|
|
299
302
|
return html `<label>
|
|
300
|
-
<span>${
|
|
303
|
+
<span>${label} <span drive>${node.unit ?? ''}</span></span>
|
|
301
304
|
<span></span>
|
|
302
|
-
|
|
303
|
-
|
|
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>`}
|
|
304
310
|
</label>`;
|
|
305
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>`;
|
|
306
318
|
return html `<label>
|
|
307
|
-
<span>${
|
|
308
|
-
<select aria-label=${
|
|
309
|
-
${
|
|
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>`)}
|
|
310
322
|
</select>
|
|
311
323
|
</label>`;
|
|
312
324
|
}
|
|
313
|
-
value(
|
|
314
|
-
|
|
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;
|
|
315
333
|
this.tellInstances('figureValues', this.valuing);
|
|
316
334
|
}
|
|
317
335
|
move(group, playing) {
|
|
@@ -342,23 +360,22 @@ let FigurePreview = class FigurePreview extends localize(i18next)(LitElement) {
|
|
|
342
360
|
this.giving = {};
|
|
343
361
|
}
|
|
344
362
|
tellInstances(key, values) {
|
|
345
|
-
for (const component of this.scene?.root?.components ?? [])
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
}
|
|
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));
|
|
353
370
|
}
|
|
354
|
-
/** The data sample to the figures standing now
|
|
371
|
+
/** The data sample to the figures standing now. */
|
|
355
372
|
tellSample() {
|
|
356
|
-
if (this.sample)
|
|
357
|
-
this.
|
|
373
|
+
if (this.sample !== null && this.sample !== undefined)
|
|
374
|
+
this.tellData(this.sample);
|
|
358
375
|
}
|
|
359
376
|
willUpdate(changed) {
|
|
360
377
|
if (changed.has('sample') && this.scene)
|
|
361
|
-
this.
|
|
378
|
+
this.tellData(this.sample);
|
|
362
379
|
if (!this.hasUpdated)
|
|
363
380
|
return;
|
|
364
381
|
if (!this.active) {
|