Copy update and some formatting

This commit is contained in:
Greg Kilmer
2026-07-04 12:51:42 -04:00
parent 29b4a13345
commit c298562266
9 changed files with 545 additions and 317 deletions
+31 -11
View File
@@ -9,7 +9,7 @@
* Left -> Professional (polished tone)
* Right -> Interests (warm tone)
*/
import Icon from '@components/Icon.astro';
import Icon from "@components/Icon.astro";
interface Props {
/** Optional override copy for each side. Defaults to spec phrasing. */
@@ -20,10 +20,10 @@ interface Props {
}
const {
leftHref = '/professional',
rightHref = '/interests',
leftText = 'See where I apply that curiosity professionally',
rightText = 'See where it takes me outside of work',
leftHref = "/professional",
rightHref = "/interests",
leftText = "See where I apply that curiosity professionally",
rightText = "See where it takes me outside of work",
} = Astro.props;
---
@@ -32,15 +32,25 @@ const {
href={leftHref}
class="card card-interactive group flex items-center justify-between gap-4"
>
<Icon
name="arrow-left"
class="h-6 w-6 shrink-0 transition-transform group-hover:translate-x-1"
style="color: var(--color-accent);"
/>
<span class="flex flex-col gap-1">
<span class="font-mono text-xs uppercase tracking-[0.18em]" style="color: var(--color-text-subtle);">
<span
class="font-mono text-xs uppercase tracking-[0.18em]"
style="color: var(--color-text-subtle); text-align:right;"
>
The professional wing
</span>
<span class="font-sans text-lg font-semibold" style="color: var(--color-text);">
<span
class="font-sans text-lg font-semibold"
style="color: var(--color-text);"
>
{leftText}
</span>
</span>
<Icon name="arrow-right" class="h-6 w-6 shrink-0 transition-transform group-hover:translate-x-1" style="color: var(--color-accent);" />
</a>
<a
@@ -48,13 +58,23 @@ const {
class="card card-interactive group flex items-center justify-between gap-4"
>
<span class="flex flex-col gap-1">
<span class="font-mono text-xs uppercase tracking-[0.18em]" style="color: var(--color-text-subtle);">
<span
class="font-mono text-xs uppercase tracking-[0.18em]"
style="color: var(--color-text-subtle);"
>
The personal wing
</span>
<span class="font-sans text-lg font-semibold" style="color: var(--color-text);">
<span
class="font-sans text-lg font-semibold"
style="color: var(--color-text);"
>
{rightText}
</span>
</span>
<Icon name="arrow-right" class="h-6 w-6 shrink-0 transition-transform group-hover:translate-x-1" style="color: var(--color-accent);" />
<Icon
name="arrow-right"
class="h-6 w-6 shrink-0 transition-transform group-hover:translate-x-1"
style="color: var(--color-accent);"
/>
</a>
</div>
+20 -22
View File
@@ -17,67 +17,65 @@
* </CelestialFrame>
* <CelestialFrame rounded="none"> ... </CelestialFrame>
*/
import StarBurst from './StarBurst.astro';
import StarBurst from "./StarBurst.astro";
interface Props {
class?: string;
/** Corner rounding. */
rounded?: 'lg' | 'xl' | '2xl' | 'none';
rounded?: "lg" | "xl" | "2xl" | "none";
/** Stroke emphasis on the frame border. */
emphasis?: 'subtle' | 'strong';
emphasis?: "subtle" | "strong";
}
const {
class: className = '',
rounded = '2xl',
emphasis = 'subtle',
class: className = "",
rounded = "2xl",
emphasis = "subtle",
} = Astro.props;
const radius = {
none: 'rounded-none',
lg: 'rounded-lg',
xl: 'rounded-xl',
'2xl': 'rounded-2xl',
none: "rounded-none",
lg: "rounded-lg",
xl: "rounded-xl",
"2xl": "rounded-2xl",
}[rounded];
const borderStyle =
emphasis === 'strong'
? 'border-2'
: 'border';
const borderStyle = emphasis === "strong" ? "border-2" : "border";
---
<figure
class:list={['relative', radius, borderStyle, className]}
style="border-color: color-mix(in srgb, var(--color-accent) 45%, transparent);"
class:list={["relative", radius, borderStyle, className]}
style="border-color: color-mix(in srgb, var(--color-accent) 75%, transparent); border-width: 3px;"
>
{/* Faint sacred-geometry tint behind the image. */}
<div
class:list={['absolute inset-0', radius]}
class:list={["absolute inset-0", radius]}
style="background: color-mix(in srgb, var(--color-violet, var(--color-accent)) 14%, var(--color-surface-sunken));"
aria-hidden="true"
>
</div>
{/* The media itself, clipped to the frame. */}
<div class:list={['relative overflow-hidden', radius]}>
<div class:list={["relative overflow-hidden", radius]}>
<slot />
</div>
{/* Corner star-burst flourishes (sit on the border corners). */}
<StarBurst
class="pointer-events-none absolute -left-2 -top-2 h-5 w-5 drop-shadow-[0_0_6px_color-mix(in_srgb,var(--color-accent)_60%,transparent)]"
class="pointer-events-none absolute -left-3 -top-3 h-6 w-6 drop-shadow-[0_0_6px_color-mix(in_srgb,var(--color-accent)_60%,transparent)]"
style="color: var(--color-accent);"
/>
<StarBurst
class="pointer-events-none absolute -bottom-2 -right-2 h-5 w-5 drop-shadow-[0_0_6px_color-mix(in_srgb,var(--color-accent)_60%,transparent)]"
class="pointer-events-none absolute -bottom-5 -right-5 h-7 w-7 drop-shadow-[0_0_6px_color-mix(in_srgb,var(--color-accent)_60%,transparent)]"
style="color: var(--color-accent);"
/>
<StarBurst
variant="outline"
class="pointer-events-none absolute -right-1 -top-1 h-3 w-3"
class="pointer-events-none absolute -right-2 -top-2 h-3 w-3"
style="color: var(--color-accent); opacity:.7;"
/>
<StarBurst
variant="outline"
class="pointer-events-none absolute -left-1 -bottom-1 h-3 w-3"
class="pointer-events-none absolute -left-2 -bottom-2 h-3 w-3"
style="color: var(--color-accent); opacity:.7;"
/>
</figure>
+57 -50
View File
@@ -14,8 +14,8 @@
* <CelestialImage src="/images/hero.jpg" alt="Greg at his desk" aspect="4/3" />
* <CelestialImage src="/images/about.jpg" alt="Greg" aspect="3/4" rounded="xl" />
*/
import CelestialFrame from './CelestialFrame.astro';
import StarField from './StarField.astro';
import CelestialFrame from "./CelestialFrame.astro";
import StarField from "./StarField.astro";
interface Props {
src?: string;
@@ -23,8 +23,8 @@ interface Props {
/** Aspect ratio, e.g. "4/3", "3/4", "16/9". */
aspect?: string;
/** Image fit. object-cover by default. */
fit?: 'cover' | 'contain';
rounded?: 'lg' | 'xl' | '2xl' | 'none';
fit?: "cover" | "contain";
rounded?: "lg" | "xl" | "2xl" | "none";
class?: string;
/** When true, render only the frame + placeholder (no <img>). */
placeholder?: boolean;
@@ -33,61 +33,68 @@ interface Props {
const {
src,
alt,
aspect = '4/3',
fit = 'cover',
rounded = '2xl',
class: className = '',
aspect = "4/3",
fit = "cover",
rounded = "2xl",
class: className = "",
placeholder = false,
} = Astro.props;
const showPlaceholder = placeholder || !src;
const objectFit = fit === 'contain' ? 'object-contain' : 'object-cover';
const objectFit = fit === "contain" ? "object-contain" : "object-cover";
---
<CelestialFrame rounded={rounded} class:list={['w-full', className]}>
<CelestialFrame rounded={rounded} class:list={["w-full", className]}>
<div class="w-full" style={`aspect-ratio: ${aspect};`}>
{showPlaceholder ? (
// Themed SVG placeholder: starfield + moon glyph over the surface tone.
<div
class="relative h-full w-full"
style="background: radial-gradient(120% 90% at 30% 20%, color-mix(in srgb, var(--color-violet, var(--color-accent)) 22%, transparent), transparent 60%), var(--color-surface-sunken);"
>
<StarField
class="absolute inset-0 h-full w-full"
style="color: var(--color-accent); opacity:.5;"
/>
{
showPlaceholder ? (
// Themed SVG placeholder: starfield + moon glyph over the surface tone.
<div
class="absolute inset-0 flex items-center justify-center"
aria-hidden="true"
class="relative h-full w-full"
style="background: radial-gradient(120% 90% at 30% 20%, color-mix(in srgb, var(--color-violet, var(--color-accent)) 22%, transparent), transparent 60%), var(--color-surface-sunken);"
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
class="h-10 w-10"
fill="none"
stroke="currentColor"
stroke-width="1"
style="color: var(--color-accent); opacity:.55;"
<StarField
class="absolute inset-0 h-full w-full"
style="color: var(--color-accent); opacity:.5;"
/>
<div
class="absolute inset-0 flex items-center justify-center"
aria-hidden="true"
>
{/* Crescent moon + small star as the placeholder glyph. */}
<path d="M16 12a7 7 0 1 1-6.4-7 5.5 5.5 0 0 0 0 14A7 7 0 0 0 16 12z" />
<path d="M18.5 5.5c.3 1.8 1 3.1 2.5 3.5-1.5.3-2.2 1.7-2.5 3.5-.3-1.8-1-3.2-2.5-3.5 1.5-.4 2.2-1.7 2.5-3.5z" fill="currentColor" stroke="none" />
</svg>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
class="h-10 w-10"
fill="none"
stroke="currentColor"
stroke-width="1"
style="color: var(--color-accent); opacity:.55;"
>
{/* Crescent moon + small star as the placeholder glyph. */}
<path d="M16 12a7 7 0 1 1-6.4-7 5.5 5.5 0 0 0 0 14A7 7 0 0 0 16 12z" />
<path
d="M18.5 5.5c.3 1.8 1 3.1 2.5 3.5-1.5.3-2.2 1.7-2.5 3.5-.3-1.8-1-3.2-2.5-3.5 1.5-.4 2.2-1.7 2.5-3.5z"
fill="currentColor"
stroke="none"
/>
</svg>
</div>
<span
class="absolute bottom-3 left-1/2 -translate-x-1/2 font-mono text-[0.6rem] uppercase tracking-[0.2em]"
style="color: var(--color-text-subtle); opacity:.8;"
>
{alt}
</span>
</div>
<span
class="absolute bottom-3 left-1/2 -translate-x-1/2 font-mono text-[0.6rem] uppercase tracking-[0.2em]"
style="color: var(--color-text-subtle); opacity:.8;"
>
{alt}
</span>
</div>
) : (
<img
src={src}
alt={alt}
loading="lazy"
decoding="async"
class:list={['h-full w-full', objectFit]}
/>
)}
) : (
<img
src={src}
alt={alt}
loading="lazy"
decoding="async"
class:list={["h-full w-full", objectFit]}
/>
)
}
</div>
</CelestialFrame>