@rr0/ufoathome 0.90.0 → 0.92.0
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/README.md +1 -1
- package/dist-embed-scene/OffThreadTracer-z-qdZ_d-.js +6 -0
- package/dist-embed-scene/rr0-scene.mjs +315 -287
- package/dist-embed-sighting/OffThreadTracer-z-qdZ_d-.js +6 -0
- package/dist-embed-sighting/rr0-sighting.mjs +331 -303
- package/dist-embed-sighting-editor/BodyEditor-C8pVeYYE.js +51 -0
- package/dist-embed-sighting-editor/OffThreadTracer-z-qdZ_d-.js +6 -0
- package/dist-embed-sighting-editor/{SightingEditorMessages_es-DZ3YboXK.js → SightingEditorMessages_es-24hPje__.js} +1 -1
- package/dist-embed-sighting-editor/{SightingEditorMessages_fr-BUkuKK8U.js → SightingEditorMessages_fr-Dznf4tD5.js} +1 -1
- package/dist-embed-sighting-editor/{SightingEditorMessages_it-DoiUSbMl.js → SightingEditorMessages_it-BZ7r2ECe.js} +1 -1
- package/dist-embed-sighting-editor/rr0-sighting-editor.mjs +334 -298
- package/package.json +1 -1
- package/dist-embed-sighting-editor/BodyEditor-BeaoBF3D.js +0 -51
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rr0/ufoathome",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.92.0",
|
|
5
5
|
"description": "UFO@home — record and replay a UFO sighting's shape, movement and appearance",
|
|
6
6
|
"author": "Jérôme Beau <rr0@rr0.org> (https://rr0.org)",
|
|
7
7
|
"license": "MIT",
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import{U as v,l as k,B as p,N as f}from"./rr0-sighting-editor.mjs";import{bodyEditorMessages_en as g}from"./BodyEditorMessages_en-DkxURSds.js";class b{constructor(e,t,i){this.container=e,this.host=t,this.render(),this.setLanguage(i)}messages=g;languageToken=0;currentId;catalogueToken=0;shownEntry;syncedId;shownAppearance;static swatchOf(e){const t=/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(e);return t?`#${t[1]}${t[1]}${t[2]}${t[2]}${t[3]}${t[3]}`.toLowerCase():/^#[0-9a-f]{6}$/i.test(e)?e.toLowerCase():"#c8c8c8"}async setLanguage(e){const t=++this.languageToken,i=v.includes(e)?e:"en",o=i==="en"?g:await k(i);t===this.languageToken&&o!==this.messages&&(this.messages=o,this.render())}sync(){const e=this.bodies;e.some(a=>a.id===this.currentId)||(this.currentId=e[0]?.id),this.input("body-interpretation-title").value=this.host.said().read(this.interpretation?.title)??"";const t=this.select("body-select");t.replaceChildren(...e.map(a=>new Option(this.labelOf(a),a.id))),this.currentId!==void 0&&(t.value=this.currentId);const i=this.host.newBodyStart(),o=this.element("body-add");o.disabled=i===void 0,o.title=i?i.label!==void 0?this.messages.addBodyHint.replace("{shape}",i.label):this.messages.addBodyHintView:this.messages.addBody,this.input("body-interpretation-title").closest("label").hidden=this.interpretation===void 0,this.select("body-select").closest("label").hidden=e.length===0;const d=this.current;if(this.element("body-none").hidden=e.length>0,this.element("body-fields").hidden=d===void 0,!d)return;this.input("body-id").value=d.id,this.input("body-title").value=this.host.said().read(d.title)??"",this.syncExplains(d),this.syncModelOptions(d);const n=d.model;this.input("body-model-url").value=n.url??"",this.input("body-model-title").value=n.credit?.title??"",this.input("body-model-author").value=n.credit?.author??"",this.input("body-model-license").value=n.credit?.license??"",this.input("body-model-source").value=n.credit?.sourceUrl??"";const s=this.element("body-model-advanced");s.open=n.url!==void 0||s.open&&d.id===this.syncedId,this.syncedId=d.id,this.element("body-model-incomplete").hidden=n.url===void 0||n.credit?.title!==void 0&&n.credit.license!==void 0,this.input("body-outline-node").value=d.outlineNode??"",this.element("body-track").textContent=this.trackSummary(d),this.syncKeyframe()}syncKeyframe(){const e=this.current;if(!e)return;const t=this.host.currentTime(),i=this.messages;this.element("body-key-legend").textContent=i.atPlayhead.replace("{t}",b.seconds(t));const o=this.host.readingOf(e,t),d=e.track.find(c=>c.t===t),n=b.keyframeBefore(e,t);this.element("body-key-note").textContent=o?d?i.keyframeHere:i.keyframeAdded:i.notPlaced,this.element("body-key-delete").disabled=d===void 0;const s=this.container.getRootNode().activeElement,a=n?.eastM!==void 0&&n.northM!==void 0?"world":"observer";s!==this.select("body-key-mode")&&(this.select("body-key-mode").value=a);const r=this.select("body-key-mode").value,h=n?.onGround===!0;this.input("body-key-ground").checked=h;for(const c of["body-key-azimuth","body-key-elevation","body-key-distance"])this.input(c).closest("label").hidden=r!=="observer";for(const c of["body-key-east","body-key-north"])this.input(c).closest("label").hidden=r!=="world";this.input("body-key-above").closest("label").hidden=r!=="world"||h;const u=e.model.url!==void 0||!p.includes(e.model.id??"");if(this.input("body-key-colour").closest("label").hidden=u,!o)return;const y={"body-key-azimuth":o.azimuthDeg,"body-key-elevation":o.altitudeDeg,"body-key-distance":o.distanceM,"body-key-east":o.eastM,"body-key-north":o.northM,"body-key-above":o.aboveGroundM,"body-key-width":o.sizeM.widthM,"body-key-length":o.sizeM.lengthM,"body-key-height":o.sizeM.heightM,"body-key-heading":o.attitude.headingDeg,"body-key-pitch":o.attitude.pitchDeg,"body-key-roll":o.attitude.rollDeg,"body-key-albedo":o.appearance.albedo,"body-key-luminance":o.appearance.luminanceCdM2};this.shownAppearance=o.appearance,this.input("body-key-colour")!==s&&(this.input("body-key-colour").value=b.swatchOf(o.appearance.color));for(const[c,l]of Object.entries(y))this.input(c)!==s&&(this.input(c).value=String(Number(l.toFixed(2))))}render(){const e=this.messages,t=(i,o,d="text",n="",s="",a="")=>`<label><span>${o}</span> <input id="${i}" type="${d}" placeholder="${n}" ${a} autocomplete="off"/>${s?` ${s}`:""}</label>`;this.container.innerHTML=`<div class="body-editor">
|
|
2
|
-
<p class="body-intro">${e.intro}</p>
|
|
3
|
-
${t("body-interpretation-title",e.interpretationTitle)}
|
|
4
|
-
<p id="body-none" class="body-intro">${e.none}</p>
|
|
5
|
-
<label><span>${e.body}</span> <select id="body-select"></select></label>
|
|
6
|
-
<button id="body-add" type="button" class="icon-btn" title="${e.addBody}" aria-label="${e.addBody}">+</button>
|
|
7
|
-
<div id="body-fields" class="body-fields">
|
|
8
|
-
<button id="body-look" type="button" class="icon-btn" title="${e.lookAtBody}" aria-label="${e.lookAtBody}">🎯</button>
|
|
9
|
-
<button id="body-delete" type="button" class="icon-btn" title="${e.deleteBody}" aria-label="${e.deleteBody}">🗑</button>
|
|
10
|
-
${t("body-id",e.id)}
|
|
11
|
-
${t("body-title",e.title)}
|
|
12
|
-
<fieldset class="body-explains"><legend>${e.explains}</legend><div id="body-explains"></div></fieldset>
|
|
13
|
-
<label><span>${e.model}</span> <select id="body-model"></select></label>
|
|
14
|
-
<details id="body-model-advanced" class="decor-model-advanced">
|
|
15
|
-
<summary>${e.modelAdvanced}</summary>
|
|
16
|
-
${t("body-model-url",e.modelUrl,"text",e.modelUrlHint)}
|
|
17
|
-
${t("body-model-title",e.modelTitle)}
|
|
18
|
-
${t("body-model-author",e.modelAuthor)}
|
|
19
|
-
${t("body-model-license",e.modelLicense,"text","CC0 1.0")}
|
|
20
|
-
${t("body-model-source",e.modelSource,"url","https://…")}
|
|
21
|
-
<p id="body-model-incomplete" class="body-intro" hidden>${e.modelIncomplete}</p>
|
|
22
|
-
<p id="body-model-catalogue" class="body-intro" hidden>${e.modelFromCatalogue}</p>
|
|
23
|
-
</details>
|
|
24
|
-
${t("body-outline-node",e.outlineNode,"text",e.outlineNodeHint)}
|
|
25
|
-
<p class="body-track"><span>${e.track}</span> <output id="body-track"></output></p>
|
|
26
|
-
<fieldset class="body-key">
|
|
27
|
-
<legend id="body-key-legend"></legend>
|
|
28
|
-
<p id="body-key-note" class="body-intro"></p>
|
|
29
|
-
<label><span>${e.placement}</span> <select id="body-key-mode"><option value="observer">${e.fromObserver}</option><option value="world">${e.inWorld}</option></select></label>
|
|
30
|
-
${t("body-key-azimuth",e.azimuth,"number","","°",'min="0" max="360" step="0.01"')}
|
|
31
|
-
${t("body-key-elevation",e.elevation,"number","","°",'min="-90" max="90" step="0.01"')}
|
|
32
|
-
${t("body-key-distance",e.distance,"number","","m",'min="0.1" max="30000" step="0.1"')}
|
|
33
|
-
${t("body-key-east",e.east,"number","","m",'min="-30000" max="30000" step="0.1"')}
|
|
34
|
-
${t("body-key-north",e.north,"number","","m",'min="-30000" max="30000" step="0.1"')}
|
|
35
|
-
<label><input id="body-key-ground" type="checkbox"/> <span>${e.onGround}</span></label>
|
|
36
|
-
${t("body-key-above",e.aboveGround,"number","","m",'min="0" max="30000" step="0.1"')}
|
|
37
|
-
${t("body-key-width",e.width,"number","","m",'min="0.01" max="1000" step="0.01"')}
|
|
38
|
-
${t("body-key-length",e.length,"number","","m",'min="0.01" max="1000" step="0.01"')}
|
|
39
|
-
${t("body-key-height",e.height,"number","","m",'min="0.01" max="1000" step="0.01"')}
|
|
40
|
-
${t("body-key-heading",e.heading,"number","","°",'min="0" max="360" step="0.1"')}
|
|
41
|
-
${t("body-key-pitch",e.pitch,"number","","°",'min="-90" max="90" step="0.1"')}
|
|
42
|
-
${t("body-key-roll",e.roll,"number","","°",'min="-180" max="180" step="0.1"')}
|
|
43
|
-
<label><span>${e.colour}</span> <input id="body-key-colour" type="color"/></label>
|
|
44
|
-
${t("body-key-albedo",e.albedo,"number","0 – 1","",'min="0" max="1" step="0.01"')}
|
|
45
|
-
${t("body-key-luminance",e.luminance,"number","","cd/m²",'min="0" max="100000" step="0.1"')}
|
|
46
|
-
<p class="body-intro">${e.appearanceNote}</p>
|
|
47
|
-
<button id="body-key-delete" type="button">${e.deleteKeyframe}</button>
|
|
48
|
-
<p class="body-intro">${e.pictureHint}</p>
|
|
49
|
-
</fieldset>
|
|
50
|
-
</div>
|
|
51
|
-
</div>`,this.select("body-select").addEventListener("change",()=>{this.currentId=this.select("body-select").value,this.sync()}),this.input("body-interpretation-title").addEventListener("change",()=>this.updateInterpretationTitle()),this.element("body-delete").addEventListener("click",()=>this.deleteCurrent()),this.element("body-add").addEventListener("click",()=>this.addBody()),this.element("body-look").addEventListener("click",()=>{const i=this.current;i&&this.host.lookAt(i)});for(const i of["body-id","body-title","body-outline-node","body-model-url","body-model-title","body-model-author","body-model-license","body-model-source"])this.input(i).addEventListener("change",()=>this.updateCurrent());this.select("body-model").addEventListener("change",()=>{const i=this.select("body-model").value;i!==""&&(this.input("body-model-url").value=""),this.updateCurrent(),this.syncModelOptions(this.current),i!==""&&this.adoptCatalogueSize(i),this.element("body-model-advanced").open=i!==""&&!p.includes(i)}),this.element("body-explains").addEventListener("change",()=>this.updateCurrent());for(const i of b.KEY_FIELDS)this.input(i).addEventListener("input",()=>this.updateKeyframe()),this.input(i).addEventListener("change",()=>this.updateKeyframe());this.select("body-key-mode").addEventListener("change",()=>this.updateKeyframe()),this.element("body-key-delete").addEventListener("click",()=>this.deleteKeyframe()),this.host.modelPicker().enhance(this.select("body-model"),async i=>p.includes(i)?{shape:i}:this.host.modelProvider().entry(i).then(o=>o&&{url:o.url,headingOffsetDeg:o.headingOffsetDeg})),f.fit(this.container),this.sync()}syncExplains(e){const t=this.host.shapes(),i=this.element("body-explains"),o=[...new Set([...t.map(d=>d.id),...e.explains??[]])];i.replaceChildren(...o.map(d=>{const n=document.createElement("label"),s=document.createElement("input");return s.type="checkbox",s.value=d,s.checked=e.explains?.includes(d)??!1,n.append(s," ",t.find(a=>a.id===d)?.label??d),n})),o.length===0&&(i.textContent=this.messages.explainsNothing)}async syncModelOptions(e){const t=++this.catalogueToken,i=await this.host.modelProvider().entries().catch(()=>[]);if(t!==this.catalogueToken)return;const o=this.messages,d=document.createElement("optgroup");d.label=o.primitives,d.append(...p.map(r=>new Option(o.primitive[r],r)));const n=document.createElement("optgroup");n.label=o.catalogue,n.append(...i.map(r=>new Option(r.name,r.id)));const s=this.select("body-model");s.replaceChildren(d,n),e.model.url!==void 0&&s.prepend(new Option(o.modelAdvanced,""));const a=e.model.url===void 0?e.model.id:void 0;a!==void 0&&![...s.options].some(r=>r.value===a)&&s.append(new Option(a,a)),s.value=a??"",this.showCatalogueModel(e.model.url===void 0?i.find(r=>r.id===e.model.id):void 0)}showCatalogueModel(e){const t=this.current;if(!t||t.model.url!==void 0){this.shownEntry=void 0,this.element("body-model-catalogue").hidden=!0;return}this.shownEntry=e;const i=this.container.getRootNode().activeElement,o=[["body-model-url",e?.url],["body-model-title",e?.credit.title],["body-model-author",e?.credit.author],["body-model-license",e?.credit.license],["body-model-source",e?.credit.sourceUrl]];for(const[d,n]of o)this.input(d)!==i&&(this.input(d).value=n??"");this.element("body-model-catalogue").hidden=e===void 0,this.element("body-model-incomplete").hidden=!0}updateInterpretationTitle(){const e=this.interpretation??{bodies:[]},t=this.host.said().write(e.title,this.input("body-interpretation-title").value,this.host.writingLanguage());this.write({...e,title:t})}updateCurrent(){const e=this.current;if(!e)return;const t=this.input("body-id").value.trim(),i=t!==""&&!this.bodies.some(n=>n!==e&&n.id===t)?t:e.id,o=[...this.element("body-explains").querySelectorAll("input:checked")].map(n=>n.value),d={...e,id:i,title:this.host.said().write(e.title,this.input("body-title").value,this.host.writingLanguage()),explains:o.length>0?o:void 0,model:this.statedModel(e.model),outlineNode:this.stringOrUndefined(this.input("body-outline-node").value)};this.currentId=i,this.write({...this.interpretation,bodies:this.bodies.map(n=>n===e?d:n)})}addBody(){const e=this.host.newBodyStart();if(!e)return;const t=new Set(this.bodies.map(n=>n.id));let i=t.size+1;for(;t.has(`body-${i}`);)i++;const o={id:`body-${i}`,explains:e.sourceId!==void 0?[e.sourceId]:void 0,model:{id:"ellipsoid"},track:[e.keyframe]};this.currentId=o.id;const d=this.interpretation??{bodies:[]};this.write({...d,bodies:[...this.bodies,o]},!0)}async adoptCatalogueSize(e){const i=(await this.host.modelProvider().entry(e).catch(()=>{}))?.sizeM,o=this.current;if(!i||!o||o.model.id!==e)return;if(!o.track.some(n=>n.sizeM)&&o.track.length>0){const[n,...s]=[...o.track].sort((h,u)=>h.t-u.t),a={widthM:i.widthM??1,lengthM:i.lengthM??i.widthM??1,heightM:i.heightM??1},r=[{...n,sizeM:a},...s];this.write({...this.interpretation,bodies:this.bodies.map(h=>h===o?{...o,track:r}:h)},!0);return}const d=o.track.map(n=>{const s=n.sizeM?.widthM,a=i.widthM??s;if(!n.sizeM||s===void 0||a===void 0||s<=0)return n;const r=a/s,h={widthM:i.widthM??n.sizeM.widthM*r,lengthM:i.lengthM??n.sizeM.lengthM*r,heightM:i.heightM??n.sizeM.heightM*r};return n.distanceM!==void 0&&n.azimuthDeg!==void 0?{...n,sizeM:h,distanceM:Number((n.distanceM*r).toFixed(1))}:{...n,sizeM:h}});this.write({...this.interpretation,bodies:this.bodies.map(n=>n===o?{...o,track:d}:n)},!0)}get currentBodyId(){return this.current?.id}resize(e){const t=(i,o)=>{this.input(i).value=String(Number(Math.max(.01,o).toFixed(2)))};t("body-key-width",e.widthM),t("body-key-length",e.lengthM),t("body-key-height",e.heightM),this.updateKeyframe()}turnTo(e){const t=i=>((i+180)%360+360)%360-180;this.input("body-key-heading").value=String(Number(((e.headingDeg%360+360)%360).toFixed(1))),this.input("body-key-pitch").value=String(Number(Math.max(-90,Math.min(90,e.pitchDeg)).toFixed(1))),this.input("body-key-roll").value=String(Number(t(e.rollDeg).toFixed(1))),this.updateKeyframe()}show(e){!this.bodies.some(t=>t.id===e)||e===this.currentId||(this.currentId=e,this.sync())}readingNow(){const e=this.current;return e&&this.host.readingOf(e,this.host.currentTime())}dragTo(e,t){const i=this.readingNow();if(!i)return;const o=this.host.currentTime(),d=this.input("body-key-ground").checked,n=d?this.host.groundAlong(e,t,o):void 0,s=Math.PI/180,a=(r,h)=>{this.input(r).value=String(Number(h.toFixed(2)))};if(this.select("body-key-mode").value==="world"){const r=Math.cos(i.altitudeDeg*s),h=i.eastM-Math.sin(i.azimuthDeg*s)*r*i.distanceM,u=i.northM-Math.cos(i.azimuthDeg*s)*r*i.distanceM,y=Math.hypot(i.eastM-h,i.northM-u),c=n!==void 0?n*Math.cos(t*s):y;if(a("body-key-east",h+Math.sin(e*s)*c),a("body-key-north",u+Math.cos(e*s)*c),!d){const l=m=>Math.max(-89,Math.min(89,m))*s;a("body-key-above",Math.max(0,i.aboveGroundM+c*(Math.tan(l(t))-Math.tan(l(i.altitudeDeg)))))}}else a("body-key-azimuth",(e%360+360)%360),a("body-key-elevation",Math.max(-90,Math.min(90,t))),n!==void 0&&a("body-key-distance",n);this.updateKeyframe()}scaleDistance(e){const t=this.readingNow();if(!t)return;const i=(o,d)=>{this.input(o).value=String(Number(d.toFixed(2)))};if(this.select("body-key-mode").value==="world"){const o=Math.PI/180,d=Math.cos(t.altitudeDeg*o),n=t.eastM-Math.sin(t.azimuthDeg*o)*d*t.distanceM,s=t.northM-Math.cos(t.azimuthDeg*o)*d*t.distanceM;i("body-key-east",n+(t.eastM-n)*e),i("body-key-north",s+(t.northM-s)*e)}else i("body-key-distance",Math.max(.1,t.distanceM*e));this.updateKeyframe()}updateKeyframe(){const e=this.current;if(!e)return;const t=this.host.currentTime(),i=l=>{const m=Number(this.input(l).value);return Number.isFinite(m)?m:0},o=this.input("body-key-ground").checked,d=this.select("body-key-mode").value==="world"?{t,eastM:i("body-key-east"),northM:i("body-key-north"),...o?{onGround:!0}:{altitudeAboveGroundM:i("body-key-above")}}:{t,azimuthDeg:i("body-key-azimuth"),altitudeDeg:i("body-key-elevation"),distanceM:Math.max(.1,i("body-key-distance")),...o?{onGround:!0}:{}},n=l=>Math.max(.01,i(l)),s={color:this.input("body-key-colour").value,albedo:Math.max(0,Math.min(1,i("body-key-albedo"))),luminanceCdM2:Math.max(0,i("body-key-luminance"))},a=this.shownAppearance,r=!a||b.swatchOf(a.color)!==s.color.toLowerCase()||Math.abs(a.albedo-s.albedo)>1e-6||Math.abs(a.luminanceCdM2-s.luminanceCdM2)>1e-6,h=e.track.find(l=>l.t===t)?.appearance,u=r?s:h??void 0,y={...b.withoutPlacement(e.track.find(l=>l.t===t)),...d,sizeM:{widthM:n("body-key-width"),lengthM:n("body-key-length"),heightM:n("body-key-height")},attitude:{headingDeg:i("body-key-heading"),pitchDeg:i("body-key-pitch"),rollDeg:i("body-key-roll")},...u?{appearance:u}:{}},c=[...e.track.filter(l=>l.t!==t),y].sort((l,m)=>l.t-m.t);this.write({...this.interpretation,bodies:this.bodies.map(l=>l===e?{...e,track:c}:l)}),this.element("body-track").textContent=this.trackSummary({...e,track:c}),this.syncKeyframe()}deleteKeyframe(){const e=this.current;if(!e)return;const t=this.host.currentTime(),i=e.track.filter(o=>o.t!==t);i.length!==e.track.length&&this.write({...this.interpretation,bodies:this.bodies.map(o=>o===e?{...e,track:i}:o)},!0)}static KEY_FIELDS=["body-key-azimuth","body-key-elevation","body-key-distance","body-key-east","body-key-north","body-key-ground","body-key-above","body-key-width","body-key-length","body-key-height","body-key-heading","body-key-pitch","body-key-roll","body-key-colour","body-key-albedo","body-key-luminance"];static withoutPlacement(e){if(!e)return{};const{eastM:t,northM:i,azimuthDeg:o,altitudeDeg:d,distanceM:n,onGround:s,altitudeAboveGroundM:a,sizeM:r,attitude:h,appearance:u,...y}=e;return y}static keyframeBefore(e,t){const i=[...e.track].sort((o,d)=>o.t-d.t);return[...i].reverse().find(o=>o.t<=t)??i[0]}static seconds(e){return`${Math.round(e/100)/10} s`}deleteCurrent(){const e=this.current;e&&(this.currentId=void 0,this.write({...this.interpretation,bodies:this.bodies.filter(t=>t!==e)},!0))}statedModel(e){const t=this.stringOrUndefined(this.input("body-model-url").value),i=this.shownEntry,o=n=>this.stringOrUndefined(this.input(n).value);if(i&&t===i.url&&o("body-model-title")===i.credit.title&&o("body-model-author")===i.credit.author&&o("body-model-license")===i.credit.license&&o("body-model-source")===i.credit.sourceUrl)return{id:i.id};if(t){const n=this.stringOrUndefined(this.input("body-model-title").value),s=this.stringOrUndefined(this.input("body-model-license").value);return{url:t,headingOffsetDeg:e.url!==void 0?e.headingOffsetDeg:void 0,credit:n!==void 0&&s!==void 0?{title:n,license:s,author:this.stringOrUndefined(this.input("body-model-author").value),sourceUrl:this.stringOrUndefined(this.input("body-model-source").value)}:void 0}}return{id:this.stringOrUndefined(this.select("body-model").value)??e.id??"ellipsoid"}}write(e,t=!1){const i=e.bodies.length===0&&e.title===void 0&&e.smoke===void 0&&e.reentries===void 0;if(this.host.sighting().interpretation=i?void 0:e,this.host.changed(),t){this.sync();return}const o=this.select("body-select");o.replaceChildren(...this.bodies.map(n=>new Option(this.labelOf(n),n.id))),this.currentId!==void 0&&(o.value=this.currentId);const d=this.current;d&&(this.input("body-id").value=d.id,this.element("body-model-incomplete").hidden=d.model.url===void 0||d.model.credit!==void 0,this.syncModelOptions(d))}trackSummary(e){const t=e.track.map(o=>o.t);if(t.length===0)return this.messages.trackEmpty;const i=o=>`${Math.round(o/100)/10} s`;return t.length===1?this.messages.trackSingle.replace("{at}",i(t[0])):this.messages.trackSpan.replace("{n}",String(t.length)).replace("{from}",i(Math.min(...t))).replace("{to}",i(Math.max(...t)))}labelOf(e){const t=this.host.said().read(e.title);return t?`${t} (${e.id})`:e.id}get interpretation(){return this.host.sighting().interpretation}get bodies(){return this.interpretation?.bodies??[]}get current(){return this.bodies.find(e=>e.id===this.currentId)}stringOrUndefined(e){const t=e.trim();return t===""?void 0:t}element(e){return this.container.querySelector("#"+e)}input(e){return this.element(e)}select(e){return this.element(e)}}export{b as BodyEditor};
|