style stock images table Hunter Thursday, June 18th, 2026 at 8:09 PM
3 Craft handmade websites in their natural habitat (your web browser). 4 5 <a href="https://hunterirving.github.io/web_workshop/"> -<img src="resources/images/pika_construction.gif" width="155"></a><br><br> 6 +<img src="resources/images/Other/pika_construction.gif" width="155"></a><br><br> 7 8 Web Workshop was born as a teaching tool for web development classes, with the goal of making web publishing more accessible, especially to those who have never written code before. 9 29 - Your work is automatically saved, and restored when you reload the page 30 3. Press `⌘ + S` to export your work as an HTML file (`⌘ + O` to open an existing file) 31 -<img src="resources/images/hacking.gif" width="300"> 32 +<img src="resources/images/Other/hacking.gif" width="300"> 33 34 ## Stock Images 35 A library of stock images is included for your convenience. To browse them, type `<img src="?">` anywhere in the editor pane, then click to select an image from the resulting table. 40 41 Alternatively, if you know the name of the image you'd like to use, you can add it to your project like so: `<img src="coffee.gif">`. 42 -<img src="resources/images/coffee.gif"> 43 +<img src="resources/images/Other/coffee.gif"> 44 45 ## Boilerplate 46 Type `<!>` to insert the following starter HTML: 64 - to toggle <b>line wrapping</b>, press <kbd>F2</kbd> (enabled by default) 65 66 ## Installation for Offline Use -<img src="resources/images/hint.gif" width=60px> 67 +<img src="resources/images/Other/hint.gif" width=60px> 68 <i> 69 Wanna make websites on your phone? Try installing Web Workshop as a <a href="https://hunterirving.github.io/web_workshop/pages/pwa">Progressive Web App</a>!</i> (You can install it as a desktop app, too...) 70 73 - [CodeMirror 6](https://codemirror.net/) 74 - [GitHub Dark Theme for CodeMirror](https://github.com/fsegurai/codemirror-themes) 75 -<img src="resources/images/bright_idea.gif"> 76 +<img src="resources/images/Other/bright_idea.gif"> 77 78 ## License 79 80 GPLv3 (see <a href="LICENSE">LICENSE</a> for details). 81 82 <br> -<img src="resources/images/bigN.gif" width=110px> 83 +<img src="resources/images/Other/bigN.gif" width=110px> 84 85 ## Contributing 86 87 Feel free to open issues or submit pull requests for improvements! 88 -<img src="resources/images/gaia.gif" width=180px> 89 +<img src="resources/images/Other/gaia.gif" width=180px>
36 </ul> 37 <center> 38 <h1 style="color:goldenrod">Try it Now!! Our yummy avocado coffee beverage</h1> - <img src="https://hunterirving.github.io/web_workshop/resources/images/coffee.gif" style="width:200px; height:200px;"> 39 + <img src="https://hunterirving.github.io/web_workshop/resources/images/Other/coffee.gif" style="width:200px; height:200px;"> 40 <i><p>"What the? Eww..." - Jen Lu</p></i> 41 <hr> 42 <p>Avocados in the courtroom?<br>This vid made us L-O-L<br>(Laff Out Loud)</p>
29 Welcome to my World Wide Web Site 🌞 30 </h1> 31 <center> - <img src="https://hunterirving.github.io/web_workshop/resources/images/welcome.gif" width=400px> 32 + <img src="https://hunterirving.github.io/web_workshop/resources/images/Other/welcome.gif" width=400px> 33 <p> 34 brace yourself. you are in for a wild ride!! 35 </p> - <a href="https://hunterirving.com"><img src="https://hunterirving.github.io/web_workshop/resources/images/windows.gif" style="padding:10px;"></a> 36 + <a href="https://hunterirving.com"><img src="https://hunterirving.github.io/web_workshop/resources/images/Other/windows.gif" style="padding:10px;"></a> 37 <h3>enter by "clicking" on the window above....<br>if you <i><span style="color:red">dare</span></i>.....!</h3> - <img src="https://hunterirving.github.io/web_workshop/resources/images/scared_mouse.gif" style="transform: scaleX(-1); margin-bottom:25px"><img src="https://hunterirving.github.io/web_workshop/resources/images/mac.png" width=200px> 38 + <img src="https://hunterirving.github.io/web_workshop/resources/images/Other/scared_mouse.gif" style="transform: scaleX(-1); margin-bottom:25px"><img src="https://hunterirving.github.io/web_workshop/resources/images/mac.png" width=200px> 39 </center> 40 <h1 class="heading"> 41 Here are a few of my favorite images... 🍀 42 </h1> 43 <center> - <img src="https://hunterirving.github.io/web_workshop/resources/images/cd.gif" style="width:150px"> 44 + <img src="https://hunterirving.github.io/web_workshop/resources/images/Other/cd.gif" style="width:150px"> 45 <br><br> - <img src="https://hunterirving.github.io/web_workshop/resources/images/pika_construction.gif" style="width:50%; image-rendering: pixelated;"> 46 + <img src="https://hunterirving.github.io/web_workshop/resources/images/Other/pika_construction.gif" style="width:50%; image-rendering: pixelated;"> 47 </center> 48 </body> 49 </html>
46 <b><span style="color: red; text-shadow: 3px 3px 5px white;">THE BEST</span> <span style="color:green; text-shadow: 3px 3px 5px white;">PIZZA</span> <span style="color:white">IN THE WORLD</span></b> 47 </p> 48 <hr> - <img src="https://hunterirving.github.io/web_workshop/resources/images/smiling_pizza.gif"> - <img src="https://hunterirving.github.io/web_workshop/resources/images/gaia.gif" width=200px> - <img src="https://hunterirving.github.io/web_workshop/resources/images/smiling_pizza.gif"> 49 + <img src="https://hunterirving.github.io/web_workshop/resources/images/Other/smiling_pizza.gif"> 50 + <img src="https://hunterirving.github.io/web_workshop/resources/images/Other/gaia.gif" width=200px> 51 + <img src="https://hunterirving.github.io/web_workshop/resources/images/Other/smiling_pizza.gif"> 52 <div class="block"> 53 <marquee scrollamount=20>AYY, I'M MAKIN' PIZZA HERE !</marquee> 54 </div> 92 But you better not disparage our pizza pies again, capeeshe??? 93 </p> 94 <br><br> - <center><img src="https://hunterirving.github.io/web_workshop/resources/images/smiling_pizza.gif"></center><br><br> 95 + <center><img src="https://hunterirving.github.io/web_workshop/resources/images/Other/smiling_pizza.gif"></center><br><br> 96 </body> 97 </html>
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
Binary files differ.
3 const preview = document.getElementById('preview'); 4 5 // Stock images loaded from manifest - can be referenced by bare filename -let stockImages = new Map(); // lowercase -> original filename 6 +let stockImages = new Map(); // lowercase filename -> path relative to images/ 7 8 // Load stock image list from manifest 9 const stockImagesReady = fetch('resources/resource-manifest.json') 10 .then(r => r.json()) 11 .then(manifest => { 12 manifest.images.forEach(path => { - const filename = path.split('/').pop(); - stockImages.set(filename.toLowerCase(), filename); 13 + const marker = '/resources/images/'; 14 + const i = path.indexOf(marker); 15 + const rel = i === -1 ? path.split('/').pop() : path.slice(i + marker.length); 16 + const filename = rel.split('/').pop(); 17 + stockImages.set(filename.toLowerCase(), rel); 18 }); 19 }) 20 .catch(() => console.log('Could not load resource manifest')); 24 // Rewrite <img src="filename.ext"> 25 html = html.replace(/(<img\s[^>]*\bsrc\s*=\s*["'])([^"'/:]+\.(gif|png|jpg|jpeg|svg|webp))(["'])/gi, 26 (match, before, filename, ext, after) => { - const original = stockImages.get(filename.toLowerCase()); - if (original) { - return before + 'resources/images/' + original + after; 27 + const rel = stockImages.get(filename.toLowerCase()); 28 + if (rel) { 29 + return before + 'resources/images/' + rel + after; 30 } 31 return match; 32 }); 33 // Rewrite url(filename.ext) in CSS 34 html = html.replace(/(url\(\s*["']?)([^"')/:]+\.(gif|png|jpg|jpeg|svg|webp))(["']?\s*\))/gi, 35 (match, before, filename, ext, after) => { - const original = stockImages.get(filename.toLowerCase()); - if (original) { - return before + 'resources/images/' + original + after; 36 + const rel = stockImages.get(filename.toLowerCase()); 37 + if (rel) { 38 + return before + 'resources/images/' + rel + after; 39 } 40 return match; 41 }); 42 return html; 43 } 44 -// Expand <img src="?"> tags into gallery table 45 +const galleryStyle = `<style> 46 +.stock-image-gallery { -webkit-tap-highlight-color: transparent; } 47 +.stock-image-gallery details { padding-top: 5px; padding-bottom: 5px; background: #fff; } 48 +.stock-image-gallery summary { cursor: pointer; user-select: none; padding: 0px 0 10px 10px; font-weight: 600; font-size: 1.9rem; list-style: none; background: #fff; } 49 +.stock-image-gallery summary::-webkit-details-marker { display: none; } 50 +.stock-image-gallery summary::before { content: ""; display: inline-block; width: 0.5em; height: 0.5em; margin-right: 0.45em; vertical-align: 0.09em; background: currentColor; clip-path: polygon(0 0, 100% 50%, 0 100%); transform: translateX(0.08em); } 51 +.stock-image-gallery details[open] > summary::before { clip-path: polygon(0 0, 100% 0, 50% 100%); transform: translateY(0.08em); } 52 +.stock-image-gallery table, .stock-image-gallery td { border: none; } 53 +.stock-image-gallery td { text-align: center; vertical-align: middle; font-size: 1.4rem; overflow-wrap: break-word; } 54 +.stock-image-gallery tr:nth-child(odd) { background: #e1e7fcff; } 55 +.stock-image-gallery tr:nth-child(even) { background: #fff; } 56 +.stock-image-gallery img { display: block; margin: 0 auto; image-rendering: pixelated; } 57 +.stock-image-gallery summary span, .stock-image-gallery .stock-image-name { color: #000; } 58 +</style>`; 59 + 60 +// Preview chrome (overscroll reset + fullscreen toggle), injected into the srcdoc so it 61 +// renders immediately at parse time instead of waiting for the iframe's load event (which 62 +// blocks on all gallery images finishing). Inline onclick avoids needing a post-load listener. 63 +const previewChrome = '<style>* { overscroll-behavior: none !important; } .iframe-fullscreen-toggle { position: fixed; top: 5px; right: 5px; z-index: 10000; background: rgba(0, 0, 0, 0.2); -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); color: white; border: none; border-radius: 4px; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: background-color 0.2s; box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); -webkit-tap-highlight-color: transparent; outline: none; user-select: none; } .iframe-fullscreen-toggle svg { filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.3)); opacity: 0.8; transition: opacity 0.2s; } @media (hover: hover) and (pointer: fine) { .iframe-fullscreen-toggle:hover { background: rgba(0, 0, 0, 0.35); } .iframe-fullscreen-toggle:hover svg { opacity: 1; } }</style><button id="fullscreenToggle" class="iframe-fullscreen-toggle" title="Toggle fullscreen" onclick="parent.postMessage(\'toggleFullscreen\', \'*\')"><svg width="20" height="20" viewBox="0 0 14 14" fill="white"><path d="M 7,14 H 5 v 5 h 5 V 17 H 7 Z M 5,10 H 7 V 7 h 3 V 5 H 5 Z m 12,7 h -3 v 2 h 5 V 14 H 17 Z M 14,5 v 2 h 3 v 3 h 2 V 5 Z" transform="translate(-5,-5)"/></svg></button>'; 64 + 65 +// Order categories alphabetically, with Other last 66 +function compareCategories(a, b) { 67 + if (a === 'Other') return 1; 68 + if (b === 'Other') return -1; 69 + return a.localeCompare(b); 70 +} 71 + 72 +// Natural sort so "2 Ivysaur" comes before "10 Caterpie" 73 +function compareNatural(a, b) { 74 + return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' }); 75 +} 76 + 77 +// Expand <img src="?"> tags into a categorized gallery of stock images 78 function expandImagesTag(html) { 79 return html.replace(/<img\s+src\s*=\s*["']?\?["']?\s*\/?>/gi, () => { - const images = Array.from(stockImages.values()).sort(); - if (images.length === 0) return '<p>No images available</p>'; - const rows = images.map(filename => - `<tr class="stock-image-row" data-filename="${filename}" style="cursor:pointer;user-select:none;"><td>${filename}</td><td style="text-align:center;"><img src="resources/images/${filename}" style="max-width:100%;height:auto;pointer-events:none;"></td></tr>` - ).join(''); - return `<table class="stock-image-table" border="1" cellpadding="8" cellspacing="0" style="max-width:100%;box-sizing:border-box;table-layout:fixed;"><colgroup><col style="width:50%"><col style="width:50%"></colgroup>${rows}</table>`; 80 + if (stockImages.size === 0) return '<p>No images available</p>'; 81 + 82 + // Group relative paths by their top-level category folder 83 + const categories = new Map(); 84 + for (const rel of stockImages.values()) { 85 + const slash = rel.indexOf('/'); 86 + const category = slash === -1 ? 'Other' : rel.slice(0, slash); 87 + const filename = rel.split('/').pop(); 88 + if (!categories.has(category)) categories.set(category, []); 89 + categories.get(category).push({ rel, filename }); 90 + } 91 + 92 + const sections = Array.from(categories.keys()).sort(compareCategories).map(category => { 93 + const items = categories.get(category).sort((a, b) => compareNatural(a.filename, b.filename)); 94 + const rows = items.map(({ rel, filename }) => { 95 + // prefer wrapping after _ and . over breaking mid-word 96 + const displayName = filename.replace(/[_.]/g, '$&<wbr>'); 97 + return `<tr class="stock-image-row" data-filename="${filename}" style="cursor:pointer;user-select:none;"><td><span class="stock-image-name">${displayName}</span></td><td><img src="resources/images/${rel}" style="max-width:100%;height:auto;pointer-events:none;"></td></tr>`; 98 + }).join(''); 99 + const table = `<table class="stock-image-table" cellpadding="8" cellspacing="0" style="width:100%;max-width:100%;box-sizing:border-box;table-layout:fixed;"><colgroup><col style="width:50%"><col style="width:50%"></colgroup>${rows}</table>`; 100 + return `<details><summary><span>${category}</span></summary>${table}</details>`; 101 + }).join(''); 102 + 103 + return `${galleryStyle}<div class="stock-image-gallery">${sections}</div>`; 104 }); 105 } 106 const editorPane = document.querySelector('.editor-pane'); 107 const previewPane = document.querySelector('.preview-pane'); -const storageKey = 'html-lab-content'; 108 +const storageKey = 'web-workshop-content'; 109 let isFullscreen = false; 110 let showLineNumbers = false; 111 let enableLineWrapping = false; 223 // Use srcdoc to create a completely fresh document context 224 // Expand <images> tag and rewrite bare stock image filenames 225 const processedCode = expandImagesTag(rewriteBareImageSrcs(code.trim())) || '<!DOCTYPE html><html><head></head><body></body></html>'; - preview.srcdoc = processedCode; 226 + preview.srcdoc = processedCode + previewChrome; 227 228 // Add our functionality after the iframe loads 229 const onLoad = () => { 231 const doc = preview.contentDocument; 232 if (!doc) return; 233 - // Add CSS for overscroll and button - const style = doc.createElement('style'); - style.textContent = '* { overscroll-behavior: none !important; } .iframe-fullscreen-toggle { position: fixed; top: 5px; right: 5px; z-index: 10000; background: rgba(0, 0, 0, 0.2); color: white; border: none; border-radius: 4px; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: background-color 0.2s; box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); -webkit-tap-highlight-color: transparent; outline: none; user-select: none; } .iframe-fullscreen-toggle svg { filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.3)); opacity: 0.8; transition: opacity 0.2s; } @media (hover: hover) and (pointer: fine) { .iframe-fullscreen-toggle:hover { background: rgba(0, 0, 0, 0.35); } .iframe-fullscreen-toggle:hover svg { opacity: 1; } }'; - doc.head.appendChild(style); - - // Create fullscreen button - const existingButton = doc.getElementById('fullscreenToggle'); - if (existingButton) existingButton.remove(); - - const button = doc.createElement('button'); - button.id = 'fullscreenToggle'; - button.className = 'iframe-fullscreen-toggle'; - button.title = 'Toggle fullscreen'; - - // Use inline SVG to avoid being affected by user's img styles - button.innerHTML = '<svg width="20" height="20" viewBox="0 0 14 14" fill="white"><path d="M 7,14 H 5 v 5 h 5 V 17 H 7 Z M 5,10 H 7 V 7 h 3 V 5 H 5 Z m 12,7 h -3 v 2 h 5 V 14 H 17 Z M 14,5 v 2 h 3 v 3 h 2 V 5 Z" transform="translate(-5,-5)"/></svg>'; - - button.addEventListener('click', function() { - parent.postMessage('toggleFullscreen', '*'); - }); - - if (doc.body) { - doc.body.appendChild(button); - } - 234 // Add click handlers for stock image table rows 235 const stockImageRows = doc.querySelectorAll('.stock-image-row'); 236 stockImageRows.forEach(row => {
1 { 2 "generated_at": "auto-generated by GitHub Actions", - "images": [ - "/web_workshop/resources/images/24.gif", - "/web_workshop/resources/images/alarm_alarmed.gif", - "/web_workshop/resources/images/alarm_snoozed.gif", - "/web_workshop/resources/images/alien_ufo_crash.gif", - "/web_workshop/resources/images/alien_ufo_float.gif", - "/web_workshop/resources/images/banana_dance.gif", - "/web_workshop/resources/images/bang.gif", - "/web_workshop/resources/images/bg_bricks.gif", - "/web_workshop/resources/images/bg_checker.gif", - "/web_workshop/resources/images/bg_daisies.gif", - "/web_workshop/resources/images/bg_desert.gif", - "/web_workshop/resources/images/bg_stars.gif", - "/web_workshop/resources/images/bg_trippy.gif", - "/web_workshop/resources/images/bg_water.gif", - "/web_workshop/resources/images/bigN.gif", - "/web_workshop/resources/images/birdbath.gif", - "/web_workshop/resources/images/birds_chickadee.gif", - "/web_workshop/resources/images/birds_chicken.gif", - "/web_workshop/resources/images/birds_dove.gif", - "/web_workshop/resources/images/birds_dove2.gif", - "/web_workshop/resources/images/birdsnest.gif", - "/web_workshop/resources/images/bizzy_wizzy.gif", - "/web_workshop/resources/images/blahblah.gif", - "/web_workshop/resources/images/body_spin.gif", - "/web_workshop/resources/images/bonk.gif", - "/web_workshop/resources/images/brachiosaurus.gif", - "/web_workshop/resources/images/bright_idea.gif", - "/web_workshop/resources/images/butterflies.gif", - "/web_workshop/resources/images/butterfly_blue.gif", - "/web_workshop/resources/images/butterfly_monarch.gif", - "/web_workshop/resources/images/cactus.gif", - "/web_workshop/resources/images/cat.gif", - "/web_workshop/resources/images/caterpillar.gif", - "/web_workshop/resources/images/cd.gif", - "/web_workshop/resources/images/christmas_garland.gif", - "/web_workshop/resources/images/christmas_holly.gif", - "/web_workshop/resources/images/christmas_wreath.gif", - "/web_workshop/resources/images/christmas_wreath2.gif", - "/web_workshop/resources/images/christmas_wreath3.gif", - "/web_workshop/resources/images/click_here.gif", - "/web_workshop/resources/images/clippy.gif", - "/web_workshop/resources/images/coffee.gif", - "/web_workshop/resources/images/computer.gif", - "/web_workshop/resources/images/construct.gif", - "/web_workshop/resources/images/cow.gif", - "/web_workshop/resources/images/curtain.gif", - "/web_workshop/resources/images/daisies.gif", - "/web_workshop/resources/images/dancingman.gif", - "/web_workshop/resources/images/dancingwoman.gif", - "/web_workshop/resources/images/dark_tidings.gif", - "/web_workshop/resources/images/devil.gif", - "/web_workshop/resources/images/disco_ball.gif", - "/web_workshop/resources/images/divider_blissey.gif", - "/web_workshop/resources/images/divider_blue_flowers.gif", - "/web_workshop/resources/images/divider_blue_flowers2.gif", - "/web_workshop/resources/images/divider_rainbow.gif", - "/web_workshop/resources/images/divider_rainbow_dots.gif", - "/web_workshop/resources/images/divider_red_flowers.gif", - "/web_workshop/resources/images/divider_wildflowers.gif", - "/web_workshop/resources/images/divider_yellow_flowers.gif", - "/web_workshop/resources/images/dollhouse.gif", - "/web_workshop/resources/images/donut_blink.gif", - "/web_workshop/resources/images/donut_drink.gif", - "/web_workshop/resources/images/donut_love.gif", - "/web_workshop/resources/images/doraemon.gif", - "/web_workshop/resources/images/doraemon_stamp.gif", - "/web_workshop/resources/images/dvd.gif", - "/web_workshop/resources/images/email.gif", - "/web_workshop/resources/images/email2.gif", - "/web_workshop/resources/images/fish_bass.gif", - "/web_workshop/resources/images/fish_rainbow_trout.gif", - "/web_workshop/resources/images/fish_salmon.gif", - "/web_workshop/resources/images/fish_trout.gif", - "/web_workshop/resources/images/fish_trout2.gif", - "/web_workshop/resources/images/flaming_chariot.gif", - "/web_workshop/resources/images/flowers.gif", - "/web_workshop/resources/images/frog_car.gif", - "/web_workshop/resources/images/furby1.gif", - "/web_workshop/resources/images/furby2.gif", - "/web_workshop/resources/images/furby3.gif", - "/web_workshop/resources/images/furby4.gif", - "/web_workshop/resources/images/furby5.gif", - "/web_workshop/resources/images/furby6.gif", - "/web_workshop/resources/images/furby7.gif", - "/web_workshop/resources/images/furby8.gif", - "/web_workshop/resources/images/furby9.gif", - "/web_workshop/resources/images/furby_banner.gif", - "/web_workshop/resources/images/furby_clouds.gif", - "/web_workshop/resources/images/furby_field.gif", - "/web_workshop/resources/images/furby_pink.gif", - "/web_workshop/resources/images/furby_shocked.gif", - "/web_workshop/resources/images/furby_weird.gif", - "/web_workshop/resources/images/furbyland.gif", - "/web_workshop/resources/images/gaia.gif", - "/web_workshop/resources/images/garf.gif", - "/web_workshop/resources/images/gc_icon.gif", - "/web_workshop/resources/images/hacker_skull.gif", - "/web_workshop/resources/images/hacking.gif", - "/web_workshop/resources/images/halloween_ghost.gif", - "/web_workshop/resources/images/halloween_jackolantern.gif", - "/web_workshop/resources/images/halloween_jackolantern2.gif", - "/web_workshop/resources/images/hamster_angry.gif", - "/web_workshop/resources/images/hamster_bath.gif", - "/web_workshop/resources/images/hamster_building.gif", - "/web_workshop/resources/images/hamster_chewing.gif", - "/web_workshop/resources/images/hamster_confused.gif", - "/web_workshop/resources/images/hamster_dance.gif", - "/web_workshop/resources/images/hamster_dig.gif", - "/web_workshop/resources/images/hamster_hacking.gif", - "/web_workshop/resources/images/hamster_happy.gif", - "/web_workshop/resources/images/hamster_itchy.gif", - "/web_workshop/resources/images/hamster_monch.gif", - "/web_workshop/resources/images/hamster_nunchucks.gif", - "/web_workshop/resources/images/hamster_omp.gif", - "/web_workshop/resources/images/hamster_scared.gif", - "/web_workshop/resources/images/hamster_sleep.gif", - "/web_workshop/resources/images/hamster_sleepy.gif", - "/web_workshop/resources/images/hamtaro.gif", - "/web_workshop/resources/images/hellokitty.gif", - "/web_workshop/resources/images/hint.gif", - "/web_workshop/resources/images/home.gif", - "/web_workshop/resources/images/kings.gif", - "/web_workshop/resources/images/kogu.gif", - "/web_workshop/resources/images/kori.gif", - "/web_workshop/resources/images/lil_buddha.gif", - "/web_workshop/resources/images/lil_demon.gif", - "/web_workshop/resources/images/mac.gif", - "/web_workshop/resources/images/mailbox.gif", - "/web_workshop/resources/images/mario64.gif", - "/web_workshop/resources/images/modchips.gif", - "/web_workshop/resources/images/neopet.gif", - "/web_workshop/resources/images/ness.gif", - "/web_workshop/resources/images/new_bunny.gif", - "/web_workshop/resources/images/orbit.gif", - "/web_workshop/resources/images/pika_construction.gif", - "/web_workshop/resources/images/pink_clock.gif", - "/web_workshop/resources/images/pizza_pointer.gif", - "/web_workshop/resources/images/pizza_pointer2.gif", - "/web_workshop/resources/images/pochacco.gif", - "/web_workshop/resources/images/providence.gif", - "/web_workshop/resources/images/ratrace.gif", - "/web_workshop/resources/images/ratrace2.gif", - "/web_workshop/resources/images/rilakkuma_dance.gif", - "/web_workshop/resources/images/ring.gif", - "/web_workshop/resources/images/sailor_moon.gif", - "/web_workshop/resources/images/samus.gif", - "/web_workshop/resources/images/scared_mouse.gif", - "/web_workshop/resources/images/skateboard.gif", - "/web_workshop/resources/images/smiley_bar.gif", - "/web_workshop/resources/images/smiley_dancing.gif", - "/web_workshop/resources/images/smiling_pizza.gif", - "/web_workshop/resources/images/spacedog.gif", - "/web_workshop/resources/images/spinninbrain.gif", - "/web_workshop/resources/images/squidward.gif", - "/web_workshop/resources/images/stonehenge.gif", - "/web_workshop/resources/images/sun_claymation.gif", - "/web_workshop/resources/images/sun_coffee.gif", - "/web_workshop/resources/images/sun_smiling.gif", - "/web_workshop/resources/images/sun_welcome.gif", - "/web_workshop/resources/images/surfin.gif", - "/web_workshop/resources/images/tamas.gif", - "/web_workshop/resources/images/telephone.gif", - "/web_workshop/resources/images/tooth.gif", - "/web_workshop/resources/images/trashcan_burp.gif", - "/web_workshop/resources/images/trashcan_chase.gif", - "/web_workshop/resources/images/trashcan_chomp.gif", - "/web_workshop/resources/images/tux_badboy.gif", - "/web_workshop/resources/images/tux_blink.gif", - "/web_workshop/resources/images/tux_chug.gif", - "/web_workshop/resources/images/tux_got_root.gif", - "/web_workshop/resources/images/tux_hacking.gif", - "/web_workshop/resources/images/tux_linux_power.gif", - "/web_workshop/resources/images/underconstruction.gif", - "/web_workshop/resources/images/welcome.gif", - "/web_workshop/resources/images/windows.gif", - "/web_workshop/resources/images/wishingwell.gif", - "/web_workshop/resources/images/wizard.gif", - "/web_workshop/resources/images/ww_9volt.gif", - "/web_workshop/resources/images/ww_ana.gif", - "/web_workshop/resources/images/ww_crygor.gif", - "/web_workshop/resources/images/ww_dribble.gif", - "/web_workshop/resources/images/ww_jimmy.gif", - "/web_workshop/resources/images/ww_kat.gif", - "/web_workshop/resources/images/ww_mona.gif", - "/web_workshop/resources/images/ww_orbulon.gif", - "/web_workshop/resources/images/ww_spitz.gif", - "/web_workshop/resources/images/ww_wario.gif", - "/web_workshop/resources/images/y2k.gif" - ], 3 "resources": [ 4 "/web_workshop/resources/css/styles.css", 5 "/web_workshop/resources/icons/construction.png", 6 "/web_workshop/resources/icons/construction_padded.png", - "/web_workshop/resources/images/24.gif", - "/web_workshop/resources/images/alarm_alarmed.gif", - "/web_workshop/resources/images/alarm_snoozed.gif", - "/web_workshop/resources/images/alien_ufo_crash.gif", - "/web_workshop/resources/images/alien_ufo_float.gif", - "/web_workshop/resources/images/banana_dance.gif", - "/web_workshop/resources/images/bang.gif", - "/web_workshop/resources/images/bg_bricks.gif", - "/web_workshop/resources/images/bg_checker.gif", - "/web_workshop/resources/images/bg_daisies.gif", - "/web_workshop/resources/images/bg_desert.gif", - "/web_workshop/resources/images/bg_stars.gif", - "/web_workshop/resources/images/bg_trippy.gif", - "/web_workshop/resources/images/bg_water.gif", - "/web_workshop/resources/images/bigN.gif", - "/web_workshop/resources/images/birdbath.gif", - "/web_workshop/resources/images/birds_chickadee.gif", - "/web_workshop/resources/images/birds_chicken.gif", - "/web_workshop/resources/images/birds_dove.gif", - "/web_workshop/resources/images/birds_dove2.gif", - "/web_workshop/resources/images/birdsnest.gif", - "/web_workshop/resources/images/bizzy_wizzy.gif", - "/web_workshop/resources/images/blahblah.gif", - "/web_workshop/resources/images/body_spin.gif", - "/web_workshop/resources/images/bonk.gif", - "/web_workshop/resources/images/brachiosaurus.gif", - "/web_workshop/resources/images/bright_idea.gif", - "/web_workshop/resources/images/butterflies.gif", - "/web_workshop/resources/images/butterfly_blue.gif", - "/web_workshop/resources/images/butterfly_monarch.gif", - "/web_workshop/resources/images/cactus.gif", - "/web_workshop/resources/images/cat.gif", - "/web_workshop/resources/images/caterpillar.gif", - "/web_workshop/resources/images/cd.gif", - "/web_workshop/resources/images/christmas_garland.gif", - "/web_workshop/resources/images/christmas_holly.gif", - "/web_workshop/resources/images/christmas_wreath.gif", - "/web_workshop/resources/images/christmas_wreath2.gif", - "/web_workshop/resources/images/christmas_wreath3.gif", - "/web_workshop/resources/images/click_here.gif", - "/web_workshop/resources/images/clippy.gif", - "/web_workshop/resources/images/coffee.gif", - "/web_workshop/resources/images/computer.gif", - "/web_workshop/resources/images/construct.gif", - "/web_workshop/resources/images/cow.gif", - "/web_workshop/resources/images/curtain.gif", - "/web_workshop/resources/images/daisies.gif", - "/web_workshop/resources/images/dancingman.gif", - "/web_workshop/resources/images/dancingwoman.gif", - "/web_workshop/resources/images/dark_tidings.gif", - "/web_workshop/resources/images/devil.gif", - "/web_workshop/resources/images/disco_ball.gif", - "/web_workshop/resources/images/divider_blissey.gif", - "/web_workshop/resources/images/divider_blue_flowers.gif", - "/web_workshop/resources/images/divider_blue_flowers2.gif", - "/web_workshop/resources/images/divider_rainbow.gif", - "/web_workshop/resources/images/divider_rainbow_dots.gif", - "/web_workshop/resources/images/divider_red_flowers.gif", - "/web_workshop/resources/images/divider_wildflowers.gif", - "/web_workshop/resources/images/divider_yellow_flowers.gif", - "/web_workshop/resources/images/dollhouse.gif", - "/web_workshop/resources/images/donut_blink.gif", - "/web_workshop/resources/images/donut_drink.gif", - "/web_workshop/resources/images/donut_love.gif", - "/web_workshop/resources/images/doraemon.gif", - "/web_workshop/resources/images/doraemon_stamp.gif", - "/web_workshop/resources/images/dvd.gif", - "/web_workshop/resources/images/email.gif", - "/web_workshop/resources/images/email2.gif", - "/web_workshop/resources/images/fish_bass.gif", - "/web_workshop/resources/images/fish_rainbow_trout.gif", - "/web_workshop/resources/images/fish_salmon.gif", - "/web_workshop/resources/images/fish_trout.gif", - "/web_workshop/resources/images/fish_trout2.gif", - "/web_workshop/resources/images/flaming_chariot.gif", - "/web_workshop/resources/images/flowers.gif", - "/web_workshop/resources/images/frog_car.gif", - "/web_workshop/resources/images/furby1.gif", - "/web_workshop/resources/images/furby2.gif", - "/web_workshop/resources/images/furby3.gif", - "/web_workshop/resources/images/furby4.gif", - "/web_workshop/resources/images/furby5.gif", - "/web_workshop/resources/images/furby6.gif", - "/web_workshop/resources/images/furby7.gif", - "/web_workshop/resources/images/furby8.gif", - "/web_workshop/resources/images/furby9.gif", - "/web_workshop/resources/images/furby_banner.gif", - "/web_workshop/resources/images/furby_clouds.gif", - "/web_workshop/resources/images/furby_field.gif", - "/web_workshop/resources/images/furby_pink.gif", - "/web_workshop/resources/images/furby_shocked.gif", - "/web_workshop/resources/images/furby_weird.gif", - "/web_workshop/resources/images/furbyland.gif", - "/web_workshop/resources/images/gaia.gif", - "/web_workshop/resources/images/garf.gif", - "/web_workshop/resources/images/gc_icon.gif", - "/web_workshop/resources/images/hacker_skull.gif", - "/web_workshop/resources/images/hacking.gif", - "/web_workshop/resources/images/halloween_ghost.gif", - "/web_workshop/resources/images/halloween_jackolantern.gif", - "/web_workshop/resources/images/halloween_jackolantern2.gif", - "/web_workshop/resources/images/hamster_angry.gif", - "/web_workshop/resources/images/hamster_bath.gif", - "/web_workshop/resources/images/hamster_building.gif", - "/web_workshop/resources/images/hamster_chewing.gif", - "/web_workshop/resources/images/hamster_confused.gif", - "/web_workshop/resources/images/hamster_dance.gif", - "/web_workshop/resources/images/hamster_dig.gif", - "/web_workshop/resources/images/hamster_hacking.gif", - "/web_workshop/resources/images/hamster_happy.gif", - "/web_workshop/resources/images/hamster_itchy.gif", - "/web_workshop/resources/images/hamster_monch.gif", - "/web_workshop/resources/images/hamster_nunchucks.gif", - "/web_workshop/resources/images/hamster_omp.gif", - "/web_workshop/resources/images/hamster_scared.gif", - "/web_workshop/resources/images/hamster_sleep.gif", - "/web_workshop/resources/images/hamster_sleepy.gif", - "/web_workshop/resources/images/hamtaro.gif", - "/web_workshop/resources/images/hellokitty.gif", - "/web_workshop/resources/images/hint.gif", - "/web_workshop/resources/images/home.gif", - "/web_workshop/resources/images/kings.gif", - "/web_workshop/resources/images/kogu.gif", - "/web_workshop/resources/images/kori.gif", - "/web_workshop/resources/images/lil_buddha.gif", - "/web_workshop/resources/images/lil_demon.gif", - "/web_workshop/resources/images/mac.gif", - "/web_workshop/resources/images/mailbox.gif", - "/web_workshop/resources/images/mario64.gif", - "/web_workshop/resources/images/modchips.gif", - "/web_workshop/resources/images/neopet.gif", - "/web_workshop/resources/images/ness.gif", - "/web_workshop/resources/images/new_bunny.gif", - "/web_workshop/resources/images/orbit.gif", - "/web_workshop/resources/images/pika_construction.gif", - "/web_workshop/resources/images/pink_clock.gif", - "/web_workshop/resources/images/pizza_pointer.gif", - "/web_workshop/resources/images/pizza_pointer2.gif", - "/web_workshop/resources/images/pochacco.gif", - "/web_workshop/resources/images/providence.gif", - "/web_workshop/resources/images/ratrace.gif", - "/web_workshop/resources/images/ratrace2.gif", - "/web_workshop/resources/images/rilakkuma_dance.gif", - "/web_workshop/resources/images/ring.gif", - "/web_workshop/resources/images/sailor_moon.gif", - "/web_workshop/resources/images/samus.gif", - "/web_workshop/resources/images/scared_mouse.gif", - "/web_workshop/resources/images/skateboard.gif", - "/web_workshop/resources/images/smiley_bar.gif", - "/web_workshop/resources/images/smiley_dancing.gif", - "/web_workshop/resources/images/smiling_pizza.gif", - "/web_workshop/resources/images/spacedog.gif", - "/web_workshop/resources/images/spinninbrain.gif", - "/web_workshop/resources/images/squidward.gif", - "/web_workshop/resources/images/stonehenge.gif", - "/web_workshop/resources/images/sun_claymation.gif", - "/web_workshop/resources/images/sun_coffee.gif", - "/web_workshop/resources/images/sun_smiling.gif", - "/web_workshop/resources/images/sun_welcome.gif", - "/web_workshop/resources/images/surfin.gif", - "/web_workshop/resources/images/tamas.gif", - "/web_workshop/resources/images/telephone.gif", - "/web_workshop/resources/images/tooth.gif", - "/web_workshop/resources/images/trashcan_burp.gif", - "/web_workshop/resources/images/trashcan_chase.gif", - "/web_workshop/resources/images/trashcan_chomp.gif", - "/web_workshop/resources/images/tux_badboy.gif", - "/web_workshop/resources/images/tux_blink.gif", - "/web_workshop/resources/images/tux_chug.gif", - "/web_workshop/resources/images/tux_got_root.gif", - "/web_workshop/resources/images/tux_hacking.gif", - "/web_workshop/resources/images/tux_linux_power.gif", - "/web_workshop/resources/images/underconstruction.gif", - "/web_workshop/resources/images/welcome.gif", - "/web_workshop/resources/images/windows.gif", - "/web_workshop/resources/images/wishingwell.gif", - "/web_workshop/resources/images/wizard.gif", - "/web_workshop/resources/images/ww_9volt.gif", - "/web_workshop/resources/images/ww_ana.gif", - "/web_workshop/resources/images/ww_crygor.gif", - "/web_workshop/resources/images/ww_dribble.gif", - "/web_workshop/resources/images/ww_jimmy.gif", - "/web_workshop/resources/images/ww_kat.gif", - "/web_workshop/resources/images/ww_mona.gif", - "/web_workshop/resources/images/ww_orbulon.gif", - "/web_workshop/resources/images/ww_spitz.gif", - "/web_workshop/resources/images/ww_wario.gif", - "/web_workshop/resources/images/y2k.gif", 7 "/web_workshop/resources/js/codemirror-bundle.js", 8 "/web_workshop/resources/js/main.js", 9 "/web_workshop/resources/readme_images/picnic.png", 13 "/web_workshop/resources/ui/fullscreen.svg", 14 "/web_workshop/resources/vendor/build.mjs", 15 "/web_workshop/resources/vendor/package.json" 16 + ], 17 + "images": [ 18 + "/web_workshop/resources/images/Backgrounds/bg_bricks.gif", 19 + "/web_workshop/resources/images/Backgrounds/bg_checker.gif", 20 + "/web_workshop/resources/images/Backgrounds/bg_daisies.gif", 21 + "/web_workshop/resources/images/Backgrounds/bg_desert.gif", 22 + "/web_workshop/resources/images/Backgrounds/bg_stars.gif", 23 + "/web_workshop/resources/images/Backgrounds/bg_trippy.gif", 24 + "/web_workshop/resources/images/Backgrounds/bg_water.gif", 25 + "/web_workshop/resources/images/Dividers/blissey.gif", 26 + "/web_workshop/resources/images/Dividers/blue_flowers.gif", 27 + "/web_workshop/resources/images/Dividers/blue_flowers2.gif", 28 + "/web_workshop/resources/images/Dividers/rainbow.gif", 29 + "/web_workshop/resources/images/Dividers/rainbow_dots.gif", 30 + "/web_workshop/resources/images/Dividers/red_flowers.gif", 31 + "/web_workshop/resources/images/Dividers/wildflowers.gif", 32 + "/web_workshop/resources/images/Dividers/yellow_flowers.gif", 33 + "/web_workshop/resources/images/Furby/furby1.gif", 34 + "/web_workshop/resources/images/Furby/furby2.gif", 35 + "/web_workshop/resources/images/Furby/furby3.gif", 36 + "/web_workshop/resources/images/Furby/furby4.gif", 37 + "/web_workshop/resources/images/Furby/furby5.gif", 38 + "/web_workshop/resources/images/Furby/furby6.gif", 39 + "/web_workshop/resources/images/Furby/furby7.gif", 40 + "/web_workshop/resources/images/Furby/furby8.gif", 41 + "/web_workshop/resources/images/Furby/furby9.gif", 42 + "/web_workshop/resources/images/Furby/furby_banner.gif", 43 + "/web_workshop/resources/images/Furby/furby_clouds.gif", 44 + "/web_workshop/resources/images/Furby/furby_field.gif", 45 + "/web_workshop/resources/images/Furby/furby_pink.gif", 46 + "/web_workshop/resources/images/Furby/furby_shocked.gif", 47 + "/web_workshop/resources/images/Furby/furby_weird.gif", 48 + "/web_workshop/resources/images/Furby/furbyland.gif", 49 + "/web_workshop/resources/images/Halloween/ghost.gif", 50 + "/web_workshop/resources/images/Halloween/jackolantern.gif", 51 + "/web_workshop/resources/images/Halloween/jackolantern2.gif", 52 + "/web_workshop/resources/images/Hamster/hamster_angry.gif", 53 + "/web_workshop/resources/images/Hamster/hamster_bath.gif", 54 + "/web_workshop/resources/images/Hamster/hamster_building.gif", 55 + "/web_workshop/resources/images/Hamster/hamster_chewing.gif", 56 + "/web_workshop/resources/images/Hamster/hamster_confused.gif", 57 + "/web_workshop/resources/images/Hamster/hamster_dance.gif", 58 + "/web_workshop/resources/images/Hamster/hamster_dig.gif", 59 + "/web_workshop/resources/images/Hamster/hamster_hacking.gif", 60 + "/web_workshop/resources/images/Hamster/hamster_happy.gif", 61 + "/web_workshop/resources/images/Hamster/hamster_itchy.gif", 62 + "/web_workshop/resources/images/Hamster/hamster_monch.gif", 63 + "/web_workshop/resources/images/Hamster/hamster_nunchucks.gif", 64 + "/web_workshop/resources/images/Hamster/hamster_omp.gif", 65 + "/web_workshop/resources/images/Hamster/hamster_scared.gif", 66 + "/web_workshop/resources/images/Hamster/hamster_sleep.gif", 67 + "/web_workshop/resources/images/Hamster/hamster_sleepy.gif", 68 + "/web_workshop/resources/images/Other/24.gif", 69 + "/web_workshop/resources/images/Other/alarm_alarmed.gif", 70 + "/web_workshop/resources/images/Other/alarm_snoozed.gif", 71 + "/web_workshop/resources/images/Other/alien_ufo_crash.gif", 72 + "/web_workshop/resources/images/Other/alien_ufo_float.gif", 73 + "/web_workshop/resources/images/Other/banana_dance.gif", 74 + "/web_workshop/resources/images/Other/bang.gif", 75 + "/web_workshop/resources/images/Other/bigN.gif", 76 + "/web_workshop/resources/images/Other/birdbath.gif", 77 + "/web_workshop/resources/images/Other/birds_chickadee.gif", 78 + "/web_workshop/resources/images/Other/birds_chicken.gif", 79 + "/web_workshop/resources/images/Other/birds_dove.gif", 80 + "/web_workshop/resources/images/Other/birds_dove2.gif", 81 + "/web_workshop/resources/images/Other/birdsnest.gif", 82 + "/web_workshop/resources/images/Other/bizzy_wizzy.gif", 83 + "/web_workshop/resources/images/Other/blahblah.gif", 84 + "/web_workshop/resources/images/Other/body_spin.gif", 85 + "/web_workshop/resources/images/Other/bonk.gif", 86 + "/web_workshop/resources/images/Other/brachiosaurus.gif", 87 + "/web_workshop/resources/images/Other/bright_idea.gif", 88 + "/web_workshop/resources/images/Other/butterflies.gif", 89 + "/web_workshop/resources/images/Other/butterfly_blue.gif", 90 + "/web_workshop/resources/images/Other/butterfly_monarch.gif", 91 + "/web_workshop/resources/images/Other/cactus.gif", 92 + "/web_workshop/resources/images/Other/cat.gif", 93 + "/web_workshop/resources/images/Other/caterpillar.gif", 94 + "/web_workshop/resources/images/Other/cd.gif", 95 + "/web_workshop/resources/images/Other/christmas_garland.gif", 96 + "/web_workshop/resources/images/Other/christmas_holly.gif", 97 + "/web_workshop/resources/images/Other/christmas_wreath.gif", 98 + "/web_workshop/resources/images/Other/christmas_wreath2.gif", 99 + "/web_workshop/resources/images/Other/christmas_wreath3.gif", 100 + "/web_workshop/resources/images/Other/click_here.gif", 101 + "/web_workshop/resources/images/Other/clippy.gif", 102 + "/web_workshop/resources/images/Other/coffee.gif", 103 + "/web_workshop/resources/images/Other/computer.gif", 104 + "/web_workshop/resources/images/Other/construct.gif", 105 + "/web_workshop/resources/images/Other/cow.gif", 106 + "/web_workshop/resources/images/Other/curtain.gif", 107 + "/web_workshop/resources/images/Other/daisies.gif", 108 + "/web_workshop/resources/images/Other/dancingman.gif", 109 + "/web_workshop/resources/images/Other/dancingwoman.gif", 110 + "/web_workshop/resources/images/Other/dark_tidings.gif", 111 + "/web_workshop/resources/images/Other/devil.gif", 112 + "/web_workshop/resources/images/Other/disco_ball.gif", 113 + "/web_workshop/resources/images/Other/dollhouse.gif", 114 + "/web_workshop/resources/images/Other/donut_blink.gif", 115 + "/web_workshop/resources/images/Other/donut_drink.gif", 116 + "/web_workshop/resources/images/Other/donut_love.gif", 117 + "/web_workshop/resources/images/Other/doraemon.gif", 118 + "/web_workshop/resources/images/Other/doraemon_stamp.gif", 119 + "/web_workshop/resources/images/Other/dvd.gif", 120 + "/web_workshop/resources/images/Other/email.gif", 121 + "/web_workshop/resources/images/Other/email2.gif", 122 + "/web_workshop/resources/images/Other/fish_bass.gif", 123 + "/web_workshop/resources/images/Other/fish_rainbow_trout.gif", 124 + "/web_workshop/resources/images/Other/fish_salmon.gif", 125 + "/web_workshop/resources/images/Other/fish_trout.gif", 126 + "/web_workshop/resources/images/Other/fish_trout2.gif", 127 + "/web_workshop/resources/images/Other/flaming_chariot.gif", 128 + "/web_workshop/resources/images/Other/flowers.gif", 129 + "/web_workshop/resources/images/Other/frog_car.gif", 130 + "/web_workshop/resources/images/Other/gaia.gif", 131 + "/web_workshop/resources/images/Other/garf.gif", 132 + "/web_workshop/resources/images/Other/gc_icon.gif", 133 + "/web_workshop/resources/images/Other/hacker_skull.gif", 134 + "/web_workshop/resources/images/Other/hacking.gif", 135 + "/web_workshop/resources/images/Other/hamtaro.gif", 136 + "/web_workshop/resources/images/Other/hellokitty.gif", 137 + "/web_workshop/resources/images/Other/hint.gif", 138 + "/web_workshop/resources/images/Other/home.gif", 139 + "/web_workshop/resources/images/Other/kings.gif", 140 + "/web_workshop/resources/images/Other/kogu.gif", 141 + "/web_workshop/resources/images/Other/kori.gif", 142 + "/web_workshop/resources/images/Other/lil_buddha.gif", 143 + "/web_workshop/resources/images/Other/lil_demon.gif", 144 + "/web_workshop/resources/images/Other/mac.gif", 145 + "/web_workshop/resources/images/Other/mailbox.gif", 146 + "/web_workshop/resources/images/Other/mario64.gif", 147 + "/web_workshop/resources/images/Other/modchips.gif", 148 + "/web_workshop/resources/images/Other/neopet.gif", 149 + "/web_workshop/resources/images/Other/ness.gif", 150 + "/web_workshop/resources/images/Other/new_bunny.gif", 151 + "/web_workshop/resources/images/Other/orbit.gif", 152 + "/web_workshop/resources/images/Other/pika_construction.gif", 153 + "/web_workshop/resources/images/Other/pink_clock.gif", 154 + "/web_workshop/resources/images/Other/pizza_pointer.gif", 155 + "/web_workshop/resources/images/Other/pizza_pointer2.gif", 156 + "/web_workshop/resources/images/Other/pochacco.gif", 157 + "/web_workshop/resources/images/Other/providence.gif", 158 + "/web_workshop/resources/images/Other/ratrace.gif", 159 + "/web_workshop/resources/images/Other/ratrace2.gif", 160 + "/web_workshop/resources/images/Other/rilakkuma_dance.gif", 161 + "/web_workshop/resources/images/Other/ring.gif", 162 + "/web_workshop/resources/images/Other/sailor_moon.gif", 163 + "/web_workshop/resources/images/Other/samus.gif", 164 + "/web_workshop/resources/images/Other/scared_mouse.gif", 165 + "/web_workshop/resources/images/Other/skateboard.gif", 166 + "/web_workshop/resources/images/Other/smiley_bar.gif", 167 + "/web_workshop/resources/images/Other/smiley_dancing.gif", 168 + "/web_workshop/resources/images/Other/smiling_pizza.gif", 169 + "/web_workshop/resources/images/Other/spacedog.gif", 170 + "/web_workshop/resources/images/Other/spinninbrain.gif", 171 + "/web_workshop/resources/images/Other/squidward.gif", 172 + "/web_workshop/resources/images/Other/stonehenge.gif", 173 + "/web_workshop/resources/images/Other/sun_claymation.gif", 174 + "/web_workshop/resources/images/Other/sun_coffee.gif", 175 + "/web_workshop/resources/images/Other/sun_smiling.gif", 176 + "/web_workshop/resources/images/Other/sun_welcome.gif", 177 + "/web_workshop/resources/images/Other/surfin.gif", 178 + "/web_workshop/resources/images/Other/tamas.gif", 179 + "/web_workshop/resources/images/Other/telephone.gif", 180 + "/web_workshop/resources/images/Other/tooth.gif", 181 + "/web_workshop/resources/images/Other/trashcan_burp.gif", 182 + "/web_workshop/resources/images/Other/trashcan_chase.gif", 183 + "/web_workshop/resources/images/Other/trashcan_chomp.gif", 184 + "/web_workshop/resources/images/Other/underconstruction.gif", 185 + "/web_workshop/resources/images/Other/welcome.gif", 186 + "/web_workshop/resources/images/Other/windows.gif", 187 + "/web_workshop/resources/images/Other/wishingwell.gif", 188 + "/web_workshop/resources/images/Other/wizard.gif", 189 + "/web_workshop/resources/images/Other/y2k.gif", 190 + "/web_workshop/resources/images/Tux/tux_badboy.gif", 191 + "/web_workshop/resources/images/Tux/tux_blink.gif", 192 + "/web_workshop/resources/images/Tux/tux_chug.gif", 193 + "/web_workshop/resources/images/Tux/tux_got_root.gif", 194 + "/web_workshop/resources/images/Tux/tux_hacking.gif", 195 + "/web_workshop/resources/images/Tux/tux_linux_power.gif", 196 + "/web_workshop/resources/images/WarioWare/9volt.gif", 197 + "/web_workshop/resources/images/WarioWare/ana.gif", 198 + "/web_workshop/resources/images/WarioWare/crygor.gif", 199 + "/web_workshop/resources/images/WarioWare/dribble.gif", 200 + "/web_workshop/resources/images/WarioWare/jimmy.gif", 201 + "/web_workshop/resources/images/WarioWare/kat.gif", 202 + "/web_workshop/resources/images/WarioWare/mona.gif", 203 + "/web_workshop/resources/images/WarioWare/orbulon.gif", 204 + "/web_workshop/resources/images/WarioWare/spitz.gif", 205 + "/web_workshop/resources/images/WarioWare/wario.gif" 206 ] 207 }
19 resources_dir = repo_root / 'resources' 20 images_dir = resources_dir / 'images' 21 - # Collect all image files 22 + # Collect all image files (recursively, so category subfolders are included) 23 image_files = [] 24 if images_dir.exists(): - for file_path in images_dir.iterdir(): 25 + for file_path in images_dir.rglob('*'): 26 if file_path.is_file() and file_path.suffix.lower() in image_extensions: 27 # Create relative path from web root (GitHub Pages subdirectory) - relative_path = f"/web_workshop/resources/images/{file_path.name}" 28 + rel = file_path.relative_to(images_dir).as_posix() 29 + relative_path = f"/web_workshop/resources/images/{rel}" 30 image_files.append(relative_path) 31 32 # Collect ALL resource files (no extension filtering) 34 if resources_dir.exists(): 35 for file_path in resources_dir.rglob('*'): 36 if file_path.is_file(): 37 + # Skip dev-only / gitignored files so local runs match CI output 38 + if 'node_modules' in file_path.parts or file_path.name in ('package-lock.json', '.DS_Store'): 39 + continue 40 + # Images are listed separately in the images array; don't duplicate them here 41 + if images_dir in file_path.parents: 42 + continue 43 # Create relative path from web root (GitHub Pages subdirectory) 44 relative_path = f"/web_workshop/resources/{file_path.relative_to(resources_dir).as_posix()}" 45 resource_files.append(relative_path) 50 51 # Create manifest object 52 manifest = { - "images": image_files, 53 + "generated_at": "auto-generated by GitHub Actions", 54 "resources": resource_files, - "generated_at": "auto-generated by GitHub Actions" 55 + "images": image_files 56 } - 57 + 58 # Write manifest file 59 manifest_path = resources_dir / 'resource-manifest.json' 60 with open(manifest_path, 'w', encoding='utf-8') as f: - json.dump(manifest, f, indent=2, sort_keys=True) 61 + json.dump(manifest, f, indent=2) 62 63 print(f"Generated manifest with {len(image_files)} images and {len(resource_files)} resources:") 64 for img in image_files: