style stock images table

Hunter
Thursday, June 18th, 2026 at 8:09 PM

README.md+7-7
pages/avocado_warehouse/index.html+1-1
pages/my_homepage/index.html+5-5
pages/pizza_heaven/index.html+4-4
resources/images/bg_bricks.gif -> resources/images/Backgrounds/bg_bricks.gif  
resources/images/bg_checker.gif -> resources/images/Backgrounds/bg_checker.gif  
resources/images/bg_daisies.gif -> resources/images/Backgrounds/bg_daisies.gif  
resources/images/bg_desert.gif -> resources/images/Backgrounds/bg_desert.gif  
resources/images/bg_stars.gif -> resources/images/Backgrounds/bg_stars.gif  
resources/images/bg_trippy.gif -> resources/images/Backgrounds/bg_trippy.gif  
resources/images/bg_water.gif -> resources/images/Backgrounds/bg_water.gif  
resources/images/divider_blissey.gif -> resources/images/Dividers/blissey.gif  
resources/images/divider_blue_flowers.gif -> resources/images/Dividers/blue_flowers.gif  
resources/images/divider_blue_flowers2.gif -> resources/images/Dividers/blue_flowers2.gif  
resources/images/divider_rainbow.gif -> resources/images/Dividers/rainbow.gif  
resources/images/divider_rainbow_dots.gif -> resources/images/Dividers/rainbow_dots.gif  
resources/images/divider_red_flowers.gif -> resources/images/Dividers/red_flowers.gif  
resources/images/divider_wildflowers.gif -> resources/images/Dividers/wildflowers.gif  
resources/images/divider_yellow_flowers.gif -> resources/images/Dividers/yellow_flowers.gif  
resources/images/furby1.gif -> resources/images/Furby/furby1.gif  
resources/images/furby2.gif -> resources/images/Furby/furby2.gif  
resources/images/furby3.gif -> resources/images/Furby/furby3.gif  
resources/images/furby4.gif -> resources/images/Furby/furby4.gif  
resources/images/furby5.gif -> resources/images/Furby/furby5.gif  
resources/images/furby6.gif -> resources/images/Furby/furby6.gif  
resources/images/furby7.gif -> resources/images/Furby/furby7.gif  
resources/images/furby8.gif -> resources/images/Furby/furby8.gif  
resources/images/furby9.gif -> resources/images/Furby/furby9.gif  
resources/images/furby_banner.gif -> resources/images/Furby/furby_banner.gif  
resources/images/furby_clouds.gif -> resources/images/Furby/furby_clouds.gif  
resources/images/furby_field.gif -> resources/images/Furby/furby_field.gif  
resources/images/furby_pink.gif -> resources/images/Furby/furby_pink.gif  
resources/images/furby_shocked.gif -> resources/images/Furby/furby_shocked.gif  
resources/images/furby_weird.gif -> resources/images/Furby/furby_weird.gif  
resources/images/furbyland.gif -> resources/images/Furby/furbyland.gif  
resources/images/halloween_ghost.gif -> resources/images/Halloween/ghost.gif  
resources/images/halloween_jackolantern.gif -> resources/images/Halloween/jackolantern.gif  
resources/images/halloween_jackolantern2.gif -> resources/images/Halloween/jackolantern2.gif  
resources/images/hamster_angry.gif -> resources/images/Hamster/hamster_angry.gif  
resources/images/hamster_bath.gif -> resources/images/Hamster/hamster_bath.gif  
resources/images/hamster_building.gif -> resources/images/Hamster/hamster_building.gif  
resources/images/hamster_chewing.gif -> resources/images/Hamster/hamster_chewing.gif  
resources/images/hamster_confused.gif -> resources/images/Hamster/hamster_confused.gif  
resources/images/hamster_dance.gif -> resources/images/Hamster/hamster_dance.gif  
resources/images/hamster_dig.gif -> resources/images/Hamster/hamster_dig.gif  
resources/images/hamster_hacking.gif -> resources/images/Hamster/hamster_hacking.gif  
resources/images/hamster_happy.gif -> resources/images/Hamster/hamster_happy.gif  
resources/images/hamster_itchy.gif -> resources/images/Hamster/hamster_itchy.gif  
resources/images/hamster_monch.gif -> resources/images/Hamster/hamster_monch.gif  
resources/images/hamster_nunchucks.gif -> resources/images/Hamster/hamster_nunchucks.gif  
resources/images/hamster_omp.gif -> resources/images/Hamster/hamster_omp.gif  
resources/images/hamster_scared.gif -> resources/images/Hamster/hamster_scared.gif  
resources/images/hamster_sleep.gif -> resources/images/Hamster/hamster_sleep.gif  
resources/images/hamster_sleepy.gif -> resources/images/Hamster/hamster_sleepy.gif  
resources/images/24.gif -> resources/images/Other/24.gif  
resources/images/alarm_alarmed.gif -> resources/images/Other/alarm_alarmed.gif  
resources/images/alarm_snoozed.gif -> resources/images/Other/alarm_snoozed.gif  
resources/images/alien_ufo_crash.gif -> resources/images/Other/alien_ufo_crash.gif  
resources/images/alien_ufo_float.gif -> resources/images/Other/alien_ufo_float.gif  
resources/images/banana_dance.gif -> resources/images/Other/banana_dance.gif  
resources/images/bang.gif -> resources/images/Other/bang.gif  
resources/images/bigN.gif -> resources/images/Other/bigN.gif  
resources/images/birdbath.gif -> resources/images/Other/birdbath.gif  
resources/images/birds_chickadee.gif -> resources/images/Other/birds_chickadee.gif  
resources/images/birds_chicken.gif -> resources/images/Other/birds_chicken.gif  
resources/images/birds_dove.gif -> resources/images/Other/birds_dove.gif  
resources/images/birds_dove2.gif -> resources/images/Other/birds_dove2.gif  
resources/images/birdsnest.gif -> resources/images/Other/birdsnest.gif  
resources/images/bizzy_wizzy.gif -> resources/images/Other/bizzy_wizzy.gif  
resources/images/blahblah.gif -> resources/images/Other/blahblah.gif  
resources/images/body_spin.gif -> resources/images/Other/body_spin.gif  
resources/images/bonk.gif -> resources/images/Other/bonk.gif  
resources/images/brachiosaurus.gif -> resources/images/Other/brachiosaurus.gif  
resources/images/bright_idea.gif -> resources/images/Other/bright_idea.gif  
resources/images/butterflies.gif -> resources/images/Other/butterflies.gif  
resources/images/butterfly_blue.gif -> resources/images/Other/butterfly_blue.gif  
resources/images/butterfly_monarch.gif -> resources/images/Other/butterfly_monarch.gif  
resources/images/cactus.gif -> resources/images/Other/cactus.gif  
resources/images/cat.gif -> resources/images/Other/cat.gif  
resources/images/caterpillar.gif -> resources/images/Other/caterpillar.gif  
resources/images/cd.gif -> resources/images/Other/cd.gif  
resources/images/christmas_garland.gif -> resources/images/Other/christmas_garland.gif  
resources/images/christmas_holly.gif -> resources/images/Other/christmas_holly.gif  
resources/images/christmas_wreath.gif -> resources/images/Other/christmas_wreath.gif  
resources/images/christmas_wreath2.gif -> resources/images/Other/christmas_wreath2.gif  
resources/images/christmas_wreath3.gif -> resources/images/Other/christmas_wreath3.gif  
resources/images/click_here.gif -> resources/images/Other/click_here.gif  
resources/images/clippy.gif -> resources/images/Other/clippy.gif  
resources/images/coffee.gif -> resources/images/Other/coffee.gif  
resources/images/computer.gif -> resources/images/Other/computer.gif  
resources/images/construct.gif -> resources/images/Other/construct.gif  
resources/images/cow.gif -> resources/images/Other/cow.gif  
resources/images/curtain.gif -> resources/images/Other/curtain.gif  
resources/images/daisies.gif -> resources/images/Other/daisies.gif  
resources/images/dancingman.gif -> resources/images/Other/dancingman.gif  
resources/images/dancingwoman.gif -> resources/images/Other/dancingwoman.gif  
resources/images/dark_tidings.gif -> resources/images/Other/dark_tidings.gif  
resources/images/devil.gif -> resources/images/Other/devil.gif  
resources/images/Other/disco_ball.gifnew
resources/images/dollhouse.gif -> resources/images/Other/dollhouse.gif  
resources/images/donut_blink.gif -> resources/images/Other/donut_blink.gif  
resources/images/donut_drink.gif -> resources/images/Other/donut_drink.gif  
resources/images/donut_love.gif -> resources/images/Other/donut_love.gif  
resources/images/doraemon.gif -> resources/images/Other/doraemon.gif  
resources/images/doraemon_stamp.gif -> resources/images/Other/doraemon_stamp.gif  
resources/images/dvd.gif -> resources/images/Other/dvd.gif  
resources/images/email.gif -> resources/images/Other/email.gif  
resources/images/email2.gif -> resources/images/Other/email2.gif  
resources/images/fish_bass.gif -> resources/images/Other/fish_bass.gif  
resources/images/fish_rainbow_trout.gif -> resources/images/Other/fish_rainbow_trout.gif  
resources/images/fish_salmon.gif -> resources/images/Other/fish_salmon.gif  
resources/images/fish_trout.gif -> resources/images/Other/fish_trout.gif  
resources/images/fish_trout2.gif -> resources/images/Other/fish_trout2.gif  
resources/images/flaming_chariot.gif -> resources/images/Other/flaming_chariot.gif  
resources/images/flowers.gif -> resources/images/Other/flowers.gif  
resources/images/frog_car.gif -> resources/images/Other/frog_car.gif  
resources/images/gaia.gif -> resources/images/Other/gaia.gif  
resources/images/garf.gif -> resources/images/Other/garf.gif  
resources/images/gc_icon.gif -> resources/images/Other/gc_icon.gif  
resources/images/hacker_skull.gif -> resources/images/Other/hacker_skull.gif  
resources/images/hacking.gif -> resources/images/Other/hacking.gif  
resources/images/hamtaro.gif -> resources/images/Other/hamtaro.gif  
resources/images/hellokitty.gif -> resources/images/Other/hellokitty.gif  
resources/images/Other/hint.gifnew
resources/images/home.gif -> resources/images/Other/home.gif  
resources/images/kings.gif -> resources/images/Other/kings.gif  
resources/images/kogu.gif -> resources/images/Other/kogu.gif  
resources/images/kori.gif -> resources/images/Other/kori.gif  
resources/images/lil_buddha.gif -> resources/images/Other/lil_buddha.gif  
resources/images/lil_demon.gif -> resources/images/Other/lil_demon.gif  
resources/images/mac.gif -> resources/images/Other/mac.gif  
resources/images/mailbox.gif -> resources/images/Other/mailbox.gif  
resources/images/mario64.gif -> resources/images/Other/mario64.gif  
resources/images/modchips.gif -> resources/images/Other/modchips.gif  
resources/images/neopet.gif -> resources/images/Other/neopet.gif  
resources/images/ness.gif -> resources/images/Other/ness.gif  
resources/images/new_bunny.gif -> resources/images/Other/new_bunny.gif  
resources/images/orbit.gif -> resources/images/Other/orbit.gif  
resources/images/pika_construction.gif -> resources/images/Other/pika_construction.gif  
resources/images/pink_clock.gif -> resources/images/Other/pink_clock.gif  
resources/images/pizza_pointer.gif -> resources/images/Other/pizza_pointer.gif  
resources/images/pizza_pointer2.gif -> resources/images/Other/pizza_pointer2.gif  
resources/images/pochacco.gif -> resources/images/Other/pochacco.gif  
resources/images/providence.gif -> resources/images/Other/providence.gif  
resources/images/ratrace.gif -> resources/images/Other/ratrace.gif  
resources/images/ratrace2.gif -> resources/images/Other/ratrace2.gif  
resources/images/rilakkuma_dance.gif -> resources/images/Other/rilakkuma_dance.gif  
resources/images/ring.gif -> resources/images/Other/ring.gif  
resources/images/sailor_moon.gif -> resources/images/Other/sailor_moon.gif  
resources/images/samus.gif -> resources/images/Other/samus.gif  
resources/images/scared_mouse.gif -> resources/images/Other/scared_mouse.gif  
resources/images/skateboard.gif -> resources/images/Other/skateboard.gif  
resources/images/smiley_bar.gif -> resources/images/Other/smiley_bar.gif  
resources/images/smiley_dancing.gif -> resources/images/Other/smiley_dancing.gif  
resources/images/smiling_pizza.gif -> resources/images/Other/smiling_pizza.gif  
resources/images/spacedog.gif -> resources/images/Other/spacedog.gif  
resources/images/spinninbrain.gif -> resources/images/Other/spinninbrain.gif  
resources/images/squidward.gif -> resources/images/Other/squidward.gif  
resources/images/stonehenge.gif -> resources/images/Other/stonehenge.gif  
resources/images/sun_claymation.gif -> resources/images/Other/sun_claymation.gif  
resources/images/sun_coffee.gif -> resources/images/Other/sun_coffee.gif  
resources/images/sun_smiling.gif -> resources/images/Other/sun_smiling.gif  
resources/images/sun_welcome.gif -> resources/images/Other/sun_welcome.gif  
resources/images/surfin.gif -> resources/images/Other/surfin.gif  
resources/images/tamas.gif -> resources/images/Other/tamas.gif  
resources/images/telephone.gif -> resources/images/Other/telephone.gif  
resources/images/tooth.gif -> resources/images/Other/tooth.gif  
resources/images/trashcan_burp.gif -> resources/images/Other/trashcan_burp.gif  
resources/images/trashcan_chase.gif -> resources/images/Other/trashcan_chase.gif  
resources/images/trashcan_chomp.gif -> resources/images/Other/trashcan_chomp.gif  
resources/images/underconstruction.gif -> resources/images/Other/underconstruction.gif  
resources/images/welcome.gif -> resources/images/Other/welcome.gif  
resources/images/windows.gif -> resources/images/Other/windows.gif  
resources/images/wishingwell.gif -> resources/images/Other/wishingwell.gif  
resources/images/wizard.gif -> resources/images/Other/wizard.gif  
resources/images/y2k.gif -> resources/images/Other/y2k.gif  
resources/images/tux_badboy.gif -> resources/images/Tux/tux_badboy.gif  
resources/images/tux_blink.gif -> resources/images/Tux/tux_blink.gif  
resources/images/tux_chug.gif -> resources/images/Tux/tux_chug.gif  
resources/images/tux_got_root.gif -> resources/images/Tux/tux_got_root.gif  
resources/images/tux_hacking.gif -> resources/images/Tux/tux_hacking.gif  
resources/images/tux_linux_power.gif -> resources/images/Tux/tux_linux_power.gif  
resources/images/ww_9volt.gif -> resources/images/WarioWare/9volt.gif  
resources/images/ww_ana.gif -> resources/images/WarioWare/ana.gif  
resources/images/ww_crygor.gif -> resources/images/WarioWare/crygor.gif  
resources/images/ww_dribble.gif -> resources/images/WarioWare/dribble.gif  
resources/images/ww_jimmy.gif -> resources/images/WarioWare/jimmy.gif  
resources/images/ww_kat.gif -> resources/images/WarioWare/kat.gif  
resources/images/ww_mona.gif -> resources/images/WarioWare/mona.gif  
resources/images/ww_orbulon.gif -> resources/images/WarioWare/orbulon.gif  
resources/images/ww_spitz.gif -> resources/images/WarioWare/spitz.gif  
resources/images/ww_wario.gif -> resources/images/WarioWare/wario.gif  
resources/images/disco_ball.gifdeleted
resources/images/hint.gifdeleted
resources/js/main.js+71-43
resources/resource-manifest.json+190-378
resources/scripts/generate_resource_manifest.py+14-7

