const { useState, useEffect, useRef } = React; /* ------------------------------- Tweak defaults ------------------------------- */ const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "palette": "honeyMoss", "heroLayout": "split", "showMarquee": true, "showSplash": true, "embedVideos": false }/*EDITMODE-END*/; // Palettes pulled from the logo (cream/yellow ground + paint splash colors). // Each palette defines: bg (page), ink (text), accent (primary), accent2 (secondary), tags (3 tag colors). const PALETTES = { stainedGlass: { name: "Stained Glass", bg: "#F5E9C8", paper: "#FAF3DD", ink: "#1A1410", inkSoft: "#3A2F26", accent: "#2E5BD8", accent2: "#3FA85C", tags: ["#E2412A", "#2E5BD8", "#3FA85C"], }, cobaltLeaf: { name: "Cobalt & Leaf", bg: "#F5E9C8", paper: "#FAF3DD", ink: "#1A1410", inkSoft: "#3A2F26", accent: "#2E5BD8", accent2: "#F2A93B", tags: ["#2E5BD8", "#3FA85C", "#F2A93B"], }, emberAmber: { name: "Ember & Amber", bg: "#F5E9C8", paper: "#FAF3DD", ink: "#1A1410", inkSoft: "#3A2F26", accent: "#E2412A", accent2: "#F2A93B", tags: ["#E2412A", "#F2A93B", "#3FA85C"], }, meadow: { name: "Meadow", bg: "#F5E9C8", paper: "#FAF3DD", ink: "#1A1410", inkSoft: "#3A2F26", accent: "#3FA85C", accent2: "#2E5BD8", tags: ["#3FA85C", "#2E5BD8", "#F2A93B"], }, inkwell: { name: "Inkwell", bg: "#F5E9C8", paper: "#FAF3DD", ink: "#1A1410", inkSoft: "#3A2F26", accent: "#1A1410", accent2: "#E2412A", tags: ["#1A1410", "#E2412A", "#F2A93B"], }, honeyMoss: { name: "Honey & Moss", bg: "#F5E9C8", paper: "#FAF3DD", ink: "#1A1410", inkSoft: "#3A2F26", accent: "#F2A93B", accent2: "#3FA85C", tags: ["#F2A93B", "#3FA85C", "#2E5BD8"], }, }; /* ------------------------------- Icons ------------------------------- */ const I = { yt: (props) => ( ), ig: (props) => ( ), tt: (props) => ( ), shop: (props) => ( ), play: (props) => ( ), arrow: (props) => ( ), }; /* ------------------------------- Data ------------------------------- */ const VIDEOS = [ { id: "CL8XI_ae3Qo", title: "Painting blossoms onto cobalt glass", tag: "Latest", duration: "12 min" }, { id: "t1do9qbKfXg", title: "Layering color: glass painting basics", tag: "Tutorial", duration: "9 min" }, { id: "EGxLsbUgsCs", title: "A wine glass becomes a garden", tag: "Studio", duration: "15 min" }, ]; const PRODUCTS = [ { name: "Hand-painted vase, no. 04", category: "Originals", price: "$148", color: "p1" }, { name: "Wildflower wine glass set", category: "Sets of two", price: "$96", color: "p2" }, { name: "Botanical pitcher", category: "Originals", price: "$210", color: "p3" }, ]; /* ------------------------------- Components ------------------------------- */ function Nav({ accent }) { return ( ); } function Hero({ accent, accent2, tags = [], showSplash, layout }) { return (
Painting on Glass · Est. Glass Art Lab

Brushstrokes
that turn glass
into a garden.

Hi, I'm the artist behind Glass Art Lab. I paint flowers, leaves and small wild things onto vases, glasses and pitchers — and I film every step on YouTube so you can paint along.

Watch on YouTube Visit the shop
{ layout === "split" && (
{showSplash &&
} Rainbow chevron painted glass cube — Glass Art Lab
Original work
▶ 4.5K subscribers
New video Friday
)}
); } function Marquee({ show, tags = [] }) { if (!show) return null; const items = ["Painting on glass", "Hand-made originals", "Tutorials every Friday", "Shipped from the studio"]; const colors = [tags[0] || "#E2412A", tags[1] || "#2E5BD8", tags[2] || "#3FA85C", tags[0] || "#F2A93B"]; const row = items.map((t, i) => ( {t} )); return (
{row}{row}{row}
); } function About({ accent }) { return (
01 — About

The studio,
in my words.

Glowing painted glass votive with green leaves on cobalt — Glass Art Lab studio

I started painting on glass because the surface refuses to behave. Paint pools, slides, catches the light wrong, then suddenly catches it perfectly — and there's a flower where there wasn't one before. I never quite know what a piece will look like until the last layer is dry.

Every video on the channel is filmed in my home studio, usually with the cat doing laps in the background. I share the messy parts too — the wobbly first lines, the colors that didn't work, the things I had to scrape off and start over. That's the part I think makes painting feel possible.

If you'd like to paint along, the channel is the best place to start. If you'd like to take home an original, the shop is opening soon. Either way — thank you for being here.

— Painted with love
); } function VideoCard({ v, embed }) { const [open, setOpen] = useState(false); const playing = embed || open; return (
setOpen(true)} role="button" aria-label={`Play ${v.title}`}> {playing ? (