From 22fd9a4f17ed3971cc3c762f650790c744055249 Mon Sep 17 00:00:00 2001 From: James Montemagno Date: Tue, 10 Feb 2026 16:53:44 -0800 Subject: [PATCH] convert to react --- .github/copilot-instructions.md | 73 +- .github/workflows/deploy.yml | 56 + .github/workflows/jekyll.yml | 67 - .gitignore | 6 +- .vscode/tasks.json | 14 +- Gemfile | 19 - Gemfile.lock | 88 - README.md | 146 +- _config.yml | 28 - _data/sizes.yml | 16 - _layouts/default.html | 570 --- archive.html | 579 --- desktop.html | 573 --- index.html | 250 +- package-lock.json | 3408 +++++++++++++++++ package.json | 40 + phone.html | 600 --- public/404.html | 24 + CNAME => public/CNAME | 2 +- .../favicons}/android-chrome-192x192.png | Bin .../favicons}/android-chrome-512x512.png | Bin .../favicons}/apple-touch-icon.png | Bin .../favicons}/favicon-16x16.png | Bin .../favicons}/favicon-32x32.png | Bin {favicons => public/favicons}/favicon.ico | Bin .../favicons}/site.webmanifest | 0 {icons => public/icons}/visualstudio.png | Bin {icons => public/icons}/visualstudiocode.png | Bin {icons => public/icons}/vs2026-icon-big.png | Bin .../sweepstakesrules}/sweepstakesrules.md | 194 +- .../wallpapers}/archive/001.jpg | Bin .../wallpapers}/archive/002.jpg | Bin .../wallpapers}/archive/003.jpg | Bin .../wallpapers}/archive/004.jpg | Bin .../wallpapers}/archive/005.jpg | Bin .../wallpapers}/archive/006.jpg | Bin .../wallpapers}/archive/007.jpg | Bin .../wallpapers}/archive/008.jpg | Bin .../wallpapers}/archive/009.jpg | Bin .../wallpapers}/archive/010.jpg | Bin .../wallpapers}/archive/011.jpg | Bin .../wallpapers}/archive/012.jpg | Bin .../wallpapers}/archive/013.jpg | Bin .../wallpapers}/archive/014.jpg | Bin .../wallpapers}/archive/015.jpg | Bin .../wallpapers}/archive/016.jpg | Bin .../wallpapers}/archive/017.jpg | Bin .../wallpapers}/archive/018.jpg | Bin .../wallpapers}/archive/019.jpg | Bin .../wallpapers}/archive/020.jpg | Bin .../wallpapers}/archive/021.jpg | Bin .../wallpapers}/archive/022.jpg | Bin .../wallpapers}/archive/023.jpg | Bin .../wallpapers}/archive/024.jpg | Bin .../wallpapers}/archive/025.jpg | Bin .../wallpapers}/archive/026.jpg | Bin .../wallpapers}/archive/027.jpg | Bin .../wallpapers}/archive/028.jpg | Bin .../wallpapers}/archive/029.jpg | Bin .../wallpapers}/archive/030.jpg | Bin .../wallpapers}/archive/031.jpg | Bin .../wallpapers}/archive/032.jpg | Bin .../wallpapers}/archive/033.jpg | Bin .../wallpapers}/archive/034.jpg | Bin .../wallpapers}/archive/035.jpg | Bin .../wallpapers}/archive/036.jpg | Bin .../wallpapers}/archive/037.jpg | Bin .../wallpapers}/archive/038.jpg | Bin .../wallpapers}/archive/039.jpg | Bin .../wallpapers}/archive/040.jpg | Bin .../wallpapers}/archive/041.jpg | Bin .../wallpapers}/archive/042.jpg | Bin .../wallpapers}/archive/043.jpg | Bin .../wallpapers}/archive/044.jpg | Bin .../wallpapers}/archive/045.jpg | Bin .../wallpapers}/archive/046.jpg | Bin .../wallpapers}/archive/047.jpg | Bin .../wallpapers}/archive/048.jpg | Bin .../wallpapers}/archive/049.jpg | Bin .../wallpapers}/archive/050.jpg | Bin .../wallpapers}/archive/051.jpg | Bin .../wallpapers}/archive/052.jpg | Bin .../wallpapers}/archive/053.jpg | Bin .../wallpapers}/archive/054.jpg | Bin .../wallpapers}/archive/055.jpg | Bin .../wallpapers}/archive/056.jpg | Bin .../wallpapers}/archive/057.jpg | Bin .../wallpapers}/archive/058.jpg | Bin .../wallpapers}/archive/059.jpg | Bin .../wallpapers}/archive/060.jpg | Bin .../wallpapers}/archive/061.jpg | Bin .../wallpapers}/archive/062.jpg | Bin .../wallpapers}/archive/063.jpg | Bin .../wallpapers}/archive/064.jpg | Bin .../wallpapers}/archive/065.jpg | Bin .../wallpapers}/archive/066.jpg | Bin .../wallpapers}/archive/067.jpg | Bin .../wallpapers}/archive/068.jpg | Bin .../wallpapers}/archive/069.jpg | Bin .../wallpapers}/archive/070.jpg | Bin .../wallpapers}/archive/071.jpg | Bin .../wallpapers}/archive/072.jpg | Bin .../wallpapers}/archive/073.jpg | Bin .../wallpapers}/archive/074.jpg | Bin .../wallpapers}/archive/075.jpg | Bin .../wallpapers}/archive/076.jpg | Bin .../wallpapers}/archive/077.jpg | Bin .../wallpapers}/archive/078.jpg | Bin .../wallpapers}/archive/079.jpg | Bin .../wallpapers}/archive/080.jpg | Bin .../wallpapers}/archive/081.jpg | Bin .../wallpapers}/archive/082.jpg | Bin .../wallpapers}/archive/083.jpg | Bin .../wallpapers}/archive/084.jpg | Bin .../wallpapers}/archive/085.jpg | Bin .../wallpapers}/archive/086.jpg | Bin .../wallpapers}/archive/087.jpg | Bin .../wallpapers}/archive/088.jpg | Bin .../wallpapers}/archive/089.jpg | Bin .../wallpapers}/archive/090.jpg | Bin .../wallpapers}/archive/091.jpg | Bin .../wallpapers}/archive/092.jpg | Bin .../wallpapers}/archive/093.jpg | Bin .../wallpapers}/archive/094.jpg | Bin .../wallpapers}/archive/095.jpg | Bin .../wallpapers}/archive/096.jpg | Bin .../wallpapers}/archive/097.jpg | Bin .../wallpapers}/archive/098.jpg | Bin .../wallpapers}/archive/099.jpg | Bin .../wallpapers}/archive/100.jpg | Bin .../wallpapers}/archive/101.jpg | Bin .../wallpapers}/archive/102.jpg | Bin .../wallpapers}/archive/103.jpg | Bin .../wallpapers}/archive/104.jpg | Bin .../wallpapers}/archive/105.jpg | Bin .../wallpapers}/archive/106.jpg | Bin .../wallpapers}/archive/107.jpg | Bin .../wallpapers}/archive/108.jpg | Bin .../wallpapers}/archive/109.jpg | Bin .../wallpapers}/archive/110.jpg | Bin .../wallpapers}/archive/111.jpg | Bin .../wallpapers}/archive/112.jpg | Bin .../wallpapers}/archive/113.jpg | Bin .../wallpapers}/archive/114.jpg | Bin .../wallpapers}/archive/115.jpg | Bin .../wallpapers}/archive/116.jpg | Bin .../wallpapers}/archive/117.jpg | Bin .../wallpapers}/archive/118.jpg | Bin .../wallpapers}/archive/119.jpg | Bin .../wallpapers}/archive/120.jpg | Bin .../wallpapers}/archive/121.jpg | Bin .../wallpapers}/archive/122.jpg | Bin .../wallpapers}/archive/123.jpg | Bin .../wallpapers}/archive/124.jpg | Bin .../wallpapers}/archive/125.jpg | Bin .../wallpapers}/archive/126.jpg | Bin .../wallpapers}/archive/127.jpg | Bin .../wallpapers}/archive/128.jpg | Bin .../wallpapers}/archive/129.jpg | Bin .../wallpapers}/archive/130.jpg | Bin .../wallpapers}/archive/131.jpg | Bin .../wallpapers}/archive/132.jpg | Bin .../wallpapers}/archive/133.jpg | Bin .../wallpapers}/archive/134.jpg | Bin .../wallpapers}/archive/135.jpg | Bin .../wallpapers}/archive/136.jpg | Bin .../wallpapers}/archive/137.jpg | Bin .../wallpapers}/archive/138.jpg | Bin .../wallpapers}/archive/thumbnail/001.jpg | Bin .../wallpapers}/archive/thumbnail/002.jpg | Bin .../wallpapers}/archive/thumbnail/003.jpg | Bin .../wallpapers}/archive/thumbnail/004.jpg | Bin .../wallpapers}/archive/thumbnail/005.jpg | Bin .../wallpapers}/archive/thumbnail/006.jpg | Bin .../wallpapers}/archive/thumbnail/007.jpg | Bin .../wallpapers}/archive/thumbnail/008.jpg | Bin .../wallpapers}/archive/thumbnail/009.jpg | Bin .../wallpapers}/archive/thumbnail/010.jpg | Bin .../wallpapers}/archive/thumbnail/011.jpg | Bin .../wallpapers}/archive/thumbnail/012.jpg | Bin .../wallpapers}/archive/thumbnail/013.jpg | Bin .../wallpapers}/archive/thumbnail/014.jpg | Bin .../wallpapers}/archive/thumbnail/015.jpg | Bin .../wallpapers}/archive/thumbnail/016.jpg | Bin .../wallpapers}/archive/thumbnail/017.jpg | Bin .../wallpapers}/archive/thumbnail/018.jpg | Bin .../wallpapers}/archive/thumbnail/019.jpg | Bin .../wallpapers}/archive/thumbnail/020.jpg | Bin .../wallpapers}/archive/thumbnail/021.jpg | Bin .../wallpapers}/archive/thumbnail/022.jpg | Bin .../wallpapers}/archive/thumbnail/023.jpg | Bin .../wallpapers}/archive/thumbnail/024.jpg | Bin .../wallpapers}/archive/thumbnail/025.jpg | Bin .../wallpapers}/archive/thumbnail/026.jpg | Bin .../wallpapers}/archive/thumbnail/027.jpg | Bin .../wallpapers}/archive/thumbnail/028.jpg | Bin .../wallpapers}/archive/thumbnail/029.jpg | Bin .../wallpapers}/archive/thumbnail/030.jpg | Bin .../wallpapers}/archive/thumbnail/031.jpg | Bin .../wallpapers}/archive/thumbnail/032.jpg | Bin .../wallpapers}/archive/thumbnail/033.jpg | Bin .../wallpapers}/archive/thumbnail/034.jpg | Bin .../wallpapers}/archive/thumbnail/035.jpg | Bin .../wallpapers}/archive/thumbnail/036.jpg | Bin .../wallpapers}/archive/thumbnail/037.jpg | Bin .../wallpapers}/archive/thumbnail/038.jpg | Bin .../wallpapers}/archive/thumbnail/039.jpg | Bin .../wallpapers}/archive/thumbnail/040.jpg | Bin .../wallpapers}/archive/thumbnail/041.jpg | Bin .../wallpapers}/archive/thumbnail/042.jpg | Bin .../wallpapers}/archive/thumbnail/043.jpg | Bin .../wallpapers}/archive/thumbnail/044.jpg | Bin .../wallpapers}/archive/thumbnail/045.jpg | Bin .../wallpapers}/archive/thumbnail/046.jpg | Bin .../wallpapers}/archive/thumbnail/047.jpg | Bin .../wallpapers}/archive/thumbnail/048.jpg | Bin .../wallpapers}/archive/thumbnail/049.jpg | Bin .../wallpapers}/archive/thumbnail/050.jpg | Bin .../wallpapers}/archive/thumbnail/051.jpg | Bin .../wallpapers}/archive/thumbnail/052.jpg | Bin .../wallpapers}/archive/thumbnail/053.jpg | Bin .../wallpapers}/archive/thumbnail/054.jpg | Bin .../wallpapers}/archive/thumbnail/055.jpg | Bin .../wallpapers}/archive/thumbnail/056.jpg | Bin .../wallpapers}/archive/thumbnail/057.jpg | Bin .../wallpapers}/archive/thumbnail/058.jpg | Bin .../wallpapers}/archive/thumbnail/059.jpg | Bin .../wallpapers}/archive/thumbnail/060.jpg | Bin .../wallpapers}/archive/thumbnail/061.jpg | Bin .../wallpapers}/archive/thumbnail/062.jpg | Bin .../wallpapers}/archive/thumbnail/063.jpg | Bin .../wallpapers}/archive/thumbnail/064.jpg | Bin .../wallpapers}/archive/thumbnail/065.jpg | Bin .../wallpapers}/archive/thumbnail/066.jpg | Bin .../wallpapers}/archive/thumbnail/067.jpg | Bin .../wallpapers}/archive/thumbnail/068.jpg | Bin .../wallpapers}/archive/thumbnail/069.jpg | Bin .../wallpapers}/archive/thumbnail/070.jpg | Bin .../wallpapers}/archive/thumbnail/071.jpg | Bin .../wallpapers}/archive/thumbnail/072.jpg | Bin .../wallpapers}/archive/thumbnail/073.jpg | Bin .../wallpapers}/archive/thumbnail/074.jpg | Bin .../wallpapers}/archive/thumbnail/075.jpg | Bin .../wallpapers}/archive/thumbnail/076.jpg | Bin .../wallpapers}/archive/thumbnail/077.jpg | Bin .../wallpapers}/archive/thumbnail/078.jpg | Bin .../wallpapers}/archive/thumbnail/079.jpg | Bin .../wallpapers}/archive/thumbnail/080.jpg | Bin .../wallpapers}/archive/thumbnail/081.jpg | Bin .../wallpapers}/archive/thumbnail/082.jpg | Bin .../wallpapers}/archive/thumbnail/083.jpg | Bin .../wallpapers}/archive/thumbnail/084.jpg | Bin .../wallpapers}/archive/thumbnail/085.jpg | Bin .../wallpapers}/archive/thumbnail/086.jpg | Bin .../wallpapers}/archive/thumbnail/087.jpg | Bin .../wallpapers}/archive/thumbnail/088.jpg | Bin .../wallpapers}/archive/thumbnail/089.jpg | Bin .../wallpapers}/archive/thumbnail/090.jpg | Bin .../wallpapers}/archive/thumbnail/091.jpg | Bin .../wallpapers}/archive/thumbnail/092.jpg | Bin .../wallpapers}/archive/thumbnail/093.jpg | Bin .../wallpapers}/archive/thumbnail/094.jpg | Bin .../wallpapers}/archive/thumbnail/095.jpg | Bin .../wallpapers}/archive/thumbnail/096.jpg | Bin .../wallpapers}/archive/thumbnail/097.jpg | Bin .../wallpapers}/archive/thumbnail/098.jpg | Bin .../wallpapers}/archive/thumbnail/099.jpg | Bin .../wallpapers}/archive/thumbnail/100.jpg | Bin .../wallpapers}/archive/thumbnail/101.jpg | Bin .../wallpapers}/archive/thumbnail/102.jpg | Bin .../wallpapers}/archive/thumbnail/103.jpg | Bin .../wallpapers}/archive/thumbnail/104.jpg | Bin .../wallpapers}/archive/thumbnail/105.jpg | Bin .../wallpapers}/archive/thumbnail/106.jpg | Bin .../wallpapers}/archive/thumbnail/107.jpg | Bin .../wallpapers}/archive/thumbnail/108.jpg | Bin .../wallpapers}/archive/thumbnail/109.jpg | Bin .../wallpapers}/archive/thumbnail/110.jpg | Bin .../wallpapers}/archive/thumbnail/111.jpg | Bin .../wallpapers}/archive/thumbnail/112.jpg | Bin .../wallpapers}/archive/thumbnail/113.jpg | Bin .../wallpapers}/archive/thumbnail/114.jpg | Bin .../wallpapers}/archive/thumbnail/115.jpg | Bin .../wallpapers}/archive/thumbnail/116.jpg | Bin .../wallpapers}/archive/thumbnail/117.jpg | Bin .../wallpapers}/archive/thumbnail/118.jpg | Bin .../wallpapers}/archive/thumbnail/119.jpg | Bin .../wallpapers}/archive/thumbnail/120.jpg | Bin .../wallpapers}/archive/thumbnail/121.jpg | Bin .../wallpapers}/archive/thumbnail/122.jpg | Bin .../wallpapers}/archive/thumbnail/123.jpg | Bin .../wallpapers}/archive/thumbnail/124.jpg | Bin .../wallpapers}/archive/thumbnail/125.jpg | Bin .../wallpapers}/archive/thumbnail/126.jpg | Bin .../wallpapers}/archive/thumbnail/127.jpg | Bin .../wallpapers}/archive/thumbnail/128.jpg | Bin .../wallpapers}/archive/thumbnail/129.jpg | Bin .../wallpapers}/archive/thumbnail/130.jpg | Bin .../wallpapers}/archive/thumbnail/131.jpg | Bin .../wallpapers}/archive/thumbnail/132.jpg | Bin .../wallpapers}/archive/thumbnail/133.jpg | Bin .../wallpapers}/archive/thumbnail/134.jpg | Bin .../wallpapers}/archive/thumbnail/135.jpg | Bin .../wallpapers}/archive/thumbnail/136.jpg | Bin .../wallpapers}/archive/thumbnail/137.jpg | Bin .../wallpapers}/archive/thumbnail/138.jpg | Bin .../wallpapers}/desktop/1280x720/000.jpg | Bin .../wallpapers}/desktop/1280x720/001.jpg | Bin .../wallpapers}/desktop/1280x720/002.jpg | Bin .../wallpapers}/desktop/1280x720/003.jpg | Bin .../wallpapers}/desktop/1280x720/004.jpg | Bin .../wallpapers}/desktop/1280x720/005.jpg | Bin .../wallpapers}/desktop/1280x720/006.jpg | Bin .../wallpapers}/desktop/1280x720/007.jpg | Bin .../wallpapers}/desktop/1280x720/008.jpg | Bin .../wallpapers}/desktop/1280x720/009.jpg | Bin .../wallpapers}/desktop/1280x720/010.jpg | Bin .../wallpapers}/desktop/1280x720/011.jpg | Bin .../wallpapers}/desktop/1280x720/012.jpg | Bin .../wallpapers}/desktop/1280x720/013.jpg | Bin .../wallpapers}/desktop/1280x720/014.jpg | Bin .../wallpapers}/desktop/1280x720/015.jpg | Bin .../wallpapers}/desktop/1280x720/016.jpg | Bin .../wallpapers}/desktop/1280x720/017.jpg | Bin .../wallpapers}/desktop/1280x720/018.jpg | Bin .../wallpapers}/desktop/1280x720/019.jpg | Bin .../wallpapers}/desktop/1280x720/020.jpg | Bin .../wallpapers}/desktop/1280x720/021.jpg | Bin .../wallpapers}/desktop/1280x720/022.jpg | Bin .../wallpapers}/desktop/1280x720/023.jpg | Bin .../wallpapers}/desktop/1280x720/024.jpg | Bin .../wallpapers}/desktop/1920x1080/000.jpg | Bin .../wallpapers}/desktop/1920x1080/001.jpg | Bin .../wallpapers}/desktop/1920x1080/002.jpg | Bin .../wallpapers}/desktop/1920x1080/003.jpg | Bin .../wallpapers}/desktop/1920x1080/004.jpg | Bin .../wallpapers}/desktop/1920x1080/005.jpg | Bin .../wallpapers}/desktop/1920x1080/006.jpg | Bin .../wallpapers}/desktop/1920x1080/007.jpg | Bin .../wallpapers}/desktop/1920x1080/008.jpg | Bin .../wallpapers}/desktop/1920x1080/009.jpg | Bin .../wallpapers}/desktop/1920x1080/010.jpg | Bin .../wallpapers}/desktop/1920x1080/011.jpg | Bin .../wallpapers}/desktop/1920x1080/012.jpg | Bin .../wallpapers}/desktop/1920x1080/013.jpg | Bin .../wallpapers}/desktop/1920x1080/014.jpg | Bin .../wallpapers}/desktop/1920x1080/015.jpg | Bin .../wallpapers}/desktop/1920x1080/016.jpg | Bin .../wallpapers}/desktop/1920x1080/017.jpg | Bin .../wallpapers}/desktop/1920x1080/018.jpg | Bin .../wallpapers}/desktop/1920x1080/019.jpg | Bin .../wallpapers}/desktop/1920x1080/020.jpg | Bin .../wallpapers}/desktop/1920x1080/021.jpg | Bin .../wallpapers}/desktop/1920x1080/022.jpg | Bin .../wallpapers}/desktop/1920x1080/023.jpg | Bin .../wallpapers}/desktop/1920x1080/024.jpg | Bin .../wallpapers}/desktop/3440x1400/000.jpg | Bin .../wallpapers}/desktop/3440x1400/001.jpg | Bin .../wallpapers}/desktop/3440x1400/002.jpg | Bin .../wallpapers}/desktop/3440x1400/003.jpg | Bin .../wallpapers}/desktop/3440x1400/004.jpg | Bin .../wallpapers}/desktop/3440x1400/005.jpg | Bin .../wallpapers}/desktop/3440x1400/006.jpg | Bin .../wallpapers}/desktop/3440x1400/007.jpg | Bin .../wallpapers}/desktop/3440x1400/008.jpg | Bin .../wallpapers}/desktop/3440x1400/009.jpg | Bin .../wallpapers}/desktop/3440x1400/010.jpg | Bin .../wallpapers}/desktop/3440x1400/011.jpg | Bin .../wallpapers}/desktop/3440x1400/012.jpg | Bin .../wallpapers}/desktop/3440x1400/013.jpg | Bin .../wallpapers}/desktop/3440x1400/014.jpg | Bin .../wallpapers}/desktop/3440x1400/015.jpg | Bin .../wallpapers}/desktop/3440x1400/016.jpg | Bin .../wallpapers}/desktop/3440x1400/017.jpg | Bin .../wallpapers}/desktop/3440x1400/018.jpg | Bin .../wallpapers}/desktop/3440x1400/019.jpg | Bin .../wallpapers}/desktop/3440x1400/020.jpg | Bin .../wallpapers}/desktop/3440x1400/021.jpg | Bin .../wallpapers}/desktop/3440x1400/022.jpg | Bin .../wallpapers}/desktop/3440x1400/023.jpg | Bin .../wallpapers}/desktop/3440x1400/024.jpg | Bin .../wallpapers}/desktop/3840x2160/000.jpg | Bin .../wallpapers}/desktop/3840x2160/001.jpg | Bin .../wallpapers}/desktop/3840x2160/002.jpg | Bin .../wallpapers}/desktop/3840x2160/003.jpg | Bin .../wallpapers}/desktop/3840x2160/004.jpg | Bin .../wallpapers}/desktop/3840x2160/005.jpg | Bin .../wallpapers}/desktop/3840x2160/006.jpg | Bin .../wallpapers}/desktop/3840x2160/007.jpg | Bin .../wallpapers}/desktop/3840x2160/008.jpg | Bin .../wallpapers}/desktop/3840x2160/009.jpg | Bin .../wallpapers}/desktop/3840x2160/010.jpg | Bin .../wallpapers}/desktop/3840x2160/011.jpg | Bin .../wallpapers}/desktop/3840x2160/012.jpg | Bin .../wallpapers}/desktop/3840x2160/013.jpg | Bin .../wallpapers}/desktop/3840x2160/014.jpg | Bin .../wallpapers}/desktop/3840x2160/015.jpg | Bin .../wallpapers}/desktop/3840x2160/016.jpg | Bin .../wallpapers}/desktop/3840x2160/017.jpg | Bin .../wallpapers}/desktop/3840x2160/018.jpg | Bin .../wallpapers}/desktop/3840x2160/019.jpg | Bin .../wallpapers}/desktop/3840x2160/020.jpg | Bin .../wallpapers}/desktop/3840x2160/021.jpg | Bin .../wallpapers}/desktop/3840x2160/022.jpg | Bin .../wallpapers}/desktop/3840x2160/023.jpg | Bin .../wallpapers}/desktop/3840x2160/024.jpg | Bin .../wallpapers}/desktop/thumbnails/000.jpg | Bin .../wallpapers}/desktop/thumbnails/001.jpg | Bin .../wallpapers}/desktop/thumbnails/002.jpg | Bin .../wallpapers}/desktop/thumbnails/003.jpg | Bin .../wallpapers}/desktop/thumbnails/004.jpg | Bin .../wallpapers}/desktop/thumbnails/005.jpg | Bin .../wallpapers}/desktop/thumbnails/006.jpg | Bin .../wallpapers}/desktop/thumbnails/007.jpg | Bin .../wallpapers}/desktop/thumbnails/008.jpg | Bin .../wallpapers}/desktop/thumbnails/009.jpg | Bin .../wallpapers}/desktop/thumbnails/010.jpg | Bin .../wallpapers}/desktop/thumbnails/011.jpg | Bin .../wallpapers}/desktop/thumbnails/012.jpg | Bin .../wallpapers}/desktop/thumbnails/013.jpg | Bin .../wallpapers}/desktop/thumbnails/014.jpg | Bin .../wallpapers}/desktop/thumbnails/015.jpg | Bin .../wallpapers}/desktop/thumbnails/016.jpg | Bin .../wallpapers}/desktop/thumbnails/017.jpg | Bin .../wallpapers}/desktop/thumbnails/018.jpg | Bin .../wallpapers}/desktop/thumbnails/019.jpg | Bin .../wallpapers}/desktop/thumbnails/020.jpg | Bin .../wallpapers}/desktop/thumbnails/021.jpg | Bin .../wallpapers}/desktop/thumbnails/022.jpg | Bin .../wallpapers}/desktop/thumbnails/023.jpg | Bin .../wallpapers}/desktop/thumbnails/024.jpg | Bin .../wallpapers}/phone/320x568/000.jpg | Bin .../wallpapers}/phone/320x568/001.jpg | Bin .../wallpapers}/phone/320x568/002.jpg | Bin .../wallpapers}/phone/320x568/003.jpg | Bin .../wallpapers}/phone/320x568/004.jpg | Bin .../wallpapers}/phone/320x568/005.jpg | Bin .../wallpapers}/phone/320x568/006.jpg | Bin .../wallpapers}/phone/320x568/007.jpg | Bin .../wallpapers}/phone/320x568/008.jpg | Bin .../wallpapers}/phone/320x568/009.jpg | Bin .../wallpapers}/phone/320x568/010.jpg | Bin .../wallpapers}/phone/320x568/011.jpg | Bin .../wallpapers}/phone/320x568/012.jpg | Bin .../wallpapers}/phone/320x568/013.jpg | Bin .../wallpapers}/phone/320x568/014.jpg | Bin .../wallpapers}/phone/320x568/015.jpg | Bin .../wallpapers}/phone/320x568/016.jpg | Bin .../wallpapers}/phone/320x568/017.jpg | Bin .../wallpapers}/phone/320x568/018.jpg | Bin .../wallpapers}/phone/320x568/019.jpg | Bin .../wallpapers}/phone/320x568/020.jpg | Bin .../wallpapers}/phone/320x568/021.jpg | Bin .../wallpapers}/phone/320x568/022.jpg | Bin .../wallpapers}/phone/320x568/023.jpg | Bin .../wallpapers}/phone/320x568/024.jpg | Bin .../wallpapers}/phone/360x640/000.jpg | Bin .../wallpapers}/phone/360x640/001.jpg | Bin .../wallpapers}/phone/360x640/002.jpg | Bin .../wallpapers}/phone/360x640/003.jpg | Bin .../wallpapers}/phone/360x640/004.jpg | Bin .../wallpapers}/phone/360x640/005.jpg | Bin .../wallpapers}/phone/360x640/006.jpg | Bin .../wallpapers}/phone/360x640/007.jpg | Bin .../wallpapers}/phone/360x640/008.jpg | Bin .../wallpapers}/phone/360x640/009.jpg | Bin .../wallpapers}/phone/360x640/010.jpg | Bin .../wallpapers}/phone/360x640/011.jpg | Bin .../wallpapers}/phone/360x640/012.jpg | Bin .../wallpapers}/phone/360x640/013.jpg | Bin .../wallpapers}/phone/360x640/014.jpg | Bin .../wallpapers}/phone/360x640/015.jpg | Bin .../wallpapers}/phone/360x640/016.jpg | Bin .../wallpapers}/phone/360x640/017.jpg | Bin .../wallpapers}/phone/360x640/018.jpg | Bin .../wallpapers}/phone/360x640/019.jpg | Bin .../wallpapers}/phone/360x640/020.jpg | Bin .../wallpapers}/phone/360x640/021.jpg | Bin .../wallpapers}/phone/360x640/022.jpg | Bin .../wallpapers}/phone/360x640/023.jpg | Bin .../wallpapers}/phone/360x640/024.jpg | Bin .../wallpapers}/phone/360x800/000.jpg | Bin .../wallpapers}/phone/360x800/001.jpg | Bin .../wallpapers}/phone/360x800/002.jpg | Bin .../wallpapers}/phone/360x800/003.jpg | Bin .../wallpapers}/phone/360x800/004.jpg | Bin .../wallpapers}/phone/360x800/005.jpg | Bin .../wallpapers}/phone/360x800/006.jpg | Bin .../wallpapers}/phone/360x800/007.jpg | Bin .../wallpapers}/phone/360x800/008.jpg | Bin .../wallpapers}/phone/360x800/009.jpg | Bin .../wallpapers}/phone/360x800/010.jpg | Bin .../wallpapers}/phone/360x800/011.jpg | Bin .../wallpapers}/phone/360x800/012.jpg | Bin .../wallpapers}/phone/360x800/013.jpg | Bin .../wallpapers}/phone/360x800/014.jpg | Bin .../wallpapers}/phone/360x800/015.jpg | Bin .../wallpapers}/phone/360x800/016.jpg | Bin .../wallpapers}/phone/360x800/017.jpg | Bin .../wallpapers}/phone/360x800/018.jpg | Bin .../wallpapers}/phone/360x800/019.jpg | Bin .../wallpapers}/phone/360x800/020.jpg | Bin .../wallpapers}/phone/360x800/021.jpg | Bin .../wallpapers}/phone/360x800/022.jpg | Bin .../wallpapers}/phone/360x800/023.jpg | Bin .../wallpapers}/phone/360x800/024.jpg | Bin .../wallpapers}/phone/390x844/000.jpg | Bin .../wallpapers}/phone/390x844/001.jpg | Bin .../wallpapers}/phone/390x844/002.jpg | Bin .../wallpapers}/phone/390x844/003.jpg | Bin .../wallpapers}/phone/390x844/004.jpg | Bin .../wallpapers}/phone/390x844/005.jpg | Bin .../wallpapers}/phone/390x844/006.jpg | Bin .../wallpapers}/phone/390x844/007.jpg | Bin .../wallpapers}/phone/390x844/008.jpg | Bin .../wallpapers}/phone/390x844/009.jpg | Bin .../wallpapers}/phone/390x844/010.jpg | Bin .../wallpapers}/phone/390x844/011.jpg | Bin .../wallpapers}/phone/390x844/012.jpg | Bin .../wallpapers}/phone/390x844/013.jpg | Bin .../wallpapers}/phone/390x844/014.jpg | Bin .../wallpapers}/phone/390x844/015.jpg | Bin .../wallpapers}/phone/390x844/016.jpg | Bin .../wallpapers}/phone/390x844/017.jpg | Bin .../wallpapers}/phone/390x844/018.jpg | Bin .../wallpapers}/phone/390x844/019.jpg | Bin .../wallpapers}/phone/390x844/020.jpg | Bin .../wallpapers}/phone/390x844/021.jpg | Bin .../wallpapers}/phone/390x844/022.jpg | Bin .../wallpapers}/phone/390x844/023.jpg | Bin .../wallpapers}/phone/390x844/024.jpg | Bin .../wallpapers}/phone/428x926/000.jpg | Bin .../wallpapers}/phone/428x926/001.jpg | Bin .../wallpapers}/phone/428x926/002.jpg | Bin .../wallpapers}/phone/428x926/003.jpg | Bin .../wallpapers}/phone/428x926/004.jpg | Bin .../wallpapers}/phone/428x926/005.jpg | Bin .../wallpapers}/phone/428x926/006.jpg | Bin .../wallpapers}/phone/428x926/007.jpg | Bin .../wallpapers}/phone/428x926/008.jpg | Bin .../wallpapers}/phone/428x926/009.jpg | Bin .../wallpapers}/phone/428x926/010.jpg | Bin .../wallpapers}/phone/428x926/011.jpg | Bin .../wallpapers}/phone/428x926/012.jpg | Bin .../wallpapers}/phone/428x926/013.jpg | Bin .../wallpapers}/phone/428x926/014.jpg | Bin .../wallpapers}/phone/428x926/015.jpg | Bin .../wallpapers}/phone/428x926/016.jpg | Bin .../wallpapers}/phone/428x926/017.jpg | Bin .../wallpapers}/phone/428x926/018.jpg | Bin .../wallpapers}/phone/428x926/019.jpg | Bin .../wallpapers}/phone/428x926/020.jpg | Bin .../wallpapers}/phone/428x926/021.jpg | Bin .../wallpapers}/phone/428x926/022.jpg | Bin .../wallpapers}/phone/428x926/023.jpg | Bin .../wallpapers}/phone/428x926/024.jpg | Bin .../wallpapers}/phone/430x932/000.jpg | Bin .../wallpapers}/phone/430x932/001.jpg | Bin .../wallpapers}/phone/430x932/002.jpg | Bin .../wallpapers}/phone/430x932/003.jpg | Bin .../wallpapers}/phone/430x932/004.jpg | Bin .../wallpapers}/phone/430x932/005.jpg | Bin .../wallpapers}/phone/430x932/006.jpg | Bin .../wallpapers}/phone/430x932/007.jpg | Bin .../wallpapers}/phone/430x932/008.jpg | Bin .../wallpapers}/phone/430x932/009.jpg | Bin .../wallpapers}/phone/430x932/010.jpg | Bin .../wallpapers}/phone/430x932/011.jpg | Bin .../wallpapers}/phone/430x932/012.jpg | Bin .../wallpapers}/phone/430x932/013.jpg | Bin .../wallpapers}/phone/430x932/014.jpg | Bin .../wallpapers}/phone/430x932/015.jpg | Bin .../wallpapers}/phone/430x932/016.jpg | Bin .../wallpapers}/phone/430x932/017.jpg | Bin .../wallpapers}/phone/430x932/018.jpg | Bin .../wallpapers}/phone/430x932/019.jpg | Bin .../wallpapers}/phone/430x932/020.jpg | Bin .../wallpapers}/phone/430x932/021.jpg | Bin .../wallpapers}/phone/430x932/022.jpg | Bin .../wallpapers}/phone/430x932/023.jpg | Bin .../wallpapers}/phone/430x932/024.jpg | Bin .../wallpapers}/watch/368x448/000.jpg | Bin .../wallpapers}/watch/368x448/001.jpg | Bin .../wallpapers}/watch/368x448/003.jpg | Bin .../wallpapers}/watch/368x448/004.jpg | Bin .../wallpapers}/watch/368x448/005.jpg | Bin .../wallpapers}/watch/368x448/006.jpg | Bin .../wallpapers}/watch/368x448/007.jpg | Bin .../wallpapers}/watch/368x448/008.jpg | Bin .../wallpapers}/watch/368x448/009.jpg | Bin .../wallpapers}/watch/368x448/010.jpg | Bin .../wallpapers}/watch/368x448/011.jpg | Bin .../wallpapers}/watch/368x448/012.jpg | Bin .../wallpapers}/watch/368x448/013.jpg | Bin .../wallpapers}/watch/368x448/014.jpg | Bin .../wallpapers}/watch/368x448/015.jpg | Bin .../wallpapers}/watch/368x448/016.jpg | Bin .../wallpapers}/watch/368x448/017.jpg | Bin .../wallpapers}/watch/368x448/018.jpg | Bin .../wallpapers}/watch/368x448/019.jpg | Bin .../wallpapers}/watch/368x448/020.jpg | Bin .../wallpapers}/watch/368x448/021.jpg | Bin .../wallpapers}/watch/368x448/022.jpg | Bin .../wallpapers}/watch/368x448/023.jpg | Bin .../wallpapers}/watch/368x448/024.jpg | Bin scripts/generate-manifest.js | 126 + src/App.tsx | 34 + src/components/DownloadOptions.module.css | 88 + src/components/DownloadOptions.tsx | 134 + src/components/Layout.module.css | 396 ++ src/components/Layout.tsx | 113 + src/components/PreviewModal.module.css | 169 + src/components/PreviewModal.tsx | 162 + src/components/WallpaperGrid.module.css | 127 + src/components/WallpaperGrid.tsx | 62 + src/contexts/ThemeContext.tsx | 113 + src/data/sizes.ts | 7 + src/data/wallpaper-manifest.json | 113 + src/index.css | 141 + src/main.tsx | 10 + src/pages/Archive.module.css | 105 + src/pages/Archive.tsx | 164 + src/pages/Desktop.tsx | 58 + src/pages/Home.module.css | 203 + src/pages/Home.tsx | 87 + src/pages/Phone.tsx | 58 + src/pages/SweepstakesRules.module.css | 160 + src/pages/SweepstakesRules.tsx | 36 + src/pages/Watch.tsx | 58 + src/vite-env.d.ts | 1 + tsconfig.json | 22 + tsconfig.node.json | 19 + vite.config.ts | 7 + watch.html | 431 --- 634 files changed, 6630 insertions(+), 3327 deletions(-) create mode 100644 .github/workflows/deploy.yml delete mode 100644 .github/workflows/jekyll.yml delete mode 100644 Gemfile delete mode 100644 Gemfile.lock delete mode 100644 _config.yml delete mode 100644 _data/sizes.yml delete mode 100644 _layouts/default.html delete mode 100644 archive.html delete mode 100644 desktop.html create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 phone.html create mode 100644 public/404.html rename CNAME => public/CNAME (96%) rename {favicons => public/favicons}/android-chrome-192x192.png (100%) rename {favicons => public/favicons}/android-chrome-512x512.png (100%) rename {favicons => public/favicons}/apple-touch-icon.png (100%) rename {favicons => public/favicons}/favicon-16x16.png (100%) rename {favicons => public/favicons}/favicon-32x32.png (100%) rename {favicons => public/favicons}/favicon.ico (100%) rename {favicons => public/favicons}/site.webmanifest (100%) rename {icons => public/icons}/visualstudio.png (100%) rename {icons => public/icons}/visualstudiocode.png (100%) rename {icons => public/icons}/vs2026-icon-big.png (100%) rename {sweepstakesrules => public/sweepstakesrules}/sweepstakesrules.md (99%) rename {wallpapers => public/wallpapers}/archive/001.jpg (100%) rename {wallpapers => public/wallpapers}/archive/002.jpg (100%) rename {wallpapers => public/wallpapers}/archive/003.jpg (100%) rename {wallpapers => public/wallpapers}/archive/004.jpg (100%) rename {wallpapers => public/wallpapers}/archive/005.jpg (100%) rename {wallpapers => public/wallpapers}/archive/006.jpg (100%) rename {wallpapers => public/wallpapers}/archive/007.jpg (100%) rename {wallpapers => public/wallpapers}/archive/008.jpg (100%) rename {wallpapers => public/wallpapers}/archive/009.jpg (100%) rename {wallpapers => public/wallpapers}/archive/010.jpg (100%) rename {wallpapers => public/wallpapers}/archive/011.jpg (100%) rename {wallpapers => public/wallpapers}/archive/012.jpg (100%) rename {wallpapers => public/wallpapers}/archive/013.jpg (100%) rename {wallpapers => public/wallpapers}/archive/014.jpg (100%) rename {wallpapers => public/wallpapers}/archive/015.jpg (100%) rename {wallpapers => public/wallpapers}/archive/016.jpg (100%) rename {wallpapers => public/wallpapers}/archive/017.jpg (100%) rename {wallpapers => public/wallpapers}/archive/018.jpg (100%) rename {wallpapers => public/wallpapers}/archive/019.jpg (100%) rename {wallpapers => public/wallpapers}/archive/020.jpg (100%) rename {wallpapers => public/wallpapers}/archive/021.jpg (100%) rename {wallpapers => public/wallpapers}/archive/022.jpg (100%) rename {wallpapers => public/wallpapers}/archive/023.jpg (100%) rename {wallpapers => public/wallpapers}/archive/024.jpg (100%) rename {wallpapers => public/wallpapers}/archive/025.jpg (100%) rename {wallpapers => public/wallpapers}/archive/026.jpg (100%) rename {wallpapers => public/wallpapers}/archive/027.jpg (100%) rename {wallpapers => public/wallpapers}/archive/028.jpg (100%) rename {wallpapers => public/wallpapers}/archive/029.jpg (100%) rename {wallpapers => public/wallpapers}/archive/030.jpg (100%) rename {wallpapers => public/wallpapers}/archive/031.jpg (100%) rename {wallpapers => public/wallpapers}/archive/032.jpg (100%) rename {wallpapers => public/wallpapers}/archive/033.jpg (100%) rename {wallpapers => public/wallpapers}/archive/034.jpg (100%) rename {wallpapers => public/wallpapers}/archive/035.jpg (100%) rename {wallpapers => public/wallpapers}/archive/036.jpg (100%) rename {wallpapers => public/wallpapers}/archive/037.jpg (100%) rename {wallpapers => public/wallpapers}/archive/038.jpg (100%) rename {wallpapers => public/wallpapers}/archive/039.jpg (100%) rename {wallpapers => public/wallpapers}/archive/040.jpg (100%) rename {wallpapers => public/wallpapers}/archive/041.jpg (100%) rename {wallpapers => public/wallpapers}/archive/042.jpg (100%) rename {wallpapers => public/wallpapers}/archive/043.jpg (100%) rename {wallpapers => public/wallpapers}/archive/044.jpg (100%) rename {wallpapers => public/wallpapers}/archive/045.jpg (100%) rename {wallpapers => public/wallpapers}/archive/046.jpg (100%) rename {wallpapers => public/wallpapers}/archive/047.jpg (100%) rename {wallpapers => public/wallpapers}/archive/048.jpg (100%) rename {wallpapers => public/wallpapers}/archive/049.jpg (100%) rename {wallpapers => public/wallpapers}/archive/050.jpg (100%) rename {wallpapers => public/wallpapers}/archive/051.jpg (100%) rename {wallpapers => public/wallpapers}/archive/052.jpg (100%) rename {wallpapers => public/wallpapers}/archive/053.jpg (100%) rename {wallpapers => public/wallpapers}/archive/054.jpg (100%) rename {wallpapers => public/wallpapers}/archive/055.jpg (100%) rename {wallpapers => public/wallpapers}/archive/056.jpg (100%) rename {wallpapers => public/wallpapers}/archive/057.jpg (100%) rename {wallpapers => public/wallpapers}/archive/058.jpg (100%) rename {wallpapers => public/wallpapers}/archive/059.jpg (100%) rename {wallpapers => public/wallpapers}/archive/060.jpg (100%) rename {wallpapers => public/wallpapers}/archive/061.jpg (100%) rename {wallpapers => public/wallpapers}/archive/062.jpg (100%) rename {wallpapers => public/wallpapers}/archive/063.jpg (100%) rename {wallpapers => public/wallpapers}/archive/064.jpg (100%) rename {wallpapers => public/wallpapers}/archive/065.jpg (100%) rename {wallpapers => public/wallpapers}/archive/066.jpg (100%) rename {wallpapers => public/wallpapers}/archive/067.jpg (100%) rename {wallpapers => public/wallpapers}/archive/068.jpg (100%) rename {wallpapers => public/wallpapers}/archive/069.jpg (100%) rename {wallpapers => public/wallpapers}/archive/070.jpg (100%) rename {wallpapers => public/wallpapers}/archive/071.jpg (100%) rename {wallpapers => public/wallpapers}/archive/072.jpg (100%) rename {wallpapers => public/wallpapers}/archive/073.jpg (100%) rename {wallpapers => public/wallpapers}/archive/074.jpg (100%) rename {wallpapers => public/wallpapers}/archive/075.jpg (100%) rename {wallpapers => public/wallpapers}/archive/076.jpg (100%) rename {wallpapers => public/wallpapers}/archive/077.jpg (100%) rename {wallpapers => public/wallpapers}/archive/078.jpg (100%) rename {wallpapers => public/wallpapers}/archive/079.jpg (100%) rename {wallpapers => public/wallpapers}/archive/080.jpg (100%) rename {wallpapers => public/wallpapers}/archive/081.jpg (100%) rename {wallpapers => public/wallpapers}/archive/082.jpg (100%) rename {wallpapers => public/wallpapers}/archive/083.jpg (100%) rename {wallpapers => public/wallpapers}/archive/084.jpg (100%) rename {wallpapers => public/wallpapers}/archive/085.jpg (100%) rename {wallpapers => public/wallpapers}/archive/086.jpg (100%) rename {wallpapers => public/wallpapers}/archive/087.jpg (100%) rename {wallpapers => public/wallpapers}/archive/088.jpg (100%) rename {wallpapers => public/wallpapers}/archive/089.jpg (100%) rename {wallpapers => public/wallpapers}/archive/090.jpg (100%) rename {wallpapers => public/wallpapers}/archive/091.jpg (100%) rename {wallpapers => public/wallpapers}/archive/092.jpg (100%) rename {wallpapers => public/wallpapers}/archive/093.jpg (100%) rename {wallpapers => public/wallpapers}/archive/094.jpg (100%) rename {wallpapers => public/wallpapers}/archive/095.jpg (100%) rename {wallpapers => public/wallpapers}/archive/096.jpg (100%) rename {wallpapers => public/wallpapers}/archive/097.jpg (100%) rename {wallpapers => public/wallpapers}/archive/098.jpg (100%) rename {wallpapers => public/wallpapers}/archive/099.jpg (100%) rename {wallpapers => public/wallpapers}/archive/100.jpg (100%) rename {wallpapers => public/wallpapers}/archive/101.jpg (100%) rename {wallpapers => public/wallpapers}/archive/102.jpg (100%) rename {wallpapers => public/wallpapers}/archive/103.jpg (100%) rename {wallpapers => public/wallpapers}/archive/104.jpg (100%) rename {wallpapers => public/wallpapers}/archive/105.jpg (100%) rename {wallpapers => public/wallpapers}/archive/106.jpg (100%) rename {wallpapers => public/wallpapers}/archive/107.jpg (100%) rename {wallpapers => public/wallpapers}/archive/108.jpg (100%) rename {wallpapers => public/wallpapers}/archive/109.jpg (100%) rename {wallpapers => public/wallpapers}/archive/110.jpg (100%) rename {wallpapers => public/wallpapers}/archive/111.jpg (100%) rename {wallpapers => public/wallpapers}/archive/112.jpg (100%) rename {wallpapers => public/wallpapers}/archive/113.jpg (100%) rename {wallpapers => public/wallpapers}/archive/114.jpg (100%) rename {wallpapers => public/wallpapers}/archive/115.jpg (100%) rename {wallpapers => public/wallpapers}/archive/116.jpg (100%) rename {wallpapers => public/wallpapers}/archive/117.jpg (100%) rename {wallpapers => public/wallpapers}/archive/118.jpg (100%) rename {wallpapers => public/wallpapers}/archive/119.jpg (100%) rename {wallpapers => public/wallpapers}/archive/120.jpg (100%) rename {wallpapers => public/wallpapers}/archive/121.jpg (100%) rename {wallpapers => public/wallpapers}/archive/122.jpg (100%) rename {wallpapers => public/wallpapers}/archive/123.jpg (100%) rename {wallpapers => public/wallpapers}/archive/124.jpg (100%) rename {wallpapers => public/wallpapers}/archive/125.jpg (100%) rename {wallpapers => public/wallpapers}/archive/126.jpg (100%) rename {wallpapers => public/wallpapers}/archive/127.jpg (100%) rename {wallpapers => public/wallpapers}/archive/128.jpg (100%) rename {wallpapers => public/wallpapers}/archive/129.jpg (100%) rename {wallpapers => public/wallpapers}/archive/130.jpg (100%) rename {wallpapers => public/wallpapers}/archive/131.jpg (100%) rename {wallpapers => public/wallpapers}/archive/132.jpg (100%) rename {wallpapers => public/wallpapers}/archive/133.jpg (100%) rename {wallpapers => public/wallpapers}/archive/134.jpg (100%) rename {wallpapers => public/wallpapers}/archive/135.jpg (100%) rename {wallpapers => public/wallpapers}/archive/136.jpg (100%) rename {wallpapers => public/wallpapers}/archive/137.jpg (100%) rename {wallpapers => public/wallpapers}/archive/138.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/001.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/002.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/003.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/004.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/005.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/006.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/007.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/008.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/009.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/010.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/011.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/012.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/013.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/014.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/015.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/016.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/017.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/018.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/019.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/020.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/021.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/022.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/023.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/024.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/025.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/026.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/027.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/028.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/029.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/030.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/031.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/032.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/033.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/034.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/035.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/036.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/037.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/038.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/039.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/040.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/041.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/042.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/043.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/044.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/045.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/046.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/047.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/048.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/049.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/050.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/051.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/052.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/053.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/054.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/055.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/056.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/057.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/058.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/059.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/060.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/061.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/062.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/063.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/064.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/065.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/066.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/067.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/068.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/069.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/070.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/071.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/072.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/073.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/074.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/075.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/076.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/077.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/078.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/079.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/080.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/081.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/082.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/083.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/084.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/085.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/086.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/087.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/088.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/089.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/090.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/091.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/092.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/093.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/094.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/095.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/096.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/097.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/098.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/099.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/100.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/101.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/102.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/103.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/104.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/105.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/106.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/107.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/108.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/109.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/110.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/111.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/112.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/113.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/114.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/115.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/116.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/117.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/118.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/119.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/120.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/121.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/122.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/123.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/124.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/125.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/126.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/127.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/128.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/129.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/130.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/131.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/132.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/133.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/134.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/135.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/136.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/137.jpg (100%) rename {wallpapers => public/wallpapers}/archive/thumbnail/138.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/000.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/001.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/002.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/003.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/004.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/005.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/006.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/007.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/008.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/009.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/010.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/011.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/012.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/013.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/014.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/015.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/016.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/017.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/018.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/019.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/020.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/021.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/022.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/023.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1280x720/024.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/000.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/001.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/002.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/003.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/004.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/005.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/006.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/007.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/008.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/009.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/010.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/011.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/012.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/013.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/014.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/015.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/016.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/017.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/018.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/019.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/020.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/021.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/022.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/023.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/1920x1080/024.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/000.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/001.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/002.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/003.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/004.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/005.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/006.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/007.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/008.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/009.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/010.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/011.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/012.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/013.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/014.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/015.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/016.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/017.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/018.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/019.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/020.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/021.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/022.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/023.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3440x1400/024.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/000.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/001.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/002.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/003.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/004.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/005.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/006.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/007.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/008.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/009.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/010.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/011.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/012.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/013.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/014.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/015.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/016.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/017.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/018.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/019.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/020.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/021.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/022.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/023.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/3840x2160/024.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/000.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/001.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/002.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/003.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/004.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/005.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/006.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/007.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/008.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/009.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/010.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/011.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/012.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/013.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/014.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/015.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/016.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/017.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/018.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/019.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/020.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/021.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/022.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/023.jpg (100%) rename {wallpapers => public/wallpapers}/desktop/thumbnails/024.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/000.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/001.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/002.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/003.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/004.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/005.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/006.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/007.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/008.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/009.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/010.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/011.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/012.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/013.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/014.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/015.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/016.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/017.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/018.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/019.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/020.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/021.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/022.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/023.jpg (100%) rename {wallpapers => public/wallpapers}/phone/320x568/024.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/000.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/001.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/002.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/003.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/004.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/005.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/006.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/007.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/008.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/009.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/010.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/011.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/012.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/013.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/014.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/015.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/016.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/017.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/018.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/019.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/020.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/021.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/022.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/023.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x640/024.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/000.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/001.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/002.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/003.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/004.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/005.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/006.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/007.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/008.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/009.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/010.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/011.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/012.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/013.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/014.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/015.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/016.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/017.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/018.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/019.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/020.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/021.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/022.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/023.jpg (100%) rename {wallpapers => public/wallpapers}/phone/360x800/024.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/000.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/001.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/002.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/003.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/004.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/005.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/006.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/007.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/008.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/009.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/010.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/011.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/012.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/013.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/014.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/015.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/016.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/017.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/018.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/019.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/020.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/021.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/022.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/023.jpg (100%) rename {wallpapers => public/wallpapers}/phone/390x844/024.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/000.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/001.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/002.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/003.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/004.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/005.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/006.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/007.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/008.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/009.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/010.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/011.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/012.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/013.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/014.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/015.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/016.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/017.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/018.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/019.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/020.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/021.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/022.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/023.jpg (100%) rename {wallpapers => public/wallpapers}/phone/428x926/024.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/000.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/001.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/002.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/003.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/004.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/005.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/006.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/007.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/008.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/009.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/010.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/011.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/012.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/013.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/014.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/015.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/016.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/017.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/018.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/019.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/020.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/021.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/022.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/023.jpg (100%) rename {wallpapers => public/wallpapers}/phone/430x932/024.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/000.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/001.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/003.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/004.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/005.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/006.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/007.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/008.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/009.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/010.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/011.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/012.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/013.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/014.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/015.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/016.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/017.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/018.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/019.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/020.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/021.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/022.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/023.jpg (100%) rename {wallpapers => public/wallpapers}/watch/368x448/024.jpg (100%) create mode 100644 scripts/generate-manifest.js create mode 100644 src/App.tsx create mode 100644 src/components/DownloadOptions.module.css create mode 100644 src/components/DownloadOptions.tsx create mode 100644 src/components/Layout.module.css create mode 100644 src/components/Layout.tsx create mode 100644 src/components/PreviewModal.module.css create mode 100644 src/components/PreviewModal.tsx create mode 100644 src/components/WallpaperGrid.module.css create mode 100644 src/components/WallpaperGrid.tsx create mode 100644 src/contexts/ThemeContext.tsx create mode 100644 src/data/sizes.ts create mode 100644 src/data/wallpaper-manifest.json create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/pages/Archive.module.css create mode 100644 src/pages/Archive.tsx create mode 100644 src/pages/Desktop.tsx create mode 100644 src/pages/Home.module.css create mode 100644 src/pages/Home.tsx create mode 100644 src/pages/Phone.tsx create mode 100644 src/pages/SweepstakesRules.module.css create mode 100644 src/pages/SweepstakesRules.tsx create mode 100644 src/pages/Watch.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts delete mode 100644 watch.html diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 29620da..3e4e8a1 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,33 +1,40 @@ -# Copilot instructions for `website` - -## Project snapshot -- This repo is a **Jekyll** site published on **GitHub Pages**. -- Site-wide config lives in `_config.yml` (notably `baseurl: /visualstudio-wallpapers`). -- Most pages are top-level HTML files with Jekyll front matter: `index.html`, `desktop.html`, `phone.html`, `watch.html`, `archive.html`. -- Shared layout/CSS/JS is in `_layouts/default.html` (nav + theme toggle + a11y helpers like skip link/focus styles). - -## Local dev workflow -- Ruby/Jekyll deps are in `Gemfile`. -- Preferred local run is the VS Code task **“Serve Jekyll Site”** (`bundle exec jekyll serve`). - -## URL + asset conventions (important for GH Pages) -- Use `{{ site.baseurl }}` when linking to pages/assets so paths work under the GitHub Pages subpath. - - Example: `{{ site.baseurl }}/wallpapers/desktop/thumbnails/022.jpg` (see `index.html`). - -## Wallpapers: file layout + naming -- Assets are served from `wallpapers/`. -- Desktop gallery renders from `wallpapers/desktop/thumbnails/*.jpg` (see `desktop.html`). - - Downloads assume a matching filename exists at `wallpapers/desktop//.jpg`. -- Phone gallery lists images from `wallpapers/phone/320x568/*.jpg` (see `phone.html`) and assumes the same filename exists in all phone size folders. -- Watch gallery lists images from `wallpapers/watch/368x448/*.jpg` (see `watch.html`). -- Community archive (`archive.html`) is JS-rendered with pagination; it expects `wallpapers/archive/###.jpg` and `wallpapers/archive/thumbnail/###.jpg` and uses a hard-coded `total_items` for page count. -- Keep filenames **consistent across sizes** and prefer **zero-padded numeric names** (e.g. `024.jpg`) because pages sort by `basename`. - -## Device sizes source of truth -- Download size buttons are generated from `_data/sizes.yml` via `site.data.sizes.`. -- If you add a new resolution folder, update `_data/sizes.yml` so UI download options match. - -## SEO + accessibility patterns to preserve -- Pages may set `social_image` and `social_image_alt` in front matter; layout uses `{% seo %}`. -- Preserve keyboard accessibility patterns used in galleries/modals: Enter/Space handlers, focus trapping, and `prefers-reduced-motion` fallbacks. -- Default to semantic HTML, descriptive link text, and meaningful `alt` attributes. +# Copilot instructions for `website` + +## Project snapshot +- This repo is a **React + Vite + TypeScript** static site deployed to **GitHub Pages**. +- Vite config is in `vite.config.ts` (notably `base: '/visualstudio-wallpapers/'`). +- Pages live in `src/pages/`: `Home.tsx`, `Desktop.tsx`, `Phone.tsx`, `Watch.tsx`, `Archive.tsx`, `SweepstakesRules.tsx`. +- Shared components in `src/components/`: `Layout.tsx` (nav + theme toggle + a11y helpers), `WallpaperGrid.tsx`, `PreviewModal.tsx`, `DownloadOptions.tsx`. +- Theme context in `src/contexts/ThemeContext.tsx` (VS Purple / VS Code Blue, persisted in localStorage). +- Routing in `src/App.tsx` via React Router with `basename="/visualstudio-wallpapers"`. + +## Local dev workflow +- Node.js 20+, npm 9+. +- `npm install` then `npm run dev` starts the Vite dev server. +- `npm run build` runs the manifest generator (`scripts/generate-manifest.js`) automatically via `prebuild`, then builds to `dist/`. + +## URL + asset conventions (important for GH Pages) +- Use `import.meta.env.BASE_URL` when referencing static assets in components. + - Example: ` ${import.meta.env.BASE_URL}wallpapers/desktop/thumbnails/022.jpg ` +- Use React Router `` for internal navigation (basename is handled by the router). + +## Wallpapers: file layout + naming +- Assets live in `public/wallpapers/` and are copied to `dist/wallpapers/` on build. +- Image lists are auto-generated by `scripts/generate-manifest.js` into `src/data/wallpaper-manifest.json`. +- Desktop gallery reads from `manifest.desktop.images` (thumbnails in `wallpapers/desktop/thumbnails/`). + - Downloads assume a matching filename exists at `wallpapers/desktop//.jpg`. +- Phone gallery reads from `manifest.phone.images` (smallest size `320x568` used as thumbnails). +- Watch gallery reads from `manifest.watch.images` (single size `368x448`). +- Community archive uses `manifest.archive.totalItems` for pagination; images are sequential `###.jpg`. +- Keep filenames **consistent across sizes** and prefer **zero-padded numeric names** (e.g. `024.jpg`). + +## Device sizes source of truth +- Download sizes are defined in `src/data/sizes.ts`. +- If you add a new resolution folder, update `sizes.ts` so the UI download options match. +- Then run `npm run generate-manifest` to pick up new folders. + +## SEO + accessibility patterns to preserve +- Per-page `` and `og:image` meta tags via `react-helmet-async`. +- Preserve keyboard accessibility in galleries/modals: Enter/Space handlers, focus trapping, and `prefers-reduced-motion` fallbacks. +- Default to semantic HTML, descriptive link text, and meaningful `alt` attributes. +- Dark mode supported via `prefers-color-scheme: dark` CSS media query. diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..5ea45b5 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,56 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: ["main"] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Generate wallpaper manifest + run: npm run generate-manifest + + - name: Build + run: npm run build + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: './dist' + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml deleted file mode 100644 index 6aa4261..0000000 --- a/.github/workflows/jekyll.yml +++ /dev/null @@ -1,67 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -# Sample workflow for building and deploying a Jekyll site to GitHub Pages -name: Deploy Jekyll site to Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: ["main"] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - # Build job - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Ruby - # https://github.com/ruby/setup-ruby/releases/tag/v1.207.0 - uses: ruby/setup-ruby@4a9ddd6f338a97768b8006bf671dfbad383215f4 - with: - ruby-version: '3.1' # Not needed with a .ruby-version file - bundler-cache: true # runs 'bundle install' and caches installed gems automatically - cache-version: 1 # Increment this number if you need to re-download cached gems - - name: Update Bundler Platform - run: bundle lock --add-platform x86_64-linux - - name: Setup Pages - id: pages - uses: actions/configure-pages@v5 - - name: Build with Jekyll - # Outputs to the './_site' directory by default - run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" - env: - JEKYLL_ENV: production - - name: Upload artifact - # Automatically uploads an artifact from the './_site' directory by default - uses: actions/upload-pages-artifact@v3 - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index b6d9121..c074944 100644 --- a/.gitignore +++ b/.gitignore @@ -418,4 +418,8 @@ _site/ .jekyll-cache/ .jekyll-metadata vendor/ -.bundle/ \ No newline at end of file +.bundle/ + +# Vite / React +dist/ +*.local \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1ca6f20..ad7f1bb 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -2,11 +2,21 @@ "version": "2.0.0", "tasks": [ { - "label": "Serve Jekyll Site", + "label": "Dev Server", "type": "shell", - "command": "bundle exec jekyll serve", + "command": "npm run dev", "isBackground": true, "problemMatcher": [] + }, + { + "label": "Build", + "type": "shell", + "command": "npm run build", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] } ] } \ No newline at end of file diff --git a/Gemfile b/Gemfile deleted file mode 100644 index a617031..0000000 --- a/Gemfile +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - - -source "https://rubygems.org" - -gem "jekyll", "~> 3.9.5" -gem "jekyll-sass-converter", "~> 1.5.2" -gem "webrick" # Required for Ruby 3+ -gem "kramdown-parser-gfm" # Required for GitHub-flavored Markdown -gem "csv" # Required for Jekyll 3.9.5 -gem "logger" # Required for Jekyll 3.9.5 -gem "base64" # Required for safe_yaml -gem "bigdecimal" # Required for liquid - -group :jekyll_plugins do - gem "jekyll-sitemap" - gem "jekyll-feed" - gem "jekyll-seo-tag" -end \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 6cf176a..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,88 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) - base64 (0.2.0) - bigdecimal (3.1.9) - colorator (1.1.0) - concurrent-ruby (1.3.5) - csv (3.3.4) - em-websocket (0.5.3) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0) - eventmachine (1.2.7) - ffi (1.17.2) - ffi (1.17.2-x86_64-linux-gnu) - forwardable-extended (2.6.0) - http_parser.rb (0.8.0) - i18n (1.14.7) - concurrent-ruby (~> 1.0) - jekyll (3.9.5) - addressable (~> 2.4) - colorator (~> 1.0) - em-websocket (~> 0.5) - i18n (>= 0.7, < 2) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 2.0) - kramdown (>= 1.17, < 3) - liquid (~> 4.0) - mercenary (~> 0.3.3) - pathutil (~> 0.9) - rouge (>= 1.7, < 4) - safe_yaml (~> 1.0) - jekyll-feed (0.17.0) - jekyll (>= 3.7, < 5.0) - jekyll-sass-converter (1.5.2) - sass (~> 3.4) - jekyll-seo-tag (2.8.0) - jekyll (>= 3.8, < 5.0) - jekyll-sitemap (1.4.0) - jekyll (>= 3.7, < 5.0) - jekyll-watch (2.2.1) - listen (~> 3.0) - kramdown (2.5.1) - rexml (>= 3.3.9) - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - liquid (4.0.4) - listen (3.9.0) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - logger (1.7.0) - mercenary (0.3.6) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - public_suffix (6.0.2) - rb-fsevent (0.11.2) - rb-inotify (0.11.1) - ffi (~> 1.0) - rexml (3.4.1) - rouge (3.30.0) - safe_yaml (1.0.5) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - webrick (1.9.1) - -PLATFORMS - aarch64-mingw-ucrt - x86_64-linux - -DEPENDENCIES - base64 - bigdecimal - csv - jekyll (~> 3.9.5) - jekyll-feed - jekyll-sass-converter (~> 1.5.2) - jekyll-seo-tag - jekyll-sitemap - kramdown-parser-gfm - logger - webrick - -BUNDLED WITH - 2.6.9 diff --git a/README.md b/README.md index 99c77b1..a5d923c 100644 --- a/README.md +++ b/README.md @@ -1 +1,145 @@ -# visualstudio-wallpapers \ No newline at end of file +# Visual Studio Wallpapers + +Beautiful wallpapers for your Desktop, Phone, and Watch — built with React, Vite, and TypeScript. + +🌐 **Live site**: [visualstudiowallpapers.com](https://visualstudiowallpapers.com) + +## Features + +- 🖥️ **Desktop wallpapers** — 25 wallpapers in 4K, Ultrawide, 1080p, and 720p +- 📱 **Phone wallpapers** — 25 wallpapers for iPhone and Android screen sizes +- ⌚ **Watch wallpapers** — 24 wallpapers for Apple Watch and more +- 🗂️ **Community archive** — 138 archived wallpapers from the VS2010 Wallpapers Blog +- 🎨 **Theme toggle** — Switch between VS Purple and VS Code Blue themes +- 🌙 **Dark mode** — Automatic via `prefers-color-scheme` +- ♿ **Accessible** — WCAG 2.1 AA: skip link, focus traps, keyboard navigation, screen reader support, reduced motion + +## Tech Stack + +| Layer | Tool | +|-------|------| +| Framework | [React 19](https://react.dev) + [TypeScript](https://www.typescriptlang.org) | +| Build | [Vite](https://vite.dev) | +| Routing | [React Router v7](https://reactrouter.com) | +| SEO | [react-helmet-async](https://github.com/staylor/react-helmet-async) | +| Markdown | [react-markdown](https://github.com/remarkjs/react-markdown) + [remark-gfm](https://github.com/remarkjs/remark-gfm) | +| Hosting | [GitHub Pages](https://pages.github.com) | + +## Getting Started + +### Prerequisites + +- [Node.js](https://nodejs.org) 20+ +- npm 9+ + +### Install & Run + +```bash +# Install dependencies +npm install + +# Generate the wallpaper manifest (scans public/wallpapers/) +npm run generate-manifest + +# Start the dev server +npm run dev +``` + +The site opens at `http://localhost:5173/visualstudio-wallpapers/`. + +### Build for Production + +```bash +npm run build # generates manifest automatically via prebuild hook +npm run preview # preview the production build locally +``` + +Output goes to `dist/`. + +## Project Structure + +``` +├── index.html # Vite entry point +├── vite.config.ts # Vite config (base: /visualstudio-wallpapers/) +├── package.json +├── tsconfig.json +│ +├── public/ # Static assets (copied as-is to dist/) +│ ├── wallpapers/ +│ │ ├── desktop/ # thumbnails/ + size folders (1280x720, 1920x1080, etc.) +│ │ ├── phone/ # size folders (320x568 … 430x932) +│ │ ├── watch/ # 368x448/ +│ │ └── archive/ # full images + thumbnail/ +│ ├── favicons/ +│ ├── icons/ # VS and VS Code theme icons +│ ├── CNAME +│ ├── 404.html # SPA fallback for GitHub Pages +│ └── sweepstakesrules/ +│ +├── scripts/ +│ └── generate-manifest.js # Scans wallpapers → src/data/wallpaper-manifest.json +│ +└── src/ + ├── main.tsx # React entry + ├── App.tsx # Router + providers + ├── index.css # Global styles, CSS custom properties, dark mode + │ + ├── components/ + │ ├── Layout.tsx # Shell: nav, header, footer, theme toggle + │ ├── WallpaperGrid.tsx # Reusable gallery grid + │ ├── PreviewModal.tsx # Accessible image preview modal + │ └── DownloadOptions.tsx # Device-aware download UI + │ + ├── contexts/ + │ └── ThemeContext.tsx # VS Purple ↔ VS Code Blue theme + localStorage + │ + ├── data/ + │ ├── sizes.ts # Device download sizes (typed) + │ └── wallpaper-manifest.json # Auto-generated image manifest + │ + └── pages/ + ├── Home.tsx + ├── Desktop.tsx + ├── Phone.tsx + ├── Watch.tsx + ├── Archive.tsx + └── SweepstakesRules.tsx +``` + +## Adding Wallpapers + +1. Add the image file to `public/wallpapers/<device>/<size>/` — use a **zero-padded numeric filename** (e.g., `026.jpg`) and ensure the same filename exists in every size folder for that device. +2. For desktop wallpapers, also add a thumbnail to `public/wallpapers/desktop/thumbnails/`. +3. Run `npm run generate-manifest` to regenerate the manifest (this happens automatically on `npm run build`). +4. If you add a **new resolution folder**, update `src/data/sizes.ts` to include it. + +## Adding a New Device Size + +1. Create the folder in `public/wallpapers/<device>/<new-size>/` and add images. +2. Add the size string to the appropriate array in `src/data/sizes.ts`. +3. Regenerate the manifest: `npm run generate-manifest`. + +## Deployment + +Pushes to `main` trigger the GitHub Actions workflow (`.github/workflows/deploy.yml`) which: + +1. Installs Node.js 20 dependencies +2. Generates the wallpaper manifest +3. Runs `vite build` +4. Deploys `dist/` to GitHub Pages + +Client-side routing on GitHub Pages is handled by the `public/404.html` SPA redirect. + +## Accessibility + +The site targets WCAG 2.1 AA compliance: + +- **Skip link** jumps past navigation to main content +- **Keyboard navigation** — Tab through all interactive elements; Enter/Space to open cards; Arrow keys in preview modal; Escape to close +- **Focus management** — Visible focus indicators on all controls; focus trapped in modals; focus restored on close +- **Screen readers** — Semantic landmarks, meaningful alt text, `aria-current="page"`, `aria-live` for dynamic content +- **Reduced motion** — All animations and transitions disabled when `prefers-reduced-motion: reduce` is set + +## License + +See [LICENSE](LICENSE) for details. \ No newline at end of file diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 4019963..0000000 --- a/_config.yml +++ /dev/null @@ -1,28 +0,0 @@ -title: Visual Studio Wallpapers -description: Beautiful wallpapers for your Desktop, Phone, and Watch -baseurl: "/visualstudio-wallpapers" -url: "" - -# Build settings -markdown: kramdown -plugins: - - jekyll-seo-tag - -# Theme settings -themes: - vs_purple: - primary: "#68217a" # Visual Studio purple - secondary: "#8b2da2" - background: "#f5f5f5" - vs_blue: - primary: "#007acc" # VS Code blue - secondary: "#0098ff" - background: "#f5f5f5" - -# Default theme -default_theme: "vs_purple" - -# Collections -collections: - wallpapers: - output: true diff --git a/_data/sizes.yml b/_data/sizes.yml deleted file mode 100644 index b9d64fa..0000000 --- a/_data/sizes.yml +++ /dev/null @@ -1,16 +0,0 @@ -desktop: - - 1280x720 - - 1920x1080 - - 3440x1400 - - 3840x2160 - -phone: - - 320x568 - - 360x640 - - 360x800 - - 390x844 - - 428x926 - - 430x932 - -watch: - - 368x448 diff --git a/_layouts/default.html b/_layouts/default.html deleted file mode 100644 index 4af5854..0000000 --- a/_layouts/default.html +++ /dev/null @@ -1,570 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>{% if page.title %}{{ page.title }} - {% endif %}{{ site.title }} - - - - - - - - - - {% seo %} - - - {% if page.social_image %} - - - - - - {% endif %} - - - - - - -
- {{ content }} -
-
-

