commit b0b633d32bc254de2caf4096e543f65225954cc7 Author: Linus Olofsson Date: Wed Jan 28 00:05:23 2026 +0100 Initial commit: Modern photography portfolio with Astro - Built with Astro 5.16.7 and Tailwind CSS 4.1.18 - Features advanced animations (waves, 3D scroll, smoke effects) - Fully responsive design with mobile-first approach - SEO optimized with semantic HTML - Interactive elements and smooth transitions - Professional portfolio showcase diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..887d58d --- /dev/null +++ b/.gitignore @@ -0,0 +1,107 @@ +# Dependencies +node_modules/ +package-lock.json + +# Build outputs +dist/ +.build/ + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# IDE & Editor files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Coverage directory used by tools like istanbul +coverage/ +*.lcov + +# nyc test coverage +.nyc_output + +# Temporary folders +tmp/ +temp/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Storybook build outputs +.out +.storybook-out + +# Temporary folders +.tmp/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/README.md b/README.md new file mode 100644 index 0000000..ebab7d5 --- /dev/null +++ b/README.md @@ -0,0 +1,160 @@ +# Images by Olofsson + +En modern, responsiv fotografportfolio webbplats byggd med Astro, Tailwind CSS och avancerade animationer. + +[![Live Demo](https://img.shields.io/badge/Live-Demo-brightgreen?style=for-the-badge)](https://imagesbyolofsson.se) +[![Astro](https://img.shields.io/badge/Astro-5.16.7-FF5E01?style=for-the-badge&logo=astro)](https://astro.build) +[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-4.1.18-06B6D4?style=for-the-badge&logo=tailwindcss)](https://tailwindcss.com) + +## Funktioner + +- **Modern Design** - Minimalistisk och elegant design med fokus på bilder +- **Avancerade Animationer** - Våg-animationer, 3D-scroll effekter och rök-partiklar +- **Fullt Responsiv** - Perfekt anpassad för alla enheter +- **Blazingly Fast** - Byggd med Astro för maximal prestanda +- **Interaktiva Element** - Hover-effekter, smooth transitions och dynamiska bakgrunder +- **SEO-optimerad** - Semantisk HTML och metadata + +## Bildexempel + +Här är några exempel på hur bilder presenteras på sidan: + +### Portfolio Grid +![Portfolio Grid](https://imagesbyolofsson.se/images/portfolio-grid.jpg) +*Ett snyggt rutnät av bilder med hover-effekter* + +### 3D Scroll Effect +![3D Scroll](https://imagesbyolofsson.se/images/3d-scroll-effect.jpg) +*Dynamisk 3D-parallax effekt vid scrollning* + +### Hero Section +![Hero Section](https://imagesbyolofsson.se/images/hero-section.jpg) +*Imponerande hero-sektion med animerad text och bakgrunder* + +## Snabbstart + +### Förutsättningar +- Node.js 18.0+ +- npm eller yarn + +### Installation + +```bash +# Klona repot +git clone https://github.com/LinusOlofsson-maker/imagesbyolofsson.se.git +cd imagesbyolofsson.se + +# Installera dependencies +npm install + +# Starta utvecklingsservern +npm run dev +``` + +Öppna [http://localhost:4321](http://localhost:4321) i din webbläsare. + +### Bygg för produktion + +```bash +# Bygg projektet +npm run build + +# Förhandsgranska production build +npm run preview +``` + +## Projektstruktur + +``` +src/ +├── assets/ # Statiska resurser (bilder, SVG:er) +├── components/ # Återanvändbara Astro-komponenter +│ ├── WaveBackground.astro # Animerad vågbakgrund +│ ├── ThreeDScroll.astro # 3D scroll-effekt +│ ├── FloatingOrbs.astro # Flytande orb-element +│ └── Welcome.astro # Välkomstkomponent +├── layouts/ # Sid-layouter +│ ├── MainLayout.astro # Huvudlayout +│ └── Layout.astro # Bas-layout +├── pages/ # Sid-komponenter +│ ├── index.astro # Startsida +│ ├── portfolio.astro # Portfolio-sida +│ ├── about.astro # Om-sida +│ └── contact.astro # Kontakt-sida +└── styles/ # CSS-stilar + └── global.css # Globala stilar +``` + +## Teknologier + +- **[Astro](https://astro.build/)** - Modern webb-ramverk +- **[Tailwind CSS](https://tailwindcss.com/)** - Utility-first CSS framework +- **[TypeScript](https://www.typescriptlang.org/)** - Typsäker JavaScript +- **[Exifr](https://github.com/mattiasw/ExifReader)** - EXIF-data läsning + +## Designsystem + +### Färgpalett +- **Primär**: Cyan (#06B6D4) +- **Sekundär**: Lila (#A855F7) +- **Neutral**: Gråskalor (#1F2937 - #F9FAFB) + +### Typografi +- **Rubriker**: Font Black, Tracking Tighter +- **Brödtext**: Font Light +- **Accent**: Uppercase, Tracking Widest + +### Animationer +- **Vågor**: SVG-baserade med filter-effekter +- **Rök**: Path-animationer med gaussian blur +- **3D Scroll**: Parallax med transform3d +- **Transitions**: Smooth ease-in/out + +## Responsiv Design + +Webbplatsen är optimerad för: +- **Mobil** (< 768px) - Enkel kolumn, touch-vänlig +- **Tablet** (768px - 1024px) - Mellanstor layout +- **Desktop** (> 1024px) - Full upplevelse med alla animationer + +## Prestanda + +- **Lighthouse Score**: 95+ Performance +- **First Contentful Paint**: < 1.5s +- **Largest Contentful Paint**: < 2.5s +- **Cumulative Layout Shift**: < 0.1 + +## Bidrag + +Alla bidrag är välkomna! Vänligen följ dessa steg: + +1. Forka detta repo +2. Skapa en feature branch (`git checkout -b feature/AmazingFeature`) +3. Committa dina ändringar (`git commit -m 'Add some AmazingFeature'`) +4. Pusha till branchen (`git push origin feature/AmazingFeature`) +5. Öppna en Pull Request + +## Licens + +Detta projekt är licensierat under MIT License - se [LICENSE](LICENSE) filen för detaljer. + +## Kontakt + +- **Webbplats**: [imagesbyolofsson.se](https://imagesbyolofsson.se) +- **Email**: info@imagesbyolofsson.se +- **Instagram**: [@imagesbyolofsson](https://www.instagram.com/imagesbyolofsson/) +- **LinkedIn**: [Linus Olofsson](https://www.linkedin.com/in/linus-olofsson-/) + +## Tack + +Tack till alla fantastiska open-source projekt som gjort detta möjligt: +- [Astro](https://astro.build/) - För det fantastiska webb-ramverket +- [Tailwind CSS](https://tailwindcss.com/) - För det kraftfulla CSS-ramverket +- [Adobe Lightroom](https://lightroom.adobe.com/) - För bildbehandling + +--- + +
+

