diff --git a/src/components/projects/Project.astro b/src/components/projects/Project.astro index 91365c8..2f04075 100644 --- a/src/components/projects/Project.astro +++ b/src/components/projects/Project.astro @@ -26,6 +26,35 @@ const { } = Astro.props; const leftProject = position == "left"; +const side = leftProject ? "left" : "right"; +const layers = ["background", "frontfacing"] as const; + +const renderLayer = ( + src: ImageMetadata, + theme: "dark" | "light", + layer: (typeof layers)[number], +) => { + const isBackground = layer === "background"; + const isLight = theme === "light"; + + return { + src, + class: [ + "absolute top-1/2 left-1/2 aspect-video max-w-full rounded-xl border-2 border-solid", + isLight + ? "project-image-light hidden border-gray-300" + : "project-image-dark border-gray-800", + isBackground ? "background-img opacity-40" : "frontfacing-img opacity-100", + isBackground && isLight ? "brightness-75" : "", + side, + ] + .filter(Boolean) + .join(" "), + classList: { + "has-light-image": !isLight && Boolean(image_light), + }, + }; +}; ---
{ - image && alt && ( - <> - {alt} - {alt} - {image_light && ( - <> - - - - )} - - ) + image && + layers.map((layer) => { + const layerProps = renderLayer(image, "dark", layer); + return ( + {alt + ); + }) + } + { + image_light && + layers.map((layer) => { + const layerProps = renderLayer(image_light, "light", layer); + return ( + {alt + ); + }) }
- - +
diff --git a/src/components/projects/TaskWidget.svelte b/src/components/projects/TaskWidget.svelte index 185cc8b..04a9344 100644 --- a/src/components/projects/TaskWidget.svelte +++ b/src/components/projects/TaskWidget.svelte @@ -135,74 +135,83 @@ ]; interface Props { - classList: string; + position?: "left" | "right"; } - let { classList }: Props = $props(); + let { position = "right" }: Props = $props(); + const side = $derived(position === "left" ? "left" : "right"); -
- -
+{#snippet widgetLayer(layerClass: string, extraClass: string)} +
+
- Hover here! - 0/100+ -
-
-
- {#each streamers as { streamer, tasks }} -
- {streamer} : -
    - {#each tasks as task} -
  1. - {task.name} -
  2. - {/each} -
-
- {/each} + > + Hover here! + 0/100+
-
- {#each streamers as { streamer, tasks }} -
+
+ {#each streamers as { streamer, tasks }} +
- {streamer} : -
    - {#each tasks as task} -
  1. - {task.name} -
  2. - {/each} -
-
- {/each} + > + {streamer} : +
    + {#each tasks as task} +
  1. + {task.name} +
  2. + {/each} +
+
+ {/each} +
+
+ {#each streamers as { streamer, tasks }} +
+ {streamer} : +
    + {#each tasks as task} +
  1. + {task.name} +
  2. + {/each} +
+
+ {/each} +
-
+{/snippet} + +{@render widgetLayer("background-widget", "opacity-40 brightness-75")} +{@render widgetLayer("frontfacing-widget", "opacity-100")}