# Product Art (Moonarc)

A product drawn flat, for a shop slot that has no photograph yet: 29 drawings in six sets (clothes, ceramics, coffee, skincare, furniture and objects, bakery). Each is a few SVG shapes in the product's colour with a shade, a light and an accent mixed from it, so one drawing takes any colourway; unset, it takes the first drawing colour of the colour block it sits on. With tile it fills its box with the block colour and stands the product on a soft shadow. A link around it picks the product up on hover, and a few have a second gesture: a cup steams, a lamp lights, a pump presses, a jar opens. Zero JavaScript.

- Import: `import ProductArt from '@moonarc/core/ProductArt'`
- Install: `npx astro add moonarc` · copy-paste: `npx shadcn@latest add https://moonarc.dev/r/product-art.json`
- Tier A · category background · trigger hover
- Readout: `<ProductArt name="vase" tile block={1} colour="var(--ma-block-2)" />`
- Browser support: widely (every browser)
- Measured cost: 0 B JS (CSS 9.7 kB raw)
- Page: https://moonarc.dev/components/product-art/

## Props

| Prop | Type | Default | Description |
|---|---|---|---|
| `name` | `'tee' | 'jacket' | 'dress' | 'trousers' | 'tote' | 'cap' | 'vase' | 'cup' | 'bowl' | 'plate' | 'jug' | 'bag' | 'mug' | 'dripper' | 'tin' | 'dropper' | 'jar' | 'tube' | 'pump' | 'chair' | 'stool' | 'lamp' | 'table' | 'shelf' | 'loaf' | 'croissant' | 'cake' | 'cookie' | 'bun'` | none | The drawing. Unset, seed picks one. |
| `seed` | `string` | `''` | A word the drawing is picked from when name is unset: the same word, the same drawing on every build. |
| `set` | `'clothes' | 'ceramics' | 'coffee' | 'skincare' | 'objects' | 'bakery'` | none | Keep the seeded pick to one set. |
| `tile` | `boolean` | `false` | Fill the box: the block colour, the product at four fifths of the box on a soft shadow, a light from the top left. |
| `block` | `1 | 2 | 3 | 4 | 5` | none | The colour block the tile paints, from @moonarc/core/blocks.css or a palette. Unset, the tile takes the ground it sits on. |
| `colour` | `string` | none | The product's colour, any CSS colour (var(--ma-block-2) follows the palette). Unset, the block's first drawing colour. |
| `accent` | `string` | none | The second colour: a glaze, a lid, a band. Unset, the block's second drawing colour. |
| `caption` | `string` | none | A short caption in a pill at the tile's lower left (tile only). |
| `label` | `string` | none | What the picture shows, for a screen reader (role="img"). Unset, the drawing is decoration and hidden from it. |
| `still` | `boolean` | `false` | No movement on hover. |

## Usage

```astro
---
import ProductArt from '@moonarc/core/ProductArt';
import '@moonarc/core/blocks.css';
---
<a href="/shop/tall-vase/" class="block aspect-[4/5] overflow-hidden rounded-3xl">
  <ProductArt name="vase" tile block={1} colour="var(--ma-block-2)" accent="var(--ma-block-3)" caption="Tall vase" />
</a>
```

## Reduced motion

Nothing moves: the product stays where it is drawn, and the steam, the drips and the lamp's light stay off.

## With ClientRouter

CSS and SVG only; nothing to rebind.

## Craft

- One colour drives the drawing: the shade, the light, the paper of a label and the deep tone of coffee in a cup are mixed from it in OKLab, so a colourway is one custom property and a palette recolours a whole shop.
- The product stands on a shadow that narrows as it lifts, so a hover reads as picking the thing up.
- The second gestures are the ones the object has: a cup steams, a lamp lights, a pump presses, a jar's lid lifts, a tote swings. The steam rises twice and the drips fall three times per hover, then rest.
- The seed is a hash of the word, so a product keeps its drawing between builds; set narrows the pick to one set.

## Replaces

- Product photo placeholders (shop themes)
- Illustration packs (Humaaans, Open Peeps)

## Source