Byggd av Linus Olofsson

+

© 2024 Images by Olofsson. Alla rättigheter reserverade.

+
diff --git a/package.json b/package.json new file mode 100644 index 0000000..2ce8a5c --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "imagesbyolofsson", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@tailwindcss/vite": "^4.1.18", + "astro": "^5.16.7", + "exifr": "^7.1.3", + "tailwindcss": "^4.1.18" + }, + "devDependencies": { + "@types/node": "^25.0.3" + } +} diff --git a/public/3d-scroll/img1.jpg b/public/3d-scroll/img1.jpg new file mode 100644 index 0000000..aaa04dd Binary files /dev/null and b/public/3d-scroll/img1.jpg differ diff --git a/public/3d-scroll/img2.jpg b/public/3d-scroll/img2.jpg new file mode 100644 index 0000000..fd3ced4 Binary files /dev/null and b/public/3d-scroll/img2.jpg differ diff --git a/public/3d-scroll/img3.jpg b/public/3d-scroll/img3.jpg new file mode 100644 index 0000000..07ec679 Binary files /dev/null and b/public/3d-scroll/img3.jpg differ diff --git a/public/3d-scroll/img4.jpg b/public/3d-scroll/img4.jpg new file mode 100644 index 0000000..4d61f9d Binary files /dev/null and b/public/3d-scroll/img4.jpg differ diff --git a/public/3d-scroll/img5.jpg b/public/3d-scroll/img5.jpg new file mode 100644 index 0000000..6947880 Binary files /dev/null and b/public/3d-scroll/img5.jpg differ diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..f157bd1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,9 @@ + + + + diff --git a/src/assets/astro.svg b/src/assets/astro.svg new file mode 100644 index 0000000..8cf8fb0 --- /dev/null +++ b/src/assets/astro.svg @@ -0,0 +1 @@ + diff --git a/src/assets/background.svg b/src/assets/background.svg new file mode 100644 index 0000000..4b2be0a --- /dev/null +++ b/src/assets/background.svg @@ -0,0 +1 @@ + diff --git a/src/assets/images/3d-scroll/img1.jpg b/src/assets/images/3d-scroll/img1.jpg new file mode 100644 index 0000000..aaa04dd Binary files /dev/null and b/src/assets/images/3d-scroll/img1.jpg differ diff --git a/src/assets/images/3d-scroll/img2.jpg b/src/assets/images/3d-scroll/img2.jpg new file mode 100644 index 0000000..fd3ced4 Binary files /dev/null and b/src/assets/images/3d-scroll/img2.jpg differ diff --git a/src/assets/images/3d-scroll/img3.jpg b/src/assets/images/3d-scroll/img3.jpg new file mode 100644 index 0000000..07ec679 Binary files /dev/null and b/src/assets/images/3d-scroll/img3.jpg differ diff --git a/src/assets/images/3d-scroll/img4.jpg b/src/assets/images/3d-scroll/img4.jpg new file mode 100644 index 0000000..4d61f9d Binary files /dev/null and b/src/assets/images/3d-scroll/img4.jpg differ diff --git a/src/assets/images/3d-scroll/img5.jpg b/src/assets/images/3d-scroll/img5.jpg new file mode 100644 index 0000000..6947880 Binary files /dev/null and b/src/assets/images/3d-scroll/img5.jpg differ diff --git a/src/assets/images/about/profile.jpg b/src/assets/images/about/profile.jpg new file mode 100644 index 0000000..f701d38 Binary files /dev/null and b/src/assets/images/about/profile.jpg differ diff --git a/src/assets/images/portfolio/20240804-20241104-IMG_3861.jpg b/src/assets/images/portfolio/20240804-20241104-IMG_3861.jpg new file mode 100644 index 0000000..807f82d Binary files /dev/null and b/src/assets/images/portfolio/20240804-20241104-IMG_3861.jpg differ diff --git a/src/assets/images/portfolio/20240819-Screenshot_2024-08-19-12-12-33-62_92460851df6f172a4592fca41cc2d2e6.jpg b/src/assets/images/portfolio/20240819-Screenshot_2024-08-19-12-12-33-62_92460851df6f172a4592fca41cc2d2e6.jpg new file mode 100644 index 0000000..3f9ec6b Binary files /dev/null and b/src/assets/images/portfolio/20240819-Screenshot_2024-08-19-12-12-33-62_92460851df6f172a4592fca41cc2d2e6.jpg differ diff --git a/src/assets/images/portfolio/20240901-20240901-_J9E8565.jpg b/src/assets/images/portfolio/20240901-20240901-_J9E8565.jpg new file mode 100644 index 0000000..62a920e Binary files /dev/null and b/src/assets/images/portfolio/20240901-20240901-_J9E8565.jpg differ diff --git a/src/assets/images/portfolio/20240901-20240901-_J9E8586.jpg b/src/assets/images/portfolio/20240901-20240901-_J9E8586.jpg new file mode 100644 index 0000000..d9e770c Binary files /dev/null and b/src/assets/images/portfolio/20240901-20240901-_J9E8586.jpg differ diff --git a/src/assets/images/portfolio/20240901-_J9E8446.jpg b/src/assets/images/portfolio/20240901-_J9E8446.jpg new file mode 100644 index 0000000..07ec679 Binary files /dev/null and b/src/assets/images/portfolio/20240901-_J9E8446.jpg differ diff --git a/src/assets/images/portfolio/20240903-20240903-WJ9E8891.jpg b/src/assets/images/portfolio/20240903-20240903-WJ9E8891.jpg new file mode 100644 index 0000000..4d61f9d Binary files /dev/null and b/src/assets/images/portfolio/20240903-20240903-WJ9E8891.jpg differ diff --git a/src/assets/images/portfolio/20240914-20240914-WJ9E0318.jpg b/src/assets/images/portfolio/20240914-20240914-WJ9E0318.jpg new file mode 100644 index 0000000..48ee916 Binary files /dev/null and b/src/assets/images/portfolio/20240914-20240914-WJ9E0318.jpg differ diff --git a/src/assets/images/portfolio/20240921-WJ9E1119.jpg b/src/assets/images/portfolio/20240921-WJ9E1119.jpg new file mode 100644 index 0000000..deea0c2 Binary files /dev/null and b/src/assets/images/portfolio/20240921-WJ9E1119.jpg differ diff --git a/src/assets/images/portfolio/20241021-IMG_9545-Enhanced-NR.jpg b/src/assets/images/portfolio/20241021-IMG_9545-Enhanced-NR.jpg new file mode 100644 index 0000000..108a640 Binary files /dev/null and b/src/assets/images/portfolio/20241021-IMG_9545-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20241101-_MG_0023-Enhanced-NR.jpg b/src/assets/images/portfolio/20241101-_MG_0023-Enhanced-NR.jpg new file mode 100644 index 0000000..82438cf Binary files /dev/null and b/src/assets/images/portfolio/20241101-_MG_0023-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20241111-_MG_9832.jpg b/src/assets/images/portfolio/20241111-_MG_9832.jpg new file mode 100644 index 0000000..1c52315 Binary files /dev/null and b/src/assets/images/portfolio/20241111-_MG_9832.jpg differ diff --git a/src/assets/images/portfolio/20241117-_J9E0597.jpg b/src/assets/images/portfolio/20241117-_J9E0597.jpg new file mode 100644 index 0000000..4a3fb82 Binary files /dev/null and b/src/assets/images/portfolio/20241117-_J9E0597.jpg differ diff --git a/src/assets/images/portfolio/20241117-_J9E0620.jpg b/src/assets/images/portfolio/20241117-_J9E0620.jpg new file mode 100644 index 0000000..5cadf5c Binary files /dev/null and b/src/assets/images/portfolio/20241117-_J9E0620.jpg differ diff --git a/src/assets/images/portfolio/20241117-_J9E0621.jpg b/src/assets/images/portfolio/20241117-_J9E0621.jpg new file mode 100644 index 0000000..b89c70a Binary files /dev/null and b/src/assets/images/portfolio/20241117-_J9E0621.jpg differ diff --git a/src/assets/images/portfolio/20241124-_MG_1066-Enhanced-NR.jpg b/src/assets/images/portfolio/20241124-_MG_1066-Enhanced-NR.jpg new file mode 100644 index 0000000..420f0f5 Binary files /dev/null and b/src/assets/images/portfolio/20241124-_MG_1066-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250217-_J9E5859-Enhanced-NR.jpg b/src/assets/images/portfolio/20250217-_J9E5859-Enhanced-NR.jpg new file mode 100644 index 0000000..90a7ce1 Binary files /dev/null and b/src/assets/images/portfolio/20250217-_J9E5859-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250217-_J9E5864-Enhanced-NR.jpg b/src/assets/images/portfolio/20250217-_J9E5864-Enhanced-NR.jpg new file mode 100644 index 0000000..169a27a Binary files /dev/null and b/src/assets/images/portfolio/20250217-_J9E5864-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250217-_J9E5897.jpg b/src/assets/images/portfolio/20250217-_J9E5897.jpg new file mode 100644 index 0000000..116bf04 Binary files /dev/null and b/src/assets/images/portfolio/20250217-_J9E5897.jpg differ diff --git a/src/assets/images/portfolio/20250315-WJ9E1852.jpg b/src/assets/images/portfolio/20250315-WJ9E1852.jpg new file mode 100644 index 0000000..5a8fd52 Binary files /dev/null and b/src/assets/images/portfolio/20250315-WJ9E1852.jpg differ diff --git a/src/assets/images/portfolio/20250315-WJ9E1919.jpg b/src/assets/images/portfolio/20250315-WJ9E1919.jpg new file mode 100644 index 0000000..709ac3a Binary files /dev/null and b/src/assets/images/portfolio/20250315-WJ9E1919.jpg differ diff --git a/src/assets/images/portfolio/20250315-WJ9E1967-Enhanced-NR.jpg b/src/assets/images/portfolio/20250315-WJ9E1967-Enhanced-NR.jpg new file mode 100644 index 0000000..964a0a6 Binary files /dev/null and b/src/assets/images/portfolio/20250315-WJ9E1967-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250330-_MG_1223-Enhanced-NR.jpg b/src/assets/images/portfolio/20250330-_MG_1223-Enhanced-NR.jpg new file mode 100644 index 0000000..263ea0f Binary files /dev/null and b/src/assets/images/portfolio/20250330-_MG_1223-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250413-WJ9E0212.jpg b/src/assets/images/portfolio/20250413-WJ9E0212.jpg new file mode 100644 index 0000000..0728f66 Binary files /dev/null and b/src/assets/images/portfolio/20250413-WJ9E0212.jpg differ diff --git a/src/assets/images/portfolio/20250510-WJ9E1439-Enhanced-NR.jpg b/src/assets/images/portfolio/20250510-WJ9E1439-Enhanced-NR.jpg new file mode 100644 index 0000000..1c1bc25 Binary files /dev/null and b/src/assets/images/portfolio/20250510-WJ9E1439-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250510-WJ9E1492-Enhanced-NR.jpg b/src/assets/images/portfolio/20250510-WJ9E1492-Enhanced-NR.jpg new file mode 100644 index 0000000..8321713 Binary files /dev/null and b/src/assets/images/portfolio/20250510-WJ9E1492-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250510-WJ9E1546-Enhanced-NR.jpg b/src/assets/images/portfolio/20250510-WJ9E1546-Enhanced-NR.jpg new file mode 100644 index 0000000..06bfc44 Binary files /dev/null and b/src/assets/images/portfolio/20250510-WJ9E1546-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250510-WJ9E1598-Enhanced-NR.jpg b/src/assets/images/portfolio/20250510-WJ9E1598-Enhanced-NR.jpg new file mode 100644 index 0000000..6684acb Binary files /dev/null and b/src/assets/images/portfolio/20250510-WJ9E1598-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250510-WJ9E1673-Enhanced-NR.jpg b/src/assets/images/portfolio/20250510-WJ9E1673-Enhanced-NR.jpg new file mode 100644 index 0000000..dc4040f Binary files /dev/null and b/src/assets/images/portfolio/20250510-WJ9E1673-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250510-WJ9E1806-Enhanced-NR.jpg b/src/assets/images/portfolio/20250510-WJ9E1806-Enhanced-NR.jpg new file mode 100644 index 0000000..d1fa684 Binary files /dev/null and b/src/assets/images/portfolio/20250510-WJ9E1806-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250510-WJ9E1817-Enhanced-NR.jpg b/src/assets/images/portfolio/20250510-WJ9E1817-Enhanced-NR.jpg new file mode 100644 index 0000000..c033d50 Binary files /dev/null and b/src/assets/images/portfolio/20250510-WJ9E1817-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250513-WJ9E0143-Enhanced-NR.jpg b/src/assets/images/portfolio/20250513-WJ9E0143-Enhanced-NR.jpg new file mode 100644 index 0000000..fd3ced4 Binary files /dev/null and b/src/assets/images/portfolio/20250513-WJ9E0143-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250513-WJ9E0211-Enhanced-NR.jpg b/src/assets/images/portfolio/20250513-WJ9E0211-Enhanced-NR.jpg new file mode 100644 index 0000000..5bd31e2 Binary files /dev/null and b/src/assets/images/portfolio/20250513-WJ9E0211-Enhanced-NR.jpg differ diff --git a/src/assets/images/portfolio/20250726-20250726-WJ9E0854.jpg b/src/assets/images/portfolio/20250726-20250726-WJ9E0854.jpg new file mode 100644 index 0000000..483a02b Binary files /dev/null and b/src/assets/images/portfolio/20250726-20250726-WJ9E0854.jpg differ diff --git a/src/assets/images/portfolio/20250726-20250726-WJ9E0979.jpg b/src/assets/images/portfolio/20250726-20250726-WJ9E0979.jpg new file mode 100644 index 0000000..1836698 Binary files /dev/null and b/src/assets/images/portfolio/20250726-20250726-WJ9E0979.jpg differ diff --git a/src/assets/images/portfolio/20250802-WJ9E1325.jpg b/src/assets/images/portfolio/20250802-WJ9E1325.jpg new file mode 100644 index 0000000..a8d081e Binary files /dev/null and b/src/assets/images/portfolio/20250802-WJ9E1325.jpg differ diff --git a/src/assets/images/portfolio/20250802-WJ9E1390.jpg b/src/assets/images/portfolio/20250802-WJ9E1390.jpg new file mode 100644 index 0000000..38c0fdf Binary files /dev/null and b/src/assets/images/portfolio/20250802-WJ9E1390.jpg differ diff --git a/src/assets/images/portfolio/20250802-WJ9E1396.jpg b/src/assets/images/portfolio/20250802-WJ9E1396.jpg new file mode 100644 index 0000000..9c25791 Binary files /dev/null and b/src/assets/images/portfolio/20250802-WJ9E1396.jpg differ diff --git a/src/assets/images/portfolio/20250806-IMG_5565.jpg b/src/assets/images/portfolio/20250806-IMG_5565.jpg new file mode 100644 index 0000000..97d8bfd Binary files /dev/null and b/src/assets/images/portfolio/20250806-IMG_5565.jpg differ diff --git a/src/assets/images/portfolio/20251017-WJ9E0289.jpg b/src/assets/images/portfolio/20251017-WJ9E0289.jpg new file mode 100644 index 0000000..40d616e Binary files /dev/null and b/src/assets/images/portfolio/20251017-WJ9E0289.jpg differ diff --git a/src/assets/images/portfolio/20251227-WJ9E0356.jpg b/src/assets/images/portfolio/20251227-WJ9E0356.jpg new file mode 100644 index 0000000..e21bc2a Binary files /dev/null and b/src/assets/images/portfolio/20251227-WJ9E0356.jpg differ diff --git a/src/assets/images/portfolio/20251227-WJ9E0361.jpg b/src/assets/images/portfolio/20251227-WJ9E0361.jpg new file mode 100644 index 0000000..9adc8e7 Binary files /dev/null and b/src/assets/images/portfolio/20251227-WJ9E0361.jpg differ diff --git a/src/assets/images/portfolio/20251227-WJ9E0362.jpg b/src/assets/images/portfolio/20251227-WJ9E0362.jpg new file mode 100644 index 0000000..9aa2609 Binary files /dev/null and b/src/assets/images/portfolio/20251227-WJ9E0362.jpg differ diff --git a/src/assets/images/portfolio/20251227-WJ9E0388.jpg b/src/assets/images/portfolio/20251227-WJ9E0388.jpg new file mode 100644 index 0000000..f005b7d Binary files /dev/null and b/src/assets/images/portfolio/20251227-WJ9E0388.jpg differ diff --git a/src/assets/images/portfolio/20251227-WJ9E0434.jpg b/src/assets/images/portfolio/20251227-WJ9E0434.jpg new file mode 100644 index 0000000..02e84de Binary files /dev/null and b/src/assets/images/portfolio/20251227-WJ9E0434.jpg differ diff --git a/src/assets/images/portfolio/20251227-WJ9E0450.jpg b/src/assets/images/portfolio/20251227-WJ9E0450.jpg new file mode 100644 index 0000000..949da31 Binary files /dev/null and b/src/assets/images/portfolio/20251227-WJ9E0450.jpg differ diff --git a/src/assets/images/portfolio/20251230-IMG20251230141046.jpg b/src/assets/images/portfolio/20251230-IMG20251230141046.jpg new file mode 100644 index 0000000..485a0a3 Binary files /dev/null and b/src/assets/images/portfolio/20251230-IMG20251230141046.jpg differ diff --git a/src/assets/images/portfolio/20251231-IMG20251231113121.jpg b/src/assets/images/portfolio/20251231-IMG20251231113121.jpg new file mode 100644 index 0000000..8001e2d Binary files /dev/null and b/src/assets/images/portfolio/20251231-IMG20251231113121.jpg differ diff --git a/src/assets/images/portfolio/20251231-IMG20251231113417.jpg b/src/assets/images/portfolio/20251231-IMG20251231113417.jpg new file mode 100644 index 0000000..d12acb3 Binary files /dev/null and b/src/assets/images/portfolio/20251231-IMG20251231113417.jpg differ diff --git a/src/assets/images/portfolio/20251231-WJ9E0465.jpg b/src/assets/images/portfolio/20251231-WJ9E0465.jpg new file mode 100644 index 0000000..c725b2d Binary files /dev/null and b/src/assets/images/portfolio/20251231-WJ9E0465.jpg differ diff --git a/src/assets/images/portfolio/20251231-WJ9E0490.jpg b/src/assets/images/portfolio/20251231-WJ9E0490.jpg new file mode 100644 index 0000000..905cfbd Binary files /dev/null and b/src/assets/images/portfolio/20251231-WJ9E0490.jpg differ diff --git a/src/assets/images/portfolio/20251231-WJ9E0495.jpg b/src/assets/images/portfolio/20251231-WJ9E0495.jpg new file mode 100644 index 0000000..2402eb7 Binary files /dev/null and b/src/assets/images/portfolio/20251231-WJ9E0495.jpg differ diff --git a/src/assets/images/portfolio/20251231-WJ9E0512.jpg b/src/assets/images/portfolio/20251231-WJ9E0512.jpg new file mode 100644 index 0000000..34a4510 Binary files /dev/null and b/src/assets/images/portfolio/20251231-WJ9E0512.jpg differ diff --git a/src/assets/images/portfolio/20251231-WJ9E0552.jpg b/src/assets/images/portfolio/20251231-WJ9E0552.jpg new file mode 100644 index 0000000..a9e28a8 Binary files /dev/null and b/src/assets/images/portfolio/20251231-WJ9E0552.jpg differ diff --git a/src/assets/images/portfolio/20260102-IMG20260102132702.jpg b/src/assets/images/portfolio/20260102-IMG20260102132702.jpg new file mode 100644 index 0000000..2240842 Binary files /dev/null and b/src/assets/images/portfolio/20260102-IMG20260102132702.jpg differ diff --git a/src/assets/images/portfolio/20260102-IMG20260102141620.jpg b/src/assets/images/portfolio/20260102-IMG20260102141620.jpg new file mode 100644 index 0000000..aae67e2 Binary files /dev/null and b/src/assets/images/portfolio/20260102-IMG20260102141620.jpg differ diff --git a/src/assets/images/portfolio/20260102-IMG20260102142048.jpg b/src/assets/images/portfolio/20260102-IMG20260102142048.jpg new file mode 100644 index 0000000..8e4013b Binary files /dev/null and b/src/assets/images/portfolio/20260102-IMG20260102142048.jpg differ diff --git a/src/components/FloatingOrbs.astro b/src/components/FloatingOrbs.astro new file mode 100644 index 0000000..3da5b0d --- /dev/null +++ b/src/components/FloatingOrbs.astro @@ -0,0 +1,76 @@ +--- +// src/components/FloatingOrbs.astro + +// Vi skapar en array med 8 "orbs" (du kan ändra antalet här) +const orbs = Array.from({ length: 8 }); +--- + +
+ {orbs.map((_, i) => { + // Generera slumpmässiga värden för varje orb för variation + const top = Math.random() * 100; // Position Y (0-100%) + const left = Math.random() * 100; // Position X (0-100%) + // Storlek mellan ca 80px och 200px + const size = 80 + Math.random() * 120; + // Animationstid mellan 15s och 35s (långsamt) + const duration = 15 + Math.random() * 20; + // Negativ delay så de inte startar samtidigt + const delay = Math.random() * -30; + + // Slumpa mellan två animationstyper för mer liv + const animName = Math.random() > 0.5 ? 'float-1' : 'float-2'; + + return ( +
+ ); + })} +
+ + \ No newline at end of file diff --git a/src/components/ThreeDScroll.astro b/src/components/ThreeDScroll.astro new file mode 100644 index 0000000..e5a00c2 --- /dev/null +++ b/src/components/ThreeDScroll.astro @@ -0,0 +1,102 @@ +--- +// src/components/ThreeDScroll.astro + +const images = [ + { src: "/3d-scroll/img1.jpg", alt: "Architecture Dark" }, + { src: "/3d-scroll/img2.jpg", alt: "Shadows Light" }, + { src: "/3d-scroll/img3.jpg", alt: "Portrait High End" }, + { src: "/3d-scroll/img4.jpg", alt: "Minimalist Landscape" }, + { src: "/3d-scroll/img5.jpg", alt: "Foggy Forest" }, +]; +--- + +
+
+ +
+ + {images.map((img, index) => ( + + ))} + +
+
+
+ + + + \ No newline at end of file diff --git a/src/components/WaveBackground.astro b/src/components/WaveBackground.astro new file mode 100644 index 0000000..d503dbb --- /dev/null +++ b/src/components/WaveBackground.astro @@ -0,0 +1,75 @@ +--- +// src/components/WaveBackground.astro +const { opacity = "opacity-30", theme = "cyan" } = Astro.props; + +// Definiera färger baserat på tema +// Cyan = Originalet (Startsidan bas) +// Purple = Contact-sidan (Matchar boxen) +const mainColor = theme === 'purple' ? '#c026d3' : '#4fd1c5'; // Purple-600 vs Teal-400 +const secondaryColor = theme === 'purple' ? '#db2777' : '#22d3ee'; // Pink-600 vs Cyan-400 +--- + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/src/components/Welcome.astro b/src/components/Welcome.astro new file mode 100644 index 0000000..52e0333 --- /dev/null +++ b/src/components/Welcome.astro @@ -0,0 +1,210 @@ +--- +import astroLogo from '../assets/astro.svg'; +import background from '../assets/background.svg'; +--- + +
+ +
+
+ Astro Homepage +

