Add files via upload

This commit is contained in:
Rekushi authored and GitHub committed 2026-10-29 11:56:15 +00:00
commit 92f296ddb2
18 files changed
+12656

No files matched your search

+348
View File
@@ -0,0 +1,348 @@
(function(){
var loader=document.getElementById('flipnote-editor-loader');
var statusEl=loader&&loader.querySelector('[data-flipnote-loader-status]');
var progressEl=loader&&loader.querySelector('.flipnote-editor-loader-progress');
var progressFill=loader&&loader.querySelector('[data-flipnote-loader-progress]');
var copyEl=loader&&loader.querySelector('.flipnote-editor-loader-copy');
var titleEl=loader&&loader.querySelector('.flipnote-editor-loader-title');
var drawingEngineScript='./assets/flipnote-editor/drawing-engine.js?v=2.47-advanced-eraser-paint-memory';
var textToolScript='./assets/flipnote-editor/text-tool.js?v=3.26.2';
var editorScript='./assets/flipnote-editor/editor.js?v=3.26.2-canvas';
// The server enumerates every image in web/static/flipnote-editor on each request.
// This means newly-added button states (including manually-added tab art) join the
// preload automatically without needing another JavaScript manifest update.
// Keep a small explicit list for image assets used by the editor but stored elsewhere.
var imageUrls=[];
var imageCacheBank=document.getElementById('flipnote-editor-image-cache');
var decodedImageCache=window.__flipnoteEditorImageCache=window.__flipnoteEditorImageCache||new Map();
document.querySelectorAll('img[src]').forEach(function(img){imageUrls.push(img.getAttribute('src'));});
document.querySelectorAll('*').forEach(function(node){
Array.from(node.attributes||[]).forEach(function(attr){
if(/^data-.*src$/i.test(attr.name)&&attr.value)imageUrls.push(attr.value);
});
});
imageUrls=Array.from(new Set(imageUrls.concat(["./assets/flipnote-editor/base.png","./assets/flipnote-editor/checker.png","./assets/flipnote-editor/clear.png","./assets/flipnote-editor/clone-placeholder.png","./assets/flipnote-editor/closepages.png","./assets/flipnote-editor/colour.png","./assets/flipnote-editor/copy.png","./assets/flipnote-editor/copy_pressed.png","./assets/flipnote-editor/cut.png","./assets/flipnote-editor/delete-frame.png","./assets/flipnote-editor/downloadwebm.png","./assets/flipnote-editor/Draw.png","./assets/flipnote-editor/Draw_selected.png","./assets/flipnote-editor/earsHurt.png","./assets/flipnote-editor/editpattern.png","./assets/flipnote-editor/Erase.png","./assets/flipnote-editor/erase1.png","./assets/flipnote-editor/erase1_Adv.png","./assets/flipnote-editor/erase2.png","./assets/flipnote-editor/erase2_Adv.png","./assets/flipnote-editor/erase3.png","./assets/flipnote-editor/erase3_Adv.png","./assets/flipnote-editor/erase4.png","./assets/flipnote-editor/erase4_Adv.png","./assets/flipnote-editor/erase5.png","./assets/flipnote-editor/erase5_Adv.png","./assets/flipnote-editor/erase6.png","./assets/flipnote-editor/erase6_Adv.png","./assets/flipnote-editor/erase7.png","./assets/flipnote-editor/erase7_Adv.png","./assets/flipnote-editor/erase8.png","./assets/flipnote-editor/erase8_Adv.png","./assets/flipnote-editor/eraseaudio.png","./assets/flipnote-editor/erasebig.png","./assets/flipnote-editor/eraser.png","./assets/flipnote-editor/Erase_selected.png","./assets/flipnote-editor/fill.png","./assets/flipnote-editor/fill1.png","./assets/flipnote-editor/fill2.png","./assets/flipnote-editor/fill3.png","./assets/flipnote-editor/fill4.png","./assets/flipnote-editor/fill5.png","./assets/flipnote-editor/fill6.png","./assets/flipnote-editor/fill7.png","./assets/flipnote-editor/fill8.png","./assets/flipnote-editor/fill_selected.png","./assets/flipnote-editor/filmstrip-dots.png","./assets/flipnote-editor/first-frame.png","./assets/flipnote-editor/flip_x.png","./assets/flipnote-editor/flip_y.png","./assets/flipnote-editor/goodVolume.png","./assets/flipnote-editor/ImportImage.png","./assets/flipnote-editor/invert.png","./assets/flipnote-editor/last-frame.png","./assets/flipnote-editor/layer1.png","./assets/flipnote-editor/layer1_inactive.png","./assets/flipnote-editor/layer2.png","./assets/flipnote-editor/layer2_inactive.png","./assets/flipnote-editor/lightbox-placeholder.png","./assets/flipnote-editor/lightbox.png","./assets/flipnote-editor/lightbox_pressed.png","./assets/flipnote-editor/loop_disabled.png","./assets/flipnote-editor/loop_enabled.png","./assets/flipnote-editor/musicBarEmpty.png","./assets/flipnote-editor/musicImportalt.png","./assets/flipnote-editor/musicPlay.png","./assets/flipnote-editor/musicRec.png","./assets/flipnote-editor/musicStop.png","./assets/flipnote-editor/new-frame.png","./assets/flipnote-editor/next-frame.png","./assets/flipnote-editor/openpages.png","./assets/flipnote-editor/openppm.png","./assets/flipnote-editor/pageCopy.png","./assets/flipnote-editor/pageErase.png","./assets/flipnote-editor/pageInsert.png","./assets/flipnote-editor/pagePaste.png","./assets/flipnote-editor/Paint.png","./assets/flipnote-editor/paint1.png","./assets/flipnote-editor/paint1_Adv.png","./assets/flipnote-editor/paint2.png","./assets/flipnote-editor/paint2_Adv.png","./assets/flipnote-editor/paint3.png","./assets/flipnote-editor/paint3_Adv.png","./assets/flipnote-editor/paint4.png","./assets/flipnote-editor/paint4_Adv.png","./assets/flipnote-editor/paint5.png","./assets/flipnote-editor/paint5_Adv.png","./assets/flipnote-editor/paint6.png","./assets/flipnote-editor/paint6_Adv.png","./assets/flipnote-editor/paint7.png","./assets/flipnote-editor/paint7_Adv.png","./assets/flipnote-editor/paint8.png","./assets/flipnote-editor/paint8_Adv.png","./assets/flipnote-editor/Paint_selected.png","./assets/flipnote-editor/paper-placeholder.png","./assets/flipnote-editor/paperB.png","./assets/flipnote-editor/paperW.png","./assets/flipnote-editor/paste.png","./assets/flipnote-editor/pen.png","./assets/flipnote-editor/pen1.png","./assets/flipnote-editor/pen1_Adv.png","./assets/flipnote-editor/pen2.png","./assets/flipnote-editor/pen2_Adv.png","./assets/flipnote-editor/pen3.png","./assets/flipnote-editor/pen3_Adv.png","./assets/flipnote-editor/pen4.png","./assets/flipnote-editor/pen4_Adv.png","./assets/flipnote-editor/pen5.png","./assets/flipnote-editor/pen5_Adv.png","./assets/flipnote-editor/pen6.png","./assets/flipnote-editor/pen6_Adv.png","./assets/flipnote-editor/pen7.png","./assets/flipnote-editor/pen7_Adv.png","./assets/flipnote-editor/pen8.png","./assets/flipnote-editor/pen8_Adv.png","./assets/flipnote-editor/play.png","./assets/flipnote-editor/previous-frame.png","./assets/flipnote-editor/redo.png","./assets/flipnote-editor/redo_grey.png","./assets/flipnote-editor/resize_larger.png","./assets/flipnote-editor/resize_smaller.png","./assets/flipnote-editor/rotate_anticlockwise.png","./assets/flipnLine truncated
var fontJobs=[{css:'16px "NDS BIOS"',sample:'Preloading assets 00 / 00'}];
var completed=0;
var total=imageUrls.length+fontJobs.length+5;
function updateProgress(){
var safeTotal=Math.max(total,1);
var percent=Math.max(0,Math.min(100,Math.round((completed/safeTotal)*100)));
if(statusEl)statusEl.textContent='Preloading assets '+Math.min(completed,total)+' / '+total;
if(progressFill)progressFill.style.width=percent+'%';
if(progressEl)progressEl.setAttribute('aria-valuenow',String(percent));
}
function doneOne(){completed+=1;updateProgress();}
function preloadImage(url){
var cached=decodedImageCache.get(url);
if(cached&&cached.promise)return cached.promise.then(function(){doneOne();});
var image=new Image();
image.alt='';
image.decoding='sync';
image.loading='eager';
image.setAttribute('aria-hidden','true');
if(imageCacheBank)imageCacheBank.appendChild(image);
var promise=new Promise(function(resolve,reject){
var finished=false;
var decoding=false;
var finish=function(ok){
if(finished)return;
finished=true;
if(!ok){reject(new Error('asset '+url));return;}
resolve(image);
};
var decodeLoaded=function(){
if(finished||decoding)return;
decoding=true;
if(typeof image.decode==='function'){
image.decode().then(function(){finish(true);}).catch(function(){
finish(image.complete&&image.naturalWidth>0);
});
}else{
finish(image.complete&&image.naturalWidth>0);
}
};
image.onload=decodeLoaded;
image.onerror=function(){finish(false);};
image.src=url;
if(image.complete&&image.naturalWidth>0)decodeLoaded();
});
decodedImageCache.set(url,{image:image,promise:promise});
return promise.then(function(){doneOne();});
}
function preloadFont(job){
if(!document.fonts||!document.fonts.load)return Promise.reject(new Error('font loading unsupported'));
return document.fonts.load(job.css,job.sample).then(function(faces){
if(!faces||!faces.length)throw new Error('font '+job.css);
doneOne();
});
}
function loadFonts(){
return Promise.all(fontJobs.map(preloadFont)).then(function(){
if(loader)loader.classList.add('fonts-ready');
if(copyEl)copyEl.setAttribute('aria-hidden','false');
});
}
function loadScript(url,label){
return new Promise(function(resolve,reject){
var script=document.createElement('script');
script.src=url;
script.onload=function(){doneOne();resolve();};
script.onerror=function(){reject(new Error(label||'editor script'));};
document.body.appendChild(script);
});
}
function loadEditor(){return loadScript('./assets/vendor/flipnote.js','PPM reader').then(function(){return loadScript('./assets/ppm-import.js','PPM importer');}).then(function(){return loadScript(drawingEngineScript,'drawing engine');}).then(function(){return loadScript(textToolScript,'text tool');}).then(function(){return loadScript(editorScript,'editor');});}
function installEditorInputFixes(){
var titleField=document.getElementById('filename');
if(titleField&&!titleField.dataset.titleLimitFix){
titleField.dataset.titleLimitFix='1';
var titleLimit=80;
function titleText(){return String(titleField.textContent||'').replace(/ /g,' ');}
function selectionLength(){
var selection=window.getSelection&&window.getSelection();
if(!selection||!selection.rangeCount)return 0;
var range=selection.getRangeAt(0);
if(!titleField.contains(range.commonAncestorContainer))return 0;
return range.toString().length;
}
function putCaretAtEnd(){
var selection=window.getSelection&&window.getSelection();
if(!selection)return;
var range=document.createRange();
range.selectNodeContents(titleField);
range.collapse(false);
selection.removeAllRanges();
selection.addRange(range);
}
titleField.addEventListener('keydown',function(event){
if(event.defaultPrevented||event.ctrlKey||event.metaKey||event.altKey)return;
if(event.key&&event.key.length===1&&titleText().length-selectionLength()>=titleLimit){
event.preventDefault();
event.stopImmediatePropagation();
}
},true);
titleField.addEventListener('beforeinput',function(event){
if(event.defaultPrevented||!event.inputType||event.inputType.indexOf('insert')!==0)return;
var incoming=typeof event.data==='string'?event.data:'';
if(event.inputType==='insertLineBreak'||event.inputType==='insertParagraph'){
event.preventDefault();
return;
}
if(titleText().length-selectionLength()+(incoming?incoming.length:1)>titleLimit){
event.preventDefault();
}
},true);
titleField.addEventListener('paste',function(event){
var clipboard=event.clipboardData||window.clipboardData;
if(!clipboard)return;
var incoming=String(clipboard.getData('text')||'').replace(/[\r\n]+/g,' ');
var room=Math.max(0,titleLimit-(titleText().length-selectionLength()));
if(incoming.length<=room)return;
event.preventDefault();
if(room>0){
var partial=incoming.slice(0,room);
if(document.execCommand)document.execCommand('insertText',false,partial);
}
},true);
titleField.addEventListener('input',function(){
var value=titleText();
if(value.length<=titleLimit)return;
titleField.textContent=value.slice(0,titleLimit);
putCaretAtEnd();
},true);
}
var paperTool=document.getElementById('paper-tool');
function pageUsesBlackPaper(){
if(!paperTool)return false;
if(paperTool.getAttribute('aria-pressed')==='true')return true;
var image=paperTool.querySelector('img');
return !!(image&&/paperB\.png(?:[?#]|$)/i.test(image.getAttribute('src')||''));
}
function syncMonochromeInkLabel(){
var label=pageUsesBlackPaper()?'White':'Black';
['flipnote-image-import-colour','flipnote-image-import-second-colour'].forEach(function(id){
var select=document.getElementById(id);
var option=select&&select.querySelector('option[value="black"]');
if(option)option.textContent=label;
});
document.querySelectorAll('.flipnote-editor-layer-color[data-layer-color="black"]').forEach(function(button){
var layer=Number(button.getAttribute('data-layer'))+1;
button.title=label;
button.setAttribute('aria-label','Layer '+layer+' '+label.toLowerCase());
});
}
syncMonochromeInkLabel();
if(paperTool&&!paperTool.dataset.rexiPaperInkLabelFix){
paperTool.dataset.rexiPaperInkLabelFix='1';
paperTool.addEventListener('click',function(){setTimeout(syncMonochromeInkLabel,0);});
var paperObserver=new MutationObserver(syncMonochromeInkLabel);
paperObserver.observe(paperTool,{attributes:true,attributeFilter:['aria-pressed','title'],subtree:true});
var paperImage=paperTool.querySelector('img');
if(paperImage)paperObserver.observe(paperImage,{attributes:true,attributeFilter:['src']});
}
var imageImportButton=document.getElementById('flipnote-import-image-button');
if(imageImportButton&&!imageImportButton.dataset.rexiInkLabelFix){
imageImportButton.dataset.rexiInkLabelFix='1';
imageImportButton.addEventListener('click',function(){setTimeout(syncMonochromeInkLabel,0);});
}
var imageApply=document.getElementById('flipnote-image-import-apply');
if(imageApply&&!imageApply.dataset.rexiImageColourFix){
imageApply.dataset.rexiImageColourFix='1';
imageApply.addEventListener('click',function(){
var mode=document.getElementById('flipnote-image-import-mode');
var first=document.getElementById('flipnote-image-import-colour');
var second=document.getElementById('flipnote-image-import-second-colour');
var layer=document.getElementById('flipnote-image-import-layer');
var chosenMode=mode?mode.value:'single';
var firstColour=first?first.value:'black';
var secondColour=second?second.value:'red';
var chosenLayer=Math.max(0,Math.min(1,Number(layer&&layer.value)||0));
function applyLayerColour(index,colour){
var button=document.querySelector('.flipnote-editor-layer-color[data-layer="'+index+'"][data-layer-color="'+colour+'"]');
if(button)button.click();
}
setTimeout(function(){
if(chosenMode==='dual'){
applyLayerColour(0,firstColour);
applyLayerColour(1,secondColour);
}else{
applyLayerColour(chosenLayer,firstColour);
}
syncMonochromeInkLabel();
},0);
},true);
}
}
function installMobileShiftToggle(){
var button=document.getElementById('flipnote-mobile-shift-toggle');
if(!button)return;
var ua=String(navigator.userAgent||'');
var uaMobile=!!(navigator.userAgentData&&navigator.userAgentData.mobile);
var ipadLike=navigator.platform==='MacIntel'&&Number(navigator.maxTouchPoints||0)>1;
var mobileOrTablet=uaMobile||ipadLike||/(Android|iPad|iPhone|iPod|Mobile|Tablet|Silk|Kindle)/i.test(ua);
var desktopSetting=document.getElementById('flipnote-editor-desktop-shift');
var desktopSettingKey='flipnote-editor.flipnote-editor.desktop-shift.v1';
var desktopEnabled=false;
try{desktopEnabled=window.localStorage.getItem(desktopSettingKey)==='1';}catch(_error){}
if(desktopSetting)desktopSetting.checked=desktopEnabled;
if(!mobileOrTablet&&desktopSetting)desktopSetting.addEventListener('change',function(){
desktopEnabled=desktopSetting.checked;
try{window.localStorage.setItem(desktopSettingKey,desktopEnabled?'1':'0');}catch(_error){}
if(!desktopEnabled)setVirtualShift(false);
button.hidden=!desktopEnabled;
});
var image=button.querySelector('img');
var normalSrc=image&&image.getAttribute('data-normal-src')||'./assets/flipnote-editor/shiftl.png';
var activeSrc=image&&image.getAttribute('data-active-src')||'./assets/flipnote-editor/shiftl_active.png';
var active=false;
function makeShiftEvent(type,down){
var event;
try{
event=new KeyboardEvent(type,{key:'Shift',code:'ShiftLeft',location:1,shiftKey:!!down,bubbles:true,cancelable:true});
}catch(_error){
event=document.createEvent('Event');
event.initEvent(type,true,true);
}
try{Object.defineProperty(event,'key',{configurable:true,get:function(){return 'Shift';}});}catch(_error){}
try{Object.defineProperty(event,'code',{configurable:true,get:function(){return 'ShiftLeft';}});}catch(_error){}
try{Object.defineProperty(event,'keyCode',{configurable:true,get:function(){return 16;}});}catch(_error){}
try{Object.defineProperty(event,'which',{configurable:true,get:function(){return 16;}});}catch(_error){}
try{Object.defineProperty(event,'shiftKey',{configurable:true,get:function(){return !!down;}});}catch(_error){}
var target=document.body||document.documentElement||document;
target.dispatchEvent(event);
}
function setVirtualShift(next){
next=!!next;
if(active===next)return;
active=next;
button.setAttribute('aria-pressed',active?'true':'false');
button.title=active?'Shift enabled':'Shift';
if(image)image.src=active?activeSrc:normalSrc;
makeShiftEvent(active?'keydown':'keyup',active);
}
function forceShiftModifier(event){
if(!active||!event)return;
try{Object.defineProperty(event,'shiftKey',{configurable:true,get:function(){return true;}});}catch(_error){}
if(typeof event.getModifierState==='function'){
var original=event.getModifierState.bind(event);
try{Object.defineProperty(event,'getModifierState',{configurable:true,value:function(key){return String(key||'').toLowerCase()==='shift'?true:original(key);}});}catch(_error){}
}
}
['pointerdown','pointerup','mousedown','mouseup','click','dblclick'].forEach(function(type){
document.addEventListener(type,forceShiftModifier,true);
});
function consumesOneShotShift(target){
if(!target||!target.closest)return false;
var slot=target.closest('[data-tool-slot]');
if(slot){
var slotImage=slot.querySelector('img');
var slotSrc=slotImage&&String(slotImage.getAttribute('src')||'');
return slotSrc.toLowerCase().indexOf('_adv.png')!==-1;
}
return !!target.closest('#copy-tool,.flipnote-editor-more-tool,[data-audio-control]');
}
button.addEventListener('click',function(){setVirtualShift(!active);});
document.addEventListener('click',function(event){
if(!active||button.contains(event.target)||!consumesOneShotShift(event.target))return;
window.setTimeout(function(){setVirtualShift(false);},0);
},true);
document.addEventListener('keyup',function(event){
if(active&&event.key==='Shift')window.setTimeout(function(){if(active)makeShiftEvent('keydown',true);},0);
});
window.addEventListener('focus',function(){if(active)makeShiftEvent('keydown',true);});
window.addEventListener('pagehide',function(){if(active)makeShiftEvent('keyup',false);});
button.hidden=!(mobileOrTablet||desktopEnabled);
}
function reveal(){
updateProgress();
document.body.classList.remove('flipnote-editor-loading');
if(!loader)return;
loader.classList.add('is-exiting');
var removed=false;
var removeLoader=function(){
if(removed)return;
removed=true;
loader.remove();
};
loader.addEventListener('transitionend',function(event){
if(event.target===loader&&event.propertyName==='transform')removeLoader();
});
window.setTimeout(removeLoader,900);
}
function fail(error){ if(loader)loader.classList.add('load-failed'); if(titleEl)titleEl.textContent='Flipnote Editor could not load'; if(statusEl)statusEl.textContent=error&&error.message?error.message:'Try refreshing the page.'; }
updateProgress();
var imageJobs=imageUrls.map(preloadImage);
var fontPromise=loadFonts();
function settleDecodedImages(){
return new Promise(function(resolve){
requestAnimationFrame(function(){requestAnimationFrame(resolve);});
});
}
Promise.all(imageJobs.concat([fontPromise])).then(settleDecodedImages).then(loadEditor).then(function(){installEditorInputFixes();installMobileShiftToggle();return settleDecodedImages();}).then(reveal).catch(fail);
})();