diff --git a/apps/storefront/app/collections/page.tsx b/apps/storefront/app/collections/page.tsx index d075657..4552559 100644 --- a/apps/storefront/app/collections/page.tsx +++ b/apps/storefront/app/collections/page.tsx @@ -1,44 +1,45 @@ import { Container, EmptyState } from '@tms/ui'; import type { Metadata } from 'next'; -import { CollectionCard } from '@/components/collection/collection-card'; +import { ArtworkCard } from '@/components/artwork/artwork-card'; import { PageHeader } from '@/components/site/page-header'; -import { artworkImage } from '@/lib/artwork-images'; +import { Reveal } from '@/components/site/reveal'; import { dataProvider } from '@/lib/data'; export const metadata: Metadata = { title: 'Collections', - description: 'Curated bodies of work, grouped by theme and season.', + description: 'Browse every standalone artwork in the F.A.T.U collection.', }; export default async function CollectionsPage() { - const summaries = await dataProvider.listCollectionSummaries(); - - // Collection summaries carry no cover image, so pull each collection's pieces and pick the first - // one we actually hold a drawing for as the chapter cover. A handful of collections; cheap. - const details = await Promise.all(summaries.map((s) => dataProvider.getCollection(s.slug))); - const collections = summaries.map((summary, i) => ({ - summary, - coverSlug: details[i]?.artworks.find((a) => artworkImage(a.slug) !== null)?.slug ?? null, - })); + const { items: artworks } = await dataProvider.listArtworks({ limit: 60 }); return ( - {collections.length === 0 ? ( + {artworks.length === 0 ? ( - + ) : ( - - {collections.map(({ summary, coverSlug }) => ( - - + + {artworks.map((artwork, i) => ( + + + + ))} diff --git a/apps/storefront/app/page.tsx b/apps/storefront/app/page.tsx index 911647f..23de2ef 100644 --- a/apps/storefront/app/page.tsx +++ b/apps/storefront/app/page.tsx @@ -32,25 +32,47 @@ const FEATURES = [ { icon: Truck, title: 'Shipped nationwide', sub: 'Across Nigeria' }, ]; +/** Preferred hero order — lead with covered streetwear, then distinct plates (no repeats). */ +const HERO_SLUG_ORDER = [ + 'okada-run', + 'africa-united-heritage-trio', + 'artisan-circle', + 'lantern-keeper', + 'rainy-season', +] as const; + +/** Too revealing for the opening stage — keep it in the catalogue, just not in the hero loop. */ +const HERO_EXCLUDED_SLUGS = new Set(['midnight-in-lagos']); + export default async function HomePage() { const [{ items: artworks }, collectionSummaries] = await Promise.all([ - dataProvider.listArtworks({ limit: 8 }), + dataProvider.listArtworks({ limit: 40 }), dataProvider.listCollectionSummaries(), ]); - // The night piece opens the page: a dark, atmospheric drawing carries the dark hero. - const hero = artworks.find((a) => a.slug === 'midnight-in-lagos') ?? artworks[0]; + const bySlug = new Map(artworks.map((a) => [a.slug, a])); + const seenSrc = new Set(); + const heroSlides: { slug: string; src: string; title: string }[] = []; + + // Prefer the curated order first, then fill from the catalogue — one plate per slide, no dupes. + for (const slug of [ + ...HERO_SLUG_ORDER, + ...artworks.map((a) => a.slug).filter((s) => !(HERO_SLUG_ORDER as readonly string[]).includes(s)), + ]) { + if (heroSlides.length >= PILLARS.length) break; + if (HERO_EXCLUDED_SLUGS.has(slug)) continue; + const artwork = bySlug.get(slug); + const src = artwork ? artworkImage(artwork.slug) : null; + if (!artwork || !src || seenSrc.has(src)) continue; + seenSrc.add(src); + heroSlides.push({ slug: artwork.slug, src, title: artwork.title }); + } + + const hero = bySlug.get(heroSlides[0]?.slug ?? '') ?? artworks[0]; const drops = artworks.filter((a) => a.slug !== hero?.slug).slice(0, 3); const feature = artworks.filter((a) => a.slug !== hero?.slug).slice(3, 4)[0] ?? drops[0]; const featureSrc = feature ? artworkImage(feature.slug) : null; - // The hero cycles through up to five drawings, in step with the 01–05 pillar row. Lead with the - // night piece, then fill from the rest of the catalogue — only pieces whose plate we actually hold. - const heroSlides = [hero, ...artworks.filter((a) => a.slug !== hero?.slug)] - .filter((a): a is NonNullable => a != null && artworkImage(a.slug) !== null) - .slice(0, PILLARS.length) - .map((a) => ({ slug: a.slug, src: artworkImage(a.slug) as string, title: a.title })); - // Shop-by-collection tiles need a cover; pull each collection's pieces and take a drawing we hold. const collectionDetails = await Promise.all( collectionSummaries.slice(0, 4).map((s) => dataProvider.getCollection(s.slug)), diff --git a/apps/storefront/app/shop/page.tsx b/apps/storefront/app/shop/page.tsx index d0ed3b2..a664c97 100644 --- a/apps/storefront/app/shop/page.tsx +++ b/apps/storefront/app/shop/page.tsx @@ -1,9 +1,11 @@ import { Container, EmptyState } from '@tms/ui'; import type { Metadata } from 'next'; import { ProductCard } from '@/components/product/product-card'; +import { ShopDesignCard } from '@/components/product/shop-design-card'; import { PageHeader } from '@/components/site/page-header'; import { Reveal } from '@/components/site/reveal'; import { dataProvider } from '@/lib/data'; +import { suppliedShopDesigns } from '@/lib/data/supplied-catalogue'; export const metadata: Metadata = { title: 'Shop', @@ -18,24 +20,54 @@ export default async function ShopPage() { + + + Clothing designs + + + Every supplied shirt and worn-piece image lives here in Shop, linked to the artwork it + carries. + + + {suppliedShopDesigns.map((design, i) => ( + + + + + + ))} + + + {products.length === 0 ? ( ) : ( - - {products.map((product, i) => ( - - - - - - ))} - + + + Available pieces + + + {products.map((product, i) => ( + + + + + + ))} + + )} ); diff --git a/apps/storefront/components/product/shop-design-card.tsx b/apps/storefront/components/product/shop-design-card.tsx new file mode 100644 index 0000000..b5d4453 --- /dev/null +++ b/apps/storefront/components/product/shop-design-card.tsx @@ -0,0 +1,35 @@ +import Link from 'next/link'; +import { TileBadge, TileImage } from '@/components/site/tile'; +import type { SuppliedShopDesign } from '@/lib/data/supplied-catalogue'; + +/** A supplied clothing photograph linked back to its immutable artwork canvas. */ +export function ShopDesignCard({ + design, + priority = false, +}: { + design: SuppliedShopDesign; + priority?: boolean; +}) { + return ( + + Clothing design} + /> + + + {design.title} + + + {design.garment} + Design yours + + + + ); +} diff --git a/apps/storefront/components/site/hero-slideshow.tsx b/apps/storefront/components/site/hero-slideshow.tsx index bb35cf9..1921e31 100644 --- a/apps/storefront/components/site/hero-slideshow.tsx +++ b/apps/storefront/components/site/hero-slideshow.tsx @@ -23,10 +23,10 @@ const ADVANCE_MS = 4200; * pillars remain clickable. */ export function HeroSlideshow({ slides, pillars }: { slides: HeroSlide[]; pillars: string[] }) { - const steps = pillars.length; + // One pillar per unique slide — never wrap, so the same plate never appears twice in the loop. + const steps = Math.min(pillars.length, Math.max(slides.length, 1)); const [active, setActive] = useState(0); - // The image shown for a step; slides cycle if there are fewer of them than pillars. - const shown = slides.length ? active % slides.length : 0; + const shown = slides.length ? Math.min(active, slides.length - 1) : 0; useEffect(() => { if (steps <= 1 || slides.length <= 1) return; @@ -107,7 +107,7 @@ export function HeroSlideshow({ slides, pillars }: { slides: HeroSlide[]; pillar delay={320} className="grid grid-cols-2 gap-x-6 gap-y-4 border-t border-white/15 pt-6 sm:grid-cols-3 lg:grid-cols-5" > - {pillars.map((label, i) => { + {pillars.slice(0, steps).map((label, i) => { const current = i === active; return ( diff --git a/apps/storefront/lib/artwork-images.ts b/apps/storefront/lib/artwork-images.ts index 1620f37..073d7c8 100644 --- a/apps/storefront/lib/artwork-images.ts +++ b/apps/storefront/lib/artwork-images.ts @@ -6,6 +6,8 @@ * and when it does this module is the single place that changes. */ +import { suppliedArtworkSeeds } from './data/supplied-catalogue'; + /** Slugs we hold a drawing for. Anything else has no plate to show. */ const ARTWORK_SLUGS = new Set([ 'harmattan-bloom', @@ -16,6 +18,7 @@ const ARTWORK_SLUGS = new Set([ 'paper-tigers', 'rainy-season', 'the-getaway', + ...suppliedArtworkSeeds.map(({ slug }) => slug), ]); /** diff --git a/apps/storefront/lib/data/mock.ts b/apps/storefront/lib/data/mock.ts index 67abbca..bd62800 100644 --- a/apps/storefront/lib/data/mock.ts +++ b/apps/storefront/lib/data/mock.ts @@ -5,6 +5,7 @@ import { filterApproved } from '../community'; import { summariseReviews } from '../reviews'; import { artworkImage } from '../artwork-images'; import { countShoppableItems, storyHotspotTargets } from '../stories'; +import { suppliedArtworkSeeds } from './supplied-catalogue'; import type { ArtworkDetail, ArtworkPassport, @@ -190,8 +191,33 @@ const collectionMeta: { slug: string; name: string; description: string }[] = [ description: 'Street-level scenes across African cities — the muse at market and on the move, in full colour.', }, + { + slug: 'africa-united', + name: 'Africa United', + description: + 'Portraits of shared heritage, family and creative life, drawn through textiles, symbols and community.', + }, + { + slug: 'resilience', + name: 'Resilience', + description: + 'Bold poster studies celebrating origin, heritage, power and the confidence to stand tall.', + }, + { + slug: 'studio-muses', + name: 'Studio Muses', + description: + 'Character and styling studies from the studio — caps, colour, markets and everyday movement.', + }, ]; +function suppliedArtworkTitle(slug: string): string { + return slug + .split('-') + .map((word) => (word === 'africa' ? 'Africa' : word[0]?.toUpperCase() + word.slice(1))) + .join(' '); +} + const artworks: ArtworkSummary[] = [ { id: 'a1', @@ -289,6 +315,21 @@ const artworks: ArtworkSummary[] = [ compatibleGarments: ['Oversized T-shirt'], limitedEdition: false, }, + ...suppliedArtworkSeeds.map((seed, index) => ({ + id: `studio-supplied-${index + 1}`, + slug: seed.slug, + title: suppliedArtworkTitle(seed.slug), + collection: seed.collection, + shortStory: `A studio-supplied piece from the ${seed.collection} collection.`, + availability: null, + startingPriceMinor: null, + currency: null, + compatibleGarments: + seed.slug === 'resilience-hands-high' || seed.slug.startsWith('africa-united-') + ? ['Classic T-shirt'] + : [], + limitedEdition: false, + })), ]; const HOUR_MS = 3_600_000; diff --git a/apps/storefront/lib/data/supplied-catalogue.spec.ts b/apps/storefront/lib/data/supplied-catalogue.spec.ts new file mode 100644 index 0000000..c63376e --- /dev/null +++ b/apps/storefront/lib/data/supplied-catalogue.spec.ts @@ -0,0 +1,45 @@ +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; +import { describe, expect, it } from 'vitest'; +import { artworkImage } from '../artwork-images'; +import { primaryNav } from '../nav'; +import { mockProvider } from './mock'; +import { suppliedArtworkSeeds, suppliedShopDesigns } from './supplied-catalogue'; + +describe('studio-supplied catalogue media', () => { + it('keeps every standalone artwork in Collections', async () => { + expect(suppliedArtworkSeeds).toHaveLength(34); + + const { items } = await mockProvider.listArtworks({ limit: 100 }); + const catalogueSlugs = new Set(items.map(({ slug }) => slug)); + + for (const artwork of suppliedArtworkSeeds) { + expect(catalogueSlugs.has(artwork.slug)).toBe(true); + expect(artworkImage(artwork.slug)).toBe(`/artworks/${artwork.slug}.jpg`); + expect(existsSync(join(process.cwd(), 'public', 'artworks', `${artwork.slug}.jpg`))).toBe( + true, + ); + } + }); + + it('keeps clothing photographs in Shop and links them to artwork', () => { + expect(suppliedShopDesigns).toHaveLength(4); + + const artworkSlugs = new Set(suppliedArtworkSeeds.map(({ slug }) => slug)); + for (const design of suppliedShopDesigns) { + expect(design.image).toMatch(/^\/products\/.+\.jpg$/); + expect(artworkSlugs.has(design.artworkSlug)).toBe(true); + expect(existsSync(join(process.cwd(), 'public', design.image.slice(1)))).toBe(true); + } + }); + + it('uses Collections and Shop as the two clear catalogue destinations', () => { + expect(primaryNav).toEqual( + expect.arrayContaining([ + { href: '/collections', label: 'Collections' }, + { href: '/shop', label: 'Shop' }, + ]), + ); + expect(primaryNav.some(({ label }) => label === 'Artworks')).toBe(false); + }); +}); diff --git a/apps/storefront/lib/data/supplied-catalogue.ts b/apps/storefront/lib/data/supplied-catalogue.ts new file mode 100644 index 0000000..cfa3e87 --- /dev/null +++ b/apps/storefront/lib/data/supplied-catalogue.ts @@ -0,0 +1,82 @@ +/** Artwork and clothing imagery supplied by the studio on 2026-07-21. */ + +export interface SuppliedArtworkSeed { + slug: string; + collection: 'Africa United' | 'Resilience' | 'Studio Muses'; +} + +export const suppliedArtworkSeeds: SuppliedArtworkSeed[] = [ + { slug: 'resilience-muse-curls', collection: 'Resilience' }, + { slug: 'resilience-muse-green-cap', collection: 'Resilience' }, + { slug: 'resilience-muse-white-crop', collection: 'Resilience' }, + { slug: 'resilience-seated-queen', collection: 'Resilience' }, + { slug: 'resilience-market-pose', collection: 'Resilience' }, + { slug: 'africa-united-heritage-trio', collection: 'Africa United' }, + { slug: 'africa-united-heritage-duo', collection: 'Africa United' }, + { slug: 'resilience-hands-high', collection: 'Resilience' }, + { slug: 'resilience-after-dark', collection: 'Resilience' }, + { slug: 'resilience-studio-seat', collection: 'Resilience' }, + { slug: 'resilience-night-white', collection: 'Resilience' }, + { slug: 'resilience-profile', collection: 'Resilience' }, + { slug: 'resilience-night-market', collection: 'Resilience' }, + { slug: 'africa-united-night-trio', collection: 'Africa United' }, + { slug: 'resilience-heritage-night', collection: 'Resilience' }, + { slug: 'resilience-garden-night', collection: 'Resilience' }, + { slug: 'africa-united-night-duo', collection: 'Africa United' }, + { slug: 'artisan-circle', collection: 'Africa United' }, + { slug: 'market-cap-muse', collection: 'Studio Muses' }, + { slug: 'atelier-circle', collection: 'Africa United' }, + { slug: 'studio-cap-muse', collection: 'Studio Muses' }, + { slug: 'heritage-room-muse', collection: 'Studio Muses' }, + { slug: 'white-crop-muse', collection: 'Studio Muses' }, + { slug: 'red-cap-pose', collection: 'Studio Muses' }, + { slug: 'sunset-market-muse', collection: 'Studio Muses' }, + { slug: 'garden-seated-muse', collection: 'Studio Muses' }, + { slug: 'patterned-top-muse', collection: 'Studio Muses' }, + { slug: 'market-vendor-muse', collection: 'Studio Muses' }, + { slug: 'heritage-family', collection: 'Africa United' }, + { slug: 'city-sisters', collection: 'Africa United' }, + { slug: 'night-market-muse', collection: 'Studio Muses' }, + { slug: 'striped-crop-muse', collection: 'Studio Muses' }, + { slug: 'studio-stool-muse', collection: 'Studio Muses' }, + { slug: 'green-top-profile', collection: 'Studio Muses' }, +]; + +export interface SuppliedShopDesign { + slug: string; + artworkSlug: string; + title: string; + garment: string; + image: string; +} + +export const suppliedShopDesigns: SuppliedShopDesign[] = [ + { + slug: 'africa-united-white-tee', + artworkSlug: 'africa-united-heritage-trio', + title: 'Africa United — White Tee', + garment: 'White T-shirt', + image: '/products/africa-united-white-tee.jpg', + }, + { + slug: 'africa-united-black-tee', + artworkSlug: 'africa-united-heritage-duo', + title: 'Africa United — Black Tee', + garment: 'Black T-shirt', + image: '/products/africa-united-black-tee.jpg', + }, + { + slug: 'resilience-white-tee', + artworkSlug: 'resilience-hands-high', + title: 'Resilience — White Tee', + garment: 'White T-shirt', + image: '/products/resilience-white-tee.jpg', + }, + { + slug: 'africa-united-model-tee', + artworkSlug: 'africa-united-night-trio', + title: 'Africa United — Worn', + garment: 'Black T-shirt', + image: '/products/africa-united-model-tee.jpg', + }, +]; diff --git a/apps/storefront/lib/nav.ts b/apps/storefront/lib/nav.ts index dc69b6f..81bb21c 100644 --- a/apps/storefront/lib/nav.ts +++ b/apps/storefront/lib/nav.ts @@ -5,7 +5,6 @@ export interface NavItem { /** Primary navigation shown in the header and mobile menu. */ export const primaryNav: NavItem[] = [ - { href: '/artworks', label: 'Artworks' }, { href: '/collections', label: 'Collections' }, { href: '/drops', label: 'Drops' }, { href: '/shop', label: 'Shop' }, @@ -19,7 +18,6 @@ export const footerNav: { heading: string; items: NavItem[] }[] = [ { heading: 'Explore', items: [ - { href: '/artworks', label: 'Artworks' }, { href: '/collections', label: 'Collections' }, { href: '/drops', label: 'Drops' }, { href: '/shop', label: 'Shop' }, diff --git a/apps/storefront/public/artworks/africa-united-heritage-duo.jpg b/apps/storefront/public/artworks/africa-united-heritage-duo.jpg new file mode 100644 index 0000000..3765a90 Binary files /dev/null and b/apps/storefront/public/artworks/africa-united-heritage-duo.jpg differ diff --git a/apps/storefront/public/artworks/africa-united-heritage-trio.jpg b/apps/storefront/public/artworks/africa-united-heritage-trio.jpg new file mode 100644 index 0000000..fd0989e Binary files /dev/null and b/apps/storefront/public/artworks/africa-united-heritage-trio.jpg differ diff --git a/apps/storefront/public/artworks/africa-united-night-duo.jpg b/apps/storefront/public/artworks/africa-united-night-duo.jpg new file mode 100644 index 0000000..8f47e1e Binary files /dev/null and b/apps/storefront/public/artworks/africa-united-night-duo.jpg differ diff --git a/apps/storefront/public/artworks/africa-united-night-trio.jpg b/apps/storefront/public/artworks/africa-united-night-trio.jpg new file mode 100644 index 0000000..740a933 Binary files /dev/null and b/apps/storefront/public/artworks/africa-united-night-trio.jpg differ diff --git a/apps/storefront/public/artworks/artisan-circle.jpg b/apps/storefront/public/artworks/artisan-circle.jpg new file mode 100644 index 0000000..3d5dc33 Binary files /dev/null and b/apps/storefront/public/artworks/artisan-circle.jpg differ diff --git a/apps/storefront/public/artworks/atelier-circle.jpg b/apps/storefront/public/artworks/atelier-circle.jpg new file mode 100644 index 0000000..2d6edfb Binary files /dev/null and b/apps/storefront/public/artworks/atelier-circle.jpg differ diff --git a/apps/storefront/public/artworks/city-sisters.jpg b/apps/storefront/public/artworks/city-sisters.jpg new file mode 100644 index 0000000..769150e Binary files /dev/null and b/apps/storefront/public/artworks/city-sisters.jpg differ diff --git a/apps/storefront/public/artworks/garden-seated-muse.jpg b/apps/storefront/public/artworks/garden-seated-muse.jpg new file mode 100644 index 0000000..a2c4cf4 Binary files /dev/null and b/apps/storefront/public/artworks/garden-seated-muse.jpg differ diff --git a/apps/storefront/public/artworks/green-top-profile.jpg b/apps/storefront/public/artworks/green-top-profile.jpg new file mode 100644 index 0000000..a7bb190 Binary files /dev/null and b/apps/storefront/public/artworks/green-top-profile.jpg differ diff --git a/apps/storefront/public/artworks/heritage-family.jpg b/apps/storefront/public/artworks/heritage-family.jpg new file mode 100644 index 0000000..825736f Binary files /dev/null and b/apps/storefront/public/artworks/heritage-family.jpg differ diff --git a/apps/storefront/public/artworks/heritage-room-muse.jpg b/apps/storefront/public/artworks/heritage-room-muse.jpg new file mode 100644 index 0000000..5c6e4c5 Binary files /dev/null and b/apps/storefront/public/artworks/heritage-room-muse.jpg differ diff --git a/apps/storefront/public/artworks/market-cap-muse.jpg b/apps/storefront/public/artworks/market-cap-muse.jpg new file mode 100644 index 0000000..7d63d32 Binary files /dev/null and b/apps/storefront/public/artworks/market-cap-muse.jpg differ diff --git a/apps/storefront/public/artworks/market-vendor-muse.jpg b/apps/storefront/public/artworks/market-vendor-muse.jpg new file mode 100644 index 0000000..7e5d04b Binary files /dev/null and b/apps/storefront/public/artworks/market-vendor-muse.jpg differ diff --git a/apps/storefront/public/artworks/night-market-muse.jpg b/apps/storefront/public/artworks/night-market-muse.jpg new file mode 100644 index 0000000..65f55d0 Binary files /dev/null and b/apps/storefront/public/artworks/night-market-muse.jpg differ diff --git a/apps/storefront/public/artworks/patterned-top-muse.jpg b/apps/storefront/public/artworks/patterned-top-muse.jpg new file mode 100644 index 0000000..9da6380 Binary files /dev/null and b/apps/storefront/public/artworks/patterned-top-muse.jpg differ diff --git a/apps/storefront/public/artworks/red-cap-pose.jpg b/apps/storefront/public/artworks/red-cap-pose.jpg new file mode 100644 index 0000000..80b4c39 Binary files /dev/null and b/apps/storefront/public/artworks/red-cap-pose.jpg differ diff --git a/apps/storefront/public/artworks/resilience-after-dark.jpg b/apps/storefront/public/artworks/resilience-after-dark.jpg new file mode 100644 index 0000000..c6043ce Binary files /dev/null and b/apps/storefront/public/artworks/resilience-after-dark.jpg differ diff --git a/apps/storefront/public/artworks/resilience-garden-night.jpg b/apps/storefront/public/artworks/resilience-garden-night.jpg new file mode 100644 index 0000000..ae70334 Binary files /dev/null and b/apps/storefront/public/artworks/resilience-garden-night.jpg differ diff --git a/apps/storefront/public/artworks/resilience-hands-high.jpg b/apps/storefront/public/artworks/resilience-hands-high.jpg new file mode 100644 index 0000000..8286632 Binary files /dev/null and b/apps/storefront/public/artworks/resilience-hands-high.jpg differ diff --git a/apps/storefront/public/artworks/resilience-heritage-night.jpg b/apps/storefront/public/artworks/resilience-heritage-night.jpg new file mode 100644 index 0000000..f732eb8 Binary files /dev/null and b/apps/storefront/public/artworks/resilience-heritage-night.jpg differ diff --git a/apps/storefront/public/artworks/resilience-market-pose.jpg b/apps/storefront/public/artworks/resilience-market-pose.jpg new file mode 100644 index 0000000..e464d38 Binary files /dev/null and b/apps/storefront/public/artworks/resilience-market-pose.jpg differ diff --git a/apps/storefront/public/artworks/resilience-muse-curls.jpg b/apps/storefront/public/artworks/resilience-muse-curls.jpg new file mode 100644 index 0000000..00e9e70 Binary files /dev/null and b/apps/storefront/public/artworks/resilience-muse-curls.jpg differ diff --git a/apps/storefront/public/artworks/resilience-muse-green-cap.jpg b/apps/storefront/public/artworks/resilience-muse-green-cap.jpg new file mode 100644 index 0000000..0f1bc2e Binary files /dev/null and b/apps/storefront/public/artworks/resilience-muse-green-cap.jpg differ diff --git a/apps/storefront/public/artworks/resilience-muse-white-crop.jpg b/apps/storefront/public/artworks/resilience-muse-white-crop.jpg new file mode 100644 index 0000000..3078c78 Binary files /dev/null and b/apps/storefront/public/artworks/resilience-muse-white-crop.jpg differ diff --git a/apps/storefront/public/artworks/resilience-night-market.jpg b/apps/storefront/public/artworks/resilience-night-market.jpg new file mode 100644 index 0000000..c19f7c4 Binary files /dev/null and b/apps/storefront/public/artworks/resilience-night-market.jpg differ diff --git a/apps/storefront/public/artworks/resilience-night-white.jpg b/apps/storefront/public/artworks/resilience-night-white.jpg new file mode 100644 index 0000000..dc6e7df Binary files /dev/null and b/apps/storefront/public/artworks/resilience-night-white.jpg differ diff --git a/apps/storefront/public/artworks/resilience-profile.jpg b/apps/storefront/public/artworks/resilience-profile.jpg new file mode 100644 index 0000000..b18d064 Binary files /dev/null and b/apps/storefront/public/artworks/resilience-profile.jpg differ diff --git a/apps/storefront/public/artworks/resilience-seated-queen.jpg b/apps/storefront/public/artworks/resilience-seated-queen.jpg new file mode 100644 index 0000000..247329e Binary files /dev/null and b/apps/storefront/public/artworks/resilience-seated-queen.jpg differ diff --git a/apps/storefront/public/artworks/resilience-studio-seat.jpg b/apps/storefront/public/artworks/resilience-studio-seat.jpg new file mode 100644 index 0000000..0672329 Binary files /dev/null and b/apps/storefront/public/artworks/resilience-studio-seat.jpg differ diff --git a/apps/storefront/public/artworks/striped-crop-muse.jpg b/apps/storefront/public/artworks/striped-crop-muse.jpg new file mode 100644 index 0000000..1266c94 Binary files /dev/null and b/apps/storefront/public/artworks/striped-crop-muse.jpg differ diff --git a/apps/storefront/public/artworks/studio-cap-muse.jpg b/apps/storefront/public/artworks/studio-cap-muse.jpg new file mode 100644 index 0000000..f8d2a94 Binary files /dev/null and b/apps/storefront/public/artworks/studio-cap-muse.jpg differ diff --git a/apps/storefront/public/artworks/studio-stool-muse.jpg b/apps/storefront/public/artworks/studio-stool-muse.jpg new file mode 100644 index 0000000..d8c59f8 Binary files /dev/null and b/apps/storefront/public/artworks/studio-stool-muse.jpg differ diff --git a/apps/storefront/public/artworks/sunset-market-muse.jpg b/apps/storefront/public/artworks/sunset-market-muse.jpg new file mode 100644 index 0000000..98049af Binary files /dev/null and b/apps/storefront/public/artworks/sunset-market-muse.jpg differ diff --git a/apps/storefront/public/artworks/white-crop-muse.jpg b/apps/storefront/public/artworks/white-crop-muse.jpg new file mode 100644 index 0000000..5c02569 Binary files /dev/null and b/apps/storefront/public/artworks/white-crop-muse.jpg differ diff --git a/apps/storefront/public/products/africa-united-black-tee.jpg b/apps/storefront/public/products/africa-united-black-tee.jpg new file mode 100644 index 0000000..edb9507 Binary files /dev/null and b/apps/storefront/public/products/africa-united-black-tee.jpg differ diff --git a/apps/storefront/public/products/africa-united-model-tee.jpg b/apps/storefront/public/products/africa-united-model-tee.jpg new file mode 100644 index 0000000..861c775 Binary files /dev/null and b/apps/storefront/public/products/africa-united-model-tee.jpg differ diff --git a/apps/storefront/public/products/africa-united-white-tee.jpg b/apps/storefront/public/products/africa-united-white-tee.jpg new file mode 100644 index 0000000..3ecc2a2 Binary files /dev/null and b/apps/storefront/public/products/africa-united-white-tee.jpg differ diff --git a/apps/storefront/public/products/resilience-white-tee.jpg b/apps/storefront/public/products/resilience-white-tee.jpg new file mode 100644 index 0000000..f8a5c75 Binary files /dev/null and b/apps/storefront/public/products/resilience-white-tee.jpg differ
+ Every supplied shirt and worn-piece image lives here in Shop, linked to the artwork it + carries. +
{design.garment}