© {{ site.time | date: '%Y' }} Visual Studio Wallpapers Community by James, Scott, and GitHub Copilot. All rights reserved. Official wallpapers © Microsoft {{ site.time | date: '%Y' }}

-
- - diff --git a/archive.html b/archive.html deleted file mode 100644 index 6071591..0000000 --- a/archive.html +++ /dev/null @@ -1,579 +0,0 @@ ---- -layout: default -title: Community Archive ---- - -
-
-

Disclaimer: These wallpapers come from the non-Microsoft affiliated - VS2010 Wallpapers Blog run by Scott Hanselman. - This is an archived collection preserved for historical purposes.

-
- - {% assign total_items = 137 %} - -
- - - - - - - - -
diff --git a/desktop.html b/desktop.html deleted file mode 100644 index ea0888a..0000000 --- a/desktop.html +++ /dev/null @@ -1,573 +0,0 @@ ---- -layout: default -title: Desktop Wallpapers -social_image: /wallpapers/desktop/thumbnails/024.jpg -social_image_alt: Desktop wallpaper from Visual Studio wallpapers collection ---- - -

Desktop Wallpapers

- -
- {% assign all_images = site.static_files | where: "extname", ".jpg" %} - {% assign desktop_images = "" | split: "" %} - {% for image in all_images %} - {% if image.path contains 'wallpapers/desktop/thumbnails' %} - {% assign desktop_images = desktop_images | push: image %} - {% endif %} - {% endfor %} - {% assign desktop_images = desktop_images | sort: "basename" | reverse %} - {% for image in desktop_images %} -
-
- -
-
- -
-
- {% endfor %} -
- - - - - - - - diff --git a/index.html b/index.html index 6231777..0b59e38 100644 --- a/index.html +++ b/index.html @@ -1,221 +1,29 @@ ---- -layout: default -title: Home -social_image: /wallpapers/desktop/thumbnails/022.jpg -social_image_alt: Preview of Visual Studio wallpapers collection for desktop ---- - -
-
-