+ To get started, open the
src/pages
directory in your project. +

+ +
+
+ + + +

What's New in Astro 5.0?

+

+ From content layers to server islands, click to learn more about the new features and + improvements in Astro 5.0 +

+
+
+ + diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro new file mode 100644 index 0000000..e455c61 --- /dev/null +++ b/src/layouts/Layout.astro @@ -0,0 +1,22 @@ + + + + + + + + Astro Basics + + + + + + + diff --git a/src/layouts/MainLayout.astro b/src/layouts/MainLayout.astro new file mode 100644 index 0000000..e87084a --- /dev/null +++ b/src/layouts/MainLayout.astro @@ -0,0 +1,37 @@ +--- +import "../styles/global.css"; +const { title } = Astro.props; +--- + + + + + {title} + + + + + +
+ +
+ +
+

© {new Date().getFullYear()} Images by Olofsson. All rights reserved.

+
+ + + \ No newline at end of file diff --git a/src/pages/about.astro b/src/pages/about.astro new file mode 100644 index 0000000..b0569d4 --- /dev/null +++ b/src/pages/about.astro @@ -0,0 +1,127 @@ +--- +// src/pages/about.astro +import MainLayout from '../layouts/MainLayout.astro'; +import { Image } from 'astro:assets'; +import profileImg from '../assets/images/about/profile.jpg'; +import WaveBackground from '../components/WaveBackground.astro'; +--- + + + + + +
+ +
+ +
+ +
+
+
+ Linus Olofsson Photographer +
+
+ +
+

