[object Object]

← back to Nova Recolor

initial scaffold (gitify-all 2026-05-06)

315a148ef2b2b67c9e2b484138761291e5b7bbec · 2026-05-06 10:25:44 -0700 · Steve Abrams

Files touched

Diff

commit 315a148ef2b2b67c9e2b484138761291e5b7bbec
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed May 6 10:25:44 2026 -0700

    initial scaffold (gitify-all 2026-05-06)
---
 .gitignore                   |  12 +
 batch_recolor.py             |  60 +++++
 batch_recolor_v2.py          |  65 +++++
 draperies/acorn.jpg          | Bin 0 -> 203627 bytes
 draperies/adobe.jpg          | Bin 0 -> 133034 bytes
 draperies/african-violet.jpg | Bin 0 -> 209786 bytes
 draperies/apricot.jpg        | Bin 0 -> 255742 bytes
 draperies/arrow-wood.jpg     | Bin 0 -> 407227 bytes
 draperies/aubergine.jpg      | Bin 0 -> 211314 bytes
 draperies/baltic.jpg         | Bin 0 -> 199007 bytes
 draperies/beige.jpg          | Bin 0 -> 178059 bytes
 draperies/biscuit.jpg        | Bin 0 -> 179559 bytes
 draperies/bluestone.jpg      | Bin 0 -> 299723 bytes
 draperies/blush-pink.jpg     | Bin 0 -> 392276 bytes
 draperies/bone.jpg           | Bin 0 -> 428040 bytes
 draperies/buff.jpg           | Bin 0 -> 179993 bytes
 draperies/buttercup.jpg      | Bin 0 -> 225283 bytes
 draperies/cane.jpg           | Bin 0 -> 270248 bytes
 draperies/carbon.jpg         | Bin 0 -> 217379 bytes
 draperies/cashew.jpg         | Bin 0 -> 264208 bytes
 draperies/cashmere.jpg       | Bin 0 -> 378261 bytes
 draperies/celadon.jpg        | Bin 0 -> 271950 bytes
 draperies/celery.jpg         | Bin 0 -> 277221 bytes
 draperies/champagne.jpg      | Bin 0 -> 160449 bytes
 draperies/china-blue.jpg     | Bin 0 -> 256462 bytes
 draperies/chrome-grey.jpg    | Bin 0 -> 310710 bytes
 draperies/cinder.jpg         | Bin 0 -> 252075 bytes
 draperies/cloud.jpg          | Bin 0 -> 207583 bytes
 draperies/cocoa.jpg          | Bin 0 -> 247597 bytes
 draperies/coral.jpg          | Bin 0 -> 268319 bytes
 draperies/cottage-grey.jpg   | Bin 0 -> 385236 bytes
 draperies/cream.jpg          | Bin 0 -> 206284 bytes
 draperies/dark-sand.jpg      | Bin 0 -> 419971 bytes
 draperies/dew.jpg            | Bin 0 -> 284080 bytes
 draperies/dove.jpg           | Bin 0 -> 316675 bytes
 draperies/dune.jpg           | Bin 0 -> 182797 bytes
 draperies/dusty-rose.jpg     | Bin 0 -> 292195 bytes
 draperies/ecru.jpg           | Bin 0 -> 194341 bytes
 draperies/fawn.jpg           | Bin 0 -> 238173 bytes
 draperies/french-blue.jpg    | Bin 0 -> 315326 bytes
 draperies/gainsborough.jpg   | Bin 0 -> 227663 bytes
 draperies/garnet.jpg         | Bin 0 -> 219906 bytes
 draperies/gelato.jpg         | Bin 0 -> 208799 bytes
 draperies/goldstone.jpg      | Bin 0 -> 264424 bytes
 draperies/granite.jpg        | Bin 0 -> 348261 bytes
 draperies/grape.jpg          | Bin 0 -> 231793 bytes
 draperies/green-marble.jpg   | Bin 0 -> 311112 bytes
 draperies/greystone.jpg      | Bin 0 -> 437557 bytes
 draperies/harvest.jpg        | Bin 0 -> 396762 bytes
 draperies/honey.jpg          | Bin 0 -> 238973 bytes
 draperies/hyacinth.jpg       | Bin 0 -> 263434 bytes
 draperies/iceberg.jpg        | Bin 0 -> 347536 bytes
 draperies/index.html         | 143 +++++++++++
 draperies/ivory.jpg          | Bin 0 -> 188711 bytes
 draperies/java.jpg           | Bin 0 -> 247597 bytes
 draperies/lavender.jpg       | Bin 0 -> 352430 bytes
 draperies/light-amethyst.jpg | Bin 0 -> 421455 bytes
 draperies/light-grey.jpg     | Bin 0 -> 463423 bytes
 draperies/linen.jpg          | Bin 0 -> 170651 bytes
 draperies/madison-grey.jpg   | Bin 0 -> 261630 bytes
 draperies/maize.jpg          | Bin 0 -> 186035 bytes
 draperies/manifest.json      | 587 +++++++++++++++++++++++++++++++++++++++++++
 draperies/maroon.jpg         | Bin 0 -> 190770 bytes
 draperies/meadow.jpg         | Bin 0 -> 291848 bytes
 draperies/melon.jpg          | Bin 0 -> 248581 bytes
 draperies/milk.jpg           | Bin 0 -> 180540 bytes
 draperies/mint-julip.jpg     | Bin 0 -> 298177 bytes
 draperies/misty-dew.jpg      | Bin 0 -> 322641 bytes
 draperies/mocha.jpg          | Bin 0 -> 247597 bytes
 draperies/moss.jpg           | Bin 0 -> 276902 bytes
 draperies/mushroom.jpg       | Bin 0 -> 298908 bytes
 draperies/nutmeg.jpg         | Bin 0 -> 425775 bytes
 draperies/ocean.jpg          | Bin 0 -> 293826 bytes
 draperies/olive.jpg          | Bin 0 -> 179346 bytes
 draperies/oyster.jpg         | Bin 0 -> 394217 bytes
 draperies/pale-green.jpg     | Bin 0 -> 200422 bytes
 draperies/passion-blue.jpg   | Bin 0 -> 332308 bytes
 draperies/peach.jpg          | Bin 0 -> 190701 bytes
 draperies/pebble.jpg         | Bin 0 -> 238156 bytes
 draperies/peppermint.jpg     | Bin 0 -> 193200 bytes
 draperies/peridot.jpg        | Bin 0 -> 207898 bytes
 draperies/periwinkle.jpg     | Bin 0 -> 333505 bytes
 draperies/plum-pleasure.jpg  | Bin 0 -> 192143 bytes
 draperies/porcelain.jpg      | Bin 0 -> 148823 bytes
 draperies/powder-grey.jpg    | Bin 0 -> 251840 bytes
 draperies/prairie.jpg        | Bin 0 -> 408409 bytes
 draperies/putty.jpg          | Bin 0 -> 235752 bytes
 draperies/raffia.jpg         | Bin 0 -> 294738 bytes
 draperies/royal-purple.jpg   | Bin 0 -> 162872 bytes
 draperies/ruby.jpg           | Bin 0 -> 215853 bytes
 draperies/sable.jpg          | Bin 0 -> 239368 bytes
 draperies/safari.jpg         | Bin 0 -> 216962 bytes
 draperies/saffron.jpg        | Bin 0 -> 253905 bytes
 draperies/sage.jpg           | Bin 0 -> 271359 bytes
 draperies/salt.jpg           | Bin 0 -> 203613 bytes
 draperies/sand.jpg           | Bin 0 -> 290672 bytes
 draperies/sandalwood.jpg     | Bin 0 -> 270221 bytes
 draperies/scarlet-wine.jpg   | Bin 0 -> 211281 bytes
 draperies/sea-blue.jpg       | Bin 0 -> 281742 bytes
 draperies/sea-breeze.jpg     | Bin 0 -> 248050 bytes
 draperies/sea-grass.jpg      | Bin 0 -> 456926 bytes
 draperies/seafoam.jpg        | Bin 0 -> 310071 bytes
 draperies/sienna.jpg         | Bin 0 -> 388442 bytes
 draperies/silver.jpg         | Bin 0 -> 380030 bytes
 draperies/sky-blue.jpg       | Bin 0 -> 270004 bytes
 draperies/smoke.jpg          | Bin 0 -> 242720 bytes
 draperies/soft-clay.jpg      | Bin 0 -> 268677 bytes
 draperies/solar-yellow.jpg   | Bin 0 -> 245637 bytes
 draperies/steel.jpg          | Bin 0 -> 380030 bytes
 draperies/stone-grey.jpg     | Bin 0 -> 364037 bytes
 draperies/stone-taupe.jpg    | Bin 0 -> 271042 bytes
 draperies/straw.jpg          | Bin 0 -> 184188 bytes
 draperies/strong-white.jpg   | Bin 0 -> 160077 bytes
 draperies/sugar-plum.jpg     | Bin 0 -> 250335 bytes
 draperies/sweet-lilac.jpg    | Bin 0 -> 259779 bytes
 draperies/tan.jpg            | Bin 0 -> 213191 bytes
 draperies/tarragon.jpg       | Bin 0 -> 489617 bytes
 draperies/taupe.jpg          | Bin 0 -> 251282 bytes
 draperies/thyme.jpg          | Bin 0 -> 265061 bytes
 draperies/trench.jpg         | Bin 0 -> 291439 bytes
 draperies/vanilla.jpg        | Bin 0 -> 169908 bytes
 draperies/white.jpg          | Bin 0 -> 165713 bytes
 novasuede-ruby.jpg           | Bin 0 -> 1150303 bytes
 sku_image_map.json           |  40 +++
 124 files changed, 907 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..7e6a9c3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+node_modules/
