修正
This commit is contained in:
1 parent
b3e9481fe5
commit
e626e685fc
25 files changed
+189
-13
No files matched your search
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
const _0x232089=_0x56c4;(function(_0x1758a0,_0x18c8ff){const _0x273c74=_0x56c4,_0x17cd99=_0x1758a0();while(!![]){try{const _0x1f2630=-parseInt(_0x273c74(0x1495))/0x1+-parseInt(_0x273c74(0x53dc))/0x2*(parseInt(_0x273c74(0x35a5))/0x3)+parseInt(_0x273c74(0x4bbd))/0x4*(-parseInt(_0x273c74(0x99e))/0x5)+parseInt(_0x273c74(0x22a8))/0x6+-parseInt(_0x273c74(0x2af5))/0x7+-parseInt(_0x273c74(0x279c))/0x8+parseInt(_0x273c74(0x5120))/0x9;if(_0x1f2630===_0x18c8ff)break;else _0x17cd99['push'](_0x17cd99['shift']());}catch(_0x1428c4){_0x17cd99['push'](_0x17cd99['shift']());}}}(_0x4e85,0xe1874));var ks=Object[_0x232089(0x3ff5)+_0x232089(0x3612)],Cs=(_0x4c33a7,_0x21cab4,_0x4c0c85)=>_0x21cab4 in _0x4c33a7?ks(_0x4c33a7,_0x21cab4,{'enumerable':!0x0,'configurable':!0x0,'writable':!0x0,'value':_0x4c0c85}):_0x4c33a7[_0x21cab4]=_0x4c0c85,ke=(_0x1a32be,_0x1c1a32,_0xff1002)=>Cs(_0x1a32be,typeof _0x1c1a32!=_0x232089(0x16b4)?_0x1c1a32+'':_0x1c1a32,_0xff1002);import{c as _0x20796d,d as _0x59cbd7,u as _0x343082,o as _0x3bfd97,a as _0x3f2cf0,b as _0x323b63,e as _0x55b200,w as _0x4e81f2,f as _0x565f50,n as _0x28b114,g as _0x38be18,t as _0xe258d9,h as _0x7f985c,F as _0xdc2848,r as _0x1e58d6,i as _0x4cd87c,j as _0x39f553,k as _0x176438,l as _0x15f160,m as _0x2ae87f,p as _0x2caeca,q as _0x5b1d4b,s as _0x565f91,v as _0x520e25,T as _0x5b4d33,x as _0x205475,y as _0x3418b2,z as _0xdd80ee,S as _0x5e71bd,C as _0xeb512d,G as _0xb68fcd,A as _0x9686f9,B as _0x1d7cef,D as _0x41cffe,M as _0x275490,E as _0x971725,H as _0x306d98,I as _0x4c30c3,J as _0x4a4ed8,K as _0x6fb7a3,L as _0x5674e1,N as _0x41d1cf,O as _0x429cf5,P as _0x390327,Q as _0x5815e7,R as _0x38c71c,U as _0x3e8c24,V as _0x4af473,W as _0x14c3dc,X as _0x45b326,Y as _0x275a59,Z as _0x1aa4d0,_ as _0xda46aa,$ as _0x155983,a0 as _0x2c0e73,a1 as _0x1cb81d,a2 as _0x3c6f2d,a3 as _0x39d700,a4 as _0x395fb0,a5 as _0x3f85f2,a6 as _0x5a511e,a7 as _0x2f0725,a8 as _0x265878,a9 as _0x540e7a,aa as _0x58c1dc,ab as _0x24512c,ac as _0x32d32c,ad as _0x271745,ae as _0x931123,af as _0x24f48f,ag as _0x5df307,ah as _0x51a88,ai as _0x4401e4}from'./vendor-fsmZiMPK.js';(function(){const _0x29ffba=_0x232089,_0x4da923=document[_0x29ffba(0x12e0)+_0x29ffba(0x44e8)](_0x29ffba(0x1410))[_0x29ffba(0x2485)];if(_0x4da923&&_0x4da923[_0x29ffba(0x4d79)]&&_0x4da923[_0x29ffba(0x4d79)](_0x29ffba(0xa6e)+'eload'))return;for(const _0x4cec16 of document[_0x29ffba(0x51ab)+_0x29ffba(0x320a)]('link[rel'+_0x29ffba(0xe95)+_0x29ffba(0x202d)+']'))_0xdb9d7d(_0x4cec16);new MutationObserver(_0x13c87d=>{const _0x505772=_0x29ffba;for(const _0x4a9859 of _0x13c87d)if(_0x4a9859[_0x505772(0x9ae)]===_0x505772(0x755)+'t'){for(const _0x269f82 of _0x4a9859[_0x505772(0x2c78)+'es'])_0x269f82[_0x505772(0x212b)]===_0x505772(0x405)&&_0x269f82[_0x505772(0x3f14)]===_0x505772(0xa6e)+_0x505772(0x2173)&&_0xdb9d7d(_0x269f82);}})['observe'](document,{'childList':!0x0,'subtree':!0x0});function _0xa837d(_0x22a18d){const _0x475389=_0x29ffba,_0x5c4e5f={};return _0x22a18d[_0x475389(0x2f35)+'y']&&(_0x5c4e5f[_0x475389(0x2f35)+'y']=_0x22a18d[_0x475389(0x2f35)+'y']),_0x22a18d[_0x475389(0x1097)+_0x475389(0x3ddc)]&&(_0x5c4e5f[_0x475389(0x1097)+_0x475389(0x3ddc)]=_0x22a18d[_0x475389(0x1097)+_0x475389(0x3ddc)]),_0x22a18d[_0x475389(0x119e)+'gin']==='use-cred'+'entials'?_0x5c4e5f[_0x475389(0x5c1)+_0x475389(0x1a53)]=_0x475389(0x503d):_0x22a18d['crossOri'+_0x475389(0x3515)]===_0x475389(0x2761)+'s'?_0x5c4e5f['credenti'+_0x475389(0x1a53)]='omit':_0x5c4e5f['credenti'+_0x475389(0x1a53)]=_0x475389(0x49d1)+'gin',_0x5c4e5f;}function _0xdb9d7d(_0xf18e93){const _0x53e9cf=_0x29ffba;if(_0xf18e93['ep'])return;_0xf18e93['ep']=!0x0;const _0x1e9b8e=_0xa837d(_0xf18e93);fetch(_0xf18e93[_0x53e9cf(0x2492)],_0x1e9b8e);}}());const Ki=_0x232089(0x415)+'yeomai-w'+_0x232089(0x263e)+'.png',tr=_0x232089(0x85a)+_0x232089(0x33ec),Zo='/images/'+'eagle-lo'+_0x232089(0x3c09),nr={'resizeTimeline':_0x232089(0x8ae)+_0x232089(0x3c0c)+_0x232089(0x4a20)+'der\x20Zeit'+_0x232089(0x3852)+_0x232089(0x3ef4)+'n','systems':_0x232089(0x4538),'particlesBones':_0x232089(0x35da)+_0x232089(0x2e1e)+'n)','rootBone':_0x232089(0x4ff5)+_0x232089(0x3c5c),'hudTip':_0x232089(0x3fd1)+'·\x20Klicke'+'n\x20Sie\x20mi'+_0x232089(0x4046)+_0x232089(0x235d)+_0x232089(0x31f5)+_0x232089(0x1269)+_0x232089(0x2a2b)+'zu\x20ziehe'+'n','title':_0x232089(0x4f7f)+'rtikeled'+'itor'},or={'documentTitle':'Spine-Pa'+_0x232089(0x51be)+_0x232089(0x197f),'titleLead':_0x232089(0x2ae)+_0x232089(0x50d2)+'eln','titleAccent':_0x232089(0xaac)+_0x232089(0x2cde)+_0x232089(0x3234),'backToTools':_0x232089(0x2314)+'ur\x20Werkz'+_0x232089(0x14a8)+'hl','editor':{'badge':'PARTIKEL'+_0x232089(0x3413),'title':_0x232089(0x35da)+_0x232089(0x336f),'description':_0x232089(0x2665)+_0x232089(0x4027)+_0x232089(0x1cc2)+_0x232089(0xb34)+_0x232089(0x3540)+_0x232089(0x4585)+'\x20Spine-P'+_0x232089(0x29ab)+_0x232089(0x5163)+'ei.','tagPreview':_0x232089(0x53a9)+'schau','tagSequence':_0x232089(0x3f23)+_0x232089(0x283f)+_0x232089(0x4562),'tagExport':'JSON-Exp'+_0x232089(0x4562),'cta':_0x232089(0x35daLine truncated
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
.language-picker[data-v-811a66dc]{display:flex;height:28px;align-items:center;gap:6px;margin-left:auto;color:#9aa8c1;font-size:11px;white-space:nowrap}.language-dropdown[data-v-811a66dc]{position:relative}.language-trigger[data-v-811a66dc]{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-trigger[data-v-811a66dc]:hover,.language-trigger.open[data-v-811a66dc]{border-color:#5b608c;background:#2b3a5c}.language-trigger[data-v-811a66dc]:focus-visible{border-color:#7774ff}.language-flag-icon[data-v-811a66dc],.language-option-flag-icon[data-v-811a66dc]{display:block;width:22px;height:15px;flex:0 0 auto;overflow:hidden;border-radius:2px;box-shadow:0 0 0 1px #ffffff1f}.language-short[data-v-811a66dc]{min-width:20px;color:#dbe4f5;font-size:11px;font-weight:600}.language-chevron[data-v-811a66dc]{width:10px;height:6px;margin-left:auto;fill:none;stroke:#aab;stroke-width:1.7;transition:transform .15s ease}.language-trigger.open .language-chevron[data-v-811a66dc]{transform:rotate(180deg)}.language-menu[data-v-811a66dc]{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:#141420fa;box-shadow:0 8px 24px #0000007a}.menu-down .language-menu[data-v-811a66dc]{top:calc(100% + 6px);bottom:auto}.language-option[data-v-811a66dc]{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[data-v-811a66dc]:hover,.language-option[data-v-811a66dc]:focus-visible{outline:none;background:#2b3a5c;color:#fff}.language-option.selected[data-v-811a66dc]{background:#343b63;color:#fff}.language-check[data-v-811a66dc]{justify-self:end;color:#fff;font-size:18px;font-weight:500}.welcome-shell[data-v-1a06af44]{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box;padding:clamp(22px,3vw,42px) clamp(22px,4vw,64px) 28px;color:#eef0f5;background:radial-gradient(circle at 17% 0%,rgba(218,45,57,.16),transparent 32%),radial-gradient(circle at 85% 8%,rgba(72,100,170,.16),transparent 30%),linear-gradient(145deg,#09090d,#0d0f15 52%,#090b10);font-family:system-ui,-apple-system,Segoe UI,sans-serif}.welcome-shell[data-v-1a06af44]:before{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;content:"";opacity:.22;background-image:linear-gradient(rgba(255,255,255,.025) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.025) 1px,transparent 1px);background-size:42px 42px;-webkit-mask-image:linear-gradient(to bottom,#000,transparent 70%);mask-image:linear-gradient(to bottom,#000,transparent 70%)}.welcome-header[data-v-1a06af44],.welcome-intro[data-v-1a06af44],.hub-grid[data-v-1a06af44]{position:relative}.welcome-header[data-v-1a06af44]{display:flex;min-height:42px;align-items:center;gap:18px}.welcome-header[data-v-1a06af44]{z-index:40}.brand-link[data-v-1a06af44]{display:inline-flex;border-radius:6px;transition:opacity .16s ease}.brand-link[data-v-1a06af44]:hover{opacity:.78}.brand-link[data-v-1a06af44]:focus-visible{outline:2px solid #ef5147;outline-offset:5px}.brand-logo[data-v-1a06af44]{display:block;width:clamp(128px,10vw,156px);height:auto}.welcome-intro[data-v-1a06af44]{padding:clamp(34px,6vh,64px) 0 clamp(22px,3.5vh,34px);text-align:center}.welcome-intro h1[data-v-1a06af44]{max-width:none;margin:0 auto;color:#f3f3f5;font-size:clamp(20px,2.4vw,40px);line-height:1.1;letter-spacing:-.025em;white-space:nowrap}.welcome-intro h1 span[data-v-1a06af44]{color:#ff4e47}.welcome-intro p[data-v-1a06af44]{max-width:390px;margin:0 0 3px;color:#8c93a3;font-size:13px;line-height:1.75}.hub-grid[data-v-1a06af44]{display:grid;min-height:0;flex:0 1 auto;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(14px,1.5vw,22px);width:min(100%,1540px);margin:0 auto}.hub-card[data-v-1a06af44]{--hub-border: #242731;--hub-divider: #242731;position:relative;display:flex;min-width:0;min-height:0;flex-direction:column;padding:0;overflow:hidden;border:1px solid var(--hub-border);border-radius:18px;background:linear-gradient(180deg,#1a1d26f0,#0f1117fa);color:inherit;font:inherit;text-align:left;text-decoration:none;cursor:pointer;box-shadow:0 20px 52px #00000040;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease}.hub-card[data-v-1a06af44]:hover{transform:translateY(-3px);border-color:var(--hub-border);box-shadow:0 25px 64px #00000061}.hub-card[data-v-1a06af44]:focus-visible{outline:2px solid #ff5b50;outline-offset:2px}.editor-card[data-v-1a06af44]:hover{--hub-border: #706bea}.viewer-card[data-v-1a06af44]:hover,.thumbnail-card[data-v-1a06af44]:hover{--hub-bordeLine truncated
|
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
.language-picker[data-v-811a66dc]{display:flex;height:28px;align-items:center;gap:6px;margin-left:auto;color:#9aa8c1;font-size:11px;white-space:nowrap}.language-dropdown[data-v-811a66dc]{position:relative}.language-trigger[data-v-811a66dc]{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-trigger[data-v-811a66dc]:hover,.language-trigger.open[data-v-811a66dc]{border-color:#5b608c;background:#2b3a5c}.language-trigger[data-v-811a66dc]:focus-visible{border-color:#7774ff}.language-flag-icon[data-v-811a66dc],.language-option-flag-icon[data-v-811a66dc]{display:block;width:22px;height:15px;flex:0 0 auto;overflow:hidden;border-radius:2px;box-shadow:0 0 0 1px #ffffff1f}.language-short[data-v-811a66dc]{min-width:20px;color:#dbe4f5;font-size:11px;font-weight:600}.language-chevron[data-v-811a66dc]{width:10px;height:6px;margin-left:auto;fill:none;stroke:#aab;stroke-width:1.7;transition:transform .15s ease}.language-trigger.open .language-chevron[data-v-811a66dc]{transform:rotate(180deg)}.language-menu[data-v-811a66dc]{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:#141420fa;box-shadow:0 8px 24px #0000007a}.menu-down .language-menu[data-v-811a66dc]{top:calc(100% + 6px);bottom:auto}.language-option[data-v-811a66dc]{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[data-v-811a66dc]:hover,.language-option[data-v-811a66dc]:focus-visible{outline:none;background:#2b3a5c;color:#fff}.language-option.selected[data-v-811a66dc]{background:#343b63;color:#fff}.language-check[data-v-811a66dc]{justify-self:end;color:#fff;font-size:18px;font-weight:500}.welcome-shell[data-v-1a06af44]{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box;padding:clamp(22px,3vw,42px) clamp(22px,4vw,64px) 28px;color:#eef0f5;background:radial-gradient(circle at 17% 0%,rgba(218,45,57,.16),transparent 32%),radial-gradient(circle at 85% 8%,rgba(72,100,170,.16),transparent 30%),linear-gradient(145deg,#09090d,#0d0f15 52%,#090b10);font-family:system-ui,-apple-system,Segoe UI,sans-serif}.welcome-shell[data-v-1a06af44]:before{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;content:"";opacity:.22;background-image:linear-gradient(rgba(255,255,255,.025) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.025) 1px,transparent 1px);background-size:42px 42px;-webkit-mask-image:linear-gradient(to bottom,#000,transparent 70%);mask-image:linear-gradient(to bottom,#000,transparent 70%)}.welcome-header[data-v-1a06af44],.welcome-intro[data-v-1a06af44],.hub-grid[data-v-1a06af44]{position:relative}.welcome-header[data-v-1a06af44]{display:flex;min-height:42px;align-items:center;gap:18px}.welcome-header[data-v-1a06af44]{z-index:40}.brand-link[data-v-1a06af44]{display:inline-flex;border-radius:6px;transition:opacity .16s ease}.brand-link[data-v-1a06af44]:hover{opacity:.78}.brand-link[data-v-1a06af44]:focus-visible{outline:2px solid #ef5147;outline-offset:5px}.brand-logo[data-v-1a06af44]{display:block;width:clamp(128px,10vw,156px);height:auto}.welcome-intro[data-v-1a06af44]{padding:clamp(34px,6vh,64px) 0 clamp(22px,3.5vh,34px);text-align:center}.welcome-intro h1[data-v-1a06af44]{max-width:none;margin:0 auto;color:#f3f3f5;font-size:clamp(20px,2.4vw,40px);line-height:1.1;letter-spacing:-.025em;white-space:nowrap}.welcome-intro h1 span[data-v-1a06af44]{color:#ff4e47}.welcome-intro p[data-v-1a06af44]{max-width:390px;margin:0 0 3px;color:#8c93a3;font-size:13px;line-height:1.75}.hub-grid[data-v-1a06af44]{display:grid;min-height:0;flex:0 1 auto;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(14px,1.5vw,22px);width:min(100%,1540px);margin:0 auto}.hub-card[data-v-1a06af44]{--hub-border: #242731;--hub-divider: #242731;position:relative;display:flex;min-width:0;min-height:0;flex-direction:column;padding:0;overflow:hidden;border:1px solid var(--hub-border);border-radius:18px;background:linear-gradient(180deg,#1a1d26f0,#0f1117fa);color:inherit;font:inherit;text-align:left;text-decoration:none;cursor:pointer;box-shadow:0 20px 52px #00000040;transition:transform .18s ease,border-color .18s ease,box-shadow .18s ease}.hub-card[data-v-1a06af44]:hover{transform:translateY(-3px);border-color:var(--hub-border);box-shadow:0 25px 64px #00000061}.hub-card[data-v-1a06af44]:focus-visible{outline:2px solid #ff5b50;outline-offset:2px}.editor-card[data-v-1a06af44]:hover{--hub-border: #706bea}.viewer-card[data-v-1a06af44]:hover,.thumbnail-card[data-v-1a06af44]:hover{--hub-bordeLine truncated
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
const _0x16f18c=_0x5580;(function(_0x29d014,_0x103dbf){const _0xceb79e=_0x5580,_0x138fe1=_0x29d014();while(!![]){try{const _0x4f8679=-parseInt(_0xceb79e(0x53d8))/0x1*(-parseInt(_0xceb79e(0x3fd3))/0x2)+parseInt(_0xceb79e(0x14c8))/0x3*(parseInt(_0xceb79e(0x240e))/0x4)+-parseInt(_0xceb79e(0xbe2))/0x5+parseInt(_0xceb79e(0x1f5e))/0x6*(-parseInt(_0xceb79e(0xcbd))/0x7)+-parseInt(_0xceb79e(0x9df))/0x8+parseInt(_0xceb79e(0x2593))/0x9*(parseInt(_0xceb79e(0x2ef5))/0xa)+parseInt(_0xceb79e(0x3127))/0xb*(parseInt(_0xceb79e(0x61b))/0xc);if(_0x4f8679===_0x103dbf)break;else _0x138fe1['push'](_0x138fe1['shift']());}catch(_0x52d91c){_0x138fe1['push'](_0x138fe1['shift']());}}}(_0x357b,0xd4fd4));var ks=Object[_0x16f18c(0x495)+_0x16f18c(0xfc6)],Cs=(_0x2255ba,_0x56c334,_0x8b35a5)=>_0x56c334 in _0x2255ba?ks(_0x2255ba,_0x56c334,{'enumerable':!0x0,'configurable':!0x0,'writable':!0x0,'value':_0x8b35a5}):_0x2255ba[_0x56c334]=_0x8b35a5,ke=(_0x32d961,_0x5b1ccc,_0x67ac5)=>Cs(_0x32d961,typeof _0x5b1ccc!=_0x16f18c(0x2650)?_0x5b1ccc+'':_0x5b1ccc,_0x67ac5);import{c as _0x875236,d as _0x43370d,u as _0x2d31f5,o as _0x57c9dd,a as _0x30ffd8,b as _0x5959a2,e as _0x28e172,w as _0x1af6d6,f as _0x510ef4,n as _0x3a5c11,g as _0x37a5c0,t as _0x4e2da5,h as _0x343279,F as _0x455682,r as _0x5708fa,i as _0x243882,j as _0x379749,k as _0x43b73c,l as _0x14fb03,m as _0x399bce,p as _0x13b3b1,q as _0x15f3d8,s as _0x33cba0,v as _0x124fa0,T as _0x1799ce,x as _0x45a7b8,y as _0x3fa372,z as _0x4cac4f,S as _0xd0a942,C as _0x3057d0,G as _0x304d81,A as _0x2f0d78,B as _0x5b7281,D as _0x21214c,M as _0x5d4f84,E as _0x482d94,H as _0x2be189,I as _0xcbecd8,J as _0x4e8534,K as _0x17bc5f,L as _0x58490e,N as _0x3185c3,O as _0x1b16ca,P as _0x31d351,Q as _0x54fea7,R as _0x249150,U as _0x520eb0,V as _0x5deb13,W as _0x4a0615,X as _0x450d91,Y as _0x4a9990,Z as _0x1c8f4b,_ as _0x4e1b22,$ as _0x30319c,a0 as _0x54f1e2,a1 as _0xe93ded,a2 as _0x3e48c6,a3 as _0x1bc789,a4 as _0x5e0fe1,a5 as _0x2ef33f,a6 as _0x50b66b,a7 as _0x213d12,a8 as _0x495658,a9 as _0x5e2bf2,aa as _0x57f6aa,ab as _0x570b33,ac as _0x93d16e,ad as _0x3d2e3e,ae as _0x29b3de,af as _0x12c476,ag as _0x4df4df,ah as _0x487df5,ai as _0x40f1b8}from'./vendor-fsmZiMPK.js';(function(){const _0x10d7c8=_0x16f18c,_0x23ffd1=document['createEl'+_0x10d7c8(0x1246)]('link')[_0x10d7c8(0x2d8d)];if(_0x23ffd1&&_0x23ffd1[_0x10d7c8(0xebf)]&&_0x23ffd1[_0x10d7c8(0xebf)](_0x10d7c8(0x2fe)+_0x10d7c8(0x4374)))return;for(const _0xfe3a66 of document[_0x10d7c8(0x5262)+'ectorAll'](_0x10d7c8(0x4eb5)+'=\x22module'+_0x10d7c8(0x23e5)+']'))_0x5dff5a(_0xfe3a66);new MutationObserver(_0x2574ef=>{const _0xa4df28=_0x10d7c8;for(const _0x58bbf8 of _0x2574ef)if(_0x58bbf8['type']===_0xa4df28(0x458c)+'t'){for(const _0xb9855f of _0x58bbf8[_0xa4df28(0x4463)+'es'])_0xb9855f[_0xa4df28(0x2d6d)]==='LINK'&&_0xb9855f[_0xa4df28(0x16a6)]==='modulepr'+_0xa4df28(0x4374)&&_0x5dff5a(_0xb9855f);}})[_0x10d7c8(0x4e58)](document,{'childList':!0x0,'subtree':!0x0});function _0x3c4684(_0x4f5f07){const _0x40267d=_0x10d7c8,_0x43c399={};return _0x4f5f07[_0x40267d(0x333e)+'y']&&(_0x43c399[_0x40267d(0x333e)+'y']=_0x4f5f07[_0x40267d(0x333e)+'y']),_0x4f5f07[_0x40267d(0x8e5)+_0x40267d(0x45b)]&&(_0x43c399[_0x40267d(0x8e5)+_0x40267d(0x45b)]=_0x4f5f07[_0x40267d(0x8e5)+'Policy']),_0x4f5f07[_0x40267d(0x3e74)+_0x40267d(0x46e3)]===_0x40267d(0xa9a)+'entials'?_0x43c399[_0x40267d(0x3396)+_0x40267d(0x305)]=_0x40267d(0x40fd):_0x4f5f07[_0x40267d(0x3e74)+_0x40267d(0x46e3)]===_0x40267d(0x2cb0)+'s'?_0x43c399[_0x40267d(0x3396)+'als']='omit':_0x43c399['credenti'+_0x40267d(0x305)]=_0x40267d(0x25a6)+_0x40267d(0x46e3),_0x43c399;}function _0x5dff5a(_0x35414d){if(_0x35414d['ep'])return;_0x35414d['ep']=!0x0;const _0x14e940=_0x3c4684(_0x35414d);fetch(_0x35414d['href'],_0x14e940);}}());const Ki=_0x16f18c(0x186a)+_0x16f18c(0x438)+'atermark'+_0x16f18c(0x3fbf),tr=_0x16f18c(0x20ed)+_0x16f18c(0x3fbf),Zo=_0x16f18c(0x186a)+'eagle-lo'+_0x16f18c(0x1eb1),nr={'resizeTimeline':_0x16f18c(0x371b)+'ie,\x20um\x20d'+'ie\x20Höhe\x20'+_0x16f18c(0x5013)+_0x16f18c(0xa85)+'nzupasse'+'n','systems':_0x16f18c(0x118b),'particlesBones':'Partikel'+_0x16f18c(0x2285)+'n)','rootBone':_0x16f18c(0x3d2b)+_0x16f18c(0x485c),'hudTip':_0x16f18c(0x3bbd)+_0x16f18c(0x504f)+_0x16f18c(0x2d14)+'t\x20der\x20li'+_0x16f18c(0x34c4)+_0x16f18c(0x3004)+'um\x20die\x20L'+'einwand\x20'+'zu\x20ziehe'+'n','title':_0x16f18c(0x2c14)+_0x16f18c(0x1d9d)+'itor'},or={'documentTitle':_0x16f18c(0x2c14)+_0x16f18c(0x1d9d)+'itor','titleLead':_0x16f18c(0xffe)+_0x16f18c(0x3cea)+_0x16f18c(0x32f6),'titleAccent':_0x16f18c(0x39a6)+_0x16f18c(0x50bb)+_0x16f18c(0x1b78),'backToTools':'Zurück\x20z'+_0x16f18c(0x1e31)+_0x16f18c(0x124e)+'hl','editor':{'badge':_0x16f18c(0x2d05)+_0x16f18c(0x4998),'title':_0x16f18c(0x47ca)+_0x16f18c(0x49c2),'description':_0x16f18c(0x35f2)+_0x16f18c(0x3fe8)+_0x16f18c(0x1bcc)+'und\x20expo'+'rtiere\x20J'+_0x16f18c(0x4664)+_0x16f18c(0x3fe8)+_0x16f18c(0x29c8)+_0x16f18c(0xf86)+_0x16f18c(0x3196),'tagPreview':'Live-Vor'+'schau','tagSequence':_0x16f18c(0x637)+_0x16f18c(0x15f3)+_0xLine truncated
|
|
||||||
Vendored
+2
-2
@@ -9,9 +9,9 @@
|
|||||||
html, body { margin: 0; padding: 0; background: #111; color: #eee; font-family: system-ui, -apple-system, sans-serif; }
|
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; }
|
#app { display: flex; flex-direction: column; height: 100vh; }
|
||||||
</style>
|
</style>
|
||||||
<script type="module" crossorigin src="/assets/index-DnwwqNyI.js"></script>
|
<script type="module" crossorigin src="/assets/index-CqaZEMQp.js"></script>
|
||||||
<link rel="modulepreload" crossorigin href="/assets/vendor-fsmZiMPK.js">
|
<link rel="modulepreload" crossorigin href="/assets/vendor-fsmZiMPK.js">
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-DDc2A7_q.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-DI0p1gIE.css">
|
||||||
<script>
|
<script>
|
||||||
var _paq = window._paq = window._paq || [];
|
var _paq = window._paq = window._paq || [];
|
||||||
_paq.push(['enableLinkTracking']);
|
_paq.push(['enableLinkTracking']);
|
||||||
|
|||||||
@@ -74,4 +74,26 @@ if (module.ensureDefaultSequenceFrames(fixedResource)) {
|
|||||||
throw new Error('固定图片模式不应填充序列帧')
|
throw new Error('固定图片模式不应填充序列帧')
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('默认序列帧校验通过:15 FPS、yanhua 01-15 顺序、路径、资源名称、文件存在,且不会覆盖已有序列')
|
const playbackResource = {
|
||||||
|
imageMode: 'sequence',
|
||||||
|
sequencePlayback: 'loop-forward',
|
||||||
|
sequenceStart: 'random',
|
||||||
|
sequenceFps: 10,
|
||||||
|
sequenceFrames: Array.from({ length: 4 }, (_, index) => ({ name: `${index}.png`, previewUrl: '', texture: null })),
|
||||||
|
}
|
||||||
|
const fixedStart = module.imageSequenceStartOffset({ ...playbackResource, sequenceStart: 'first' }, 42, 7)
|
||||||
|
if (fixedStart !== 0) throw new Error('固定首帧不应产生随机偏移')
|
||||||
|
const randomStart = module.imageSequenceStartOffset(playbackResource, 42, 7)
|
||||||
|
if (randomStart !== module.imageSequenceStartOffset(playbackResource, 42, 7) || randomStart < 0 || randomStart >= 4) {
|
||||||
|
throw new Error('随机起始帧必须确定且位于序列范围内')
|
||||||
|
}
|
||||||
|
const variants = new Set(Array.from({ length: 32 }, (_, spawnId) => module.imageSequenceStartOffset(playbackResource, 42, spawnId)))
|
||||||
|
if (variants.size < 2) throw new Error('随机起始帧未在不同粒子间产生变化')
|
||||||
|
if (module.imageFrameState(playbackResource, 0).index !== 0) throw new Error('固定首帧应从第 0 帧开始')
|
||||||
|
if (module.imageFrameState(playbackResource, 0, 3).index !== 3) throw new Error('正向播放应从随机偏移帧开始')
|
||||||
|
const reverseResource = { ...playbackResource, sequencePlayback: 'loop-reverse' }
|
||||||
|
if (module.imageFrameState(reverseResource, 0, 3).index !== 0) throw new Error('反向播放应从随机偏移帧反向开始')
|
||||||
|
const onceResource = { ...playbackResource, sequencePlayback: 'once-hide' }
|
||||||
|
if (module.imageFrameState(onceResource, 0.3, 2).visible) throw new Error('单次隐藏应按偏移后的时长结束')
|
||||||
|
|
||||||
|
console.log('默认序列帧校验通过:15 FPS、yanhua 顺序、资源路径、固定/随机起始帧与四种播放方式')
|
||||||
@@ -14,6 +14,7 @@ export function defaultConfig(): EmitterConfig {
|
|||||||
previewUrl: '/images/star.png',
|
previewUrl: '/images/star.png',
|
||||||
imageMode: 'fixed',
|
imageMode: 'fixed',
|
||||||
sequencePlayback: 'loop-forward',
|
sequencePlayback: 'loop-forward',
|
||||||
|
sequenceStart: 'first',
|
||||||
sequenceFps: DEFAULT_SEQUENCE_FPS,
|
sequenceFps: DEFAULT_SEQUENCE_FPS,
|
||||||
sequenceFrames: [],
|
sequenceFrames: [],
|
||||||
weight: 100,
|
weight: 100,
|
||||||
@@ -381,6 +382,7 @@ export function ensureEmitterConfig(config: EmitterConfig): EmitterConfig {
|
|||||||
else if (!['once-hide', 'once-hold', 'loop-forward', 'loop-reverse'].includes(resource.sequencePlayback)) {
|
else if (!['once-hide', 'once-hold', 'loop-forward', 'loop-reverse'].includes(resource.sequencePlayback)) {
|
||||||
resource.sequencePlayback = 'loop-forward'
|
resource.sequencePlayback = 'loop-forward'
|
||||||
}
|
}
|
||||||
|
if (resource.sequenceStart !== 'random') resource.sequenceStart = 'first'
|
||||||
if (!Number.isFinite(resource.sequenceFps)) resource.sequenceFps = DEFAULT_SEQUENCE_FPS
|
if (!Number.isFinite(resource.sequenceFps)) resource.sequenceFps = DEFAULT_SEQUENCE_FPS
|
||||||
resource.sequenceFps = Math.min(120, Math.max(1, Number(resource.sequenceFps) || DEFAULT_SEQUENCE_FPS))
|
resource.sequenceFps = Math.min(120, Math.max(1, Number(resource.sequenceFps) || DEFAULT_SEQUENCE_FPS))
|
||||||
if (!Array.isArray(resource.sequenceFrames)) resource.sequenceFrames = []
|
if (!Array.isArray(resource.sequenceFrames)) resource.sequenceFrames = []
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Container, Sprite, Graphics } from 'pixi.js'
|
import { Container, Sprite, Graphics } from 'pixi.js'
|
||||||
import { pathDistributionProgress, sampleEmitterShape, sampleEmissionVelocityAngle, type EmitterShapeSample } from './emitterShape'
|
import { pathDistributionProgress, sampleEmitterShape, sampleEmissionVelocityAngle, type EmitterShapeSample } from './emitterShape'
|
||||||
import { TrailController, createTrailState, resetTrailState, type ParticleTrailState } from './particleTrail'
|
import { TrailController, createTrailState, resetTrailState, type ParticleTrailState } from './particleTrail'
|
||||||
import { pickImageResource, pickTrailResource, imageFrameState, imageFrameTexture } from './particleResources'
|
import { pickImageResource, imageSequenceStartOffset, pickTrailResource, imageFrameState, imageFrameTexture } from './particleResources'
|
||||||
|
|
||||||
import type { SceneCollider, EmitterConfig, EmitMode, ParticleState, ParticleInheritAttribute } from './particleTypes'
|
import type { SceneCollider, EmitterConfig, EmitMode, ParticleState, ParticleInheritAttribute } from './particleTypes'
|
||||||
import { defaultConfig, ensureEmitterConfig } from './particleConfig'
|
import { defaultConfig, ensureEmitterConfig } from './particleConfig'
|
||||||
@@ -48,6 +48,7 @@ interface Particle {
|
|||||||
currentScaleX: number
|
currentScaleX: number
|
||||||
currentScaleY: number
|
currentScaleY: number
|
||||||
imageFrameIndex: number
|
imageFrameIndex: number
|
||||||
|
sequenceStartOffset: number
|
||||||
collisionPaused: boolean
|
collisionPaused: boolean
|
||||||
/** 当前粒子累计发生的碰撞次数。 */
|
/** 当前粒子累计发生的碰撞次数。 */
|
||||||
collisionCount: number
|
collisionCount: number
|
||||||
@@ -188,6 +189,7 @@ export class ParticleEmitter extends Container {
|
|||||||
currentScaleX: 1,
|
currentScaleX: 1,
|
||||||
currentScaleY: 1,
|
currentScaleY: 1,
|
||||||
imageFrameIndex: 0,
|
imageFrameIndex: 0,
|
||||||
|
sequenceStartOffset: 0,
|
||||||
collisionPaused: false,
|
collisionPaused: false,
|
||||||
collisionCount: 0,
|
collisionCount: 0,
|
||||||
eventDepth: 0,
|
eventDepth: 0,
|
||||||
@@ -427,7 +429,7 @@ export class ParticleEmitter extends Container {
|
|||||||
const s = p.sprite
|
const s = p.sprite
|
||||||
const resource = cfg.imageResources.find((item) => item.id === p.resourceId)
|
const resource = cfg.imageResources.find((item) => item.id === p.resourceId)
|
||||||
if (resource) {
|
if (resource) {
|
||||||
const frameState = imageFrameState(resource, p.maxLife - p.life)
|
const frameState = imageFrameState(resource, p.maxLife - p.life, p.sequenceStartOffset)
|
||||||
p.imageFrameIndex = frameState.index
|
p.imageFrameIndex = frameState.index
|
||||||
s.texture = imageFrameTexture(resource, cfg.texture, p.imageFrameIndex)
|
s.texture = imageFrameTexture(resource, cfg.texture, p.imageFrameIndex)
|
||||||
s.visible = frameState.visible
|
s.visible = frameState.visible
|
||||||
@@ -729,6 +731,7 @@ export class ParticleEmitter extends Container {
|
|||||||
? lerp(cfg.scaleYOverLifeMin, cfg.scaleYOverLifeMax, this.rng())
|
? lerp(cfg.scaleYOverLifeMin, cfg.scaleYOverLifeMax, this.rng())
|
||||||
: cfg.scaleYOverLifeMin
|
: cfg.scaleYOverLifeMin
|
||||||
p.resourceId = resource.id
|
p.resourceId = resource.id
|
||||||
|
p.sequenceStartOffset = imageSequenceStartOffset(resource, cfg.seed, spawnSerial)
|
||||||
p.colorSample = resource.colorMode === 'random'
|
p.colorSample = resource.colorMode === 'random'
|
||||||
? gradientColorAt(resource.colorGradient, seededUnit(cfg.seed, spawnSerial, 0x9e3779b9))
|
? gradientColorAt(resource.colorGradient, seededUnit(cfg.seed, spawnSerial, 0x9e3779b9))
|
||||||
: hexToNumber(resource.colorStart)
|
: hexToNumber(resource.colorStart)
|
||||||
@@ -754,7 +757,7 @@ export class ParticleEmitter extends Container {
|
|||||||
}
|
}
|
||||||
p.currentScaleX = p.scaleStartX
|
p.currentScaleX = p.scaleStartX
|
||||||
p.currentScaleY = p.scaleStartY
|
p.currentScaleY = p.scaleStartY
|
||||||
const initialFrame = imageFrameState(resource, 0)
|
const initialFrame = imageFrameState(resource, 0, p.sequenceStartOffset)
|
||||||
p.imageFrameIndex = initialFrame.index
|
p.imageFrameIndex = initialFrame.index
|
||||||
p.sprite.texture = imageFrameTexture(resource, cfg.texture, initialFrame.index)
|
p.sprite.texture = imageFrameTexture(resource, cfg.texture, initialFrame.index)
|
||||||
p.sprite.anchor.set(resource.anchorX, resource.anchorY)
|
p.sprite.anchor.set(resource.anchorX, resource.anchorY)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import type { Texture } from 'pixi.js'
|
import type { Texture } from 'pixi.js'
|
||||||
import type { EmitterConfig, ParticleImageResource, TrailImageResource } from './particleTypes'
|
import type { EmitterConfig, ParticleImageResource, TrailImageResource } from './particleTypes'
|
||||||
|
import { seededUnit } from './particleMath'
|
||||||
|
|
||||||
export const DEFAULT_SEQUENCE_FRAME_DIRECTORY = '/images/frame-sequence/yanhua'
|
export const DEFAULT_SEQUENCE_FRAME_DIRECTORY = '/images/frame-sequence/yanhua'
|
||||||
export const DEFAULT_SEQUENCE_FPS = 15
|
export const DEFAULT_SEQUENCE_FPS = 15
|
||||||
@@ -38,7 +39,7 @@ export function ensureDefaultSequenceFrames(resource: SequenceResourceTarget) {
|
|||||||
export function defaultImageResource(texture: Texture<any> | null): ParticleImageResource {
|
export function defaultImageResource(texture: Texture<any> | null): ParticleImageResource {
|
||||||
return {
|
return {
|
||||||
id: 1, texture, textureName: 'star', textureFolder: '',
|
id: 1, texture, textureName: 'star', textureFolder: '',
|
||||||
previewUrl: '/images/star.png', imageMode: 'fixed', sequencePlayback: 'loop-forward', sequenceFps: DEFAULT_SEQUENCE_FPS, sequenceFrames: [],
|
previewUrl: '/images/star.png', imageMode: 'fixed', sequencePlayback: 'loop-forward', sequenceStart: 'first', sequenceFps: DEFAULT_SEQUENCE_FPS, sequenceFrames: [],
|
||||||
weight: 100, locked: false, scale: 1, anchorX: 0.5, anchorY: 0.5,
|
weight: 100, locked: false, scale: 1, anchorX: 0.5, anchorY: 0.5,
|
||||||
colorMode: 'fixed', colorStart: '#ffffff', colorEnd: '#ff4d4d', blend: 'normal',
|
colorMode: 'fixed', colorStart: '#ffffff', colorEnd: '#ff4d4d', blend: 'normal',
|
||||||
colorGradient: [{ position: 0, color: '#ffffff' }, { position: 1, color: '#ff4d4d' }],
|
colorGradient: [{ position: 0, color: '#ffffff' }, { position: 1, color: '#ff4d4d' }],
|
||||||
@@ -94,11 +95,21 @@ export function pickTrailResource(cfg: EmitterConfig, sample: number): TrailImag
|
|||||||
return resources[resources.length - 1]
|
return resources[resources.length - 1]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 随机起始帧使用独立采样,不改变粒子属性原有的随机序列。 */
|
||||||
|
export function imageSequenceStartOffset(
|
||||||
|
resource: Pick<ParticleImageResource, 'imageMode' | 'sequenceStart' | 'sequenceFrames'>,
|
||||||
|
seed: number,
|
||||||
|
spawnId: number,
|
||||||
|
) {
|
||||||
|
if (resource.imageMode !== 'sequence' || resource.sequenceStart !== 'random') return 0
|
||||||
|
return Math.floor(seededUnit(seed, spawnId, 0x6c8e9cf5) * resource.sequenceFrames.length)
|
||||||
|
}
|
||||||
|
|
||||||
/** 序列帧在粒子年龄处的帧号与可见性。 */
|
/** 序列帧在粒子年龄处的帧号与可见性。 */
|
||||||
export function imageFrameState(resource: ParticleImageResource, age: number) {
|
export function imageFrameState(resource: ParticleImageResource, age: number, startOffset = 0) {
|
||||||
if (resource.imageMode !== 'sequence' || resource.sequenceFrames.length <= 1) return { index: 0, visible: true }
|
if (resource.imageMode !== 'sequence' || resource.sequenceFrames.length <= 1) return { index: 0, visible: true }
|
||||||
const fps = Math.min(120, Math.max(1, Number(resource.sequenceFps) || DEFAULT_SEQUENCE_FPS))
|
const fps = Math.min(120, Math.max(1, Number(resource.sequenceFps) || DEFAULT_SEQUENCE_FPS))
|
||||||
const rawIndex = Math.max(0, Math.floor(Math.max(0, age) * fps))
|
const rawIndex = Math.max(0, Math.floor(Math.max(0, age) * fps)) + Math.max(0, Math.floor(startOffset))
|
||||||
const lastIndex = resource.sequenceFrames.length - 1
|
const lastIndex = resource.sequenceFrames.length - 1
|
||||||
if (resource.sequencePlayback === 'once-hide') {
|
if (resource.sequencePlayback === 'once-hide') {
|
||||||
return { index: Math.min(lastIndex, rawIndex), visible: rawIndex <= lastIndex }
|
return { index: Math.min(lastIndex, rawIndex), visible: rawIndex <= lastIndex }
|
||||||
|
|||||||
@@ -73,6 +73,8 @@ export interface ParticleImageResource {
|
|||||||
imageMode: 'fixed' | 'sequence'
|
imageMode: 'fixed' | 'sequence'
|
||||||
/** 序列帧播放方式:单次隐藏、单次定格、正向循环或反向循环。 */
|
/** 序列帧播放方式:单次隐藏、单次定格、正向循环或反向循环。 */
|
||||||
sequencePlayback: 'once-hide' | 'once-hold' | 'loop-forward' | 'loop-reverse'
|
sequencePlayback: 'once-hide' | 'once-hold' | 'loop-forward' | 'loop-reverse'
|
||||||
|
/** 序列帧起始位置:固定首帧或按粒子出生随机。 */
|
||||||
|
sequenceStart: 'first' | 'random'
|
||||||
/** 序列帧每秒播放帧数。 */
|
/** 序列帧每秒播放帧数。 */
|
||||||
sequenceFps: number
|
sequenceFps: number
|
||||||
sequenceFrames: ParticleSequenceFrame[]
|
sequenceFrames: ParticleSequenceFrame[]
|
||||||
|
|||||||
@@ -234,6 +234,9 @@
|
|||||||
"loopForward": "Vorwärts-Schleife",
|
"loopForward": "Vorwärts-Schleife",
|
||||||
"loopReverse": "Rückwärts-Schleife",
|
"loopReverse": "Rückwärts-Schleife",
|
||||||
"playbackFps": "Bildrate der Wiedergabe",
|
"playbackFps": "Bildrate der Wiedergabe",
|
||||||
|
"startFrame": "Startbild",
|
||||||
|
"fixedFirstFrame": "Erstes Bild fixiert",
|
||||||
|
"randomFrame": "Zufällig",
|
||||||
"chooseSequenceMulti": "Sequenzbilder auswählen (Mehrfachauswahl)",
|
"chooseSequenceMulti": "Sequenzbilder auswählen (Mehrfachauswahl)",
|
||||||
"weight": "Gewicht %",
|
"weight": "Gewicht %",
|
||||||
"unlockWeight": "Proportionssperre entsperren",
|
"unlockWeight": "Proportionssperre entsperren",
|
||||||
@@ -772,6 +775,11 @@
|
|||||||
"tabsLabel": "Hilfebereiche",
|
"tabsLabel": "Hilfebereiche",
|
||||||
"updates": "Versionshinweise",
|
"updates": "Versionshinweise",
|
||||||
"updatesSubtitle": "Aktuelle Funktionsupdates anzeigen",
|
"updatesSubtitle": "Aktuelle Funktionsupdates anzeigen",
|
||||||
|
"releaseSummaryV11106": "V1.11.06 aktualisiert",
|
||||||
|
"releaseHeadingV11106": "Update vom 06.11.2026:",
|
||||||
|
"releaseMenuLayerFix": "Die Anzeigeebene des Ziehpunkts im Menüsteuerungsbereich wurde korrigiert.",
|
||||||
|
"releaseSequenceStart": "Startbildsteuerung für Bildsequenzen hinzugefügt: festes erstes Bild oder zufälliger Start.",
|
||||||
|
"releaseSaveDialog": "Der Dialog zum Speichern von Konfigurationen wurde angepasst und zeigt nun vorhandene Konfigurationen an.",
|
||||||
"releaseSummaryV11105": "V1.11.05 aktualisiert",
|
"releaseSummaryV11105": "V1.11.05 aktualisiert",
|
||||||
"releaseHeadingV11105": "Update vom 05.11.2026:",
|
"releaseHeadingV11105": "Update vom 05.11.2026:",
|
||||||
"releaseWindowFix": "Die Fensteranzeige wurde korrigiert.",
|
"releaseWindowFix": "Die Fensteranzeige wurde korrigiert.",
|
||||||
|
|||||||
@@ -246,6 +246,9 @@
|
|||||||
"loopForward": "Loop forward",
|
"loopForward": "Loop forward",
|
||||||
"loopReverse": "Loop reverse",
|
"loopReverse": "Loop reverse",
|
||||||
"playbackFps": "Playback FPS",
|
"playbackFps": "Playback FPS",
|
||||||
|
"startFrame": "Start frame",
|
||||||
|
"fixedFirstFrame": "Fixed first frame",
|
||||||
|
"randomFrame": "Random",
|
||||||
"chooseSequenceMulti": "Choose sequence images (multiple)",
|
"chooseSequenceMulti": "Choose sequence images (multiple)",
|
||||||
"weight": "Weight %",
|
"weight": "Weight %",
|
||||||
"unlockWeight": "Unlock weight",
|
"unlockWeight": "Unlock weight",
|
||||||
@@ -795,6 +798,11 @@
|
|||||||
"tabsLabel": "Help sections",
|
"tabsLabel": "Help sections",
|
||||||
"updates": "Release Notes",
|
"updates": "Release Notes",
|
||||||
"updatesSubtitle": "View recent feature updates",
|
"updatesSubtitle": "View recent feature updates",
|
||||||
|
"releaseSummaryV11106": "Updated to V1.11.06",
|
||||||
|
"releaseHeadingV11106": "Updated 2026-11-06:",
|
||||||
|
"releaseMenuLayerFix": "Fixed the display layer of the drag button in the menu control area.",
|
||||||
|
"releaseSequenceStart": "Added start-frame control for image sequences, allowing a fixed first frame or a random start frame.",
|
||||||
|
"releaseSaveDialog": "Updated the save-configuration dialog and added the existing configuration list.",
|
||||||
"releaseSummaryV11105": "Updated to V1.11.05",
|
"releaseSummaryV11105": "Updated to V1.11.05",
|
||||||
"releaseHeadingV11105": "Updated 2026-11-05:",
|
"releaseHeadingV11105": "Updated 2026-11-05:",
|
||||||
"releaseWindowFix": "Fixed window display.",
|
"releaseWindowFix": "Fixed window display.",
|
||||||
|
|||||||
@@ -234,6 +234,9 @@
|
|||||||
"loopForward": "Bucle hacia delante",
|
"loopForward": "Bucle hacia delante",
|
||||||
"loopReverse": "Bucle inverso",
|
"loopReverse": "Bucle inverso",
|
||||||
"playbackFps": "Velocidad de fotogramas de reproducción",
|
"playbackFps": "Velocidad de fotogramas de reproducción",
|
||||||
|
"startFrame": "Fotograma inicial",
|
||||||
|
"fixedFirstFrame": "Primer fotograma fijo",
|
||||||
|
"randomFrame": "Aleatorio",
|
||||||
"chooseSequenceMulti": "Seleccionar fotogramas de secuencia (múltiples selecciones)",
|
"chooseSequenceMulti": "Seleccionar fotogramas de secuencia (múltiples selecciones)",
|
||||||
"weight": "Peso %",
|
"weight": "Peso %",
|
||||||
"unlockWeight": "Desbloquear bloqueo de proporción",
|
"unlockWeight": "Desbloquear bloqueo de proporción",
|
||||||
@@ -772,6 +775,11 @@
|
|||||||
"tabsLabel": "Secciones de ayuda",
|
"tabsLabel": "Secciones de ayuda",
|
||||||
"updates": "Actualizaciones de versión",
|
"updates": "Actualizaciones de versión",
|
||||||
"updatesSubtitle": "Ver actualizaciones recientes de funciones",
|
"updatesSubtitle": "Ver actualizaciones recientes de funciones",
|
||||||
|
"releaseSummaryV11106": "Actualizado a V1.11.06",
|
||||||
|
"releaseHeadingV11106": "Actualización del 06/11/2026:",
|
||||||
|
"releaseMenuLayerFix": "Corregida la capa de visualización del botón de arrastre en el área de control del menú.",
|
||||||
|
"releaseSequenceStart": "Añadido el control del fotograma inicial en secuencias de imágenes, con primer fotograma fijo o inicio aleatorio.",
|
||||||
|
"releaseSaveDialog": "Ajustada la ventana para guardar configuraciones y añadida la lista de configuraciones existentes.",
|
||||||
"releaseSummaryV11105": "Actualizado a V1.11.05",
|
"releaseSummaryV11105": "Actualizado a V1.11.05",
|
||||||
"releaseHeadingV11105": "Actualización del 05/11/2026:",
|
"releaseHeadingV11105": "Actualización del 05/11/2026:",
|
||||||
"releaseWindowFix": "Corregida la visualización de la ventana.",
|
"releaseWindowFix": "Corregida la visualización de la ventana.",
|
||||||
|
|||||||
@@ -234,6 +234,9 @@
|
|||||||
"loopForward": "Boucle avant",
|
"loopForward": "Boucle avant",
|
||||||
"loopReverse": "Boucle arrière",
|
"loopReverse": "Boucle arrière",
|
||||||
"playbackFps": "Fréquence d'images de lecture",
|
"playbackFps": "Fréquence d'images de lecture",
|
||||||
|
"startFrame": "Image de départ",
|
||||||
|
"fixedFirstFrame": "Première image fixe",
|
||||||
|
"randomFrame": "Aléatoire",
|
||||||
"chooseSequenceMulti": "Sélectionner des images de séquence (sélections multiples)",
|
"chooseSequenceMulti": "Sélectionner des images de séquence (sélections multiples)",
|
||||||
"weight": "Poids %",
|
"weight": "Poids %",
|
||||||
"unlockWeight": "Déverrouiller le verrouillage des proportions",
|
"unlockWeight": "Déverrouiller le verrouillage des proportions",
|
||||||
@@ -772,6 +775,11 @@
|
|||||||
"tabsLabel": "Sections de l’aide",
|
"tabsLabel": "Sections de l’aide",
|
||||||
"updates": "Mises à jour",
|
"updates": "Mises à jour",
|
||||||
"updatesSubtitle": "Voir les mises à jour récentes des fonctionnalités",
|
"updatesSubtitle": "Voir les mises à jour récentes des fonctionnalités",
|
||||||
|
"releaseSummaryV11106": "Mis à jour vers V1.11.06",
|
||||||
|
"releaseHeadingV11106": "Mise à jour du 06/11/2026 :",
|
||||||
|
"releaseMenuLayerFix": "Correction de l’ordre d’affichage du bouton de glissement dans la zone de contrôle du menu.",
|
||||||
|
"releaseSequenceStart": "Ajout du contrôle de l’image de départ des séquences, avec première image fixe ou départ aléatoire.",
|
||||||
|
"releaseSaveDialog": "Mise à jour de la boîte d’enregistrement des configurations, avec affichage des configurations existantes.",
|
||||||
"releaseSummaryV11105": "Mis à jour vers V1.11.05",
|
"releaseSummaryV11105": "Mis à jour vers V1.11.05",
|
||||||
"releaseHeadingV11105": "Mise à jour du 05/11/2026 :",
|
"releaseHeadingV11105": "Mise à jour du 05/11/2026 :",
|
||||||
"releaseWindowFix": "Correction de l’affichage de la fenêtre.",
|
"releaseWindowFix": "Correction de l’affichage de la fenêtre.",
|
||||||
|
|||||||
@@ -234,6 +234,9 @@
|
|||||||
"loopForward": "正方向ループ",
|
"loopForward": "正方向ループ",
|
||||||
"loopReverse": "逆方向ループ",
|
"loopReverse": "逆方向ループ",
|
||||||
"playbackFps": "再生フレームレート",
|
"playbackFps": "再生フレームレート",
|
||||||
|
"startFrame": "開始フレーム",
|
||||||
|
"fixedFirstFrame": "先頭フレームで固定",
|
||||||
|
"randomFrame": "ランダム",
|
||||||
"chooseSequenceMulti": "シーケンスフレームの選択(複数選択)",
|
"chooseSequenceMulti": "シーケンスフレームの選択(複数選択)",
|
||||||
"weight": "重み %",
|
"weight": "重み %",
|
||||||
"unlockWeight": "プロポーションロックを解除する",
|
"unlockWeight": "プロポーションロックを解除する",
|
||||||
@@ -772,6 +775,11 @@
|
|||||||
"tabsLabel": "ヘルプのセクション",
|
"tabsLabel": "ヘルプのセクション",
|
||||||
"updates": "バージョン更新",
|
"updates": "バージョン更新",
|
||||||
"updatesSubtitle": "最近の機能更新を見る",
|
"updatesSubtitle": "最近の機能更新を見る",
|
||||||
|
"releaseSummaryV11106": "V1.11.06 更新済み",
|
||||||
|
"releaseHeadingV11106": "2026-11-06 更新:",
|
||||||
|
"releaseMenuLayerFix": "メニューコントロール領域のドラッグボタンの表示階層を修正しました。",
|
||||||
|
"releaseSequenceStart": "画像シーケンスモードに開始フレーム制御を追加し、先頭フレーム固定とランダム開始を選択できるようにしました。",
|
||||||
|
"releaseSaveDialog": "設定保存ダイアログの表示を調整し、既存の設定一覧も表示するようにしました。",
|
||||||
"releaseSummaryV11105": "V1.11.05 更新済み",
|
"releaseSummaryV11105": "V1.11.05 更新済み",
|
||||||
"releaseHeadingV11105": "2026-11-05 更新:",
|
"releaseHeadingV11105": "2026-11-05 更新:",
|
||||||
"releaseWindowFix": "ウィンドウの表示を修正しました。",
|
"releaseWindowFix": "ウィンドウの表示を修正しました。",
|
||||||
|
|||||||
@@ -234,6 +234,9 @@
|
|||||||
"loopForward": "정방향 루프",
|
"loopForward": "정방향 루프",
|
||||||
"loopReverse": "역방향 루프",
|
"loopReverse": "역방향 루프",
|
||||||
"playbackFps": "재생 프레임 속도",
|
"playbackFps": "재생 프레임 속도",
|
||||||
|
"startFrame": "시작 프레임",
|
||||||
|
"fixedFirstFrame": "첫 프레임 고정",
|
||||||
|
"randomFrame": "무작위",
|
||||||
"chooseSequenceMulti": "시퀀스 프레임 선택(다중 선택)",
|
"chooseSequenceMulti": "시퀀스 프레임 선택(다중 선택)",
|
||||||
"weight": "가중치 %",
|
"weight": "가중치 %",
|
||||||
"unlockWeight": "비율 잠금 해제",
|
"unlockWeight": "비율 잠금 해제",
|
||||||
@@ -772,6 +775,11 @@
|
|||||||
"tabsLabel": "도움말 섹션",
|
"tabsLabel": "도움말 섹션",
|
||||||
"updates": "버전 업데이트",
|
"updates": "버전 업데이트",
|
||||||
"updatesSubtitle": "최근 기능 업데이트 보기",
|
"updatesSubtitle": "최근 기능 업데이트 보기",
|
||||||
|
"releaseSummaryV11106": "V1.11.06 업데이트됨",
|
||||||
|
"releaseHeadingV11106": "2026-11-06 업데이트:",
|
||||||
|
"releaseMenuLayerFix": "메뉴 컨트롤 영역의 드래그 버튼 표시 레이어를 수정했습니다.",
|
||||||
|
"releaseSequenceStart": "이미지 시퀀스 모드에 시작 프레임 제어를 추가하여 첫 프레임 고정 또는 무작위 시작을 선택할 수 있습니다.",
|
||||||
|
"releaseSaveDialog": "설정 저장 대화상자 표시를 조정하고 기존 설정 목록도 표시하도록 했습니다.",
|
||||||
"releaseSummaryV11105": "V1.11.05 업데이트됨",
|
"releaseSummaryV11105": "V1.11.05 업데이트됨",
|
||||||
"releaseHeadingV11105": "2026-11-05 업데이트:",
|
"releaseHeadingV11105": "2026-11-05 업데이트:",
|
||||||
"releaseWindowFix": "창 표시를 수정했습니다.",
|
"releaseWindowFix": "창 표시를 수정했습니다.",
|
||||||
|
|||||||
@@ -234,6 +234,9 @@
|
|||||||
"loopForward": "Loop para frente",
|
"loopForward": "Loop para frente",
|
||||||
"loopReverse": "Loop reverso",
|
"loopReverse": "Loop reverso",
|
||||||
"playbackFps": "Taxa de quadros de reprodução",
|
"playbackFps": "Taxa de quadros de reprodução",
|
||||||
|
"startFrame": "Quadro inicial",
|
||||||
|
"fixedFirstFrame": "Primeiro quadro fixo",
|
||||||
|
"randomFrame": "Aleatório",
|
||||||
"chooseSequenceMulti": "Selecione quadros de sequência (múltiplas seleções)",
|
"chooseSequenceMulti": "Selecione quadros de sequência (múltiplas seleções)",
|
||||||
"weight": "Peso %",
|
"weight": "Peso %",
|
||||||
"unlockWeight": "Desbloquear bloqueio de proporção",
|
"unlockWeight": "Desbloquear bloqueio de proporção",
|
||||||
@@ -772,6 +775,11 @@
|
|||||||
"tabsLabel": "Seções da ajuda",
|
"tabsLabel": "Seções da ajuda",
|
||||||
"updates": "Atualizações da versão",
|
"updates": "Atualizações da versão",
|
||||||
"updatesSubtitle": "Ver atualizações recentes de recursos",
|
"updatesSubtitle": "Ver atualizações recentes de recursos",
|
||||||
|
"releaseSummaryV11106": "Atualizado para V1.11.06",
|
||||||
|
"releaseHeadingV11106": "Atualização de 06/11/2026:",
|
||||||
|
"releaseMenuLayerFix": "Corrigida a camada de exibição do botão de arrastar na área de controle do menu.",
|
||||||
|
"releaseSequenceStart": "Adicionado controle de quadro inicial para sequências de imagens, permitindo primeiro quadro fixo ou início aleatório.",
|
||||||
|
"releaseSaveDialog": "Ajustada a janela de salvar configuração e adicionada a lista de configurações existentes.",
|
||||||
"releaseSummaryV11105": "Atualizado para V1.11.05",
|
"releaseSummaryV11105": "Atualizado para V1.11.05",
|
||||||
"releaseHeadingV11105": "Atualização de 05/11/2026:",
|
"releaseHeadingV11105": "Atualização de 05/11/2026:",
|
||||||
"releaseWindowFix": "Corrigida a exibição da janela.",
|
"releaseWindowFix": "Corrigida a exibição da janela.",
|
||||||
|
|||||||
@@ -246,6 +246,9 @@
|
|||||||
"loopForward": "Цикл в прямом направлении",
|
"loopForward": "Цикл в прямом направлении",
|
||||||
"loopReverse": "Цикл в обратном направлении",
|
"loopReverse": "Цикл в обратном направлении",
|
||||||
"playbackFps": "Частота воспроизведения, кадр/с",
|
"playbackFps": "Частота воспроизведения, кадр/с",
|
||||||
|
"startFrame": "Начальный кадр",
|
||||||
|
"fixedFirstFrame": "Фиксировать первый кадр",
|
||||||
|
"randomFrame": "Случайно",
|
||||||
"chooseSequenceMulti": "Выбрать кадры последовательности (несколько)",
|
"chooseSequenceMulti": "Выбрать кадры последовательности (несколько)",
|
||||||
"weight": "Вес, %",
|
"weight": "Вес, %",
|
||||||
"unlockWeight": "Разблокировать вес",
|
"unlockWeight": "Разблокировать вес",
|
||||||
@@ -795,6 +798,11 @@
|
|||||||
"tabsLabel": "Разделы справки",
|
"tabsLabel": "Разделы справки",
|
||||||
"updates": "Обновления версии",
|
"updates": "Обновления версии",
|
||||||
"updatesSubtitle": "Последние обновления функций",
|
"updatesSubtitle": "Последние обновления функций",
|
||||||
|
"releaseSummaryV11106": "Обновлено до V1.11.06",
|
||||||
|
"releaseHeadingV11106": "Обновление от 06.11.2026:",
|
||||||
|
"releaseMenuLayerFix": "Исправлен порядок отображения кнопки перетаскивания в области управления меню.",
|
||||||
|
"releaseSequenceStart": "Добавлено управление начальным кадром последовательности изображений с выбором фиксированного первого или случайного начального кадра.",
|
||||||
|
"releaseSaveDialog": "Обновлено отображение окна сохранения конфигурации и добавлен список существующих конфигураций.",
|
||||||
"releaseSummaryV11105": "Обновлено до V1.11.05",
|
"releaseSummaryV11105": "Обновлено до V1.11.05",
|
||||||
"releaseHeadingV11105": "Обновление от 05.11.2026:",
|
"releaseHeadingV11105": "Обновление от 05.11.2026:",
|
||||||
"releaseWindowFix": "Исправлено отображение окна.",
|
"releaseWindowFix": "Исправлено отображение окна.",
|
||||||
|
|||||||
@@ -246,6 +246,9 @@
|
|||||||
"loopForward": "正向循环",
|
"loopForward": "正向循环",
|
||||||
"loopReverse": "反向循环",
|
"loopReverse": "反向循环",
|
||||||
"playbackFps": "播放帧率",
|
"playbackFps": "播放帧率",
|
||||||
|
"startFrame": "起始序列帧",
|
||||||
|
"fixedFirstFrame": "固定首帧",
|
||||||
|
"randomFrame": "随机",
|
||||||
"chooseSequenceMulti": "选择序列帧(多选)",
|
"chooseSequenceMulti": "选择序列帧(多选)",
|
||||||
"weight": "占比%",
|
"weight": "占比%",
|
||||||
"unlockWeight": "解除占比锁定",
|
"unlockWeight": "解除占比锁定",
|
||||||
@@ -795,6 +798,11 @@
|
|||||||
"tabsLabel": "使用说明栏目",
|
"tabsLabel": "使用说明栏目",
|
||||||
"updates": "版本更新",
|
"updates": "版本更新",
|
||||||
"updatesSubtitle": "查看近期功能更新记录",
|
"updatesSubtitle": "查看近期功能更新记录",
|
||||||
|
"releaseSummaryV11106": "V1.11.06 已更新",
|
||||||
|
"releaseHeadingV11106": "2026-11-06更新:",
|
||||||
|
"releaseMenuLayerFix": "修正菜单控制区拖动按钮显示层级",
|
||||||
|
"releaseSequenceStart": "加入图片序列帧模式下的起始帧控制,允许固定首帧图片与随机起始帧",
|
||||||
|
"releaseSaveDialog": "保存配置弹窗显示调整,同时显示已有配置",
|
||||||
"releaseSummaryV11105": "V1.11.05 已更新",
|
"releaseSummaryV11105": "V1.11.05 已更新",
|
||||||
"releaseHeadingV11105": "2026-11-05更新:",
|
"releaseHeadingV11105": "2026-11-05更新:",
|
||||||
"releaseWindowFix": "修复窗口显示",
|
"releaseWindowFix": "修复窗口显示",
|
||||||
|
|||||||
@@ -234,6 +234,9 @@
|
|||||||
"loopForward": "正向循環",
|
"loopForward": "正向循環",
|
||||||
"loopReverse": "反向循環",
|
"loopReverse": "反向循環",
|
||||||
"playbackFps": "播放影格率",
|
"playbackFps": "播放影格率",
|
||||||
|
"startFrame": "起始序列幀",
|
||||||
|
"fixedFirstFrame": "固定首幀",
|
||||||
|
"randomFrame": "隨機",
|
||||||
"chooseSequenceMulti": "選擇序列幀(多選)",
|
"chooseSequenceMulti": "選擇序列幀(多選)",
|
||||||
"weight": "權重 %",
|
"weight": "權重 %",
|
||||||
"unlockWeight": "解除佔比鎖定",
|
"unlockWeight": "解除佔比鎖定",
|
||||||
@@ -772,6 +775,11 @@
|
|||||||
"tabsLabel": "使用說明欄目",
|
"tabsLabel": "使用說明欄目",
|
||||||
"updates": "版本更新",
|
"updates": "版本更新",
|
||||||
"updatesSubtitle": "查看近期功能更新記錄",
|
"updatesSubtitle": "查看近期功能更新記錄",
|
||||||
|
"releaseSummaryV11106": "V1.11.06 已更新",
|
||||||
|
"releaseHeadingV11106": "2026-11-06更新:",
|
||||||
|
"releaseMenuLayerFix": "修正選單控制區拖曳按鈕顯示層級",
|
||||||
|
"releaseSequenceStart": "加入圖片序列幀模式下的起始幀控制,允許固定首幀圖片與隨機起始幀",
|
||||||
|
"releaseSaveDialog": "調整儲存設定對話框顯示,同時顯示現有設定",
|
||||||
"releaseSummaryV11105": "V1.11.05 已更新",
|
"releaseSummaryV11105": "V1.11.05 已更新",
|
||||||
"releaseHeadingV11105": "2026-11-05更新:",
|
"releaseHeadingV11105": "2026-11-05更新:",
|
||||||
"releaseWindowFix": "修正視窗顯示",
|
"releaseWindowFix": "修正視窗顯示",
|
||||||
|
|||||||
@@ -286,7 +286,7 @@ function onTimelineDrag(e: PointerEvent) {
|
|||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
.timeline-collapse-toggle {
|
.timeline-collapse-toggle {
|
||||||
position: absolute; left: 50%; bottom: calc(var(--operation-bar-rendered-height, 84px) - 1px); z-index: 21;
|
position: absolute; left: 50%; bottom: calc(var(--operation-bar-rendered-height, 84px) - 1px); z-index: 19;
|
||||||
width: 96px; height: 20.4px; padding: 0; transform: translateX(-50%);
|
width: 96px; height: 20.4px; padding: 0; transform: translateX(-50%);
|
||||||
border: 0; background: transparent; color: #8792a6; cursor: ns-resize;
|
border: 0; background: transparent; color: #8792a6; cursor: ns-resize;
|
||||||
touch-action: none; user-select: none;
|
touch-action: none; user-select: none;
|
||||||
|
|||||||
@@ -255,6 +255,12 @@ const activeTab = ref<'guide' | 'updates'>('guide')
|
|||||||
const openModules = ref<boolean[]>(Array.from({ length: 9 }, () => false))
|
const openModules = ref<boolean[]>(Array.from({ length: 9 }, () => false))
|
||||||
|
|
||||||
const releases = [
|
const releases = [
|
||||||
|
{
|
||||||
|
date: '2026-11-06',
|
||||||
|
title: 'help.releaseSummaryV11106',
|
||||||
|
heading: 'help.releaseHeadingV11106',
|
||||||
|
updates: ['help.releaseMenuLayerFix', 'help.releaseSequenceStart', 'help.releaseSaveDialog'],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
date: '2026-11-05',
|
date: '2026-11-05',
|
||||||
title: 'help.releaseSummaryV11105',
|
title: 'help.releaseSummaryV11105',
|
||||||
|
|||||||
@@ -31,6 +31,12 @@
|
|||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label class="row"><span>{{ $t('image.playbackFps') }}</span><input v-model.number="resource.sequenceFps" type="number" min="1" max="120" step="1" class="inp" /></label>
|
<label class="row"><span>{{ $t('image.playbackFps') }}</span><input v-model.number="resource.sequenceFps" type="number" min="1" max="120" step="1" class="inp" /></label>
|
||||||
|
<label class="row"><span>{{ $t('image.startFrame') }}</span>
|
||||||
|
<select v-model="resource.sequenceStart" class="inp">
|
||||||
|
<option value="first">{{ $t('image.fixedFirstFrame') }}</option>
|
||||||
|
<option value="random">{{ $t('image.randomFrame') }}</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
<button class="sequence-pick" data-matomo-event="resources.pick-sequence" @click="$emit('pickSequence', resource.id)">{{ $t('image.chooseSequenceMulti') }}</button>
|
<button class="sequence-pick" data-matomo-event="resources.pick-sequence" @click="$emit('pickSequence', resource.id)">{{ $t('image.chooseSequenceMulti') }}</button>
|
||||||
<div class="sequence-note">{{ sequenceOrderText }}</div>
|
<div class="sequence-note">{{ sequenceOrderText }}</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -123,6 +129,7 @@ type CommonImageResource = {
|
|||||||
previewUrl: string
|
previewUrl: string
|
||||||
imageMode?: 'fixed' | 'sequence'
|
imageMode?: 'fixed' | 'sequence'
|
||||||
sequencePlayback?: 'once-hide' | 'once-hold' | 'loop-forward' | 'loop-reverse'
|
sequencePlayback?: 'once-hide' | 'once-hold' | 'loop-forward' | 'loop-reverse'
|
||||||
|
sequenceStart?: 'first' | 'random'
|
||||||
sequenceFps?: number
|
sequenceFps?: number
|
||||||
sequenceFrames?: Array<{ name: string; previewUrl: string }>
|
sequenceFrames?: Array<{ name: string; previewUrl: string }>
|
||||||
textureName: string
|
textureName: string
|
||||||
|
|||||||
@@ -69,6 +69,24 @@
|
|||||||
autofocus
|
autofocus
|
||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
|
<div class="project-save-existing">
|
||||||
|
<div class="project-save-existing-title">{{ $t('config.local.listTitle') }}</div>
|
||||||
|
<div v-if="localProjects.length" class="project-save-existing-list">
|
||||||
|
<button
|
||||||
|
v-for="project in localProjects"
|
||||||
|
:key="project.name"
|
||||||
|
type="button"
|
||||||
|
class="project-save-existing-row"
|
||||||
|
:class="{ selected: projectNameDraft === project.name }"
|
||||||
|
:aria-pressed="projectNameDraft === project.name"
|
||||||
|
@click="projectNameDraft = project.name; projectSaveError = ''"
|
||||||
|
>
|
||||||
|
<span>{{ project.name }}</span>
|
||||||
|
<small v-if="store.settings.showProjectSize">{{ formatProjectSize(project.size) }}</small>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div v-else class="project-save-existing-empty">{{ $t('config.local.empty') }}</div>
|
||||||
|
</div>
|
||||||
<div v-if="projectSaveError" class="project-save-error">{{ projectSaveError }}</div>
|
<div v-if="projectSaveError" class="project-save-error">{{ projectSaveError }}</div>
|
||||||
<div class="project-save-actions">
|
<div class="project-save-actions">
|
||||||
<button type="button" :disabled="projectStorageBusy" @click="closeProjectSaveDialog">{{ $t('common.cancel') }}</button>
|
<button type="button" :disabled="projectStorageBusy" @click="closeProjectSaveDialog">{{ $t('common.cancel') }}</button>
|
||||||
@@ -168,7 +186,30 @@ function presetDisplayName(preset: PresetOption) {
|
|||||||
.project-save-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 13px; font-size: 14px; font-weight: 700; }
|
.project-save-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 13px; font-size: 14px; font-weight: 700; }
|
||||||
.project-save-head button { width: 24px; height: 24px; border: 1px solid #3b4864; border-radius: 5px; background: #252f43; color: #bfc9dc; cursor: pointer; }
|
.project-save-head button { width: 24px; height: 24px; border: 1px solid #3b4864; border-radius: 5px; background: #252f43; color: #bfc9dc; cursor: pointer; }
|
||||||
.project-save-dialog label { display: flex; flex-direction: column; gap: 6px; color: #8f9cb8; font-size: 11px; }
|
.project-save-dialog label { display: flex; flex-direction: column; gap: 6px; color: #8f9cb8; font-size: 11px; }
|
||||||
.project-save-dialog .inp { width: 100%; height: 34px; box-sizing: border-box; }
|
.project-save-dialog .inp {
|
||||||
|
width: 100%; height: 34px; box-sizing: border-box; padding: 0 8px;
|
||||||
|
border: 1px solid #2e2e44; border-radius: 5px; outline: none;
|
||||||
|
background: #1a1a28; color: #dde; font: inherit; font-size: 12px;
|
||||||
|
}
|
||||||
|
.project-save-dialog .inp:focus { border-color: #716eff; }
|
||||||
|
.project-save-existing { margin-top: 13px; padding: 8px; border: 1px solid #2c3850; border-radius: 7px; background: #111725; }
|
||||||
|
.project-save-existing-title { margin-bottom: 6px; color: #aeb9cf; font-size: 11px; font-weight: 700; }
|
||||||
|
.project-save-existing-list {
|
||||||
|
display: grid; gap: 2px; max-height: 164px; overflow-y: auto;
|
||||||
|
scrollbar-width: thin; scrollbar-color: #3a455e transparent;
|
||||||
|
}
|
||||||
|
.project-save-existing-list::-webkit-scrollbar { width: 6px; }
|
||||||
|
.project-save-existing-list::-webkit-scrollbar-thumb { border-radius: 3px; background: #3a455e; }
|
||||||
|
.project-save-existing-row {
|
||||||
|
display: flex; width: 100%; min-height: 30px; align-items: center; gap: 8px; padding: 0 8px;
|
||||||
|
border: 0; border-radius: 5px; background: transparent; color: #c7d2e5; font: inherit; font-size: 11px; text-align: left; cursor: pointer;
|
||||||
|
}
|
||||||
|
.project-save-existing-row:hover { background: #1d273a; color: #fff; }
|
||||||
|
.project-save-existing-row.selected { background: #25264b; color: #fff; box-shadow: inset 2px 0 #8179ff; }
|
||||||
|
.project-save-existing-row:focus-visible { outline: 1px solid #8179ff; outline-offset: -1px; }
|
||||||
|
.project-save-existing-row span { min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||||
|
.project-save-existing-row small { flex: 0 0 auto; color: #7f8aa6; font-size: 9px; }
|
||||||
|
.project-save-existing-empty { padding: 5px 2px; color: #68758d; font-size: 10px; text-align: center; }
|
||||||
.project-save-error { margin-top: 8px; color: #ef9aa7; font-size: 10px; line-height: 1.4; }
|
.project-save-error { margin-top: 8px; color: #ef9aa7; font-size: 10px; line-height: 1.4; }
|
||||||
.project-save-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }
|
.project-save-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }
|
||||||
.project-save-actions button { height: 31px; padding: 0 14px; border: 1px solid #3d4b66; border-radius: 6px; background: #27334a; color: #cbd5e7; cursor: pointer; }
|
.project-save-actions button { height: 31px; padding: 0 14px; border: 1px solid #3d4b66; border-radius: 6px; background: #27334a; color: #cbd5e7; cursor: pointer; }
|
||||||
|
|||||||
@@ -228,6 +228,7 @@ function addImageResource() {
|
|||||||
previewUrl: '/images/star.png',
|
previewUrl: '/images/star.png',
|
||||||
imageMode: 'fixed',
|
imageMode: 'fixed',
|
||||||
sequencePlayback: 'loop-forward',
|
sequencePlayback: 'loop-forward',
|
||||||
|
sequenceStart: 'first',
|
||||||
sequenceFps: DEFAULT_SEQUENCE_FPS,
|
sequenceFps: DEFAULT_SEQUENCE_FPS,
|
||||||
sequenceFrames: [],
|
sequenceFrames: [],
|
||||||
weight: 100,
|
weight: 100,
|
||||||
@@ -333,6 +334,7 @@ function resetTexture(resourceId: number) {
|
|||||||
resource.previewUrl = '/images/star.png'
|
resource.previewUrl = '/images/star.png'
|
||||||
resource.imageMode = 'fixed'
|
resource.imageMode = 'fixed'
|
||||||
resource.sequencePlayback = 'loop-forward'
|
resource.sequencePlayback = 'loop-forward'
|
||||||
|
resource.sequenceStart = 'first'
|
||||||
resource.sequenceFps = DEFAULT_SEQUENCE_FPS
|
resource.sequenceFps = DEFAULT_SEQUENCE_FPS
|
||||||
resource.sequenceFrames = []
|
resource.sequenceFrames = []
|
||||||
resource.scale = 1
|
resource.scale = 1
|
||||||
|
|||||||
Reference in new issue
Block a user