+ Capturing moments,
+ preserving memories. +

+ +
+

+ Hi — I’m Linus Olofsson. + Cloud specialist by day, passionate photographer by night. +

+

+ Based in Sweden, my journey began with a simple curiosity for how light shapes the way we perceive the world. Over time, that curiosity evolved into an obsession with capturing the subtle details most people overlook — textures, structures, contrasts and moments that flicker by unnoticed. +

+

+ I find beauty in the small things: a stone, a tree, an empty street, a quiet forest path, or the expression of a stranger passing by. +

+

+ Whether it’s the intricate patterns of a macro shot, the vast silence of nature, or the energy of a city, my goal is + always the same — to create images that convey emotion and tell a story without words. +

+
+ +
+

Linus Olofsson

+
+ + +
+ +
+
+
+

What's in my bag?

+ +
+ +
+
+ +
+

Camera Body

+

Canon EOS 1Ds Mk II

+

A trusty companion that has been with me on countless adventures.

+
+ +
+
+ +
+

Lenses

+
    +
  • Canon EF 70-200mm f/4L USM
  • +
  • Canon EF 20mm f/2.8 USM
  • +
  • and a couple of extra batteries
  • +
+
+ +
+
+ +
+

Editing

+

Adobe Lightroom Classic

+

Where the raw captures come to life. I focus on natural tones and contrast.