README.md
 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>
pages/avocado_warehouse/index.html
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>
pages/my_homepage/index.html
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>
pages/pizza_heaven/index.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>
resources/images/bg_bricks.gif -> resources/images/Backgrounds/bg_bricks.gif
Binary files differ.
resources/images/bg_checker.gif -> resources/images/Backgrounds/bg_checker.gif
Binary files differ.
resources/images/bg_daisies.gif -> resources/images/Backgrounds/bg_daisies.gif
Binary files differ.
resources/images/bg_desert.gif -> resources/images/Backgrounds/bg_desert.gif
Binary files differ.
resources/images/bg_stars.gif -> resources/images/Backgrounds/bg_stars.gif
Binary files differ.
resources/images/bg_trippy.gif -> resources/images/Backgrounds/bg_trippy.gif
Binary files differ.
resources/images/bg_water.gif -> resources/images/Backgrounds/bg_water.gif
Binary files differ.
resources/images/divider_blissey.gif -> resources/images/Dividers/blissey.gif
Binary files differ.
resources/images/divider_blue_flowers.gif -> resources/images/Dividers/blue_flowers.gif
Binary files differ.
resources/images/divider_blue_flowers2.gif -> resources/images/Dividers/blue_flowers2.gif
Binary files differ.
resources/images/divider_rainbow.gif -> resources/images/Dividers/rainbow.gif
Binary files differ.
resources/images/divider_rainbow_dots.gif -> resources/images/Dividers/rainbow_dots.gif
Binary files differ.
resources/images/divider_red_flowers.gif -> resources/images/Dividers/red_flowers.gif
Binary files differ.
resources/images/divider_wildflowers.gif -> resources/images/Dividers/wildflowers.gif
Binary files differ.
resources/images/divider_yellow_flowers.gif -> resources/images/Dividers/yellow_flowers.gif
Binary files differ.
resources/images/furby1.gif -> resources/images/Furby/furby1.gif
Binary files differ.
resources/images/furby2.gif -> resources/images/Furby/furby2.gif
Binary files differ.
resources/images/furby3.gif -> resources/images/Furby/furby3.gif
Binary files differ.
resources/images/furby4.gif -> resources/images/Furby/furby4.gif
Binary files differ.
resources/images/furby5.gif -> resources/images/Furby/furby5.gif
Binary files differ.
resources/images/furby6.gif -> resources/images/Furby/furby6.gif
Binary files differ.
resources/images/furby7.gif -> resources/images/Furby/furby7.gif
Binary files differ.
resources/images/furby8.gif -> resources/images/Furby/furby8.gif
Binary files differ.
resources/images/furby9.gif -> resources/images/Furby/furby9.gif
Binary files differ.
resources/images/furby_banner.gif -> resources/images/Furby/furby_banner.gif
Binary files differ.
resources/images/furby_clouds.gif -> resources/images/Furby/furby_clouds.gif
Binary files differ.
resources/images/furby_field.gif -> resources/images/Furby/furby_field.gif
Binary files differ.
resources/images/furby_pink.gif -> resources/images/Furby/furby_pink.gif
Binary files differ.
resources/images/furby_shocked.gif -> resources/images/Furby/furby_shocked.gif
Binary files differ.
resources/images/furby_weird.gif -> resources/images/Furby/furby_weird.gif
Binary files differ.
resources/images/furbyland.gif -> resources/images/Furby/furbyland.gif
Binary files differ.
resources/images/halloween_ghost.gif -> resources/images/Halloween/ghost.gif
Binary files differ.
resources/images/halloween_jackolantern.gif -> resources/images/Halloween/jackolantern.gif
Binary files differ.
resources/images/halloween_jackolantern2.gif -> resources/images/Halloween/jackolantern2.gif
Binary files differ.
resources/images/hamster_angry.gif -> resources/images/Hamster/hamster_angry.gif
Binary files differ.
resources/images/hamster_bath.gif -> resources/images/Hamster/hamster_bath.gif
Binary files differ.
resources/images/hamster_building.gif -> resources/images/Hamster/hamster_building.gif
Binary files differ.
resources/images/hamster_chewing.gif -> resources/images/Hamster/hamster_chewing.gif
Binary files differ.
resources/images/hamster_confused.gif -> resources/images/Hamster/hamster_confused.gif
Binary files differ.
resources/images/hamster_dance.gif -> resources/images/Hamster/hamster_dance.gif
Binary files differ.
resources/images/hamster_dig.gif -> resources/images/Hamster/hamster_dig.gif
Binary files differ.
resources/images/hamster_hacking.gif -> resources/images/Hamster/hamster_hacking.gif
Binary files differ.
resources/images/hamster_happy.gif -> resources/images/Hamster/hamster_happy.gif
Binary files differ.
resources/images/hamster_itchy.gif -> resources/images/Hamster/hamster_itchy.gif
Binary files differ.
resources/images/hamster_monch.gif -> resources/images/Hamster/hamster_monch.gif
Binary files differ.
resources/images/hamster_nunchucks.gif -> resources/images/Hamster/hamster_nunchucks.gif
Binary files differ.
resources/images/hamster_omp.gif -> resources/images/Hamster/hamster_omp.gif
Binary files differ.
resources/images/hamster_scared.gif -> resources/images/Hamster/hamster_scared.gif
Binary files differ.
resources/images/hamster_sleep.gif -> resources/images/Hamster/hamster_sleep.gif
Binary files differ.
resources/images/hamster_sleepy.gif -> resources/images/Hamster/hamster_sleepy.gif
Binary files differ.
resources/images/24.gif -> resources/images/Other/24.gif
Binary files differ.
resources/images/alarm_alarmed.gif -> resources/images/Other/alarm_alarmed.gif
Binary files differ.
resources/images/alarm_snoozed.gif -> resources/images/Other/alarm_snoozed.gif
Binary files differ.
resources/images/alien_ufo_crash.gif -> resources/images/Other/alien_ufo_crash.gif
Binary files differ.
resources/images/alien_ufo_float.gif -> resources/images/Other/alien_ufo_float.gif
Binary files differ.
resources/images/banana_dance.gif -> resources/images/Other/banana_dance.gif
Binary files differ.
resources/images/bang.gif -> resources/images/Other/bang.gif
Binary files differ.
resources/images/bigN.gif -> resources/images/Other/bigN.gif
Binary files differ.
resources/images/birdbath.gif -> resources/images/Other/birdbath.gif
Binary files differ.
resources/images/birds_chickadee.gif -> resources/images/Other/birds_chickadee.gif
Binary files differ.
resources/images/birds_chicken.gif -> resources/images/Other/birds_chicken.gif
Binary files differ.
resources/images/birds_dove.gif -> resources/images/Other/birds_dove.gif
Binary files differ.
resources/images/birds_dove2.gif -> resources/images/Other/birds_dove2.gif
Binary files differ.
resources/images/birdsnest.gif -> resources/images/Other/birdsnest.gif
Binary files differ.
resources/images/bizzy_wizzy.gif -> resources/images/Other/bizzy_wizzy.gif
Binary files differ.
resources/images/blahblah.gif -> resources/images/Other/blahblah.gif
Binary files differ.
resources/images/body_spin.gif -> resources/images/Other/body_spin.gif
Binary files differ.
resources/images/bonk.gif -> resources/images/Other/bonk.gif
Binary files differ.
resources/images/brachiosaurus.gif -> resources/images/Other/brachiosaurus.gif
Binary files differ.
resources/images/bright_idea.gif -> resources/images/Other/bright_idea.gif
Binary files differ.
resources/images/butterflies.gif -> resources/images/Other/butterflies.gif
Binary files differ.
resources/images/butterfly_blue.gif -> resources/images/Other/butterfly_blue.gif
Binary files differ.
resources/images/butterfly_monarch.gif -> resources/images/Other/butterfly_monarch.gif
Binary files differ.
resources/images/cactus.gif -> resources/images/Other/cactus.gif
Binary files differ.
resources/images/cat.gif -> resources/images/Other/cat.gif
Binary files differ.
resources/images/caterpillar.gif -> resources/images/Other/caterpillar.gif
Binary files differ.
resources/images/cd.gif -> resources/images/Other/cd.gif
Binary files differ.
resources/images/christmas_garland.gif -> resources/images/Other/christmas_garland.gif
Binary files differ.
resources/images/christmas_holly.gif -> resources/images/Other/christmas_holly.gif
Binary files differ.
resources/images/christmas_wreath.gif -> resources/images/Other/christmas_wreath.gif
Binary files differ.
resources/images/christmas_wreath2.gif -> resources/images/Other/christmas_wreath2.gif
Binary files differ.
resources/images/christmas_wreath3.gif -> resources/images/Other/christmas_wreath3.gif
Binary files differ.
resources/images/click_here.gif -> resources/images/Other/click_here.gif
Binary files differ.
resources/images/clippy.gif -> resources/images/Other/clippy.gif
Binary files differ.
resources/images/coffee.gif -> resources/images/Other/coffee.gif
Binary files differ.
resources/images/computer.gif -> resources/images/Other/computer.gif
Binary files differ.
resources/images/construct.gif -> resources/images/Other/construct.gif
Binary files differ.
resources/images/cow.gif -> resources/images/Other/cow.gif
Binary files differ.
resources/images/curtain.gif -> resources/images/Other/curtain.gif
Binary files differ.
resources/images/daisies.gif -> resources/images/Other/daisies.gif
Binary files differ.
resources/images/dancingman.gif -> resources/images/Other/dancingman.gif
Binary files differ.
resources/images/dancingwoman.gif -> resources/images/Other/dancingwoman.gif
Binary files differ.
resources/images/dark_tidings.gif -> resources/images/Other/dark_tidings.gif
Binary files differ.
resources/images/devil.gif -> resources/images/Other/devil.gif
Binary files differ.
resources/images/Other/disco_ball.gif
Binary files differ.
resources/images/dollhouse.gif -> resources/images/Other/dollhouse.gif
Binary files differ.
resources/images/donut_blink.gif -> resources/images/Other/donut_blink.gif
Binary files differ.
resources/images/donut_drink.gif -> resources/images/Other/donut_drink.gif
Binary files differ.
resources/images/donut_love.gif -> resources/images/Other/donut_love.gif
Binary files differ.
resources/images/doraemon.gif -> resources/images/Other/doraemon.gif
Binary files differ.
resources/images/doraemon_stamp.gif -> resources/images/Other/doraemon_stamp.gif
Binary files differ.
resources/images/dvd.gif -> resources/images/Other/dvd.gif
Binary files differ.
resources/images/email.gif -> resources/images/Other/email.gif
Binary files differ.
resources/images/email2.gif -> resources/images/Other/email2.gif
Binary files differ.
resources/images/fish_bass.gif -> resources/images/Other/fish_bass.gif
Binary files differ.
resources/images/fish_rainbow_trout.gif -> resources/images/Other/fish_rainbow_trout.gif
Binary files differ.
resources/images/fish_salmon.gif -> resources/images/Other/fish_salmon.gif
Binary files differ.
resources/images/fish_trout.gif -> resources/images/Other/fish_trout.gif
Binary files differ.
resources/images/fish_trout2.gif -> resources/images/Other/fish_trout2.gif
Binary files differ.
resources/images/flaming_chariot.gif -> resources/images/Other/flaming_chariot.gif
Binary files differ.
resources/images/flowers.gif -> resources/images/Other/flowers.gif
Binary files differ.
resources/images/frog_car.gif -> resources/images/Other/frog_car.gif
Binary files differ.
resources/images/gaia.gif -> resources/images/Other/gaia.gif
Binary files differ.
resources/images/garf.gif -> resources/images/Other/garf.gif
Binary files differ.
resources/images/gc_icon.gif -> resources/images/Other/gc_icon.gif
Binary files differ.
resources/images/hacker_skull.gif -> resources/images/Other/hacker_skull.gif
Binary files differ.
resources/images/hacking.gif -> resources/images/Other/hacking.gif
Binary files differ.
resources/images/hamtaro.gif -> resources/images/Other/hamtaro.gif
Binary files differ.
resources/images/hellokitty.gif -> resources/images/Other/hellokitty.gif
Binary files differ.
resources/images/Other/hint.gif
Binary files differ.
resources/images/home.gif -> resources/images/Other/home.gif
Binary files differ.
resources/images/kings.gif -> resources/images/Other/kings.gif
Binary files differ.
resources/images/kogu.gif -> resources/images/Other/kogu.gif
Binary files differ.
resources/images/kori.gif -> resources/images/Other/kori.gif
Binary files differ.
resources/images/lil_buddha.gif -> resources/images/Other/lil_buddha.gif
Binary files differ.
resources/images/lil_demon.gif -> resources/images/Other/lil_demon.gif
Binary files differ.
resources/images/mac.gif -> resources/images/Other/mac.gif
Binary files differ.
resources/images/mailbox.gif -> resources/images/Other/mailbox.gif
Binary files differ.
resources/images/mario64.gif -> resources/images/Other/mario64.gif
Binary files differ.
resources/images/modchips.gif -> resources/images/Other/modchips.gif
Binary files differ.
resources/images/neopet.gif -> resources/images/Other/neopet.gif
Binary files differ.
resources/images/ness.gif -> resources/images/Other/ness.gif
Binary files differ.
resources/images/new_bunny.gif -> resources/images/Other/new_bunny.gif
Binary files differ.
resources/images/orbit.gif -> resources/images/Other/orbit.gif
Binary files differ.
resources/images/pika_construction.gif -> resources/images/Other/pika_construction.gif
Binary files differ.
resources/images/pink_clock.gif -> resources/images/Other/pink_clock.gif
Binary files differ.
resources/images/pizza_pointer.gif -> resources/images/Other/pizza_pointer.gif
Binary files differ.
resources/images/pizza_pointer2.gif -> resources/images/Other/pizza_pointer2.gif
Binary files differ.
resources/images/pochacco.gif -> resources/images/Other/pochacco.gif
Binary files differ.
resources/images/providence.gif -> resources/images/Other/providence.gif
Binary files differ.
resources/images/ratrace.gif -> resources/images/Other/ratrace.gif
Binary files differ.
resources/images/ratrace2.gif -> resources/images/Other/ratrace2.gif
Binary files differ.
resources/images/rilakkuma_dance.gif -> resources/images/Other/rilakkuma_dance.gif
Binary files differ.
resources/images/ring.gif -> resources/images/Other/ring.gif
Binary files differ.
resources/images/sailor_moon.gif -> resources/images/Other/sailor_moon.gif
Binary files differ.
resources/images/samus.gif -> resources/images/Other/samus.gif
Binary files differ.
resources/images/scared_mouse.gif -> resources/images/Other/scared_mouse.gif
Binary files differ.
resources/images/skateboard.gif -> resources/images/Other/skateboard.gif
Binary files differ.
resources/images/smiley_bar.gif -> resources/images/Other/smiley_bar.gif
Binary files differ.
resources/images/smiley_dancing.gif -> resources/images/Other/smiley_dancing.gif
Binary files differ.
resources/images/smiling_pizza.gif -> resources/images/Other/smiling_pizza.gif
Binary files differ.
resources/images/spacedog.gif -> resources/images/Other/spacedog.gif
Binary files differ.
resources/images/spinninbrain.gif -> resources/images/Other/spinninbrain.gif
Binary files differ.
resources/images/squidward.gif -> resources/images/Other/squidward.gif
Binary files differ.
resources/images/stonehenge.gif -> resources/images/Other/stonehenge.gif
Binary files differ.
resources/images/sun_claymation.gif -> resources/images/Other/sun_claymation.gif
Binary files differ.
resources/images/sun_coffee.gif -> resources/images/Other/sun_coffee.gif
Binary files differ.
resources/images/sun_smiling.gif -> resources/images/Other/sun_smiling.gif
Binary files differ.
resources/images/sun_welcome.gif -> resources/images/Other/sun_welcome.gif
Binary files differ.
resources/images/surfin.gif -> resources/images/Other/surfin.gif
Binary files differ.
resources/images/tamas.gif -> resources/images/Other/tamas.gif
Binary files differ.
resources/images/telephone.gif -> resources/images/Other/telephone.gif
Binary files differ.
resources/images/tooth.gif -> resources/images/Other/tooth.gif
Binary files differ.
resources/images/trashcan_burp.gif -> resources/images/Other/trashcan_burp.gif
Binary files differ.
resources/images/trashcan_chase.gif -> resources/images/Other/trashcan_chase.gif
Binary files differ.
resources/images/trashcan_chomp.gif -> resources/images/Other/trashcan_chomp.gif
Binary files differ.
resources/images/underconstruction.gif -> resources/images/Other/underconstruction.gif
Binary files differ.
resources/images/welcome.gif -> resources/images/Other/welcome.gif
Binary files differ.
resources/images/windows.gif -> resources/images/Other/windows.gif
Binary files differ.
resources/images/wishingwell.gif -> resources/images/Other/wishingwell.gif
Binary files differ.
resources/images/wizard.gif -> resources/images/Other/wizard.gif
Binary files differ.
resources/images/y2k.gif -> resources/images/Other/y2k.gif
Binary files differ.
resources/images/tux_badboy.gif -> resources/images/Tux/tux_badboy.gif
Binary files differ.
resources/images/tux_blink.gif -> resources/images/Tux/tux_blink.gif
Binary files differ.
resources/images/tux_chug.gif -> resources/images/Tux/tux_chug.gif
Binary files differ.
resources/images/tux_got_root.gif -> resources/images/Tux/tux_got_root.gif
Binary files differ.
resources/images/tux_hacking.gif -> resources/images/Tux/tux_hacking.gif
Binary files differ.
resources/images/tux_linux_power.gif -> resources/images/Tux/tux_linux_power.gif
Binary files differ.
resources/images/ww_9volt.gif -> resources/images/WarioWare/9volt.gif
Binary files differ.
resources/images/ww_ana.gif -> resources/images/WarioWare/ana.gif
Binary files differ.
resources/images/ww_crygor.gif -> resources/images/WarioWare/crygor.gif
Binary files differ.
resources/images/ww_dribble.gif -> resources/images/WarioWare/dribble.gif
Binary files differ.
resources/images/ww_jimmy.gif -> resources/images/WarioWare/jimmy.gif
Binary files differ.
resources/images/ww_kat.gif -> resources/images/WarioWare/kat.gif
Binary files differ.
resources/images/ww_mona.gif -> resources/images/WarioWare/mona.gif
Binary files differ.
resources/images/ww_orbulon.gif -> resources/images/WarioWare/orbulon.gif
Binary files differ.
resources/images/ww_spitz.gif -> resources/images/WarioWare/spitz.gif
Binary files differ.
resources/images/ww_wario.gif -> resources/images/WarioWare/wario.gif
Binary files differ.
resources/images/disco_ball.gif
Binary files differ.
resources/images/hint.gif
Binary files differ.
resources/js/main.js
  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 => {
resources/resource-manifest.json
  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  }
resources/scripts/generate_resource_manifest.py
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: