diff --git a/.github/workflows/lighthouse-pr.yml b/.github/workflows/lighthouse-pr.yml index 75adc26..cfe68dc 100644 --- a/.github/workflows/lighthouse-pr.yml +++ b/.github/workflows/lighthouse-pr.yml @@ -21,7 +21,7 @@ jobs: uses: actions/checkout@v4 - name: Install Flox - uses: flox/install-flox-action@v1 + uses: flox/install-flox-action@v2 - name: Activate Flox environment run: flox activate @@ -54,10 +54,20 @@ jobs: rm .server.pid fi + - name: Save base branch Lighthouse report + run: | + # Move the base report to /tmp so it persists across checkouts + mv lighthouse-base.json /tmp/lighthouse-base.json + # Test PR branch - name: Checkout PR branch uses: actions/checkout@v4 + - name: Restore base branch Lighthouse report + run: | + # Move the base report back to the working directory + mv /tmp/lighthouse-base.json lighthouse-base.json + - name: Start dev server for PR branch run: | flox activate -- livereload --port 8888 > /dev/null 2>&1 & diff --git a/.gitignore b/.gitignore index dc2529b..e7a7adb 100644 --- a/.gitignore +++ b/.gitignore @@ -4,13 +4,7 @@ result /TODO.md # Lighthouse reports -lighthouse-report.html -lighthouse-report.json -lighthouse-report-full.html -lighthouse-report-full.json -lighthouse-mobile.html -lighthouse-mobile.json -lighthouse-perf.json +/lighthouse-* # Just recipes temp files .server.pid diff --git a/CLAUDE.md b/CLAUDE.md index 3fcb7bf..3b5317c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ ## Project Overview -This is a single-page website for Planet Nix, built with simplicity in mind - no build steps required. Optimized for performance with a Lighthouse score of 84/100. +This is a single-page website for Planet Nix, built with simplicity in mind - no build steps required. Optimized for performance with a Lighthouse score of 91/100. ## Technology Stack @@ -32,11 +32,10 @@ This is a single-page website for Planet Nix, built with simplicity in mind - no ``` planetnix-website/ -├── index.html # Main single-page website file +├── index.html # Main single-page website (with inlined CSS) ├── assets/ # All website resources │ ├── css/ -│ │ ├── pico.min.css # Pico CSS framework -│ │ └── style.css # Custom styles +│ │ └── pico.min.css # Pico CSS framework │ ├── fonts/ # Local fonts (Geist, Geist Mono) │ ├── images/ # Optimized images (76.6% size reduction) │ └── js/ # JavaScript files (if needed) @@ -50,8 +49,8 @@ planetnix-website/ ### Assets Folder All extra resources needed for the website should be placed in the `assets/` folder: -- **assets/css/** - CSS stylesheets (Pico CSS + custom styles) -- **assets/fonts/** - Local font files (Geist, Geist Mono) +- **assets/css/** - CSS stylesheets (Pico CSS only; custom styles are inlined in index.html for performance) +- **assets/fonts/** - Local font files (Geist 400/700, Geist Mono 400 - only critical weights) - **assets/images/** - Optimized images, icons, logos, and graphics - All images optimized using pngquant and optipng - Lazy loading for below-the-fold images @@ -76,14 +75,15 @@ just dev **Important**: All `just` commands must be run within the Flox environment using `flox activate --`: ```bash -flox activate -- just # List all available commands -flox activate -- just dev # Start development server -flox activate -- just perf # Quick performance check (84/100 current) -flox activate -- just lighthouse # Full performance audit with HTML report -flox activate -- just lighthouse-mobile # Mobile performance test -flox activate -- just optimize-images # Re-optimize images -flox activate -- just clean # Remove generated reports -flox activate -- just info # Show environment info +flox activate -- just # List all available commands +flox activate -- just dev # Start development server +flox activate -- just perf # Quick performance check (91/100 current) +flox activate -- just lighthouse # Full performance audit with HTML report +flox activate -- just lighthouse-mobile # Mobile performance test +flox activate -- just optimize-images # Re-optimize all PNG images +flox activate -- just generate-responsive-images # Create responsive image sizes (480w, 768w, 1024w) +flox activate -- just clean # Remove generated reports +flox activate -- just info # Show environment info ``` Alternatively, activate the Flox shell first, then run just commands directly: @@ -121,7 +121,8 @@ just perf - **Performance first**: Every optimization counts - Images: 2.3 MB → 556 KB (76.6% reduction) - Initial load: Only 139 KB of images (lazy loading) - - Lighthouse score: 84/100 and improving + - CSS inlined: Custom styles inlined to eliminate render-blocking requests + - Lighthouse score: 91/100 - **Reproducible environment**: Flox ensures consistent setup across machines - **Automated quality**: CI/CD prevents performance regressions @@ -129,9 +130,25 @@ just perf ### Implemented - ✅ **Image optimization**: pngquant + optipng (76.6% size reduction) +- ✅ **Responsive images**: Multiple sizes (480w, 768w, 1024w, 1280w) for adaptive loading + - **Why responsive?** Saves 142 KB on mobile by serving appropriately sized images + - Background images use `srcset` to load optimal size based on viewport + - Generated using `just generate-responsive-images` command + - Smaller images for mobile (480w: ~15KB) vs desktop (1280w: ~100KB) - ✅ **Lazy loading**: Below-the-fold images load on demand -- ✅ **Local fonts**: Geist and Geist Mono with font-display: swap -- ✅ **Minimal CSS**: Pico CSS is only 22 KB minified +- ✅ **Explicit image dimensions**: All images have width/height attributes + - **Why?** Prevents layout shift (CLS) during page load + - CSS ensures responsiveness: `max-width: 100%; height: auto;` + - Browser calculates aspect ratio from dimensions, CSS controls display size +- ✅ **CSS inlining**: Custom styles (11.4 KB) inlined in HTML to eliminate render-blocking request + - **Why inlined?** Eliminates 700ms render-blocking network request, improves FCP and LCP + - Pico CSS (22 KB) remains external as it's cached and essential for semantic styling +- ✅ **Font optimization**: Only critical font weights loaded (Geist 400/700, Geist Mono 400) + - Reduced from 18 font files to 3, eliminating 100+ KB of unused fonts + - Preloaded with `fetchpriority="high"` for faster discovery + - Using `font-display: swap` to prevent invisible text +- ✅ **LCP optimization**: Hero moon image with `fetchpriority="high"` and preload hint +- ✅ **Zero layout shift (CLS: 0)**: Inline CSS + explicit image dimensions prevent FOUC - ✅ **Semantic HTML**: No unnecessary divs or classes ### Monitoring diff --git a/Justfile b/Justfile index 715f392..46c0189 100644 --- a/Justfile +++ b/Justfile @@ -36,8 +36,11 @@ # - Stop server when done # # Image Optimization: -# just optimize-images - Optimize all PNG images in assets/images/ -# Uses pngquant (65-80% quality) + optipng +# just optimize-images - Optimize all PNG images in assets/images/ +# Uses pngquant (65-80% quality) + optipng +# just generate-responsive-images - Generate 480w, 768w, 1024w versions of +# background images for responsive loading +# Creates WebP versions optimized for mobile # # Utilities: # just info - Show Flox environment information @@ -167,6 +170,40 @@ optimize-images: done @echo "✅ Image optimization complete" +# Generate responsive image sizes for background images +# Creates 480w, 768w, and 1024w versions of specified images for responsive loading +# Original 1280w images are preserved +generate-responsive-images: + @echo "🖼️ Generating responsive image sizes..." + @cd assets/images && \ + for img in location-bg about-bg; do \ + echo " Processing $${img}..."; \ + if [ -f "$${img}.png" ]; then \ + echo " Creating 480w version..."; \ + sips -z 320 480 "$${img}.png" --out "$${img}-480w.png" > /dev/null 2>&1; \ + echo " Creating 768w version..."; \ + sips -z 512 768 "$${img}.png" --out "$${img}-768w.png" > /dev/null 2>&1; \ + echo " Creating 1024w version..."; \ + sips -z 682 1024 "$${img}.png" --out "$${img}-1024w.png" > /dev/null 2>&1; \ + else \ + echo " ⚠️ $${img}.png not found, skipping"; \ + fi; \ + done && \ + echo " Optimizing resized PNGs..." && \ + just optimize-images > /dev/null && \ + echo " Converting to WebP..." && \ + for img in location-bg about-bg; do \ + for size in 480 768 1024; do \ + if [ -f "$${img}-$${size}w.png" ]; then \ + flox activate -- cwebp -q 90 "$${img}-$${size}w.png" -o "$${img}-$${size}w.webp" 2>&1 | grep -E "(Saving|Output)" || true; \ + fi; \ + done; \ + done + @echo "✅ Responsive images generated" + @echo "" + @echo "📊 File sizes created:" + @cd assets/images && ls -lh *-{480,768,1024}w.webp 2>/dev/null || echo "No responsive images found" + # Show current environment info info: @echo "📦 Environment Information:" diff --git a/README.md b/README.md index eaf8609..25cac01 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A beautifully simple, single-page website built with modern web standards and optimized for performance. No build steps, no complex tooling - just clean HTML, elegant CSS, and lightning-fast load times. -[]() +[]() []() ## ✨ What Makes This Special @@ -66,7 +66,8 @@ just lighthouse-mobile # Test mobile performance just perf # Quick performance score check # Image Optimization -just optimize-images # Optimize all PNG images +just optimize-images # Optimize all PNG images +just generate-responsive-images # Create responsive sizes (480w, 768w, 1024w) # Utilities just clean # Remove generated reports @@ -76,12 +77,11 @@ just clean # Remove generated reports ``` planetnix-website/ -├── index.html # Main single-page website +├── index.html # Main single-page website (with inlined CSS) ├── assets/ │ ├── css/ -│ │ ├── pico.min.css # Pico CSS framework -│ │ └── style.css # Custom styles -│ ├── fonts/ # Local fonts (Geist, Geist Mono) +│ │ └── pico.min.css # Pico CSS framework +│ ├── fonts/ # Local fonts (Geist 400/700, Geist Mono 400) │ ├── images/ # Optimized images and icons │ └── js/ # JavaScript (if needed) ├── Justfile # Command runner recipes @@ -100,11 +100,28 @@ planetnix-website/ ## 🏎️ Performance -We take performance seriously: - -- **Images**: Optimized from 2.3 MB → 556 KB (76.6% reduction) -- **Initial Load**: Only 139 KB of images load initially (lazy loading) -- **Lighthouse Score**: 84/100 and improving +We take performance seriously. Here's what we've optimized: + +### 📊 Lighthouse Score: **91/100** + +### Optimizations Applied +- **Images**: Optimized from 2.3 MB → 556 KB (76.6% reduction using pngquant + optipng) +- **Responsive Images**: Multiple sizes (480w, 768w, 1024w, 1280w) for adaptive loading + - **Why?** Saves 142 KB on mobile by serving appropriately sized images + - Mobile devices load small versions (~15KB) instead of full-size (~100KB) + - Regenerate with: `just generate-responsive-images` +- **Initial Load**: Only 139 KB of images load initially (lazy loading for below-the-fold content) +- **Explicit Image Dimensions**: All images have width/height to prevent layout shift + - **Why?** CLS score of 0 (perfect!) - no content jumping during load + - Remains fully responsive with CSS: `max-width: 100%; height: auto;` +- **CSS Inlining**: Custom styles (11.4 KB) inlined in HTML + - **Why?** Eliminates 700ms render-blocking network request + - Pico CSS remains external for caching benefits +- **Font Optimization**: Only 3 critical font weights loaded (Geist 400/700, Geist Mono 400) + - Reduced from 18 font files to 3, eliminating 100+ KB of unused fonts + - Preloaded with `fetchpriority="high"` for instant discovery +- **LCP Optimization**: Hero image prioritized with `fetchpriority="high"` and preload +- **Zero Layout Shift (CLS: 0)**: Inline CSS + explicit image dimensions prevent FOUC - **CI/CD**: Automated performance testing on every PR ## 🤝 Contributing diff --git a/assets/css/style.css b/assets/css/style.css deleted file mode 100644 index 1fb4ce2..0000000 --- a/assets/css/style.css +++ /dev/null @@ -1,644 +0,0 @@ -/* Font Faces */ - -@font-face { - font-family: 'Geist'; - font-style: normal; - font-weight: 100; - font-display: swap; - src: url(../fonts/Geist-100.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist'; - font-style: normal; - font-weight: 200; - font-display: swap; - src: url(../fonts/Geist-200.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: url(../fonts/Geist-300.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(../fonts/Geist-400.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url(../fonts/Geist-500.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist'; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url(../fonts/Geist-600.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url(../fonts/Geist-700.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist'; - font-style: normal; - font-weight: 800; - font-display: swap; - src: url(../fonts/Geist-800.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist'; - font-style: normal; - font-weight: 900; - font-display: swap; - src: url(../fonts/Geist-900.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist Mono'; - font-style: normal; - font-weight: 100; - font-display: swap; - src: url(../fonts/GeistMono-100.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist Mono'; - font-style: normal; - font-weight: 200; - font-display: swap; - src: url(../fonts/GeistMono-100.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist Mono'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: url(../fonts/GeistMono-300.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist Mono'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url(../fonts/GeistMono-400.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist Mono'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url(../fonts/GeistMono-500.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist Mono'; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url(../fonts/GeistMono-600.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist Mono'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url(../fonts/GeistMono-700.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist Mono'; - font-style: normal; - font-weight: 800; - font-display: swap; - src: url(../fonts/GeistMono-800.ttf) format('truetype'); -} -@font-face { - font-family: 'Geist Mono'; - font-style: normal; - font-weight: 900; - font-display: swap; - src: url(../fonts/GeistMono-900.ttf) format('truetype'); -} - -:root, -:host { - --pico-font-family-sans-serif: "Geist", sans-serif; - --pico-font-family-monospace: "geist mono", monospace; - --pico-color: #FFFFFF; -} - - -html { - scroll-behavior: smooth; -} - -body { - background: linear-gradient(to bottom, #1E1E1E 0%, #2E2E2E 50%, #1E1E1E 100%); - background-attachment: fixed; - min-height: 100vh; -} - -body > .container { - padding: 0; -} - -body > .container > .content { - background-color: #1B1B1B; - color: #FFFFFF; - min-height: 300px; - position: relative; -} - -.content-grid-bg { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-image: url(../images/grid.png), url(../images/grid.png); - background-position: left -202px top -35px, right -200px top -35px; - background-repeat: repeat-y, repeat-y; - z-index: 5; - display: block; -} - -/* Section */ -.section-title { - text-transform: uppercase; - font-size: 70px; - font-weight: bold; - text-align: center; - margin: 1em; - position: relative; - z-index: 10; -} - -@media (max-width: 768px) { - .section-title { - font-size: 60px; - } -} - -/* CFP Section */ -.cfp-section { - display: flex; - justify-content: center; - flex-direction: row; - font-family: var(--pico-font-family-monospace); - font-size: 18px; - gap: 2em; - height: 4em; - margin: 0; -} - -.cfp-callout { - line-height: 4em; - color: #FFFFFF; -} - -@media (max-width: 576px) { - .cfp-callout { - display: none; - } -} - -.cfp-button { - color: #FFD02B; - border: 1px solid #FFD02B; - padding: 0.5em 1em; - align-self: center; - text-decoration: none; -} -.cfp-button:hover { - background: #FFD02B; - color: #000000; -} - -/* Hero Section */ -.hero-section { - position: relative; - height: 467px; - margin: 0; -} - -.hero-planet { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - z-index: 1; - background: #000000; - display: flex; - justify-content: center; - align-items: end; - flex-direction: column; -} - -.hero-logo { - width: 100%; - height: 100%; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; -} - -.hero-logo > img { - z-index: 10; -} - -@media (max-width: 1024px) { - .hero-logo > img { - padding: 0 7%; - } -} -.hero-content { - position: absolute; - bottom: 0; - left: 0; - height: 100%; - width: 100%; - z-index: 5; - display: flex; - justify-content: end; - align-items: center; - flex-direction: column; - text-align: center; -} - -@media (max-width: 1024px) { - .hero-content { - padding: 0 7%; - } -} - -.hero-tagline { - color: #ffffff; - font-size: 40px; -} - -.hero-date { - color: #FFD02B; - margin-bottom: 50px; - font-family: var(--pico-font-family-monospace); - font-size: 18px; -} - -/* Signup Section */ -.signup-section { - height: 180px; - background: #000000; - background: linear-gradient( - 180deg, - rgba(0, 0, 0, 1) 0%, - rgba(27, 27, 27, 0.4) 80%, - rgba(27, 27, 27, 0) 100% - ); - z-index: 5; - position: relative; - display: flex; - justify-content: center; - align-items: center; -} - -.signup-button { - color: #FFFFFF; - background-color: #711AFF; - border: 1px solid #711AFF; - padding: 0.5em 1em; - align-self: center; - text-decoration: none; -} - -.signup-button:hover { - /* background-color: transparent; */ - /* color: #711AFF; */ - border-color: #FFF; -} - -/* Navigation Section */ -.navigation-section { - background-color: #000000; - justify-content: center; - position: sticky; - top: 0; - z-index: 100; - gap: 2em; - height: 60px; -} - -.navigation-section a { - text-decoration: none; - text-transform: uppercase; - color: #FFFFFF; - margin: 0 2em; - padding: 0; - font-size: 16px; - border-bottom: 1px solid #000; -} - -@media (max-width: 1024px) { - .navigation-section a { - margin: 0 0.2em; - } -} - -.navigation-section a:hover { - border-bottom: 1px solid #FFF; - border-radius: 0; -} - -/* About Section */ -.about-section { - position: relative; -} - -.about-bg { - position: absolute; - top: -3em; - left: 0; - width: 100%; -} - -.about-bg img { - width: 100%; -} - -.about-content { - font-size: 18px; - text-align: justify; - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin: 2em 19% 0 19%; - gap: 4em; - position: relative; - z-index: 10; -} - -@media (max-width: 1024px) { - .about-content { - margin: 2em 7% 0 7%; - flex-direction: column; - gap: 0; - } -} - -.about-content > * { - display: flex; - flex-direction: column; - flex-basis: 100%; - flex: 1; -} - -.about-content a { - display: contents; - color: #ffd02b; - text-decoration: none; -} - -.about-grid { - position: relative; - z-index: 10; - margin: 0 19%; - display: grid; - grid-template-columns: 50% 50%; - grid-template-rows: auto; -} - -@media (max-width: 1024px) { - .about-grid { - margin: 0 7%; - } -} - -.about-grid > div { - display: flex; - justify-content: start; - align-items: center; - flex-direction: column; - padding: 0 3em; - margin-top: 1em; - text-align: center; -} - -@media (max-width: 1024px) { - .about-grid > div { - padding: 0; - } -} - -.about-grid > div:last-child { - grid-area: 4 / 1 / 3 / 3; - width: 50%; - place-self: center; -} - -.about-grid h3 { - font-family: var(--pico-font-family-monospace); - font-size: 18px; - line-height: 1.5em; - margin-top: 1em; -} - -.about-content2 { - font-size: 18px; - text-align: justify; - display: flex; - flex-direction: column; - flex-wrap: wrap; - margin: 2em 19% 0 19%; - position: relative; - z-index: 10; -} - -@media (max-width: 1024px) { - .about-content { - margin: 2em 7% 0 7%; - } -} - -.about-content > * { - display: flex; - flex-direction: column; - flex-basis: 100%; - flex: 1; -} - -.about-content a { - display: contents; - color: #ffd02b; - text-decoration: none; -} - -/* Location Section */ -.location-section { - position: relative; - margin-top: 6em; -} - -.location-bg { - position: absolute; - top: -9em; - left: 0; - width: 100%; -} - -.location-bg img { - width: 100%; -} - -.location-content { - position: relative; - z-index: 10; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; - font-size: 32px; -} - -.location-date { - color: #ffd02b; - font-family: var(--pico-font-family-monospace); - margin: 0.5em; -} - -.location-signup { - font-size: 18px; - margin-top: 4em; -} - -/* Speakers Section */ - -.speakers-section { - margin-top: -4em; - padding-top: 4em; - padding-bottom: 4em; - position: relative; - background: #000000; - background: linear-gradient( - 0deg, - rgba(0, 0, 0, 0) 0%, - rgba(0, 0, 0, 0.4) 5%, - rgba(0, 0, 0, 1) 10% - ); -} - -.speakers-grid { - position: relative; - z-index: 10; - margin: 0 19%; - - display: grid; - grid-template-columns: 33% 33% 33%; - grid-template-rows: auto; -} - -@media (max-width: 1024px) { - .speakers-grid { - grid-template-columns: 50% 50%; - } -} - -@media (max-width: 768px) { - .speakers-grid { - grid-template-columns: 100%; - } -} - -.speakers-grid > div { - margin: 1.2em; -} - -.speakers-grid > div > h3 { - color: #711AFF; - font-size: 22px; - font-weight: bold; - line-height: 1.2em; - margin-top: 1em; - margin-bottom: 0.2em; -} -.speakers-grid > div > div { - font-size: 14px; -} - -/* FAQ Section */ -.faq-section { - margin: 2em 19% 0 19%; - padding-top: 4em; - position: relative; - z-index: 10; -} - -@media (max-width: 1024px) { - .faq-section { - margin: 2em 7% 0 7%; - } -} - -.faq-content { - position: relative; -} - -.faq-content a { - color: #ffd02b; - text-decoration: none; -} -.faq-content a:hover { - border-bottom: 1px solid #ffd02b; -} - -/* Footer */ -footer { - font-size: 16px; - height: 200px; - margin-top: 5em; - padding-top: 120px; - position: relative; - z-index: 10; - background: #000000; - background: linear-gradient( - 0deg, - rgba(0, 0, 0, 1) 70%, - rgba(0, 0, 0, 0.4) 80%, - rgba(0, 0, 0, 0) 100% - ); -} - -.footer-content { - display: flex; - flex-direction: row; - justify-content: space-between; - margin: 0 10%; - border-top: 1px solid #FFF; - padding: 0.5em; - line-height: 1.8em; -} - -@media (max-width: 768px) { - .footer-content { - flex-direction: column; - align-items: center; - margin-top: -2em; - } -} - -.footer-content a { - color: #ffd02b; - text-decoration: none; -} - -.footer-content a:hover { - border-bottom: 1px solid #ffd02b; - -} diff --git a/assets/images/about-bg-1024w.png b/assets/images/about-bg-1024w.png new file mode 100644 index 0000000..729e716 Binary files /dev/null and b/assets/images/about-bg-1024w.png differ diff --git a/assets/images/about-bg-1024w.webp b/assets/images/about-bg-1024w.webp new file mode 100644 index 0000000..7a3c736 Binary files /dev/null and b/assets/images/about-bg-1024w.webp differ diff --git a/assets/images/about-bg-480w.png b/assets/images/about-bg-480w.png new file mode 100644 index 0000000..06d526c Binary files /dev/null and b/assets/images/about-bg-480w.png differ diff --git a/assets/images/about-bg-480w.webp b/assets/images/about-bg-480w.webp new file mode 100644 index 0000000..ec9563a Binary files /dev/null and b/assets/images/about-bg-480w.webp differ diff --git a/assets/images/about-bg-768w.png b/assets/images/about-bg-768w.png new file mode 100644 index 0000000..a157207 Binary files /dev/null and b/assets/images/about-bg-768w.png differ diff --git a/assets/images/about-bg-768w.webp b/assets/images/about-bg-768w.webp new file mode 100644 index 0000000..8a219d3 Binary files /dev/null and b/assets/images/about-bg-768w.webp differ diff --git a/assets/images/location-bg-1024w.png b/assets/images/location-bg-1024w.png new file mode 100644 index 0000000..9dab474 Binary files /dev/null and b/assets/images/location-bg-1024w.png differ diff --git a/assets/images/location-bg-1024w.webp b/assets/images/location-bg-1024w.webp new file mode 100644 index 0000000..ed79453 Binary files /dev/null and b/assets/images/location-bg-1024w.webp differ diff --git a/assets/images/location-bg-480w.png b/assets/images/location-bg-480w.png new file mode 100644 index 0000000..a698e0c Binary files /dev/null and b/assets/images/location-bg-480w.png differ diff --git a/assets/images/location-bg-480w.webp b/assets/images/location-bg-480w.webp new file mode 100644 index 0000000..4426dc0 Binary files /dev/null and b/assets/images/location-bg-480w.webp differ diff --git a/assets/images/location-bg-768w.png b/assets/images/location-bg-768w.png new file mode 100644 index 0000000..e049a1e Binary files /dev/null and b/assets/images/location-bg-768w.png differ diff --git a/assets/images/location-bg-768w.webp b/assets/images/location-bg-768w.webp new file mode 100644 index 0000000..4c4e027 Binary files /dev/null and b/assets/images/location-bg-768w.webp differ diff --git a/index.html b/index.html index 80d48e7..e0ffcf7 100644 --- a/index.html +++ b/index.html @@ -13,17 +13,584 @@ - + + + + + + + + + - - - + + + +
@@ -39,11 +606,11 @@
+
+
+
+
+
+
+
+