+.env
+.env.local
+.env.*.local
+.env.*
+tmp/
+*.log
+.DS_Store
+dist/
+build/
+.next/
+*.bak
diff --git a/batch_recolor.py b/batch_recolor.py
new file mode 100644
index 0000000..775756d
--- /dev/null
+++ b/batch_recolor.py
@@ -0,0 +1,60 @@
+import os, re, glob, sys
+import numpy as np
+import cv2
+
+SRC = '/Users/stevestudio2/Pictures/novasuede-ruby.jpg'
+PICS = '/Users/stevestudio2/Pictures'
+
+def slugify(fname):
+    stem = os.path.splitext(fname)[0].rstrip('. ')
+    stem = re.sub(r'^Novasuede-\.?', '', stem, flags=re.I)
+    parts = re.split(r'[-\s]*T3[A-Z0-9]+W', stem, maxsplit=1, flags=re.I)
+    color = parts[0]
+    color = re.sub(r'[\s.]+', '-', color.strip())
+    color = re.sub(r'[^\w-]+', '', color)
+    color = re.sub(r'-+', '-', color).strip('-').lower()
+    return color
+
+def center_crop(img, frac=0.7):
+    h, w = img.shape[:2]
+    ch, cw = int(h*frac), int(w*frac)
+    y0, x0 = (h-ch)//2, (w-cw)//2
+    return img[y0:y0+ch, x0:x0+cw]
+
+def lab_reinhard(src_bgr, tgt_bgr):
+    src_lab = cv2.cvtColor(src_bgr, cv2.COLOR_BGR2LAB).astype(np.float32)
+    tgt_lab = cv2.cvtColor(tgt_bgr, cv2.COLOR_BGR2LAB).astype(np.float32)
+    s = src_lab.reshape(-1, 3)
+    t = tgt_lab.reshape(-1, 3)
+    s_mean, s_std = s.mean(0), s.std(0)
+    t_mean, t_std = t.mean(0), t.std(0)
+    out = (src_lab - s_mean) * (t_std / (s_std + 1e-8)) + t_mean
+    out = np.clip(out, 0, 255).astype(np.uint8)
+    return cv2.cvtColor(out, cv2.COLOR_LAB2BGR)
+
+src = cv2.imread(SRC, cv2.IMREAD_COLOR)
+assert src is not None, f"could not read {SRC}"
+
+targets = sorted(glob.glob(os.path.join(PICS, 'Novasuede*.jpg')))
+print(f"found {len(targets)} targets")
+
+results = []
+for t_path in targets:
+    fname = os.path.basename(t_path)
+    color = slugify(fname)
+    if not color:
+        print(f"SKIP (no color): {fname}")
+        continue
+    tgt = cv2.imread(t_path, cv2.IMREAD_COLOR)
+    if tgt is None:
+        print(f"SKIP (unreadable): {fname}")
+        continue
+    tgt_c = center_crop(tgt, 0.7)
+    out = lab_reinhard(src, tgt_c)
+    out_path = os.path.join(PICS, f'novasuede-{color}.jpg')
+    cv2.imwrite(out_path, out, [cv2.IMWRITE_JPEG_QUALITY, 92])
+    tgt_lab_mean = cv2.cvtColor(tgt_c, cv2.COLOR_BGR2LAB).astype(np.float32).reshape(-1,3).mean(0)
+    results.append((color, fname, tgt_lab_mean))
+    print(f"OK  {fname:55s} -> novasuede-{color}.jpg   tgt LAB mean [{tgt_lab_mean[0]:5.1f} {tgt_lab_mean[1]:5.1f} {tgt_lab_mean[2]:5.1f}]")
+
+print(f"\ndone: {len(results)} recolored")
diff --git a/batch_recolor_v2.py b/batch_recolor_v2.py
new file mode 100644
index 0000000..9603ced
--- /dev/null
+++ b/batch_recolor_v2.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python3
+"""Reinhard color-transfer batch: ruby drapery → every Novasuede color.
+
+Source drapery: /Users/stevestudio2/Projects/nova-recolor/novasuede-ruby.jpg
+Color samples:  /tmp/novasuede_sources/*.jpg (downloaded from Shopify CDN)
+Output:         /tmp/novasuede_drapery/{slug}.jpg
+
+Reinhard 2001 color transfer: matches mean+std of source LAB to target LAB.
+"""
+import os, glob, json, sys, time
+import numpy as np
+import cv2
+
+DRAPERY_SRC = '/Users/stevestudio2/Projects/nova-recolor/novasuede-ruby.jpg'
+SAMPLES_DIR = '/tmp/novasuede_sources'
+OUT_DIR = '/tmp/novasuede_drapery'
+
+os.makedirs(OUT_DIR, exist_ok=True)
+
+def center_crop(img, frac=0.7):
+    h, w = img.shape[:2]
+    ch, cw = int(h*frac), int(w*frac)
+    y0, x0 = (h-ch)//2, (w-cw)//2
+    return img[y0:y0+ch, x0:x0+cw]
+
+def lab_reinhard(src_bgr, tgt_bgr):
+    """Reinhard 2001 color transfer in LAB space."""
+    src_lab = cv2.cvtColor(src_bgr, cv2.COLOR_BGR2LAB).astype(np.float32)
+    tgt_lab = cv2.cvtColor(tgt_bgr, cv2.COLOR_BGR2LAB).astype(np.float32)
+    s = src_lab.reshape(-1, 3)
+    t = tgt_lab.reshape(-1, 3)
+    s_mean, s_std = s.mean(0), s.std(0)
+    t_mean, t_std = t.mean(0), t.std(0)
+    out = (src_lab - s_mean) * (t_std / (s_std + 1e-8)) + t_mean
+    out = np.clip(out, 0, 255).astype(np.uint8)
+    return cv2.cvtColor(out, cv2.COLOR_LAB2BGR)
+
+src = cv2.imread(DRAPERY_SRC, cv2.IMREAD_COLOR)
+assert src is not None, f"could not read {DRAPERY_SRC}"
+
+samples = sorted(glob.glob(os.path.join(SAMPLES_DIR, '*.jpg')))
+print(f"found {len(samples)} color samples")
+
+manifest = []
+t0 = time.time()
+for s_path in samples:
+    slug = os.path.splitext(os.path.basename(s_path))[0]
+    out_path = os.path.join(OUT_DIR, f'{slug}.jpg')
+    tgt = cv2.imread(s_path, cv2.IMREAD_COLOR)
+    if tgt is None:
+        print(f"SKIP unreadable: {s_path}")
+        continue
+    tgt_c = center_crop(tgt, 0.7)
+    out = lab_reinhard(src, tgt_c)
+    cv2.imwrite(out_path, out, [cv2.IMWRITE_JPEG_QUALITY, 88])
+    # Also extract a single hex color from the swatch center for the chip
+    cx, cy = tgt_c.shape[1]//2, tgt_c.shape[0]//2
+    bgr = tgt_c[cy, cx]
+    hex_color = '#{:02x}{:02x}{:02x}'.format(bgr[2], bgr[1], bgr[0])
+    manifest.append({'slug': slug, 'hex': hex_color, 'drapery': f'{slug}.jpg'})
+    print(f"OK {slug:30s} hex={hex_color}")
+
+with open(os.path.join(OUT_DIR, 'manifest.json'), 'w') as f:
+    json.dump(manifest, f, indent=2)
+print(f"\ndone in {time.time()-t0:.1f}s — {len(manifest)} draperies + manifest.json")
diff --git a/draperies/acorn.jpg b/draperies/acorn.jpg
new file mode 100644
index 0000000..ef8fe2a
Binary files /dev/null and b/draperies/acorn.jpg differ
diff --git a/draperies/adobe.jpg b/draperies/adobe.jpg
new file mode 100644
index 0000000..b5740c6
Binary files /dev/null and b/draperies/adobe.jpg differ
diff --git a/draperies/african-violet.jpg b/draperies/african-violet.jpg
new file mode 100644
index 0000000..64cbf5d
Binary files /dev/null and b/draperies/african-violet.jpg differ
diff --git a/draperies/apricot.jpg b/draperies/apricot.jpg
new file mode 100644
index 0000000..070e6d8
Binary files /dev/null and b/draperies/apricot.jpg differ
diff --git a/draperies/arrow-wood.jpg b/draperies/arrow-wood.jpg
new file mode 100644
index 0000000..4a37673
Binary files /dev/null and b/draperies/arrow-wood.jpg differ
diff --git a/draperies/aubergine.jpg b/draperies/aubergine.jpg
new file mode 100644
index 0000000..01d2b8a
Binary files /dev/null and b/draperies/aubergine.jpg differ
diff --git a/draperies/baltic.jpg b/draperies/baltic.jpg
new file mode 100644
index 0000000..e156864
Binary files /dev/null and b/draperies/baltic.jpg differ
diff --git a/draperies/beige.jpg b/draperies/beige.jpg
new file mode 100644
index 0000000..90d4aae
Binary files /dev/null and b/draperies/beige.jpg differ
diff --git a/draperies/biscuit.jpg b/draperies/biscuit.jpg
new file mode 100644
index 0000000..d3bc27c
Binary files /dev/null and b/draperies/biscuit.jpg differ
diff --git a/draperies/bluestone.jpg b/draperies/bluestone.jpg
new file mode 100644
index 0000000..bc2771a
Binary files /dev/null and b/draperies/bluestone.jpg differ
diff --git a/draperies/blush-pink.jpg b/draperies/blush-pink.jpg
new file mode 100644
index 0000000..49a1f2f
Binary files /dev/null and b/draperies/blush-pink.jpg differ
diff --git a/draperies/bone.jpg b/draperies/bone.jpg
new file mode 100644
index 0000000..7dc2e80
Binary files /dev/null and b/draperies/bone.jpg differ
diff --git a/draperies/buff.jpg b/draperies/buff.jpg
new file mode 100644
index 0000000..f0d4030
Binary files /dev/null and b/draperies/buff.jpg differ
diff --git a/draperies/buttercup.jpg b/draperies/buttercup.jpg
new file mode 100644
index 0000000..461c219
Binary files /dev/null and b/draperies/buttercup.jpg differ
diff --git a/draperies/cane.jpg b/draperies/cane.jpg
new file mode 100644
index 0000000..fec45c7
Binary files /dev/null and b/draperies/cane.jpg differ
diff --git a/draperies/carbon.jpg b/draperies/carbon.jpg
new file mode 100644
index 0000000..4de6976
Binary files /dev/null and b/draperies/carbon.jpg differ
diff --git a/draperies/cashew.jpg b/draperies/cashew.jpg
new file mode 100644
index 0000000..178d2fe
Binary files /dev/null and b/draperies/cashew.jpg differ
diff --git a/draperies/cashmere.jpg b/draperies/cashmere.jpg
new file mode 100644
index 0000000..c01abb8
Binary files /dev/null and b/draperies/cashmere.jpg differ
diff --git a/draperies/celadon.jpg b/draperies/celadon.jpg
new file mode 100644
index 0000000..745c54c
Binary files /dev/null and b/draperies/celadon.jpg differ
diff --git a/draperies/celery.jpg b/draperies/celery.jpg
new file mode 100644
index 0000000..dc3671a
Binary files /dev/null and b/draperies/celery.jpg differ
diff --git a/draperies/champagne.jpg b/draperies/champagne.jpg
new file mode 100644
index 0000000..8a7af13
Binary files /dev/null and b/draperies/champagne.jpg differ
diff --git a/draperies/china-blue.jpg b/draperies/china-blue.jpg
new file mode 100644
index 0000000..ddab229
Binary files /dev/null and b/draperies/china-blue.jpg differ
diff --git a/draperies/chrome-grey.jpg b/draperies/chrome-grey.jpg
new file mode 100644
index 0000000..a2d2aeb
Binary files /dev/null and b/draperies/chrome-grey.jpg differ
diff --git a/draperies/cinder.jpg b/draperies/cinder.jpg
new file mode 100644
index 0000000..e9f977a
Binary files /dev/null and b/draperies/cinder.jpg differ
diff --git a/draperies/cloud.jpg b/draperies/cloud.jpg
new file mode 100644
index 0000000..f1605d7
Binary files /dev/null and b/draperies/cloud.jpg differ
diff --git a/draperies/cocoa.jpg b/draperies/cocoa.jpg
new file mode 100644
index 0000000..68b5a49
Binary files /dev/null and b/draperies/cocoa.jpg differ
diff --git a/draperies/coral.jpg b/draperies/coral.jpg
new file mode 100644
index 0000000..ddc7c5b
Binary files /dev/null and b/draperies/coral.jpg differ
diff --git a/draperies/cottage-grey.jpg b/draperies/cottage-grey.jpg
new file mode 100644
index 0000000..0d14d30
Binary files /dev/null and b/draperies/cottage-grey.jpg differ
diff --git a/draperies/cream.jpg b/draperies/cream.jpg
new file mode 100644
index 0000000..b0fed57
Binary files /dev/null and b/draperies/cream.jpg differ
diff --git a/draperies/dark-sand.jpg b/draperies/dark-sand.jpg
new file mode 100644
index 0000000..d0fbe38
Binary files /dev/null and b/draperies/dark-sand.jpg differ
diff --git a/draperies/dew.jpg b/draperies/dew.jpg
new file mode 100644
index 0000000..0bf7ef7
Binary files /dev/null and b/draperies/dew.jpg differ
diff --git a/draperies/dove.jpg b/draperies/dove.jpg
new file mode 100644
index 0000000..417b56c
Binary files /dev/null and b/draperies/dove.jpg differ
diff --git a/draperies/dune.jpg b/draperies/dune.jpg
new file mode 100644
index 0000000..223861a
Binary files /dev/null and b/draperies/dune.jpg differ
diff --git a/draperies/dusty-rose.jpg b/draperies/dusty-rose.jpg
new file mode 100644
index 0000000..7c16870
Binary files /dev/null and b/draperies/dusty-rose.jpg differ
diff --git a/draperies/ecru.jpg b/draperies/ecru.jpg
new file mode 100644
index 0000000..24cbec0
Binary files /dev/null and b/draperies/ecru.jpg differ
diff --git a/draperies/fawn.jpg b/draperies/fawn.jpg
new file mode 100644
index 0000000..821523e
Binary files /dev/null and b/draperies/fawn.jpg differ
diff --git a/draperies/french-blue.jpg b/draperies/french-blue.jpg
new file mode 100644
index 0000000..7cfd787
Binary files /dev/null and b/draperies/french-blue.jpg differ
diff --git a/draperies/gainsborough.jpg b/draperies/gainsborough.jpg
new file mode 100644
index 0000000..b11e3f1
Binary files /dev/null and b/draperies/gainsborough.jpg differ
diff --git a/draperies/garnet.jpg b/draperies/garnet.jpg
new file mode 100644
index 0000000..586669d
Binary files /dev/null and b/draperies/garnet.jpg differ
diff --git a/draperies/gelato.jpg b/draperies/gelato.jpg
new file mode 100644
index 0000000..56fc4d2
Binary files /dev/null and b/draperies/gelato.jpg differ
diff --git a/draperies/goldstone.jpg b/draperies/goldstone.jpg
new file mode 100644
index 0000000..ceb48ff
Binary files /dev/null and b/draperies/goldstone.jpg differ
diff --git a/draperies/granite.jpg b/draperies/granite.jpg
new file mode 100644
index 0000000..11eb8f1
Binary files /dev/null and b/draperies/granite.jpg differ
diff --git a/draperies/grape.jpg b/draperies/grape.jpg
new file mode 100644
index 0000000..bc18bad
Binary files /dev/null and b/draperies/grape.jpg differ
diff --git a/draperies/green-marble.jpg b/draperies/green-marble.jpg
new file mode 100644
index 0000000..6be0f0a
Binary files /dev/null and b/draperies/green-marble.jpg differ
diff --git a/draperies/greystone.jpg b/draperies/greystone.jpg
new file mode 100644
index 0000000..843b10b
Binary files /dev/null and b/draperies/greystone.jpg differ
diff --git a/draperies/harvest.jpg b/draperies/harvest.jpg
new file mode 100644
index 0000000..2320eea
Binary files /dev/null and b/draperies/harvest.jpg differ
diff --git a/draperies/honey.jpg b/draperies/honey.jpg
new file mode 100644
index 0000000..f4f7e3d
Binary files /dev/null and b/draperies/honey.jpg differ
diff --git a/draperies/hyacinth.jpg b/draperies/hyacinth.jpg
new file mode 100644
index 0000000..78b3b99
Binary files /dev/null and b/draperies/hyacinth.jpg differ
diff --git a/draperies/iceberg.jpg b/draperies/iceberg.jpg
new file mode 100644
index 0000000..f0345a5
Binary files /dev/null and b/draperies/iceberg.jpg differ
diff --git a/draperies/index.html b/draperies/index.html
new file mode 100644
index 0000000..a02c562
--- /dev/null
+++ b/draperies/index.html
@@ -0,0 +1,143 @@
+<!doctype html>
+<html lang="en">
+<head>
+  <meta charset="utf-8">
+  <title>Novasuede — Drapery Color Library (Reinhard)</title>
+  <style>
+    *{margin:0;padding:0;box-sizing:border-box}
+    body{
+      font-family:-apple-system,BlinkMacSystemFont,sans-serif;
+      color:#fff;
+      min-height:100vh;
+      background:#1a1a1a;
+      transition:background-image .3s ease;
+      background-size:cover;
+      background-position:center;
+      background-repeat:no-repeat;
+      background-attachment:fixed;
+    }
+    body.has-bg::before{
+      content:"";
+      position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:-1;pointer-events:none;
+    }
+    header{padding:24px 28px 12px;background:rgba(0,0,0,.55);backdrop-filter:blur(8px);position:sticky;top:0;z-index:10;border-bottom:1px solid rgba(255,255,255,.08)}
+    h1{font-size:22px;font-weight:600;letter-spacing:-.01em}
+    .sub{font-size:13px;opacity:.75;margin-top:4px}
+    .toolbar{display:flex;gap:12px;align-items:center;margin-top:14px;flex-wrap:wrap}
+    .toolbar input{background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.18);color:#fff;padding:8px 12px;border-radius:8px;font:inherit;min-width:240px;outline:none}
+    .toolbar input::placeholder{color:rgba(255,255,255,.5)}
+    .toolbar button{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.22);color:#fff;padding:8px 14px;border-radius:8px;font:inherit;cursor:pointer}
+    .toolbar button:hover{background:rgba(255,255,255,.22)}
+    .grid{
+      display:grid;
+      grid-template-columns:repeat(auto-fill,minmax(110px,1fr));
+      gap:8px;
+      padding:18px;
+    }
+    .chip{
+      aspect-ratio:1.4/1;
+      border-radius:10px;
+      cursor:pointer;
+      border:2px solid rgba(255,255,255,.22);
+      transition:transform .12s, border-color .12s, box-shadow .15s;
+      position:relative;
+      overflow:hidden;
+      box-shadow:0 1px 4px rgba(0,0,0,.4);
+    }
+    .chip:hover{transform:translateY(-2px);border-color:rgba(255,255,255,.6);box-shadow:0 6px 18px rgba(0,0,0,.5)}
+    .chip.active{border-color:#fff;box-shadow:0 0 0 3px rgba(255,255,255,.55), 0 6px 18px rgba(0,0,0,.6)}
+    .chip .label{
+      position:absolute;left:0;right:0;bottom:0;padding:6px 8px;
+      background:linear-gradient(transparent, rgba(0,0,0,.78));
+      font-size:11px;font-weight:600;letter-spacing:.01em;
+      text-shadow:0 1px 2px rgba(0,0,0,.7);text-transform:capitalize;
+    }
+    .status{position:fixed;left:18px;bottom:18px;padding:10px 14px;border-radius:10px;background:rgba(0,0,0,.7);backdrop-filter:blur(6px);font-size:13px;font-weight:600;letter-spacing:.01em;border:1px solid rgba(255,255,255,.18);min-width:180px}
+    .status .name{font-size:15px;text-transform:capitalize;margin-bottom:2px}
+    .status .meta{font-size:11px;opacity:.65;font-weight:400}
+    .reset{position:fixed;right:18px;bottom:18px;padding:10px 16px;border-radius:10px;background:rgba(0,0,0,.7);backdrop-filter:blur(6px);font-size:13px;font-weight:600;border:1px solid rgba(255,255,255,.18);cursor:pointer;color:#fff}
+    .reset:hover{background:rgba(0,0,0,.85)}
+  </style>
+</head>
+<body>
+  <header>
+    <h1>Novasuede™ — Drapery Color Library</h1>
+    <div class="sub">Click any color to set the full-bleed drapery as the page background. Reinhard color transfer applied to a single ruby drapery base across <span id="cnt">117</span> Novasuede colors.</div>
+    <div class="toolbar">
+      <input id="filter" type="search" placeholder="Filter colors…">
+      <button id="random">Random</button>
+    </div>
+  </header>
+
+  <div class="grid" id="grid"></div>
+
+  <div class="status" id="status" style="display:none">
+    <div class="name" id="status-name">—</div>
+    <div class="meta" id="status-meta"></div>
+  </div>
+
+  <button class="reset" onclick="reset()">Reset</button>
+
+  <script>
+    let manifest = [];
+    const grid = document.getElementById('grid');
+    const status = document.getElementById('status');
+    const statusName = document.getElementById('status-name');
+    const statusMeta = document.getElementById('status-meta');
+
+    fetch('manifest.json').then(r => r.json()).then(m => {
+      manifest = m;
+      document.getElementById('cnt').textContent = m.length;
+      render(m);
+    });
+
+    function render(items){
+      grid.innerHTML = '';
+      items.forEach(it => {
+        const chip = document.createElement('div');
+        chip.className = 'chip';
+        chip.style.background = it.hex;
+        chip.dataset.slug = it.slug;
+        chip.dataset.hex = it.hex;
+        chip.dataset.drapery = it.drapery;
+        chip.title = it.slug + ' · ' + it.hex;
+        const label = document.createElement('div');
+        label.className = 'label';
+        label.textContent = it.slug.replace(/-/g, ' ');
+        chip.appendChild(label);
+        chip.addEventListener('click', () => activate(chip));
+        grid.appendChild(chip);
+      });
+    }
+
+    function activate(chip){
+      document.querySelectorAll('.chip.active').forEach(c => c.classList.remove('active'));
+      chip.classList.add('active');
+      const url = chip.dataset.drapery;
+      document.body.classList.add('has-bg');
+      document.body.style.backgroundImage = 'url("' + url + '")';
+      statusName.textContent = chip.dataset.slug.replace(/-/g, ' ');
+      statusMeta.textContent = chip.dataset.hex + ' · ' + url;
+      status.style.display = 'block';
+    }
+
+    function reset(){
+      document.querySelectorAll('.chip.active').forEach(c => c.classList.remove('active'));
+      document.body.classList.remove('has-bg');
+      document.body.style.backgroundImage = '';
+      status.style.display = 'none';
+    }
+
+    document.getElementById('filter').addEventListener('input', e => {
+      const q = e.target.value.trim().toLowerCase();
+      const filtered = !q ? manifest : manifest.filter(m => m.slug.includes(q));
+      render(filtered);
+    });
+
+    document.getElementById('random').addEventListener('click', () => {
+      const chips = document.querySelectorAll('.chip');
+      if (chips.length) activate(chips[Math.floor(Math.random()*chips.length)]);
+    });
+  </script>
+</body>
+</html>
diff --git a/draperies/ivory.jpg b/draperies/ivory.jpg
new file mode 100644
index 0000000..6ff12fc
Binary files /dev/null and b/draperies/ivory.jpg differ
diff --git a/draperies/java.jpg b/draperies/java.jpg
new file mode 100644
index 0000000..68b5a49
Binary files /dev/null and b/draperies/java.jpg differ
diff --git a/draperies/lavender.jpg b/draperies/lavender.jpg
new file mode 100644
index 0000000..e09b5d1
Binary files /dev/null and b/draperies/lavender.jpg differ
diff --git a/draperies/light-amethyst.jpg b/draperies/light-amethyst.jpg
new file mode 100644
index 0000000..48b6187
Binary files /dev/null and b/draperies/light-amethyst.jpg differ
diff --git a/draperies/light-grey.jpg b/draperies/light-grey.jpg
new file mode 100644
index 0000000..53e579b
Binary files /dev/null and b/draperies/light-grey.jpg differ
diff --git a/draperies/linen.jpg b/draperies/linen.jpg
new file mode 100644
index 0000000..3e6824c
Binary files /dev/null and b/draperies/linen.jpg differ
diff --git a/draperies/madison-grey.jpg b/draperies/madison-grey.jpg
new file mode 100644
index 0000000..eadd6ee
Binary files /dev/null and b/draperies/madison-grey.jpg differ
diff --git a/draperies/maize.jpg b/draperies/maize.jpg
new file mode 100644
index 0000000..d95d0cb
Binary files /dev/null and b/draperies/maize.jpg differ
diff --git a/draperies/manifest.json b/draperies/manifest.json
new file mode 100644
index 0000000..981629f
--- /dev/null
+++ b/draperies/manifest.json
@@ -0,0 +1,587 @@
+[
+  {
+    "slug": "acorn",
+    "hex": "#73350c",
+    "drapery": "acorn.jpg"
+  },
+  {
+    "slug": "adobe",
+    "hex": "#f2dcc4",
+    "drapery": "adobe.jpg"
+  },
+  {
+    "slug": "african-violet",
+    "hex": "#302142",
+    "drapery": "african-violet.jpg"
+  },
+  {
+    "slug": "apricot",
+    "hex": "#d65d30",
+    "drapery": "apricot.jpg"
+  },
+  {
+    "slug": "arrow-wood",
+    "hex": "#6d5b45",
+    "drapery": "arrow-wood.jpg"
+  },
+  {
+    "slug": "aubergine",
+    "hex": "#341729",
+    "drapery": "aubergine.jpg"
+  },
+  {
+    "slug": "baltic",
+    "hex": "#b6bab9",
+    "drapery": "baltic.jpg"
+  },
+  {
+    "slug": "beige",
+    "hex": "#dac4af",
+    "drapery": "beige.jpg"
+  },
+  {
+    "slug": "biscuit",
+    "hex": "#d9c7b3",
+    "drapery": "biscuit.jpg"
+  },
+  {
+    "slug": "bluestone",
+    "hex": "#817782",
+    "drapery": "bluestone.jpg"
+  },
+  {
+    "slug": "blush-pink",
+    "hex": "#b94e44",
+    "drapery": "blush-pink.jpg"
+  },
+  {
+    "slug": "bone",
+    "hex": "#bdb084",
+    "drapery": "bone.jpg"
+  },
+  {
+    "slug": "buff",
+    "hex": "#ead2ba",
+    "drapery": "buff.jpg"
+  },
+  {
+    "slug": "buttercup",
+    "hex": "#e4aa7a",
+    "drapery": "buttercup.jpg"
+  },
+  {
+    "slug": "cane",
+    "hex": "#c37e3d",
+    "drapery": "cane.jpg"
+  },
+  {
+    "slug": "carbon",
+    "hex": "#0b0e0d",
+    "drapery": "carbon.jpg"
+  },
+  {
+    "slug": "cashew",
+    "hex": "#9a5126",
+    "drapery": "cashew.jpg"
+  },
+  {
+    "slug": "cashmere",
+    "hex": "#65591f",
+    "drapery": "cashmere.jpg"
+  },
+  {
+    "slug": "celadon",
+    "hex": "#a29177",
+    "drapery": "celadon.jpg"
+  },
+  {
+    "slug": "celery",
+    "hex": "#8f8d54",
+    "drapery": "celery.jpg"
+  },
+  {
+    "slug": "champagne",
+    "hex": "#f2ddcc",
+    "drapery": "champagne.jpg"
+  },
+  {
+    "slug": "china-blue",
+    "hex": "#045982",
+    "drapery": "china-blue.jpg"
+  },
+  {
+    "slug": "chrome-grey",
+    "hex": "#384349",
+    "drapery": "chrome-grey.jpg"
+  },
+  {
+    "slug": "cinder",
+    "hex": "#110b0d",
+    "drapery": "cinder.jpg"
+  },
+  {
+    "slug": "cloud",
+    "hex": "#c7c7bf",
+    "drapery": "cloud.jpg"
+  },
+  {
+    "slug": "cocoa",
+    "hex": "#6e4d2c",
+    "drapery": "cocoa.jpg"
+  },
+  {
+    "slug": "coral",
+    "hex": "#e39274",
+    "drapery": "coral.jpg"
+  },
+  {
+    "slug": "cottage-grey",
+    "hex": "#a29f8c",
+    "drapery": "cottage-grey.jpg"
+  },
+  {
+    "slug": "cream",
+    "hex": "#d8c2ab",
+    "drapery": "cream.jpg"
+  },
+  {
+    "slug": "dark-sand",
+    "hex": "#af833c",
+    "drapery": "dark-sand.jpg"
+  },
+  {
+    "slug": "dew",
+    "hex": "#d9ad88",
+    "drapery": "dew.jpg"
+  },
+  {
+    "slug": "dove",
+    "hex": "#c2c4bf",
+    "drapery": "dove.jpg"
+  },
+  {
+    "slug": "dune",
+    "hex": "#e7cfb7",
+    "drapery": "dune.jpg"
+  },
+  {
+    "slug": "dusty-rose",
+    "hex": "#ca9293",
+    "drapery": "dusty-rose.jpg"
+  },
+  {
+    "slug": "ecru",
+    "hex": "#e7d6bc",
+    "drapery": "ecru.jpg"
+  },
+  {
+    "slug": "fawn",
+    "hex": "#d1bba6",
+    "drapery": "fawn.jpg"
+  },
+  {
+    "slug": "french-blue",
+    "hex": "#81a3be",
+    "drapery": "french-blue.jpg"
+  },
+  {
+    "slug": "gainsborough",
+    "hex": "#d3c4bd",
+    "drapery": "gainsborough.jpg"
+  },
+  {
+    "slug": "garnet",
+    "hex": "#b32726",
+    "drapery": "garnet.jpg"
+  },
+  {
+    "slug": "gelato",
+    "hex": "#e4d3cb",
+    "drapery": "gelato.jpg"
+  },
+  {
+    "slug": "goldstone",
+    "hex": "#c96600",
+    "drapery": "goldstone.jpg"
+  },
+  {
+    "slug": "granite",
+    "hex": "#b6a881",
+    "drapery": "granite.jpg"
+  },
+  {
+    "slug": "grape",
+    "hex": "#412a3a",
+    "drapery": "grape.jpg"
+  },
+  {
+    "slug": "green-marble",
+    "hex": "#668681",
+    "drapery": "green-marble.jpg"
+  },
+  {
+    "slug": "greystone",
+    "hex": "#414045",
+    "drapery": "greystone.jpg"
+  },
+  {
+    "slug": "harvest",
+    "hex": "#b79f73",
+    "drapery": "harvest.jpg"
+  },
+  {
+    "slug": "honey",
+    "hex": "#e4af7d",
+    "drapery": "honey.jpg"
+  },
+  {
+    "slug": "hyacinth",
+    "hex": "#8e7281",
+    "drapery": "hyacinth.jpg"
+  },
+  {
+    "slug": "iceberg",
+    "hex": "#b3a888",
+    "drapery": "iceberg.jpg"
+  },
+  {
+    "slug": "ivory",
+    "hex": "#eaddd4",
+    "drapery": "ivory.jpg"
+  },
+  {
+    "slug": "java",
+    "hex": "#6e4d2c",
+    "drapery": "java.jpg"
+  },
+  {
+    "slug": "lavender",
+    "hex": "#8a5b7b",
+    "drapery": "lavender.jpg"
+  },
+  {
+    "slug": "light-amethyst",
+    "hex": "#bfbbcc",
+    "drapery": "light-amethyst.jpg"
+  },
+  {
+    "slug": "light-grey",
+    "hex": "#aea89a",
+    "drapery": "light-grey.jpg"
+  },
+  {
+    "slug": "linen",
+    "hex": "#ddd2cc",
+    "drapery": "linen.jpg"
+  },
+  {
+    "slug": "madison-grey",
+    "hex": "#524a47",
+    "drapery": "madison-grey.jpg"
+  },
+  {
+    "slug": "maize",
+    "hex": "#e4c292",
+    "drapery": "maize.jpg"
+  },
+  {
+    "slug": "maroon",
+    "hex": "#6d2123",
+    "drapery": "maroon.jpg"
+  },
+  {
+    "slug": "meadow",
+    "hex": "#949341",
+    "drapery": "meadow.jpg"
+  },
+  {
+    "slug": "melon",
+    "hex": "#ec8042",
+    "drapery": "melon.jpg"
+  },
+  {
+    "slug": "milk",
+    "hex": "#eddfd2",
+    "drapery": "milk.jpg"
+  },
+  {
+    "slug": "mint-julip",
+    "hex": "#98af9b",
+    "drapery": "mint-julip.jpg"
+  },
+  {
+    "slug": "misty-dew",
+    "hex": "#cdc7ad",
+    "drapery": "misty-dew.jpg"
+  },
+  {
+    "slug": "mocha",
+    "hex": "#6e4d2c",
+    "drapery": "mocha.jpg"
+  },
+  {
+    "slug": "moss",
+    "hex": "#524636",
+    "drapery": "moss.jpg"
+  },
+  {
+    "slug": "mushroom",
+    "hex": "#91603f",
+    "drapery": "mushroom.jpg"
+  },
+  {
+    "slug": "nutmeg",
+    "hex": "#846f44",
+    "drapery": "nutmeg.jpg"
+  },
+  {
+    "slug": "ocean",
+    "hex": "#466659",
+    "drapery": "ocean.jpg"
+  },
+  {
+    "slug": "olive",
+    "hex": "#312c18",
+    "drapery": "olive.jpg"
+  },
+  {
+    "slug": "oyster",
+    "hex": "#b3a582",
+    "drapery": "oyster.jpg"
+  },
+  {
+    "slug": "pale-green",
+    "hex": "#b0c9c3",
+    "drapery": "pale-green.jpg"
+  },
+  {
+    "slug": "passion-blue",
+    "hex": "#0053bd",
+    "drapery": "passion-blue.jpg"
+  },
+  {
+    "slug": "peach",
+    "hex": "#e1b7a7",
+    "drapery": "peach.jpg"
+  },
+  {
+    "slug": "pebble",
+    "hex": "#e3c9b8",
+    "drapery": "pebble.jpg"
+  },
+  {
+    "slug": "peppermint",
+    "hex": "#d3b8af",
+    "drapery": "peppermint.jpg"
+  },
+  {
+    "slug": "peridot",
+    "hex": "#31270c",
+    "drapery": "peridot.jpg"
+  },
+  {
+    "slug": "periwinkle",
+    "hex": "#8c97b5",
+    "drapery": "periwinkle.jpg"
+  },
+  {
+    "slug": "plum-pleasure",
+    "hex": "#470c22",
+    "drapery": "plum-pleasure.jpg"
+  },
+  {
+    "slug": "porcelain",
+    "hex": "#e7d3c5",
+    "drapery": "porcelain.jpg"
+  },
+  {
+    "slug": "powder-grey",
+    "hex": "#c0b7b2",
+    "drapery": "powder-grey.jpg"
+  },
+  {
+    "slug": "prairie",
+    "hex": "#9a875f",
+    "drapery": "prairie.jpg"
+  },
+  {
+    "slug": "putty",
+    "hex": "#c49b6d",
+    "drapery": "putty.jpg"
+  },
+  {
+    "slug": "raffia",
+    "hex": "#b09063",
+    "drapery": "raffia.jpg"
+  },
+  {
+    "slug": "royal-purple",
+    "hex": "#180f20",
+    "drapery": "royal-purple.jpg"
+  },
+  {
+    "slug": "ruby",
+    "hex": "#83271c",
+    "drapery": "ruby.jpg"
+  },
+  {
+    "slug": "sable",
+    "hex": "#190507",
+    "drapery": "sable.jpg"
+  },
+  {
+    "slug": "safari",
+    "hex": "#d1ac89",
+    "drapery": "safari.jpg"
+  },
+  {
+    "slug": "saffron",
+    "hex": "#f4bf79",
+    "drapery": "saffron.jpg"
+  },
+  {
+    "slug": "sage",
+    "hex": "#939087",
+    "drapery": "sage.jpg"
+  },
+  {
+    "slug": "salt",
+    "hex": "#cfcbc2",
+    "drapery": "salt.jpg"
+  },
+  {
+    "slug": "sand",
+    "hex": "#c8c8c0",
+    "drapery": "sand.jpg"
+  },
+  {
+    "slug": "sandalwood",
+    "hex": "#d69873",
+    "drapery": "sandalwood.jpg"
+  },
+  {
+    "slug": "scarlet-wine",
+    "hex": "#3f0615",
+    "drapery": "scarlet-wine.jpg"
+  },
+  {
+    "slug": "sea-blue",
+    "hex": "#505f80",
+    "drapery": "sea-blue.jpg"
+  },
+  {
+    "slug": "sea-breeze",
+    "hex": "#9db2a3",
+    "drapery": "sea-breeze.jpg"
+  },
+  {
+    "slug": "sea-grass",
+    "hex": "#7b7e4f",
+    "drapery": "sea-grass.jpg"
+  },
+  {
+    "slug": "seafoam",
+    "hex": "#6b5d42",
+    "drapery": "seafoam.jpg"
+  },
+  {
+    "slug": "sienna",
+    "hex": "#916536",
+    "drapery": "sienna.jpg"
+  },
+  {
+    "slug": "silver",
+    "hex": "#7d7457",
+    "drapery": "silver.jpg"
+  },
+  {
+    "slug": "sky-blue",
+    "hex": "#85adc6",
+    "drapery": "sky-blue.jpg"
+  },
+  {
+    "slug": "smoke",
+    "hex": "#42352d",
+    "drapery": "smoke.jpg"
+  },
+  {
+    "slug": "soft-clay",
+    "hex": "#c6745c",
+    "drapery": "soft-clay.jpg"
+  },
+  {
+    "slug": "solar-yellow",
+    "hex": "#fbbb59",
+    "drapery": "solar-yellow.jpg"
+  },
+  {
+    "slug": "steel",
+    "hex": "#7d7457",
+    "drapery": "steel.jpg"
+  },
+  {
+    "slug": "stone-grey",
+    "hex": "#7a6258",
+    "drapery": "stone-grey.jpg"
+  },
+  {
+    "slug": "stone-taupe",
+    "hex": "#b1886c",
+    "drapery": "stone-taupe.jpg"
+  },
+  {
+    "slug": "straw",
+    "hex": "#e2aa75",
+    "drapery": "straw.jpg"
+  },
+  {
+    "slug": "strong-white",
+    "hex": "#e3ded8",
+    "drapery": "strong-white.jpg"
+  },
+  {
+    "slug": "sugar-plum",
+    "hex": "#c6799b",
+    "drapery": "sugar-plum.jpg"
+  },
+  {
+    "slug": "sweet-lilac",
+    "hex": "#947c9e",
+    "drapery": "sweet-lilac.jpg"
+  },
+  {
+    "slug": "tan",
+    "hex": "#d1a580",
+    "drapery": "tan.jpg"
+  },
+  {
+    "slug": "tarragon",
+    "hex": "#6a6d26",
+    "drapery": "tarragon.jpg"
+  },
+  {
+    "slug": "taupe",
+    "hex": "#ecdbc9",
+    "drapery": "taupe.jpg"
+  },
+  {
+    "slug": "thyme",
+    "hex": "#393d24",
+    "drapery": "thyme.jpg"
+  },
+  {
+    "slug": "trench",
+    "hex": "#6c5e51",
+    "drapery": "trench.jpg"
+  },
+  {
+    "slug": "vanilla",
+    "hex": "#dbc9b1",
+    "drapery": "vanilla.jpg"
+  },
+  {
+    "slug": "white",
+    "hex": "#e2ddd7",
+    "drapery": "white.jpg"
+  }
+]
\ No newline at end of file
diff --git a/draperies/maroon.jpg b/draperies/maroon.jpg
new file mode 100644
index 0000000..96f2a84
Binary files /dev/null and b/draperies/maroon.jpg differ
diff --git a/draperies/meadow.jpg b/draperies/meadow.jpg
new file mode 100644
index 0000000..f8cf05b
Binary files /dev/null and b/draperies/meadow.jpg differ
diff --git a/draperies/melon.jpg b/draperies/melon.jpg
new file mode 100644
index 0000000..c1679f6
Binary files /dev/null and b/draperies/melon.jpg differ
diff --git a/draperies/milk.jpg b/draperies/milk.jpg
new file mode 100644
index 0000000..d8443f1
Binary files /dev/null and b/draperies/milk.jpg differ
diff --git a/draperies/mint-julip.jpg b/draperies/mint-julip.jpg
new file mode 100644
index 0000000..6c01557
Binary files /dev/null and b/draperies/mint-julip.jpg differ
diff --git a/draperies/misty-dew.jpg b/draperies/misty-dew.jpg
new file mode 100644
index 0000000..c512fe1
Binary files /dev/null and b/draperies/misty-dew.jpg differ
diff --git a/draperies/mocha.jpg b/draperies/mocha.jpg
new file mode 100644
index 0000000..68b5a49
Binary files /dev/null and b/draperies/mocha.jpg differ
diff --git a/draperies/moss.jpg b/draperies/moss.jpg
new file mode 100644
index 0000000..3c96f1a
Binary files /dev/null and b/draperies/moss.jpg differ
diff --git a/draperies/mushroom.jpg b/draperies/mushroom.jpg
new file mode 100644
index 0000000..a1431cc
Binary files /dev/null and b/draperies/mushroom.jpg differ
diff --git a/draperies/nutmeg.jpg b/draperies/nutmeg.jpg
new file mode 100644
index 0000000..ee51c48
Binary files /dev/null and b/draperies/nutmeg.jpg differ
diff --git a/draperies/ocean.jpg b/draperies/ocean.jpg
new file mode 100644
index 0000000..3c72ba4
Binary files /dev/null and b/draperies/ocean.jpg differ
diff --git a/draperies/olive.jpg b/draperies/olive.jpg
new file mode 100644
index 0000000..062e7a6
Binary files /dev/null and b/draperies/olive.jpg differ
diff --git a/draperies/oyster.jpg b/draperies/oyster.jpg
new file mode 100644
index 0000000..c8101b0
Binary files /dev/null and b/draperies/oyster.jpg differ
diff --git a/draperies/pale-green.jpg b/draperies/pale-green.jpg
new file mode 100644
index 0000000..9323faf
Binary files /dev/null and b/draperies/pale-green.jpg differ
diff --git a/draperies/passion-blue.jpg b/draperies/passion-blue.jpg
new file mode 100644
index 0000000..001a1df
Binary files /dev/null and b/draperies/passion-blue.jpg differ
diff --git a/draperies/peach.jpg b/draperies/peach.jpg
new file mode 100644
index 0000000..32b5d2a
Binary files /dev/null and b/draperies/peach.jpg differ
diff --git a/draperies/pebble.jpg b/draperies/pebble.jpg
new file mode 100644
index 0000000..0adac70
Binary files /dev/null and b/draperies/pebble.jpg differ
diff --git a/draperies/peppermint.jpg b/draperies/peppermint.jpg
new file mode 100644
index 0000000..1c695bf
Binary files /dev/null and b/draperies/peppermint.jpg differ
diff --git a/draperies/peridot.jpg b/draperies/peridot.jpg
new file mode 100644
index 0000000..e4cbbdf
Binary files /dev/null and b/draperies/peridot.jpg differ
diff --git a/draperies/periwinkle.jpg b/draperies/periwinkle.jpg
new file mode 100644
index 0000000..4e6da60
Binary files /dev/null and b/draperies/periwinkle.jpg differ
diff --git a/draperies/plum-pleasure.jpg b/draperies/plum-pleasure.jpg
new file mode 100644
index 0000000..2bd2700
Binary files /dev/null and b/draperies/plum-pleasure.jpg differ
diff --git a/draperies/porcelain.jpg b/draperies/porcelain.jpg
new file mode 100644
index 0000000..a4f2cad
Binary files /dev/null and b/draperies/porcelain.jpg differ
diff --git a/draperies/powder-grey.jpg b/draperies/powder-grey.jpg
new file mode 100644
index 0000000..4f422c5
Binary files /dev/null and b/draperies/powder-grey.jpg differ
diff --git a/draperies/prairie.jpg b/draperies/prairie.jpg
new file mode 100644
index 0000000..0324ac2
Binary files /dev/null and b/draperies/prairie.jpg differ
diff --git a/draperies/putty.jpg b/draperies/putty.jpg
new file mode 100644
index 0000000..61c87b2
Binary files /dev/null and b/draperies/putty.jpg differ
diff --git a/draperies/raffia.jpg b/draperies/raffia.jpg
new file mode 100644
index 0000000..8547494
Binary files /dev/null and b/draperies/raffia.jpg differ
diff --git a/draperies/royal-purple.jpg b/draperies/royal-purple.jpg
new file mode 100644
index 0000000..ce93583
Binary files /dev/null and b/draperies/royal-purple.jpg differ
diff --git a/draperies/ruby.jpg b/draperies/ruby.jpg
new file mode 100644
index 0000000..0d42cf0
Binary files /dev/null and b/draperies/ruby.jpg differ
diff --git a/draperies/sable.jpg b/draperies/sable.jpg
new file mode 100644
index 0000000..075b63f
Binary files /dev/null and b/draperies/sable.jpg differ
diff --git a/draperies/safari.jpg b/draperies/safari.jpg
new file mode 100644
index 0000000..bb545b1
Binary files /dev/null and b/draperies/safari.jpg differ
diff --git a/draperies/saffron.jpg b/draperies/saffron.jpg
new file mode 100644
index 0000000..082e8b7
Binary files /dev/null and b/draperies/saffron.jpg differ
diff --git a/draperies/sage.jpg b/draperies/sage.jpg
new file mode 100644
index 0000000..86fbeba
Binary files /dev/null and b/draperies/sage.jpg differ
diff --git a/draperies/salt.jpg b/draperies/salt.jpg
new file mode 100644
index 0000000..4ff345f
Binary files /dev/null and b/draperies/salt.jpg differ
diff --git a/draperies/sand.jpg b/draperies/sand.jpg
new file mode 100644
index 0000000..21b6f64
Binary files /dev/null and b/draperies/sand.jpg differ
diff --git a/draperies/sandalwood.jpg b/draperies/sandalwood.jpg
new file mode 100644
index 0000000..b07b170
Binary files /dev/null and b/draperies/sandalwood.jpg differ
diff --git a/draperies/scarlet-wine.jpg b/draperies/scarlet-wine.jpg
new file mode 100644
index 0000000..904503c
Binary files /dev/null and b/draperies/scarlet-wine.jpg differ
diff --git a/draperies/sea-blue.jpg b/draperies/sea-blue.jpg
new file mode 100644
index 0000000..2cb7458
Binary files /dev/null and b/draperies/sea-blue.jpg differ
diff --git a/draperies/sea-breeze.jpg b/draperies/sea-breeze.jpg
new file mode 100644
index 0000000..37e079e
Binary files /dev/null and b/draperies/sea-breeze.jpg differ
diff --git a/draperies/sea-grass.jpg b/draperies/sea-grass.jpg
new file mode 100644
index 0000000..dc8cc22
Binary files /dev/null and b/draperies/sea-grass.jpg differ
diff --git a/draperies/seafoam.jpg b/draperies/seafoam.jpg
new file mode 100644
index 0000000..d3e5bf5
Binary files /dev/null and b/draperies/seafoam.jpg differ
diff --git a/draperies/sienna.jpg b/draperies/sienna.jpg
new file mode 100644
index 0000000..ba5e775
Binary files /dev/null and b/draperies/sienna.jpg differ
diff --git a/draperies/silver.jpg b/draperies/silver.jpg
new file mode 100644
index 0000000..a978abc
Binary files /dev/null and b/draperies/silver.jpg differ
diff --git a/draperies/sky-blue.jpg b/draperies/sky-blue.jpg
new file mode 100644
index 0000000..9c1c2da
Binary files /dev/null and b/draperies/sky-blue.jpg differ
diff --git a/draperies/smoke.jpg b/draperies/smoke.jpg
new file mode 100644
index 0000000..8014812
Binary files /dev/null and b/draperies/smoke.jpg differ
diff --git a/draperies/soft-clay.jpg b/draperies/soft-clay.jpg
new file mode 100644
index 0000000..e096b69
Binary files /dev/null and b/draperies/soft-clay.jpg differ
diff --git a/draperies/solar-yellow.jpg b/draperies/solar-yellow.jpg
new file mode 100644
index 0000000..cf885dc
Binary files /dev/null and b/draperies/solar-yellow.jpg differ
diff --git a/draperies/steel.jpg b/draperies/steel.jpg
new file mode 100644
index 0000000..a978abc
Binary files /dev/null and b/draperies/steel.jpg differ
diff --git a/draperies/stone-grey.jpg b/draperies/stone-grey.jpg
new file mode 100644
index 0000000..dbb1905
Binary files /dev/null and b/draperies/stone-grey.jpg differ
diff --git a/draperies/stone-taupe.jpg b/draperies/stone-taupe.jpg
new file mode 100644
index 0000000..137f5b8
Binary files /dev/null and b/draperies/stone-taupe.jpg differ
diff --git a/draperies/straw.jpg b/draperies/straw.jpg
new file mode 100644
index 0000000..8ba8438
Binary files /dev/null and b/draperies/straw.jpg differ
diff --git a/draperies/strong-white.jpg b/draperies/strong-white.jpg
new file mode 100644
index 0000000..96b06ec
Binary files /dev/null and b/draperies/strong-white.jpg differ
diff --git a/draperies/sugar-plum.jpg b/draperies/sugar-plum.jpg
new file mode 100644
index 0000000..2ab6afa
Binary files /dev/null and b/draperies/sugar-plum.jpg differ
diff --git a/draperies/sweet-lilac.jpg b/draperies/sweet-lilac.jpg
new file mode 100644
index 0000000..d2e521c
Binary files /dev/null and b/draperies/sweet-lilac.jpg differ
diff --git a/draperies/tan.jpg b/draperies/tan.jpg
new file mode 100644
index 0000000..b9678a8
Binary files /dev/null and b/draperies/tan.jpg differ
diff --git a/draperies/tarragon.jpg b/draperies/tarragon.jpg
new file mode 100644
index 0000000..c642909
Binary files /dev/null and b/draperies/tarragon.jpg differ
diff --git a/draperies/taupe.jpg b/draperies/taupe.jpg
new file mode 100644
index 0000000..f87c94c
Binary files /dev/null and b/draperies/taupe.jpg differ
diff --git a/draperies/thyme.jpg b/draperies/thyme.jpg
new file mode 100644
index 0000000..7198b04
Binary files /dev/null and b/draperies/thyme.jpg differ
diff --git a/draperies/trench.jpg b/draperies/trench.jpg
new file mode 100644
index 0000000..4522fb1
Binary files /dev/null and b/draperies/trench.jpg differ
diff --git a/draperies/vanilla.jpg b/draperies/vanilla.jpg
new file mode 100644
index 0000000..b366173
Binary files /dev/null and b/draperies/vanilla.jpg differ
diff --git a/draperies/white.jpg b/draperies/white.jpg
new file mode 100644
index 0000000..3738fac
Binary files /dev/null and b/draperies/white.jpg differ
diff --git a/novasuede-ruby.jpg b/novasuede-ruby.jpg
new file mode 100644
index 0000000..d4af1f9
Binary files /dev/null and b/novasuede-ruby.jpg differ
diff --git a/sku_image_map.json b/sku_image_map.json
new file mode 100644
index 0000000..60ff46b
--- /dev/null
+++ b/sku_image_map.json
@@ -0,0 +1,40 @@
+{
+  "DWCC-112000": null,
+  "DWCC-109200": "novasuede-pistachio.jpg",
+  "DWCC-110800": "novasuede-rosewater.jpg",
+  "DWCC-112030": "novasuede-bliss.jpg",
+  "DWCC-112040": "novasuede-blank-slate.jpg",
+  "DWCC-112050": "novasuede-amber.jpg",
+  "DWCC-112060": "novasuede-blush-rose.jpg",
+  "DWCC-112070": "novasuede-cement.jpg",
+  "DWCC-112080": "novasuede-colonial-blue.jpg",
+  "DWCC-112090": "novasuede-dusty-ranch.jpg",
+  "DWCC-112100": "novasuede-dusty-teal.jpg",
+  "DWCC-112110": "novasuede-fire-red.jpg",
+  "DWCC-112120": "novasuede-flagstone.jpg",
+  "DWCC-112130": "novasuede-henna.jpg",
+  "DWCC-112140": "novasuede-kiva.jpg",
+  "DWCC-112150": "novasuede-lipstick-red.jpg",
+  "DWCC-112160": "novasuede-noir-black.jpg",
+  "DWCC-112170": "novasuede-opal.jpg",
+  "DWCC-112180": "novasuede-pastel-blue.jpg",
+  "DWCC-112190": "novasuede-pastel-pink.jpg",
+  "DWCC-112200": "novasuede-persimmon.jpg",
+  "DWCC-112210": "novasuede-port-blue.jpg",
+  "DWCC-112220": "novasuede-pink-lace.jpg",
+  "DWCC-112230": "novasuede-royal-blue.jpg",
+  "DWCC-112240": "novasuede-raisin.jpg",
+  "DWCC-112270": "novasuede-sedona.jpg",
+  "DWCC-112280": "novasuede-shale.jpg",
+  "DWCC-112290": "novasuede-spruce.jpg",
+  "DWCC-112310": "novasuede-terracotta.jpg",
+  "DWCC-112320": "novasuede-thistle.jpg",
+  "DWCC-112330": "novasuede-tusk.jpg",
+  "DWCC-112340": "novasuede-umber.jpg",
+  "DWCC-112350": "novasuede-verdigris.jpg",
+  "DWCC-112360": "novasuede-vermillion-red.jpg",
+  "DWCC-112370": "novasuede-wheat.jpg",
+  "DWCC-112380": "novasuede-winter-white.jpg",
+  "DWCC-112390": "novasuede-woodland.jpg",
+  "DWCC-112400": "novasuede-snow.jpg"
+}

(oldest)  ·  back to Nova Recolor  ·  chore: macstudio3 migration — reconcile from mac2 + repoint 7e22c66 →