Choose Your Device

-

Beautiful wallpapers crafted for every screen

-
-
-
- Preview of desktop wallpapers collection -
- View Collection → -
-
-
-

Desktop Wallpapers

-

🖥️

- -
-
- -
-
- Preview of phone wallpapers collection -
- View Collection → -
-
-
-

Phone Wallpapers

-

📱

- -
-
- -
-
- Preview of watch wallpapers collection -
- View Collection → -
-
-
-

Watch Wallpapers

-

- -
-
-
- - -
- - -
- + + + + + + Visual Studio Wallpapers + + + + + + + + +
+ + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..66f98d7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3408 @@ +{ + "name": "website", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "website", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-helmet-async": "^2.0.5", + "react-markdown": "^10.1.0", + "react-router-dom": "^7.13.0", + "remark-gfm": "^4.0.1" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^5.1.4", + "typescript": "^5.9.3", + "vite": "^7.3.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", + "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.5.tgz", + "integrity": "sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==", + "license": "Apache-2.0", + "dependencies": { + "invariant": "^2.2.4", + "react-fast-compare": "^3.2.2", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.0.tgz", + "integrity": "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.0.tgz", + "integrity": "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g==", + "license": "MIT", + "dependencies": { + "react-router": "7.13.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..0898777 --- /dev/null +++ b/package.json @@ -0,0 +1,40 @@ +{ + "name": "website", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "generate-manifest": "node scripts/generate-manifest.js", + "prebuild": "npm run generate-manifest" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Visual-Studio-Wallpapers/website.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "commonjs", + "bugs": { + "url": "https://github.com/Visual-Studio-Wallpapers/website/issues" + }, + "homepage": "https://github.com/Visual-Studio-Wallpapers/website#readme", + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-helmet-async": "^2.0.5", + "react-markdown": "^10.1.0", + "react-router-dom": "^7.13.0", + "remark-gfm": "^4.0.1" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^5.1.4", + "typescript": "^5.9.3", + "vite": "^7.3.1" + } +} diff --git a/phone.html b/phone.html deleted file mode 100644 index 012ee12..0000000 --- a/phone.html +++ /dev/null @@ -1,600 +0,0 @@ ---- -layout: default -title: Phone Wallpapers -social_image: /wallpapers/phone/320x568/024.jpg -social_image_alt: Phone wallpaper from Visual Studio wallpapers collection ---- - -

Phone Wallpapers

- -
- {% assign all_images = site.static_files | where: "extname", ".jpg" %} - {% assign phone_images = "" | split: "" %} - {% for image in all_images %} - {% if image.path contains 'wallpapers/phone/320x568' %} - {% assign phone_images = phone_images | push: image %} - {% endif %} - {% endfor %} - {% assign phone_images = phone_images | sort: "basename" | reverse %} - {% for image in phone_images %} -
-
- Wallpaper {{ image.basename }} -
- Click to preview -
-
- {% endfor %} -
- - - - - - - - diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..0dcea0f --- /dev/null +++ b/public/404.html @@ -0,0 +1,24 @@ + + + + + Visual Studio Wallpapers + + + +

Redirecting...

+ + diff --git a/CNAME b/public/CNAME similarity index 96% rename from CNAME rename to public/CNAME index f76b71e..9e39c01 100644 --- a/CNAME +++ b/public/CNAME @@ -1 +1 @@ -visualstudiowallpapers.com +visualstudiowallpapers.com diff --git a/favicons/android-chrome-192x192.png b/public/favicons/android-chrome-192x192.png similarity index 100% rename from favicons/android-chrome-192x192.png rename to public/favicons/android-chrome-192x192.png diff --git a/favicons/android-chrome-512x512.png b/public/favicons/android-chrome-512x512.png similarity index 100% rename from favicons/android-chrome-512x512.png rename to public/favicons/android-chrome-512x512.png diff --git a/favicons/apple-touch-icon.png b/public/favicons/apple-touch-icon.png similarity index 100% rename from favicons/apple-touch-icon.png rename to public/favicons/apple-touch-icon.png diff --git a/favicons/favicon-16x16.png b/public/favicons/favicon-16x16.png similarity index 100% rename from favicons/favicon-16x16.png rename to public/favicons/favicon-16x16.png diff --git a/favicons/favicon-32x32.png b/public/favicons/favicon-32x32.png similarity index 100% rename from favicons/favicon-32x32.png rename to public/favicons/favicon-32x32.png diff --git a/favicons/favicon.ico b/public/favicons/favicon.ico similarity index 100% rename from favicons/favicon.ico rename to public/favicons/favicon.ico diff --git a/favicons/site.webmanifest b/public/favicons/site.webmanifest similarity index 100% rename from favicons/site.webmanifest rename to public/favicons/site.webmanifest diff --git a/icons/visualstudio.png b/public/icons/visualstudio.png similarity index 100% rename from icons/visualstudio.png rename to public/icons/visualstudio.png diff --git a/icons/visualstudiocode.png b/public/icons/visualstudiocode.png similarity index 100% rename from icons/visualstudiocode.png rename to public/icons/visualstudiocode.png diff --git a/icons/vs2026-icon-big.png b/public/icons/vs2026-icon-big.png similarity index 100% rename from icons/vs2026-icon-big.png rename to public/icons/vs2026-icon-big.png diff --git a/sweepstakesrules/sweepstakesrules.md b/public/sweepstakesrules/sweepstakesrules.md similarity index 99% rename from sweepstakesrules/sweepstakesrules.md rename to public/sweepstakesrules/sweepstakesrules.md index c32128e..6845c9a 100644 --- a/sweepstakesrules/sweepstakesrules.md +++ b/public/sweepstakesrules/sweepstakesrules.md @@ -1,98 +1,98 @@ -# MICROSOFT VS50M CAMPAIGN SWEEPSTAKES - -## OFFICIAL RULES - -### 1. SPONSOR - -These Official Rules (“Rules”) govern the operation of the Microsoft VS50M Campaign Sweepstakes (“Sweepstakes”). Microsoft Corporation, One Microsoft Way, Redmond, WA, 98052, USA, is the Sweepstakes sponsor (“Sponsor”). - -### 2. DEFINITIONS - -In these Rules, "Microsoft", "we", "our", and "us" refer to Sponsor and “you” and "yourself" refers to a Sweepstakes participant, or the parent/legal guardian of any Sweepstakes entrant who has not reached the age of majority to contractually obligate themselves in their legal place of residence. By entering you (your parent/legal guardian if you are not the age of majority in your legal place of residence) agree to be bound by these Rules. - -### 3. ENTRY PERIOD - -The Sweepstakes starts at 12:00 a.m. Eastern Time (ET) on May 29, 2025, and ends at 11:59 p.m. ET on July 6, 2025 (“Entry Period”) and consists of six (6) weekly Prize Periods as follows: - -| # | Start Date and Time (ET) | End Date and Time (ET) | Drawing Date (ET) | -|---|----------------------------|-----------------------------|------------------------| -| 1 | 12:00 a.m. May 28, 2025 | 11:59 p.m. June 1, 2025 | 3:00 p.m. June 2, 2025 | -| 2 | 12:00 a.m. June 2, 2025 | 11:59 p.m. June 8, 2025 | 3:00 p.m. June 9, 2025 | -| 3 | 12:00 a.m. June 9, 2025 | 11:59 p.m. June 15, 2025 | 3:00 p.m. June 16, 2025| -| 4 | 12:00 a.m. June 16, 2025 | 11:59 p.m. June 22, 2025 | 3:00 p.m. June 23, 2025| -| 5 | 12:00 a.m. June 23, 2025 | 11:59 p.m. June 29, 2025 | 3:00 p.m. June 30, 2025| -| 6 | 12:00 a.m. June 30, 2025 | 11:59 p.m. July 6, 2025 | 3:00 p.m. July 7, 2025 | - -Entries will be eligible for the weekly Prize Period in which they are received and will carryover to subsequent weekly drawings. - -### 4. ELIGIBILITY - -To enter, you must be 18 years of age or older. If you are 18 years of age or older but have not reached the age of majority in your legal place of residence, then you must have consent of a parent/legal guardian. - -Employees and directors of Microsoft Corporation and its subsidiaries, affiliates, advertising agencies, and Sweepstakes Parties are not eligible, nor are persons involved in the execution or administration of this promotion, or the family members of each above (parents, children, siblings, spouse/domestic partners, or individuals residing in the same household). Void in Cuba, Iran, North Korea, Sudan, Syria, Region of Crimea, Russia, and where prohibited. - -### 5. HOW TO ENTER - -No Purchase Necessary. - -To participate you must: - -1. Create a new account or use an existing account on X or LinkedIn (“X or LinkedIn”); and -2. Visit the [Visual Studio X page](https://x.com/VisualStudio), [VS Code X page](https://x.com/code), [Visual Studio LinkedIn page](https://www.linkedin.com/products/microsoft-visual-studio-visual-studio/), or [VS Code LinkedIn page](https://www.linkedin.com/showcase/vs-code/posts/?feedView=all) at the beginning of each week and locate the promotional post. -3. Comment on the Visual Studio OR VS Code page by posting a reply that includes the answer to the question, the Sweepstakes hashtag #VS50, and the hashtag #sweepstakes. - -For doing this, you will receive one (1) Sweepstakes entry. The Entry Limit is one per person per platform per week. - -**Entry Criteria and Terms:** All elements must be included to be eligible. The account settings for your entry must be set to “unprotected” or “public” to be eligible. If your account is private, your entry will NOT be eligible; you must change the setting on your account from private to “public” or “unprotected”. The X and LinkedIn platform will be the official time clock for the Sweepstakes. Entries may NOT contain, as determined by us in our sole and absolute discretion, any content that is obscene or offensive, violent, defamatory, disparaging, or illegal, or that promotes alcohol, illegal drugs, tobacco or a particular political agenda, or that communicates messages that may reflect negatively on the goodwill of Microsoft. Entries containing such content will be disqualified. - -This promotion is in no way sponsored, endorsed, or administered by, or associated with, X or LinkedIn. You understand that you are providing your information to the Sponsor and not to X or LinkedIn. The information you provide will only be used for administering the Promotion and to contact you if you are a winner. - -Any attempt by you to obtain more than the stated number of entries by using multiple/different accounts, identities, registrations, logins, or any other methods will void your entries and you may be disqualified. Use of any automated system to participate is prohibited. - -We are not responsible for excess, lost, late, or incomplete entries. If disputed, entries will be deemed submitted by the “authorized account holder” of the email address, social media account, or other method used to enter. The “authorized account holder” is the natural person assigned to an email address by an internet or online service provider, or other organization responsible for assigning email addresses. - -### 6. WINNER SELECTION AND NOTIFICATION - -Pending confirmation of eligibility, forty (40) potential prize winners will be selected by Microsoft or their Agent in a random drawing from among all eligible entries received the Monday following each weekly Prize Period during the Entry Period for an overall total of two-hundred forty winners. - -Winners will be notified via direct message on the platform used to enter no more than 7 days following the drawing with prize claim instructions, including submission deadlines. If a selected winner cannot be contacted, is ineligible, fails to claim a prize or fails to return any forms, the selected winner will forfeit their prize and an alternate winner will be selected time allowing. If you are a potential winner and you are 18 or older but have not reached the age of majority in your legal place of residence, we may require your parent/legal guardian to sign all required forms on your behalf. Only three alternate winners will be selected, after which unclaimed prizes will remain unawarded. - -### 7. PRIZES - -The following prizes will be awarded: - -Two Hundred Forty (240) Grand Prizes (40 winners per week). A Prize Package includes (1) T-shirt. Approximate Retail Value (ARV) $30.00. - -The total Approximate Retail Value (ARV) of all prizes: $7,200 - -We will only award two (2) prizes per person overall. No more than the stated number of prizes will be awarded. No substitution, transfer, or assignment of prize permitted, except that Microsoft reserves the right to substitute a prize of equal or greater value in the event the offered prize is unavailable. Microsoft products awarded as prizes are awarded “AS IS” and WITHOUT WARRANTY OF ANY KIND, express or implied (including any implied warranty of merchantability or fitness for a particular purpose); you assume the entire risk of quality and performance, and should the prizes prove defective, you assume the entire cost of all necessary servicing or repair. This is so even if the Microsoft product mentions a warranty on its packaging, in a manual, or in marketing materials; no warranty applies to Microsoft products awarded as prizes. - -Microsoft does not give any warranty of any kind, express or implied (including any implied warranty of merchantability or fitness for a particular purpose) on products made by a company other than Microsoft that are awarded as prizes. Please contact the manufacturer to see if it is covered by that company’s warranty. - -Prizes will be sent no later than 28 days after winner selection. Prize winners may be required to complete and return prize claim and / or tax forms (“Forms”) within the deadline stated in the winner notification. Taxes on the prize, if any, are the sole responsibility of the winner, who is advised to seek independent counsel regarding the tax implications of accepting a prize. By accepting a prize, you agree that Microsoft may use your entry, name, image and hometown social post online and in print, or in any other media, in connection with this Sweepstakes without payment or compensation to you, except where prohibited by law. - -### 8. ODDS - -The odds of winning are based on the number of eligible entries received. - -### 9. GENERAL CONDITIONS AND RELEASE OF LIABILITY - -To the extent allowed by law, by entering you agree to release and hold harmless Microsoft and its respective parents, partners, subsidiaries, affiliates, employees, and agents from any and all liability or any injury, loss, or damage of any kind arising in connection with this Sweepstakes or any prize won. - -All local laws apply. The decisions of Microsoft are final and binding. - -We reserve the right to cancel, change, or suspend this Sweepstakes for any reason, including cheating, technology failure, catastrophe, war, or any other unforeseen or unexpected event that affects the integrity of this Sweepstakes, whether human or mechanical. If the integrity of the Sweepstakes cannot be restored, we may select winners from among all eligible entries received before we had to cancel, change or suspend the Sweepstakes. - -If you attempt or we have strong reason to believe that you have compromised the integrity or the legitimate operation of this Sweepstakes by cheating, hacking, creating a bot or other automated program, or by committing fraud in any way, we may seek damages from you to the full extent of the law and you may be banned from participation in future Microsoft promotions. - -### 10. USE OF YOUR ENTRY - -Personal data you provide while entering this Sweepstakes will be used by Microsoft and/or its agents and prize fulfillers acting on Microsoft’s behalf only for the administration and operation of this Sweepstakes and in accordance with the Microsoft Privacy Statement. - -### 11. GOVERNING LAW - -This Sweepstakes will be governed by the laws of the State of Washington, and you consent to the exclusive jurisdiction and venue of the courts of the State of Washington for any disputes arising out of this Sweepstakes. - -### 12. WINNERS LIST - +# MICROSOFT VS50M CAMPAIGN SWEEPSTAKES + +## OFFICIAL RULES + +### 1. SPONSOR + +These Official Rules (“Rules”) govern the operation of the Microsoft VS50M Campaign Sweepstakes (“Sweepstakes”). Microsoft Corporation, One Microsoft Way, Redmond, WA, 98052, USA, is the Sweepstakes sponsor (“Sponsor”). + +### 2. DEFINITIONS + +In these Rules, "Microsoft", "we", "our", and "us" refer to Sponsor and “you” and "yourself" refers to a Sweepstakes participant, or the parent/legal guardian of any Sweepstakes entrant who has not reached the age of majority to contractually obligate themselves in their legal place of residence. By entering you (your parent/legal guardian if you are not the age of majority in your legal place of residence) agree to be bound by these Rules. + +### 3. ENTRY PERIOD + +The Sweepstakes starts at 12:00 a.m. Eastern Time (ET) on May 29, 2025, and ends at 11:59 p.m. ET on July 6, 2025 (“Entry Period”) and consists of six (6) weekly Prize Periods as follows: + +| # | Start Date and Time (ET) | End Date and Time (ET) | Drawing Date (ET) | +|---|----------------------------|-----------------------------|------------------------| +| 1 | 12:00 a.m. May 28, 2025 | 11:59 p.m. June 1, 2025 | 3:00 p.m. June 2, 2025 | +| 2 | 12:00 a.m. June 2, 2025 | 11:59 p.m. June 8, 2025 | 3:00 p.m. June 9, 2025 | +| 3 | 12:00 a.m. June 9, 2025 | 11:59 p.m. June 15, 2025 | 3:00 p.m. June 16, 2025| +| 4 | 12:00 a.m. June 16, 2025 | 11:59 p.m. June 22, 2025 | 3:00 p.m. June 23, 2025| +| 5 | 12:00 a.m. June 23, 2025 | 11:59 p.m. June 29, 2025 | 3:00 p.m. June 30, 2025| +| 6 | 12:00 a.m. June 30, 2025 | 11:59 p.m. July 6, 2025 | 3:00 p.m. July 7, 2025 | + +Entries will be eligible for the weekly Prize Period in which they are received and will carryover to subsequent weekly drawings. + +### 4. ELIGIBILITY + +To enter, you must be 18 years of age or older. If you are 18 years of age or older but have not reached the age of majority in your legal place of residence, then you must have consent of a parent/legal guardian. + +Employees and directors of Microsoft Corporation and its subsidiaries, affiliates, advertising agencies, and Sweepstakes Parties are not eligible, nor are persons involved in the execution or administration of this promotion, or the family members of each above (parents, children, siblings, spouse/domestic partners, or individuals residing in the same household). Void in Cuba, Iran, North Korea, Sudan, Syria, Region of Crimea, Russia, and where prohibited. + +### 5. HOW TO ENTER + +No Purchase Necessary. + +To participate you must: + +1. Create a new account or use an existing account on X or LinkedIn (“X or LinkedIn”); and +2. Visit the [Visual Studio X page](https://x.com/VisualStudio), [VS Code X page](https://x.com/code), [Visual Studio LinkedIn page](https://www.linkedin.com/products/microsoft-visual-studio-visual-studio/), or [VS Code LinkedIn page](https://www.linkedin.com/showcase/vs-code/posts/?feedView=all) at the beginning of each week and locate the promotional post. +3. Comment on the Visual Studio OR VS Code page by posting a reply that includes the answer to the question, the Sweepstakes hashtag #VS50, and the hashtag #sweepstakes. + +For doing this, you will receive one (1) Sweepstakes entry. The Entry Limit is one per person per platform per week. + +**Entry Criteria and Terms:** All elements must be included to be eligible. The account settings for your entry must be set to “unprotected” or “public” to be eligible. If your account is private, your entry will NOT be eligible; you must change the setting on your account from private to “public” or “unprotected”. The X and LinkedIn platform will be the official time clock for the Sweepstakes. Entries may NOT contain, as determined by us in our sole and absolute discretion, any content that is obscene or offensive, violent, defamatory, disparaging, or illegal, or that promotes alcohol, illegal drugs, tobacco or a particular political agenda, or that communicates messages that may reflect negatively on the goodwill of Microsoft. Entries containing such content will be disqualified. + +This promotion is in no way sponsored, endorsed, or administered by, or associated with, X or LinkedIn. You understand that you are providing your information to the Sponsor and not to X or LinkedIn. The information you provide will only be used for administering the Promotion and to contact you if you are a winner. + +Any attempt by you to obtain more than the stated number of entries by using multiple/different accounts, identities, registrations, logins, or any other methods will void your entries and you may be disqualified. Use of any automated system to participate is prohibited. + +We are not responsible for excess, lost, late, or incomplete entries. If disputed, entries will be deemed submitted by the “authorized account holder” of the email address, social media account, or other method used to enter. The “authorized account holder” is the natural person assigned to an email address by an internet or online service provider, or other organization responsible for assigning email addresses. + +### 6. WINNER SELECTION AND NOTIFICATION + +Pending confirmation of eligibility, forty (40) potential prize winners will be selected by Microsoft or their Agent in a random drawing from among all eligible entries received the Monday following each weekly Prize Period during the Entry Period for an overall total of two-hundred forty winners. + +Winners will be notified via direct message on the platform used to enter no more than 7 days following the drawing with prize claim instructions, including submission deadlines. If a selected winner cannot be contacted, is ineligible, fails to claim a prize or fails to return any forms, the selected winner will forfeit their prize and an alternate winner will be selected time allowing. If you are a potential winner and you are 18 or older but have not reached the age of majority in your legal place of residence, we may require your parent/legal guardian to sign all required forms on your behalf. Only three alternate winners will be selected, after which unclaimed prizes will remain unawarded. + +### 7. PRIZES + +The following prizes will be awarded: + +Two Hundred Forty (240) Grand Prizes (40 winners per week). A Prize Package includes (1) T-shirt. Approximate Retail Value (ARV) $30.00. + +The total Approximate Retail Value (ARV) of all prizes: $7,200 + +We will only award two (2) prizes per person overall. No more than the stated number of prizes will be awarded. No substitution, transfer, or assignment of prize permitted, except that Microsoft reserves the right to substitute a prize of equal or greater value in the event the offered prize is unavailable. Microsoft products awarded as prizes are awarded “AS IS” and WITHOUT WARRANTY OF ANY KIND, express or implied (including any implied warranty of merchantability or fitness for a particular purpose); you assume the entire risk of quality and performance, and should the prizes prove defective, you assume the entire cost of all necessary servicing or repair. This is so even if the Microsoft product mentions a warranty on its packaging, in a manual, or in marketing materials; no warranty applies to Microsoft products awarded as prizes. + +Microsoft does not give any warranty of any kind, express or implied (including any implied warranty of merchantability or fitness for a particular purpose) on products made by a company other than Microsoft that are awarded as prizes. Please contact the manufacturer to see if it is covered by that company’s warranty. + +Prizes will be sent no later than 28 days after winner selection. Prize winners may be required to complete and return prize claim and / or tax forms (“Forms”) within the deadline stated in the winner notification. Taxes on the prize, if any, are the sole responsibility of the winner, who is advised to seek independent counsel regarding the tax implications of accepting a prize. By accepting a prize, you agree that Microsoft may use your entry, name, image and hometown social post online and in print, or in any other media, in connection with this Sweepstakes without payment or compensation to you, except where prohibited by law. + +### 8. ODDS + +The odds of winning are based on the number of eligible entries received. + +### 9. GENERAL CONDITIONS AND RELEASE OF LIABILITY + +To the extent allowed by law, by entering you agree to release and hold harmless Microsoft and its respective parents, partners, subsidiaries, affiliates, employees, and agents from any and all liability or any injury, loss, or damage of any kind arising in connection with this Sweepstakes or any prize won. + +All local laws apply. The decisions of Microsoft are final and binding. + +We reserve the right to cancel, change, or suspend this Sweepstakes for any reason, including cheating, technology failure, catastrophe, war, or any other unforeseen or unexpected event that affects the integrity of this Sweepstakes, whether human or mechanical. If the integrity of the Sweepstakes cannot be restored, we may select winners from among all eligible entries received before we had to cancel, change or suspend the Sweepstakes. + +If you attempt or we have strong reason to believe that you have compromised the integrity or the legitimate operation of this Sweepstakes by cheating, hacking, creating a bot or other automated program, or by committing fraud in any way, we may seek damages from you to the full extent of the law and you may be banned from participation in future Microsoft promotions. + +### 10. USE OF YOUR ENTRY + +Personal data you provide while entering this Sweepstakes will be used by Microsoft and/or its agents and prize fulfillers acting on Microsoft’s behalf only for the administration and operation of this Sweepstakes and in accordance with the Microsoft Privacy Statement. + +### 11. GOVERNING LAW + +This Sweepstakes will be governed by the laws of the State of Washington, and you consent to the exclusive jurisdiction and venue of the courts of the State of Washington for any disputes arising out of this Sweepstakes. + +### 12. WINNERS LIST + Send an email to with the subject line “VS50M Campaign Sweepstakes winners” within 30 days of July 7, 2025 to receive a list of winners. \ No newline at end of file diff --git a/wallpapers/archive/001.jpg b/public/wallpapers/archive/001.jpg similarity index 100% rename from wallpapers/archive/001.jpg rename to public/wallpapers/archive/001.jpg diff --git a/wallpapers/archive/002.jpg b/public/wallpapers/archive/002.jpg similarity index 100% rename from wallpapers/archive/002.jpg rename to public/wallpapers/archive/002.jpg diff --git a/wallpapers/archive/003.jpg b/public/wallpapers/archive/003.jpg similarity index 100% rename from wallpapers/archive/003.jpg rename to public/wallpapers/archive/003.jpg diff --git a/wallpapers/archive/004.jpg b/public/wallpapers/archive/004.jpg similarity index 100% rename from wallpapers/archive/004.jpg rename to public/wallpapers/archive/004.jpg diff --git a/wallpapers/archive/005.jpg b/public/wallpapers/archive/005.jpg similarity index 100% rename from wallpapers/archive/005.jpg rename to public/wallpapers/archive/005.jpg diff --git a/wallpapers/archive/006.jpg b/public/wallpapers/archive/006.jpg similarity index 100% rename from wallpapers/archive/006.jpg rename to public/wallpapers/archive/006.jpg diff --git a/wallpapers/archive/007.jpg b/public/wallpapers/archive/007.jpg similarity index 100% rename from wallpapers/archive/007.jpg rename to public/wallpapers/archive/007.jpg diff --git a/wallpapers/archive/008.jpg b/public/wallpapers/archive/008.jpg similarity index 100% rename from wallpapers/archive/008.jpg rename to public/wallpapers/archive/008.jpg diff --git a/wallpapers/archive/009.jpg b/public/wallpapers/archive/009.jpg similarity index 100% rename from wallpapers/archive/009.jpg rename to public/wallpapers/archive/009.jpg diff --git a/wallpapers/archive/010.jpg b/public/wallpapers/archive/010.jpg similarity index 100% rename from wallpapers/archive/010.jpg rename to public/wallpapers/archive/010.jpg diff --git a/wallpapers/archive/011.jpg b/public/wallpapers/archive/011.jpg similarity index 100% rename from wallpapers/archive/011.jpg rename to public/wallpapers/archive/011.jpg diff --git a/wallpapers/archive/012.jpg b/public/wallpapers/archive/012.jpg similarity index 100% rename from wallpapers/archive/012.jpg rename to public/wallpapers/archive/012.jpg diff --git a/wallpapers/archive/013.jpg b/public/wallpapers/archive/013.jpg similarity index 100% rename from wallpapers/archive/013.jpg rename to public/wallpapers/archive/013.jpg diff --git a/wallpapers/archive/014.jpg b/public/wallpapers/archive/014.jpg similarity index 100% rename from wallpapers/archive/014.jpg rename to public/wallpapers/archive/014.jpg diff --git a/wallpapers/archive/015.jpg b/public/wallpapers/archive/015.jpg similarity index 100% rename from wallpapers/archive/015.jpg rename to public/wallpapers/archive/015.jpg diff --git a/wallpapers/archive/016.jpg b/public/wallpapers/archive/016.jpg similarity index 100% rename from wallpapers/archive/016.jpg rename to public/wallpapers/archive/016.jpg diff --git a/wallpapers/archive/017.jpg b/public/wallpapers/archive/017.jpg similarity index 100% rename from wallpapers/archive/017.jpg rename to public/wallpapers/archive/017.jpg diff --git a/wallpapers/archive/018.jpg b/public/wallpapers/archive/018.jpg similarity index 100% rename from wallpapers/archive/018.jpg rename to public/wallpapers/archive/018.jpg diff --git a/wallpapers/archive/019.jpg b/public/wallpapers/archive/019.jpg similarity index 100% rename from wallpapers/archive/019.jpg rename to public/wallpapers/archive/019.jpg diff --git a/wallpapers/archive/020.jpg b/public/wallpapers/archive/020.jpg similarity index 100% rename from wallpapers/archive/020.jpg rename to public/wallpapers/archive/020.jpg diff --git a/wallpapers/archive/021.jpg b/public/wallpapers/archive/021.jpg similarity index 100% rename from wallpapers/archive/021.jpg rename to public/wallpapers/archive/021.jpg diff --git a/wallpapers/archive/022.jpg b/public/wallpapers/archive/022.jpg similarity index 100% rename from wallpapers/archive/022.jpg rename to public/wallpapers/archive/022.jpg diff --git a/wallpapers/archive/023.jpg b/public/wallpapers/archive/023.jpg similarity index 100% rename from wallpapers/archive/023.jpg rename to public/wallpapers/archive/023.jpg diff --git a/wallpapers/archive/024.jpg b/public/wallpapers/archive/024.jpg similarity index 100% rename from wallpapers/archive/024.jpg rename to public/wallpapers/archive/024.jpg diff --git a/wallpapers/archive/025.jpg b/public/wallpapers/archive/025.jpg similarity index 100% rename from wallpapers/archive/025.jpg rename to public/wallpapers/archive/025.jpg diff --git a/wallpapers/archive/026.jpg b/public/wallpapers/archive/026.jpg similarity index 100% rename from wallpapers/archive/026.jpg rename to public/wallpapers/archive/026.jpg diff --git a/wallpapers/archive/027.jpg b/public/wallpapers/archive/027.jpg similarity index 100% rename from wallpapers/archive/027.jpg rename to public/wallpapers/archive/027.jpg diff --git a/wallpapers/archive/028.jpg b/public/wallpapers/archive/028.jpg similarity index 100% rename from wallpapers/archive/028.jpg rename to public/wallpapers/archive/028.jpg diff --git a/wallpapers/archive/029.jpg b/public/wallpapers/archive/029.jpg similarity index 100% rename from wallpapers/archive/029.jpg rename to public/wallpapers/archive/029.jpg diff --git a/wallpapers/archive/030.jpg b/public/wallpapers/archive/030.jpg similarity index 100% rename from wallpapers/archive/030.jpg rename to public/wallpapers/archive/030.jpg diff --git a/wallpapers/archive/031.jpg b/public/wallpapers/archive/031.jpg similarity index 100% rename from wallpapers/archive/031.jpg rename to public/wallpapers/archive/031.jpg diff --git a/wallpapers/archive/032.jpg b/public/wallpapers/archive/032.jpg similarity index 100% rename from wallpapers/archive/032.jpg rename to public/wallpapers/archive/032.jpg diff --git a/wallpapers/archive/033.jpg b/public/wallpapers/archive/033.jpg similarity index 100% rename from wallpapers/archive/033.jpg rename to public/wallpapers/archive/033.jpg diff --git a/wallpapers/archive/034.jpg b/public/wallpapers/archive/034.jpg similarity index 100% rename from wallpapers/archive/034.jpg rename to public/wallpapers/archive/034.jpg diff --git a/wallpapers/archive/035.jpg b/public/wallpapers/archive/035.jpg similarity index 100% rename from wallpapers/archive/035.jpg rename to public/wallpapers/archive/035.jpg diff --git a/wallpapers/archive/036.jpg b/public/wallpapers/archive/036.jpg similarity index 100% rename from wallpapers/archive/036.jpg rename to public/wallpapers/archive/036.jpg diff --git a/wallpapers/archive/037.jpg b/public/wallpapers/archive/037.jpg similarity index 100% rename from wallpapers/archive/037.jpg rename to public/wallpapers/archive/037.jpg diff --git a/wallpapers/archive/038.jpg b/public/wallpapers/archive/038.jpg similarity index 100% rename from wallpapers/archive/038.jpg rename to public/wallpapers/archive/038.jpg diff --git a/wallpapers/archive/039.jpg b/public/wallpapers/archive/039.jpg similarity index 100% rename from wallpapers/archive/039.jpg rename to public/wallpapers/archive/039.jpg diff --git a/wallpapers/archive/040.jpg b/public/wallpapers/archive/040.jpg similarity index 100% rename from wallpapers/archive/040.jpg rename to public/wallpapers/archive/040.jpg diff --git a/wallpapers/archive/041.jpg b/public/wallpapers/archive/041.jpg similarity index 100% rename from wallpapers/archive/041.jpg rename to public/wallpapers/archive/041.jpg diff --git a/wallpapers/archive/042.jpg b/public/wallpapers/archive/042.jpg similarity index 100% rename from wallpapers/archive/042.jpg rename to public/wallpapers/archive/042.jpg diff --git a/wallpapers/archive/043.jpg b/public/wallpapers/archive/043.jpg similarity index 100% rename from wallpapers/archive/043.jpg rename to public/wallpapers/archive/043.jpg diff --git a/wallpapers/archive/044.jpg b/public/wallpapers/archive/044.jpg similarity index 100% rename from wallpapers/archive/044.jpg rename to public/wallpapers/archive/044.jpg diff --git a/wallpapers/archive/045.jpg b/public/wallpapers/archive/045.jpg similarity index 100% rename from wallpapers/archive/045.jpg rename to public/wallpapers/archive/045.jpg diff --git a/wallpapers/archive/046.jpg b/public/wallpapers/archive/046.jpg similarity index 100% rename from wallpapers/archive/046.jpg rename to public/wallpapers/archive/046.jpg diff --git a/wallpapers/archive/047.jpg b/public/wallpapers/archive/047.jpg similarity index 100% rename from wallpapers/archive/047.jpg rename to public/wallpapers/archive/047.jpg diff --git a/wallpapers/archive/048.jpg b/public/wallpapers/archive/048.jpg similarity index 100% rename from wallpapers/archive/048.jpg rename to public/wallpapers/archive/048.jpg diff --git a/wallpapers/archive/049.jpg b/public/wallpapers/archive/049.jpg similarity index 100% rename from wallpapers/archive/049.jpg rename to public/wallpapers/archive/049.jpg diff --git a/wallpapers/archive/050.jpg b/public/wallpapers/archive/050.jpg similarity index 100% rename from wallpapers/archive/050.jpg rename to public/wallpapers/archive/050.jpg diff --git a/wallpapers/archive/051.jpg b/public/wallpapers/archive/051.jpg similarity index 100% rename from wallpapers/archive/051.jpg rename to public/wallpapers/archive/051.jpg diff --git a/wallpapers/archive/052.jpg b/public/wallpapers/archive/052.jpg similarity index 100% rename from wallpapers/archive/052.jpg rename to public/wallpapers/archive/052.jpg diff --git a/wallpapers/archive/053.jpg b/public/wallpapers/archive/053.jpg similarity index 100% rename from wallpapers/archive/053.jpg rename to public/wallpapers/archive/053.jpg diff --git a/wallpapers/archive/054.jpg b/public/wallpapers/archive/054.jpg similarity index 100% rename from wallpapers/archive/054.jpg rename to public/wallpapers/archive/054.jpg diff --git a/wallpapers/archive/055.jpg b/public/wallpapers/archive/055.jpg similarity index 100% rename from wallpapers/archive/055.jpg rename to public/wallpapers/archive/055.jpg diff --git a/wallpapers/archive/056.jpg b/public/wallpapers/archive/056.jpg similarity index 100% rename from wallpapers/archive/056.jpg rename to public/wallpapers/archive/056.jpg diff --git a/wallpapers/archive/057.jpg b/public/wallpapers/archive/057.jpg similarity index 100% rename from wallpapers/archive/057.jpg rename to public/wallpapers/archive/057.jpg diff --git a/wallpapers/archive/058.jpg b/public/wallpapers/archive/058.jpg similarity index 100% rename from wallpapers/archive/058.jpg rename to public/wallpapers/archive/058.jpg diff --git a/wallpapers/archive/059.jpg b/public/wallpapers/archive/059.jpg similarity index 100% rename from wallpapers/archive/059.jpg rename to public/wallpapers/archive/059.jpg diff --git a/wallpapers/archive/060.jpg b/public/wallpapers/archive/060.jpg similarity index 100% rename from wallpapers/archive/060.jpg rename to public/wallpapers/archive/060.jpg diff --git a/wallpapers/archive/061.jpg b/public/wallpapers/archive/061.jpg similarity index 100% rename from wallpapers/archive/061.jpg rename to public/wallpapers/archive/061.jpg diff --git a/wallpapers/archive/062.jpg b/public/wallpapers/archive/062.jpg similarity index 100% rename from wallpapers/archive/062.jpg rename to public/wallpapers/archive/062.jpg diff --git a/wallpapers/archive/063.jpg b/public/wallpapers/archive/063.jpg similarity index 100% rename from wallpapers/archive/063.jpg rename to public/wallpapers/archive/063.jpg diff --git a/wallpapers/archive/064.jpg b/public/wallpapers/archive/064.jpg similarity index 100% rename from wallpapers/archive/064.jpg rename to public/wallpapers/archive/064.jpg diff --git a/wallpapers/archive/065.jpg b/public/wallpapers/archive/065.jpg similarity index 100% rename from wallpapers/archive/065.jpg rename to public/wallpapers/archive/065.jpg diff --git a/wallpapers/archive/066.jpg b/public/wallpapers/archive/066.jpg similarity index 100% rename from wallpapers/archive/066.jpg rename to public/wallpapers/archive/066.jpg diff --git a/wallpapers/archive/067.jpg b/public/wallpapers/archive/067.jpg similarity index 100% rename from wallpapers/archive/067.jpg rename to public/wallpapers/archive/067.jpg diff --git a/wallpapers/archive/068.jpg b/public/wallpapers/archive/068.jpg similarity index 100% rename from wallpapers/archive/068.jpg rename to public/wallpapers/archive/068.jpg diff --git a/wallpapers/archive/069.jpg b/public/wallpapers/archive/069.jpg similarity index 100% rename from wallpapers/archive/069.jpg rename to public/wallpapers/archive/069.jpg diff --git a/wallpapers/archive/070.jpg b/public/wallpapers/archive/070.jpg similarity index 100% rename from wallpapers/archive/070.jpg rename to public/wallpapers/archive/070.jpg diff --git a/wallpapers/archive/071.jpg b/public/wallpapers/archive/071.jpg similarity index 100% rename from wallpapers/archive/071.jpg rename to public/wallpapers/archive/071.jpg diff --git a/wallpapers/archive/072.jpg b/public/wallpapers/archive/072.jpg similarity index 100% rename from wallpapers/archive/072.jpg rename to public/wallpapers/archive/072.jpg diff --git a/wallpapers/archive/073.jpg b/public/wallpapers/archive/073.jpg similarity index 100% rename from wallpapers/archive/073.jpg rename to public/wallpapers/archive/073.jpg diff --git a/wallpapers/archive/074.jpg b/public/wallpapers/archive/074.jpg similarity index 100% rename from wallpapers/archive/074.jpg rename to public/wallpapers/archive/074.jpg diff --git a/wallpapers/archive/075.jpg b/public/wallpapers/archive/075.jpg similarity index 100% rename from wallpapers/archive/075.jpg rename to public/wallpapers/archive/075.jpg diff --git a/wallpapers/archive/076.jpg b/public/wallpapers/archive/076.jpg similarity index 100% rename from wallpapers/archive/076.jpg rename to public/wallpapers/archive/076.jpg diff --git a/wallpapers/archive/077.jpg b/public/wallpapers/archive/077.jpg similarity index 100% rename from wallpapers/archive/077.jpg rename to public/wallpapers/archive/077.jpg diff --git a/wallpapers/archive/078.jpg b/public/wallpapers/archive/078.jpg similarity index 100% rename from wallpapers/archive/078.jpg rename to public/wallpapers/archive/078.jpg diff --git a/wallpapers/archive/079.jpg b/public/wallpapers/archive/079.jpg similarity index 100% rename from wallpapers/archive/079.jpg rename to public/wallpapers/archive/079.jpg diff --git a/wallpapers/archive/080.jpg b/public/wallpapers/archive/080.jpg similarity index 100% rename from wallpapers/archive/080.jpg rename to public/wallpapers/archive/080.jpg diff --git a/wallpapers/archive/081.jpg b/public/wallpapers/archive/081.jpg similarity index 100% rename from wallpapers/archive/081.jpg rename to public/wallpapers/archive/081.jpg diff --git a/wallpapers/archive/082.jpg b/public/wallpapers/archive/082.jpg similarity index 100% rename from wallpapers/archive/082.jpg rename to public/wallpapers/archive/082.jpg diff --git a/wallpapers/archive/083.jpg b/public/wallpapers/archive/083.jpg similarity index 100% rename from wallpapers/archive/083.jpg rename to public/wallpapers/archive/083.jpg diff --git a/wallpapers/archive/084.jpg b/public/wallpapers/archive/084.jpg similarity index 100% rename from wallpapers/archive/084.jpg rename to public/wallpapers/archive/084.jpg diff --git a/wallpapers/archive/085.jpg b/public/wallpapers/archive/085.jpg similarity index 100% rename from wallpapers/archive/085.jpg rename to public/wallpapers/archive/085.jpg diff --git a/wallpapers/archive/086.jpg b/public/wallpapers/archive/086.jpg similarity index 100% rename from wallpapers/archive/086.jpg rename to public/wallpapers/archive/086.jpg diff --git a/wallpapers/archive/087.jpg b/public/wallpapers/archive/087.jpg similarity index 100% rename from wallpapers/archive/087.jpg rename to public/wallpapers/archive/087.jpg diff --git a/wallpapers/archive/088.jpg b/public/wallpapers/archive/088.jpg similarity index 100% rename from wallpapers/archive/088.jpg rename to public/wallpapers/archive/088.jpg diff --git a/wallpapers/archive/089.jpg b/public/wallpapers/archive/089.jpg similarity index 100% rename from wallpapers/archive/089.jpg rename to public/wallpapers/archive/089.jpg diff --git a/wallpapers/archive/090.jpg b/public/wallpapers/archive/090.jpg similarity index 100% rename from wallpapers/archive/090.jpg rename to public/wallpapers/archive/090.jpg diff --git a/wallpapers/archive/091.jpg b/public/wallpapers/archive/091.jpg similarity index 100% rename from wallpapers/archive/091.jpg rename to public/wallpapers/archive/091.jpg diff --git a/wallpapers/archive/092.jpg b/public/wallpapers/archive/092.jpg similarity index 100% rename from wallpapers/archive/092.jpg rename to public/wallpapers/archive/092.jpg diff --git a/wallpapers/archive/093.jpg b/public/wallpapers/archive/093.jpg similarity index 100% rename from wallpapers/archive/093.jpg rename to public/wallpapers/archive/093.jpg diff --git a/wallpapers/archive/094.jpg b/public/wallpapers/archive/094.jpg similarity index 100% rename from wallpapers/archive/094.jpg rename to public/wallpapers/archive/094.jpg diff --git a/wallpapers/archive/095.jpg b/public/wallpapers/archive/095.jpg similarity index 100% rename from wallpapers/archive/095.jpg rename to public/wallpapers/archive/095.jpg diff --git a/wallpapers/archive/096.jpg b/public/wallpapers/archive/096.jpg similarity index 100% rename from wallpapers/archive/096.jpg rename to public/wallpapers/archive/096.jpg diff --git a/wallpapers/archive/097.jpg b/public/wallpapers/archive/097.jpg similarity index 100% rename from wallpapers/archive/097.jpg rename to public/wallpapers/archive/097.jpg diff --git a/wallpapers/archive/098.jpg b/public/wallpapers/archive/098.jpg similarity index 100% rename from wallpapers/archive/098.jpg rename to public/wallpapers/archive/098.jpg diff --git a/wallpapers/archive/099.jpg b/public/wallpapers/archive/099.jpg similarity index 100% rename from wallpapers/archive/099.jpg rename to public/wallpapers/archive/099.jpg diff --git a/wallpapers/archive/100.jpg b/public/wallpapers/archive/100.jpg similarity index 100% rename from wallpapers/archive/100.jpg rename to public/wallpapers/archive/100.jpg diff --git a/wallpapers/archive/101.jpg b/public/wallpapers/archive/101.jpg similarity index 100% rename from wallpapers/archive/101.jpg rename to public/wallpapers/archive/101.jpg diff --git a/wallpapers/archive/102.jpg b/public/wallpapers/archive/102.jpg similarity index 100% rename from wallpapers/archive/102.jpg rename to public/wallpapers/archive/102.jpg diff --git a/wallpapers/archive/103.jpg b/public/wallpapers/archive/103.jpg similarity index 100% rename from wallpapers/archive/103.jpg rename to public/wallpapers/archive/103.jpg diff --git a/wallpapers/archive/104.jpg b/public/wallpapers/archive/104.jpg similarity index 100% rename from wallpapers/archive/104.jpg rename to public/wallpapers/archive/104.jpg diff --git a/wallpapers/archive/105.jpg b/public/wallpapers/archive/105.jpg similarity index 100% rename from wallpapers/archive/105.jpg rename to public/wallpapers/archive/105.jpg diff --git a/wallpapers/archive/106.jpg b/public/wallpapers/archive/106.jpg similarity index 100% rename from wallpapers/archive/106.jpg rename to public/wallpapers/archive/106.jpg diff --git a/wallpapers/archive/107.jpg b/public/wallpapers/archive/107.jpg similarity index 100% rename from wallpapers/archive/107.jpg rename to public/wallpapers/archive/107.jpg diff --git a/wallpapers/archive/108.jpg b/public/wallpapers/archive/108.jpg similarity index 100% rename from wallpapers/archive/108.jpg rename to public/wallpapers/archive/108.jpg diff --git a/wallpapers/archive/109.jpg b/public/wallpapers/archive/109.jpg similarity index 100% rename from wallpapers/archive/109.jpg rename to public/wallpapers/archive/109.jpg diff --git a/wallpapers/archive/110.jpg b/public/wallpapers/archive/110.jpg similarity index 100% rename from wallpapers/archive/110.jpg rename to public/wallpapers/archive/110.jpg diff --git a/wallpapers/archive/111.jpg b/public/wallpapers/archive/111.jpg similarity index 100% rename from wallpapers/archive/111.jpg rename to public/wallpapers/archive/111.jpg diff --git a/wallpapers/archive/112.jpg b/public/wallpapers/archive/112.jpg similarity index 100% rename from wallpapers/archive/112.jpg rename to public/wallpapers/archive/112.jpg diff --git a/wallpapers/archive/113.jpg b/public/wallpapers/archive/113.jpg similarity index 100% rename from wallpapers/archive/113.jpg rename to public/wallpapers/archive/113.jpg diff --git a/wallpapers/archive/114.jpg b/public/wallpapers/archive/114.jpg similarity index 100% rename from wallpapers/archive/114.jpg rename to public/wallpapers/archive/114.jpg diff --git a/wallpapers/archive/115.jpg b/public/wallpapers/archive/115.jpg similarity index 100% rename from wallpapers/archive/115.jpg rename to public/wallpapers/archive/115.jpg diff --git a/wallpapers/archive/116.jpg b/public/wallpapers/archive/116.jpg similarity index 100% rename from wallpapers/archive/116.jpg rename to public/wallpapers/archive/116.jpg diff --git a/wallpapers/archive/117.jpg b/public/wallpapers/archive/117.jpg similarity index 100% rename from wallpapers/archive/117.jpg rename to public/wallpapers/archive/117.jpg diff --git a/wallpapers/archive/118.jpg b/public/wallpapers/archive/118.jpg similarity index 100% rename from wallpapers/archive/118.jpg rename to public/wallpapers/archive/118.jpg diff --git a/wallpapers/archive/119.jpg b/public/wallpapers/archive/119.jpg similarity index 100% rename from wallpapers/archive/119.jpg rename to public/wallpapers/archive/119.jpg diff --git a/wallpapers/archive/120.jpg b/public/wallpapers/archive/120.jpg similarity index 100% rename from wallpapers/archive/120.jpg rename to public/wallpapers/archive/120.jpg diff --git a/wallpapers/archive/121.jpg b/public/wallpapers/archive/121.jpg similarity index 100% rename from wallpapers/archive/121.jpg rename to public/wallpapers/archive/121.jpg diff --git a/wallpapers/archive/122.jpg b/public/wallpapers/archive/122.jpg similarity index 100% rename from wallpapers/archive/122.jpg rename to public/wallpapers/archive/122.jpg diff --git a/wallpapers/archive/123.jpg b/public/wallpapers/archive/123.jpg similarity index 100% rename from wallpapers/archive/123.jpg rename to public/wallpapers/archive/123.jpg diff --git a/wallpapers/archive/124.jpg b/public/wallpapers/archive/124.jpg similarity index 100% rename from wallpapers/archive/124.jpg rename to public/wallpapers/archive/124.jpg diff --git a/wallpapers/archive/125.jpg b/public/wallpapers/archive/125.jpg similarity index 100% rename from wallpapers/archive/125.jpg rename to public/wallpapers/archive/125.jpg diff --git a/wallpapers/archive/126.jpg b/public/wallpapers/archive/126.jpg similarity index 100% rename from wallpapers/archive/126.jpg rename to public/wallpapers/archive/126.jpg diff --git a/wallpapers/archive/127.jpg b/public/wallpapers/archive/127.jpg similarity index 100% rename from wallpapers/archive/127.jpg rename to public/wallpapers/archive/127.jpg diff --git a/wallpapers/archive/128.jpg b/public/wallpapers/archive/128.jpg similarity index 100% rename from wallpapers/archive/128.jpg rename to public/wallpapers/archive/128.jpg diff --git a/wallpapers/archive/129.jpg b/public/wallpapers/archive/129.jpg similarity index 100% rename from wallpapers/archive/129.jpg rename to public/wallpapers/archive/129.jpg diff --git a/wallpapers/archive/130.jpg b/public/wallpapers/archive/130.jpg similarity index 100% rename from wallpapers/archive/130.jpg rename to public/wallpapers/archive/130.jpg diff --git a/wallpapers/archive/131.jpg b/public/wallpapers/archive/131.jpg similarity index 100% rename from wallpapers/archive/131.jpg rename to public/wallpapers/archive/131.jpg diff --git a/wallpapers/archive/132.jpg b/public/wallpapers/archive/132.jpg similarity index 100% rename from wallpapers/archive/132.jpg rename to public/wallpapers/archive/132.jpg diff --git a/wallpapers/archive/133.jpg b/public/wallpapers/archive/133.jpg similarity index 100% rename from wallpapers/archive/133.jpg rename to public/wallpapers/archive/133.jpg diff --git a/wallpapers/archive/134.jpg b/public/wallpapers/archive/134.jpg similarity index 100% rename from wallpapers/archive/134.jpg rename to public/wallpapers/archive/134.jpg diff --git a/wallpapers/archive/135.jpg b/public/wallpapers/archive/135.jpg similarity index 100% rename from wallpapers/archive/135.jpg rename to public/wallpapers/archive/135.jpg diff --git a/wallpapers/archive/136.jpg b/public/wallpapers/archive/136.jpg similarity index 100% rename from wallpapers/archive/136.jpg rename to public/wallpapers/archive/136.jpg diff --git a/wallpapers/archive/137.jpg b/public/wallpapers/archive/137.jpg similarity index 100% rename from wallpapers/archive/137.jpg rename to public/wallpapers/archive/137.jpg diff --git a/wallpapers/archive/138.jpg b/public/wallpapers/archive/138.jpg similarity index 100% rename from wallpapers/archive/138.jpg rename to public/wallpapers/archive/138.jpg diff --git a/wallpapers/archive/thumbnail/001.jpg b/public/wallpapers/archive/thumbnail/001.jpg similarity index 100% rename from wallpapers/archive/thumbnail/001.jpg rename to public/wallpapers/archive/thumbnail/001.jpg diff --git a/wallpapers/archive/thumbnail/002.jpg b/public/wallpapers/archive/thumbnail/002.jpg similarity index 100% rename from wallpapers/archive/thumbnail/002.jpg rename to public/wallpapers/archive/thumbnail/002.jpg diff --git a/wallpapers/archive/thumbnail/003.jpg b/public/wallpapers/archive/thumbnail/003.jpg similarity index 100% rename from wallpapers/archive/thumbnail/003.jpg rename to public/wallpapers/archive/thumbnail/003.jpg diff --git a/wallpapers/archive/thumbnail/004.jpg b/public/wallpapers/archive/thumbnail/004.jpg similarity index 100% rename from wallpapers/archive/thumbnail/004.jpg rename to public/wallpapers/archive/thumbnail/004.jpg diff --git a/wallpapers/archive/thumbnail/005.jpg b/public/wallpapers/archive/thumbnail/005.jpg similarity index 100% rename from wallpapers/archive/thumbnail/005.jpg rename to public/wallpapers/archive/thumbnail/005.jpg diff --git a/wallpapers/archive/thumbnail/006.jpg b/public/wallpapers/archive/thumbnail/006.jpg similarity index 100% rename from wallpapers/archive/thumbnail/006.jpg rename to public/wallpapers/archive/thumbnail/006.jpg diff --git a/wallpapers/archive/thumbnail/007.jpg b/public/wallpapers/archive/thumbnail/007.jpg similarity index 100% rename from wallpapers/archive/thumbnail/007.jpg rename to public/wallpapers/archive/thumbnail/007.jpg diff --git a/wallpapers/archive/thumbnail/008.jpg b/public/wallpapers/archive/thumbnail/008.jpg similarity index 100% rename from wallpapers/archive/thumbnail/008.jpg rename to public/wallpapers/archive/thumbnail/008.jpg diff --git a/wallpapers/archive/thumbnail/009.jpg b/public/wallpapers/archive/thumbnail/009.jpg similarity index 100% rename from wallpapers/archive/thumbnail/009.jpg rename to public/wallpapers/archive/thumbnail/009.jpg diff --git a/wallpapers/archive/thumbnail/010.jpg b/public/wallpapers/archive/thumbnail/010.jpg similarity index 100% rename from wallpapers/archive/thumbnail/010.jpg rename to public/wallpapers/archive/thumbnail/010.jpg diff --git a/wallpapers/archive/thumbnail/011.jpg b/public/wallpapers/archive/thumbnail/011.jpg similarity index 100% rename from wallpapers/archive/thumbnail/011.jpg rename to public/wallpapers/archive/thumbnail/011.jpg diff --git a/wallpapers/archive/thumbnail/012.jpg b/public/wallpapers/archive/thumbnail/012.jpg similarity index 100% rename from wallpapers/archive/thumbnail/012.jpg rename to public/wallpapers/archive/thumbnail/012.jpg diff --git a/wallpapers/archive/thumbnail/013.jpg b/public/wallpapers/archive/thumbnail/013.jpg similarity index 100% rename from wallpapers/archive/thumbnail/013.jpg rename to public/wallpapers/archive/thumbnail/013.jpg diff --git a/wallpapers/archive/thumbnail/014.jpg b/public/wallpapers/archive/thumbnail/014.jpg similarity index 100% rename from wallpapers/archive/thumbnail/014.jpg rename to public/wallpapers/archive/thumbnail/014.jpg diff --git a/wallpapers/archive/thumbnail/015.jpg b/public/wallpapers/archive/thumbnail/015.jpg similarity index 100% rename from wallpapers/archive/thumbnail/015.jpg rename to public/wallpapers/archive/thumbnail/015.jpg diff --git a/wallpapers/archive/thumbnail/016.jpg b/public/wallpapers/archive/thumbnail/016.jpg similarity index 100% rename from wallpapers/archive/thumbnail/016.jpg rename to public/wallpapers/archive/thumbnail/016.jpg diff --git a/wallpapers/archive/thumbnail/017.jpg b/public/wallpapers/archive/thumbnail/017.jpg similarity index 100% rename from wallpapers/archive/thumbnail/017.jpg rename to public/wallpapers/archive/thumbnail/017.jpg diff --git a/wallpapers/archive/thumbnail/018.jpg b/public/wallpapers/archive/thumbnail/018.jpg similarity index 100% rename from wallpapers/archive/thumbnail/018.jpg rename to public/wallpapers/archive/thumbnail/018.jpg diff --git a/wallpapers/archive/thumbnail/019.jpg b/public/wallpapers/archive/thumbnail/019.jpg similarity index 100% rename from wallpapers/archive/thumbnail/019.jpg rename to public/wallpapers/archive/thumbnail/019.jpg diff --git a/wallpapers/archive/thumbnail/020.jpg b/public/wallpapers/archive/thumbnail/020.jpg similarity index 100% rename from wallpapers/archive/thumbnail/020.jpg rename to public/wallpapers/archive/thumbnail/020.jpg diff --git a/wallpapers/archive/thumbnail/021.jpg b/public/wallpapers/archive/thumbnail/021.jpg similarity index 100% rename from wallpapers/archive/thumbnail/021.jpg rename to public/wallpapers/archive/thumbnail/021.jpg diff --git a/wallpapers/archive/thumbnail/022.jpg b/public/wallpapers/archive/thumbnail/022.jpg similarity index 100% rename from wallpapers/archive/thumbnail/022.jpg rename to public/wallpapers/archive/thumbnail/022.jpg diff --git a/wallpapers/archive/thumbnail/023.jpg b/public/wallpapers/archive/thumbnail/023.jpg similarity index 100% rename from wallpapers/archive/thumbnail/023.jpg rename to public/wallpapers/archive/thumbnail/023.jpg diff --git a/wallpapers/archive/thumbnail/024.jpg b/public/wallpapers/archive/thumbnail/024.jpg similarity index 100% rename from wallpapers/archive/thumbnail/024.jpg rename to public/wallpapers/archive/thumbnail/024.jpg diff --git a/wallpapers/archive/thumbnail/025.jpg b/public/wallpapers/archive/thumbnail/025.jpg similarity index 100% rename from wallpapers/archive/thumbnail/025.jpg rename to public/wallpapers/archive/thumbnail/025.jpg diff --git a/wallpapers/archive/thumbnail/026.jpg b/public/wallpapers/archive/thumbnail/026.jpg similarity index 100% rename from wallpapers/archive/thumbnail/026.jpg rename to public/wallpapers/archive/thumbnail/026.jpg diff --git a/wallpapers/archive/thumbnail/027.jpg b/public/wallpapers/archive/thumbnail/027.jpg similarity index 100% rename from wallpapers/archive/thumbnail/027.jpg rename to public/wallpapers/archive/thumbnail/027.jpg diff --git a/wallpapers/archive/thumbnail/028.jpg b/public/wallpapers/archive/thumbnail/028.jpg similarity index 100% rename from wallpapers/archive/thumbnail/028.jpg rename to public/wallpapers/archive/thumbnail/028.jpg diff --git a/wallpapers/archive/thumbnail/029.jpg b/public/wallpapers/archive/thumbnail/029.jpg similarity index 100% rename from wallpapers/archive/thumbnail/029.jpg rename to public/wallpapers/archive/thumbnail/029.jpg diff --git a/wallpapers/archive/thumbnail/030.jpg b/public/wallpapers/archive/thumbnail/030.jpg similarity index 100% rename from wallpapers/archive/thumbnail/030.jpg rename to public/wallpapers/archive/thumbnail/030.jpg diff --git a/wallpapers/archive/thumbnail/031.jpg b/public/wallpapers/archive/thumbnail/031.jpg similarity index 100% rename from wallpapers/archive/thumbnail/031.jpg rename to public/wallpapers/archive/thumbnail/031.jpg diff --git a/wallpapers/archive/thumbnail/032.jpg b/public/wallpapers/archive/thumbnail/032.jpg similarity index 100% rename from wallpapers/archive/thumbnail/032.jpg rename to public/wallpapers/archive/thumbnail/032.jpg diff --git a/wallpapers/archive/thumbnail/033.jpg b/public/wallpapers/archive/thumbnail/033.jpg similarity index 100% rename from wallpapers/archive/thumbnail/033.jpg rename to public/wallpapers/archive/thumbnail/033.jpg diff --git a/wallpapers/archive/thumbnail/034.jpg b/public/wallpapers/archive/thumbnail/034.jpg similarity index 100% rename from wallpapers/archive/thumbnail/034.jpg rename to public/wallpapers/archive/thumbnail/034.jpg diff --git a/wallpapers/archive/thumbnail/035.jpg b/public/wallpapers/archive/thumbnail/035.jpg similarity index 100% rename from wallpapers/archive/thumbnail/035.jpg rename to public/wallpapers/archive/thumbnail/035.jpg diff --git a/wallpapers/archive/thumbnail/036.jpg b/public/wallpapers/archive/thumbnail/036.jpg similarity index 100% rename from wallpapers/archive/thumbnail/036.jpg rename to public/wallpapers/archive/thumbnail/036.jpg diff --git a/wallpapers/archive/thumbnail/037.jpg b/public/wallpapers/archive/thumbnail/037.jpg similarity index 100% rename from wallpapers/archive/thumbnail/037.jpg rename to public/wallpapers/archive/thumbnail/037.jpg diff --git a/wallpapers/archive/thumbnail/038.jpg b/public/wallpapers/archive/thumbnail/038.jpg similarity index 100% rename from wallpapers/archive/thumbnail/038.jpg rename to public/wallpapers/archive/thumbnail/038.jpg diff --git a/wallpapers/archive/thumbnail/039.jpg b/public/wallpapers/archive/thumbnail/039.jpg similarity index 100% rename from wallpapers/archive/thumbnail/039.jpg rename to public/wallpapers/archive/thumbnail/039.jpg diff --git a/wallpapers/archive/thumbnail/040.jpg b/public/wallpapers/archive/thumbnail/040.jpg similarity index 100% rename from wallpapers/archive/thumbnail/040.jpg rename to public/wallpapers/archive/thumbnail/040.jpg diff --git a/wallpapers/archive/thumbnail/041.jpg b/public/wallpapers/archive/thumbnail/041.jpg similarity index 100% rename from wallpapers/archive/thumbnail/041.jpg rename to public/wallpapers/archive/thumbnail/041.jpg diff --git a/wallpapers/archive/thumbnail/042.jpg b/public/wallpapers/archive/thumbnail/042.jpg similarity index 100% rename from wallpapers/archive/thumbnail/042.jpg rename to public/wallpapers/archive/thumbnail/042.jpg diff --git a/wallpapers/archive/thumbnail/043.jpg b/public/wallpapers/archive/thumbnail/043.jpg similarity index 100% rename from wallpapers/archive/thumbnail/043.jpg rename to public/wallpapers/archive/thumbnail/043.jpg diff --git a/wallpapers/archive/thumbnail/044.jpg b/public/wallpapers/archive/thumbnail/044.jpg similarity index 100% rename from wallpapers/archive/thumbnail/044.jpg rename to public/wallpapers/archive/thumbnail/044.jpg diff --git a/wallpapers/archive/thumbnail/045.jpg b/public/wallpapers/archive/thumbnail/045.jpg similarity index 100% rename from wallpapers/archive/thumbnail/045.jpg rename to public/wallpapers/archive/thumbnail/045.jpg diff --git a/wallpapers/archive/thumbnail/046.jpg b/public/wallpapers/archive/thumbnail/046.jpg similarity index 100% rename from wallpapers/archive/thumbnail/046.jpg rename to public/wallpapers/archive/thumbnail/046.jpg diff --git a/wallpapers/archive/thumbnail/047.jpg b/public/wallpapers/archive/thumbnail/047.jpg similarity index 100% rename from wallpapers/archive/thumbnail/047.jpg rename to public/wallpapers/archive/thumbnail/047.jpg diff --git a/wallpapers/archive/thumbnail/048.jpg b/public/wallpapers/archive/thumbnail/048.jpg similarity index 100% rename from wallpapers/archive/thumbnail/048.jpg rename to public/wallpapers/archive/thumbnail/048.jpg diff --git a/wallpapers/archive/thumbnail/049.jpg b/public/wallpapers/archive/thumbnail/049.jpg similarity index 100% rename from wallpapers/archive/thumbnail/049.jpg rename to public/wallpapers/archive/thumbnail/049.jpg diff --git a/wallpapers/archive/thumbnail/050.jpg b/public/wallpapers/archive/thumbnail/050.jpg similarity index 100% rename from wallpapers/archive/thumbnail/050.jpg rename to public/wallpapers/archive/thumbnail/050.jpg diff --git a/wallpapers/archive/thumbnail/051.jpg b/public/wallpapers/archive/thumbnail/051.jpg similarity index 100% rename from wallpapers/archive/thumbnail/051.jpg rename to public/wallpapers/archive/thumbnail/051.jpg diff --git a/wallpapers/archive/thumbnail/052.jpg b/public/wallpapers/archive/thumbnail/052.jpg similarity index 100% rename from wallpapers/archive/thumbnail/052.jpg rename to public/wallpapers/archive/thumbnail/052.jpg diff --git a/wallpapers/archive/thumbnail/053.jpg b/public/wallpapers/archive/thumbnail/053.jpg similarity index 100% rename from wallpapers/archive/thumbnail/053.jpg rename to public/wallpapers/archive/thumbnail/053.jpg diff --git a/wallpapers/archive/thumbnail/054.jpg b/public/wallpapers/archive/thumbnail/054.jpg similarity index 100% rename from wallpapers/archive/thumbnail/054.jpg rename to public/wallpapers/archive/thumbnail/054.jpg diff --git a/wallpapers/archive/thumbnail/055.jpg b/public/wallpapers/archive/thumbnail/055.jpg similarity index 100% rename from wallpapers/archive/thumbnail/055.jpg rename to public/wallpapers/archive/thumbnail/055.jpg diff --git a/wallpapers/archive/thumbnail/056.jpg b/public/wallpapers/archive/thumbnail/056.jpg similarity index 100% rename from wallpapers/archive/thumbnail/056.jpg rename to public/wallpapers/archive/thumbnail/056.jpg diff --git a/wallpapers/archive/thumbnail/057.jpg b/public/wallpapers/archive/thumbnail/057.jpg similarity index 100% rename from wallpapers/archive/thumbnail/057.jpg rename to public/wallpapers/archive/thumbnail/057.jpg diff --git a/wallpapers/archive/thumbnail/058.jpg b/public/wallpapers/archive/thumbnail/058.jpg similarity index 100% rename from wallpapers/archive/thumbnail/058.jpg rename to public/wallpapers/archive/thumbnail/058.jpg diff --git a/wallpapers/archive/thumbnail/059.jpg b/public/wallpapers/archive/thumbnail/059.jpg similarity index 100% rename from wallpapers/archive/thumbnail/059.jpg rename to public/wallpapers/archive/thumbnail/059.jpg diff --git a/wallpapers/archive/thumbnail/060.jpg b/public/wallpapers/archive/thumbnail/060.jpg similarity index 100% rename from wallpapers/archive/thumbnail/060.jpg rename to public/wallpapers/archive/thumbnail/060.jpg diff --git a/wallpapers/archive/thumbnail/061.jpg b/public/wallpapers/archive/thumbnail/061.jpg similarity index 100% rename from wallpapers/archive/thumbnail/061.jpg rename to public/wallpapers/archive/thumbnail/061.jpg diff --git a/wallpapers/archive/thumbnail/062.jpg b/public/wallpapers/archive/thumbnail/062.jpg similarity index 100% rename from wallpapers/archive/thumbnail/062.jpg rename to public/wallpapers/archive/thumbnail/062.jpg diff --git a/wallpapers/archive/thumbnail/063.jpg b/public/wallpapers/archive/thumbnail/063.jpg similarity index 100% rename from wallpapers/archive/thumbnail/063.jpg rename to public/wallpapers/archive/thumbnail/063.jpg diff --git a/wallpapers/archive/thumbnail/064.jpg b/public/wallpapers/archive/thumbnail/064.jpg similarity index 100% rename from wallpapers/archive/thumbnail/064.jpg rename to public/wallpapers/archive/thumbnail/064.jpg diff --git a/wallpapers/archive/thumbnail/065.jpg b/public/wallpapers/archive/thumbnail/065.jpg similarity index 100% rename from wallpapers/archive/thumbnail/065.jpg rename to public/wallpapers/archive/thumbnail/065.jpg diff --git a/wallpapers/archive/thumbnail/066.jpg b/public/wallpapers/archive/thumbnail/066.jpg similarity index 100% rename from wallpapers/archive/thumbnail/066.jpg rename to public/wallpapers/archive/thumbnail/066.jpg diff --git a/wallpapers/archive/thumbnail/067.jpg b/public/wallpapers/archive/thumbnail/067.jpg similarity index 100% rename from wallpapers/archive/thumbnail/067.jpg rename to public/wallpapers/archive/thumbnail/067.jpg diff --git a/wallpapers/archive/thumbnail/068.jpg b/public/wallpapers/archive/thumbnail/068.jpg similarity index 100% rename from wallpapers/archive/thumbnail/068.jpg rename to public/wallpapers/archive/thumbnail/068.jpg diff --git a/wallpapers/archive/thumbnail/069.jpg b/public/wallpapers/archive/thumbnail/069.jpg similarity index 100% rename from wallpapers/archive/thumbnail/069.jpg rename to public/wallpapers/archive/thumbnail/069.jpg diff --git a/wallpapers/archive/thumbnail/070.jpg b/public/wallpapers/archive/thumbnail/070.jpg similarity index 100% rename from wallpapers/archive/thumbnail/070.jpg rename to public/wallpapers/archive/thumbnail/070.jpg diff --git a/wallpapers/archive/thumbnail/071.jpg b/public/wallpapers/archive/thumbnail/071.jpg similarity index 100% rename from wallpapers/archive/thumbnail/071.jpg rename to public/wallpapers/archive/thumbnail/071.jpg diff --git a/wallpapers/archive/thumbnail/072.jpg b/public/wallpapers/archive/thumbnail/072.jpg similarity index 100% rename from wallpapers/archive/thumbnail/072.jpg rename to public/wallpapers/archive/thumbnail/072.jpg diff --git a/wallpapers/archive/thumbnail/073.jpg b/public/wallpapers/archive/thumbnail/073.jpg similarity index 100% rename from wallpapers/archive/thumbnail/073.jpg rename to public/wallpapers/archive/thumbnail/073.jpg diff --git a/wallpapers/archive/thumbnail/074.jpg b/public/wallpapers/archive/thumbnail/074.jpg similarity index 100% rename from wallpapers/archive/thumbnail/074.jpg rename to public/wallpapers/archive/thumbnail/074.jpg diff --git a/wallpapers/archive/thumbnail/075.jpg b/public/wallpapers/archive/thumbnail/075.jpg similarity index 100% rename from wallpapers/archive/thumbnail/075.jpg rename to public/wallpapers/archive/thumbnail/075.jpg diff --git a/wallpapers/archive/thumbnail/076.jpg b/public/wallpapers/archive/thumbnail/076.jpg similarity index 100% rename from wallpapers/archive/thumbnail/076.jpg rename to public/wallpapers/archive/thumbnail/076.jpg diff --git a/wallpapers/archive/thumbnail/077.jpg b/public/wallpapers/archive/thumbnail/077.jpg similarity index 100% rename from wallpapers/archive/thumbnail/077.jpg rename to public/wallpapers/archive/thumbnail/077.jpg diff --git a/wallpapers/archive/thumbnail/078.jpg b/public/wallpapers/archive/thumbnail/078.jpg similarity index 100% rename from wallpapers/archive/thumbnail/078.jpg rename to public/wallpapers/archive/thumbnail/078.jpg diff --git a/wallpapers/archive/thumbnail/079.jpg b/public/wallpapers/archive/thumbnail/079.jpg similarity index 100% rename from wallpapers/archive/thumbnail/079.jpg rename to public/wallpapers/archive/thumbnail/079.jpg diff --git a/wallpapers/archive/thumbnail/080.jpg b/public/wallpapers/archive/thumbnail/080.jpg similarity index 100% rename from wallpapers/archive/thumbnail/080.jpg rename to public/wallpapers/archive/thumbnail/080.jpg diff --git a/wallpapers/archive/thumbnail/081.jpg b/public/wallpapers/archive/thumbnail/081.jpg similarity index 100% rename from wallpapers/archive/thumbnail/081.jpg rename to public/wallpapers/archive/thumbnail/081.jpg diff --git a/wallpapers/archive/thumbnail/082.jpg b/public/wallpapers/archive/thumbnail/082.jpg similarity index 100% rename from wallpapers/archive/thumbnail/082.jpg rename to public/wallpapers/archive/thumbnail/082.jpg diff --git a/wallpapers/archive/thumbnail/083.jpg b/public/wallpapers/archive/thumbnail/083.jpg similarity index 100% rename from wallpapers/archive/thumbnail/083.jpg rename to public/wallpapers/archive/thumbnail/083.jpg diff --git a/wallpapers/archive/thumbnail/084.jpg b/public/wallpapers/archive/thumbnail/084.jpg similarity index 100% rename from wallpapers/archive/thumbnail/084.jpg rename to public/wallpapers/archive/thumbnail/084.jpg diff --git a/wallpapers/archive/thumbnail/085.jpg b/public/wallpapers/archive/thumbnail/085.jpg similarity index 100% rename from wallpapers/archive/thumbnail/085.jpg rename to public/wallpapers/archive/thumbnail/085.jpg diff --git a/wallpapers/archive/thumbnail/086.jpg b/public/wallpapers/archive/thumbnail/086.jpg similarity index 100% rename from wallpapers/archive/thumbnail/086.jpg rename to public/wallpapers/archive/thumbnail/086.jpg diff --git a/wallpapers/archive/thumbnail/087.jpg b/public/wallpapers/archive/thumbnail/087.jpg similarity index 100% rename from wallpapers/archive/thumbnail/087.jpg rename to public/wallpapers/archive/thumbnail/087.jpg diff --git a/wallpapers/archive/thumbnail/088.jpg b/public/wallpapers/archive/thumbnail/088.jpg similarity index 100% rename from wallpapers/archive/thumbnail/088.jpg rename to public/wallpapers/archive/thumbnail/088.jpg diff --git a/wallpapers/archive/thumbnail/089.jpg b/public/wallpapers/archive/thumbnail/089.jpg similarity index 100% rename from wallpapers/archive/thumbnail/089.jpg rename to public/wallpapers/archive/thumbnail/089.jpg diff --git a/wallpapers/archive/thumbnail/090.jpg b/public/wallpapers/archive/thumbnail/090.jpg similarity index 100% rename from wallpapers/archive/thumbnail/090.jpg rename to public/wallpapers/archive/thumbnail/090.jpg diff --git a/wallpapers/archive/thumbnail/091.jpg b/public/wallpapers/archive/thumbnail/091.jpg similarity index 100% rename from wallpapers/archive/thumbnail/091.jpg rename to public/wallpapers/archive/thumbnail/091.jpg diff --git a/wallpapers/archive/thumbnail/092.jpg b/public/wallpapers/archive/thumbnail/092.jpg similarity index 100% rename from wallpapers/archive/thumbnail/092.jpg rename to public/wallpapers/archive/thumbnail/092.jpg diff --git a/wallpapers/archive/thumbnail/093.jpg b/public/wallpapers/archive/thumbnail/093.jpg similarity index 100% rename from wallpapers/archive/thumbnail/093.jpg rename to public/wallpapers/archive/thumbnail/093.jpg diff --git a/wallpapers/archive/thumbnail/094.jpg b/public/wallpapers/archive/thumbnail/094.jpg similarity index 100% rename from wallpapers/archive/thumbnail/094.jpg rename to public/wallpapers/archive/thumbnail/094.jpg diff --git a/wallpapers/archive/thumbnail/095.jpg b/public/wallpapers/archive/thumbnail/095.jpg similarity index 100% rename from wallpapers/archive/thumbnail/095.jpg rename to public/wallpapers/archive/thumbnail/095.jpg diff --git a/wallpapers/archive/thumbnail/096.jpg b/public/wallpapers/archive/thumbnail/096.jpg similarity index 100% rename from wallpapers/archive/thumbnail/096.jpg rename to public/wallpapers/archive/thumbnail/096.jpg diff --git a/wallpapers/archive/thumbnail/097.jpg b/public/wallpapers/archive/thumbnail/097.jpg similarity index 100% rename from wallpapers/archive/thumbnail/097.jpg rename to public/wallpapers/archive/thumbnail/097.jpg diff --git a/wallpapers/archive/thumbnail/098.jpg b/public/wallpapers/archive/thumbnail/098.jpg similarity index 100% rename from wallpapers/archive/thumbnail/098.jpg rename to public/wallpapers/archive/thumbnail/098.jpg diff --git a/wallpapers/archive/thumbnail/099.jpg b/public/wallpapers/archive/thumbnail/099.jpg similarity index 100% rename from wallpapers/archive/thumbnail/099.jpg rename to public/wallpapers/archive/thumbnail/099.jpg diff --git a/wallpapers/archive/thumbnail/100.jpg b/public/wallpapers/archive/thumbnail/100.jpg similarity index 100% rename from wallpapers/archive/thumbnail/100.jpg rename to public/wallpapers/archive/thumbnail/100.jpg diff --git a/wallpapers/archive/thumbnail/101.jpg b/public/wallpapers/archive/thumbnail/101.jpg similarity index 100% rename from wallpapers/archive/thumbnail/101.jpg rename to public/wallpapers/archive/thumbnail/101.jpg diff --git a/wallpapers/archive/thumbnail/102.jpg b/public/wallpapers/archive/thumbnail/102.jpg similarity index 100% rename from wallpapers/archive/thumbnail/102.jpg rename to public/wallpapers/archive/thumbnail/102.jpg diff --git a/wallpapers/archive/thumbnail/103.jpg b/public/wallpapers/archive/thumbnail/103.jpg similarity index 100% rename from wallpapers/archive/thumbnail/103.jpg rename to public/wallpapers/archive/thumbnail/103.jpg diff --git a/wallpapers/archive/thumbnail/104.jpg b/public/wallpapers/archive/thumbnail/104.jpg similarity index 100% rename from wallpapers/archive/thumbnail/104.jpg rename to public/wallpapers/archive/thumbnail/104.jpg diff --git a/wallpapers/archive/thumbnail/105.jpg b/public/wallpapers/archive/thumbnail/105.jpg similarity index 100% rename from wallpapers/archive/thumbnail/105.jpg rename to public/wallpapers/archive/thumbnail/105.jpg diff --git a/wallpapers/archive/thumbnail/106.jpg b/public/wallpapers/archive/thumbnail/106.jpg similarity index 100% rename from wallpapers/archive/thumbnail/106.jpg rename to public/wallpapers/archive/thumbnail/106.jpg diff --git a/wallpapers/archive/thumbnail/107.jpg b/public/wallpapers/archive/thumbnail/107.jpg similarity index 100% rename from wallpapers/archive/thumbnail/107.jpg rename to public/wallpapers/archive/thumbnail/107.jpg diff --git a/wallpapers/archive/thumbnail/108.jpg b/public/wallpapers/archive/thumbnail/108.jpg similarity index 100% rename from wallpapers/archive/thumbnail/108.jpg rename to public/wallpapers/archive/thumbnail/108.jpg diff --git a/wallpapers/archive/thumbnail/109.jpg b/public/wallpapers/archive/thumbnail/109.jpg similarity index 100% rename from wallpapers/archive/thumbnail/109.jpg rename to public/wallpapers/archive/thumbnail/109.jpg diff --git a/wallpapers/archive/thumbnail/110.jpg b/public/wallpapers/archive/thumbnail/110.jpg similarity index 100% rename from wallpapers/archive/thumbnail/110.jpg rename to public/wallpapers/archive/thumbnail/110.jpg diff --git a/wallpapers/archive/thumbnail/111.jpg b/public/wallpapers/archive/thumbnail/111.jpg similarity index 100% rename from wallpapers/archive/thumbnail/111.jpg rename to public/wallpapers/archive/thumbnail/111.jpg diff --git a/wallpapers/archive/thumbnail/112.jpg b/public/wallpapers/archive/thumbnail/112.jpg similarity index 100% rename from wallpapers/archive/thumbnail/112.jpg rename to public/wallpapers/archive/thumbnail/112.jpg diff --git a/wallpapers/archive/thumbnail/113.jpg b/public/wallpapers/archive/thumbnail/113.jpg similarity index 100% rename from wallpapers/archive/thumbnail/113.jpg rename to public/wallpapers/archive/thumbnail/113.jpg diff --git a/wallpapers/archive/thumbnail/114.jpg b/public/wallpapers/archive/thumbnail/114.jpg similarity index 100% rename from wallpapers/archive/thumbnail/114.jpg rename to public/wallpapers/archive/thumbnail/114.jpg diff --git a/wallpapers/archive/thumbnail/115.jpg b/public/wallpapers/archive/thumbnail/115.jpg similarity index 100% rename from wallpapers/archive/thumbnail/115.jpg rename to public/wallpapers/archive/thumbnail/115.jpg diff --git a/wallpapers/archive/thumbnail/116.jpg b/public/wallpapers/archive/thumbnail/116.jpg similarity index 100% rename from wallpapers/archive/thumbnail/116.jpg rename to public/wallpapers/archive/thumbnail/116.jpg diff --git a/wallpapers/archive/thumbnail/117.jpg b/public/wallpapers/archive/thumbnail/117.jpg similarity index 100% rename from wallpapers/archive/thumbnail/117.jpg rename to public/wallpapers/archive/thumbnail/117.jpg diff --git a/wallpapers/archive/thumbnail/118.jpg b/public/wallpapers/archive/thumbnail/118.jpg similarity index 100% rename from wallpapers/archive/thumbnail/118.jpg rename to public/wallpapers/archive/thumbnail/118.jpg diff --git a/wallpapers/archive/thumbnail/119.jpg b/public/wallpapers/archive/thumbnail/119.jpg similarity index 100% rename from wallpapers/archive/thumbnail/119.jpg rename to public/wallpapers/archive/thumbnail/119.jpg diff --git a/wallpapers/archive/thumbnail/120.jpg b/public/wallpapers/archive/thumbnail/120.jpg similarity index 100% rename from wallpapers/archive/thumbnail/120.jpg rename to public/wallpapers/archive/thumbnail/120.jpg diff --git a/wallpapers/archive/thumbnail/121.jpg b/public/wallpapers/archive/thumbnail/121.jpg similarity index 100% rename from wallpapers/archive/thumbnail/121.jpg rename to public/wallpapers/archive/thumbnail/121.jpg diff --git a/wallpapers/archive/thumbnail/122.jpg b/public/wallpapers/archive/thumbnail/122.jpg similarity index 100% rename from wallpapers/archive/thumbnail/122.jpg rename to public/wallpapers/archive/thumbnail/122.jpg diff --git a/wallpapers/archive/thumbnail/123.jpg b/public/wallpapers/archive/thumbnail/123.jpg similarity index 100% rename from wallpapers/archive/thumbnail/123.jpg rename to public/wallpapers/archive/thumbnail/123.jpg diff --git a/wallpapers/archive/thumbnail/124.jpg b/public/wallpapers/archive/thumbnail/124.jpg similarity index 100% rename from wallpapers/archive/thumbnail/124.jpg rename to public/wallpapers/archive/thumbnail/124.jpg diff --git a/wallpapers/archive/thumbnail/125.jpg b/public/wallpapers/archive/thumbnail/125.jpg similarity index 100% rename from wallpapers/archive/thumbnail/125.jpg rename to public/wallpapers/archive/thumbnail/125.jpg diff --git a/wallpapers/archive/thumbnail/126.jpg b/public/wallpapers/archive/thumbnail/126.jpg similarity index 100% rename from wallpapers/archive/thumbnail/126.jpg rename to public/wallpapers/archive/thumbnail/126.jpg diff --git a/wallpapers/archive/thumbnail/127.jpg b/public/wallpapers/archive/thumbnail/127.jpg similarity index 100% rename from wallpapers/archive/thumbnail/127.jpg rename to public/wallpapers/archive/thumbnail/127.jpg diff --git a/wallpapers/archive/thumbnail/128.jpg b/public/wallpapers/archive/thumbnail/128.jpg similarity index 100% rename from wallpapers/archive/thumbnail/128.jpg rename to public/wallpapers/archive/thumbnail/128.jpg diff --git a/wallpapers/archive/thumbnail/129.jpg b/public/wallpapers/archive/thumbnail/129.jpg similarity index 100% rename from wallpapers/archive/thumbnail/129.jpg rename to public/wallpapers/archive/thumbnail/129.jpg diff --git a/wallpapers/archive/thumbnail/130.jpg b/public/wallpapers/archive/thumbnail/130.jpg similarity index 100% rename from wallpapers/archive/thumbnail/130.jpg rename to public/wallpapers/archive/thumbnail/130.jpg diff --git a/wallpapers/archive/thumbnail/131.jpg b/public/wallpapers/archive/thumbnail/131.jpg similarity index 100% rename from wallpapers/archive/thumbnail/131.jpg rename to public/wallpapers/archive/thumbnail/131.jpg diff --git a/wallpapers/archive/thumbnail/132.jpg b/public/wallpapers/archive/thumbnail/132.jpg similarity index 100% rename from wallpapers/archive/thumbnail/132.jpg rename to public/wallpapers/archive/thumbnail/132.jpg diff --git a/wallpapers/archive/thumbnail/133.jpg b/public/wallpapers/archive/thumbnail/133.jpg similarity index 100% rename from wallpapers/archive/thumbnail/133.jpg rename to public/wallpapers/archive/thumbnail/133.jpg diff --git a/wallpapers/archive/thumbnail/134.jpg b/public/wallpapers/archive/thumbnail/134.jpg similarity index 100% rename from wallpapers/archive/thumbnail/134.jpg rename to public/wallpapers/archive/thumbnail/134.jpg diff --git a/wallpapers/archive/thumbnail/135.jpg b/public/wallpapers/archive/thumbnail/135.jpg similarity index 100% rename from wallpapers/archive/thumbnail/135.jpg rename to public/wallpapers/archive/thumbnail/135.jpg diff --git a/wallpapers/archive/thumbnail/136.jpg b/public/wallpapers/archive/thumbnail/136.jpg similarity index 100% rename from wallpapers/archive/thumbnail/136.jpg rename to public/wallpapers/archive/thumbnail/136.jpg diff --git a/wallpapers/archive/thumbnail/137.jpg b/public/wallpapers/archive/thumbnail/137.jpg similarity index 100% rename from wallpapers/archive/thumbnail/137.jpg rename to public/wallpapers/archive/thumbnail/137.jpg diff --git a/wallpapers/archive/thumbnail/138.jpg b/public/wallpapers/archive/thumbnail/138.jpg similarity index 100% rename from wallpapers/archive/thumbnail/138.jpg rename to public/wallpapers/archive/thumbnail/138.jpg diff --git a/wallpapers/desktop/1280x720/000.jpg b/public/wallpapers/desktop/1280x720/000.jpg similarity index 100% rename from wallpapers/desktop/1280x720/000.jpg rename to public/wallpapers/desktop/1280x720/000.jpg diff --git a/wallpapers/desktop/1280x720/001.jpg b/public/wallpapers/desktop/1280x720/001.jpg similarity index 100% rename from wallpapers/desktop/1280x720/001.jpg rename to public/wallpapers/desktop/1280x720/001.jpg diff --git a/wallpapers/desktop/1280x720/002.jpg b/public/wallpapers/desktop/1280x720/002.jpg similarity index 100% rename from wallpapers/desktop/1280x720/002.jpg rename to public/wallpapers/desktop/1280x720/002.jpg diff --git a/wallpapers/desktop/1280x720/003.jpg b/public/wallpapers/desktop/1280x720/003.jpg similarity index 100% rename from wallpapers/desktop/1280x720/003.jpg rename to public/wallpapers/desktop/1280x720/003.jpg diff --git a/wallpapers/desktop/1280x720/004.jpg b/public/wallpapers/desktop/1280x720/004.jpg similarity index 100% rename from wallpapers/desktop/1280x720/004.jpg rename to public/wallpapers/desktop/1280x720/004.jpg diff --git a/wallpapers/desktop/1280x720/005.jpg b/public/wallpapers/desktop/1280x720/005.jpg similarity index 100% rename from wallpapers/desktop/1280x720/005.jpg rename to public/wallpapers/desktop/1280x720/005.jpg diff --git a/wallpapers/desktop/1280x720/006.jpg b/public/wallpapers/desktop/1280x720/006.jpg similarity index 100% rename from wallpapers/desktop/1280x720/006.jpg rename to public/wallpapers/desktop/1280x720/006.jpg diff --git a/wallpapers/desktop/1280x720/007.jpg b/public/wallpapers/desktop/1280x720/007.jpg similarity index 100% rename from wallpapers/desktop/1280x720/007.jpg rename to public/wallpapers/desktop/1280x720/007.jpg diff --git a/wallpapers/desktop/1280x720/008.jpg b/public/wallpapers/desktop/1280x720/008.jpg similarity index 100% rename from wallpapers/desktop/1280x720/008.jpg rename to public/wallpapers/desktop/1280x720/008.jpg diff --git a/wallpapers/desktop/1280x720/009.jpg b/public/wallpapers/desktop/1280x720/009.jpg similarity index 100% rename from wallpapers/desktop/1280x720/009.jpg rename to public/wallpapers/desktop/1280x720/009.jpg diff --git a/wallpapers/desktop/1280x720/010.jpg b/public/wallpapers/desktop/1280x720/010.jpg similarity index 100% rename from wallpapers/desktop/1280x720/010.jpg rename to public/wallpapers/desktop/1280x720/010.jpg diff --git a/wallpapers/desktop/1280x720/011.jpg b/public/wallpapers/desktop/1280x720/011.jpg similarity index 100% rename from wallpapers/desktop/1280x720/011.jpg rename to public/wallpapers/desktop/1280x720/011.jpg diff --git a/wallpapers/desktop/1280x720/012.jpg b/public/wallpapers/desktop/1280x720/012.jpg similarity index 100% rename from wallpapers/desktop/1280x720/012.jpg rename to public/wallpapers/desktop/1280x720/012.jpg diff --git a/wallpapers/desktop/1280x720/013.jpg b/public/wallpapers/desktop/1280x720/013.jpg similarity index 100% rename from wallpapers/desktop/1280x720/013.jpg rename to public/wallpapers/desktop/1280x720/013.jpg diff --git a/wallpapers/desktop/1280x720/014.jpg b/public/wallpapers/desktop/1280x720/014.jpg similarity index 100% rename from wallpapers/desktop/1280x720/014.jpg rename to public/wallpapers/desktop/1280x720/014.jpg diff --git a/wallpapers/desktop/1280x720/015.jpg b/public/wallpapers/desktop/1280x720/015.jpg similarity index 100% rename from wallpapers/desktop/1280x720/015.jpg rename to public/wallpapers/desktop/1280x720/015.jpg diff --git a/wallpapers/desktop/1280x720/016.jpg b/public/wallpapers/desktop/1280x720/016.jpg similarity index 100% rename from wallpapers/desktop/1280x720/016.jpg rename to public/wallpapers/desktop/1280x720/016.jpg diff --git a/wallpapers/desktop/1280x720/017.jpg b/public/wallpapers/desktop/1280x720/017.jpg similarity index 100% rename from wallpapers/desktop/1280x720/017.jpg rename to public/wallpapers/desktop/1280x720/017.jpg diff --git a/wallpapers/desktop/1280x720/018.jpg b/public/wallpapers/desktop/1280x720/018.jpg similarity index 100% rename from wallpapers/desktop/1280x720/018.jpg rename to public/wallpapers/desktop/1280x720/018.jpg diff --git a/wallpapers/desktop/1280x720/019.jpg b/public/wallpapers/desktop/1280x720/019.jpg similarity index 100% rename from wallpapers/desktop/1280x720/019.jpg rename to public/wallpapers/desktop/1280x720/019.jpg diff --git a/wallpapers/desktop/1280x720/020.jpg b/public/wallpapers/desktop/1280x720/020.jpg similarity index 100% rename from wallpapers/desktop/1280x720/020.jpg rename to public/wallpapers/desktop/1280x720/020.jpg diff --git a/wallpapers/desktop/1280x720/021.jpg b/public/wallpapers/desktop/1280x720/021.jpg similarity index 100% rename from wallpapers/desktop/1280x720/021.jpg rename to public/wallpapers/desktop/1280x720/021.jpg diff --git a/wallpapers/desktop/1280x720/022.jpg b/public/wallpapers/desktop/1280x720/022.jpg similarity index 100% rename from wallpapers/desktop/1280x720/022.jpg rename to public/wallpapers/desktop/1280x720/022.jpg diff --git a/wallpapers/desktop/1280x720/023.jpg b/public/wallpapers/desktop/1280x720/023.jpg similarity index 100% rename from wallpapers/desktop/1280x720/023.jpg rename to public/wallpapers/desktop/1280x720/023.jpg diff --git a/wallpapers/desktop/1280x720/024.jpg b/public/wallpapers/desktop/1280x720/024.jpg similarity index 100% rename from wallpapers/desktop/1280x720/024.jpg rename to public/wallpapers/desktop/1280x720/024.jpg diff --git a/wallpapers/desktop/1920x1080/000.jpg b/public/wallpapers/desktop/1920x1080/000.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/000.jpg rename to public/wallpapers/desktop/1920x1080/000.jpg diff --git a/wallpapers/desktop/1920x1080/001.jpg b/public/wallpapers/desktop/1920x1080/001.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/001.jpg rename to public/wallpapers/desktop/1920x1080/001.jpg diff --git a/wallpapers/desktop/1920x1080/002.jpg b/public/wallpapers/desktop/1920x1080/002.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/002.jpg rename to public/wallpapers/desktop/1920x1080/002.jpg diff --git a/wallpapers/desktop/1920x1080/003.jpg b/public/wallpapers/desktop/1920x1080/003.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/003.jpg rename to public/wallpapers/desktop/1920x1080/003.jpg diff --git a/wallpapers/desktop/1920x1080/004.jpg b/public/wallpapers/desktop/1920x1080/004.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/004.jpg rename to public/wallpapers/desktop/1920x1080/004.jpg diff --git a/wallpapers/desktop/1920x1080/005.jpg b/public/wallpapers/desktop/1920x1080/005.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/005.jpg rename to public/wallpapers/desktop/1920x1080/005.jpg diff --git a/wallpapers/desktop/1920x1080/006.jpg b/public/wallpapers/desktop/1920x1080/006.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/006.jpg rename to public/wallpapers/desktop/1920x1080/006.jpg diff --git a/wallpapers/desktop/1920x1080/007.jpg b/public/wallpapers/desktop/1920x1080/007.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/007.jpg rename to public/wallpapers/desktop/1920x1080/007.jpg diff --git a/wallpapers/desktop/1920x1080/008.jpg b/public/wallpapers/desktop/1920x1080/008.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/008.jpg rename to public/wallpapers/desktop/1920x1080/008.jpg diff --git a/wallpapers/desktop/1920x1080/009.jpg b/public/wallpapers/desktop/1920x1080/009.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/009.jpg rename to public/wallpapers/desktop/1920x1080/009.jpg diff --git a/wallpapers/desktop/1920x1080/010.jpg b/public/wallpapers/desktop/1920x1080/010.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/010.jpg rename to public/wallpapers/desktop/1920x1080/010.jpg diff --git a/wallpapers/desktop/1920x1080/011.jpg b/public/wallpapers/desktop/1920x1080/011.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/011.jpg rename to public/wallpapers/desktop/1920x1080/011.jpg diff --git a/wallpapers/desktop/1920x1080/012.jpg b/public/wallpapers/desktop/1920x1080/012.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/012.jpg rename to public/wallpapers/desktop/1920x1080/012.jpg diff --git a/wallpapers/desktop/1920x1080/013.jpg b/public/wallpapers/desktop/1920x1080/013.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/013.jpg rename to public/wallpapers/desktop/1920x1080/013.jpg diff --git a/wallpapers/desktop/1920x1080/014.jpg b/public/wallpapers/desktop/1920x1080/014.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/014.jpg rename to public/wallpapers/desktop/1920x1080/014.jpg diff --git a/wallpapers/desktop/1920x1080/015.jpg b/public/wallpapers/desktop/1920x1080/015.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/015.jpg rename to public/wallpapers/desktop/1920x1080/015.jpg diff --git a/wallpapers/desktop/1920x1080/016.jpg b/public/wallpapers/desktop/1920x1080/016.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/016.jpg rename to public/wallpapers/desktop/1920x1080/016.jpg diff --git a/wallpapers/desktop/1920x1080/017.jpg b/public/wallpapers/desktop/1920x1080/017.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/017.jpg rename to public/wallpapers/desktop/1920x1080/017.jpg diff --git a/wallpapers/desktop/1920x1080/018.jpg b/public/wallpapers/desktop/1920x1080/018.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/018.jpg rename to public/wallpapers/desktop/1920x1080/018.jpg diff --git a/wallpapers/desktop/1920x1080/019.jpg b/public/wallpapers/desktop/1920x1080/019.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/019.jpg rename to public/wallpapers/desktop/1920x1080/019.jpg diff --git a/wallpapers/desktop/1920x1080/020.jpg b/public/wallpapers/desktop/1920x1080/020.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/020.jpg rename to public/wallpapers/desktop/1920x1080/020.jpg diff --git a/wallpapers/desktop/1920x1080/021.jpg b/public/wallpapers/desktop/1920x1080/021.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/021.jpg rename to public/wallpapers/desktop/1920x1080/021.jpg diff --git a/wallpapers/desktop/1920x1080/022.jpg b/public/wallpapers/desktop/1920x1080/022.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/022.jpg rename to public/wallpapers/desktop/1920x1080/022.jpg diff --git a/wallpapers/desktop/1920x1080/023.jpg b/public/wallpapers/desktop/1920x1080/023.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/023.jpg rename to public/wallpapers/desktop/1920x1080/023.jpg diff --git a/wallpapers/desktop/1920x1080/024.jpg b/public/wallpapers/desktop/1920x1080/024.jpg similarity index 100% rename from wallpapers/desktop/1920x1080/024.jpg rename to public/wallpapers/desktop/1920x1080/024.jpg diff --git a/wallpapers/desktop/3440x1400/000.jpg b/public/wallpapers/desktop/3440x1400/000.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/000.jpg rename to public/wallpapers/desktop/3440x1400/000.jpg diff --git a/wallpapers/desktop/3440x1400/001.jpg b/public/wallpapers/desktop/3440x1400/001.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/001.jpg rename to public/wallpapers/desktop/3440x1400/001.jpg diff --git a/wallpapers/desktop/3440x1400/002.jpg b/public/wallpapers/desktop/3440x1400/002.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/002.jpg rename to public/wallpapers/desktop/3440x1400/002.jpg diff --git a/wallpapers/desktop/3440x1400/003.jpg b/public/wallpapers/desktop/3440x1400/003.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/003.jpg rename to public/wallpapers/desktop/3440x1400/003.jpg diff --git a/wallpapers/desktop/3440x1400/004.jpg b/public/wallpapers/desktop/3440x1400/004.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/004.jpg rename to public/wallpapers/desktop/3440x1400/004.jpg diff --git a/wallpapers/desktop/3440x1400/005.jpg b/public/wallpapers/desktop/3440x1400/005.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/005.jpg rename to public/wallpapers/desktop/3440x1400/005.jpg diff --git a/wallpapers/desktop/3440x1400/006.jpg b/public/wallpapers/desktop/3440x1400/006.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/006.jpg rename to public/wallpapers/desktop/3440x1400/006.jpg diff --git a/wallpapers/desktop/3440x1400/007.jpg b/public/wallpapers/desktop/3440x1400/007.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/007.jpg rename to public/wallpapers/desktop/3440x1400/007.jpg diff --git a/wallpapers/desktop/3440x1400/008.jpg b/public/wallpapers/desktop/3440x1400/008.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/008.jpg rename to public/wallpapers/desktop/3440x1400/008.jpg diff --git a/wallpapers/desktop/3440x1400/009.jpg b/public/wallpapers/desktop/3440x1400/009.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/009.jpg rename to public/wallpapers/desktop/3440x1400/009.jpg diff --git a/wallpapers/desktop/3440x1400/010.jpg b/public/wallpapers/desktop/3440x1400/010.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/010.jpg rename to public/wallpapers/desktop/3440x1400/010.jpg diff --git a/wallpapers/desktop/3440x1400/011.jpg b/public/wallpapers/desktop/3440x1400/011.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/011.jpg rename to public/wallpapers/desktop/3440x1400/011.jpg diff --git a/wallpapers/desktop/3440x1400/012.jpg b/public/wallpapers/desktop/3440x1400/012.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/012.jpg rename to public/wallpapers/desktop/3440x1400/012.jpg diff --git a/wallpapers/desktop/3440x1400/013.jpg b/public/wallpapers/desktop/3440x1400/013.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/013.jpg rename to public/wallpapers/desktop/3440x1400/013.jpg diff --git a/wallpapers/desktop/3440x1400/014.jpg b/public/wallpapers/desktop/3440x1400/014.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/014.jpg rename to public/wallpapers/desktop/3440x1400/014.jpg diff --git a/wallpapers/desktop/3440x1400/015.jpg b/public/wallpapers/desktop/3440x1400/015.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/015.jpg rename to public/wallpapers/desktop/3440x1400/015.jpg diff --git a/wallpapers/desktop/3440x1400/016.jpg b/public/wallpapers/desktop/3440x1400/016.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/016.jpg rename to public/wallpapers/desktop/3440x1400/016.jpg diff --git a/wallpapers/desktop/3440x1400/017.jpg b/public/wallpapers/desktop/3440x1400/017.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/017.jpg rename to public/wallpapers/desktop/3440x1400/017.jpg diff --git a/wallpapers/desktop/3440x1400/018.jpg b/public/wallpapers/desktop/3440x1400/018.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/018.jpg rename to public/wallpapers/desktop/3440x1400/018.jpg diff --git a/wallpapers/desktop/3440x1400/019.jpg b/public/wallpapers/desktop/3440x1400/019.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/019.jpg rename to public/wallpapers/desktop/3440x1400/019.jpg diff --git a/wallpapers/desktop/3440x1400/020.jpg b/public/wallpapers/desktop/3440x1400/020.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/020.jpg rename to public/wallpapers/desktop/3440x1400/020.jpg diff --git a/wallpapers/desktop/3440x1400/021.jpg b/public/wallpapers/desktop/3440x1400/021.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/021.jpg rename to public/wallpapers/desktop/3440x1400/021.jpg diff --git a/wallpapers/desktop/3440x1400/022.jpg b/public/wallpapers/desktop/3440x1400/022.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/022.jpg rename to public/wallpapers/desktop/3440x1400/022.jpg diff --git a/wallpapers/desktop/3440x1400/023.jpg b/public/wallpapers/desktop/3440x1400/023.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/023.jpg rename to public/wallpapers/desktop/3440x1400/023.jpg diff --git a/wallpapers/desktop/3440x1400/024.jpg b/public/wallpapers/desktop/3440x1400/024.jpg similarity index 100% rename from wallpapers/desktop/3440x1400/024.jpg rename to public/wallpapers/desktop/3440x1400/024.jpg diff --git a/wallpapers/desktop/3840x2160/000.jpg b/public/wallpapers/desktop/3840x2160/000.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/000.jpg rename to public/wallpapers/desktop/3840x2160/000.jpg diff --git a/wallpapers/desktop/3840x2160/001.jpg b/public/wallpapers/desktop/3840x2160/001.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/001.jpg rename to public/wallpapers/desktop/3840x2160/001.jpg diff --git a/wallpapers/desktop/3840x2160/002.jpg b/public/wallpapers/desktop/3840x2160/002.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/002.jpg rename to public/wallpapers/desktop/3840x2160/002.jpg diff --git a/wallpapers/desktop/3840x2160/003.jpg b/public/wallpapers/desktop/3840x2160/003.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/003.jpg rename to public/wallpapers/desktop/3840x2160/003.jpg diff --git a/wallpapers/desktop/3840x2160/004.jpg b/public/wallpapers/desktop/3840x2160/004.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/004.jpg rename to public/wallpapers/desktop/3840x2160/004.jpg diff --git a/wallpapers/desktop/3840x2160/005.jpg b/public/wallpapers/desktop/3840x2160/005.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/005.jpg rename to public/wallpapers/desktop/3840x2160/005.jpg diff --git a/wallpapers/desktop/3840x2160/006.jpg b/public/wallpapers/desktop/3840x2160/006.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/006.jpg rename to public/wallpapers/desktop/3840x2160/006.jpg diff --git a/wallpapers/desktop/3840x2160/007.jpg b/public/wallpapers/desktop/3840x2160/007.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/007.jpg rename to public/wallpapers/desktop/3840x2160/007.jpg diff --git a/wallpapers/desktop/3840x2160/008.jpg b/public/wallpapers/desktop/3840x2160/008.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/008.jpg rename to public/wallpapers/desktop/3840x2160/008.jpg diff --git a/wallpapers/desktop/3840x2160/009.jpg b/public/wallpapers/desktop/3840x2160/009.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/009.jpg rename to public/wallpapers/desktop/3840x2160/009.jpg diff --git a/wallpapers/desktop/3840x2160/010.jpg b/public/wallpapers/desktop/3840x2160/010.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/010.jpg rename to public/wallpapers/desktop/3840x2160/010.jpg diff --git a/wallpapers/desktop/3840x2160/011.jpg b/public/wallpapers/desktop/3840x2160/011.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/011.jpg rename to public/wallpapers/desktop/3840x2160/011.jpg diff --git a/wallpapers/desktop/3840x2160/012.jpg b/public/wallpapers/desktop/3840x2160/012.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/012.jpg rename to public/wallpapers/desktop/3840x2160/012.jpg diff --git a/wallpapers/desktop/3840x2160/013.jpg b/public/wallpapers/desktop/3840x2160/013.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/013.jpg rename to public/wallpapers/desktop/3840x2160/013.jpg diff --git a/wallpapers/desktop/3840x2160/014.jpg b/public/wallpapers/desktop/3840x2160/014.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/014.jpg rename to public/wallpapers/desktop/3840x2160/014.jpg diff --git a/wallpapers/desktop/3840x2160/015.jpg b/public/wallpapers/desktop/3840x2160/015.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/015.jpg rename to public/wallpapers/desktop/3840x2160/015.jpg diff --git a/wallpapers/desktop/3840x2160/016.jpg b/public/wallpapers/desktop/3840x2160/016.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/016.jpg rename to public/wallpapers/desktop/3840x2160/016.jpg diff --git a/wallpapers/desktop/3840x2160/017.jpg b/public/wallpapers/desktop/3840x2160/017.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/017.jpg rename to public/wallpapers/desktop/3840x2160/017.jpg diff --git a/wallpapers/desktop/3840x2160/018.jpg b/public/wallpapers/desktop/3840x2160/018.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/018.jpg rename to public/wallpapers/desktop/3840x2160/018.jpg diff --git a/wallpapers/desktop/3840x2160/019.jpg b/public/wallpapers/desktop/3840x2160/019.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/019.jpg rename to public/wallpapers/desktop/3840x2160/019.jpg diff --git a/wallpapers/desktop/3840x2160/020.jpg b/public/wallpapers/desktop/3840x2160/020.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/020.jpg rename to public/wallpapers/desktop/3840x2160/020.jpg diff --git a/wallpapers/desktop/3840x2160/021.jpg b/public/wallpapers/desktop/3840x2160/021.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/021.jpg rename to public/wallpapers/desktop/3840x2160/021.jpg diff --git a/wallpapers/desktop/3840x2160/022.jpg b/public/wallpapers/desktop/3840x2160/022.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/022.jpg rename to public/wallpapers/desktop/3840x2160/022.jpg diff --git a/wallpapers/desktop/3840x2160/023.jpg b/public/wallpapers/desktop/3840x2160/023.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/023.jpg rename to public/wallpapers/desktop/3840x2160/023.jpg diff --git a/wallpapers/desktop/3840x2160/024.jpg b/public/wallpapers/desktop/3840x2160/024.jpg similarity index 100% rename from wallpapers/desktop/3840x2160/024.jpg rename to public/wallpapers/desktop/3840x2160/024.jpg diff --git a/wallpapers/desktop/thumbnails/000.jpg b/public/wallpapers/desktop/thumbnails/000.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/000.jpg rename to public/wallpapers/desktop/thumbnails/000.jpg diff --git a/wallpapers/desktop/thumbnails/001.jpg b/public/wallpapers/desktop/thumbnails/001.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/001.jpg rename to public/wallpapers/desktop/thumbnails/001.jpg diff --git a/wallpapers/desktop/thumbnails/002.jpg b/public/wallpapers/desktop/thumbnails/002.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/002.jpg rename to public/wallpapers/desktop/thumbnails/002.jpg diff --git a/wallpapers/desktop/thumbnails/003.jpg b/public/wallpapers/desktop/thumbnails/003.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/003.jpg rename to public/wallpapers/desktop/thumbnails/003.jpg diff --git a/wallpapers/desktop/thumbnails/004.jpg b/public/wallpapers/desktop/thumbnails/004.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/004.jpg rename to public/wallpapers/desktop/thumbnails/004.jpg diff --git a/wallpapers/desktop/thumbnails/005.jpg b/public/wallpapers/desktop/thumbnails/005.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/005.jpg rename to public/wallpapers/desktop/thumbnails/005.jpg diff --git a/wallpapers/desktop/thumbnails/006.jpg b/public/wallpapers/desktop/thumbnails/006.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/006.jpg rename to public/wallpapers/desktop/thumbnails/006.jpg diff --git a/wallpapers/desktop/thumbnails/007.jpg b/public/wallpapers/desktop/thumbnails/007.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/007.jpg rename to public/wallpapers/desktop/thumbnails/007.jpg diff --git a/wallpapers/desktop/thumbnails/008.jpg b/public/wallpapers/desktop/thumbnails/008.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/008.jpg rename to public/wallpapers/desktop/thumbnails/008.jpg diff --git a/wallpapers/desktop/thumbnails/009.jpg b/public/wallpapers/desktop/thumbnails/009.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/009.jpg rename to public/wallpapers/desktop/thumbnails/009.jpg diff --git a/wallpapers/desktop/thumbnails/010.jpg b/public/wallpapers/desktop/thumbnails/010.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/010.jpg rename to public/wallpapers/desktop/thumbnails/010.jpg diff --git a/wallpapers/desktop/thumbnails/011.jpg b/public/wallpapers/desktop/thumbnails/011.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/011.jpg rename to public/wallpapers/desktop/thumbnails/011.jpg diff --git a/wallpapers/desktop/thumbnails/012.jpg b/public/wallpapers/desktop/thumbnails/012.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/012.jpg rename to public/wallpapers/desktop/thumbnails/012.jpg diff --git a/wallpapers/desktop/thumbnails/013.jpg b/public/wallpapers/desktop/thumbnails/013.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/013.jpg rename to public/wallpapers/desktop/thumbnails/013.jpg diff --git a/wallpapers/desktop/thumbnails/014.jpg b/public/wallpapers/desktop/thumbnails/014.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/014.jpg rename to public/wallpapers/desktop/thumbnails/014.jpg diff --git a/wallpapers/desktop/thumbnails/015.jpg b/public/wallpapers/desktop/thumbnails/015.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/015.jpg rename to public/wallpapers/desktop/thumbnails/015.jpg diff --git a/wallpapers/desktop/thumbnails/016.jpg b/public/wallpapers/desktop/thumbnails/016.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/016.jpg rename to public/wallpapers/desktop/thumbnails/016.jpg diff --git a/wallpapers/desktop/thumbnails/017.jpg b/public/wallpapers/desktop/thumbnails/017.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/017.jpg rename to public/wallpapers/desktop/thumbnails/017.jpg diff --git a/wallpapers/desktop/thumbnails/018.jpg b/public/wallpapers/desktop/thumbnails/018.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/018.jpg rename to public/wallpapers/desktop/thumbnails/018.jpg diff --git a/wallpapers/desktop/thumbnails/019.jpg b/public/wallpapers/desktop/thumbnails/019.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/019.jpg rename to public/wallpapers/desktop/thumbnails/019.jpg diff --git a/wallpapers/desktop/thumbnails/020.jpg b/public/wallpapers/desktop/thumbnails/020.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/020.jpg rename to public/wallpapers/desktop/thumbnails/020.jpg diff --git a/wallpapers/desktop/thumbnails/021.jpg b/public/wallpapers/desktop/thumbnails/021.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/021.jpg rename to public/wallpapers/desktop/thumbnails/021.jpg diff --git a/wallpapers/desktop/thumbnails/022.jpg b/public/wallpapers/desktop/thumbnails/022.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/022.jpg rename to public/wallpapers/desktop/thumbnails/022.jpg diff --git a/wallpapers/desktop/thumbnails/023.jpg b/public/wallpapers/desktop/thumbnails/023.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/023.jpg rename to public/wallpapers/desktop/thumbnails/023.jpg diff --git a/wallpapers/desktop/thumbnails/024.jpg b/public/wallpapers/desktop/thumbnails/024.jpg similarity index 100% rename from wallpapers/desktop/thumbnails/024.jpg rename to public/wallpapers/desktop/thumbnails/024.jpg diff --git a/wallpapers/phone/320x568/000.jpg b/public/wallpapers/phone/320x568/000.jpg similarity index 100% rename from wallpapers/phone/320x568/000.jpg rename to public/wallpapers/phone/320x568/000.jpg diff --git a/wallpapers/phone/320x568/001.jpg b/public/wallpapers/phone/320x568/001.jpg similarity index 100% rename from wallpapers/phone/320x568/001.jpg rename to public/wallpapers/phone/320x568/001.jpg diff --git a/wallpapers/phone/320x568/002.jpg b/public/wallpapers/phone/320x568/002.jpg similarity index 100% rename from wallpapers/phone/320x568/002.jpg rename to public/wallpapers/phone/320x568/002.jpg diff --git a/wallpapers/phone/320x568/003.jpg b/public/wallpapers/phone/320x568/003.jpg similarity index 100% rename from wallpapers/phone/320x568/003.jpg rename to public/wallpapers/phone/320x568/003.jpg diff --git a/wallpapers/phone/320x568/004.jpg b/public/wallpapers/phone/320x568/004.jpg similarity index 100% rename from wallpapers/phone/320x568/004.jpg rename to public/wallpapers/phone/320x568/004.jpg diff --git a/wallpapers/phone/320x568/005.jpg b/public/wallpapers/phone/320x568/005.jpg similarity index 100% rename from wallpapers/phone/320x568/005.jpg rename to public/wallpapers/phone/320x568/005.jpg diff --git a/wallpapers/phone/320x568/006.jpg b/public/wallpapers/phone/320x568/006.jpg similarity index 100% rename from wallpapers/phone/320x568/006.jpg rename to public/wallpapers/phone/320x568/006.jpg diff --git a/wallpapers/phone/320x568/007.jpg b/public/wallpapers/phone/320x568/007.jpg similarity index 100% rename from wallpapers/phone/320x568/007.jpg rename to public/wallpapers/phone/320x568/007.jpg diff --git a/wallpapers/phone/320x568/008.jpg b/public/wallpapers/phone/320x568/008.jpg similarity index 100% rename from wallpapers/phone/320x568/008.jpg rename to public/wallpapers/phone/320x568/008.jpg diff --git a/wallpapers/phone/320x568/009.jpg b/public/wallpapers/phone/320x568/009.jpg similarity index 100% rename from wallpapers/phone/320x568/009.jpg rename to public/wallpapers/phone/320x568/009.jpg diff --git a/wallpapers/phone/320x568/010.jpg b/public/wallpapers/phone/320x568/010.jpg similarity index 100% rename from wallpapers/phone/320x568/010.jpg rename to public/wallpapers/phone/320x568/010.jpg diff --git a/wallpapers/phone/320x568/011.jpg b/public/wallpapers/phone/320x568/011.jpg similarity index 100% rename from wallpapers/phone/320x568/011.jpg rename to public/wallpapers/phone/320x568/011.jpg diff --git a/wallpapers/phone/320x568/012.jpg b/public/wallpapers/phone/320x568/012.jpg similarity index 100% rename from wallpapers/phone/320x568/012.jpg rename to public/wallpapers/phone/320x568/012.jpg diff --git a/wallpapers/phone/320x568/013.jpg b/public/wallpapers/phone/320x568/013.jpg similarity index 100% rename from wallpapers/phone/320x568/013.jpg rename to public/wallpapers/phone/320x568/013.jpg diff --git a/wallpapers/phone/320x568/014.jpg b/public/wallpapers/phone/320x568/014.jpg similarity index 100% rename from wallpapers/phone/320x568/014.jpg rename to public/wallpapers/phone/320x568/014.jpg diff --git a/wallpapers/phone/320x568/015.jpg b/public/wallpapers/phone/320x568/015.jpg similarity index 100% rename from wallpapers/phone/320x568/015.jpg rename to public/wallpapers/phone/320x568/015.jpg diff --git a/wallpapers/phone/320x568/016.jpg b/public/wallpapers/phone/320x568/016.jpg similarity index 100% rename from wallpapers/phone/320x568/016.jpg rename to public/wallpapers/phone/320x568/016.jpg diff --git a/wallpapers/phone/320x568/017.jpg b/public/wallpapers/phone/320x568/017.jpg similarity index 100% rename from wallpapers/phone/320x568/017.jpg rename to public/wallpapers/phone/320x568/017.jpg diff --git a/wallpapers/phone/320x568/018.jpg b/public/wallpapers/phone/320x568/018.jpg similarity index 100% rename from wallpapers/phone/320x568/018.jpg rename to public/wallpapers/phone/320x568/018.jpg diff --git a/wallpapers/phone/320x568/019.jpg b/public/wallpapers/phone/320x568/019.jpg similarity index 100% rename from wallpapers/phone/320x568/019.jpg rename to public/wallpapers/phone/320x568/019.jpg diff --git a/wallpapers/phone/320x568/020.jpg b/public/wallpapers/phone/320x568/020.jpg similarity index 100% rename from wallpapers/phone/320x568/020.jpg rename to public/wallpapers/phone/320x568/020.jpg diff --git a/wallpapers/phone/320x568/021.jpg b/public/wallpapers/phone/320x568/021.jpg similarity index 100% rename from wallpapers/phone/320x568/021.jpg rename to public/wallpapers/phone/320x568/021.jpg diff --git a/wallpapers/phone/320x568/022.jpg b/public/wallpapers/phone/320x568/022.jpg similarity index 100% rename from wallpapers/phone/320x568/022.jpg rename to public/wallpapers/phone/320x568/022.jpg diff --git a/wallpapers/phone/320x568/023.jpg b/public/wallpapers/phone/320x568/023.jpg similarity index 100% rename from wallpapers/phone/320x568/023.jpg rename to public/wallpapers/phone/320x568/023.jpg diff --git a/wallpapers/phone/320x568/024.jpg b/public/wallpapers/phone/320x568/024.jpg similarity index 100% rename from wallpapers/phone/320x568/024.jpg rename to public/wallpapers/phone/320x568/024.jpg diff --git a/wallpapers/phone/360x640/000.jpg b/public/wallpapers/phone/360x640/000.jpg similarity index 100% rename from wallpapers/phone/360x640/000.jpg rename to public/wallpapers/phone/360x640/000.jpg diff --git a/wallpapers/phone/360x640/001.jpg b/public/wallpapers/phone/360x640/001.jpg similarity index 100% rename from wallpapers/phone/360x640/001.jpg rename to public/wallpapers/phone/360x640/001.jpg diff --git a/wallpapers/phone/360x640/002.jpg b/public/wallpapers/phone/360x640/002.jpg similarity index 100% rename from wallpapers/phone/360x640/002.jpg rename to public/wallpapers/phone/360x640/002.jpg diff --git a/wallpapers/phone/360x640/003.jpg b/public/wallpapers/phone/360x640/003.jpg similarity index 100% rename from wallpapers/phone/360x640/003.jpg rename to public/wallpapers/phone/360x640/003.jpg diff --git a/wallpapers/phone/360x640/004.jpg b/public/wallpapers/phone/360x640/004.jpg similarity index 100% rename from wallpapers/phone/360x640/004.jpg rename to public/wallpapers/phone/360x640/004.jpg diff --git a/wallpapers/phone/360x640/005.jpg b/public/wallpapers/phone/360x640/005.jpg similarity index 100% rename from wallpapers/phone/360x640/005.jpg rename to public/wallpapers/phone/360x640/005.jpg diff --git a/wallpapers/phone/360x640/006.jpg b/public/wallpapers/phone/360x640/006.jpg similarity index 100% rename from wallpapers/phone/360x640/006.jpg rename to public/wallpapers/phone/360x640/006.jpg diff --git a/wallpapers/phone/360x640/007.jpg b/public/wallpapers/phone/360x640/007.jpg similarity index 100% rename from wallpapers/phone/360x640/007.jpg rename to public/wallpapers/phone/360x640/007.jpg diff --git a/wallpapers/phone/360x640/008.jpg b/public/wallpapers/phone/360x640/008.jpg similarity index 100% rename from wallpapers/phone/360x640/008.jpg rename to public/wallpapers/phone/360x640/008.jpg diff --git a/wallpapers/phone/360x640/009.jpg b/public/wallpapers/phone/360x640/009.jpg similarity index 100% rename from wallpapers/phone/360x640/009.jpg rename to public/wallpapers/phone/360x640/009.jpg diff --git a/wallpapers/phone/360x640/010.jpg b/public/wallpapers/phone/360x640/010.jpg similarity index 100% rename from wallpapers/phone/360x640/010.jpg rename to public/wallpapers/phone/360x640/010.jpg diff --git a/wallpapers/phone/360x640/011.jpg b/public/wallpapers/phone/360x640/011.jpg similarity index 100% rename from wallpapers/phone/360x640/011.jpg rename to public/wallpapers/phone/360x640/011.jpg diff --git a/wallpapers/phone/360x640/012.jpg b/public/wallpapers/phone/360x640/012.jpg similarity index 100% rename from wallpapers/phone/360x640/012.jpg rename to public/wallpapers/phone/360x640/012.jpg diff --git a/wallpapers/phone/360x640/013.jpg b/public/wallpapers/phone/360x640/013.jpg similarity index 100% rename from wallpapers/phone/360x640/013.jpg rename to public/wallpapers/phone/360x640/013.jpg diff --git a/wallpapers/phone/360x640/014.jpg b/public/wallpapers/phone/360x640/014.jpg similarity index 100% rename from wallpapers/phone/360x640/014.jpg rename to public/wallpapers/phone/360x640/014.jpg diff --git a/wallpapers/phone/360x640/015.jpg b/public/wallpapers/phone/360x640/015.jpg similarity index 100% rename from wallpapers/phone/360x640/015.jpg rename to public/wallpapers/phone/360x640/015.jpg diff --git a/wallpapers/phone/360x640/016.jpg b/public/wallpapers/phone/360x640/016.jpg similarity index 100% rename from wallpapers/phone/360x640/016.jpg rename to public/wallpapers/phone/360x640/016.jpg diff --git a/wallpapers/phone/360x640/017.jpg b/public/wallpapers/phone/360x640/017.jpg similarity index 100% rename from wallpapers/phone/360x640/017.jpg rename to public/wallpapers/phone/360x640/017.jpg diff --git a/wallpapers/phone/360x640/018.jpg b/public/wallpapers/phone/360x640/018.jpg similarity index 100% rename from wallpapers/phone/360x640/018.jpg rename to public/wallpapers/phone/360x640/018.jpg diff --git a/wallpapers/phone/360x640/019.jpg b/public/wallpapers/phone/360x640/019.jpg similarity index 100% rename from wallpapers/phone/360x640/019.jpg rename to public/wallpapers/phone/360x640/019.jpg diff --git a/wallpapers/phone/360x640/020.jpg b/public/wallpapers/phone/360x640/020.jpg similarity index 100% rename from wallpapers/phone/360x640/020.jpg rename to public/wallpapers/phone/360x640/020.jpg diff --git a/wallpapers/phone/360x640/021.jpg b/public/wallpapers/phone/360x640/021.jpg similarity index 100% rename from wallpapers/phone/360x640/021.jpg rename to public/wallpapers/phone/360x640/021.jpg diff --git a/wallpapers/phone/360x640/022.jpg b/public/wallpapers/phone/360x640/022.jpg similarity index 100% rename from wallpapers/phone/360x640/022.jpg rename to public/wallpapers/phone/360x640/022.jpg diff --git a/wallpapers/phone/360x640/023.jpg b/public/wallpapers/phone/360x640/023.jpg similarity index 100% rename from wallpapers/phone/360x640/023.jpg rename to public/wallpapers/phone/360x640/023.jpg diff --git a/wallpapers/phone/360x640/024.jpg b/public/wallpapers/phone/360x640/024.jpg similarity index 100% rename from wallpapers/phone/360x640/024.jpg rename to public/wallpapers/phone/360x640/024.jpg diff --git a/wallpapers/phone/360x800/000.jpg b/public/wallpapers/phone/360x800/000.jpg similarity index 100% rename from wallpapers/phone/360x800/000.jpg rename to public/wallpapers/phone/360x800/000.jpg diff --git a/wallpapers/phone/360x800/001.jpg b/public/wallpapers/phone/360x800/001.jpg similarity index 100% rename from wallpapers/phone/360x800/001.jpg rename to public/wallpapers/phone/360x800/001.jpg diff --git a/wallpapers/phone/360x800/002.jpg b/public/wallpapers/phone/360x800/002.jpg similarity index 100% rename from wallpapers/phone/360x800/002.jpg rename to public/wallpapers/phone/360x800/002.jpg diff --git a/wallpapers/phone/360x800/003.jpg b/public/wallpapers/phone/360x800/003.jpg similarity index 100% rename from wallpapers/phone/360x800/003.jpg rename to public/wallpapers/phone/360x800/003.jpg diff --git a/wallpapers/phone/360x800/004.jpg b/public/wallpapers/phone/360x800/004.jpg similarity index 100% rename from wallpapers/phone/360x800/004.jpg rename to public/wallpapers/phone/360x800/004.jpg diff --git a/wallpapers/phone/360x800/005.jpg b/public/wallpapers/phone/360x800/005.jpg similarity index 100% rename from wallpapers/phone/360x800/005.jpg rename to public/wallpapers/phone/360x800/005.jpg diff --git a/wallpapers/phone/360x800/006.jpg b/public/wallpapers/phone/360x800/006.jpg similarity index 100% rename from wallpapers/phone/360x800/006.jpg rename to public/wallpapers/phone/360x800/006.jpg diff --git a/wallpapers/phone/360x800/007.jpg b/public/wallpapers/phone/360x800/007.jpg similarity index 100% rename from wallpapers/phone/360x800/007.jpg rename to public/wallpapers/phone/360x800/007.jpg diff --git a/wallpapers/phone/360x800/008.jpg b/public/wallpapers/phone/360x800/008.jpg similarity index 100% rename from wallpapers/phone/360x800/008.jpg rename to public/wallpapers/phone/360x800/008.jpg diff --git a/wallpapers/phone/360x800/009.jpg b/public/wallpapers/phone/360x800/009.jpg similarity index 100% rename from wallpapers/phone/360x800/009.jpg rename to public/wallpapers/phone/360x800/009.jpg diff --git a/wallpapers/phone/360x800/010.jpg b/public/wallpapers/phone/360x800/010.jpg similarity index 100% rename from wallpapers/phone/360x800/010.jpg rename to public/wallpapers/phone/360x800/010.jpg diff --git a/wallpapers/phone/360x800/011.jpg b/public/wallpapers/phone/360x800/011.jpg similarity index 100% rename from wallpapers/phone/360x800/011.jpg rename to public/wallpapers/phone/360x800/011.jpg diff --git a/wallpapers/phone/360x800/012.jpg b/public/wallpapers/phone/360x800/012.jpg similarity index 100% rename from wallpapers/phone/360x800/012.jpg rename to public/wallpapers/phone/360x800/012.jpg diff --git a/wallpapers/phone/360x800/013.jpg b/public/wallpapers/phone/360x800/013.jpg similarity index 100% rename from wallpapers/phone/360x800/013.jpg rename to public/wallpapers/phone/360x800/013.jpg diff --git a/wallpapers/phone/360x800/014.jpg b/public/wallpapers/phone/360x800/014.jpg similarity index 100% rename from wallpapers/phone/360x800/014.jpg rename to public/wallpapers/phone/360x800/014.jpg diff --git a/wallpapers/phone/360x800/015.jpg b/public/wallpapers/phone/360x800/015.jpg similarity index 100% rename from wallpapers/phone/360x800/015.jpg rename to public/wallpapers/phone/360x800/015.jpg diff --git a/wallpapers/phone/360x800/016.jpg b/public/wallpapers/phone/360x800/016.jpg similarity index 100% rename from wallpapers/phone/360x800/016.jpg rename to public/wallpapers/phone/360x800/016.jpg diff --git a/wallpapers/phone/360x800/017.jpg b/public/wallpapers/phone/360x800/017.jpg similarity index 100% rename from wallpapers/phone/360x800/017.jpg rename to public/wallpapers/phone/360x800/017.jpg diff --git a/wallpapers/phone/360x800/018.jpg b/public/wallpapers/phone/360x800/018.jpg similarity index 100% rename from wallpapers/phone/360x800/018.jpg rename to public/wallpapers/phone/360x800/018.jpg diff --git a/wallpapers/phone/360x800/019.jpg b/public/wallpapers/phone/360x800/019.jpg similarity index 100% rename from wallpapers/phone/360x800/019.jpg rename to public/wallpapers/phone/360x800/019.jpg diff --git a/wallpapers/phone/360x800/020.jpg b/public/wallpapers/phone/360x800/020.jpg similarity index 100% rename from wallpapers/phone/360x800/020.jpg rename to public/wallpapers/phone/360x800/020.jpg diff --git a/wallpapers/phone/360x800/021.jpg b/public/wallpapers/phone/360x800/021.jpg similarity index 100% rename from wallpapers/phone/360x800/021.jpg rename to public/wallpapers/phone/360x800/021.jpg diff --git a/wallpapers/phone/360x800/022.jpg b/public/wallpapers/phone/360x800/022.jpg similarity index 100% rename from wallpapers/phone/360x800/022.jpg rename to public/wallpapers/phone/360x800/022.jpg diff --git a/wallpapers/phone/360x800/023.jpg b/public/wallpapers/phone/360x800/023.jpg similarity index 100% rename from wallpapers/phone/360x800/023.jpg rename to public/wallpapers/phone/360x800/023.jpg diff --git a/wallpapers/phone/360x800/024.jpg b/public/wallpapers/phone/360x800/024.jpg similarity index 100% rename from wallpapers/phone/360x800/024.jpg rename to public/wallpapers/phone/360x800/024.jpg diff --git a/wallpapers/phone/390x844/000.jpg b/public/wallpapers/phone/390x844/000.jpg similarity index 100% rename from wallpapers/phone/390x844/000.jpg rename to public/wallpapers/phone/390x844/000.jpg diff --git a/wallpapers/phone/390x844/001.jpg b/public/wallpapers/phone/390x844/001.jpg similarity index 100% rename from wallpapers/phone/390x844/001.jpg rename to public/wallpapers/phone/390x844/001.jpg diff --git a/wallpapers/phone/390x844/002.jpg b/public/wallpapers/phone/390x844/002.jpg similarity index 100% rename from wallpapers/phone/390x844/002.jpg rename to public/wallpapers/phone/390x844/002.jpg diff --git a/wallpapers/phone/390x844/003.jpg b/public/wallpapers/phone/390x844/003.jpg similarity index 100% rename from wallpapers/phone/390x844/003.jpg rename to public/wallpapers/phone/390x844/003.jpg diff --git a/wallpapers/phone/390x844/004.jpg b/public/wallpapers/phone/390x844/004.jpg similarity index 100% rename from wallpapers/phone/390x844/004.jpg rename to public/wallpapers/phone/390x844/004.jpg diff --git a/wallpapers/phone/390x844/005.jpg b/public/wallpapers/phone/390x844/005.jpg similarity index 100% rename from wallpapers/phone/390x844/005.jpg rename to public/wallpapers/phone/390x844/005.jpg diff --git a/wallpapers/phone/390x844/006.jpg b/public/wallpapers/phone/390x844/006.jpg similarity index 100% rename from wallpapers/phone/390x844/006.jpg rename to public/wallpapers/phone/390x844/006.jpg diff --git a/wallpapers/phone/390x844/007.jpg b/public/wallpapers/phone/390x844/007.jpg similarity index 100% rename from wallpapers/phone/390x844/007.jpg rename to public/wallpapers/phone/390x844/007.jpg diff --git a/wallpapers/phone/390x844/008.jpg b/public/wallpapers/phone/390x844/008.jpg similarity index 100% rename from wallpapers/phone/390x844/008.jpg rename to public/wallpapers/phone/390x844/008.jpg diff --git a/wallpapers/phone/390x844/009.jpg b/public/wallpapers/phone/390x844/009.jpg similarity index 100% rename from wallpapers/phone/390x844/009.jpg rename to public/wallpapers/phone/390x844/009.jpg diff --git a/wallpapers/phone/390x844/010.jpg b/public/wallpapers/phone/390x844/010.jpg similarity index 100% rename from wallpapers/phone/390x844/010.jpg rename to public/wallpapers/phone/390x844/010.jpg diff --git a/wallpapers/phone/390x844/011.jpg b/public/wallpapers/phone/390x844/011.jpg similarity index 100% rename from wallpapers/phone/390x844/011.jpg rename to public/wallpapers/phone/390x844/011.jpg diff --git a/wallpapers/phone/390x844/012.jpg b/public/wallpapers/phone/390x844/012.jpg similarity index 100% rename from wallpapers/phone/390x844/012.jpg rename to public/wallpapers/phone/390x844/012.jpg diff --git a/wallpapers/phone/390x844/013.jpg b/public/wallpapers/phone/390x844/013.jpg similarity index 100% rename from wallpapers/phone/390x844/013.jpg rename to public/wallpapers/phone/390x844/013.jpg diff --git a/wallpapers/phone/390x844/014.jpg b/public/wallpapers/phone/390x844/014.jpg similarity index 100% rename from wallpapers/phone/390x844/014.jpg rename to public/wallpapers/phone/390x844/014.jpg diff --git a/wallpapers/phone/390x844/015.jpg b/public/wallpapers/phone/390x844/015.jpg similarity index 100% rename from wallpapers/phone/390x844/015.jpg rename to public/wallpapers/phone/390x844/015.jpg diff --git a/wallpapers/phone/390x844/016.jpg b/public/wallpapers/phone/390x844/016.jpg similarity index 100% rename from wallpapers/phone/390x844/016.jpg rename to public/wallpapers/phone/390x844/016.jpg diff --git a/wallpapers/phone/390x844/017.jpg b/public/wallpapers/phone/390x844/017.jpg similarity index 100% rename from wallpapers/phone/390x844/017.jpg rename to public/wallpapers/phone/390x844/017.jpg diff --git a/wallpapers/phone/390x844/018.jpg b/public/wallpapers/phone/390x844/018.jpg similarity index 100% rename from wallpapers/phone/390x844/018.jpg rename to public/wallpapers/phone/390x844/018.jpg diff --git a/wallpapers/phone/390x844/019.jpg b/public/wallpapers/phone/390x844/019.jpg similarity index 100% rename from wallpapers/phone/390x844/019.jpg rename to public/wallpapers/phone/390x844/019.jpg diff --git a/wallpapers/phone/390x844/020.jpg b/public/wallpapers/phone/390x844/020.jpg similarity index 100% rename from wallpapers/phone/390x844/020.jpg rename to public/wallpapers/phone/390x844/020.jpg diff --git a/wallpapers/phone/390x844/021.jpg b/public/wallpapers/phone/390x844/021.jpg similarity index 100% rename from wallpapers/phone/390x844/021.jpg rename to public/wallpapers/phone/390x844/021.jpg diff --git a/wallpapers/phone/390x844/022.jpg b/public/wallpapers/phone/390x844/022.jpg similarity index 100% rename from wallpapers/phone/390x844/022.jpg rename to public/wallpapers/phone/390x844/022.jpg diff --git a/wallpapers/phone/390x844/023.jpg b/public/wallpapers/phone/390x844/023.jpg similarity index 100% rename from wallpapers/phone/390x844/023.jpg rename to public/wallpapers/phone/390x844/023.jpg diff --git a/wallpapers/phone/390x844/024.jpg b/public/wallpapers/phone/390x844/024.jpg similarity index 100% rename from wallpapers/phone/390x844/024.jpg rename to public/wallpapers/phone/390x844/024.jpg diff --git a/wallpapers/phone/428x926/000.jpg b/public/wallpapers/phone/428x926/000.jpg similarity index 100% rename from wallpapers/phone/428x926/000.jpg rename to public/wallpapers/phone/428x926/000.jpg diff --git a/wallpapers/phone/428x926/001.jpg b/public/wallpapers/phone/428x926/001.jpg similarity index 100% rename from wallpapers/phone/428x926/001.jpg rename to public/wallpapers/phone/428x926/001.jpg diff --git a/wallpapers/phone/428x926/002.jpg b/public/wallpapers/phone/428x926/002.jpg similarity index 100% rename from wallpapers/phone/428x926/002.jpg rename to public/wallpapers/phone/428x926/002.jpg diff --git a/wallpapers/phone/428x926/003.jpg b/public/wallpapers/phone/428x926/003.jpg similarity index 100% rename from wallpapers/phone/428x926/003.jpg rename to public/wallpapers/phone/428x926/003.jpg diff --git a/wallpapers/phone/428x926/004.jpg b/public/wallpapers/phone/428x926/004.jpg similarity index 100% rename from wallpapers/phone/428x926/004.jpg rename to public/wallpapers/phone/428x926/004.jpg diff --git a/wallpapers/phone/428x926/005.jpg b/public/wallpapers/phone/428x926/005.jpg similarity index 100% rename from wallpapers/phone/428x926/005.jpg rename to public/wallpapers/phone/428x926/005.jpg diff --git a/wallpapers/phone/428x926/006.jpg b/public/wallpapers/phone/428x926/006.jpg similarity index 100% rename from wallpapers/phone/428x926/006.jpg rename to public/wallpapers/phone/428x926/006.jpg diff --git a/wallpapers/phone/428x926/007.jpg b/public/wallpapers/phone/428x926/007.jpg similarity index 100% rename from wallpapers/phone/428x926/007.jpg rename to public/wallpapers/phone/428x926/007.jpg diff --git a/wallpapers/phone/428x926/008.jpg b/public/wallpapers/phone/428x926/008.jpg similarity index 100% rename from wallpapers/phone/428x926/008.jpg rename to public/wallpapers/phone/428x926/008.jpg diff --git a/wallpapers/phone/428x926/009.jpg b/public/wallpapers/phone/428x926/009.jpg similarity index 100% rename from wallpapers/phone/428x926/009.jpg rename to public/wallpapers/phone/428x926/009.jpg diff --git a/wallpapers/phone/428x926/010.jpg b/public/wallpapers/phone/428x926/010.jpg similarity index 100% rename from wallpapers/phone/428x926/010.jpg rename to public/wallpapers/phone/428x926/010.jpg diff --git a/wallpapers/phone/428x926/011.jpg b/public/wallpapers/phone/428x926/011.jpg similarity index 100% rename from wallpapers/phone/428x926/011.jpg rename to public/wallpapers/phone/428x926/011.jpg diff --git a/wallpapers/phone/428x926/012.jpg b/public/wallpapers/phone/428x926/012.jpg similarity index 100% rename from wallpapers/phone/428x926/012.jpg rename to public/wallpapers/phone/428x926/012.jpg diff --git a/wallpapers/phone/428x926/013.jpg b/public/wallpapers/phone/428x926/013.jpg similarity index 100% rename from wallpapers/phone/428x926/013.jpg rename to public/wallpapers/phone/428x926/013.jpg diff --git a/wallpapers/phone/428x926/014.jpg b/public/wallpapers/phone/428x926/014.jpg similarity index 100% rename from wallpapers/phone/428x926/014.jpg rename to public/wallpapers/phone/428x926/014.jpg diff --git a/wallpapers/phone/428x926/015.jpg b/public/wallpapers/phone/428x926/015.jpg similarity index 100% rename from wallpapers/phone/428x926/015.jpg rename to public/wallpapers/phone/428x926/015.jpg diff --git a/wallpapers/phone/428x926/016.jpg b/public/wallpapers/phone/428x926/016.jpg similarity index 100% rename from wallpapers/phone/428x926/016.jpg rename to public/wallpapers/phone/428x926/016.jpg diff --git a/wallpapers/phone/428x926/017.jpg b/public/wallpapers/phone/428x926/017.jpg similarity index 100% rename from wallpapers/phone/428x926/017.jpg rename to public/wallpapers/phone/428x926/017.jpg diff --git a/wallpapers/phone/428x926/018.jpg b/public/wallpapers/phone/428x926/018.jpg similarity index 100% rename from wallpapers/phone/428x926/018.jpg rename to public/wallpapers/phone/428x926/018.jpg diff --git a/wallpapers/phone/428x926/019.jpg b/public/wallpapers/phone/428x926/019.jpg similarity index 100% rename from wallpapers/phone/428x926/019.jpg rename to public/wallpapers/phone/428x926/019.jpg diff --git a/wallpapers/phone/428x926/020.jpg b/public/wallpapers/phone/428x926/020.jpg similarity index 100% rename from wallpapers/phone/428x926/020.jpg rename to public/wallpapers/phone/428x926/020.jpg diff --git a/wallpapers/phone/428x926/021.jpg b/public/wallpapers/phone/428x926/021.jpg similarity index 100% rename from wallpapers/phone/428x926/021.jpg rename to public/wallpapers/phone/428x926/021.jpg diff --git a/wallpapers/phone/428x926/022.jpg b/public/wallpapers/phone/428x926/022.jpg similarity index 100% rename from wallpapers/phone/428x926/022.jpg rename to public/wallpapers/phone/428x926/022.jpg diff --git a/wallpapers/phone/428x926/023.jpg b/public/wallpapers/phone/428x926/023.jpg similarity index 100% rename from wallpapers/phone/428x926/023.jpg rename to public/wallpapers/phone/428x926/023.jpg diff --git a/wallpapers/phone/428x926/024.jpg b/public/wallpapers/phone/428x926/024.jpg similarity index 100% rename from wallpapers/phone/428x926/024.jpg rename to public/wallpapers/phone/428x926/024.jpg diff --git a/wallpapers/phone/430x932/000.jpg b/public/wallpapers/phone/430x932/000.jpg similarity index 100% rename from wallpapers/phone/430x932/000.jpg rename to public/wallpapers/phone/430x932/000.jpg diff --git a/wallpapers/phone/430x932/001.jpg b/public/wallpapers/phone/430x932/001.jpg similarity index 100% rename from wallpapers/phone/430x932/001.jpg rename to public/wallpapers/phone/430x932/001.jpg diff --git a/wallpapers/phone/430x932/002.jpg b/public/wallpapers/phone/430x932/002.jpg similarity index 100% rename from wallpapers/phone/430x932/002.jpg rename to public/wallpapers/phone/430x932/002.jpg diff --git a/wallpapers/phone/430x932/003.jpg b/public/wallpapers/phone/430x932/003.jpg similarity index 100% rename from wallpapers/phone/430x932/003.jpg rename to public/wallpapers/phone/430x932/003.jpg diff --git a/wallpapers/phone/430x932/004.jpg b/public/wallpapers/phone/430x932/004.jpg similarity index 100% rename from wallpapers/phone/430x932/004.jpg rename to public/wallpapers/phone/430x932/004.jpg diff --git a/wallpapers/phone/430x932/005.jpg b/public/wallpapers/phone/430x932/005.jpg similarity index 100% rename from wallpapers/phone/430x932/005.jpg rename to public/wallpapers/phone/430x932/005.jpg diff --git a/wallpapers/phone/430x932/006.jpg b/public/wallpapers/phone/430x932/006.jpg similarity index 100% rename from wallpapers/phone/430x932/006.jpg rename to public/wallpapers/phone/430x932/006.jpg diff --git a/wallpapers/phone/430x932/007.jpg b/public/wallpapers/phone/430x932/007.jpg similarity index 100% rename from wallpapers/phone/430x932/007.jpg rename to public/wallpapers/phone/430x932/007.jpg diff --git a/wallpapers/phone/430x932/008.jpg b/public/wallpapers/phone/430x932/008.jpg similarity index 100% rename from wallpapers/phone/430x932/008.jpg rename to public/wallpapers/phone/430x932/008.jpg diff --git a/wallpapers/phone/430x932/009.jpg b/public/wallpapers/phone/430x932/009.jpg similarity index 100% rename from wallpapers/phone/430x932/009.jpg rename to public/wallpapers/phone/430x932/009.jpg diff --git a/wallpapers/phone/430x932/010.jpg b/public/wallpapers/phone/430x932/010.jpg similarity index 100% rename from wallpapers/phone/430x932/010.jpg rename to public/wallpapers/phone/430x932/010.jpg diff --git a/wallpapers/phone/430x932/011.jpg b/public/wallpapers/phone/430x932/011.jpg similarity index 100% rename from wallpapers/phone/430x932/011.jpg rename to public/wallpapers/phone/430x932/011.jpg diff --git a/wallpapers/phone/430x932/012.jpg b/public/wallpapers/phone/430x932/012.jpg similarity index 100% rename from wallpapers/phone/430x932/012.jpg rename to public/wallpapers/phone/430x932/012.jpg diff --git a/wallpapers/phone/430x932/013.jpg b/public/wallpapers/phone/430x932/013.jpg similarity index 100% rename from wallpapers/phone/430x932/013.jpg rename to public/wallpapers/phone/430x932/013.jpg diff --git a/wallpapers/phone/430x932/014.jpg b/public/wallpapers/phone/430x932/014.jpg similarity index 100% rename from wallpapers/phone/430x932/014.jpg rename to public/wallpapers/phone/430x932/014.jpg diff --git a/wallpapers/phone/430x932/015.jpg b/public/wallpapers/phone/430x932/015.jpg similarity index 100% rename from wallpapers/phone/430x932/015.jpg rename to public/wallpapers/phone/430x932/015.jpg diff --git a/wallpapers/phone/430x932/016.jpg b/public/wallpapers/phone/430x932/016.jpg similarity index 100% rename from wallpapers/phone/430x932/016.jpg rename to public/wallpapers/phone/430x932/016.jpg diff --git a/wallpapers/phone/430x932/017.jpg b/public/wallpapers/phone/430x932/017.jpg similarity index 100% rename from wallpapers/phone/430x932/017.jpg rename to public/wallpapers/phone/430x932/017.jpg diff --git a/wallpapers/phone/430x932/018.jpg b/public/wallpapers/phone/430x932/018.jpg similarity index 100% rename from wallpapers/phone/430x932/018.jpg rename to public/wallpapers/phone/430x932/018.jpg diff --git a/wallpapers/phone/430x932/019.jpg b/public/wallpapers/phone/430x932/019.jpg similarity index 100% rename from wallpapers/phone/430x932/019.jpg rename to public/wallpapers/phone/430x932/019.jpg diff --git a/wallpapers/phone/430x932/020.jpg b/public/wallpapers/phone/430x932/020.jpg similarity index 100% rename from wallpapers/phone/430x932/020.jpg rename to public/wallpapers/phone/430x932/020.jpg diff --git a/wallpapers/phone/430x932/021.jpg b/public/wallpapers/phone/430x932/021.jpg similarity index 100% rename from wallpapers/phone/430x932/021.jpg rename to public/wallpapers/phone/430x932/021.jpg diff --git a/wallpapers/phone/430x932/022.jpg b/public/wallpapers/phone/430x932/022.jpg similarity index 100% rename from wallpapers/phone/430x932/022.jpg rename to public/wallpapers/phone/430x932/022.jpg diff --git a/wallpapers/phone/430x932/023.jpg b/public/wallpapers/phone/430x932/023.jpg similarity index 100% rename from wallpapers/phone/430x932/023.jpg rename to public/wallpapers/phone/430x932/023.jpg diff --git a/wallpapers/phone/430x932/024.jpg b/public/wallpapers/phone/430x932/024.jpg similarity index 100% rename from wallpapers/phone/430x932/024.jpg rename to public/wallpapers/phone/430x932/024.jpg diff --git a/wallpapers/watch/368x448/000.jpg b/public/wallpapers/watch/368x448/000.jpg similarity index 100% rename from wallpapers/watch/368x448/000.jpg rename to public/wallpapers/watch/368x448/000.jpg diff --git a/wallpapers/watch/368x448/001.jpg b/public/wallpapers/watch/368x448/001.jpg similarity index 100% rename from wallpapers/watch/368x448/001.jpg rename to public/wallpapers/watch/368x448/001.jpg diff --git a/wallpapers/watch/368x448/003.jpg b/public/wallpapers/watch/368x448/003.jpg similarity index 100% rename from wallpapers/watch/368x448/003.jpg rename to public/wallpapers/watch/368x448/003.jpg diff --git a/wallpapers/watch/368x448/004.jpg b/public/wallpapers/watch/368x448/004.jpg similarity index 100% rename from wallpapers/watch/368x448/004.jpg rename to public/wallpapers/watch/368x448/004.jpg diff --git a/wallpapers/watch/368x448/005.jpg b/public/wallpapers/watch/368x448/005.jpg similarity index 100% rename from wallpapers/watch/368x448/005.jpg rename to public/wallpapers/watch/368x448/005.jpg diff --git a/wallpapers/watch/368x448/006.jpg b/public/wallpapers/watch/368x448/006.jpg similarity index 100% rename from wallpapers/watch/368x448/006.jpg rename to public/wallpapers/watch/368x448/006.jpg diff --git a/wallpapers/watch/368x448/007.jpg b/public/wallpapers/watch/368x448/007.jpg similarity index 100% rename from wallpapers/watch/368x448/007.jpg rename to public/wallpapers/watch/368x448/007.jpg diff --git a/wallpapers/watch/368x448/008.jpg b/public/wallpapers/watch/368x448/008.jpg similarity index 100% rename from wallpapers/watch/368x448/008.jpg rename to public/wallpapers/watch/368x448/008.jpg diff --git a/wallpapers/watch/368x448/009.jpg b/public/wallpapers/watch/368x448/009.jpg similarity index 100% rename from wallpapers/watch/368x448/009.jpg rename to public/wallpapers/watch/368x448/009.jpg diff --git a/wallpapers/watch/368x448/010.jpg b/public/wallpapers/watch/368x448/010.jpg similarity index 100% rename from wallpapers/watch/368x448/010.jpg rename to public/wallpapers/watch/368x448/010.jpg diff --git a/wallpapers/watch/368x448/011.jpg b/public/wallpapers/watch/368x448/011.jpg similarity index 100% rename from wallpapers/watch/368x448/011.jpg rename to public/wallpapers/watch/368x448/011.jpg diff --git a/wallpapers/watch/368x448/012.jpg b/public/wallpapers/watch/368x448/012.jpg similarity index 100% rename from wallpapers/watch/368x448/012.jpg rename to public/wallpapers/watch/368x448/012.jpg diff --git a/wallpapers/watch/368x448/013.jpg b/public/wallpapers/watch/368x448/013.jpg similarity index 100% rename from wallpapers/watch/368x448/013.jpg rename to public/wallpapers/watch/368x448/013.jpg diff --git a/wallpapers/watch/368x448/014.jpg b/public/wallpapers/watch/368x448/014.jpg similarity index 100% rename from wallpapers/watch/368x448/014.jpg rename to public/wallpapers/watch/368x448/014.jpg diff --git a/wallpapers/watch/368x448/015.jpg b/public/wallpapers/watch/368x448/015.jpg similarity index 100% rename from wallpapers/watch/368x448/015.jpg rename to public/wallpapers/watch/368x448/015.jpg diff --git a/wallpapers/watch/368x448/016.jpg b/public/wallpapers/watch/368x448/016.jpg similarity index 100% rename from wallpapers/watch/368x448/016.jpg rename to public/wallpapers/watch/368x448/016.jpg diff --git a/wallpapers/watch/368x448/017.jpg b/public/wallpapers/watch/368x448/017.jpg similarity index 100% rename from wallpapers/watch/368x448/017.jpg rename to public/wallpapers/watch/368x448/017.jpg diff --git a/wallpapers/watch/368x448/018.jpg b/public/wallpapers/watch/368x448/018.jpg similarity index 100% rename from wallpapers/watch/368x448/018.jpg rename to public/wallpapers/watch/368x448/018.jpg diff --git a/wallpapers/watch/368x448/019.jpg b/public/wallpapers/watch/368x448/019.jpg similarity index 100% rename from wallpapers/watch/368x448/019.jpg rename to public/wallpapers/watch/368x448/019.jpg diff --git a/wallpapers/watch/368x448/020.jpg b/public/wallpapers/watch/368x448/020.jpg similarity index 100% rename from wallpapers/watch/368x448/020.jpg rename to public/wallpapers/watch/368x448/020.jpg diff --git a/wallpapers/watch/368x448/021.jpg b/public/wallpapers/watch/368x448/021.jpg similarity index 100% rename from wallpapers/watch/368x448/021.jpg rename to public/wallpapers/watch/368x448/021.jpg diff --git a/wallpapers/watch/368x448/022.jpg b/public/wallpapers/watch/368x448/022.jpg similarity index 100% rename from wallpapers/watch/368x448/022.jpg rename to public/wallpapers/watch/368x448/022.jpg diff --git a/wallpapers/watch/368x448/023.jpg b/public/wallpapers/watch/368x448/023.jpg similarity index 100% rename from wallpapers/watch/368x448/023.jpg rename to public/wallpapers/watch/368x448/023.jpg diff --git a/wallpapers/watch/368x448/024.jpg b/public/wallpapers/watch/368x448/024.jpg similarity index 100% rename from wallpapers/watch/368x448/024.jpg rename to public/wallpapers/watch/368x448/024.jpg diff --git a/scripts/generate-manifest.js b/scripts/generate-manifest.js new file mode 100644 index 0000000..2a1052a --- /dev/null +++ b/scripts/generate-manifest.js @@ -0,0 +1,126 @@ +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +const ROOT = path.resolve(__dirname, '..'); +const OUTPUT = path.join(ROOT, 'src', 'data', 'wallpaper-manifest.json'); + +// Check both public/wallpapers/ and wallpapers/ (fallback) +function getWallpaperRoot() { + const publicPath = path.join(ROOT, 'public', 'wallpapers'); + const rootPath = path.join(ROOT, 'wallpapers'); + if (fs.existsSync(publicPath)) return publicPath; + if (fs.existsSync(rootPath)) return rootPath; + return null; +} + +// Fallback: use git ls-tree when files aren't on disk +function gitLsTree(treePath) { + try { + const output = execSync( + `git ls-tree HEAD "${treePath}/"`, + { cwd: ROOT, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] } + ); + return output + .trim() + .split('\n') + .filter(Boolean) + .map(line => { + const parts = line.split('\t'); + return { name: path.basename(parts[1]), type: line.startsWith('040000') ? 'tree' : 'blob' }; + }); + } catch { + return []; + } +} + +// Get subdirectory names from filesystem or git +function getSubdirs(dirPath, gitPath) { + if (dirPath && fs.existsSync(dirPath)) { + return fs.readdirSync(dirPath, { withFileTypes: true }) + .filter(d => d.isDirectory()) + .map(d => d.name); + } + return gitLsTree(gitPath) + .filter(e => e.type === 'tree') + .map(e => e.name); +} + +// Get JPG filenames from filesystem or git +function getJpgFiles(dirPath, gitPath) { + if (dirPath && fs.existsSync(dirPath)) { + return fs.readdirSync(dirPath) + .filter(f => f.toLowerCase().endsWith('.jpg')); + } + return gitLsTree(gitPath) + .filter(e => e.type === 'blob' && e.name.toLowerCase().endsWith('.jpg')) + .map(e => e.name); +} + +function reverseSort(files) { + return [...files].sort().reverse(); +} + +function buildManifest() { + const wpRoot = getWallpaperRoot(); + + // Desktop + const desktopDir = wpRoot ? path.join(wpRoot, 'desktop') : null; + const desktopThumbDir = wpRoot ? path.join(wpRoot, 'desktop', 'thumbnails') : null; + const desktopSubdirs = getSubdirs(desktopDir, 'wallpapers/desktop'); + const desktopSizes = desktopSubdirs.filter(d => d !== 'thumbnails').sort(); + const desktopImages = reverseSort(getJpgFiles(desktopThumbDir, 'wallpapers/desktop/thumbnails')); + + // Phone + const phoneDir = wpRoot ? path.join(wpRoot, 'phone') : null; + const phoneScanDir = wpRoot ? path.join(wpRoot, 'phone', '320x568') : null; + const phoneSubdirs = getSubdirs(phoneDir, 'wallpapers/phone'); + const phoneSizes = phoneSubdirs.sort(); + const phoneImages = reverseSort(getJpgFiles(phoneScanDir, 'wallpapers/phone/320x568')); + + // Watch + const watchDir = wpRoot ? path.join(wpRoot, 'watch') : null; + const watchScanDir = wpRoot ? path.join(wpRoot, 'watch', '368x448') : null; + const watchSubdirs = getSubdirs(watchDir, 'wallpapers/watch'); + const watchSizes = watchSubdirs.sort(); + const watchImages = reverseSort(getJpgFiles(watchScanDir, 'wallpapers/watch/368x448')); + + // Archive — count thumbnails only + const archiveThumbDir = wpRoot ? path.join(wpRoot, 'archive', 'thumbnail') : null; + const archiveFiles = getJpgFiles(archiveThumbDir, 'wallpapers/archive/thumbnail'); + const totalItems = archiveFiles.length; + + const manifest = { + desktop: { + images: desktopImages, + sizes: desktopSizes, + thumbnailPath: 'wallpapers/desktop/thumbnails' + }, + phone: { + images: phoneImages, + sizes: phoneSizes, + thumbnailPath: 'wallpapers/phone/320x568' + }, + watch: { + images: watchImages, + sizes: watchSizes, + thumbnailPath: 'wallpapers/watch/368x448' + }, + archive: { + totalItems, + thumbnailPath: 'wallpapers/archive/thumbnail', + fullPath: 'wallpapers/archive' + } + }; + + // Ensure output directory exists + fs.mkdirSync(path.dirname(OUTPUT), { recursive: true }); + fs.writeFileSync(OUTPUT, JSON.stringify(manifest, null, 2) + '\n'); + console.log(`Manifest written to ${path.relative(ROOT, OUTPUT)}`); + console.log(` Desktop: ${desktopImages.length} images, ${desktopSizes.length} sizes`); + console.log(` Phone: ${phoneImages.length} images, ${phoneSizes.length} sizes`); + console.log(` Watch: ${watchImages.length} images, ${watchSizes.length} sizes`); + console.log(` Archive: ${totalItems} items`); +} + +buildManifest(); diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..1528ed5 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,34 @@ +import { BrowserRouter, Routes, Route } from 'react-router-dom'; +import { HelmetProvider } from 'react-helmet-async'; +import { ThemeProvider } from './contexts/ThemeContext'; +import Layout from './components/Layout'; + +import Home from './pages/Home'; +import Desktop from './pages/Desktop'; +import Phone from './pages/Phone'; +import Watch from './pages/Watch'; +import Archive from './pages/Archive'; +import SweepstakesRules from './pages/SweepstakesRules'; + +function App() { + return ( + + + + + }> + } /> + } /> + } /> + } /> + } /> + } /> + + + + + + ); +} + +export default App; diff --git a/src/components/DownloadOptions.module.css b/src/components/DownloadOptions.module.css new file mode 100644 index 0000000..4253036 --- /dev/null +++ b/src/components/DownloadOptions.module.css @@ -0,0 +1,88 @@ +.container { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.title { + margin: 0; + font-size: 1.1rem; +} + +.checkboxLabel { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: 0.875rem; + cursor: pointer; +} + +.checkboxLabel input:focus-visible { + outline: 3px solid var(--primary, #0078d4); + outline-offset: 2px; +} + +.buttonGroup { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.downloadButton { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.625rem 1rem; + border: none; + border-radius: 50px; + background: linear-gradient(135deg, var(--primary, #68217a), var(--secondary, #8b2da2)); + color: #fff; + font-size: 0.875rem; + text-decoration: none; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + text-align: center; + box-shadow: 0 4px 15px var(--primary-shadow); +} + +.downloadButton:hover { + opacity: 0.9; + transform: translateY(-1px); + box-shadow: 0 6px 20px var(--primary-shadow-hover); +} + +.downloadButton:focus-visible { + outline: 3px solid var(--primary, #0078d4); + outline-offset: 2px; +} + +.phoneGroup { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.selectLabel { + font-size: 0.875rem; + font-weight: 500; +} + +.sizeSelect { + padding: 0.5rem; + border: 1px solid var(--card-border, #ccc); + border-radius: 8px; + font-size: 0.875rem; + background: var(--card-bg, #fff); + color: var(--text-primary, inherit); +} + +.sizeSelect:focus-visible { + outline: 3px solid var(--primary, #0078d4); + outline-offset: 2px; +} + +@media (prefers-reduced-motion: reduce) { + .downloadButton { + transition: none; + } +} diff --git a/src/components/DownloadOptions.tsx b/src/components/DownloadOptions.tsx new file mode 100644 index 0000000..94f42ed --- /dev/null +++ b/src/components/DownloadOptions.tsx @@ -0,0 +1,134 @@ +import { useState, useEffect } from 'react'; +import styles from './DownloadOptions.module.css'; + +interface DownloadOptionsProps { + currentImage: string; + sizes: readonly string[]; + deviceType: 'desktop' | 'phone' | 'watch' | 'archive'; + basePath: string; +} + +function getStoredOpenInNewWindow(): boolean { + try { + const stored = localStorage.getItem('openInNewWindow'); + return stored === null ? true : stored === 'true'; + } catch { + return true; + } +} + +export default function DownloadOptions({ + currentImage, + sizes, + deviceType, + basePath, +}: DownloadOptionsProps) { + const [openInNewWindow, setOpenInNewWindow] = useState(getStoredOpenInNewWindow); + const [selectedSize, setSelectedSize] = useState(sizes[0] ?? ''); + + useEffect(() => { + setSelectedSize(sizes[0] ?? ''); + }, [sizes]); + + useEffect(() => { + try { + localStorage.setItem('openInNewWindow', String(openInNewWindow)); + } catch { + // localStorage unavailable + } + }, [openInNewWindow]); + + const buildHref = (size?: string) => { + const base = import.meta.env.BASE_URL; + if (deviceType === 'archive') { + return `${base}${basePath}/${currentImage}`; + } + return `${base}${basePath}/${size}/${currentImage}`; + }; + + const buildFilename = (size?: string) => { + const name = currentImage.replace(/\.[^.]+$/, ''); + const ext = currentImage.includes('.') ? currentImage.slice(currentImage.lastIndexOf('.')) : ''; + if (deviceType === 'archive') { + return `archive_${name}${ext}`; + } + return `${deviceType}_${size}_${name}${ext}`; + }; + + const linkProps = (size?: string) => { + if (openInNewWindow) { + return { target: '_blank' as const, rel: 'noopener noreferrer' }; + } + return { download: buildFilename(size) }; + }; + + return ( +
+

Download Options

+ + + + {deviceType === 'archive' && ( + + )} + + {(deviceType === 'desktop' || deviceType === 'watch') && ( +
+ {sizes.map((size) => ( + + Download {size} + + ))} +
+ )} + + {deviceType === 'phone' && ( +
+ + + + Download + +
+ )} +
+ ); +} diff --git a/src/components/Layout.module.css b/src/components/Layout.module.css new file mode 100644 index 0000000..c7484a5 --- /dev/null +++ b/src/components/Layout.module.css @@ -0,0 +1,396 @@ +/* ── Reset & globals (applied via :global) ── */ + +:global(*), +:global(*::before), +:global(*::after) { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +:global(html) { + scroll-behavior: smooth; +} + +:global(body) { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + line-height: 1.6; + background: linear-gradient(135deg, var(--background) 0%, var(--bg-end) 100%); + color: var(--text-primary); + min-height: 100vh; +} + +:global(:root) { + --glass-bg: rgba(255, 255, 255, 0.1); + --glass-border: rgba(255, 255, 255, 0.2); + --shadow-color: rgba(0, 0, 0, 0.1); + --card-bg: rgba(255, 255, 255, 0.95); + --text-primary: #1a1a2e; + --text-secondary: #4a4a6a; +} + +:global(*:focus-visible) { + outline: 3px solid var(--secondary); + outline-offset: 2px; +} + +/* ── Skip link ── */ + +.skipLink { + position: absolute; + top: -40px; + left: 0; + background: var(--primary); + color: white; + padding: 12px 20px; + z-index: 1000; + transition: top 0.2s; + border-radius: 0 0 8px 0; + font-weight: 500; + text-decoration: none; +} + +.skipLink:focus { + top: 0; +} + +/* ── Nav ── */ + +.nav { + background: linear-gradient(135deg, var(--secondary) 0%, var(--primary) 100%); + padding: 0.75rem 1.5rem; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + gap: 0.5rem; + position: sticky; + top: 0; + z-index: 100; + box-shadow: 0 4px 30px rgba(0, 0, 0, 0.15); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); +} + +.navLink { + color: white; + text-decoration: none; + padding: 0.6rem 1.25rem; + margin: 0 0.25rem; + border-radius: 50px; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + font-weight: 500; + font-size: 0.95rem; + position: relative; + overflow: hidden; +} + +.navLink::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.15); + border-radius: 50px; + transform: scale(0); + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.navLink:hover::before { + transform: scale(1); +} + +.navLink:hover { + transform: translateY(-2px); +} + +.navLinkActive { + background-color: rgba(255, 255, 255, 0.2); + font-weight: 600; +} + +.navLink:focus-visible, +.themeToggle:focus-visible { + outline: 3px solid #ffffff; + outline-offset: 2px; + box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1); +} + +/* ── Theme toggle ── */ + +.themeToggle { + background: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.3); + color: white; + padding: 0.6rem 1.25rem; + border-radius: 50px; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + font-family: 'Inter', sans-serif; + display: flex; + align-items: center; + gap: 0.5rem; + font-weight: 500; + font-size: 0.9rem; +} + +.themeToggle img { + width: auto; + height: 18px; + vertical-align: middle; + filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2)); +} + +.themeToggle:hover { + background: rgba(255, 255, 255, 0.2); + transform: translateY(-2px); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); +} + +.toggleText { + /* visible by default; hidden on mobile via media query */ +} + +/* ── Header ── */ + +.header { + background-color: var(--primary); + color: white; + padding: 5rem 2rem; + text-align: center; + position: relative; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + overflow: hidden; +} + +.header::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, var(--primary-overlay) 0%, rgba(0, 0, 0, 0.7) 100%); + z-index: 1; +} + +.header::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient(circle at 30% 70%, rgba(255, 255, 255, 0.1) 0%, transparent 50%); + z-index: 1; +} + +.headerContent { + position: relative; + z-index: 2; + max-width: 800px; + margin: 0 auto; +} + +.header h1, +.header p { + position: relative; + z-index: 2; +} + +.header h1 { + font-size: clamp(2rem, 5vw, 3.5rem); + margin-bottom: 1rem; + font-weight: 800; + letter-spacing: -0.02em; + text-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); + animation: fadeInUp 0.8s ease-out; +} + +.header p { + font-size: clamp(1rem, 2.5vw, 1.3rem); + text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); + opacity: 0.95; + font-weight: 400; + animation: fadeInUp 0.8s ease-out 0.2s both; +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* ── Main container ── */ + +.container { + max-width: 1400px; + margin: 0 auto; + padding: 3rem 2rem; +} + +/* ── Footer ── */ + +.footer { + text-align: center; + padding: 3rem 2rem; + background: linear-gradient(135deg, var(--secondary) 0%, var(--primary) 100%); + color: white; + margin-top: 3rem; + position: relative; + overflow: hidden; +} + +.footer::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.08) 0%, transparent 50%); +} + +.footerContent { + position: relative; + z-index: 1; + max-width: 800px; + margin: 0 auto; + line-height: 1.8; + font-size: 0.95rem; +} + +.footerLink { + color: white !important; + text-decoration: none; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + opacity: 0.9; + font-weight: 600; + position: relative; +} + +.footerLink::after { + content: ''; + position: absolute; + bottom: -2px; + left: 0; + width: 0; + height: 2px; + background: white; + transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.footerLink:hover::after, +.footerLink:focus::after { + width: 100%; +} + +.footerLink:hover, +.footerLink:focus { + opacity: 1; +} + +.footerLink:focus-visible { + outline: 3px solid white; + outline-offset: 4px; + border-radius: 2px; +} + +/* ── Utility ── */ + +.srOnly { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* ── Reduced motion ── */ + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} + +/* ── Responsive (≤ 768px) ── */ + +@media (max-width: 768px) { + .nav { + padding: 0.5rem 0.75rem; + } + + .navLink { + padding: 0.5rem 0.75rem; + font-size: 0.85rem; + margin: 0 0.125rem; + } + + .themeToggle { + padding: 0.5rem 0.75rem; + font-size: 0.8rem; + } + + .toggleText { + display: none; + } + + .header { + padding: 3rem 1.5rem; + } + + .container { + padding: 2rem 1rem; + } + + .footer { + padding: 2rem 1rem; + margin-top: 2rem; + } +} + +/* ── Small phones (≤ 480px) ── */ + +@media (max-width: 480px) { + .nav { + padding: 0.4rem 0.5rem; + gap: 0.25rem; + } + + .navLink { + padding: 0.4rem 0.6rem; + font-size: 0.8rem; + } + + .themeToggle { + padding: 0.4rem 0.6rem; + } + + .header { + padding: 2rem 1rem; + } + + .container { + padding: 1.5rem 0.75rem; + } +} diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx new file mode 100644 index 0000000..d3c8a88 --- /dev/null +++ b/src/components/Layout.tsx @@ -0,0 +1,113 @@ +import { Outlet, NavLink, useLocation } from 'react-router-dom'; +import { Helmet } from 'react-helmet-async'; +import { useTheme } from '../contexts/ThemeContext'; +import styles from './Layout.module.css'; + +const navItems = [ + { to: '/', label: 'Home' }, + { to: '/desktop', label: 'Desktop' }, + { to: '/phone', label: 'Phone' }, + { to: '/watch', label: 'Watch' }, +] as const; + +function Layout() { + const { themeName, theme, toggleTheme } = useTheme(); + const location = useLocation(); + + const isVsPurple = themeName === 'vs_purple'; + const switchLabel = isVsPurple ? 'Switch to VS Code Blue' : 'Switch to VS Purple'; + const toggleIcon = isVsPurple + ? `${import.meta.env.BASE_URL}icons/visualstudiocode.png` + : `${import.meta.env.BASE_URL}icons/visualstudio.png`; + const toggleIconAlt = isVsPurple ? 'VS Code icon' : 'Visual Studio icon'; + + return ( + <> + + Visual Studio Wallpapers + + + + Skip to main content + + + + +
+
+

Visual Studio Wallpapers

+

Beautiful wallpapers for your Desktop, Phone, and Watch

+
+
+ +
+ +
+ +
+

+ © {new Date().getFullYear()} Visual Studio Wallpapers Community by{' '} + + James + + ,{' '} + + Scott + + , and{' '} + + GitHub Copilot + + . All rights reserved. Official wallpapers © Microsoft{' '} + {new Date().getFullYear()} +

+
+ + ); +} + +export default Layout; diff --git a/src/components/PreviewModal.module.css b/src/components/PreviewModal.module.css new file mode 100644 index 0000000..e75f334 --- /dev/null +++ b/src/components/PreviewModal.module.css @@ -0,0 +1,169 @@ +.overlay { + position: fixed; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + z-index: 1000; + padding: 1rem; +} + +.content { + display: flex; + flex-direction: column; + background: var(--card-bg, #fff); + border-radius: 12px; + max-width: 90vw; + max-height: 90vh; + overflow: auto; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); + border: 1px solid var(--card-border, rgba(0, 0, 0, 0.08)); + color: var(--text-primary); +} + +.imageSection { + position: relative; + display: flex; + align-items: center; + justify-content: center; + flex: 1; + min-height: 0; + padding: 1rem; +} + +.previewImage { + max-width: 100%; + max-height: 60vh; + object-fit: contain; + border-radius: 8px; +} + +.navButton { + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 48px; + height: 48px; + border-radius: 50%; + border: none; + background: rgba(0, 0, 0, 0.3); + color: #fff; + font-size: 1.25rem; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: background 0.3s cubic-bezier(0.4, 0, 0.2, 1); + z-index: 1; +} + +.navButton:first-child { + left: 0.5rem; +} + +.navButton:last-of-type { + right: 0.5rem; +} + +.navButton:hover { + background: rgba(0, 0, 0, 0.5); +} + +.navButton:focus-visible { + outline: 3px solid var(--primary, #0078d4); + outline-offset: 2px; +} + +.sidebar { + padding: 1.5rem; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.title { + margin: 0; + font-size: 1.25rem; +} + +.closeButton { + padding: 0.75rem 1.5rem; + border: none; + border-radius: 50px; + background: linear-gradient(135deg, var(--primary, #68217a), var(--secondary, #8b2da2)); + color: #fff; + font-size: 1rem; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + margin-top: auto; + box-shadow: 0 4px 15px var(--primary-shadow); +} + +.closeButton:hover { + opacity: 0.9; + transform: translateY(-1px); + box-shadow: 0 6px 20px var(--primary-shadow-hover); +} + +.closeButton:focus-visible { + outline: 3px solid var(--primary, #0078d4); + outline-offset: 2px; +} + +/* ── Mobile adjustments (≤ 767px) ── */ + +@media (max-width: 767px) { + .content { + max-width: 95vw; + } + + .previewImage { + max-height: 400px; + } + + .navButton { + width: 36px; + height: 36px; + font-size: 1rem; + } + + .sidebar { + padding: 1rem; + } + + .title { + font-size: 1.1rem; + } +} + +/* ── Desktop layout (≥ 1024px) ── */ + +@media (min-width: 1024px) { + .content { + flex-direction: row; + } + + .previewImage { + max-height: 85vh; + } + + .sidebar { + width: 280px; + flex-shrink: 0; + border-left: 1px solid var(--card-border, rgba(0, 0, 0, 0.08)); + padding: 2rem; + } +} + +@media (prefers-reduced-motion: reduce) { + .navButton { + transition: none; + } + + .closeButton { + transition: none; + } +} diff --git a/src/components/PreviewModal.tsx b/src/components/PreviewModal.tsx new file mode 100644 index 0000000..8cb748f --- /dev/null +++ b/src/components/PreviewModal.tsx @@ -0,0 +1,162 @@ +import { useEffect, useRef, useCallback } from 'react'; +import { createPortal } from 'react-dom'; +import styles from './PreviewModal.module.css'; + +interface PreviewModalProps { + isOpen: boolean; + onClose: () => void; + imageSrc: string; + imageAlt: string; + onPrevious: () => void; + onNext: () => void; + children?: React.ReactNode; +} + +const FOCUSABLE_SELECTOR = + 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex="-1"])'; + +export default function PreviewModal({ + isOpen, + onClose, + imageSrc, + imageAlt, + onPrevious, + onNext, + children, +}: PreviewModalProps) { + const dialogRef = useRef(null); + const previouslyFocused = useRef(null); + + const getFocusableElements = useCallback(() => { + if (!dialogRef.current) return []; + return Array.from( + dialogRef.current.querySelectorAll(FOCUSABLE_SELECTOR), + ); + }, []); + + // Focus trap + const handleTabKey = useCallback( + (e: KeyboardEvent) => { + const focusable = getFocusableElements(); + if (focusable.length === 0) return; + + const first = focusable[0]; + const last = focusable[focusable.length - 1]; + + if (e.shiftKey) { + if (document.activeElement === first) { + e.preventDefault(); + last.focus(); + } + } else { + if (document.activeElement === last) { + e.preventDefault(); + first.focus(); + } + } + }, + [getFocusableElements], + ); + + const handleKeyDown = useCallback( + (e: KeyboardEvent) => { + switch (e.key) { + case 'Escape': + onClose(); + break; + case 'ArrowLeft': + onPrevious(); + break; + case 'ArrowRight': + onNext(); + break; + case 'Tab': + handleTabKey(e); + break; + } + }, + [onClose, onPrevious, onNext, handleTabKey], + ); + + useEffect(() => { + if (isOpen) { + previouslyFocused.current = document.activeElement; + document.body.style.overflow = 'hidden'; + document.addEventListener('keydown', handleKeyDown); + + // Focus first focusable element after render + requestAnimationFrame(() => { + const focusable = getFocusableElements(); + if (focusable.length > 0) { + focusable[0].focus(); + } + }); + } + + return () => { + document.body.style.overflow = ''; + document.removeEventListener('keydown', handleKeyDown); + + if (previouslyFocused.current instanceof HTMLElement) { + previouslyFocused.current.focus(); + } + }; + }, [isOpen, handleKeyDown, getFocusableElements]); + + if (!isOpen) return null; + + const handleBackdropClick = (e: React.MouseEvent) => { + if (e.target === e.currentTarget) { + onClose(); + } + }; + + return createPortal( +
+
+
+ + {imageAlt} + +
+
+

+ {imageAlt} +

+ {children} + +
+
+
, + document.body, + ); +} diff --git a/src/components/WallpaperGrid.module.css b/src/components/WallpaperGrid.module.css new file mode 100644 index 0000000..55ce5e3 --- /dev/null +++ b/src/components/WallpaperGrid.module.css @@ -0,0 +1,127 @@ +.grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 1.5rem; + padding: 1rem 0; +} + +.grid.phone { + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); +} + +.grid.watch { + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); +} + +.card { + border-radius: 12px; + overflow: hidden; + background: var(--card-bg, #fff); + box-shadow: 0 2px 8px var(--shadow-color); + cursor: pointer; + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.3s cubic-bezier(0.4, 0, 0.2, 1); + outline: none; + border: 1px solid var(--card-border, rgba(0, 0, 0, 0.08)); +} + +.card:hover { + transform: translateY(-8px) scale(1.02); + box-shadow: 0 12px 32px var(--shadow-color); + border-color: var(--card-border-hover, rgba(0, 0, 0, 0.15)); +} + +.card:focus-visible { + outline: 3px solid var(--primary, #0078d4); + outline-offset: 2px; +} + +.imageContainer { + width: 100%; + overflow: hidden; +} + +.grid.desktop .imageContainer, +.grid.watch .imageContainer { + aspect-ratio: 16 / 9; +} + +.grid.phone .imageContainer { + aspect-ratio: 9 / 16; +} + +.grid.archive .imageContainer { + aspect-ratio: 16 / 9; +} + +.imageContainer img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.hint { + display: block; + padding: 0.5rem; + text-align: center; + font-size: 0.75rem; + color: var(--text-secondary, #666); +} + +/* ── Archive grid ── */ + +.grid.archive { + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); +} + +/* ── Tablet (≤ 1023px) ── */ + +@media (max-width: 1023px) { + .grid { + grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); + } + + .grid.phone { + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + } +} + +/* ── Mobile (≤ 600px) ── */ + +@media (max-width: 600px) { + .grid { + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 1rem; + } + + .grid.phone { + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + } + + .grid.watch { + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + } + + .grid.archive { + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + } +} + +/* ── Small phones (≤ 480px) ── */ + +@media (max-width: 480px) { + .grid { + grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); + gap: 0.75rem; + } +} + +@media (prefers-reduced-motion: reduce) { + .card { + transition: none; + } + + .card:hover { + transform: none; + } +} diff --git a/src/components/WallpaperGrid.tsx b/src/components/WallpaperGrid.tsx new file mode 100644 index 0000000..bf53d16 --- /dev/null +++ b/src/components/WallpaperGrid.tsx @@ -0,0 +1,62 @@ +import { useCallback } from 'react'; +import styles from './WallpaperGrid.module.css'; + +interface WallpaperGridProps { + images: string[]; + thumbnailBasePath: string; + onImageClick: (image: string, index: number) => void; + deviceType: 'desktop' | 'phone' | 'watch' | 'archive'; + altPrefix?: string; +} + +export default function WallpaperGrid({ + images, + thumbnailBasePath, + onImageClick, + deviceType, + altPrefix = 'Wallpaper', +}: WallpaperGridProps) { + const handleKeyDown = useCallback( + (image: string, index: number, e: React.KeyboardEvent) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + onImageClick(image, index); + } + }, + [onImageClick], + ); + + const gridClass = `${styles.grid} ${styles[deviceType]}`; + const wallpaperName = (image: string) => image.replace(/\.[^.]+$/, ''); + + return ( +
+ {images.map((image, index) => ( +
onImageClick(image, index)} + onKeyDown={(e) => handleKeyDown(image, index, e)} + > +
+ {`${altPrefix} +
+ +
+ ))} +
+ ); +} diff --git a/src/contexts/ThemeContext.tsx b/src/contexts/ThemeContext.tsx new file mode 100644 index 0000000..e4c0f0d --- /dev/null +++ b/src/contexts/ThemeContext.tsx @@ -0,0 +1,113 @@ +import { createContext, useContext, useEffect, useState, type ReactNode } from 'react'; + +export interface ThemeColors { + primary: string; + secondary: string; + background: string; + bgEnd: string; + headerBg: string; + cardBorder: string; + cardBorderHover: string; + primaryOverlay: string; + primaryShadow: string; + primaryShadowHover: string; + archiveBorder: string; + archiveHoverBg: string; +} + +export const themes = { + vs_purple: { + primary: '#68217a', + secondary: '#8b2da2', + background: '#f0eaf3', + bgEnd: '#ddd5e8', + headerBg: 'wallpapers/desktop/1920x1080/009.jpg', + cardBorder: 'rgba(104, 33, 122, 0.08)', + cardBorderHover: 'rgba(104, 33, 122, 0.18)', + primaryOverlay: 'rgba(104, 33, 122, 0.85)', + primaryShadow: 'rgba(104, 33, 122, 0.3)', + primaryShadowHover: 'rgba(104, 33, 122, 0.4)', + archiveBorder: 'rgba(104, 33, 122, 0.2)', + archiveHoverBg: 'rgba(104, 33, 122, 0.05)', + }, + vs_blue: { + primary: '#005a9e', + secondary: '#007acc', + background: '#e8f0f8', + bgEnd: '#d0dff0', + headerBg: 'wallpapers/desktop/1920x1080/011.jpg', + cardBorder: 'rgba(0, 90, 158, 0.10)', + cardBorderHover: 'rgba(0, 90, 158, 0.22)', + primaryOverlay: 'rgba(0, 60, 120, 0.88)', + primaryShadow: 'rgba(0, 90, 158, 0.35)', + primaryShadowHover: 'rgba(0, 90, 158, 0.5)', + archiveBorder: 'rgba(0, 90, 158, 0.25)', + archiveHoverBg: 'rgba(0, 90, 158, 0.08)', + }, +} as const; + +export type ThemeName = keyof typeof themes; + +interface ThemeContextValue { + themeName: ThemeName; + theme: ThemeColors; + toggleTheme: () => void; +} + +const ThemeContext = createContext(undefined); + +function isThemeName(value: string): value is ThemeName { + return value === 'vs_purple' || value === 'vs_blue'; +} + +function applyCustomProperties(theme: ThemeColors) { + const root = document.documentElement; + // Both themes are light-mode; prevent OS dark-mode from overriding text colors + root.setAttribute('data-color-mode', 'light'); + root.style.setProperty('--primary', theme.primary); + root.style.setProperty('--secondary', theme.secondary); + root.style.setProperty('--background', theme.background); + root.style.setProperty('--bg-end', theme.bgEnd); + root.style.setProperty('--card-border', theme.cardBorder); + root.style.setProperty('--card-border-hover', theme.cardBorderHover); + root.style.setProperty('--primary-overlay', theme.primaryOverlay); + root.style.setProperty('--primary-shadow', theme.primaryShadow); + root.style.setProperty('--primary-shadow-hover', theme.primaryShadowHover); + root.style.setProperty('--archive-border', theme.archiveBorder); + root.style.setProperty('--archive-hover-bg', theme.archiveHoverBg); +} + +export function ThemeProvider({ children }: { children: ReactNode }) { + const [themeName, setThemeName] = useState(() => { + const stored = localStorage.getItem('theme'); + return stored && isThemeName(stored) ? stored : 'vs_purple'; + }); + + const theme = themes[themeName]; + + useEffect(() => { + applyCustomProperties(theme); + }, [theme]); + + const toggleTheme = () => { + setThemeName((prev) => { + const next: ThemeName = prev === 'vs_purple' ? 'vs_blue' : 'vs_purple'; + localStorage.setItem('theme', next); + return next; + }); + }; + + return ( + + {children} + + ); +} + +export function useTheme(): ThemeContextValue { + const context = useContext(ThemeContext); + if (!context) { + throw new Error('useTheme must be used within a ThemeProvider'); + } + return context; +} diff --git a/src/data/sizes.ts b/src/data/sizes.ts new file mode 100644 index 0000000..226a16e --- /dev/null +++ b/src/data/sizes.ts @@ -0,0 +1,7 @@ +export const sizes = { + desktop: ['1280x720', '1920x1080', '3440x1400', '3840x2160'], + phone: ['320x568', '360x640', '360x800', '390x844', '428x926', '430x932'], + watch: ['368x448'], +} as const; + +export type DeviceType = keyof typeof sizes; diff --git a/src/data/wallpaper-manifest.json b/src/data/wallpaper-manifest.json new file mode 100644 index 0000000..c9b228b --- /dev/null +++ b/src/data/wallpaper-manifest.json @@ -0,0 +1,113 @@ +{ + "desktop": { + "images": [ + "024.jpg", + "023.jpg", + "022.jpg", + "021.jpg", + "020.jpg", + "019.jpg", + "018.jpg", + "017.jpg", + "016.jpg", + "015.jpg", + "014.jpg", + "013.jpg", + "012.jpg", + "011.jpg", + "010.jpg", + "009.jpg", + "008.jpg", + "007.jpg", + "006.jpg", + "005.jpg", + "004.jpg", + "003.jpg", + "002.jpg", + "001.jpg", + "000.jpg" + ], + "sizes": [ + "1280x720", + "1920x1080", + "3440x1400", + "3840x2160" + ], + "thumbnailPath": "wallpapers/desktop/thumbnails" + }, + "phone": { + "images": [ + "024.jpg", + "023.jpg", + "022.jpg", + "021.jpg", + "020.jpg", + "019.jpg", + "018.jpg", + "017.jpg", + "016.jpg", + "015.jpg", + "014.jpg", + "013.jpg", + "012.jpg", + "011.jpg", + "010.jpg", + "009.jpg", + "008.jpg", + "007.jpg", + "006.jpg", + "005.jpg", + "004.jpg", + "003.jpg", + "002.jpg", + "001.jpg", + "000.jpg" + ], + "sizes": [ + "320x568", + "360x640", + "360x800", + "390x844", + "428x926", + "430x932" + ], + "thumbnailPath": "wallpapers/phone/320x568" + }, + "watch": { + "images": [ + "024.jpg", + "023.jpg", + "022.jpg", + "021.jpg", + "020.jpg", + "019.jpg", + "018.jpg", + "017.jpg", + "016.jpg", + "015.jpg", + "014.jpg", + "013.jpg", + "012.jpg", + "011.jpg", + "010.jpg", + "009.jpg", + "008.jpg", + "007.jpg", + "006.jpg", + "005.jpg", + "004.jpg", + "003.jpg", + "001.jpg", + "000.jpg" + ], + "sizes": [ + "368x448" + ], + "thumbnailPath": "wallpapers/watch/368x448" + }, + "archive": { + "totalItems": 138, + "thumbnailPath": "wallpapers/archive/thumbnail", + "fullPath": "wallpapers/archive" + } +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..c5ff1c9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,141 @@ +/* CSS Custom Properties — set by ThemeContext via JavaScript */ +:root { + --primary: #68217a; + --secondary: #8b2da2; + --background: #f0eaf3; + --glass-bg: rgba(255, 255, 255, 0.1); + --glass-border: rgba(255, 255, 255, 0.2); + --shadow-color: rgba(0, 0, 0, 0.1); + --card-bg: rgba(255, 255, 255, 0.92); + --text-primary: #1a1a2e; + --text-secondary: #4a4a6a; + --card-border: rgba(104, 33, 122, 0.08); + --card-border-hover: rgba(104, 33, 122, 0.18); + --primary-overlay: rgba(104, 33, 122, 0.85); + --primary-shadow: rgba(104, 33, 122, 0.3); + --primary-shadow-hover: rgba(104, 33, 122, 0.4); + --archive-border: rgba(104, 33, 122, 0.2); + --archive-hover-bg: rgba(104, 33, 122, 0.05); + --bg-end: #ddd5e8; + --disclaimer-bg: #f8f9fa; + --disclaimer-border: #17a2b8; + --disclaimer-link: #0b6f80; +} + +/* Dark mode: prefers-color-scheme */ +@media (prefers-color-scheme: dark) { + :root:not([data-color-mode="light"]) { + --background: #1a1a2e; + --card-bg: rgba(30, 30, 50, 0.95); + --text-primary: #e8e8f0; + --text-secondary: #a0a0c0; + --shadow-color: rgba(0, 0, 0, 0.3); + --glass-bg: rgba(255, 255, 255, 0.05); + --glass-border: rgba(255, 255, 255, 0.1); + --card-border: rgba(255, 255, 255, 0.08); + --card-border-hover: rgba(255, 255, 255, 0.2); + --bg-end: #12121f; + --disclaimer-bg: rgba(30, 30, 50, 0.8); + --disclaimer-border: #17a2b8; + --disclaimer-link: #5bc0de; + } +} + +/* Dark mode: manual toggle */ +[data-color-mode="dark"] { + --background: #1a1a2e; + --card-bg: rgba(30, 30, 50, 0.95); + --text-primary: #e8e8f0; + --text-secondary: #a0a0c0; + --shadow-color: rgba(0, 0, 0, 0.3); + --glass-bg: rgba(255, 255, 255, 0.05); + --glass-border: rgba(255, 255, 255, 0.1); + --card-border: rgba(255, 255, 255, 0.08); + --card-border-hover: rgba(255, 255, 255, 0.2); + --bg-end: #12121f; + --disclaimer-bg: rgba(30, 30, 50, 0.8); + --disclaimer-border: #17a2b8; + --disclaimer-link: #5bc0de; +} + +*, +*::before, +*::after { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } +} + +body { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + line-height: 1.6; + background: linear-gradient(135deg, var(--background) 0%, var(--bg-end) 100%); + color: var(--text-primary); + min-height: 100vh; + overflow-x: hidden; +} + +/* Focus management */ +*:focus-visible { + outline: 3px solid var(--secondary); + outline-offset: 2px; +} + +/* Screen reader only */ +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Page headings — used in gallery pages */ +main h2 { + font-size: clamp(1.5rem, 4vw, 2.25rem); + font-weight: 700; + letter-spacing: -0.02em; + color: var(--text-primary); + margin-bottom: 2rem; + text-align: center; + position: relative; + padding-bottom: 1rem; +} + +main h2::after { + content: ''; + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + width: 60px; + height: 4px; + background: linear-gradient(90deg, var(--primary), var(--secondary)); + border-radius: 2px; +} + +/* Reduced motion preference */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..db032b7 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/pages/Archive.module.css b/src/pages/Archive.module.css new file mode 100644 index 0000000..425b9e1 --- /dev/null +++ b/src/pages/Archive.module.css @@ -0,0 +1,105 @@ +.disclaimer { + background-color: var(--disclaimer-bg, #f8f9fa); + border-left: 4px solid var(--disclaimer-border, #17a2b8); + padding: 1rem; + margin: 2rem 0; + border-radius: 4px; + color: var(--text-primary); +} + +.disclaimer a { + color: var(--disclaimer-link, #17a2b8); + text-decoration: none; +} + +.disclaimer a:hover { + text-decoration: underline; +} + +.disclaimer a:focus-visible { + outline: 3px solid var(--primary); + outline-offset: 2px; +} + +.pagination { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + margin: 2rem 0; + text-align: center; +} + +.pageInfo { + color: var(--text-secondary, #666); + font-size: 0.9rem; +} + +.pageButtons { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + justify-content: center; +} + +.pageButton { + padding: 0.5rem 1rem; + border: 1px solid var(--primary); + border-radius: 50px; + color: var(--primary); + background: transparent; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.pageButton:hover:not(:disabled) { + background: linear-gradient(135deg, var(--primary), var(--secondary)); + border-color: var(--secondary); + color: white; + box-shadow: 0 4px 15px var(--primary-shadow); +} + +.pageButton:disabled { + opacity: 0.4; + cursor: not-allowed; + color: var(--text-secondary, #666); + border-color: var(--text-secondary, #666); +} + +.pageButton:focus-visible { + outline: 3px solid var(--primary); + outline-offset: 2px; +} + +.pageButton.current { + background: var(--primary); + color: white; + border-color: var(--primary); +} + +/* ── Responsive ── */ + +@media (max-width: 480px) { + .pageButton { + padding: 0.4rem 0.75rem; + font-size: 0.85rem; + min-width: 44px; + min-height: 44px; + } + + .pagination { + margin: 1.5rem 0; + } + + .disclaimer { + padding: 0.75rem; + margin: 1rem 0; + font-size: 0.9rem; + } +} + +@media (prefers-reduced-motion: reduce) { + .pageButton { + transition: none; + } +} diff --git a/src/pages/Archive.tsx b/src/pages/Archive.tsx new file mode 100644 index 0000000..63fd221 --- /dev/null +++ b/src/pages/Archive.tsx @@ -0,0 +1,164 @@ +import { useState, useCallback, useMemo } from 'react'; +import { useSearchParams } from 'react-router-dom'; +import { Helmet } from 'react-helmet-async'; +import WallpaperGrid from '../components/WallpaperGrid'; +import PreviewModal from '../components/PreviewModal'; +import DownloadOptions from '../components/DownloadOptions'; +import manifest from '../data/wallpaper-manifest.json'; +import styles from './Archive.module.css'; + +const ITEMS_PER_PAGE = 30; +const TOTAL_ITEMS = manifest.archive.totalItems; +const TOTAL_PAGES = Math.ceil(TOTAL_ITEMS / ITEMS_PER_PAGE); + +function Archive() { + const [searchParams, setSearchParams] = useSearchParams(); + const currentPage = Math.max(1, Math.min(TOTAL_PAGES, Number(searchParams.get('page')) || 1)); + const [selectedIndex, setSelectedIndex] = useState(null); + + const pageImages = useMemo(() => { + const offset = (currentPage - 1) * ITEMS_PER_PAGE; + const end = Math.min(offset + ITEMS_PER_PAGE, TOTAL_ITEMS); + return Array.from({ length: end - offset }, (_, i) => { + const num = offset + i + 1; + return String(num).padStart(3, '0') + '.jpg'; + }); + }, [currentPage]); + + const globalIndex = selectedIndex !== null + ? (currentPage - 1) * ITEMS_PER_PAGE + selectedIndex + : null; + + const currentImage = globalIndex !== null + ? String(globalIndex + 1).padStart(3, '0') + '.jpg' + : ''; + + const handleImageClick = useCallback((_image: string, index: number) => { + setSelectedIndex(index); + }, []); + + const handlePrevious = useCallback(() => { + setSelectedIndex((prev) => { + if (prev === null) return null; + const gi = (currentPage - 1) * ITEMS_PER_PAGE + prev; + if (gi > 0) { + const newGi = gi - 1; + const newPage = Math.floor(newGi / ITEMS_PER_PAGE) + 1; + if (newPage !== currentPage) { + setSearchParams({ page: String(newPage) }, { replace: true }); + return newGi - (newPage - 1) * ITEMS_PER_PAGE; + } + return prev - 1; + } + return prev; + }); + }, [currentPage, setSearchParams]); + + const handleNext = useCallback(() => { + setSelectedIndex((prev) => { + if (prev === null) return null; + const gi = (currentPage - 1) * ITEMS_PER_PAGE + prev; + if (gi < TOTAL_ITEMS - 1) { + const newGi = gi + 1; + const newPage = Math.floor(newGi / ITEMS_PER_PAGE) + 1; + if (newPage !== currentPage) { + setSearchParams({ page: String(newPage) }, { replace: true }); + return newGi - (newPage - 1) * ITEMS_PER_PAGE; + } + return prev + 1; + } + return prev; + }); + }, [currentPage, setSearchParams]); + + const goToPage = useCallback((page: number) => { + setSearchParams(page === 1 ? {} : { page: String(page) }); + window.scrollTo(0, 0); + }, [setSearchParams]); + + return ( + <> + + Community Archive - Visual Studio Wallpapers + + +
+

+ Disclaimer: These wallpapers come from the non-Microsoft affiliated{' '} + + VS2010 Wallpapers Blog + {' '} + run by Scott Hanselman. This is an archived collection preserved for historical purposes. +

+
+ + + + + + setSelectedIndex(null)} + imageSrc={`${import.meta.env.BASE_URL}${manifest.archive.fullPath}/${currentImage}`} + imageAlt={`Archive wallpaper ${currentImage.split('.')[0]}`} + onPrevious={handlePrevious} + onNext={handleNext} + > + + + + ); +} + +export default Archive; diff --git a/src/pages/Desktop.tsx b/src/pages/Desktop.tsx new file mode 100644 index 0000000..911b9fc --- /dev/null +++ b/src/pages/Desktop.tsx @@ -0,0 +1,58 @@ +import { useState, useCallback } from 'react'; +import { Helmet } from 'react-helmet-async'; +import WallpaperGrid from '../components/WallpaperGrid'; +import PreviewModal from '../components/PreviewModal'; +import DownloadOptions from '../components/DownloadOptions'; +import manifest from '../data/wallpaper-manifest.json'; +import { sizes } from '../data/sizes'; + +function Desktop() { + const [selectedIndex, setSelectedIndex] = useState(null); + const images = manifest.desktop.images; + const currentImage = selectedIndex !== null ? images[selectedIndex] : ''; + + const handlePrevious = useCallback(() => { + setSelectedIndex((prev) => + prev !== null ? (prev - 1 + images.length) % images.length : null + ); + }, [images.length]); + + const handleNext = useCallback(() => { + setSelectedIndex((prev) => + prev !== null ? (prev + 1) % images.length : null + ); + }, [images.length]); + + return ( + <> + + Desktop Wallpapers - Visual Studio Wallpapers + +

Desktop Wallpapers

+ setSelectedIndex(index)} + deviceType="desktop" + altPrefix="Desktop wallpaper" + /> + setSelectedIndex(null)} + imageSrc={`${import.meta.env.BASE_URL}wallpapers/desktop/1920x1080/${currentImage}`} + imageAlt={`Desktop wallpaper ${currentImage?.split('.')[0]}`} + onPrevious={handlePrevious} + onNext={handleNext} + > + + + + ); +} + +export default Desktop; diff --git a/src/pages/Home.module.css b/src/pages/Home.module.css new file mode 100644 index 0000000..0b928c3 --- /dev/null +++ b/src/pages/Home.module.css @@ -0,0 +1,203 @@ +.hero { + text-align: center; + padding: 1rem 0 2rem; +} + +.heroSubtitle { + color: var(--text-secondary); + font-size: 1.1rem; + margin-top: -1rem; + margin-bottom: 2.5rem; + font-weight: 400; +} + +.deviceGrid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2.5rem; + padding: 1rem; + max-width: 1200px; + margin: 0 auto; +} + +.deviceCard { + position: relative; + border-radius: 24px; + overflow: hidden; + background: var(--card-bg); + box-shadow: 0 10px 40px var(--shadow-color), 0 2px 10px var(--shadow-color); + transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); + border: 1px solid var(--card-border, rgba(255, 255, 255, 0.8)); + color: inherit; + text-decoration: none; + display: block; +} + +.deviceCard:hover { + transform: translateY(-8px) scale(1.02); + box-shadow: 0 25px 60px var(--shadow-color), 0 10px 30px var(--shadow-color); + border-color: var(--card-border-hover, rgba(0, 0, 0, 0.15)); +} + +.deviceCard:focus-visible { + outline: 3px solid var(--primary, #68217a); + outline-offset: 2px; +} + +.imageContainer { + width: 100%; + aspect-ratio: 16/10; + overflow: hidden; + position: relative; +} + +.imageContainer img { + width: 100%; + height: 100%; + object-fit: cover; + object-position: center; + transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); +} + +.deviceCard:hover .imageContainer img { + transform: scale(1.1); +} + +.cardOverlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, var(--primary-overlay) 0%, var(--secondary) 100%); + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1); +} + +.deviceCard:hover .cardOverlay { + opacity: 1; +} + +.viewBtn { + color: white; + font-weight: 600; + font-size: 1.1rem; + padding: 0.75rem 1.5rem; + background: rgba(255, 255, 255, 0.2); + border-radius: 50px; + backdrop-filter: blur(10px); + transform: translateY(20px); + transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); +} + +.deviceCard:hover .viewBtn { + transform: translateY(0); +} + +.cardContent { + padding: 1.5rem; + text-align: center; +} + +.cardContent h3 { + font-size: 1.25rem; + font-weight: 600; + letter-spacing: -0.02em; + color: var(--text-primary); + margin-bottom: 0.25rem; +} + +.deviceIcon { + font-size: 2rem; + margin: 0.5rem 0; +} + +.hint { + color: var(--text-secondary); + font-size: 0.9rem; + opacity: 0.8; +} + +.archiveLink { + text-align: center; + margin-top: 4rem; + padding-bottom: 2rem; +} + +.archiveLink a { + color: var(--text-secondary); + text-decoration: none; + font-size: 1rem; + font-weight: 500; + padding: 0.75rem 1.5rem; + border-radius: 50px; + border: 2px solid var(--archive-border); + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + display: inline-block; +} + +.archiveLink a:hover { + border-color: var(--primary); + color: var(--primary); + background: var(--archive-hover-bg); + transform: translateY(-2px); +} + +.archiveLink a:focus-visible { + outline: 3px solid var(--primary, #68217a); + outline-offset: 2px; +} + +/* ── Responsive ── */ + +@media (max-width: 480px) { + .deviceGrid { + grid-template-columns: 1fr; + gap: 1.5rem; + padding: 0.5rem; + } + + .cardContent { + padding: 1rem; + } + + .heroSubtitle { + font-size: 0.95rem; + } + + .archiveLink { + margin-top: 2rem; + } +} + +@media (max-width: 767px) { + .deviceGrid { + gap: 1.5rem; + } +} + +@media (prefers-reduced-motion: reduce) { + .deviceCard, + .deviceCard:hover, + .imageContainer img, + .cardOverlay, + .viewBtn { + transition: none; + transform: none; + } + + .deviceCard:hover .cardOverlay { + opacity: 1; + } + + .deviceCard:hover .imageContainer img { + transform: none; + } + + .archiveLink a { + transition: none; + } +} diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx new file mode 100644 index 0000000..77fb202 --- /dev/null +++ b/src/pages/Home.tsx @@ -0,0 +1,87 @@ +import { Link } from 'react-router-dom'; +import { Helmet } from 'react-helmet-async'; +import styles from './Home.module.css'; + +const base = import.meta.env.BASE_URL; + +const devices = [ + { + to: '/desktop', + image: `${base}wallpapers/desktop/thumbnails/022.jpg`, + imageAlt: 'Preview of desktop wallpapers collection', + ariaLabel: 'Browse desktop wallpapers', + title: 'Desktop Wallpapers', + icon: '🖥️', + hint: '4K, Ultrawide & more', + }, + { + to: '/phone', + image: `${base}wallpapers/phone/320x568/023.jpg`, + imageAlt: 'Preview of phone wallpapers collection', + ariaLabel: 'Browse phone wallpapers', + title: 'Phone Wallpapers', + icon: '📱', + hint: 'iPhone & Android sizes', + }, + { + to: '/watch', + image: `${base}wallpapers/watch/368x448/024.jpg`, + imageAlt: 'Preview of watch wallpapers collection', + ariaLabel: 'Browse watch wallpapers', + title: 'Watch Wallpapers', + icon: '⌚', + hint: 'Apple Watch & more', + }, +] as const; + +function Home() { + return ( + <> + + Home - Visual Studio Wallpapers + + + +
+

Choose Your Device

+

Beautiful wallpapers crafted for every screen

+ +
+ {devices.map((d) => ( + +
+ {d.imageAlt} +
+ View Collection → +
+
+
+

{d.title}

+

{d.icon}

+ +
+ + ))} +
+
+ +
+ + ✨ Explore the Community Archives + +
+ + ); +} + +export default Home; diff --git a/src/pages/Phone.tsx b/src/pages/Phone.tsx new file mode 100644 index 0000000..a3092c3 --- /dev/null +++ b/src/pages/Phone.tsx @@ -0,0 +1,58 @@ +import { useState, useCallback } from 'react'; +import { Helmet } from 'react-helmet-async'; +import WallpaperGrid from '../components/WallpaperGrid'; +import PreviewModal from '../components/PreviewModal'; +import DownloadOptions from '../components/DownloadOptions'; +import manifest from '../data/wallpaper-manifest.json'; +import { sizes } from '../data/sizes'; + +function Phone() { + const [selectedIndex, setSelectedIndex] = useState(null); + const images = manifest.phone.images; + const currentImage = selectedIndex !== null ? images[selectedIndex] : ''; + + const handlePrevious = useCallback(() => { + setSelectedIndex((prev) => + prev !== null ? (prev - 1 + images.length) % images.length : null + ); + }, [images.length]); + + const handleNext = useCallback(() => { + setSelectedIndex((prev) => + prev !== null ? (prev + 1) % images.length : null + ); + }, [images.length]); + + return ( + <> + + Phone Wallpapers - Visual Studio Wallpapers + +

Phone Wallpapers

+ setSelectedIndex(index)} + deviceType="phone" + altPrefix="Phone wallpaper" + /> + setSelectedIndex(null)} + imageSrc={`${import.meta.env.BASE_URL}wallpapers/phone/430x932/${currentImage}`} + imageAlt={`Phone wallpaper ${currentImage?.split('.')[0]}`} + onPrevious={handlePrevious} + onNext={handleNext} + > + + + + ); +} + +export default Phone; diff --git a/src/pages/SweepstakesRules.module.css b/src/pages/SweepstakesRules.module.css new file mode 100644 index 0000000..0fb165c --- /dev/null +++ b/src/pages/SweepstakesRules.module.css @@ -0,0 +1,160 @@ +.rules { + max-width: 800px; + margin: 0 auto; + padding: 2rem 1.5rem; + line-height: 1.7; +} + +.rules h1 { + font-size: 2rem; + font-weight: 800; + margin-bottom: 1.5rem; + color: var(--text-primary); +} + +.rules h2 { + font-size: 1.5rem; + font-weight: 700; + margin-top: 2rem; + margin-bottom: 1rem; + color: var(--text-primary); +} + +.rules h3 { + font-size: 1.25rem; + font-weight: 600; + margin-top: 1.5rem; + margin-bottom: 0.75rem; + color: var(--text-primary); +} + +.rules p { + margin-bottom: 1rem; + color: var(--text-secondary); +} + +.rules ul, +.rules ol { + margin-bottom: 1rem; + padding-left: 1.5rem; +} + +.rules li { + margin-bottom: 0.5rem; + color: var(--text-secondary); +} + +.rules a { + color: var(--primary); + text-decoration: underline; + text-underline-offset: 2px; +} + +.rules a:hover { + color: var(--secondary); +} + +.rules a:focus-visible { + outline: 3px solid var(--primary); + outline-offset: 2px; +} + +.tableWrapper:focus-visible { + outline: 3px solid var(--primary); + outline-offset: 2px; +} + +.rules table { + width: 100%; + border-collapse: collapse; + margin-bottom: 1.5rem; + font-size: 0.95rem; +} + +.rules th, +.rules td { + padding: 0.75rem 1rem; + border: 1px solid var(--glass-border, rgba(0, 0, 0, 0.1)); + text-align: left; +} + +.rules th { + background: var(--primary); + color: #fff; + font-weight: 600; +} + +.rules tr:nth-child(even) { + background: var(--glass-bg, rgba(0, 0, 0, 0.03)); +} + +.rules blockquote { + border-left: 4px solid var(--primary); + padding: 0.75rem 1rem; + margin: 1rem 0; + background: var(--glass-bg, rgba(0, 0, 0, 0.02)); + color: var(--text-secondary); +} + +.rules hr { + border: none; + border-top: 1px solid var(--glass-border, rgba(0, 0, 0, 0.1)); + margin: 2rem 0; +} + +/* ── Table scroll wrapper ── */ + +.tableWrapper { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + margin-bottom: 1.5rem; +} + +.tableWrapper table { + margin-bottom: 0; +} + +@media (max-width: 600px) { + .rules { + padding: 1.5rem 1rem; + } + + .rules h1 { + font-size: 1.5rem; + } + + .rules h2 { + font-size: 1.25rem; + } + + .rules h3 { + font-size: 1.1rem; + } + + .rules table { + font-size: 0.85rem; + min-width: 500px; + } + + .rules th, + .rules td { + padding: 0.5rem 0.625rem; + } + + .rules ul, + .rules ol { + padding-left: 1.25rem; + } +} + +@media (max-width: 480px) { + .rules { + padding: 1rem 0.75rem; + } +} + +@media (prefers-reduced-motion: reduce) { + .rules a { + transition: none; + } +} diff --git a/src/pages/SweepstakesRules.tsx b/src/pages/SweepstakesRules.tsx new file mode 100644 index 0000000..71bbadb --- /dev/null +++ b/src/pages/SweepstakesRules.tsx @@ -0,0 +1,36 @@ +import { useState, useEffect } from 'react'; +import { Helmet } from 'react-helmet-async'; +import Markdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import styles from './SweepstakesRules.module.css'; + +export default function SweepstakesRules() { + const [content, setContent] = useState(''); + + useEffect(() => { + fetch(`${import.meta.env.BASE_URL}sweepstakesrules/sweepstakesrules.md`) + .then(res => res.text()) + .then(setContent) + .catch(() => setContent('# Error\nFailed to load sweepstakes rules.')); + }, []); + + return ( + <> + Sweepstakes Rules - Visual Studio Wallpapers +
+ ( +
+ {children}
+
+ ), + }} + > + {content} +
+
+ + ); +} diff --git a/src/pages/Watch.tsx b/src/pages/Watch.tsx new file mode 100644 index 0000000..531a867 --- /dev/null +++ b/src/pages/Watch.tsx @@ -0,0 +1,58 @@ +import { useState, useCallback } from 'react'; +import { Helmet } from 'react-helmet-async'; +import WallpaperGrid from '../components/WallpaperGrid'; +import PreviewModal from '../components/PreviewModal'; +import DownloadOptions from '../components/DownloadOptions'; +import manifest from '../data/wallpaper-manifest.json'; +import { sizes } from '../data/sizes'; + +function Watch() { + const [selectedIndex, setSelectedIndex] = useState(null); + const images = manifest.watch.images; + const currentImage = selectedIndex !== null ? images[selectedIndex] : ''; + + const handlePrevious = useCallback(() => { + setSelectedIndex((prev) => + prev !== null ? (prev - 1 + images.length) % images.length : null + ); + }, [images.length]); + + const handleNext = useCallback(() => { + setSelectedIndex((prev) => + prev !== null ? (prev + 1) % images.length : null + ); + }, [images.length]); + + return ( + <> + + Watch Wallpapers - Visual Studio Wallpapers + +

Watch Wallpapers

+ setSelectedIndex(index)} + deviceType="watch" + altPrefix="Watch wallpaper" + /> + setSelectedIndex(null)} + imageSrc={`${import.meta.env.BASE_URL}wallpapers/watch/368x448/${currentImage}`} + imageAlt={`Watch wallpaper ${currentImage?.split('.')[0]}`} + onPrevious={handlePrevious} + onNext={handleNext} + > + + + + ); +} + +export default Watch; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..a799998 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..5906679 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..9c27dc5 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + base: '/', + plugins: [react()], +}) diff --git a/watch.html b/watch.html deleted file mode 100644 index 7424c89..0000000 --- a/watch.html +++ /dev/null @@ -1,431 +0,0 @@ ---- -layout: default -title: Watch Wallpapers -social_image: /wallpapers/watch/368x448/024.jpg -social_image_alt: Watch wallpaper from Visual Studio wallpapers collection ---- - -

Watch Wallpapers

- -
- {% assign all_images = site.static_files | where: "extname", ".jpg" %} - {% assign watch_images = "" | split: "" %} - {% for image in all_images %} - {% if image.path contains 'wallpapers/watch/368x448' %} - {% assign watch_images = watch_images | push: image %} - {% endif %} - {% endfor %} - {% assign watch_images = watch_images | sort: "basename" | reverse %} - {% for image in watch_images %} -
-
- Wallpaper {{ image.basename }} -
-
- Click to preview -
-
- {% endfor %} -
- - - - - -