+
+ +
+
+ +
+
+ + \ No newline at end of file diff --git a/src/pages/contact.astro b/src/pages/contact.astro new file mode 100644 index 0000000..296d063 --- /dev/null +++ b/src/pages/contact.astro @@ -0,0 +1,128 @@ +--- +// src/pages/contact.astro +import MainLayout from '../layouts/MainLayout.astro'; +import WaveBackground from '../components/WaveBackground.astro'; +--- + + +
+ +
+ +
+
+ +
+ +
+
+

Get in touch

+

+ Do you have questions about any of my photos, collaborations, or just want to say hi? + Connect with me on social media or send me a direct email. +

+
+ +
+

You can also find me on...

+ +
+ + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+

Waiting to hear from you

+

Feel free to reach out for inquiries or just a chat.

+
+ +
+
+ + + +
+
+

Email me at

+ +

Copied to clipboard!

+
+
+ +
+

Or DM me on Instagram

+ + @imagesbyolofsson + +
+
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000..5d301e3 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,258 @@ +--- +// src/pages/index.astro +import MainLayout from '../layouts/MainLayout.astro'; +import ThreeDScroll from '../components/ThreeDScroll.astro'; +import WaveBackground from '../components/WaveBackground.astro'; +--- + + + +
+ +
+ +
+ +
+ +
+ +

