Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export default defineConfig({
site: `https://${subdomain}futureblur.com`,
prefetch: true,
build: { format: 'preserve' },
trailingSlash: 'never',
integrations: [
tailwind(), sitemap({
i18n: {
Expand Down
2 changes: 2 additions & 0 deletions public/_redirects
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,5 @@
# Newsroom
/news/* /en/news/:splat 301

/:slug/ /:slug 301!

Binary file added public/images/work/00.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/01.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/02.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/03.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/04.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/05.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/06.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/07.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/08.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/09.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/10.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/11.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/12.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/13.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/14.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/15.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/16.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/17.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/18.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/19.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/20.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/21.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/22.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/23.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/24.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/work/25.jpg
Binary file added public/images/work/26.jpg
Binary file added public/images/work/27.jpg
Binary file added public/images/work/28.jpg
Binary file added public/images/work/29.jpg
Binary file added public/images/work/30.jpg
Binary file added public/images/work/31.jpg
Binary file added public/images/work/32.jpg
Binary file added public/images/work/33.jpg
Binary file added public/images/work/34.jpg
Binary file added public/images/work/35.jpg
Binary file added public/images/work/36.jpg
Binary file added src/assets/home/car.jpg
9 changes: 7 additions & 2 deletions src/components/Home/Promotion.astro
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,17 @@ const promotionImage = images[promotionImagePath];
if (!promotionImage) {
throw new Error(`Image not found: ${promotionImagePath}`);
}

function getUrl() {
return data.isRelative ? Astro.url + data.url : data.url;
}

---

<a
class="relative flex items-center justify-center bg-black"
href={data.url}
target="_blank"
href={getUrl()}
target={data.isRelative ? "_self" : "_blank"}
>
<Image
class:list={[
Expand Down
6 changes: 6 additions & 0 deletions src/consts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ export const INVESTORS: Metadata = {
COVER: '/images/investors-banner.png',
};

export const WORK: Metadata = {
TITLE: 'Work',
DESCRIPTION: 'View our work and projects at Futureblur.',
COVER: '/images/glyph-banner.png',
};

export const navBarLinks: NavigationLink[] = [
{
title: 'nav.title.store',
Expand Down
5 changes: 3 additions & 2 deletions src/content/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ const promotionCollection = defineCollection({
.max(3, promotionDimError)
.optional(),
cta: z.string(),
url: z.string().url()
url: z.string(),
isRelative: z.boolean().optional()
})
})

Expand Down Expand Up @@ -62,7 +63,7 @@ const markdownCollection = defineCollection({
}),
coverDescription: z.string(),
})
})
});

export const collections = {
promotion: promotionCollection,
Expand Down
2 changes: 1 addition & 1 deletion src/content/promotion/de/archviz.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"order": 0,
"order": 1,
"title": "ArchViz",
"subtitle": "Schritt für Schritt. Sammle Ideen. Gestalte die Szene. Verwirkliche sie. Alles in Blender.",
"image": "archviz.jpg",
Expand Down
2 changes: 1 addition & 1 deletion src/content/promotion/de/octane.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"order": 1,
"order": 2,
"hide": true,
"title": "Octane",
"subtitle": "",
Expand Down
10 changes: 10 additions & 0 deletions src/content/promotion/de/work.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"order": 0,
"title": "Portfolio",
"subtitle": "Wir erstellen 3D-CGI, Werbung und Motion Graphics.",
"image": "car.jpg",
"alt": "Ein modernes, einstöckiges Haus mit großen Fenstern wird nachts beleuchtet, umgeben von dichtem Wald und Felsen.",
"cta": "Jetzt ansehen",
"url": "/work",
"isRelative": true
}
2 changes: 1 addition & 1 deletion src/content/promotion/en/archviz.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"order": 0,
"order": 1,
"title": "ArchViz",
"subtitle": "Follow step by step. Gather ideas. Build the scene. Make it real. All in Blender.",
"image": "archviz.jpg",
Expand Down
2 changes: 1 addition & 1 deletion src/content/promotion/en/octane.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"order": 1,
"order": 2,
"hide": true,
"title": "Octane",
"subtitle": "Replicate the Octane look in Blender.",
Expand Down
10 changes: 10 additions & 0 deletions src/content/promotion/en/work.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"order": 0,
"title": "Portfolio",
"subtitle": "We create 3D CGI, Ads and Motion Graphics.",
"image": "car.jpg",
"alt": "A modern, single-story house with large windows is illuminated at night, surrounded by dense forest and rocks.",
"cta": "See all",
"url": "/work",
"isRelative": true
}
8 changes: 6 additions & 2 deletions src/i18n/ui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ export const ui = {
'soon.title': 'This page is in development. Check back later.',
'investors.title': 'Investor Relations',
'investors.description':
'Get access to our reports in the Investor Relations Center.'
'Get access to our reports in the Investor Relations Center.',
'work.title': 'Work',
'work.description': 'View our work and projects at Futureblur.',
},
de: {
'header.locale.description':
Expand Down Expand Up @@ -109,6 +111,8 @@ export const ui = {
'Diese Seite ist in Entwicklung. Schaue später noch einmal vorbei.',
'investors.title': 'Investor Relations',
'investors.description':
'Erhalte Zugang zu unseren Berichten im Investor Relations Center.'
'Erhalte Zugang zu unseren Berichten im Investor Relations Center.',
'work.title': 'Portfolio',
'work.description': 'Sieh dir unser Porttfolio an.',
}
} as const;
71 changes: 71 additions & 0 deletions src/pages/[lang]/work.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
import Layout from "@layouts/Layout.astro";
import { WORK } from "@consts";
import { getLangFromUrl, useTranslations } from "@i18n/utils";
import { Image } from "astro:assets";

export async function getStaticPaths() {
return [
{ params: { lang: 'en' } },
{ params: { lang: 'de' }}
];
}

const t = useTranslations(getLangFromUrl(Astro.url));

// Import all images from the work folder as static assets using Astro's recommended style
const images = import.meta.glob<{ default: ImageMetadata }>(
"/public/images/work/*.{jpg,jpeg,png,tiff,webp,gif}",
{ eager: true }
);

---

<Layout
title={t("work.title")}
siteName="Work"
description={t("work.description")}
cover={WORK.COVER}
>
<div class="page-spacing mx-auto px-4 select-none">
<div class="flex flex-col sm:flex-row gap-2 sm:gap-4">
{(() => {
const imageEntries = Object.entries(images).sort(([a], [b]) => a.localeCompare(b));
const col1 = imageEntries.filter((_, idx) => idx % 2 === 0);
const col2 = imageEntries.filter((_, idx) => idx % 2 === 1);
return (
<>
<div class="flex-1 flex flex-col gap-2 sm:gap-4">
{col1.map(([path, image]) => {
const fileName = path.split('/').pop() ?? '';
return (
<Image
src={image.default}
alt={fileName}
class="w-full h-[60vw] sm:h-auto object-cover rounded-lg select-none"
loading="lazy"
draggable={false}
/>
);
})}
</div>
<div class="flex-1 flex flex-col gap-2 sm:gap-4 mt-0">
{col2.map(([path, image]) => {
const fileName = path.split('/').pop() ?? '';
return (
<Image
src={image.default}
alt={fileName}
class="w-full h-[60vw] sm:h-auto object-cover rounded-lg select-none"
loading="lazy"
draggable={false}
/>
);
})}
</div>
</>
);
})()}
</div>
</div>
</Layout>