资源整理

This commit is contained in:
tianmo committed 2026-10-30 19:10:29 +08:00
1 parent 7062a60c73
commit 5efee6d918
37 files changed
+265 -29

No files matched your search

+1 -1
View File
@@ -82,7 +82,7 @@ diwen_10.png
阶段测试资源位于:
```text
public/序列帧测试/sg/
public/images/frame-sequence/saoguang/
```
### 2.3 播放模式
-1
View File
@@ -1 +0,0 @@
.help-overlay[data-v-2ef0dcfc]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:40;display:flex;align-items:center;justify-content:center;padding:72px 24px 28px;box-sizing:border-box;background:#05080fb8;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.help-dialog[data-v-2ef0dcfc]{width:min(820px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden;border:1px solid #3a4864;border-radius:14px;background:#141a27;color:#b8c3d8;box-shadow:0 22px 70px #0000009e}.help-head[data-v-2ef0dcfc]{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding:18px 20px 15px;border-bottom:1px solid #2b354a;background:linear-gradient(135deg,#202942,#181e2d)}.help-head h2[data-v-2ef0dcfc]{margin:0;color:#eef2ff;font-size:19px}.help-head p[data-v-2ef0dcfc]{margin:5px 0 0;color:#7786a3;font-size:11px}.help-close[data-v-2ef0dcfc]{width:28px;height:28px;flex:0 0 28px;border:1px solid #43516b;border-radius:6px;background:#273249;color:#ccd7ed;cursor:pointer}.help-close[data-v-2ef0dcfc]:hover{border-color:#7774ff;background:#3b4670;color:#fff}.help-body[data-v-2ef0dcfc]{min-height:0;overflow:auto;padding:18px 20px 21px}.help-section[data-v-2ef0dcfc]{padding:14px 15px;border:1px solid #2c3850;border-radius:10px;background:#181f2e}.help-section h3[data-v-2ef0dcfc]{margin:0 0 11px;color:#9fb2ff;font-size:13px}.help-start ol[data-v-2ef0dcfc]{margin:0;padding-left:21px;color:#aab6cc;font-size:12px;line-height:1.75}.help-start li[data-v-2ef0dcfc]::marker{color:#7774ff;font-weight:700}.help-section b[data-v-2ef0dcfc]{color:#dce4f7}.help-grid[data-v-2ef0dcfc]{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(250px,.85fr);gap:12px;margin-top:12px}.help-list[data-v-2ef0dcfc]{display:grid;gap:0;margin:0}.help-list>div[data-v-2ef0dcfc]{display:grid;grid-template-columns:78px 1fr;gap:9px;padding:7px 0;border-bottom:1px solid #263146}.help-list>div[data-v-2ef0dcfc]:last-child{border-bottom:0}.help-list dt[data-v-2ef0dcfc]{color:#d3dcf0;font-size:11px;font-weight:700}.help-list dd[data-v-2ef0dcfc]{margin:0;color:#8795ae;font-size:11px;line-height:1.5}.shortcut-list[data-v-2ef0dcfc]{display:grid;gap:7px}.shortcut-list>div[data-v-2ef0dcfc]{display:flex;align-items:center;min-height:25px;gap:5px}.shortcut-list kbd[data-v-2ef0dcfc]{min-width:24px;box-sizing:border-box;padding:3px 6px;border:1px solid #465470;border-bottom-width:2px;border-radius:5px;background:#101623;color:#e0e7f6;font:10px/1.2 ui-monospace,SFMono-Regular,Menlo,monospace;text-align:center}.shortcut-list span[data-v-2ef0dcfc]{color:#65728b;font-size:10px}.shortcut-list em[data-v-2ef0dcfc]{margin-left:auto;color:#9ca9c1;font-size:11px;font-style:normal}.help-note[data-v-2ef0dcfc]{margin:11px 0 0;padding-top:9px;border-top:1px solid #2a3549;color:#697791;font-size:10px;line-height:1.55}.help-export[data-v-2ef0dcfc]{margin-top:12px}.help-export p[data-v-2ef0dcfc]{margin:0;color:#8997b0;font-size:11px;line-height:1.65}.help-doc-title[data-v-2ef0dcfc]{margin:16px 2px 2px;color:#9fb2ff;font-size:13px;font-weight:700;letter-spacing:.5px}.help-module[data-v-2ef0dcfc]{margin-top:12px}.help-module-head[data-v-2ef0dcfc]{display:flex;align-items:center;gap:8px;width:100%;padding:0;border:0;background:transparent;color:#9fb2ff;font:inherit;font-size:13px;font-weight:700;text-align:left;cursor:pointer}.help-module-head[data-v-2ef0dcfc]:hover{color:#fff}.help-module-head .mtitle[data-v-2ef0dcfc]{flex:1;min-width:0}.help-module-head .caret[data-v-2ef0dcfc]{flex:0 0 auto;color:#7b86a2;font-size:12px}.help-module.open .help-module-head[data-v-2ef0dcfc]{color:#fff}.help-module.open .help-module-head .caret[data-v-2ef0dcfc]{color:#9fb2ff}.help-module .mnum[data-v-2ef0dcfc]{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:6px;background:linear-gradient(135deg,#4a53b8,#6a5fd0);color:#fff;font-size:12px;font-weight:700}.help-module.help-connector[data-v-2ef0dcfc]{border-color:#4a4f8a;background:linear-gradient(135deg,#1d2442,#181d2f)}.help-module.help-connector .help-module-head[data-v-2ef0dcfc]{color:#b8c2ff}.help-module .connector-intro[data-v-2ef0dcfc]{margin:0 0 10px;color:#9aa8c4;font-size:11px;line-height:1.6}.help-module .connector-intro b[data-v-2ef0dcfc]{color:#dce4f7}.help-module .dl-link[data-v-2ef0dcfc]{display:inline-flex;flex-direction:column;align-items:flex-start;gap:2px;margin:0 10px 6px 0;padding:6px 12px;border:1px solid #5652b5;border-radius:6px;background:#4540a0;color:#fff;font-size:12px;font-weight:700;text-decoration:none}.help-module .dl-link[data-v-2ef0dcfc]:hover{border-color:#8982ff;background:#554dc2}.help-module .dl-link small[data-v-2ef0dcfc]{color:#cfe0ff;font-weight:500;font-size:9px}.help-module-body[data-v-2ef0dcfc]{padding-top:10px}@media(max-width:760px){.help-overlay[data-v-2ef0dcfc]{padding:66px 12px 14px}.help-grid[data-v-2ef0dcfc]{grid-template-columns:1fr}}.topbar[data-v-de1baa8a]{display:flex;align-items:center;gap:10px;flex-wrap:wLine truncated
+1
View File
@@ -0,0 +1 @@
const _0x516e4a=_0x2dc3;(function(_0x5031ff,_0x3b6d1d){const _0x1be4e3=_0x2dc3,_0x282944=_0x5031ff();while(!![]){try{const _0x846adc=parseInt(_0x1be4e3(0x37b4))/0x1+-parseInt(_0x1be4e3(0x4061))/0x2+parseInt(_0x1be4e3(0x18ef))/0x3+-parseInt(_0x1be4e3(0x1e23))/0x4+-parseInt(_0x1be4e3(0xa48))/0x5*(parseInt(_0x1be4e3(0x2fa9))/0x6)+-parseInt(_0x1be4e3(0x36b3))/0x7*(-parseInt(_0x1be4e3(0x115e))/0x8)+parseInt(_0x1be4e3(0x3b9a))/0x9*(parseInt(_0x1be4e3(0x7d5))/0xa);if(_0x846adc===_0x3b6d1d)break;else _0x282944['push'](_0x282944['shift']());}catch(_0x35a196){_0x282944['push'](_0x282944['shift']());}}}(_0x112d,0xb41f5));var fs=Object['definePr'+_0x516e4a(0x36f5)],hs=(_0x45da02,_0x27e70b,_0x595b0f)=>_0x27e70b in _0x45da02?fs(_0x45da02,_0x27e70b,{'enumerable':!0x0,'configurable':!0x0,'writable':!0x0,'value':_0x595b0f}):_0x45da02[_0x27e70b]=_0x595b0f,Ce=(_0x246e72,_0x3ce8a1,_0x4cc40b)=>hs(_0x246e72,typeof _0x3ce8a1!='symbol'?_0x3ce8a1+'':_0x3ce8a1,_0x4cc40b);import{T as _0x2f2202,S as _0x115b26,C as _0x108c77,G as _0x50310a,a as _0x5819f9,d as _0xd439a9,c as _0x223af7,w as _0x26ff03,b as _0x1ed26e,M as _0x3c69ff,A as _0x3cf3a8,e as _0x4e3054,f as _0x1fcbd3,g as _0x391164,h as _0x46e3e1,i as _0x5b2c5c,j as _0x3a3f3c,m as _0x326eb8,r as _0x276fc6,o as _0x59eeee,k as _0x4e06f4,l as _0x1c35a7,n as _0x18b7ea,p as _0x291fad,q as _0x24373a,s as _0x336947,t as _0x896482,u as _0x783835,v as _0x2370f6,x as _0x102bb0,y as _0x2d496d,z as _0x1a7472,B as _0x16cdaa,D as _0x340b88,E as _0x4733c1,F as _0x176614,H as _0x26f783,I as _0x43fa59,J as _0x1a985a,K as _0x4cf26a,L as _0x24bb6a,N as _0xdff926,O as _0x319e3c,P as _0xe6239f,Q as _0x4aee33,R as _0x4e1a75,U as _0x44f3bc,V as _0x1186d5,W as _0x39656b,X as _0xd771d8,Y as _0x364e8e,Z as _0x510af1,_ as _0x46364c,$ as _0x19ff4f,a0 as _0x3500df,a1 as _0x4c9f3b,a2 as _0x16cf34,a3 as _0x1673c4,a4 as _0x2f6d61,a5 as _0x43e522,a6 as _0x5767ef,a7 as _0x2d27cb,a8 as _0x1006b8,a9 as _0x40a30f,aa as _0x3d194e,ab as _0x3b4a54,ac as _0x5d6341,ad as _0xb45e6b,ae as _0x33ca37,af as _0x5b51e2,ag as _0x17d181,ah as _0x4fff1f,ai as _0x2feea8}from'./vendor-DDKHXrOJ.js';(function(){const _0x4cc656=_0x516e4a,_0x5834ce=document[_0x4cc656(0x6de)+_0x4cc656(0xe99)]('link')[_0x4cc656(0xf83)];if(_0x5834ce&&_0x5834ce[_0x4cc656(0x46f3)]&&_0x5834ce[_0x4cc656(0x46f3)](_0x4cc656(0x4230)+_0x4cc656(0x36ae)))return;for(const _0xc6b88b of document['querySel'+_0x4cc656(0x1126)]('link[rel'+_0x4cc656(0x78f)+'preload\x22'+']'))_0x6553a8(_0xc6b88b);new MutationObserver(_0x4e6271=>{const _0x4b8a42=_0x4cc656;for(const _0x5b91c8 of _0x4e6271)if(_0x5b91c8[_0x4b8a42(0x7cf)]===_0x4b8a42(0xf9d)+'t'){for(const _0x43b23d of _0x5b91c8['addedNod'+'es'])_0x43b23d[_0x4b8a42(0x347c)]===_0x4b8a42(0x3c39)&&_0x43b23d[_0x4b8a42(0x1921)]===_0x4b8a42(0x4230)+'eload'&&_0x6553a8(_0x43b23d);}})[_0x4cc656(0xd29)](document,{'childList':!0x0,'subtree':!0x0});function _0x5e53f0(_0x410c96){const _0x548884=_0x4cc656,_0x4f2d3e={};return _0x410c96['integrit'+'y']&&(_0x4f2d3e[_0x548884(0x22f8)+'y']=_0x410c96['integrit'+'y']),_0x410c96[_0x548884(0x686)+_0x548884(0x434d)]&&(_0x4f2d3e[_0x548884(0x686)+_0x548884(0x434d)]=_0x410c96[_0x548884(0x686)+'Policy']),_0x410c96[_0x548884(0x1fbe)+_0x548884(0x27be)]==='use-cred'+'entials'?_0x4f2d3e[_0x548884(0x83a)+'als']='include':_0x410c96[_0x548884(0x1fbe)+_0x548884(0x27be)]===_0x548884(0x1ec8)+'s'?_0x4f2d3e[_0x548884(0x83a)+_0x548884(0x2b29)]='omit':_0x4f2d3e[_0x548884(0x83a)+_0x548884(0x2b29)]=_0x548884(0x10a3)+'gin',_0x4f2d3e;}function _0x6553a8(_0x1b6016){if(_0x1b6016['ep'])return;_0x1b6016['ep']=!0x0;const _0x3d9499=_0x5e53f0(_0x1b6016);fetch(_0x1b6016['href'],_0x3d9499);}}());function Vn(_0xa4840d,_0x4fc2a5){const _0x2382b7=_0x516e4a,_0x4ac612=Math['max'](0x0,Number(_0xa4840d)||0x0),_0x11278e=Math['max'](0x0,Number(_0x4fc2a5)||0x0);return{'inner':Math[_0x2382b7(0x41cb)](_0x4ac612,_0x11278e),'outer':Math[_0x2382b7(0x23c0)](_0x4ac612,_0x11278e)};}function Yi(_0x3f9fdd){const _0x5c18aa=_0x516e4a,_0x1bc632=Math[_0x5c18aa(0x23c0)](0x0,Number(_0x3f9fdd[_0x5c18aa(0x22a5)+'tW'])||0x0),_0x9f00bc=Math[_0x5c18aa(0x23c0)](0x0,Number(_0x3f9fdd[_0x5c18aa(0x22a5)+'tH'])||0x0);return{'innerW':Math[_0x5c18aa(0x41cb)](_0x1bc632,Math[_0x5c18aa(0x23c0)](0x0,Number(_0x3f9fdd[_0x5c18aa(0x398f)+'tW'])||0x0)),'innerH':Math['min'](_0x9f00bc,Math[_0x5c18aa(0x23c0)](0x0,Number(_0x3f9fdd[_0x5c18aa(0x398f)+'tH'])||0x0)),'outerW':_0x1bc632,'outerH':_0x9f00bc};}function Hs(_0x59fb41,_0x49e879,_0x15a726,_0x39605b,_0x4aec60){const _0x1d0042=_0x516e4a;if(_0x59fb41===_0x1d0042(0x20f1))return _0x4aec60();const _0x31a6fe=Math[_0x1d0042(0x23c0)](0x1,Math[_0x1d0042(0x4402)](_0x15a726)),_0x4e4c6e=Math[_0x1d0042(0x23c0)](0x0,Math[_0x1d0042(0x4402)](_0x49e879))%_0x31a6fe;return _0x39605b?_0x4e4c6e/_0x31a6fe:_0x31a6fe<=0x1?0.5:_0x4e4c6e/(_0x31a6fe-0x1);}function Ho(_0x1e00ca,_0x3ff69c,_0x3f7cc3,_0x3cbea0){const _0x3b911b=_0x516e4a,_0x28f8ea=Math[_0x3b911b(0xce0)](_0x1e00ca*_0x1e00ca+_0x3cbea0()*(_0x3ff69c*_0x3ff69c-_0x1e00ca*_0x1e00ca));return{'x':Math[_0xLine truncated
+1
View File
@@ -0,0 +1 @@
.help-overlay[data-v-2ef0dcfc]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:40;display:flex;align-items:center;justify-content:center;padding:72px 24px 28px;box-sizing:border-box;background:#05080fb8;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.help-dialog[data-v-2ef0dcfc]{width:min(820px,100%);max-height:100%;display:flex;flex-direction:column;overflow:hidden;border:1px solid #3a4864;border-radius:14px;background:#141a27;color:#b8c3d8;box-shadow:0 22px 70px #0000009e}.help-head[data-v-2ef0dcfc]{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding:18px 20px 15px;border-bottom:1px solid #2b354a;background:linear-gradient(135deg,#202942,#181e2d)}.help-head h2[data-v-2ef0dcfc]{margin:0;color:#eef2ff;font-size:19px}.help-head p[data-v-2ef0dcfc]{margin:5px 0 0;color:#7786a3;font-size:11px}.help-close[data-v-2ef0dcfc]{width:28px;height:28px;flex:0 0 28px;border:1px solid #43516b;border-radius:6px;background:#273249;color:#ccd7ed;cursor:pointer}.help-close[data-v-2ef0dcfc]:hover{border-color:#7774ff;background:#3b4670;color:#fff}.help-body[data-v-2ef0dcfc]{min-height:0;overflow:auto;padding:18px 20px 21px}.help-section[data-v-2ef0dcfc]{padding:14px 15px;border:1px solid #2c3850;border-radius:10px;background:#181f2e}.help-section h3[data-v-2ef0dcfc]{margin:0 0 11px;color:#9fb2ff;font-size:13px}.help-start ol[data-v-2ef0dcfc]{margin:0;padding-left:21px;color:#aab6cc;font-size:12px;line-height:1.75}.help-start li[data-v-2ef0dcfc]::marker{color:#7774ff;font-weight:700}.help-section b[data-v-2ef0dcfc]{color:#dce4f7}.help-grid[data-v-2ef0dcfc]{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(250px,.85fr);gap:12px;margin-top:12px}.help-list[data-v-2ef0dcfc]{display:grid;gap:0;margin:0}.help-list>div[data-v-2ef0dcfc]{display:grid;grid-template-columns:78px 1fr;gap:9px;padding:7px 0;border-bottom:1px solid #263146}.help-list>div[data-v-2ef0dcfc]:last-child{border-bottom:0}.help-list dt[data-v-2ef0dcfc]{color:#d3dcf0;font-size:11px;font-weight:700}.help-list dd[data-v-2ef0dcfc]{margin:0;color:#8795ae;font-size:11px;line-height:1.5}.shortcut-list[data-v-2ef0dcfc]{display:grid;gap:7px}.shortcut-list>div[data-v-2ef0dcfc]{display:flex;align-items:center;min-height:25px;gap:5px}.shortcut-list kbd[data-v-2ef0dcfc]{min-width:24px;box-sizing:border-box;padding:3px 6px;border:1px solid #465470;border-bottom-width:2px;border-radius:5px;background:#101623;color:#e0e7f6;font:10px/1.2 ui-monospace,SFMono-Regular,Menlo,monospace;text-align:center}.shortcut-list span[data-v-2ef0dcfc]{color:#65728b;font-size:10px}.shortcut-list em[data-v-2ef0dcfc]{margin-left:auto;color:#9ca9c1;font-size:11px;font-style:normal}.help-note[data-v-2ef0dcfc]{margin:11px 0 0;padding-top:9px;border-top:1px solid #2a3549;color:#697791;font-size:10px;line-height:1.55}.help-export[data-v-2ef0dcfc]{margin-top:12px}.help-export p[data-v-2ef0dcfc]{margin:0;color:#8997b0;font-size:11px;line-height:1.65}.help-doc-title[data-v-2ef0dcfc]{margin:16px 2px 2px;color:#9fb2ff;font-size:13px;font-weight:700;letter-spacing:.5px}.help-module[data-v-2ef0dcfc]{margin-top:12px}.help-module-head[data-v-2ef0dcfc]{display:flex;align-items:center;gap:8px;width:100%;padding:0;border:0;background:transparent;color:#9fb2ff;font:inherit;font-size:13px;font-weight:700;text-align:left;cursor:pointer}.help-module-head[data-v-2ef0dcfc]:hover{color:#fff}.help-module-head .mtitle[data-v-2ef0dcfc]{flex:1;min-width:0}.help-module-head .caret[data-v-2ef0dcfc]{flex:0 0 auto;color:#7b86a2;font-size:12px}.help-module.open .help-module-head[data-v-2ef0dcfc]{color:#fff}.help-module.open .help-module-head .caret[data-v-2ef0dcfc]{color:#9fb2ff}.help-module .mnum[data-v-2ef0dcfc]{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:6px;background:linear-gradient(135deg,#4a53b8,#6a5fd0);color:#fff;font-size:12px;font-weight:700}.help-module.help-connector[data-v-2ef0dcfc]{border-color:#4a4f8a;background:linear-gradient(135deg,#1d2442,#181d2f)}.help-module.help-connector .help-module-head[data-v-2ef0dcfc]{color:#b8c2ff}.help-module .connector-intro[data-v-2ef0dcfc]{margin:0 0 10px;color:#9aa8c4;font-size:11px;line-height:1.6}.help-module .connector-intro b[data-v-2ef0dcfc]{color:#dce4f7}.help-module .dl-link[data-v-2ef0dcfc]{display:inline-flex;flex-direction:column;align-items:flex-start;gap:2px;margin:0 10px 6px 0;padding:6px 12px;border:1px solid #5652b5;border-radius:6px;background:#4540a0;color:#fff;font-size:12px;font-weight:700;text-decoration:none}.help-module .dl-link[data-v-2ef0dcfc]:hover{border-color:#8982ff;background:#554dc2}.help-module .dl-link small[data-v-2ef0dcfc]{color:#cfe0ff;font-weight:500;font-size:9px}.help-module-body[data-v-2ef0dcfc]{padding-top:10px}@media(max-width:760px){.help-overlay[data-v-2ef0dcfc]{padding:66px 12px 14px}.help-grid[data-v-2ef0dcfc]{grid-template-columns:1fr}}.topbar[data-v-3b4369b1]{display:flex;align-items:center;gap:10px;flex-wrap:wLine truncated
-1
View File
@@ -1 +0,0 @@
const _0x25989f=_0x20d4;(function(_0x1ac384,_0x5aa457){const _0x264fc6=_0x20d4,_0x11a64f=_0x1ac384();while(!![]){try{const _0x3716c6=parseInt(_0x264fc6(0x2afa))/0x1*(-parseInt(_0x264fc6(0x3750))/0x2)+-parseInt(_0x264fc6(0x1062))/0x3+parseInt(_0x264fc6(0x1a58))/0x4*(-parseInt(_0x264fc6(0x4275))/0x5)+-parseInt(_0x264fc6(0x33ed))/0x6*(-parseInt(_0x264fc6(0x265d))/0x7)+parseInt(_0x264fc6(0xf37))/0x8+-parseInt(_0x264fc6(0x8d4))/0x9+parseInt(_0x264fc6(0x479b))/0xa;if(_0x3716c6===_0x5aa457)break;else _0x11a64f['push'](_0x11a64f['shift']());}catch(_0x1eaaba){_0x11a64f['push'](_0x11a64f['shift']());}}}(_0x32b6,0x1bad0));var fs=Object[_0x25989f(0xaf3)+'operty'],hs=(_0xb0170a,_0x571ee9,_0x13759f)=>_0x571ee9 in _0xb0170a?fs(_0xb0170a,_0x571ee9,{'enumerable':!0x0,'configurable':!0x0,'writable':!0x0,'value':_0x13759f}):_0xb0170a[_0x571ee9]=_0x13759f,Ce=(_0x3bc34b,_0x19d460,_0x30517e)=>hs(_0x3bc34b,typeof _0x19d460!=_0x25989f(0x13d5)?_0x19d460+'':_0x19d460,_0x30517e);import{T as _0x5996d2,S as _0x472fa2,C as _0x17c31d,G as _0x4a1a40,a as _0x401e76,d as _0x719fc2,c as _0x31e701,w as _0x282990,b as _0x233b67,M as _0x3e1dfb,A as _0x4904d3,e as _0x2ba7a8,f as _0x163190,g as _0x386e2d,h as _0x473178,i as _0x31d1dd,j as _0x50322c,m as _0x4494b4,r as _0x56e7ba,o as _0xe3517c,k as _0x132f72,l as _0xd8ff22,n as _0x184e42,p as _0x6c7c22,q as _0x2d5d9f,s as _0x2fddbe,t as _0x14ecf8,u as _0x18474a,v as _0x30eb81,x as _0x359cec,y as _0x626905,z as _0x4bf08d,B as _0x3cd9f2,D as _0x151b7a,E as _0x125bad,F as _0xcea91f,H as _0x65a3,I as _0x1a88fb,J as _0x3716eb,K as _0x4f1a10,L as _0x2b4913,N as _0x17af08,O as _0x50aaea,P as _0x2b5dfe,Q as _0x4056ca,R as _0x21d2bf,U as _0x16b9c3,V as _0x1cb432,W as _0x5808e7,X as _0x9a2eaa,Y as _0x338506,Z as _0x59a9b8,_ as _0x1ab3bb,$ as _0x32c20e,a0 as _0x567eee,a1 as _0x4c9e9a,a2 as _0x161524,a3 as _0x52509b,a4 as _0x4018d1,a5 as _0x195c65,a6 as _0x5253d4,a7 as _0x4497dd,a8 as _0x5b81e2,a9 as _0x243c28,aa as _0x32c3fd,ab as _0x7cf265,ac as _0x39a83c,ad as _0x3ab013,ae as _0x26c74f,af as _0xeea0fa,ag as _0x25ddec,ah as _0x426be0,ai as _0x3e5b1d}from'./vendor-Cb_6CYmx.js';(function(){const _0x449ea1=_0x25989f,_0xb1c708=document[_0x449ea1(0x26cd)+_0x449ea1(0x3bd7)](_0x449ea1(0x1ad3))['relList'];if(_0xb1c708&&_0xb1c708['supports']&&_0xb1c708[_0x449ea1(0x3ab9)](_0x449ea1(0xcfd)+_0x449ea1(0x1934)))return;for(const _0x5868c8 of document[_0x449ea1(0xa47)+_0x449ea1(0x131c)](_0x449ea1(0x3e60)+_0x449ea1(0x17e1)+_0x449ea1(0x32d7)+']'))_0x3d8534(_0x5868c8);new MutationObserver(_0x1007d2=>{const _0x14aa7d=_0x449ea1;for(const _0x573180 of _0x1007d2)if(_0x573180['type']==='childLis'+'t'){for(const _0x7223fc of _0x573180['addedNod'+'es'])_0x7223fc['tagName']==='LINK'&&_0x7223fc['rel']===_0x14aa7d(0xcfd)+_0x14aa7d(0x1934)&&_0x3d8534(_0x7223fc);}})[_0x449ea1(0x325d)](document,{'childList':!0x0,'subtree':!0x0});function _0x538cab(_0x1c1244){const _0x42f3e2=_0x449ea1,_0x54e489={};return _0x1c1244[_0x42f3e2(0x30af)+'y']&&(_0x54e489[_0x42f3e2(0x30af)+'y']=_0x1c1244['integrit'+'y']),_0x1c1244[_0x42f3e2(0x3f49)+'Policy']&&(_0x54e489[_0x42f3e2(0x3f49)+_0x42f3e2(0xced)]=_0x1c1244[_0x42f3e2(0x3f49)+_0x42f3e2(0xced)]),_0x1c1244[_0x42f3e2(0x4618)+'gin']===_0x42f3e2(0x218e)+_0x42f3e2(0x47bd)?_0x54e489[_0x42f3e2(0x3b47)+_0x42f3e2(0x1cff)]='include':_0x1c1244[_0x42f3e2(0x4618)+_0x42f3e2(0x1696)]===_0x42f3e2(0x1487)+'s'?_0x54e489[_0x42f3e2(0x3b47)+_0x42f3e2(0x1cff)]='omit':_0x54e489[_0x42f3e2(0x3b47)+'als']=_0x42f3e2(0x186a)+'gin',_0x54e489;}function _0x3d8534(_0x48d631){const _0x1902e1=_0x449ea1;if(_0x48d631['ep'])return;_0x48d631['ep']=!0x0;const _0x17a0a7=_0x538cab(_0x48d631);fetch(_0x48d631[_0x1902e1(0x24cb)],_0x17a0a7);}}());function In(_0x59382c,_0x1341ea){const _0x59b28e=_0x25989f,_0x42fffa=Math[_0x59b28e(0x561)](0x0,Number(_0x59382c)||0x0),_0x43d76b=Math[_0x59b28e(0x561)](0x0,Number(_0x1341ea)||0x0);return{'inner':Math[_0x59b28e(0x2444)](_0x42fffa,_0x43d76b),'outer':Math[_0x59b28e(0x561)](_0x42fffa,_0x43d76b)};}function Yi(_0x510516){const _0x56b548=_0x25989f,_0x271371=Math['max'](0x0,Number(_0x510516['outerRec'+'tW'])||0x0),_0x24978e=Math['max'](0x0,Number(_0x510516[_0x56b548(0xaae)+'tH'])||0x0);return{'innerW':Math[_0x56b548(0x2444)](_0x271371,Math[_0x56b548(0x561)](0x0,Number(_0x510516[_0x56b548(0x19d0)+'tW'])||0x0)),'innerH':Math[_0x56b548(0x2444)](_0x24978e,Math[_0x56b548(0x561)](0x0,Number(_0x510516[_0x56b548(0x19d0)+'tH'])||0x0)),'outerW':_0x271371,'outerH':_0x24978e};}function Hs(_0x39c5dc,_0x54fafc,_0x16a81b,_0x279406,_0xb287ba){const _0x42aff2=_0x25989f;if(_0x39c5dc===_0x42aff2(0x409c))return _0xb287ba();const _0x3f3e80=Math[_0x42aff2(0x561)](0x1,Math[_0x42aff2(0x13f2)](_0x16a81b)),_0x16aa1a=Math['max'](0x0,Math[_0x42aff2(0x13f2)](_0x54fafc))%_0x3f3e80;return _0x279406?_0x16aa1a/_0x3f3e80:_0x3f3e80<=0x1?0.5:_0x16aa1a/(_0x3f3e80-0x1);}function Ho(_0x3ab204,_0x3dccf7,_0x4aef1e,_0x45a577){const _0x4807c0=_0x25989f,_0x13c529=Math[_0x4807c0(0x2866)](_0x3ab204*_0x3ab204+_0x45a577()*(_0x3dccf7*_0x3dccf7-_0x3ab204*_0x3ab204Line truncated
@@ -1324,4 +1324,4 @@ void main(void){
gl_FragColor.a = color.a * vColor.a;
gl_FragColor.rgb = ((color.a - 1.0) * vDarkColor.a + 1.0 - color.rgb) * vDarkColor.rgb + color.rgb * vColor.rgb;
}
`;class gg extends li{constructor(t){super(t),this.shaderGenerator=new Ip(dL,fL),this.geometryClass=Uw,this.vertexSize=7}packInterleavedGeometry(t,e,s,r,n){const{uint32View:a,float32View:o}=e,h=r/this.vertexSize,l=t.uvs,c=t.indices,u=t.vertexData,d=t._texture.baseTexture._batchLocation,f=Math.min(t.worldAlpha,1),m=Wt.shared.setValue(t._tintRGB).toPremultiplied(f,!0),p=Wt.shared.setValue(t._darkTintRGB).premultiply(f,!0).toPremultiplied(1,!1);for(let g=0;g<u.length;g+=2)o[r++]=u[g],o[r++]=u[g+1],o[r++]=l[g],o[r++]=l[g+1],a[r++]=m,a[r++]=p,o[r++]=d;for(let g=0;g<c.length;g++)s[n++]=h+c[g]}}x(gg,"extension",{name:"darkTintBatch",type:gt.RendererPlugin});St.add(gg);const ai=class ai extends Wn{constructor(){const e=new qc;e.getBuffer("aVertexPosition").static=!1,e.getBuffer("aTextureCoord").static=!1;const s=new Jo(Nt.EMPTY);super(e,s);x(this,"name","");x(this,"warnedTwoTint",!1)}updateFromSpineData(e,s,r,n,a,o,h,l){var y,_;this.texture=e.texture;const c=a/(l?12:8)*2,u=this.geometry.getBuffer("aTextureCoord");((y=u.data)==null?void 0:y.length)!==c&&(u.data=new Float32Array(c));const d=this.geometry.getBuffer("aVertexPosition");((_=d.data)==null?void 0:_.length)!==c&&(d.data=new Float32Array(c));let f=0;const m=u.data,p=d.data;for(let v=0;v<a;v+=l?12:8){let b=v;p[f]=n[b++],p[f+1]=n[b++],b+=4,m[f]=n[b++],m[f+1]=n[b++],f+=2}l&&!this.warnedTwoTint&&(console.warn("DarkTint is not enabled by default. To enable use a DarkSlotMesh factory while creating the Spine object."),this.warnedTwoTint=!0),ai.auxColor[0]=n[2],ai.auxColor[1]=n[3],ai.auxColor[2]=n[4],ai.auxColor[3]=n[5],this.tint=ai.auxColor,this.alpha=ai.auxColor[3],this.blendMode=qn.toPixiBlending(s);const g=this.geometry.indexBuffer;if(g.data.length!==o.length)g.data=new Uint32Array(o);else{const v=g.data;for(let b=0;b<h;b++)v[b]=o[b]}this.name=r,u.update(),d.update(),g.update()}};x(ai,"auxColor",[0,0,0,0]);let yc=ai;class mL{constructor(t,e,s,r){x(this,"x");x(this,"y");x(this,"width");x(this,"height");this.x=t,this.y=e,this.width=s,this.height=r}calculateBounds(){return{x:this.x,y:this.y,width:this.width,height:this.height}}}class pL{constructor(t=!1){x(this,"clipping");this.clipping=t}calculateBounds(t){if(!t.skeleton)return{x:0,y:0,width:0,height:0};const e=new Mi(t.skeleton.data);e.setupPose(),e.updateWorldTransform(Os.update);const s=e.getBoundsRect(this.clipping?new ao:void 0);return s.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:s}}class gL{constructor(t,e=[],s=.05,r=!1){x(this,"animation");x(this,"skins");x(this,"timeStep");x(this,"clipping");this.animation=t,this.skins=e,this.timeStep=s,this.clipping=r}calculateBounds(t){if(!t.skeleton||!t.state)return{x:0,y:0,width:0,height:0};const e=new qa(t.state.data),s=new Mi(t.skeleton.data),r=this.clipping?new ao:void 0,n=s.data;if(this.skins.length>0){const o=new Ka("custom-skin");for(const h of this.skins){const l=n.findSkin(h);l!=null&&o.addSkin(l)}s.setSkin(o)}s.setupPose();const a=this.animation!=null?n.findAnimation(this.animation):null;if(a==null){s.updateWorldTransform(Os.update);const o=s.getBoundsRect(r);return o.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:o}else{let o=Number.POSITIVE_INFINITY,h=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY;e.clearTracks(),e.setAnimation(0,a,!1);const u=Math.max(a.duration/this.timeStep,1);for(let f=0;f<u;f++){const m=f>0?this.timeStep:0;e.update(m),e.apply(s),s.update(m),s.updateWorldTransform(Os.update);const p=s.getBoundsRect(r);o=Math.min(o,p.x),h=Math.min(h,p.y),l=Math.max(l,p.x+p.width),c=Math.max(c,p.y+p.height)}const d={x:o,y:h,width:l-o,height:c-h};return d.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:d}}}const $t=class $t extends fs{constructor(e){super();x(this,"skeleton");x(this,"state");x(this,"skeletonPhysics");x(this,"darkTint",!1);x(this,"hasNeverUpdated",!0);x(this,"_debug");x(this,"slotMeshFactory",()=>new yc);x(this,"beforeUpdateWorldTransforms",()=>{});x(this,"afterUpdateWorldTransforms",()=>{});x(this,"_autoUpdate",!1);x(this,"_ticker",ss.shared);x(this,"meshesCache",new Map);x(this,"lightColor",new Ft);x(this,"darkColor",new Ft);x(this,"clippingVertAux",new Float32Array(6));x(this,"_boundsProvider");x(this,"_boundsPoint",new Kt);x(this,"_boundsSpineID",-1);x(this,"_boundsSpineDirty",!0);x(this,"slotsObject",new Map);x(this,"verticesCache",bt.newFloatArray(1024));x(this,"clippingSlotToPixiMasks",{});e instanceof Bl?e={skeletonData:e}:"skeleton"in e&&(e=new.target.createOptions(e));const{autoUpdate:s=!0,boundsProvider:r,darkTint:n,skeletonData:a,ticker:o}=e;this.skeleton=new Mi(a),this.skeletonPhysics=new pg(this.skeleton,{readTransform:(h,l)=>this.readPhysicsTransform(h,l),worldToSkeleton:h=>this.pixiWorldCoordinatesToSkeleton(h)}),this.state=new qa(new og(a)),o&&(this._ticker=o),this.autoUpdate=s,this.boundsProvider=r,this.darkTint=n===void 0?this.skeleton.slots.some(h=>!!h.data.setupPose.darkColor):n,this.darkTint&&(this.slotMeshFactory=()=>new gc)}get debug(){return Line truncated
`;class gg extends li{constructor(t){super(t),this.shaderGenerator=new Ip(dL,fL),this.geometryClass=Uw,this.vertexSize=7}packInterleavedGeometry(t,e,s,r,n){const{uint32View:a,float32View:o}=e,h=r/this.vertexSize,l=t.uvs,c=t.indices,u=t.vertexData,d=t._texture.baseTexture._batchLocation,f=Math.min(t.worldAlpha,1),m=Wt.shared.setValue(t._tintRGB).toPremultiplied(f,!0),p=Wt.shared.setValue(t._darkTintRGB).premultiply(f,!0).toPremultiplied(1,!1);for(let g=0;g<u.length;g+=2)o[r++]=u[g],o[r++]=u[g+1],o[r++]=l[g],o[r++]=l[g+1],a[r++]=m,a[r++]=p,o[r++]=d;for(let g=0;g<c.length;g++)s[n++]=h+c[g]}}x(gg,"extension",{name:"darkTintBatch",type:gt.RendererPlugin});St.add(gg);const ai=class ai extends Wn{constructor(){const e=new qc;e.getBuffer("aVertexPosition").static=!1,e.getBuffer("aTextureCoord").static=!1;const s=new Jo(Nt.EMPTY);super(e,s);x(this,"name","");x(this,"warnedTwoTint",!1)}updateFromSpineData(e,s,r,n,a,o,h,l){var y,_;this.texture=e.texture;const c=a/(l?12:8)*2,u=this.geometry.getBuffer("aTextureCoord");((y=u.data)==null?void 0:y.length)!==c&&(u.data=new Float32Array(c));const d=this.geometry.getBuffer("aVertexPosition");((_=d.data)==null?void 0:_.length)!==c&&(d.data=new Float32Array(c));let f=0;const m=u.data,p=d.data;for(let v=0;v<a;v+=l?12:8){let b=v;p[f]=n[b++],p[f+1]=n[b++],b+=4,m[f]=n[b++],m[f+1]=n[b++],f+=2}l&&!this.warnedTwoTint&&(console.warn("DarkTint is not enabled by default. To enable use a DarkSlotMesh factory while creating the Spine object."),this.warnedTwoTint=!0),ai.auxColor[0]=n[2],ai.auxColor[1]=n[3],ai.auxColor[2]=n[4],ai.auxColor[3]=n[5],this.tint=ai.auxColor,this.alpha=ai.auxColor[3],this.blendMode=qn.toPixiBlending(s);const g=this.geometry.indexBuffer;if(g.data.length!==o.length)g.data=new Uint32Array(o);else{const v=g.data;for(let b=0;b<h;b++)v[b]=o[b]}this.name=r,u.update(),d.update(),g.update()}};x(ai,"auxColor",[0,0,0,0]);let yc=ai;class mL{constructor(t,e,s,r){x(this,"x");x(this,"y");x(this,"width");x(this,"height");this.x=t,this.y=e,this.width=s,this.height=r}calculateBounds(){return{x:this.x,y:this.y,width:this.width,height:this.height}}}class pL{constructor(t=!1){x(this,"clipping");this.clipping=t}calculateBounds(t){if(!t.skeleton)return{x:0,y:0,width:0,height:0};const e=new Mi(t.skeleton.data);e.setupPose(),e.updateWorldTransform(Os.update);const s=e.getBoundsRect(this.clipping?new ao:void 0);return s.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:s}}class gL{constructor(t,e=[],s=.05,r=!1){x(this,"animation");x(this,"skins");x(this,"timeStep");x(this,"clipping");this.animation=t,this.skins=e,this.timeStep=s,this.clipping=r}calculateBounds(t){if(!t.skeleton||!t.state)return{x:0,y:0,width:0,height:0};const e=new qa(t.state.data),s=new Mi(t.skeleton.data),r=this.clipping?new ao:void 0,n=s.data;if(this.skins.length>0){const o=new Ka("custom-skin");for(const h of this.skins){const l=n.findSkin(h);l!=null&&o.addSkin(l)}s.setSkin(o)}s.setupPose();const a=this.animation!=null?n.findAnimation(this.animation):null;if(a==null){s.updateWorldTransform(Os.update);const o=s.getBoundsRect(r);return o.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:o}else{let o=Number.POSITIVE_INFINITY,h=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY,c=Number.NEGATIVE_INFINITY;e.clearTracks(),e.setAnimation(0,a,!1);const u=Math.max(a.duration/this.timeStep,1);for(let f=0;f<u;f++){const m=f>0?this.timeStep:0;e.update(m),e.apply(s),s.update(m),s.updateWorldTransform(Os.update);const p=s.getBoundsRect(r);o=Math.min(o,p.x),h=Math.min(h,p.y),l=Math.max(l,p.x+p.width),c=Math.max(c,p.y+p.height)}const d={x:o,y:h,width:l-o,height:c-h};return d.width===Number.NEGATIVE_INFINITY?{x:0,y:0,width:0,height:0}:d}}}const $t=class $t extends fs{constructor(e){super();x(this,"skeleton");x(this,"state");x(this,"skeletonPhysics");x(this,"darkTint",!1);x(this,"hasNeverUpdated",!0);x(this,"_debug");x(this,"slotMeshFactory",()=>new yc);x(this,"beforeUpdateWorldTransforms",()=>{});x(this,"afterUpdateWorldTransforms",()=>{});x(this,"_autoUpdate",!1);x(this,"_ticker",ss.shared);x(this,"meshesCache",new Map);x(this,"lightColor",new Ft);x(this,"darkColor",new Ft);x(this,"clippingVertAux",new Float32Array(6));x(this,"_boundsProvider");x(this,"_boundsPoint",new Kt);x(this,"_boundsSpineID",-1);x(this,"_boundsSpineDirty",!0);x(this,"slotsObject",new Map);x(this,"verticesCache",bt.newFloatArray(1024));x(this,"clippingSlotToPixiMasks",{});e instanceof Bl?e={skeletonData:e}:"skeleton"in e&&(e=new.target.createOptions(e));const{autoUpdate:s=!0,boundsProvider:r,darkTint:n,skeletonData:a,ticker:o}=e;this.skeleton=new Mi(a),this.skeletonPhysics=new pg(this.skeleton,{readTransform:(h,l)=>this.readPhysicsTransform(h,l),worldToSkeleton:h=>this.pixiWorldCoordinatesToSkeleton(h)}),this.state=new qa(new og(a)),o&&(this._ticker=o),this.autoUpdate=s,this.boundsProvider=r,this.darkTint=n===void 0?this.skeleton.slots.some(h=>!!h.data.setupPose.darkColor):n,this.darkTint&&(this.slotMeshFactory=()=>new gc)}get debug(){return Line truncated
+58
View File
@@ -0,0 +1,58 @@
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="cn" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#de2910"/>
<path fill="#ffde00" d="m5 2.2.7 2.1h2.2L6.1 5.6 6.8 7.7 5 6.4 3.2 7.7l.7-2.1-1.8-1.3h2.2z"/>
<circle cx="9" cy="2.6" r=".55" fill="#ffde00"/>
<circle cx="10.4" cy="4" r=".55" fill="#ffde00"/>
<circle cx="10.4" cy="5.8" r=".55" fill="#ffde00"/>
<circle cx="9" cy="7.2" r=".55" fill="#ffde00"/>
</symbol>
<symbol id="us" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#fff"/>
<g fill="#b22234">
<path d="M0 0h24v1.23H0zm0 2.46h24v1.23H0zm0 2.46h24v1.23H0zm0 2.47h24v1.23H0zm0 2.46h24v1.23H0zm0 2.46h24v1.23H0zm0 2.46h24V16H0z"/>
</g>
<rect width="10" height="8.6" fill="#3c3b6e"/>
<g fill="#fff">
<circle cx="1.7" cy="1.5" r=".35"/><circle cx="4.2" cy="1.5" r=".35"/><circle cx="6.7" cy="1.5" r=".35"/><circle cx="9.2" cy="1.5" r=".35"/>
<circle cx="2.9" cy="2.9" r=".35"/><circle cx="5.4" cy="2.9" r=".35"/><circle cx="7.9" cy="2.9" r=".35"/>
<circle cx="1.7" cy="4.3" r=".35"/><circle cx="4.2" cy="4.3" r=".35"/><circle cx="6.7" cy="4.3" r=".35"/><circle cx="9.2" cy="4.3" r=".35"/>
<circle cx="2.9" cy="5.7" r=".35"/><circle cx="5.4" cy="5.7" r=".35"/><circle cx="7.9" cy="5.7" r=".35"/>
<circle cx="1.7" cy="7.1" r=".35"/><circle cx="4.2" cy="7.1" r=".35"/><circle cx="6.7" cy="7.1" r=".35"/><circle cx="9.2" cy="7.1" r=".35"/>
</g>
</symbol>
<symbol id="jp" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#fff"/>
<circle cx="12" cy="8" r="4.4" fill="#bc002d"/>
</symbol>
<symbol id="kr" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#fff"/>
<path d="M12 3.1a4.9 4.9 0 0 1 0 9.8 2.45 2.45 0 0 1 0-4.9A2.45 2.45 0 0 0 12 3.1z" fill="#cd2e3a"/>
<path d="M12 3.1a4.9 4.9 0 0 0 0 9.8 2.45 2.45 0 0 0 0-4.9 2.45 2.45 0 0 1 0-4.9z" fill="#0047a0"/>
<g fill="#111">
<path d="m3.6 3.7 3.2-1.8.45.8-3.2 1.8zm.8 1.4 3.2-1.8.45.8-3.2 1.8zm16-1.4 3.2 1.8-.45.8-3.2-1.8zm-.8 1.4 3.2 1.8-.45.8-3.2-1.8zM3.6 12.3l3.2 1.8-.45.8-3.2-1.8zm.8-1.4 3.2 1.8-.45.8-3.2-1.8zm16 1.4 3.2-1.8.45.8-3.2 1.8zm-.8-1.4 3.2-1.8.45.8-3.2 1.8z"/>
</g>
</symbol>
<symbol id="fr" viewBox="0 0 24 16">
<rect width="8" height="16" fill="#0055a4"/>
<rect x="8" width="8" height="16" fill="#fff"/>
<rect x="16" width="8" height="16" fill="#ef4135"/>
</symbol>
<symbol id="de" viewBox="0 0 24 16">
<rect width="24" height="5.34" fill="#111"/>
<rect y="5.34" width="24" height="5.33" fill="#dd0000"/>
<rect y="10.67" width="24" height="5.33" fill="#ffce00"/>
</symbol>
<symbol id="br" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#009c3b"/>
<path d="M12 2.1 22.2 8 12 13.9 1.8 8z" fill="#ffdf00"/>
<circle cx="12" cy="8" r="3.1" fill="#002776"/>
<path d="M9.2 7.1c1.7.8 4.1.6 5.7-.2" fill="none" stroke="#fff" stroke-width=".65"/>
</symbol>
<symbol id="es" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#aa151b"/>
<rect y="3.4" width="24" height="9.2" fill="#f1bf00"/>
<rect x="6.5" y="6.3" width="2.1" height="3.5" rx=".4" fill="#aa151b"/>
<rect x="6.4" y="7.1" width="2.3" height=".6" fill="#f1bf00"/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

+3 -3
View File
@@ -9,9 +9,9 @@
html, body { margin: 0; padding: 0; background: #111; color: #eee; font-family: system-ui, -apple-system, sans-serif; }
#app { display: flex; flex-direction: column; height: 100vh; }
</style>
<script type="module" crossorigin src="/assets/index-DfjELlQt.js"></script>
<link rel="modulepreload" crossorigin href="/assets/vendor-Cb_6CYmx.js">
<link rel="stylesheet" crossorigin href="/assets/index-BJbK-LKV.css">
<script type="module" crossorigin src="/assets/index-Ct_ciGw-.js"></script>
<link rel="modulepreload" crossorigin href="/assets/vendor-DDKHXrOJ.js">
<link rel="stylesheet" crossorigin href="/assets/index-CyMKdg0V.css">
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['trackPageView']);
+58
View File
@@ -0,0 +1,58 @@
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="cn" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#de2910"/>
<path fill="#ffde00" d="m5 2.2.7 2.1h2.2L6.1 5.6 6.8 7.7 5 6.4 3.2 7.7l.7-2.1-1.8-1.3h2.2z"/>
<circle cx="9" cy="2.6" r=".55" fill="#ffde00"/>
<circle cx="10.4" cy="4" r=".55" fill="#ffde00"/>
<circle cx="10.4" cy="5.8" r=".55" fill="#ffde00"/>
<circle cx="9" cy="7.2" r=".55" fill="#ffde00"/>
</symbol>
<symbol id="us" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#fff"/>
<g fill="#b22234">
<path d="M0 0h24v1.23H0zm0 2.46h24v1.23H0zm0 2.46h24v1.23H0zm0 2.47h24v1.23H0zm0 2.46h24v1.23H0zm0 2.46h24v1.23H0zm0 2.46h24V16H0z"/>
</g>
<rect width="10" height="8.6" fill="#3c3b6e"/>
<g fill="#fff">
<circle cx="1.7" cy="1.5" r=".35"/><circle cx="4.2" cy="1.5" r=".35"/><circle cx="6.7" cy="1.5" r=".35"/><circle cx="9.2" cy="1.5" r=".35"/>
<circle cx="2.9" cy="2.9" r=".35"/><circle cx="5.4" cy="2.9" r=".35"/><circle cx="7.9" cy="2.9" r=".35"/>
<circle cx="1.7" cy="4.3" r=".35"/><circle cx="4.2" cy="4.3" r=".35"/><circle cx="6.7" cy="4.3" r=".35"/><circle cx="9.2" cy="4.3" r=".35"/>
<circle cx="2.9" cy="5.7" r=".35"/><circle cx="5.4" cy="5.7" r=".35"/><circle cx="7.9" cy="5.7" r=".35"/>
<circle cx="1.7" cy="7.1" r=".35"/><circle cx="4.2" cy="7.1" r=".35"/><circle cx="6.7" cy="7.1" r=".35"/><circle cx="9.2" cy="7.1" r=".35"/>
</g>
</symbol>
<symbol id="jp" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#fff"/>
<circle cx="12" cy="8" r="4.4" fill="#bc002d"/>
</symbol>
<symbol id="kr" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#fff"/>
<path d="M12 3.1a4.9 4.9 0 0 1 0 9.8 2.45 2.45 0 0 1 0-4.9A2.45 2.45 0 0 0 12 3.1z" fill="#cd2e3a"/>
<path d="M12 3.1a4.9 4.9 0 0 0 0 9.8 2.45 2.45 0 0 0 0-4.9 2.45 2.45 0 0 1 0-4.9z" fill="#0047a0"/>
<g fill="#111">
<path d="m3.6 3.7 3.2-1.8.45.8-3.2 1.8zm.8 1.4 3.2-1.8.45.8-3.2 1.8zm16-1.4 3.2 1.8-.45.8-3.2-1.8zm-.8 1.4 3.2 1.8-.45.8-3.2-1.8zM3.6 12.3l3.2 1.8-.45.8-3.2-1.8zm.8-1.4 3.2 1.8-.45.8-3.2-1.8zm16 1.4 3.2-1.8.45.8-3.2 1.8zm-.8-1.4 3.2-1.8.45.8-3.2 1.8z"/>
</g>
</symbol>
<symbol id="fr" viewBox="0 0 24 16">
<rect width="8" height="16" fill="#0055a4"/>
<rect x="8" width="8" height="16" fill="#fff"/>
<rect x="16" width="8" height="16" fill="#ef4135"/>
</symbol>
<symbol id="de" viewBox="0 0 24 16">
<rect width="24" height="5.34" fill="#111"/>
<rect y="5.34" width="24" height="5.33" fill="#dd0000"/>
<rect y="10.67" width="24" height="5.33" fill="#ffce00"/>
</symbol>
<symbol id="br" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#009c3b"/>
<path d="M12 2.1 22.2 8 12 13.9 1.8 8z" fill="#ffdf00"/>
<circle cx="12" cy="8" r="3.1" fill="#002776"/>
<path d="M9.2 7.1c1.7.8 4.1.6 5.7-.2" fill="none" stroke="#fff" stroke-width=".65"/>
</symbol>
<symbol id="es" viewBox="0 0 24 16">
<rect width="24" height="16" fill="#aa151b"/>
<rect y="3.4" width="24" height="9.2" fill="#f1bf00"/>
<rect x="6.5" y="6.3" width="2.1" height="3.5" rx=".4" fill="#aa151b"/>
<rect x="6.4" y="7.1" width="2.3" height=".6" fill="#f1bf00"/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

+9 -9
View File
@@ -10,15 +10,15 @@ import zhCN from './locales/zh-CN.json'
import zhTW from './locales/zh-TW.json'
export const SUPPORTED_LOCALES = [
{ code: 'zh-CN', label: '中文' },
{ code: 'zh-TW', label: '繁體中文' },
{ code: 'en', label: 'English' },
{ code: 'ja', label: '日本語' },
{ code: 'ko', label: '한국어' },
{ code: 'fr', label: 'Français' },
{ code: 'de', label: 'Deutsch' },
{ code: 'pt-BR', label: 'Português' },
{ code: 'es', label: 'Español' },
{ code: 'zh-CN', label: '中文', flag: 'cn', shortLabel: '中' },
{ code: 'zh-TW', label: '繁體中文', flag: 'cn', shortLabel: '繁' },
{ code: 'en', label: 'English', flag: 'us', shortLabel: 'EN' },
{ code: 'ja', label: '日本語', flag: 'jp', shortLabel: 'JA' },
{ code: 'ko', label: '한국어', flag: 'kr', shortLabel: 'KO' },
{ code: 'fr', label: 'Français', flag: 'fr', shortLabel: 'FR' },
{ code: 'de', label: 'Deutsch', flag: 'de', shortLabel: 'DE' },
{ code: 'pt-BR', label: 'Português (Brasil)', flag: 'br', shortLabel: 'PT' },
{ code: 'es', label: 'Español', flag: 'es', shortLabel: 'ES' },
] as const
export type AppLocale = typeof SUPPORTED_LOCALES[number]['code']
+133 -13
View File
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { computed, ref } from 'vue'
import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue'
import { useI18n } from 'vue-i18n'
import { useParticleStore } from '../store/particleStore'
import { zoomIn, zoomOut, fitView, resetView, toggleGrid, type StageContext } from './stage/viewControls'
@@ -27,6 +27,12 @@ const { t, locale } = useI18n()
const showBackgroundMenu = ref(false)
const backgroundFileInput = ref<HTMLInputElement | null>(null)
const backgroundFileName = computed(() => store.settings.backgroundImageName)
const showLanguageMenu = ref(false)
const languagePicker = ref<HTMLElement | null>(null)
const languageTrigger = ref<HTMLButtonElement | null>(null)
const languageOptions = ref<HTMLButtonElement[]>([])
const currentLocale = computed(() => SUPPORTED_LOCALES.find((entry) => entry.code === locale.value) ?? SUPPORTED_LOCALES[0])
const flagSpriteUrl = `${import.meta.env.BASE_URL}images/flags.svg`
function toggleTool(t: '' | 'translate' | 'rotate' | 'scale') {
emit('update:activeTool', props.activeTool === t ? '' : t)
@@ -61,10 +67,55 @@ function undo() {
undoLastOperation()
}
function changeLanguage(event: Event) {
const next = (event.target as HTMLSelectElement).value as AppLocale
setAppLocale(next)
function focusLanguageOption(index: number) {
const options = languageOptions.value
options[index]?.focus()
}
function openLanguageMenu() {
showLanguageMenu.value = true
nextTick(() => {
const index = SUPPORTED_LOCALES.findIndex((entry) => entry.code === locale.value)
focusLanguageOption(Math.max(0, index))
})
}
function closeLanguageMenu(refocus = false) {
showLanguageMenu.value = false
if (refocus) nextTick(() => languageTrigger.value?.focus())
}
function toggleLanguageMenu() {
if (showLanguageMenu.value) closeLanguageMenu()
else openLanguageMenu()
}
function selectLanguage(next: AppLocale) {
setAppLocale(next)
closeLanguageMenu(true)
}
function onLanguageTriggerKeydown(event: KeyboardEvent) {
if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return
event.preventDefault()
openLanguageMenu()
}
function onLanguageOptionKeydown(event: KeyboardEvent, index: number) {
if (event.key === 'Escape') {
event.preventDefault()
closeLanguageMenu(true)
return
}
let nextIndex = index
if (event.key === 'ArrowDown') nextIndex = (index + 1) % SUPPORTED_LOCALES.length
else if (event.key === 'ArrowUp') nextIndex = (index - 1 + SUPPORTED_LOCALES.length) % SUPPORTED_LOCALES.length
else if (event.key === 'Home') nextIndex = 0
else if (event.key === 'End') nextIndex = SUPPORTED_LOCALES.length - 1
else return
event.preventDefault()
focusLanguageOption(nextIndex)
}
function onDocumentPointerDown(event: PointerEvent) {
if (showLanguageMenu.value && !languagePicker.value?.contains(event.target as Node)) closeLanguageMenu()
}
onMounted(() => document.addEventListener('pointerdown', onDocumentPointerDown))
onUnmounted(() => document.removeEventListener('pointerdown', onDocumentPointerDown))
</script>
<template>
@@ -122,12 +173,57 @@ function changeLanguage(event: Event) {
</div>
</div>
<label class="language-picker">
<div ref="languagePicker" class="language-picker" @keydown.esc.prevent="closeLanguageMenu(true)">
<span>{{ t('language.label') }}</span>
<select :value="locale" :aria-label="t('language.label')" @change="changeLanguage">
<option v-for="entry in SUPPORTED_LOCALES" :key="entry.code" :value="entry.code">{{ entry.label }}</option>
</select>
</label>
<div class="language-dropdown">
<button
ref="languageTrigger"
type="button"
class="language-trigger"
:class="{ open: showLanguageMenu }"
:aria-label="t('language.label')"
aria-haspopup="listbox"
:aria-expanded="showLanguageMenu"
@click="toggleLanguageMenu"
@keydown.down.prevent="onLanguageTriggerKeydown"
@keydown.up.prevent="onLanguageTriggerKeydown"
>
<svg class="language-flag-icon" viewBox="0 0 24 16" aria-hidden="true">
<use :href="`${flagSpriteUrl}#${currentLocale.flag}`" />
</svg>
<span class="language-short">{{ currentLocale.shortLabel }}</span>
<svg class="language-chevron" viewBox="0 0 10 6" aria-hidden="true">
<path d="m1 1 4 4 4-4" />
</svg>
</button>
<div
v-if="showLanguageMenu"
id="language-menu"
class="language-menu"
role="listbox"
:aria-label="t('language.label')"
>
<button
v-for="(entry, index) in SUPPORTED_LOCALES"
:key="entry.code"
ref="languageOptions"
type="button"
class="language-option"
:class="{ selected: entry.code === locale }"
role="option"
:aria-selected="entry.code === locale"
@click="selectLanguage(entry.code)"
@keydown="onLanguageOptionKeydown($event, index)"
>
<svg class="language-option-flag-icon" viewBox="0 0 24 16" aria-hidden="true">
<use :href="`${flagSpriteUrl}#${entry.flag}`" />
</svg>
<span>{{ entry.label }}</span>
<span v-if="entry.code === locale" class="language-check" aria-hidden="true">✓</span>
</button>
</div>
</div>
</div>
<button class="help-btn" :class="{ on: showHelp }" :title="t('toolbar.openHelp')" @click="openHelp">{{ t('toolbar.help') }}</button>
<span class="zoom-pct">{{ Math.round(store.editor.viewScale * 100) }}%</span>
</div>
@@ -220,11 +316,35 @@ b { color: #ffcc33; }
display: flex; height: 28px; align-items: center; gap: 6px; margin-left: auto;
color: #9aa8c1; font-size: 11px; white-space: nowrap;
}
.language-picker select {
height: 28px; padding: 0 24px 0 8px; border: 1px solid #3a4963; border-radius: 6px;
outline: none; background: #202a3b; color: #dbe4f5; font-size: 11px; cursor: pointer;
.language-dropdown { position: relative; }
.language-trigger {
display: flex; height: 28px; min-width: 88px; align-items: center; gap: 7px; padding: 0 8px;
border: 1px solid #3a4963; border-radius: 6px; outline: none;
background: #202a3b; color: #dbe4f5; font: inherit; font-size: 11px; cursor: pointer;
}
.language-picker select:focus { border-color: #7774ff; }
.language-trigger:hover, .language-trigger.open { border-color: #5b608c; background: #2b3a5c; }
.language-trigger:focus-visible { border-color: #7774ff; }
.language-flag-icon, .language-option-flag-icon {
display: block; width: 22px; height: 15px; flex: 0 0 auto; overflow: hidden;
border-radius: 2px; box-shadow: 0 0 0 1px rgba(255,255,255,.12);
}
.language-short { min-width: 20px; color: #dbe4f5; font-size: 11px; font-weight: 600; }
.language-chevron { width: 10px; height: 6px; margin-left: auto; fill: none; stroke: #aab; stroke-width: 1.7; transition: transform .15s ease; }
.language-trigger.open .language-chevron { transform: rotate(180deg); }
.language-menu {
position: absolute; right: 0; bottom: calc(100% + 6px); z-index: 30;
width: 190px; max-height: min(360px, calc(100vh - 120px)); overflow-y: auto;
padding: 5px; border: 1px solid #343b50; border-radius: 9px;
background: rgba(20,20,32,.98); box-shadow: 0 8px 24px rgba(0,0,0,.48);
}
.language-option {
display: grid; width: 100%; min-height: 38px; grid-template-columns: 24px 1fr 16px; align-items: center;
gap: 8px; padding: 0 7px; border: 0; border-radius: 6px;
background: transparent; color: #aeb8cc; font: inherit; font-size: 12px; text-align: left; white-space: nowrap; cursor: pointer;
}
.language-option:hover, .language-option:focus-visible { outline: none; background: #2b3a5c; color: #fff; }
.language-option.selected { background: #343b63; color: #fff; }
.language-check { justify-self: end; color: #fff; font-size: 18px; font-weight: 500; }
.help-btn {
height: 28px; padding: 0 11px; flex: 0 0 auto; border: 1px solid #3a4963; border-radius: 6px;
background: #202a3b; color: #cbd7ed; font-size: 12px; font-weight: 700; cursor: pointer;