+ IMAGES BY
OLOFSSON +

+ + + + + + + + + + + + + + + + +
+ +

↓

+
+ +
+ +
+ +
+ + + +
+ + + + \ No newline at end of file diff --git a/src/pages/portfolio.astro b/src/pages/portfolio.astro new file mode 100644 index 0000000..e746b1e --- /dev/null +++ b/src/pages/portfolio.astro @@ -0,0 +1,322 @@ +--- +// src/pages/portfolio.astro +import MainLayout from '../layouts/MainLayout.astro'; +import { Image } from 'astro:assets'; +import exifr from 'exifr'; +import fs from 'node:fs'; +import path from 'node:path'; +import WaveBackground from '../components/WaveBackground.astro'; + +// --- SERVER-SIDE LOGIC --- + +// 1. Hämta alla bilder +const imageFiles = import.meta.glob('../assets/images/portfolio/*.{jpeg,jpg,png,webp,JPG,JPEG,PNG}', { eager: true }); + +function formatShutterSpeed(exposureTime: number) { + if (!exposureTime) return null; + if (exposureTime >= 1) return exposureTime.toString(); + const fraction = Math.round(1 / exposureTime); + return `1/${fraction}`; +} + +const galleryItems = await Promise.all(Object.entries(imageFiles).map(async ([relativePath, file]: [string, any]) => { + let exifData: any = {}; + let dateTaken = null; + const absolutePath = path.resolve('./src/pages', relativePath); + + try { + const fileBuffer = fs.readFileSync(absolutePath); + exifData = await exifr.parse(fileBuffer, [ + 'ISO', 'Model', 'FNumber', 'ExposureTime', 'FocalLength', 'DateTimeOriginal', 'CreateDate' + ]); + dateTaken = exifData?.DateTimeOriginal || exifData?.CreateDate; + if (!dateTaken) dateTaken = new Date(); + } catch (e) { + console.error(`Kunde inte läsa EXIF för ${relativePath}`); + dateTaken = new Date(); + } + + const dateObj = new Date(dateTaken); + const year = dateObj.getFullYear().toString(); + const month = dateObj.toLocaleString('sv-SE', { month: 'long' }).toLowerCase(); + const monthIndex = dateObj.getMonth(); + + const fullDate = dateObj.toLocaleDateString('sv-SE', { + day: 'numeric', month: 'long', year: 'numeric' + }); + + const shutterSpeed = formatShutterSpeed(exifData?.ExposureTime); + const focalLength = exifData?.FocalLength ? `${Math.round(exifData.FocalLength)}mm` : null; + const fStop = exifData?.FNumber ? `f/${exifData.FNumber}` : null; + const iso = exifData?.ISO ? `ISO ${exifData.ISO}` : null; + + return { + ...file, year, month, monthIndex, fullDate, model: exifData?.Model, + fStop, shutterSpeed, iso, focalLength + }; +})); + +const uniqueYears = [...new Set(galleryItems.map((item: any) => item.year))].sort().reverse(); +const allMonths = galleryItems.map((item: any) => ({ name: item.month, index: item.monthIndex })); +const uniqueMonths = [...new Map(allMonths.map(item => [item.name, item])).values()] + .sort((a: any, b: any) => a.index - b.index) + .map((item: any) => item.name); +--- + + + +
+ +
+ +
+ +
+

Portfolio

+

A curated selection of my work across different styles.

+
+ +
+
+ + {uniqueYears.map(year => ( + + ))} +
+ +
+ + {uniqueMonths.map(month => ( + + ))} +
+
+ + + + + +
+ + + +
+ + + + \ No newline at end of file diff --git a/src/styles/global.css b/src/styles/global.css new file mode 100644 index 0000000..a461c50 --- /dev/null +++ b/src/styles/global.css @@ -0,0 +1 @@ +@import "tailwindcss"; \ No newline at end of file