diff --git a/angular.json b/angular.json index 266edb7..f6d2af4 100644 --- a/angular.json +++ b/angular.json @@ -26,8 +26,13 @@ "assets": [ { "glob": "**/*", - "input": "src/assets", - "output": "assets" + "input": "src/assets/optimized", + "output": "assets/optimized" + }, + { + "glob": "**/*", + "input": "src/assets/logos", + "output": "assets/logos" }, { "glob": "**/*", @@ -108,8 +113,13 @@ "assets": [ { "glob": "**/*", - "input": "src/assets", - "output": "assets" + "input": "src/assets/optimized", + "output": "assets/optimized" + }, + { + "glob": "**/*", + "input": "src/assets/logos", + "output": "assets/logos" }, { "glob": "**/*", diff --git a/package.json b/package.json index 1ae918b..7d78b46 100644 --- a/package.json +++ b/package.json @@ -24,10 +24,11 @@ "check": "npm run build && npm run lint && npm run format:check && npm run version:check && npm run text:check", "fix": "npm run version:place && npm run lint:fix && npm run text:fix && npm run format", "------ BUILD": "", + "clean": "del-cli dist", "generate:static-files": "node scripts/generate-static-files.cjs", "generate:assets": "npm run generate:static-files", "compress:assets": "node scripts/compress-assets.cjs", - "build": "npm run generate:assets && ng build --configuration production && npm run compress:assets && node scripts/copy-static-root-files.cjs", + "build": "npm run clean && npm run generate:assets && ng build --configuration production && npm run compress:assets && node scripts/copy-static-root-files.cjs", "------ STARTUP": "", "test": "ng test", "dev": "npm run generate:assets && ng serve", diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 2de7dd7..71c2a7b 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -1,7 +1,7 @@ import type { ApplicationConfig } from '@angular/core'; -import { importProvidersFrom, provideZoneChangeDetection } from '@angular/core'; +import { provideZoneChangeDetection } from '@angular/core'; import { provideRouter, withInMemoryScrolling } from '@angular/router'; -import { BrowserModule, provideClientHydration, withEventReplay } from '@angular/platform-browser'; +import { provideClientHydration, withEventReplay } from '@angular/platform-browser'; import { routes } from './app.routes'; @@ -16,6 +16,5 @@ export const appConfig: ApplicationConfig = { }), ), provideClientHydration(withEventReplay()), - importProvidersFrom(BrowserModule), ], }; diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 8d83b3d..51fa04d 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,10 +1,17 @@ import type { Routes } from '@angular/router'; -import { HomeComponent } from './home/home.component'; -import { ImprintComponent } from './imprint/imprint.component'; - export const routes: Routes = [ - { path: '', component: HomeComponent, pathMatch: 'full' }, - { path: 'imprint', component: ImprintComponent, pathMatch: 'full' }, + { + path: '', + loadComponent: async () => + (await import('./home/home.component')).HomeComponent, + pathMatch: 'full', + }, + { + path: 'imprint', + loadComponent: async () => + (await import('./imprint/imprint.component')).ImprintComponent, + pathMatch: 'full', + }, { path: '**', redirectTo: '' }, ]; diff --git a/src/app/home/home.component.html b/src/app/home/home.component.html index 0a157c5..3b3d176 100644 --- a/src/app/home/home.component.html +++ b/src/app/home/home.component.html @@ -64,13 +64,28 @@ [title]="portraitHighlights.length > 1 ? 'Show next image' : 'Single image'" >
- + + + + + @if (currentPortraitHighlightIndex === 0) { Click me! } @@ -148,7 +163,11 @@ class="project-icon" [class.project-icon-circle]="project.CircleIcon !== false" [src]="project.icon" + [attr.width]="project.iconWidth ?? 108" + [attr.height]="project.iconHeight ?? 108" [alt]="project.title + ' icon'" + loading="lazy" + decoding="async" /> } diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts index a1d7528..b9a202c 100644 --- a/src/app/home/home.component.ts +++ b/src/app/home/home.component.ts @@ -22,7 +22,6 @@ import { FooterComponent } from '../footer/footer.component'; export class HomeComponent implements OnInit, AfterViewInit, OnDestroy { private readonly sanitizer = inject(DomSanitizer); private readonly zone = inject(NgZone); - private preloadedImages: HTMLImageElement[] = []; private tallestPortraitAspectRatio: number | null = null; private lockedHeroSectionMinHeight: number = 0; private projectEntryObserver: IntersectionObserver | null = null; @@ -82,7 +81,7 @@ export class HomeComponent implements OnInit, AfterViewInit, OnDestroy { } ngOnInit(): void { - this.preloadImageAssets(); + this.initPortraitAspectRatio(); this.initNameGradientScrollAnimation(); this.zone.runOutsideAngular((): void => { @@ -181,88 +180,21 @@ export class HomeComponent implements OnInit, AfterViewInit, OnDestroy { this.scrollToElementById('contact-links', this.getResponsiveScrollOffset(0.05)); } - private preloadImageAssets(): void { - if (typeof window === 'undefined') { - return; - } + private initPortraitAspectRatio(): void { + const minAspectRatio: number = this.portraitHighlights.reduce( + (minRatio: number, highlight: PortraitHighlight): number => { + if (highlight.width <= 0 || highlight.height <= 0) { + return minRatio; + } - const projectIcons: string[] = this.projects - .map((project: PortfolioProject): string | undefined => project.icon) - .filter((icon: string | undefined): icon is string => Boolean(icon)); - - const uniqueImageUrls: string[] = Array.from( - new Set([ - ...this.portraitHighlights.map((highlight: PortraitHighlight): string => highlight.image), - ...projectIcons, - ]), + const currentRatio: number = highlight.width / highlight.height; + return minRatio === 0 ? currentRatio : Math.min(minRatio, currentRatio); + }, + 0, ); - this.preloadedImages = uniqueImageUrls.map((url: string): HTMLImageElement => { - const image = new Image(); - image.decoding = 'async'; - image.loading = 'eager'; - image.src = url; - return image; - }); - - this.syncHeroHeightToLargestPortraitImage(); - } - - private syncHeroHeightToLargestPortraitImage(): void { - if (typeof window === 'undefined') { - return; - } - - const portraitImageUrls: Set = new Set( - this.portraitHighlights.map( - (highlight: PortraitHighlight): string => - new URL(highlight.image, window.location.href).href, - ), - ); - - const portraitImages: HTMLImageElement[] = this.preloadedImages.filter( - (image: HTMLImageElement): boolean => portraitImageUrls.has(image.src), - ); - - if (portraitImages.length === 0) { - return; - } - - const finalizeAspectRatio = (): void => { - const minAspectRatio: number = portraitImages.reduce( - (minRatio: number, image: HTMLImageElement): number => { - if (image.naturalWidth === 0 || image.naturalHeight === 0) { - return minRatio; - } - - const currentRatio: number = image.naturalWidth / image.naturalHeight; - return minRatio === 0 ? currentRatio : Math.min(minRatio, currentRatio); - }, - 0, - ); - - if (minAspectRatio > 0) { - this.tallestPortraitAspectRatio = minAspectRatio; - this.scheduleHeroSectionHeightUpdate(); - } - }; - - let pendingLoads: number = portraitImages.length; - const onImageSettled = (): void => { - pendingLoads -= 1; - if (pendingLoads === 0) { - finalizeAspectRatio(); - } - }; - - for (const image of portraitImages) { - if (image.complete) { - onImageSettled(); - continue; - } - - image.addEventListener('load', onImageSettled, { once: true }); - image.addEventListener('error', onImageSettled, { once: true }); + if (minAspectRatio > 0) { + this.tallestPortraitAspectRatio = minAspectRatio; } } diff --git a/src/assets/logos/synhost-dark.png b/src/assets/logos/synhost-dark.png new file mode 100644 index 0000000..b4e4a86 Binary files /dev/null and b/src/assets/logos/synhost-dark.png differ diff --git a/src/assets/logos/synhost-dark.webp b/src/assets/logos/synhost-dark.webp new file mode 100644 index 0000000..15c2812 Binary files /dev/null and b/src/assets/logos/synhost-dark.webp differ diff --git a/src/assets/optimized/background-1280.avif b/src/assets/optimized/background-1280.avif new file mode 100644 index 0000000..c002b7f Binary files /dev/null and b/src/assets/optimized/background-1280.avif differ diff --git a/src/assets/optimized/background-1280.webp b/src/assets/optimized/background-1280.webp new file mode 100644 index 0000000..523a158 Binary files /dev/null and b/src/assets/optimized/background-1280.webp differ diff --git a/src/assets/optimized/background-1920.avif b/src/assets/optimized/background-1920.avif new file mode 100644 index 0000000..c42d752 Binary files /dev/null and b/src/assets/optimized/background-1920.avif differ diff --git a/src/assets/optimized/background-1920.jpg b/src/assets/optimized/background-1920.jpg new file mode 100644 index 0000000..9c67fe8 Binary files /dev/null and b/src/assets/optimized/background-1920.jpg differ diff --git a/src/assets/optimized/background-1920.webp b/src/assets/optimized/background-1920.webp new file mode 100644 index 0000000..09d7500 Binary files /dev/null and b/src/assets/optimized/background-1920.webp differ diff --git a/src/assets/optimized/portrait/culture-480.avif b/src/assets/optimized/portrait/culture-480.avif new file mode 100644 index 0000000..332bc93 Binary files /dev/null and b/src/assets/optimized/portrait/culture-480.avif differ diff --git a/src/assets/optimized/portrait/culture-480.webp b/src/assets/optimized/portrait/culture-480.webp new file mode 100644 index 0000000..b6301b3 Binary files /dev/null and b/src/assets/optimized/portrait/culture-480.webp differ diff --git a/src/assets/optimized/portrait/culture-720.avif b/src/assets/optimized/portrait/culture-720.avif new file mode 100644 index 0000000..26afc65 Binary files /dev/null and b/src/assets/optimized/portrait/culture-720.avif differ diff --git a/src/assets/optimized/portrait/culture-720.webp b/src/assets/optimized/portrait/culture-720.webp new file mode 100644 index 0000000..63d15cc Binary files /dev/null and b/src/assets/optimized/portrait/culture-720.webp differ diff --git a/src/assets/optimized/portrait/culture-960.avif b/src/assets/optimized/portrait/culture-960.avif new file mode 100644 index 0000000..69fc2a9 Binary files /dev/null and b/src/assets/optimized/portrait/culture-960.avif differ diff --git a/src/assets/optimized/portrait/culture-960.jpg b/src/assets/optimized/portrait/culture-960.jpg new file mode 100644 index 0000000..a466866 Binary files /dev/null and b/src/assets/optimized/portrait/culture-960.jpg differ diff --git a/src/assets/optimized/portrait/culture-960.webp b/src/assets/optimized/portrait/culture-960.webp new file mode 100644 index 0000000..8312874 Binary files /dev/null and b/src/assets/optimized/portrait/culture-960.webp differ diff --git a/src/assets/optimized/portrait/love-480.avif b/src/assets/optimized/portrait/love-480.avif new file mode 100644 index 0000000..28b38a3 Binary files /dev/null and b/src/assets/optimized/portrait/love-480.avif differ diff --git a/src/assets/optimized/portrait/love-480.webp b/src/assets/optimized/portrait/love-480.webp new file mode 100644 index 0000000..892f3b8 Binary files /dev/null and b/src/assets/optimized/portrait/love-480.webp differ diff --git a/src/assets/optimized/portrait/love-720.avif b/src/assets/optimized/portrait/love-720.avif new file mode 100644 index 0000000..a1a53bf Binary files /dev/null and b/src/assets/optimized/portrait/love-720.avif differ diff --git a/src/assets/optimized/portrait/love-720.webp b/src/assets/optimized/portrait/love-720.webp new file mode 100644 index 0000000..98fc8e4 Binary files /dev/null and b/src/assets/optimized/portrait/love-720.webp differ diff --git a/src/assets/optimized/portrait/love-960.avif b/src/assets/optimized/portrait/love-960.avif new file mode 100644 index 0000000..d4188bd Binary files /dev/null and b/src/assets/optimized/portrait/love-960.avif differ diff --git a/src/assets/optimized/portrait/love-960.jpg b/src/assets/optimized/portrait/love-960.jpg new file mode 100644 index 0000000..0ee88a2 Binary files /dev/null and b/src/assets/optimized/portrait/love-960.jpg differ diff --git a/src/assets/optimized/portrait/love-960.webp b/src/assets/optimized/portrait/love-960.webp new file mode 100644 index 0000000..c13f364 Binary files /dev/null and b/src/assets/optimized/portrait/love-960.webp differ diff --git a/src/assets/optimized/portrait/me-480.avif b/src/assets/optimized/portrait/me-480.avif new file mode 100644 index 0000000..f5508dc Binary files /dev/null and b/src/assets/optimized/portrait/me-480.avif differ diff --git a/src/assets/optimized/portrait/me-480.webp b/src/assets/optimized/portrait/me-480.webp new file mode 100644 index 0000000..bf84b7a Binary files /dev/null and b/src/assets/optimized/portrait/me-480.webp differ diff --git a/src/assets/optimized/portrait/me-720.avif b/src/assets/optimized/portrait/me-720.avif new file mode 100644 index 0000000..8b9e0ba Binary files /dev/null and b/src/assets/optimized/portrait/me-720.avif differ diff --git a/src/assets/optimized/portrait/me-720.webp b/src/assets/optimized/portrait/me-720.webp new file mode 100644 index 0000000..58abc91 Binary files /dev/null and b/src/assets/optimized/portrait/me-720.webp differ diff --git a/src/assets/optimized/portrait/me-960.avif b/src/assets/optimized/portrait/me-960.avif new file mode 100644 index 0000000..6cd549c Binary files /dev/null and b/src/assets/optimized/portrait/me-960.avif differ diff --git a/src/assets/optimized/portrait/me-960.jpg b/src/assets/optimized/portrait/me-960.jpg new file mode 100644 index 0000000..7663e8b Binary files /dev/null and b/src/assets/optimized/portrait/me-960.jpg differ diff --git a/src/assets/optimized/portrait/me-960.webp b/src/assets/optimized/portrait/me-960.webp new file mode 100644 index 0000000..73f1010 Binary files /dev/null and b/src/assets/optimized/portrait/me-960.webp differ diff --git a/src/assets/optimized/portrait/scuba-480.avif b/src/assets/optimized/portrait/scuba-480.avif new file mode 100644 index 0000000..f5b3df1 Binary files /dev/null and b/src/assets/optimized/portrait/scuba-480.avif differ diff --git a/src/assets/optimized/portrait/scuba-480.webp b/src/assets/optimized/portrait/scuba-480.webp new file mode 100644 index 0000000..9510508 Binary files /dev/null and b/src/assets/optimized/portrait/scuba-480.webp differ diff --git a/src/assets/optimized/portrait/scuba-720.avif b/src/assets/optimized/portrait/scuba-720.avif new file mode 100644 index 0000000..21bda25 Binary files /dev/null and b/src/assets/optimized/portrait/scuba-720.avif differ diff --git a/src/assets/optimized/portrait/scuba-720.webp b/src/assets/optimized/portrait/scuba-720.webp new file mode 100644 index 0000000..1c4bb34 Binary files /dev/null and b/src/assets/optimized/portrait/scuba-720.webp differ diff --git a/src/assets/optimized/portrait/scuba-960.avif b/src/assets/optimized/portrait/scuba-960.avif new file mode 100644 index 0000000..4a8b7f1 Binary files /dev/null and b/src/assets/optimized/portrait/scuba-960.avif differ diff --git a/src/assets/optimized/portrait/scuba-960.jpg b/src/assets/optimized/portrait/scuba-960.jpg new file mode 100644 index 0000000..ea8a7a1 Binary files /dev/null and b/src/assets/optimized/portrait/scuba-960.jpg differ diff --git a/src/assets/optimized/portrait/scuba-960.webp b/src/assets/optimized/portrait/scuba-960.webp new file mode 100644 index 0000000..fb03a93 Binary files /dev/null and b/src/assets/optimized/portrait/scuba-960.webp differ diff --git a/src/assets/optimized/portrait/trains-480.avif b/src/assets/optimized/portrait/trains-480.avif new file mode 100644 index 0000000..67841ff Binary files /dev/null and b/src/assets/optimized/portrait/trains-480.avif differ diff --git a/src/assets/optimized/portrait/trains-480.webp b/src/assets/optimized/portrait/trains-480.webp new file mode 100644 index 0000000..afb249e Binary files /dev/null and b/src/assets/optimized/portrait/trains-480.webp differ diff --git a/src/assets/optimized/portrait/trains-720.avif b/src/assets/optimized/portrait/trains-720.avif new file mode 100644 index 0000000..57f07fc Binary files /dev/null and b/src/assets/optimized/portrait/trains-720.avif differ diff --git a/src/assets/optimized/portrait/trains-720.webp b/src/assets/optimized/portrait/trains-720.webp new file mode 100644 index 0000000..47a5afa Binary files /dev/null and b/src/assets/optimized/portrait/trains-720.webp differ diff --git a/src/assets/optimized/portrait/trains-960.avif b/src/assets/optimized/portrait/trains-960.avif new file mode 100644 index 0000000..798e3b5 Binary files /dev/null and b/src/assets/optimized/portrait/trains-960.avif differ diff --git a/src/assets/optimized/portrait/trains-960.jpg b/src/assets/optimized/portrait/trains-960.jpg new file mode 100644 index 0000000..e09ecd6 Binary files /dev/null and b/src/assets/optimized/portrait/trains-960.jpg differ diff --git a/src/assets/optimized/portrait/trains-960.webp b/src/assets/optimized/portrait/trains-960.webp new file mode 100644 index 0000000..ba259f9 Binary files /dev/null and b/src/assets/optimized/portrait/trains-960.webp differ diff --git a/src/assets/optimized/portrait/traveling-480.avif b/src/assets/optimized/portrait/traveling-480.avif new file mode 100644 index 0000000..95f1889 Binary files /dev/null and b/src/assets/optimized/portrait/traveling-480.avif differ diff --git a/src/assets/optimized/portrait/traveling-480.webp b/src/assets/optimized/portrait/traveling-480.webp new file mode 100644 index 0000000..0c13d78 Binary files /dev/null and b/src/assets/optimized/portrait/traveling-480.webp differ diff --git a/src/assets/optimized/portrait/traveling-720.avif b/src/assets/optimized/portrait/traveling-720.avif new file mode 100644 index 0000000..05c5891 Binary files /dev/null and b/src/assets/optimized/portrait/traveling-720.avif differ diff --git a/src/assets/optimized/portrait/traveling-720.webp b/src/assets/optimized/portrait/traveling-720.webp new file mode 100644 index 0000000..a76b55a Binary files /dev/null and b/src/assets/optimized/portrait/traveling-720.webp differ diff --git a/src/assets/optimized/portrait/traveling-960.avif b/src/assets/optimized/portrait/traveling-960.avif new file mode 100644 index 0000000..ef3c977 Binary files /dev/null and b/src/assets/optimized/portrait/traveling-960.avif differ diff --git a/src/assets/optimized/portrait/traveling-960.jpg b/src/assets/optimized/portrait/traveling-960.jpg new file mode 100644 index 0000000..a5b43a1 Binary files /dev/null and b/src/assets/optimized/portrait/traveling-960.jpg differ diff --git a/src/assets/optimized/portrait/traveling-960.webp b/src/assets/optimized/portrait/traveling-960.webp new file mode 100644 index 0000000..8b8e099 Binary files /dev/null and b/src/assets/optimized/portrait/traveling-960.webp differ diff --git a/src/global.ts b/src/global.ts index 5685780..fa22431 100644 --- a/src/global.ts +++ b/src/global.ts @@ -4,11 +4,18 @@ export interface PortfolioProject { description: string; languages: string[]; icon?: string; + iconWidth?: number; + iconHeight?: number; CircleIcon?: boolean; } export interface PortraitHighlight { image: string; + avifSrcset: string; + webpSrcset: string; + width: number; + height: number; + alt: string; text: string; } @@ -74,27 +81,69 @@ export const global: Global = { ], portraitHighlights: [ { - image: 'assets/portrait/me.png', + image: 'assets/optimized/portrait/me-960.jpg', + avifSrcset: + 'assets/optimized/portrait/me-480.avif 480w, assets/optimized/portrait/me-720.avif 720w, assets/optimized/portrait/me-960.avif 900w', + webpSrcset: + 'assets/optimized/portrait/me-480.webp 480w, assets/optimized/portrait/me-720.webp 720w, assets/optimized/portrait/me-960.webp 900w', + width: 900, + height: 1154, + alt: 'Portrait of Julian Lechner', text: 'ME', }, { - image: 'assets/portrait/love.jpg', + image: 'assets/optimized/portrait/love-960.jpg', + avifSrcset: + 'assets/optimized/portrait/love-480.avif 480w, assets/optimized/portrait/love-720.avif 720w, assets/optimized/portrait/love-960.avif 960w', + webpSrcset: + 'assets/optimized/portrait/love-480.webp 480w, assets/optimized/portrait/love-720.webp 720w, assets/optimized/portrait/love-960.webp 960w', + width: 960, + height: 1065, + alt: 'Julian with his partner', text: 'My Love', }, { - image: 'assets/portrait/scuba.jpg', + image: 'assets/optimized/portrait/scuba-960.jpg', + avifSrcset: + 'assets/optimized/portrait/scuba-480.avif 480w, assets/optimized/portrait/scuba-720.avif 720w, assets/optimized/portrait/scuba-960.avif 960w', + webpSrcset: + 'assets/optimized/portrait/scuba-480.webp 480w, assets/optimized/portrait/scuba-720.webp 720w, assets/optimized/portrait/scuba-960.webp 960w', + width: 960, + height: 720, + alt: 'Julian scuba diving', text: 'Scuba Diving', }, { - image: 'assets/portrait/trains.jpg', + image: 'assets/optimized/portrait/trains-960.jpg', + avifSrcset: + 'assets/optimized/portrait/trains-480.avif 480w, assets/optimized/portrait/trains-720.avif 720w, assets/optimized/portrait/trains-960.avif 960w', + webpSrcset: + 'assets/optimized/portrait/trains-480.webp 480w, assets/optimized/portrait/trains-720.webp 720w, assets/optimized/portrait/trains-960.webp 960w', + width: 960, + height: 1275, + alt: 'Julian traveling by train', text: 'Trains', }, { - image: 'assets/portrait/traveling.jpg', + image: 'assets/optimized/portrait/traveling-960.jpg', + avifSrcset: + 'assets/optimized/portrait/traveling-480.avif 480w, assets/optimized/portrait/traveling-720.avif 720w, assets/optimized/portrait/traveling-960.avif 960w', + webpSrcset: + 'assets/optimized/portrait/traveling-480.webp 480w, assets/optimized/portrait/traveling-720.webp 720w, assets/optimized/portrait/traveling-960.webp 960w', + width: 960, + height: 720, + alt: 'Julian traveling', text: 'Traveling', }, { - image: 'assets/portrait/culture.jpg', + image: 'assets/optimized/portrait/culture-960.jpg', + avifSrcset: + 'assets/optimized/portrait/culture-480.avif 480w, assets/optimized/portrait/culture-720.avif 720w, assets/optimized/portrait/culture-960.avif 960w', + webpSrcset: + 'assets/optimized/portrait/culture-480.webp 480w, assets/optimized/portrait/culture-720.webp 720w, assets/optimized/portrait/culture-960.webp 960w', + width: 960, + height: 723, + alt: 'Julian visiting cultural landmarks', text: 'Culture', }, ], @@ -114,7 +163,9 @@ export const global: Global = { description: 'A support system integrating various platforms and media to offer employees a unified overview.', languages: ['TypeScript'], - icon: 'https://gerlach-systems.de/IMAGES/SYNHOST/SYNHOST_DARK.png', + icon: 'assets/logos/synhost-dark.webp', + iconWidth: 230, + iconHeight: 136, CircleIcon: false, }, { @@ -123,7 +174,9 @@ export const global: Global = { description: 'A support system integrating various platforms and media to offer employees a unified overview.', languages: ['TypeScript'], - icon: 'https://gerlach-systems.de/IMAGES/SYNHOST/SYNHOST_DARK.png', + icon: 'assets/logos/synhost-dark.webp', + iconWidth: 230, + iconHeight: 136, CircleIcon: false, }, { @@ -132,7 +185,9 @@ export const global: Global = { description: 'A support system integrating various platforms and media to offer employees a unified overview.', languages: ['TypeScript'], - icon: 'https://gerlach-systems.de/IMAGES/SYNHOST/SYNHOST_DARK.png', + icon: 'assets/logos/synhost-dark.webp', + iconWidth: 230, + iconHeight: 136, CircleIcon: false, }, ], diff --git a/src/index.html b/src/index.html index 54d5a22..b497578 100644 --- a/src/index.html +++ b/src/index.html @@ -5,7 +5,19 @@ - + + Lechner Julian diff --git a/src/styles.scss b/src/styles.scss index 4a58e2d..5e0f533 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -48,7 +48,12 @@ body { radial-gradient(circle at top left, rgba(217, 162, 140, 0.22), transparent 26%), radial-gradient(circle at bottom right, rgba(127, 78, 63, 0.28), transparent 28%), linear-gradient(180deg, rgba(9, 9, 12, 0.4), rgba(8, 8, 11, 0.82)), - url('assets/background.jpg') center / cover fixed no-repeat; + image-set( + url('assets/optimized/background-1920.avif') type('image/avif'), + url('assets/optimized/background-1920.webp') type('image/webp'), + url('assets/optimized/background-1920.jpg') type('image/jpeg') + ) + center / cover no-repeat; } a { @@ -151,20 +156,21 @@ hr { color: transparent; background-size: 100% 100%; background: linear-gradient( - to right, - #e40303 0%, - #e40303 16.66%, - #ff8c00 16.66%, - #ff8c00 33.33%, - #ffed00 33.33%, - #ffed00 50%, - #008026 50%, - #008026 66.66%, - #004dff 66.66%, - #004dff 83.33%, - #750787 83.33%, - #750787 100% - ) no-repeat 0 50%; + to right, + #e40303 0%, + #e40303 16.66%, + #ff8c00 16.66%, + #ff8c00 33.33%, + #ffed00 33.33%, + #ffed00 50%, + #008026 50%, + #008026 66.66%, + #004dff 66.66%, + #004dff 83.33%, + #750787 83.33%, + #750787 100% + ) + no-repeat 0 50%; -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; @@ -296,20 +302,21 @@ hr { filter: blur(1.6px) saturate(0.88); background-size: 100% 100%; background: linear-gradient( - to right, - #e40303 0%, - #e40303 16.66%, - #ff8c00 16.66%, - #ff8c00 33.33%, - #ffed00 33.33%, - #ffed00 50%, - #008026 50%, - #008026 66.66%, - #004dff 66.66%, - #004dff 83.33%, - #750787 83.33%, - #750787 100% - ) 0 50%; + to right, + #e40303 0%, + #e40303 16.66%, + #ff8c00 16.66%, + #ff8c00 33.33%, + #ffed00 33.33%, + #ffed00 50%, + #008026 50%, + #008026 66.66%, + #004dff 66.66%, + #004dff 83.33%, + #750787 83.33%, + #750787 100% + ) + 0 50%; transform: translate(2px, 2px); } @@ -927,6 +934,19 @@ hr { } @media (max-width: 900px) { + body { + background: + radial-gradient(circle at top left, rgba(217, 162, 140, 0.18), transparent 28%), + radial-gradient(circle at bottom right, rgba(127, 78, 63, 0.22), transparent 30%), + linear-gradient(180deg, rgba(9, 9, 12, 0.42), rgba(8, 8, 11, 0.84)), + image-set( + url('assets/optimized/background-1280.avif') type('image/avif'), + url('assets/optimized/background-1280.webp') type('image/webp'), + url('assets/optimized/background-1920.jpg') type('image/jpeg') + ) + center / cover no-repeat; + } + .hero-section, .story-grid, .legal-grid,