```astro
---
/**
 * ProductArt — a product drawn flat, for a shop slot that has no photograph yet: 29 drawings in six sets (clothes,
 * ceramics, coffee, skincare, furniture and objects, bakery). Each is a few SVG shapes in the product's colour with a
 * shade, a light and an accent mixed from it, so one drawing takes any colourway: `colour` sets it, and unset the
 * drawing takes the first motif colour of the colour block or tone it sits on (a palette picks that by contrast with
 * the ground). With `tile` it fills its box: the block's ground, the product standing on a soft shadow, an optional
 * caption in a pill.
 *
 * Hovering or focusing a link around it picks the product up a little; a few have a second gesture (a cup steams, a
 * lamp lights, a pump presses, a jar's lid lifts, a tote swings). Nothing moves on its own. Zero JavaScript.
 *
 * `seed` picks a drawing from a word when `name` is not given, the same one on every build; `set` keeps the pick to
 * one set.
 */
import type { HTMLAttributes } from 'astro/types';

const sets = {
  clothes: ['tee', 'jacket', 'dress', 'trousers', 'tote', 'cap'],
  ceramics: ['vase', 'cup', 'bowl', 'plate', 'jug'],
  coffee: ['bag', 'mug', 'dripper', 'tin'],
  skincare: ['dropper', 'jar', 'tube', 'pump'],
  objects: ['chair', 'stool', 'lamp', 'table', 'shelf'],
  bakery: ['loaf', 'croissant', 'cake', 'cookie', 'bun'],
} as const;
type ArtSet = keyof typeof sets;
type ArtName = (typeof sets)[ArtSet][number];

interface Props extends HTMLAttributes<'div'> {
  /** The drawing. Unset, `seed` picks one. */
  name?: ArtName;
  /** A word the drawing is picked from when name is unset: the same word, the same drawing. */
  seed?: string;
  /** Keep the seeded pick to one set. */
  set?: ArtSet;
  /** Fill the box: the block's ground, the product standing in the middle, a soft light. */
  tile?: boolean;
  /** The block the tile paints (1–5, `blocks.css`); unset, the tile takes the ground it sits on. */
  block?: 1 | 2 | 3 | 4 | 5;
  /** The product's colour, any CSS colour. Unset, the block's first motif colour. */
  colour?: string;
  /** The second colour (a glaze, a cap, a band). Unset, the block's second motif colour. */
  accent?: string;
  /** A short caption in a pill at the tile's lower edge. */
  caption?: string;
  /** What the picture shows, for a screen reader. Unset, the drawing is decoration and hidden from it. */
  label?: string;
  /** No movement on hover. */
  still?: boolean;
}

const { name, seed = '', set, tile = false, block, colour, accent, caption, label, still = false, class: className, style, ...rest } = Astro.props;
const pool: readonly ArtName[] = set ? sets[set] : Object.values(sets).flat();
let hash = 0;
for (const ch of seed) hash = (hash * 31 + ch.charCodeAt(0)) >>> 0;
const art: ArtName = name ?? pool[hash % pool.length]!;
const a11y = label ? { role: 'img' as const, 'aria-label': label } : { 'aria-hidden': 'true' as const };
const vars = [colour && `--ma-art-body:${colour}`, accent && `--ma-art-accent:${accent}`, typeof style === 'string' && style].filter(Boolean).join(';') || undefined;
---

<div class:list={['ma-art', tile && 'ma-art--tile', className]} data-ma-block={block} data-art={art} data-still={still ? '' : undefined} style={vars} {...rest}>
  <svg viewBox="0 0 100 100" class="ma-art__svg" focusable="false" {...a11y}>
    <ellipse class="ma-art__shadow" cx="50" cy="89" rx="27" ry="3.2" />
    <g class="ma-art__obj">
      {
        art === 'tee' && (
          <>
            <path class="ma-art__b" d="M37 16Q50 24 63 16L80 24Q84 26 85 30L88 42L76 47L72 40L72 84Q72 86 70 86L30 86Q28 86 28 84L28 40L24 47L12 42L15 30Q16 26 20 24Z" />
            <path class="ma-art__sh" d="M58 19L72 40L72 84Q72 86 70 86L63 86L63 28Z" />
            <path class="ma-art__s" d="M72 40L76 47L88 42L86.6 36.5Z M28 40L24 47L12 42L13.4 36.5Z" />
            <path class="ma-art__l" d="M37 16Q50 26 63 16L60.5 14.6Q50 22.5 39.5 14.6Z" />
            <rect class="ma-art__a" x="54" y="33" width="10" height="11" rx="1.6" />
            <rect class="ma-art__s" x="28" y="81" width="44" height="2" />
          </>
        )
      }
      {
        art === 'jacket' && (
          <>
            <path class="ma-art__b" d="M38 15L44 13L50 22L56 13L62 15L78 22Q82 24 83 28L89 70Q89 72 87 72L80 73Q78 73 78 71L73 40L73 85Q73 87 71 87L29 87Q27 87 27 85L27 40L22 71Q22 73 20 73L13 72Q11 72 11 70L17 28Q18 24 22 22Z" />
            <path class="ma-art__sh" d="M62 15L73 40L73 85Q73 87 71 87L66 87L66 30Z" />
            <path class="ma-art__a" d="M80.5 63L88.1 62L89 70Q89 72 87 72L80 73Q78 73 78 71L77.3 64Z M19.5 63L11.9 62L11 70Q11 72 13 72L20 73Q22 73 22 71L22.7 64Z" />
            <rect class="ma-art__s" x="49" y="24" width="2" height="63" />
            <path class="ma-art__sh" d="M32 34h13v12h-13Z M55 34h13v12h-13Z" />
            <path class="ma-art__s" d="M32 34h13v3.5h-13Z M55 34h13v3.5h-13Z" />
            <path class="ma-art__l" d="M44 13L50 22L56 13L60 14.5L53 27L50 24L47 27L40 14.5Z" />
            <g class="ma-art__p">
              <circle cx="50" cy="33" r="1.5" /><circle cx="50" cy="45" r="1.5" /><circle cx="50" cy="57" r="1.5" /><circle cx="50" cy="69" r="1.5" /><circle cx="50" cy="81" r="1.5" />
            </g>
          </>
        )
      }
      {
        art === 'dress' && (
          <>
            <path class="ma-art__b" d="M41 13Q45 12 46 15Q50 19 54 15Q55 12 59 13L61 30Q61 36 58 40L77 82Q78 85 75 85.5Q50 89 25 85.5Q22 85 23 82L42 40Q39 36 39 30Z" />
            <path class="ma-art__l" d="M44 46L31 84L35 84.8L46 47Z" />
            <path class="ma-art__sh" d="M50 44L46 87L52 87.2Z M56 46L69 84.6L64.6 85.4Z" />
            <path class="ma-art__a" d="M40.6 37.5Q50 39.5 59.4 37.5L60 42.5Q50 44.5 40 42.5Z" />
            <path class="ma-art__l" d="M46 15Q50 19 54 15Q50 21.5 46 15Z" />
          </>
        )
      }
      {
        art === 'trousers' && (
          <>
            <path class="ma-art__b" d="M31 14L69 14L73 85Q73 87 71 87L57 87Q55 87 55 85L50 40L45 85Q45 87 43 87L29 87Q27 87 27 85Z" />
            <path class="ma-art__sh" d="M63 20L69 20L73 85Q73 87 71 87L67 87Z" />
            <path class="ma-art__s" d="M31 14L69 14L69.3 20L30.7 20Z M27.5 81.5h17.2v3.5h-17.2Z M55.3 81.5h17.2v3.5h-17.2Z" />
            <rect class="ma-art__s" x="49.4" y="20" width="1.2" height="15" />
            <path class="ma-art__ls" d="M39 23L36.5 80M61 23L63.5 80" />
            <path class="ma-art__ss" d="M33 21Q36 28 41 24M67 21Q64 28 59 24" />
            <circle class="ma-art__p" cx="50" cy="17" r="1.3" />
          </>
        )
      }
      {
        art === 'tote' && (
          <g class="ma-art__swing">
            <path class="ma-art__ss ma-art__handle" d="M41 40C41 22 59 22 59 40" />
            <path class="ma-art__bs ma-art__handle" d="M36 40C36 16 64 16 64 40" />
            <path class="ma-art__b" d="M24 38L76 38L79 84Q79 87 76 87L24 87Q21 87 21 84Z" />
            <path class="ma-art__sh" d="M66 43L76.4 43L79 84Q79 87 76 87L70 87Z" />
            <path class="ma-art__s" d="M24 38L76 38L76.4 43L23.6 43Z" />
            <circle class="ma-art__a" cx="49" cy="64" r="10.5" />
            <circle class="ma-art__p" cx="53" cy="60" r="3" />
          </g>
        )
      }
      {
        art === 'cap' && (
          <>
            <path class="ma-art__s" d="M72 76Q92 75 96 80Q95 84 88 84L70 82Z" />
            <path class="ma-art__b" d="M18 80Q18 46 48 43Q78 45 80 74L80 80Z" />
            <path class="ma-art__sh" d="M60 46Q78 50 80 74L80 80L70 80Q72 58 60 46Z" />
            <path class="ma-art__l" d="M24 66Q26 52 38 47Q30 54 28 66Z" />
            <path class="ma-art__ss" d="M48 43Q38 58 36 75M48 43Q60 58 62 75" />
            <path class="ma-art__s" d="M18 75L80 75L80 80L18 80Z" />
            <rect class="ma-art__a" x="42" y="57" width="12" height="8" rx="1.6" />
            <ellipse class="ma-art__a" cx="48" cy="43.5" rx="3.2" ry="1.8" />
          </>
        )
      }
      {
        art === 'vase' && (
          <>
            <path class="ma-art__b" d="M43 15L57 15L56.5 22Q71 34 71 56Q71 78 59 86L41 86Q29 78 29 56Q29 34 43.5 22Z" />
            <path class="ma-art__sh" d="M56.5 22Q71 34 71 56Q71 78 59 86L53 86Q63 74 63 56Q63 36 52 24Z" />
            <path class="ma-art__a" d="M33 38Q50 44 67 38Q69 42 69.6 46Q66 46 64 51Q62 46 59 48Q57 54 54 49Q51 52 49 49Q46 55 44 49Q41 52 38 47Q35 47 30.4 46Q31 42 33 38Z" />
            <path class="ma-art__l" d="M36 51Q35 63 39 74Q39 62 40.5 51Z" />
            <rect class="ma-art__l" x="41" y="13" width="18" height="4" rx="2" />
            <path class="ma-art__s" d="M41 86L59 86L58 88L42 88Z" />
          </>
        )
      }
      {
        art === 'cup' && (
          <>
            <g class="ma-art__steam"><path d="M42 30q-4 -6 0 -11t0 -11M50 27q4 -6 0 -11t0 -11M58 30q-4 -6 0 -11t0 -11" /></g>
            <path class="ma-art__b" d="M30 36L70 36L66.5 82Q66 86 62 86L38 86Q34 86 33.5 82Z" />
            <path class="ma-art__a" d="M30 36L70 36L68.3 58Q63 61 58 58.5Q52 62 46 58.6Q40 61.5 31.7 58Z" />
            <path class="ma-art__sh" d="M60 36L70 36L66.5 82Q66 86 62 86L57 86Z" />
            <ellipse class="ma-art__s" cx="50" cy="36" rx="20" ry="4.2" />
            <ellipse class="ma-art__d" cx="50" cy="36.8" rx="16.5" ry="2.7" />
            <path class="ma-art__l" d="M35 40L34.2 56Q35.6 48 37.2 40Z" />
          </>
        )
      }
      {
        art === 'bowl' && (
          <>
            <path class="ma-art__s" d="M40 82L60 82L58 86L42 86Z" />
            <path class="ma-art__b" d="M16 48L84 48Q82 74 62 82L38 82Q18 74 16 48Z" />
            <path class="ma-art__sh" d="M66 48L84 48Q82 74 62 82L54 82Q74 70 66 48Z" />
            <path class="ma-art__a" d="M18.5 58Q50 62 81.5 58L80.4 62.4Q50 66.4 19.6 62.4Z" />
            <ellipse class="ma-art__s" cx="50" cy="48" rx="34" ry="7.5" />
            <ellipse class="ma-art__a" cx="50" cy="49" rx="30" ry="5.6" />
            <g class="ma-art__k ma-art__speck"><circle cx="28" cy="69" r="0.8" /><circle cx="36" cy="74" r="0.6" /><circle cx="46" cy="70" r="0.7" /><circle cx="58" cy="75" r="0.6" /><circle cx="68" cy="69" r="0.8" /><circle cx="41" cy="77" r="0.5" /></g>
          </>
        )
      }
      {
        art === 'plate' && (
          <>
            <circle class="ma-art__b" cx="50" cy="52" r="34" />
            <path class="ma-art__sh" d="M74 28A34 34 0 0 1 50 86A34 34 0 0 0 74 28Z" />
            <circle class="ma-art__l" cx="50" cy="52" r="24" />
            <circle class="ma-art__as" cx="50" cy="52" r="29.4" />
            <g class="ma-art__a">
              <ellipse cx="50" cy="52" rx="3.4" ry="9" /><ellipse cx="50" cy="52" rx="3.4" ry="9" transform="rotate(60 50 52)" /><ellipse cx="50" cy="52" rx="3.4" ry="9" transform="rotate(120 50 52)" />
            </g>
            <circle class="ma-art__p" cx="50" cy="52" r="2.6" />
            <path class="ma-art__p ma-art__gloss" d="M23 41A29 29 0 0 1 39 24.6L40 27A26.4 26.4 0 0 0 25.6 42Z" />
          </>
        )
      }
      {
        art === 'jug' && (
          <>
            <path class="ma-art__bs ma-art__handle-thick" d="M67 38C83 38 84 66 66 68" />
            <path class="ma-art__b" d="M37 26L63 26Q72 46 71 66Q70 84 56 86L44 86Q30 84 29 66Q28 46 37 26Z M37 26L27 20.5Q26 19.5 27.5 19.4L44 24Z" />
            <path class="ma-art__sh" d="M60 27Q70 46 69.6 66Q69 82 56 86L54 86Q64 76 63 60Q62 42 56 28Z" />
            <path class="ma-art__a" d="M30.3 56Q50 60 69.7 56L69.8 62Q50 66 30.2 62Z" />
            <ellipse class="ma-art__s" cx="50" cy="26" rx="13" ry="2.8" />
            <path class="ma-art__l" d="M34 40Q31.6 56 33.4 72Q34.4 56 36.4 40Z" />
          </>
        )
      }
      {
        art === 'bag' && (
          <>
            <path class="ma-art__b" d="M30 26L70 26L72.5 84Q72.6 87 69.5 87L30.5 87Q27.4 87 27.5 84Z" />
            <path class="ma-art__s" d="M30 17L70 17L70 26L30 26Z" />
            <rect class="ma-art__a" x="27" y="19.5" width="46" height="3.2" rx="1.6" />
            <rect class="ma-art__p" x="36" y="42" width="28" height="32" rx="2.5" />
            <rect class="ma-art__k" x="41" y="48" width="18" height="3" rx="1" />
            <rect class="ma-art__k ma-art__faint" x="43" y="54.5" width="14" height="1.8" rx="0.9" />
            <ellipse class="ma-art__a" cx="50" cy="65" rx="5" ry="3.6" transform="rotate(-24 50 65)" />
            <path class="ma-art__ps" d="M47.4 66.8Q50 65 52.6 63.2" />
            <circle class="ma-art__s" cx="62" cy="33" r="2.6" />
            <circle class="ma-art__p" cx="62" cy="33" r="1" />
            <path class="ma-art__sh" d="M63 26L70 26L72.5 84Q72.6 87 69.5 87L64.5 87Z" />
          </>
        )
      }
      {
        art === 'mug' && (
          <>
            <g class="ma-art__steam"><path d="M40 30q-4 -6 0 -11t0 -11M48 27q4 -6 0 -11t0 -11M56 30q-4 -6 0 -11t0 -11" /></g>
            <path class="ma-art__bs ma-art__handle-thick" d="M67 46C81 46 81 71 67 71" />
            <path class="ma-art__b" d="M28 36L68 36L68 79Q68 86 61 86L35 86Q28 86 28 79Z" />
            <path class="ma-art__sh" d="M58 36L68 36L68 79Q68 86 61 86L58 86Z" />
            <path class="ma-art__a" d="M28 50L68 50L68 57L28 57Z" />
            <ellipse class="ma-art__s" cx="48" cy="36" rx="20" ry="4" />
            <ellipse class="ma-art__d" cx="48" cy="36.8" rx="16.5" ry="2.6" />
            <path class="ma-art__l" d="M32 40L32 76Q33.2 58 35 40Z" />
          </>
        )
      }
      {
        art === 'dripper' && (
          <>
            <path class="ma-art__glass" d="M36 62.5L64 62.5Q66 62.5 66 65.5L66 84Q66 87 63 87L37 87Q34 87 34 84L34 65.5Q34 62.5 36 62.5Z" />
            <path class="ma-art__d" d="M34.5 75L65.5 75L65.5 84Q65.5 86.6 63 86.6L37 86.6Q34.5 86.6 34.5 84Z" />
            <g class="ma-art__drops ma-art__d"><circle cx="50" cy="64" r="1.3" /><circle cx="50" cy="64" r="1" /></g>
            <path class="ma-art__b" d="M73 30Q82 30 82 38Q82 44 70 44L71.4 40Q77 40 77 37.5Q77 34 72 34Z" />
            <path class="ma-art__b" d="M27 24L73 24Q75 24 74.4 26L61 58L39 58L25.6 26Q25 24 27 24Z" />
            <path class="ma-art__sh" d="M64 24L73 24Q75 24 74.4 26L61 58L55 58Z" />
            <path class="ma-art__ss ma-art__faint" d="M37 29L44 55M50 29L50 55M63 29L56 55" />
            <path class="ma-art__s" d="M25.6 24L74.4 24L74 27L26 27Z" />
            <rect class="ma-art__a" x="33" y="58" width="34" height="4.5" rx="2" />
          </>
        )
      }
      {
        art === 'tin' && (
          <>
            <path class="ma-art__b" d="M31 30L69 30L69 84Q69 87 66 87L34 87Q31 87 31 84Z" />
            <rect class="ma-art__p" x="31" y="44" width="38" height="26" />
            <circle class="ma-art__a" cx="50" cy="54" r="5" />
            <rect class="ma-art__k" x="41" y="62" width="18" height="2" rx="1" />
            <rect class="ma-art__k ma-art__faint" x="44" y="65.6" width="12" height="1.4" rx="0.7" />
            <path class="ma-art__s" d="M29 22Q29 20 31 20L69 20Q71 20 71 22L71 30L29 30Z" />
            <rect class="ma-art__l" x="31" y="22" width="38" height="1.6" rx="0.8" />
            <path class="ma-art__sh" d="M61 30L69 30L69 84Q69 87 66 87L61 87Z" />
          </>
        )
      }
      {
        art === 'dropper' && (
          <>
            <path class="ma-art__b" d="M37 46Q37 40 43 40L57 40Q63 40 63 46L63 83Q63 87 59 87L41 87Q37 87 37 83Z" />
            <path class="ma-art__sh" d="M56 40L57 40Q63 40 63 46L63 83Q63 87 59 87L56 87Z" />
            <rect class="ma-art__p" x="41" y="56" width="18" height="20" rx="1.5" />
            <rect class="ma-art__k" x="44" y="61" width="12" height="1.8" rx="0.9" />
            <rect class="ma-art__k ma-art__faint" x="45.5" y="65" width="9" height="1.2" rx="0.6" />
            <circle class="ma-art__a" cx="50" cy="71" r="1.6" />
            <path class="ma-art__l" d="M40.5 46L40.5 80Q41.8 63 42.6 46Z" />
            <rect class="ma-art__s" x="42" y="33" width="16" height="8" rx="1.5" />
            <path class="ma-art__a ma-art__bulb" d="M44.5 33L44.5 21Q44.5 12 50 12Q55.5 12 55.5 21L55.5 33Z" />
            <rect class="ma-art__as-f" x="44" y="30" width="12" height="3" rx="1" />
          </>
        )
      }
      {
        art === 'jar' && (
          <>
            <path class="ma-art__b" d="M27 48L73 48L73 80Q73 86 67 86L33 86Q27 86 27 80Z" />
            <path class="ma-art__sh" d="M66 48L73 48L73 80Q73 86 67 86L66 86Z" />
            <rect class="ma-art__p" x="35" y="56" width="30" height="20" rx="2" />
            <rect class="ma-art__k" x="40" y="61" width="20" height="2.2" rx="1.1" />
            <rect class="ma-art__k ma-art__faint" x="43" y="66" width="14" height="1.4" rx="0.7" />
            <ellipse class="ma-art__a" cx="50" cy="71.5" rx="3" ry="1.6" />
            <path class="ma-art__l" d="M31 52L31 80Q32.5 66 33.5 52Z" />
            <g class="ma-art__lid">
              <path class="ma-art__a" d="M25 36Q25 33 28 33L72 33Q75 33 75 36L75 48L25 48Z" />
              <path class="ma-art__as ma-art__faint" d="M30 35.5V46M34 35.5V46M38 35.5V46M42 35.5V46M46 35.5V46M50 35.5V46M54 35.5V46M58 35.5V46M62 35.5V46M66 35.5V46M70 35.5V46" />
            </g>
          </>
        )
      }
      {
        art === 'tube' && (
          <>
            <path class="ma-art__s" d="M36 14L64 14L64 19L36 19Z" />
            <path class="ma-art__b" d="M36 19L64 19L61.5 70Q61.4 72 59.5 72L40.5 72Q38.6 72 38.5 70Z" />
            <path class="ma-art__sh" d="M57 19L64 19L61.5 70Q61.4 72 59.5 72L56.5 72Z" />
            <rect class="ma-art__p" x="42" y="32" width="16" height="26" rx="1.5" />
            <rect class="ma-art__k" x="44.5" y="37" width="11" height="2" rx="1" />
            <rect class="ma-art__k ma-art__faint" x="45.5" y="41" width="9" height="1.3" rx="0.65" />
            <circle class="ma-art__a" cx="50" cy="50" r="3.2" />
            <path class="ma-art__l" d="M39.6 22L41.4 68Q42 45 42.6 22Z" />
            <path class="ma-art__a" d="M41 72L59 72L59 84Q59 87 56 87L44 87Q41 87 41 84Z" />
            <path class="ma-art__as ma-art__faint" d="M44 74V85M47 74V85M50 74V85M53 74V85M56 74V85" />
          </>
        )
      }
      {
        art === 'pump' && (
          <>
            <path class="ma-art__b" d="M33 46Q33 40 39 40L61 40Q67 40 67 46L67 82Q67 87 62 87L38 87Q33 87 33 82Z" />
            <path class="ma-art__sh" d="M60 40L61 40Q67 40 67 46L67 82Q67 87 62 87L60 87Z" />
            <rect class="ma-art__p" x="39" y="54" width="22" height="22" rx="2" />
            <rect class="ma-art__k" x="42.5" y="59" width="15" height="2.2" rx="1.1" />
            <rect class="ma-art__k ma-art__faint" x="44" y="63.5" width="12" height="1.4" rx="0.7" />
            <circle class="ma-art__a" cx="50" cy="70" r="1.8" />
            <path class="ma-art__l" d="M36.5 47L36.5 80Q38 63 39 47Z" />
            <path class="ma-art__s" d="M43 34L57 34L58 40L42 40Z" />
            <g class="ma-art__press">
              <rect class="ma-art__s" x="47.5" y="25" width="5" height="9" />
              <path class="ma-art__a" d="M40 20Q40 18 42 18L58 18Q60 18 60 20L60 26L40 26Z M60 20L72 20Q73 20 73 21.5L73 23L60 23Z" />
            </g>
          </>
        )
      }
      {
        art === 'chair' && (
          <>
            <rect class="ma-art__s" x="32.5" y="56" width="3.4" height="26" rx="1" />
            <rect class="ma-art__s" x="63.5" y="56" width="3.4" height="26" rx="1" />
            <path class="ma-art__b" d="M31 18Q31 15 34 15L66 15Q69 15 69 18L67 46Q67 48 65 48L35 48Q33 48 33 46Z" />
            <path class="ma-art__a" d="M36 20L64 20L62.6 43L37.4 43Z" />
            <rect class="ma-art__s" x="34" y="48" width="3" height="5" />
            <rect class="ma-art__s" x="63" y="48" width="3" height="5" />
            <path class="ma-art__l" d="M27 52L73 52L78 59L22 59Z" />
            <path class="ma-art__b" d="M22 59L78 59L78 63Q78 64 77 64L23 64Q22 64 22 63Z" />
            <path class="ma-art__s" d="M25 64L29 64L27.5 87L24.5 87Z M71 64L75 64L75.5 87L72.5 87Z" />
          </>
        )
      }
      {
        art === 'stool' && (
          <>
            <path class="ma-art__ss ma-art__leg" d="M38 40L27 87M62 40L73 87M50 42L50 87" />
            <ellipse class="ma-art__ss ma-art__ring" cx="50" cy="68" rx="17.5" ry="3.6" />
            <path class="ma-art__b" d="M24 34L76 34L76 40Q76 44.5 50 44.5Q24 44.5 24 40Z" />
            <ellipse class="ma-art__l" cx="50" cy="34" rx="26" ry="6.4" />
            <ellipse class="ma-art__a" cx="50" cy="33.6" rx="20" ry="4.4" />
            <path class="ma-art__as ma-art__faint" d="M36 31.5Q50 37 64 31.5M38 34.6Q50 39 62 34.6" />
          </>
        )
      }
      {
        art === 'lamp' && (
          <>
            <path class="ma-art__glow" d="M30 47L70 47L86 88L14 88Z" />
            <path class="ma-art__s" d="M48.6 50h2.8v31h-2.8Z" />
            <path class="ma-art__s" d="M36 82Q36 80 38 80L62 80Q64 80 64 82L64 86Q64 87 63 87L37 87Q36 87 36 86Z" />
            <rect class="ma-art__l" x="38" y="81" width="24" height="1.4" rx="0.7" />
            <ellipse class="ma-art__p ma-art__bulb-light" cx="50" cy="49.5" rx="4.6" ry="3.2" />
            <path class="ma-art__b" d="M36 20L64 20L76 46Q76.6 48 74.5 48L25.5 48Q23.4 48 24 46Z" />
            <path class="ma-art__sh" d="M57 20L64 20L76 46Q76.6 48 74.5 48L66 48Z" />
            <path class="ma-art__s" d="M36 20L64 20L65 22.6L35 22.6Z" />
            <path class="ma-art__a" d="M24.4 43.6L75.6 43.6L76.4 45.8Q76.8 48 74.5 48L25.5 48Q23.2 48 23.6 45.8Z" />
          </>
        )
      }
      {
        art === 'table' && (
          <>
            <ellipse class="ma-art__s" cx="50" cy="84.4" rx="17" ry="3.8" />
            <ellipse class="ma-art__b" cx="50" cy="83" rx="15" ry="3" />
            <path class="ma-art__b" d="M46 46L54 46L55.2 82L44.8 82Z" />
            <path class="ma-art__sh" d="M51 46L54 46L55.2 82L52 82Z" />
            <path class="ma-art__b" d="M20 40L80 40L80 44Q80 47.4 50 47.4Q20 47.4 20 44Z" />
            <path class="ma-art__sh" d="M66 40L80 40L80 44Q80 47 66 47.2Z" />
            <ellipse class="ma-art__l" cx="50" cy="40" rx="30" ry="7" />
            <path class="ma-art__ss ma-art__stem" d="M50 25Q49 17 43.5 12.5M50 23Q53 16 57.5 13.5" />
            <ellipse class="ma-art__a" cx="43" cy="13" rx="2.8" ry="1.5" transform="rotate(-30 43 13)" />
            <ellipse class="ma-art__a" cx="58" cy="13.5" rx="2.8" ry="1.5" transform="rotate(25 58 13.5)" />
            <path class="ma-art__a" d="M45 39Q43 32 46 27L46 24L54 24L54 27Q57 32 55 39Z" />
            <path class="ma-art__as-f ma-art__faint" d="M52 27Q55 32 53.6 39L55 39Q57 32 54 27Z" />
          </>
        )
      }
      {
        art === 'shelf' && (
          <>
            <rect class="ma-art__b" x="22" y="14" width="5" height="73" rx="1" />
            <rect class="ma-art__b" x="73" y="14" width="5" height="73" rx="1" />
            <rect class="ma-art__a" x="30" y="22" width="5" height="16" rx="0.6" />
            <rect class="ma-art__p" x="35.6" y="24" width="4" height="14" rx="0.6" />
            <rect class="ma-art__d" x="40.2" y="21" width="5" height="17" rx="0.6" />
            <path class="ma-art__l" d="M46 38L49.4 21.4L53.8 22.3L50.4 38Z" />
            <path class="ma-art__a" d="M60 38Q58 32 61 28L61 26L65 26L65 28Q68 32 66 38Z" />
            <path class="ma-art__a" d="M29 52L47 52Q46 59 41 60L35 60Q30 59 29 52Z" />
            <rect class="ma-art__d" x="55" y="45" width="16" height="4.4" rx="0.6" />
            <rect class="ma-art__a" x="56" y="49.4" width="15" height="5" rx="0.6" />
            <rect class="ma-art__p" x="54" y="54.4" width="18" height="5.6" rx="0.6" />
            <path class="ma-art__s" d="M32 81L34 70L44 70L46 81Z" />
            <ellipse class="ma-art__a" cx="36" cy="66" rx="2.6" ry="5" transform="rotate(-25 36 66)" />
            <ellipse class="ma-art__a" cx="42" cy="65.5" rx="2.6" ry="5" transform="rotate(25 42 65.5)" />
            <ellipse class="ma-art__a" cx="39" cy="63.5" rx="2.4" ry="5.4" />
            <rect class="ma-art__p" x="53" y="66" width="18" height="15" rx="0.8" />
            <rect class="ma-art__a" x="56" y="69" width="12" height="9" rx="0.5" />
            <g class="ma-art__s"><rect x="22" y="14" width="56" height="4" /><rect x="22" y="38" width="56" height="4" /><rect x="22" y="60" width="56" height="4" /><rect x="22" y="81" width="56" height="4" /></g>
          </>
        )
      }
      {
        art === 'loaf' && (
          <>
            <path class="ma-art__b" d="M16 70Q16 46 50 44Q84 46 84 70Q84 80 72 81L28 81Q16 80 16 70Z" />
            <path class="ma-art__sh" d="M60 46Q84 48 84 70Q84 76 78 79Q80 62 60 46Z" />
            <path class="ma-art__s" d="M17 72Q18 80 28 81L72 81Q82 80 83 72Q70 77 50 77Q30 77 17 72Z" />
            <path class="ma-art__l" d="M30 56Q50 46 70 56Q50 52.4 30 56Z" />
            <path class="ma-art__ls ma-art__score" d="M30 57Q50 51 70 57" />
            <g class="ma-art__p ma-art__dust"><circle cx="36" cy="52" r="1" /><circle cx="44" cy="49.6" r="0.8" /><circle cx="56" cy="49.8" r="0.9" /><circle cx="63" cy="52.6" r="0.8" /><circle cx="50" cy="48.8" r="0.7" /><circle cx="40" cy="61" r="0.7" /><circle cx="60" cy="62" r="0.6" /></g>
          </>
        )
      }
      {
        art === 'croissant' && (
          <>
            <ellipse class="ma-art__s" cx="21" cy="70" rx="6.5" ry="9.5" transform="rotate(-55 21 70)" />
            <ellipse class="ma-art__s" cx="79" cy="70" rx="6.5" ry="9.5" transform="rotate(55 79 70)" />
            <ellipse class="ma-art__b" cx="32" cy="64" rx="10.5" ry="14.5" transform="rotate(-40 32 64)" />
            <ellipse class="ma-art__b" cx="68" cy="64" rx="10.5" ry="14.5" transform="rotate(40 68 64)" />
            <ellipse class="ma-art__b" cx="50" cy="59" rx="13.5" ry="19.5" />
            <path class="ma-art__sh" d="M38 72Q50 80 62 72Q60 78.6 50 78.6Q40 78.6 38 72Z" />
            <path class="ma-art__ss ma-art__seam" d="M40.5 49Q44 60 40.5 74M59.5 49Q56 60 59.5 74M25.6 57.4Q28 66 23.6 73M74.4 57.4Q72 66 76.4 73" />
            <ellipse class="ma-art__l ma-art__gloss" cx="46" cy="52" rx="3.6" ry="8" transform="rotate(-10 46 52)" />
            <ellipse class="ma-art__l ma-art__gloss" cx="30" cy="60" rx="2.4" ry="5" transform="rotate(-40 30 60)" />
            <ellipse class="ma-art__l ma-art__gloss" cx="65" cy="58" rx="2.4" ry="5" transform="rotate(40 65 58)" />
          </>
        )
      }
      {
        art === 'cake' && (
          <>
            <ellipse class="ma-art__s" cx="50" cy="87" rx="12" ry="2" />
            <path class="ma-art__s" d="M46 82L54 82L56 86L44 86Z" />
            <rect class="ma-art__s" x="18" y="78" width="64" height="4" rx="2" />
            <path class="ma-art__b" d="M26 42L74 42L74 76Q74 78 72 78L28 78Q26 78 26 76Z" />
            <rect class="ma-art__a" x="26" y="60" width="48" height="4.5" />
            <path class="ma-art__sh" d="M66 42L74 42L74 76Q74 78 72 78L66 78Z" />
            <path class="ma-art__p" d="M26 40Q26 36 30 36L70 36Q74 36 74 40L74 47Q74 48 73 48L72.5 48Q71 48 71 50L71 52Q71 54 69.5 54Q68 54 68 52L68 48L64 48Q63 48 63 49.5Q63 51 61.5 51Q60 51 60 49.5L60 48L54.5 48L54.5 53Q54.5 55 52.75 55Q51 55 51 53L51 48L43 48Q42 48 42 49.5Q42 51 40.5 51Q39 51 39 49.5L39 48L33.5 48L33.5 51.5Q33.5 53.5 31.75 53.5Q30 53.5 30 51.5L30 48L27 48Q26 48 26 47Z" />
            <g class="ma-art__a ma-art__berries"><circle cx="38" cy="33.4" r="3.4" /><circle cx="50" cy="32.6" r="3.8" /><circle cx="62" cy="33.4" r="3.4" /></g>
            <g class="ma-art__p"><circle cx="37" cy="32.2" r="0.9" /><circle cx="49" cy="31.2" r="1" /><circle cx="61" cy="32.2" r="0.9" /></g>
          </>
        )
      }
      {
        art === 'cookie' && (
          <>
            <circle class="ma-art__s" cx="63" cy="50" r="21" />
            <g class="ma-art__d ma-art__faint"><circle cx="66" cy="38" r="2" /><circle cx="76" cy="50" r="1.8" /><circle cx="70" cy="60" r="1.6" /></g>
            <circle class="ma-art__b" cx="45" cy="60" r="25" />
            <path class="ma-art__sh" d="M66 47A25 25 0 0 1 45 85A25 25 0 0 0 66 47Z" />
            <g class="ma-art__d"><circle cx="38" cy="52" r="2.4" /><circle cx="50" cy="48.6" r="2.2" /><circle cx="55" cy="63" r="2.5" /><circle cx="42" cy="69" r="2.3" /><circle cx="31" cy="62" r="2" /><circle cx="49" cy="76" r="2" /><circle cx="60" cy="72" r="1.6" /></g>
            <path class="ma-art__ls ma-art__crack" d="M29 55Q35 58 33 64M52 55Q56 60 54 66M40 77Q44 74 46 78" />
          </>
        )
      }
      {
        art === 'bun' && (
          <>
            <path class="ma-art__s" d="M17 60L17 70Q17 82 50 82Q83 82 83 70L83 60Z" />
            <path class="ma-art__sh" d="M17 66Q50 75 83 66L83 70Q83 82 50 82Q17 82 17 70Z" />
            <ellipse class="ma-art__b" cx="50" cy="60" rx="33" ry="14" />
            <path class="ma-art__ss ma-art__swirl" d="M50 60m-4 0a4 2 0 1 1 8 0a9 4 0 1 1 -18 0a14 6.4 0 1 1 28 0a19 8.5 0 1 1 -38 0a24 10.4 0 1 1 48 0" />
            <path class="ma-art__ps ma-art__glaze" d="M27 56L36 66L44 53L53 67L62 54L71 64" />
          </>
        )
      }
    </g>
  </svg>
  {tile && caption && <span class="ma-art__caption">{caption}</span>}
</div>

<style is:global>
  @layer components {
    /* the product's colour, and the shade, light, paper and deep tones mixed from it, so a colourway is one value */
    :where(.ma-art) {
      --_body: var(--ma-art-body, var(--ma-motif-1, var(--primary, currentColor)));
      --_accent: var(--ma-art-accent, var(--ma-motif-2, var(--accent, currentColor)));
      --_shade: color-mix(in oklab, var(--_body) 74%, #000);
      --_light: color-mix(in oklab, var(--_body) 55%, #fff);
      --_paper: color-mix(in oklab, var(--_body) 9%, #fff);
      --_deep: color-mix(in oklab, var(--_body) 34%, #1b130e);
      --_accent-shade: color-mix(in oklab, var(--_accent) 72%, #000);
      display: grid;
      place-items: center;
      color: var(--ma-block-text, currentColor);
    }
    :where(.ma-art__svg) { width: 100%; height: 100%; overflow: visible; }
    /* the tile: the block's ground, the product at four fifths of the box, a light from the top left */
    :where(.ma-art--tile) { position: relative; overflow: hidden; width: 100%; height: 100%; background: var(--ma-block-ground, transparent); }
    :where(.ma-art--tile .ma-art__svg) { width: 80%; height: 80%; max-width: 32rem; }
    :where(.ma-art--tile)::after { content: ''; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(110% 80% at 14% 0%, oklch(1 0 0 / 22%), transparent 62%); }
    :where(.ma-art__caption) { position: absolute; left: 0.875rem; bottom: 0.875rem; z-index: 1; padding: 0.4rem 0.7rem; border-radius: 999px; background: color-mix(in oklab, var(--background, var(--ma-panel)) 92%, transparent); color: var(--foreground, var(--ma-ink)); font-family: var(--ma-font-mono, ui-monospace, monospace); font-size: 0.6875rem; font-weight: 500; line-height: 1; letter-spacing: 0.06em; text-transform: uppercase; }

    :where(.ma-art__b) { fill: var(--_body); }
    :where(.ma-art__s) { fill: var(--_shade); }
    :where(.ma-art__sh) { fill: var(--_shade); fill-opacity: 0.42; }
    :where(.ma-art__l) { fill: var(--_light); }
    :where(.ma-art__a) { fill: var(--_accent); }
    :where(.ma-art__as-f) { fill: var(--_accent-shade); }
    :where(.ma-art__p) { fill: var(--_paper); }
    :where(.ma-art__d) { fill: var(--_deep); }
    :where(.ma-art__k) { fill: var(--_deep); }
    :where(.ma-art__glass) { fill: var(--_paper); fill-opacity: 0.7; }
    :where(.ma-art__faint) { opacity: 0.55; }
    :where(.ma-art__bs, .ma-art__ss, .ma-art__ls, .ma-art__ps, .ma-art__as) { fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.4; }
    :where(.ma-art__bs) { stroke: var(--_body); }
    :where(.ma-art__ss) { stroke: var(--_shade); }
    :where(.ma-art__ls) { stroke: var(--_light); }
    :where(.ma-art__ps) { stroke: var(--_paper); }
    :where(.ma-art__as) { stroke: var(--_accent-shade); }
    :where(.ma-art__handle) { stroke-width: 3.2; }
    :where(.ma-art__handle-thick) { stroke-width: 5.5; }
    :where(.ma-art__leg) { stroke-width: 3.6; }
    :where(.ma-art__ring, .ma-art__swirl) { stroke-width: 2.2; }
    :where(.ma-art__score) { stroke-width: 3; }
    :where(.ma-art__glaze) { stroke-width: 2.2; }
    :where(.ma-art__seam) { stroke-width: 1.2; }
    :where(.ma-art__stem) { stroke-width: 1.4; }
    :where(.ma-art__crack) { stroke-width: 1.2; }
    :where(.ma-art__gloss) { opacity: 0.7; }
    :where(.ma-art__speck) { opacity: 0.4; }
    :where(.ma-art__shadow) { fill: var(--ma-block-text, currentColor); opacity: 0.13; }
    :where(.ma-art__steam) { fill: none; stroke: var(--ma-block-text, currentColor); stroke-width: 1.6; stroke-linecap: round; opacity: 0; }
    :where(.ma-art__glow) { fill: var(--_paper); opacity: 0; }
    :where(.ma-art__drops circle) { opacity: 0; }

    /* picked up while a link around it is hovered or focused: the product lifts and leans, its shadow narrows; a few
       have a second gesture. A few view-box units, on the preset's slow duration */
    :where(.ma-art svg :is(.ma-art__obj, .ma-art__shadow, .ma-art__swing, .ma-art__lid, .ma-art__press, .ma-art__bulb, .ma-art__steam, .ma-art__glow, .ma-art__bulb-light)) { transform-box: view-box; transition: translate var(--ma-duration-slow, 700ms) var(--ma-ease-out), rotate var(--ma-duration-slow, 700ms) var(--ma-ease-out), scale var(--ma-duration-slow, 700ms) var(--ma-ease-out), opacity var(--ma-duration-slow, 700ms) var(--ma-ease-out); }
    :where(.ma-art__obj) { transform-origin: 50px 88px; }
    :where(.ma-art__shadow) { transform-origin: 50px 89px; }
    :where(.ma-art__swing) { transform-origin: 50px 22px; }
    :where(.ma-art__lid) { transform-origin: 25px 48px; }
    :where(.ma-art__bulb) { transform-origin: 50px 33px; }
    @media (hover: hover) and (pointer: fine) {
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__obj) { translate: 0 calc(var(--ma-travel-hover, 4px) * -1); rotate: -2.5deg; }
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__shadow) { scale: 0.82 1; opacity: 0.09; }
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__swing) { rotate: 5deg; }
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__lid) { translate: 0 calc(var(--ma-travel-hover, 4px) * -0.9); rotate: -7deg; }
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__press) { translate: 0 calc(var(--ma-travel-hover, 4px) * 0.7); }
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__bulb) { scale: 0.86 1; }
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__glow) { opacity: 0.42; }
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__bulb-light) { fill: #fff; }
      /* the steam rises twice and the drips fall three times while it is hovered, then rest: nothing loops on its own */
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__steam) { animation: ma-art-steam calc(var(--ma-duration-slow, 700ms) * 3) var(--ma-ease-out) 2; }
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__drops circle) { animation: ma-art-drip calc(var(--ma-duration-slow, 700ms) * 1.6) ease-in 3; }
      :where(:is(:is(a, button, .ma-art-host):is(:hover, :focus-visible), .ma-art-host:has(:focus-visible)) .ma-art:not([data-still]) .ma-art__drops circle:last-child) { animation-delay: calc(var(--ma-duration-slow, 700ms) * 0.8); }
    }
    @keyframes ma-art-steam {
      0% { opacity: 0; translate: 0 4px; }
      35% { opacity: 0.4; }
      100% { opacity: 0; translate: 0 -6px; }
    }
    @keyframes ma-art-drip {
      0% { opacity: 0; translate: 0 0; }
      15% { opacity: 1; }
      100% { opacity: 0; translate: 0 10px; }
    }
    @media (prefers-reduced-motion: reduce) {
      :where(.ma-art svg *) { transition: none; animation: none; }
    }
  }
</style>

```
