diff --git a/apps/website/package.json b/apps/website/package.json index 67b70d7..2236610 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -45,7 +45,7 @@ "postcss-preset-env": "^9.6.0", "postcss-sort-media-queries": "^5.2.0", "sass": "^1.77.8", - "svelte": "^4.2.18", + "svelte": "^5.0.0-next.205", "svelte-check": "^3.8.5", "svelte-preprocess": "^6.0.2", "tslib": "^2.6.3", diff --git a/apps/website/src/components/Analytics.svelte b/apps/website/src/components/Analytics.svelte index d13c6d4..69cf1e2 100644 --- a/apps/website/src/components/Analytics.svelte +++ b/apps/website/src/components/Analytics.svelte @@ -1,6 +1,11 @@ diff --git a/apps/website/src/components/Metas.svelte b/apps/website/src/components/Metas.svelte index 6995566..c53364d 100644 --- a/apps/website/src/components/Metas.svelte +++ b/apps/website/src/components/Metas.svelte @@ -4,13 +4,23 @@ const { settings }: any = getContext('global') - export let title: string - export let description: string = undefined - export let image: string = getAssetUrlKey(settings.seo_image.id, 'share-image') - export let url: string = undefined - export let type = 'website' - export let card = 'summary_large_image' - export let creator: string = undefined + let { + title, + description, + image = getAssetUrlKey(settings.seo_image.id, 'share-image'), + url, + type = 'website', + card = 'summary_large_image', + creator, + }: { + title: string + description?: string + image?: string + url?: string + type?: string + card?: string + creator?: string + } = $props() @@ -20,16 +30,16 @@ {#if description} - - + + {/if} {#if image} - - + + {/if} {#if url} - + {/if} diff --git a/apps/website/src/components/SmoothScroll.svelte b/apps/website/src/components/SmoothScroll.svelte index 4a95367..b0a6b75 100644 --- a/apps/website/src/components/SmoothScroll.svelte +++ b/apps/website/src/components/SmoothScroll.svelte @@ -1,11 +1,10 @@ {#if clone} diff --git a/apps/website/src/components/atoms/AboutGridPhoto.svelte b/apps/website/src/components/atoms/AboutGridPhoto.svelte index 283fce7..7452a30 100644 --- a/apps/website/src/components/atoms/AboutGridPhoto.svelte +++ b/apps/website/src/components/atoms/AboutGridPhoto.svelte @@ -2,20 +2,31 @@ import { cx } from 'classix' import Image from './Image.svelte' - export let id: string - export let alt: string - export let disabled = false + let { + id, + alt, + disabled = false, + ...props + }: { + id: string + alt: string + disabled?: boolean + class?: string + } = $props() - let hovering = false - let timer: ReturnType | number = null + let hovering = $state(false) + let timer: ReturnType - $: classes = cx( + const classes = $derived(cx( hovering ? 'is-hovered' : undefined, disabled ? 'is-disabled' : undefined, - $$props.class - ) + props.class, + )) - // Hovering functions + + /** + * Hovering functions + */ const handleMouseEnter = () => { clearTimeout(timer) hovering = true @@ -26,9 +37,10 @@ } -
diff --git a/apps/website/src/components/atoms/BoxCTA/BoxCTA.scss b/apps/website/src/components/atoms/BoxCTA/BoxCTA.scss index bd660cf..34061f4 100644 --- a/apps/website/src/components/atoms/BoxCTA/BoxCTA.scss +++ b/apps/website/src/components/atoms/BoxCTA/BoxCTA.scss @@ -42,7 +42,7 @@ margin-left: 20px; color: $color-secondary-light; text-align: left; - font-weight: 300; + font-weight: 400; @include bp (sm) { margin-left: 0; diff --git a/apps/website/src/components/atoms/BoxCTA/BoxCTA.svelte b/apps/website/src/components/atoms/BoxCTA/BoxCTA.svelte index 4b7d964..e5bd596 100644 --- a/apps/website/src/components/atoms/BoxCTA/BoxCTA.svelte +++ b/apps/website/src/components/atoms/BoxCTA/BoxCTA.svelte @@ -5,10 +5,17 @@ diff --git a/apps/website/src/components/atoms/Button/Button.svelte b/apps/website/src/components/atoms/Button/Button.svelte index 91e6e8a..834e8d6 100644 --- a/apps/website/src/components/atoms/Button/Button.svelte +++ b/apps/website/src/components/atoms/Button/Button.svelte @@ -6,56 +6,71 @@ import { cx } from 'classix' import SplitText from '$components/SplitText.svelte' - export let text: string - export let url: string = undefined - export let color: string = undefined - export let size: 'xsmall' | 'small' | 'medium' | 'large' - export let effect = 'link-3d' - export let disabled: boolean = undefined - export let slotPosition = 'before' + let { + text, + url, + color, + size, + effect = 'link-3d', + disabled, + slotPosition = 'before', + onclick, + children, + ...props + }: { + text: string + url?: string + color?: string + size: 'xsmall' | 'small' | 'medium' | 'large' + effect?: string + disabled?: boolean + slotPosition?: 'before' | 'after' + onclick?: any + children?: any + class?: string + } = $props() - let tag: 'a' | 'button' - $: tag = url ? 'a' : 'button' - - $: classes = cx( + const tag = $derived(url ? 'a' : 'button') + const classes = $derived(cx( 'button', - effect ? effect : undefined, + effect, ...[color, size].map(variant => variant && `button--${variant}`), - Object.keys($$slots).length !== 0 ? `has-icon-${slotPosition}` : undefined, - $$props.class, - ) + children && `has-icon-${slotPosition}`, + props.class, + )) // Define external links - $: isExternal = /^(http|https):\/\//i.test(url) - $: isProtocol = /^(mailto|tel):/i.test(url) - $: rel = isExternal ? 'external noopener' : null - $: target = isExternal ? '_blank' : null + const isExternal = $derived(/^(http|https):\/\//i.test(url)) + const isProtocol = $derived(/^(mailto|tel):/i.test(url)) + const rel = $derived(isExternal ? 'external noopener' : null) + const target = $derived(isExternal ? '_blank' : null) {#if tag === 'button'} - {:else if tag === 'a'} - {#if slotPosition === 'before'} - + {#if children && slotPosition === 'before'} + {@render children()} {/if} - {#if slotPosition === 'after'} - + {#if children && slotPosition === 'after'} + {@render children()} {/if} {/if} diff --git a/apps/website/src/components/atoms/ButtonCart/ButtonCart.svelte b/apps/website/src/components/atoms/ButtonCart/ButtonCart.svelte index d5afa54..49696e8 100644 --- a/apps/website/src/components/atoms/ButtonCart/ButtonCart.svelte +++ b/apps/website/src/components/atoms/ButtonCart/ButtonCart.svelte @@ -18,7 +18,7 @@
- + {#if $cartAmount > 0} {$cartAmount} diff --git a/apps/website/src/components/atoms/ButtonCircle/ButtonCircle.svelte b/apps/website/src/components/atoms/ButtonCircle/ButtonCircle.svelte index 9c3762a..72c9870 100644 --- a/apps/website/src/components/atoms/ButtonCircle/ButtonCircle.svelte +++ b/apps/website/src/components/atoms/ButtonCircle/ButtonCircle.svelte @@ -5,42 +5,58 @@ +{#snippet content()} + {#if clone} + {#each Array(2) as _} + {@render children()} + {/each} + {:else} + {@render children()} + {/if} +{/snippet} + + {#if tag === 'a'} - - {#if clone} - {#each Array(2) as _} - - {/each} - {:else} - - {/if} + + {@render content()} {:else} - {/if} diff --git a/apps/website/src/components/atoms/Icon.svelte b/apps/website/src/components/atoms/Icon.svelte index c810948..01d9cea 100644 --- a/apps/website/src/components/atoms/Icon.svelte +++ b/apps/website/src/components/atoms/Icon.svelte @@ -1,12 +1,15 @@ - + diff --git a/apps/website/src/components/atoms/IconArrow.svelte b/apps/website/src/components/atoms/IconArrow.svelte index 0fb5ad0..3aeac6e 100644 --- a/apps/website/src/components/atoms/IconArrow.svelte +++ b/apps/website/src/components/atoms/IconArrow.svelte @@ -18,11 +18,17 @@ - diff --git a/apps/website/src/components/atoms/IconEarth.svelte b/apps/website/src/components/atoms/IconEarth.svelte index ed9a9c7..a1e3d52 100644 --- a/apps/website/src/components/atoms/IconEarth.svelte +++ b/apps/website/src/components/atoms/IconEarth.svelte @@ -9,12 +9,18 @@ diff --git a/apps/website/src/components/atoms/Image.svelte b/apps/website/src/components/atoms/Image.svelte index bdbd00b..05c3306 100644 --- a/apps/website/src/components/atoms/Image.svelte +++ b/apps/website/src/components/atoms/Image.svelte @@ -1,16 +1,31 @@ - + - \ No newline at end of file + diff --git a/apps/website/src/components/atoms/ScrollingTitle.svelte b/apps/website/src/components/atoms/ScrollingTitle.svelte index e862765..31a5cf1 100644 --- a/apps/website/src/components/atoms/ScrollingTitle.svelte +++ b/apps/website/src/components/atoms/ScrollingTitle.svelte @@ -12,39 +12,53 @@ import { map } from 'utils/math' import reveal from '$animations/reveal' - export let tag: string - export let label: string = undefined - export let parallax: number = undefined - export let offsetStart: number = undefined - export let offsetEnd: number = undefined - export let animate = true + let { + tag, + label, + parallax, + offsetStart, + offsetEnd, + animate = true, + children, + ...props + }: { + tag: string + label?: string + parallax?: number + offsetStart?: number + offsetEnd?: number + animate?: boolean + class?: string + children?: any + } = $props() - let scrollY: number - let innerWidth: number - let innerHeight: number - let titleEl: HTMLElement - let isLarger: boolean - - // Define default values - $: if (titleEl && !offsetStart && !offsetEnd) { - offsetStart = titleEl.offsetTop - innerHeight * (innerWidth < 768 ? 0.2 : 0.75) - offsetEnd = titleEl.offsetTop + innerHeight * (innerWidth < 768 ? 0.5 : 0.5) - } + let scrollY = $state() + let innerWidth = $state() + let innerHeight = $state() + let titleEl = $state() // Check if title is larger than viewport to translate it - $: isLarger = titleEl && titleEl.offsetWidth >= innerWidth + const isLarger = $derived(titleEl && titleEl.offsetWidth >= innerWidth) - // Calculate the parallax value - $: if (titleEl) { - const toTranslate = 100 - (innerWidth / titleEl.offsetWidth * 100) - parallax = isLarger ? map(scrollY, offsetStart, offsetEnd, 0, -toTranslate, true) : 0 - } + $effect(() => { + // Define default values + if (titleEl && !offsetStart && !offsetEnd) { + offsetStart = titleEl.offsetTop - innerHeight * (innerWidth < 768 ? 0.2 : 0.75) + offsetEnd = titleEl.offsetTop + innerHeight * (innerWidth < 768 ? 0.5 : 0.5) + } - $: classes = cx( + // Calculate the parallax value + if (titleEl) { + const toTranslate = 100 - (innerWidth / titleEl.offsetWidth * 100) + parallax = isLarger ? map(scrollY, offsetStart, offsetEnd, 0, -toTranslate, true) : 0 + } + }) + + const classes = $derived(cx( 'scrolling-title', 'title-huge', - $$props.class - ) + props.class, + )) const revealOptions = animate ? { children: '.char', @@ -65,9 +79,10 @@ - + {@render children()} diff --git a/apps/website/src/components/atoms/SiteTitle/SiteTitle.svelte b/apps/website/src/components/atoms/SiteTitle/SiteTitle.svelte index 9c728e8..fbf8aab 100644 --- a/apps/website/src/components/atoms/SiteTitle/SiteTitle.svelte +++ b/apps/website/src/components/atoms/SiteTitle/SiteTitle.svelte @@ -7,8 +7,13 @@ import reveal from '$animations/reveal' import { DURATION } from '$utils/constants' - export let variant = 'lines' - export let tag = 'h1' + let { + variant = 'lines', + tag = 'h1', + }: { + variant?: 'inline' | 'lines' + tag?: string + } = $props() {#if tag === 'h1'} diff --git a/apps/website/src/components/layouts/PosterLayout/PosterLayout.svelte b/apps/website/src/components/layouts/PosterLayout/PosterLayout.svelte index f57c63d..a71755b 100644 --- a/apps/website/src/components/layouts/PosterLayout/PosterLayout.svelte +++ b/apps/website/src/components/layouts/PosterLayout/PosterLayout.svelte @@ -12,20 +12,16 @@ import ScrollingTitle from '$components/atoms/ScrollingTitle.svelte' import Carousel from '$components/organisms/Carousel/Carousel.svelte' - export let product: any - export let shopProduct: any + let { + product, + shopProduct, + }: { + product: any + shopProduct: any + } = $props() - $: hasStock = shopProduct.stock_level > 0 - - - /** - * Preview photos specs - */ - let lastPreviewPhoto: any = undefined - - $: if (product && product.photos_preview.length) { - lastPreviewPhoto = product.photos_preview[product.photos_preview.length - 1].directus_files_id - } + const hasStock = $derived(shopProduct.stock_level > 0) + const lastPreviewPhoto = $derived(product?.photos_preview[product.photos_preview.length - 1]?.directus_files_id) // Images sizes const photosPreview = [ @@ -82,7 +78,7 @@ text={hasStock ? 'Add to cart' : 'Sold out'} color="pinklight" disabled={!hasStock} - on:click={() => addToCart(shopProduct)} + onclick={() => addToCart(shopProduct)} />
diff --git a/apps/website/src/components/molecules/CartItem/CartItem.svelte b/apps/website/src/components/molecules/CartItem/CartItem.svelte index 3e1b749..73a6ced 100644 --- a/apps/website/src/components/molecules/CartItem/CartItem.svelte +++ b/apps/website/src/components/molecules/CartItem/CartItem.svelte @@ -3,29 +3,28 @@
@@ -50,16 +49,17 @@ selected: index + 1 === item.quantity, } })} - on:change={updateQuantity} + onchange={updateQuantity} value={String(item.quantity)} > Quantity: {/if} - onremoved(item.id)} > diff --git a/apps/website/src/components/molecules/EmailForm/EmailForm.svelte b/apps/website/src/components/molecules/EmailForm/EmailForm.svelte index 6ad8906..694bd54 100644 --- a/apps/website/src/components/molecules/EmailForm/EmailForm.svelte +++ b/apps/website/src/components/molecules/EmailForm/EmailForm.svelte @@ -10,10 +10,10 @@ import IconArrow from '$components/atoms/IconArrow.svelte' import ButtonCircle from '$components/atoms/ButtonCircle/ButtonCircle.svelte' - export let past = false + let { past = false }: { past?: boolean } = $props() - let inputInFocus = false - let formStatus: FormStatus = null + let inputInFocus = $state(false) + let formStatus = $state() let formMessageTimeout: ReturnType | number interface FormStatus { @@ -27,13 +27,15 @@ INVALID_EMAIL: `Woops. This email doesn't seem to be valid.`, } - $: isSuccess = formStatus && formStatus.success + const isSuccess = $derived(formStatus && formStatus.success) // Toggle input focus const toggleFocus = () => inputInFocus = !inputInFocus // Handle form submission async function handleForm (event: Event | HTMLFormElement) { + event.preventDefault() + const data = new FormData(this) const email = data.get('email') @@ -61,13 +63,16 @@