← back to Glitterwalls
sort modal works + 142/143 SKUs have real-pixel hex via sips
8a2f994d817e30dc3ccb5bb153be05e45392f5d6 · 2026-05-08 09:13:43 -0700 · Steve Abrams
Files touched
M data/products.jsonM package-lock.jsonM package.jsonM public/index.htmlA scripts/enrich-hex.mjsM server.js
Diff
commit 8a2f994d817e30dc3ccb5bb153be05e45392f5d6
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri May 8 09:13:43 2026 -0700
sort modal works + 142/143 SKUs have real-pixel hex via sips
---
data/products.json | 426 ++++++++++++++++++++++++-------------
package-lock.json | 557 +++++++++++++++++++++++++++++++++++++++++++++++++
package.json | 2 +
public/index.html | 4 +-
scripts/enrich-hex.mjs | 122 +++++++++++
server.js | 11 +-
6 files changed, 976 insertions(+), 146 deletions(-)
diff --git a/data/products.json b/data/products.json
index 5b4f10c..a74654d 100644
--- a/data/products.json
+++ b/data/products.json
@@ -47,7 +47,8 @@
],
"max_price": 289.59,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/versace-plain-glitter-gold-cream-wallcovering-versace"
+ "product_url": "https://designerwallcoverings.com/products/versace-plain-glitter-gold-cream-wallcovering-versace",
+ "dominant_hex_real": "#bfa67a"
},
{
"sku": "DWVS-650096-Sample",
@@ -93,7 +94,8 @@
],
"max_price": 289.59,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/versace-plain-glitter-pink-grey-purple-wallcovering-versace-1"
+ "product_url": "https://designerwallcoverings.com/products/versace-plain-glitter-pink-grey-purple-wallcovering-versace-1",
+ "dominant_hex_real": "#b4a294"
},
{
"sku": "DWVS-650093-Sample",
@@ -141,7 +143,8 @@
],
"max_price": 289.59,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/versace-plain-glitter-white-cream-wallcovering-versace"
+ "product_url": "https://designerwallcoverings.com/products/versace-plain-glitter-white-cream-wallcovering-versace",
+ "dominant_hex_real": "#d3cdc3"
},
{
"sku": "DWJS-90605-Sample",
@@ -177,7 +180,8 @@
],
"max_price": 72.49,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/amity-champagne-bleeding-heart-texture-wallpaper-cca-83285"
+ "product_url": "https://designerwallcoverings.com/products/amity-champagne-bleeding-heart-texture-wallpaper-cca-83285",
+ "dominant_hex_real": "#e0e3d6"
},
{
"sku": "DWJS-90601-Sample",
@@ -211,7 +215,8 @@
],
"max_price": 72.49,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/aubrey-brown-crystal-texture-wallpaper-cca-83281"
+ "product_url": "https://designerwallcoverings.com/products/aubrey-brown-crystal-texture-wallpaper-cca-83281",
+ "dominant_hex_real": "#aaa69e"
},
{
"sku": "DWJS-90600-Sample",
@@ -244,7 +249,8 @@
],
"max_price": 72.49,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/aubrey-butter-crystal-texture-wallpaper-cca-83280"
+ "product_url": "https://designerwallcoverings.com/products/aubrey-butter-crystal-texture-wallpaper-cca-83280",
+ "dominant_hex_real": "#eae8e4"
},
{
"sku": "DWJS-90598-Sample",
@@ -276,7 +282,8 @@
],
"max_price": 75.49,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/asha-sand-lotus-texture-wallpaper-cca-83278"
+ "product_url": "https://designerwallcoverings.com/products/asha-sand-lotus-texture-wallpaper-cca-83278",
+ "dominant_hex_real": "#d2bda0"
},
{
"sku": "DWJS-90597-Sample",
@@ -308,7 +315,8 @@
],
"max_price": 75.49,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/asha-aquamarine-lotus-texture-wallpaper-cca-83277"
+ "product_url": "https://designerwallcoverings.com/products/asha-aquamarine-lotus-texture-wallpaper-cca-83277",
+ "dominant_hex_real": "#a7b8b5"
},
{
"sku": "DWJS-90596-Sample",
@@ -340,7 +348,8 @@
],
"max_price": 75.49,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/asha-gold-lotus-texture-wallpaper-cca-83276"
+ "product_url": "https://designerwallcoverings.com/products/asha-gold-lotus-texture-wallpaper-cca-83276",
+ "dominant_hex_real": "#d0cab8"
},
{
"sku": "DWJS-90595-Sample",
@@ -372,7 +381,8 @@
],
"max_price": 75.49,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/asha-gilver-lotus-texture-wallpaper-cca-83275"
+ "product_url": "https://designerwallcoverings.com/products/asha-gilver-lotus-texture-wallpaper-cca-83275",
+ "dominant_hex_real": "#b6ae9b"
},
{
"sku": "DWHD-502551-Sample",
@@ -396,7 +406,8 @@
],
"max_price": 69.37,
"aesthetic": "gold",
- "product_url": "https://designerwallcoverings.com/products/back-bay-glitterati-hollywood-wallcoverings"
+ "product_url": "https://designerwallcoverings.com/products/back-bay-glitterati-hollywood-wallcoverings",
+ "dominant_hex_real": "#557a86"
},
{
"sku": "DWPX-500050-Sample",
@@ -430,7 +441,8 @@
],
"max_price": 94.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/notte-stellata-black-wallcovering-phillipe-romano"
+ "product_url": "https://designerwallcoverings.com/products/notte-stellata-black-wallcovering-phillipe-romano",
+ "dominant_hex_real": "#3c3d41"
},
{
"sku": "DWPX-500049-Sample",
@@ -464,7 +476,8 @@
],
"max_price": 94.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/perla-bianca-white-wallcovering-phillipe-romano"
+ "product_url": "https://designerwallcoverings.com/products/perla-bianca-white-wallcovering-phillipe-romano",
+ "dominant_hex_real": "#bebfba"
},
{
"sku": "DWJS-90562-Sample",
@@ -500,7 +513,8 @@
],
"max_price": 75.49,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/delilah-champagne-tulip-damask-wallpaper-cca-83242"
+ "product_url": "https://designerwallcoverings.com/products/delilah-champagne-tulip-damask-wallpaper-cca-83242",
+ "dominant_hex_real": "#b9b4af"
},
{
"sku": "DWJS-90556-Sample",
@@ -533,7 +547,8 @@
],
"max_price": 75.49,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/asha-sand-lotus-damask-wallpaper-cca-83236"
+ "product_url": "https://designerwallcoverings.com/products/asha-sand-lotus-damask-wallpaper-cca-83236",
+ "dominant_hex_real": "#cebca5"
},
{
"sku": "DWJS-90555-Sample",
@@ -567,7 +582,8 @@
],
"max_price": 75.49,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/asha-aquamarine-lotus-damask-wallpaper-cca-83235"
+ "product_url": "https://designerwallcoverings.com/products/asha-aquamarine-lotus-damask-wallpaper-cca-83235",
+ "dominant_hex_real": "#aabab7"
},
{
"sku": "DWSA-303601-25",
@@ -602,7 +618,8 @@
],
"max_price": 558.77,
"aesthetic": "all",
- "product_url": "https://designerwallcoverings.com/products/dwsa-303601-1"
+ "product_url": "https://designerwallcoverings.com/products/dwsa-303601-1",
+ "dominant_hex_real": "#a67d8b"
},
{
"sku": "GLS-34583-sample",
@@ -637,7 +654,8 @@
],
"max_price": 4.25,
"aesthetic": "all",
- "product_url": "https://designerwallcoverings.com/products/george-glass-bead-stripe-gls-34583"
+ "product_url": "https://designerwallcoverings.com/products/george-glass-bead-stripe-gls-34583",
+ "dominant_hex_real": "#6c686f"
},
{
"sku": "GLS-34582-sample",
@@ -670,7 +688,8 @@
],
"max_price": 4.25,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/george-glass-bead-stripe-gls-34582"
+ "product_url": "https://designerwallcoverings.com/products/george-glass-bead-stripe-gls-34582",
+ "dominant_hex_real": "#dcd0ce"
},
{
"sku": "GLS-34581-sample",
@@ -701,7 +720,8 @@
],
"max_price": 4.25,
"aesthetic": "silver",
- "product_url": "https://designerwallcoverings.com/products/george-glass-bead-stripe-gls-34581"
+ "product_url": "https://designerwallcoverings.com/products/george-glass-bead-stripe-gls-34581",
+ "dominant_hex_real": "#bfb6b8"
},
{
"sku": "GLS-34580-sample",
@@ -738,7 +758,8 @@
],
"max_price": 4.25,
"aesthetic": "all",
- "product_url": "https://designerwallcoverings.com/products/george-glass-bead-stripe-gls-34580"
+ "product_url": "https://designerwallcoverings.com/products/george-glass-bead-stripe-gls-34580",
+ "dominant_hex_real": "#928079"
},
{
"sku": "GLIT-106-Penny-sample",
@@ -768,7 +789,8 @@
],
"max_price": 204.94,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/dazzling-glitter-glass-beaded-wall-paper-penny-glit-106-penny"
+ "product_url": "https://designerwallcoverings.com/products/dazzling-glitter-glass-beaded-wall-paper-penny-glit-106-penny",
+ "dominant_hex_real": "#745951"
},
{
"sku": "GLI-100-Lotus Vanilla-sample",
@@ -800,7 +822,8 @@
],
"max_price": 204.94,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/dazzling-glitter-glass-beaded-wall-paper-lotus-vanilla-gli-100-lotus-vanilla"
+ "product_url": "https://designerwallcoverings.com/products/dazzling-glitter-glass-beaded-wall-paper-lotus-vanilla-gli-100-lotus-vanilla",
+ "dominant_hex_real": "#bdaa82"
},
{
"sku": "GLI-102 Glitter Glass-Bronze-sample",
@@ -829,7 +852,8 @@
],
"max_price": 204.94,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/dazzling-glitter-glass-beaded-wall-paper-bronze-gli-102-glitter-glass-bronze"
+ "product_url": "https://designerwallcoverings.com/products/dazzling-glitter-glass-beaded-wall-paper-bronze-gli-102-glitter-glass-bronze",
+ "dominant_hex_real": "#5d4239"
},
{
"sku": "EUR-70352-Sample",
@@ -870,7 +894,8 @@
],
"max_price": 4.25,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eur-70352-designer-wallcoverings-los-angeles"
+ "product_url": "https://designerwallcoverings.com/products/eur-70352-designer-wallcoverings-los-angeles",
+ "dominant_hex_real": "#807f80"
},
{
"sku": "GLM-4014-SAMPLE",
@@ -912,7 +937,8 @@
],
"max_price": 108.85,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/leopard-glitter-wallcovering-rainbow-blue"
+ "product_url": "https://designerwallcoverings.com/products/leopard-glitter-wallcovering-rainbow-blue",
+ "dominant_hex_real": "#6b655d"
},
{
"sku": "GLM-4156-SAMPLE",
@@ -952,7 +978,8 @@
],
"max_price": 99.98,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/fishnet-sequin-glitter-wallcovering-white-disco-pink"
+ "product_url": "https://designerwallcoverings.com/products/fishnet-sequin-glitter-wallcovering-white-disco-pink",
+ "dominant_hex_real": "#c9aba5"
},
{
"sku": "GLM-4042-SAMPLE",
@@ -992,7 +1019,8 @@
],
"max_price": 99.98,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/metallic-threads-glitter-wallcovering-white-gold-disco-blue"
+ "product_url": "https://designerwallcoverings.com/products/metallic-threads-glitter-wallcovering-white-gold-disco-blue",
+ "dominant_hex_real": "#5d5f56"
},
{
"sku": "GLM-4028-SAMPLE",
@@ -1036,7 +1064,8 @@
],
"max_price": 108.85,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/heart-glitter-wallcovering-multi-on-rainbow"
+ "product_url": "https://designerwallcoverings.com/products/heart-glitter-wallcovering-multi-on-rainbow",
+ "dominant_hex_real": "#d2c9c8"
},
{
"sku": "GLM-51348-sample",
@@ -1072,7 +1101,8 @@
],
"max_price": 4.25,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-glitter-glm-51348"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-glitter-glm-51348",
+ "dominant_hex_real": "#7d4e78"
},
{
"sku": "DWC-Arte-40343",
@@ -1099,7 +1129,8 @@
],
"max_price": 4.25,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/bandeau-mica-contemporary-wallpaper-5"
+ "product_url": "https://designerwallcoverings.com/products/bandeau-mica-contemporary-wallpaper-5",
+ "dominant_hex_real": "#977959"
},
{
"sku": "GLS-111 Glass Beads - Gold-sample",
@@ -1138,7 +1169,8 @@
],
"max_price": 81.47,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/venezia-glass-beads-wall-paper-gold-gls-111-glass-beads-gold"
+ "product_url": "https://designerwallcoverings.com/products/venezia-glass-beads-wall-paper-gold-gls-111-glass-beads-gold",
+ "dominant_hex_real": "#715c36"
},
{
"sku": "GLS-112 Glass Beads - Silver-sample",
@@ -1173,7 +1205,8 @@
],
"max_price": 81.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/venezia-tm-glass-beads-silver-gls-112-glass-beads-silver"
+ "product_url": "https://designerwallcoverings.com/products/venezia-tm-glass-beads-silver-gls-112-glass-beads-silver",
+ "dominant_hex_real": "#798071"
},
{
"sku": "GLS-113 Glass Beads - Red Rock-sample",
@@ -1215,7 +1248,8 @@
],
"max_price": 81.47,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/venezia-glass-beads-red-rock-gls-113-glass-beads-red-rock"
+ "product_url": "https://designerwallcoverings.com/products/venezia-glass-beads-red-rock-gls-113-glass-beads-red-rock",
+ "dominant_hex_real": "#531d1b"
},
{
"sku": "GLS-115 Glass Beads - Pinki-sample",
@@ -1248,7 +1282,8 @@
],
"max_price": 81.47,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/venezia-glass-beads-pinki-gls-115-glass-beads-pinki"
+ "product_url": "https://designerwallcoverings.com/products/venezia-glass-beads-pinki-gls-115-glass-beads-pinki",
+ "dominant_hex_real": "#783051"
},
{
"sku": "GLS-114 Glass Beads - Bronzino-sample",
@@ -1287,7 +1322,8 @@
],
"max_price": 81.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/venezia-glass-beads-bronzino-gls-114-glass-beads-bronzino"
+ "product_url": "https://designerwallcoverings.com/products/venezia-glass-beads-bronzino-gls-114-glass-beads-bronzino",
+ "dominant_hex_real": "#4a3522"
},
{
"sku": "GLS-116 Glass Beads - Coffee-sample",
@@ -1324,7 +1360,8 @@
],
"max_price": 81.47,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/venezia-glass-beads-coffee-gls-116-glass-beads-coffee"
+ "product_url": "https://designerwallcoverings.com/products/venezia-glass-beads-coffee-gls-116-glass-beads-coffee",
+ "dominant_hex_real": "#3b392c"
},
{
"sku": "GLS-107-sample",
@@ -1370,7 +1407,8 @@
],
"max_price": 81.47,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-miami-beach-gls-107"
+ "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-miami-beach-gls-107",
+ "dominant_hex_real": "#795b5f"
},
{
"sku": "GLS-106-sample",
@@ -1411,7 +1449,8 @@
],
"max_price": 81.47,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-blue-dazzle-gls-106"
+ "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-blue-dazzle-gls-106",
+ "dominant_hex_real": "#637da5"
},
{
"sku": "GLS-109-sample",
@@ -1454,7 +1493,8 @@
],
"max_price": 81.47,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-atlantic-blue-gls-109"
+ "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-atlantic-blue-gls-109",
+ "dominant_hex_real": "#6d787e"
},
{
"sku": "GLS-104-sample",
@@ -1495,7 +1535,8 @@
],
"max_price": 81.47,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-copper-tinsel-gls-104"
+ "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-copper-tinsel-gls-104",
+ "dominant_hex_real": "#846359"
},
{
"sku": "GLS-108-sample",
@@ -1536,7 +1577,8 @@
],
"max_price": 81.47,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-deep-mocha-gls-108"
+ "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-deep-mocha-gls-108",
+ "dominant_hex_real": "#815345"
},
{
"sku": "GLS-102-sample",
@@ -1575,7 +1617,8 @@
],
"max_price": 81.47,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-silver-mirror-gls-102"
+ "product_url": "https://designerwallcoverings.com/products/sexy-sequin-wallcovering-silver-mirror-gls-102",
+ "dominant_hex_real": "#777e7f"
},
{
"sku": "GLS-418-sample",
@@ -1613,7 +1656,8 @@
],
"max_price": 81.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-gold-gls-418"
+ "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-gold-gls-418",
+ "dominant_hex_real": "#726d57"
},
{
"sku": "GLS-417-sample",
@@ -1647,7 +1691,8 @@
],
"max_price": 81.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-black-gls-417"
+ "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-black-gls-417",
+ "dominant_hex_real": "#303135"
},
{
"sku": "GLS-416-sample",
@@ -1687,7 +1732,8 @@
],
"max_price": 81.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-blue-gls-416"
+ "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-blue-gls-416",
+ "dominant_hex_real": "#404858"
},
{
"sku": "GLS-414-sample",
@@ -1728,7 +1774,8 @@
],
"max_price": 81.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/the-emerald-s-wizard-green-sequin-walls-gls-414"
+ "product_url": "https://designerwallcoverings.com/products/the-emerald-s-wizard-green-sequin-walls-gls-414",
+ "dominant_hex_real": "#496052"
},
{
"sku": "GLS-415-sample",
@@ -1767,7 +1814,8 @@
],
"max_price": 81.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-aqua-spa-gls-415"
+ "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-aqua-spa-gls-415",
+ "dominant_hex_real": "#607b7d"
},
{
"sku": "GLS-516-sample",
@@ -1806,7 +1854,8 @@
],
"max_price": 81.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-silver-gls-516"
+ "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-silver-gls-516",
+ "dominant_hex_real": "#72787a"
},
{
"sku": "GLS-413-sample",
@@ -1844,7 +1893,8 @@
],
"max_price": 81.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-ruby-red-slippers-gls-413"
+ "product_url": "https://designerwallcoverings.com/products/sequin-wall-paper-ruby-red-slippers-gls-413",
+ "dominant_hex_real": "#5d3f41"
},
{
"sku": "FXX - 3209-sample",
@@ -1877,7 +1927,8 @@
],
"max_price": 92.42,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/cubist-glitter-gold-silver-metallic-fxx-3209"
+ "product_url": "https://designerwallcoverings.com/products/cubist-glitter-gold-silver-metallic-fxx-3209",
+ "dominant_hex_real": "#9c8c73"
},
{
"sku": "FXX - 3212-sample",
@@ -1917,7 +1968,8 @@
],
"max_price": 45.16,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/glamor-glitter-silver-blue-fxx-3212"
+ "product_url": "https://designerwallcoverings.com/products/glamor-glitter-silver-blue-fxx-3212",
+ "dominant_hex_real": "#7a89a6"
},
{
"sku": "FXX - 3210-sample",
@@ -1948,7 +2000,8 @@
],
"max_price": 92.42,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/cubist-glitter-hot-pink-g-fxx-3210"
+ "product_url": "https://designerwallcoverings.com/products/cubist-glitter-hot-pink-g-fxx-3210",
+ "dominant_hex_real": "#8f4a5e"
},
{
"sku": "FXX - 3214-sample",
@@ -1991,7 +2044,8 @@
],
"max_price": 58.68,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hiya-mica-copper-glitter-fxx-3214"
+ "product_url": "https://designerwallcoverings.com/products/hiya-mica-copper-glitter-fxx-3214",
+ "dominant_hex_real": "#928782"
},
{
"sku": "FXX - 3213-sample",
@@ -2033,7 +2087,8 @@
],
"max_price": 45.16,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/glamor-glitter-silver-red-rasberry-fxx-3213"
+ "product_url": "https://designerwallcoverings.com/products/glamor-glitter-silver-red-rasberry-fxx-3213",
+ "dominant_hex_real": "#9b7877"
},
{
"sku": "SKL-300-sample",
@@ -2078,7 +2133,8 @@
],
"max_price": 910,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/skully-skulls-wallpaper-bronze-on-oil-slick-skl-300"
+ "product_url": "https://designerwallcoverings.com/products/skully-skulls-wallpaper-bronze-on-oil-slick-skl-300",
+ "dominant_hex_real": "#5b5449"
},
{
"sku": "NUD-10099-sample",
@@ -2104,7 +2160,8 @@
],
"max_price": 4.25,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/50-pinup-silhouette-silver-and-black-haze-nud-10099-1"
+ "product_url": "https://designerwallcoverings.com/products/50-pinup-silhouette-silver-and-black-haze-nud-10099-1",
+ "dominant_hex_real": "#131414"
},
{
"sku": "REW-6244-sample",
@@ -2139,7 +2196,8 @@
],
"max_price": 66.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/lexington-drive-diner-glitter-emboss-rew-6244"
+ "product_url": "https://designerwallcoverings.com/products/lexington-drive-diner-glitter-emboss-rew-6244",
+ "dominant_hex_real": "#8e5723"
},
{
"sku": "REW-6246-sample",
@@ -2175,7 +2233,8 @@
],
"max_price": 66.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/lexington-drive-diner-glitter-emboss-rew-6246"
+ "product_url": "https://designerwallcoverings.com/products/lexington-drive-diner-glitter-emboss-rew-6246",
+ "dominant_hex_real": "#c4b8a3"
},
{
"sku": "REW-6245-sample",
@@ -2208,7 +2267,8 @@
],
"max_price": 66.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/lexington-drive-diner-glitter-emboss-rew-6245"
+ "product_url": "https://designerwallcoverings.com/products/lexington-drive-diner-glitter-emboss-rew-6245",
+ "dominant_hex_real": "#262b2e"
},
{
"sku": "REW-6248-sample",
@@ -2242,7 +2302,8 @@
],
"max_price": 66.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/lexington-drive-diner-glitter-emboss-rew-6248"
+ "product_url": "https://designerwallcoverings.com/products/lexington-drive-diner-glitter-emboss-rew-6248",
+ "dominant_hex_real": "#6d321e"
},
{
"sku": "REW-6247-sample",
@@ -2276,7 +2337,8 @@
],
"max_price": 66.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/lexington-drive-diner-glitter-emboss-rew-6247"
+ "product_url": "https://designerwallcoverings.com/products/lexington-drive-diner-glitter-emboss-rew-6247",
+ "dominant_hex_real": "#4d5457"
},
{
"sku": "HSW-51500-sample",
@@ -2313,7 +2375,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51500"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51500",
+ "dominant_hex_real": "#772560"
},
{
"sku": "HSW-51501-sample",
@@ -2345,7 +2408,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51501"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51501",
+ "dominant_hex_real": "#712a29"
},
{
"sku": "HSW-51502-sample",
@@ -2376,7 +2440,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51502"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51502",
+ "dominant_hex_real": "#648283"
},
{
"sku": "HSW-51504-sample",
@@ -2409,7 +2474,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51504"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51504",
+ "dominant_hex_real": "#676461"
},
{
"sku": "HSW-51503-sample",
@@ -2443,7 +2509,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51503"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51503",
+ "dominant_hex_real": "#787772"
},
{
"sku": "HSW-51507-sample",
@@ -2476,7 +2543,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51507"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51507",
+ "dominant_hex_real": "#92784d"
},
{
"sku": "HSW-51506-sample",
@@ -2509,7 +2577,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51506"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51506",
+ "dominant_hex_real": "#6b5838"
},
{
"sku": "HSW-51505-sample",
@@ -2542,7 +2611,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51505"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51505",
+ "dominant_hex_real": "#8a5331"
},
{
"sku": "HSW-51509-sample",
@@ -2573,7 +2643,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51509"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51509",
+ "dominant_hex_real": "#2a2727"
},
{
"sku": "HSW-51508-sample",
@@ -2604,7 +2675,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51508"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51508",
+ "dominant_hex_real": "#2a2725"
},
{
"sku": "HSW-51511-sample",
@@ -2638,7 +2710,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51511"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51511",
+ "dominant_hex_real": "#9c775a"
},
{
"sku": "HSW-51510-sample",
@@ -2670,7 +2743,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51510"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51510",
+ "dominant_hex_real": "#969692"
},
{
"sku": "HSW-51514-sample",
@@ -2701,7 +2775,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51514"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51514",
+ "dominant_hex_real": "#898988"
},
{
"sku": "HSW-51513-sample",
@@ -2732,7 +2807,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51513"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51513",
+ "dominant_hex_real": "#af8f98"
},
{
"sku": "HSW-51512-sample",
@@ -2764,7 +2840,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51512"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51512",
+ "dominant_hex_real": "#be9f81"
},
{
"sku": "HSW-51517-sample",
@@ -2795,7 +2872,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51517"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51517",
+ "dominant_hex_real": "#bab8b5"
},
{
"sku": "HSW-51516-sample",
@@ -2827,7 +2905,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51516"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51516",
+ "dominant_hex_real": "#cfcdcb"
},
{
"sku": "HSW-51515-sample",
@@ -2858,7 +2937,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51515"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51515",
+ "dominant_hex_real": "#d0ccca"
},
{
"sku": "HSW-51519-sample",
@@ -2889,7 +2969,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51519"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51519",
+ "dominant_hex_real": "#cd3431"
},
{
"sku": "HSW-51518-sample",
@@ -2921,7 +3002,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51518"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51518",
+ "dominant_hex_real": "#76757e"
},
{
"sku": "HSW-51521-sample",
@@ -2952,7 +3034,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51521"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51521",
+ "dominant_hex_real": "#494847"
},
{
"sku": "HSW-51520-sample",
@@ -2983,7 +3066,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51520"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51520",
+ "dominant_hex_real": "#5d3a7a"
},
{
"sku": "HSW-51524-sample",
@@ -3014,7 +3098,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51524"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51524",
+ "dominant_hex_real": "#2f3549"
},
{
"sku": "HSW-51523-sample",
@@ -3045,7 +3130,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51523"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51523",
+ "dominant_hex_real": "#552d42"
},
{
"sku": "HSW-51522-sample",
@@ -3077,7 +3163,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51522"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51522",
+ "dominant_hex_real": "#3a3b3a"
},
{
"sku": "HSW-51526-sample",
@@ -3111,7 +3198,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51526"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51526",
+ "dominant_hex_real": "#d4d1ce"
},
{
"sku": "HSW-51525-sample",
@@ -3143,7 +3231,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51525"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51525",
+ "dominant_hex_real": "#888582"
},
{
"sku": "HSW-51527-sample",
@@ -3173,7 +3262,8 @@
],
"max_price": 59.99,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51527"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51527",
+ "dominant_hex_real": "#373633"
},
{
"sku": "DWS-59516-sample",
@@ -3203,7 +3293,8 @@
],
"max_price": 359.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/glima-swirl-glitz-stripe-dws-59516"
+ "product_url": "https://designerwallcoverings.com/products/glima-swirl-glitz-stripe-dws-59516",
+ "dominant_hex_real": "#a8a7a2"
},
{
"sku": "DWS-59515-sample",
@@ -3232,7 +3323,8 @@
],
"max_price": 359.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/glima-swirl-glitz-stripe-dws-59515"
+ "product_url": "https://designerwallcoverings.com/products/glima-swirl-glitz-stripe-dws-59515",
+ "dominant_hex_real": "#a3acab"
},
{
"sku": "DWS-59518-sample",
@@ -3262,7 +3354,8 @@
],
"max_price": 359.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/glima-swirl-glitz-stripe-dws-59518"
+ "product_url": "https://designerwallcoverings.com/products/glima-swirl-glitz-stripe-dws-59518",
+ "dominant_hex_real": "#3e403f"
},
{
"sku": "DWS-59517-sample",
@@ -3294,7 +3387,8 @@
],
"max_price": 359.41,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/glima-swirl-glitz-stripe-dws-59517"
+ "product_url": "https://designerwallcoverings.com/products/glima-swirl-glitz-stripe-dws-59517",
+ "dominant_hex_real": "#7b655c"
},
{
"sku": "GLM-52003--SAMPLE",
@@ -3335,7 +3429,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-golden-zebra-glm-52003"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-golden-zebra-glm-52003",
+ "dominant_hex_real": "#b1a491"
},
{
"sku": "GLM-52000--SAMPLE",
@@ -3379,7 +3474,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-blush-glm-52000"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-blush-glm-52000",
+ "dominant_hex_real": "#c5b3b3"
},
{
"sku": "GLM-52008--SAMPLE",
@@ -3418,7 +3514,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-cream-java-brown-glm-52008"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-cream-java-brown-glm-52008",
+ "dominant_hex_real": "#bdaba5"
},
{
"sku": "GLM-52007--SAMPLE",
@@ -3456,7 +3553,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-electric-fuschia-pink-glm-52007"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-electric-fuschia-pink-glm-52007",
+ "dominant_hex_real": "#b67f93"
},
{
"sku": "GLM-52004--SAMPLE",
@@ -3499,7 +3597,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-pinky-town-glm-52004"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-pinky-town-glm-52004",
+ "dominant_hex_real": "#dab3bf"
},
{
"sku": "GLM-52010--SAMPLE",
@@ -3536,7 +3635,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-deep-red-bordeaux-glm-52010"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-deep-red-bordeaux-glm-52010",
+ "dominant_hex_real": "#887579"
},
{
"sku": "GLM-52009--SAMPLE",
@@ -3573,7 +3673,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-silver-multi-color-glm-52009"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-silver-multi-color-glm-52009",
+ "dominant_hex_real": "#b3b1a8"
},
{
"sku": "GLM-52012--SAMPLE",
@@ -3610,7 +3711,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-deep-black-glam-glm-52012"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-deep-black-glam-glm-52012",
+ "dominant_hex_real": "#7f8085"
},
{
"sku": "GLM-52011--SAMPLE",
@@ -3649,7 +3751,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-christmas-miracle-glm-52011"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-christmas-miracle-glm-52011",
+ "dominant_hex_real": "#919997"
},
{
"sku": "GLM-52015--SAMPLE",
@@ -3685,7 +3788,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-bright-blue-thunder-glm-52015"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-bright-blue-thunder-glm-52015",
+ "dominant_hex_real": "#6992b2"
},
{
"sku": "GLM-52014--SAMPLE",
@@ -3759,7 +3863,8 @@
],
"max_price": 74.95,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-red-thunder-glm-52013"
+ "product_url": "https://designerwallcoverings.com/products/hollywood-glamour-sequin-red-thunder-glm-52013",
+ "dominant_hex_real": "#b97e83"
},
{
"sku": "GLM-53005--SAMPLE",
@@ -3796,7 +3901,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53005"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53005",
+ "dominant_hex_real": "#a0a0a0"
},
{
"sku": "GLM-53003--SAMPLE",
@@ -3831,7 +3937,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53003"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53003",
+ "dominant_hex_real": "#b17c84"
},
{
"sku": "GLM-53007--SAMPLE",
@@ -3865,7 +3972,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53007"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53007",
+ "dominant_hex_real": "#7e8fba"
},
{
"sku": "GLM-53006--SAMPLE",
@@ -3901,7 +4009,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53006"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53006",
+ "dominant_hex_real": "#a2a29f"
},
{
"sku": "GLM-53010--SAMPLE",
@@ -3934,7 +4043,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53010"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53010",
+ "dominant_hex_real": "#91b3b6"
},
{
"sku": "GLM-53009--SAMPLE",
@@ -3969,7 +4079,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53009"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53009",
+ "dominant_hex_real": "#e3d5e4"
},
{
"sku": "GLM-53008--SAMPLE",
@@ -4001,7 +4112,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53008"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53008",
+ "dominant_hex_real": "#eff3ee"
},
{
"sku": "GLM-53012--SAMPLE",
@@ -4036,7 +4148,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53012"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53012",
+ "dominant_hex_real": "#ca8c65"
},
{
"sku": "GLM-53011--SAMPLE",
@@ -4070,7 +4183,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53011"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53011",
+ "dominant_hex_real": "#829874"
},
{
"sku": "GLM-53014--SAMPLE",
@@ -4103,7 +4217,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53014"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53014",
+ "dominant_hex_real": "#e0b16d"
},
{
"sku": "GLM-53013--SAMPLE",
@@ -4138,7 +4253,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53013"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53013",
+ "dominant_hex_real": "#c7a865"
},
{
"sku": "GLM-53019--SAMPLE",
@@ -4172,7 +4288,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53019"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53019",
+ "dominant_hex_real": "#7b7c7b"
},
{
"sku": "GLM-53018--SAMPLE",
@@ -4208,7 +4325,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53018"
+ "product_url": "https://designerwallcoverings.com/products/eel-skin-sequin-glm-53018",
+ "dominant_hex_real": "#979794"
},
{
"sku": "GLM-53022--SAMPLE",
@@ -4239,7 +4357,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53022"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53022",
+ "dominant_hex_real": "#383834"
},
{
"sku": "GLM-53020--SAMPLE",
@@ -4274,7 +4393,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53020"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53020",
+ "dominant_hex_real": "#ad8129"
},
{
"sku": "GLM-53023--SAMPLE",
@@ -4308,7 +4428,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53023"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53023",
+ "dominant_hex_real": "#678087"
},
{
"sku": "GLM-53025--SAMPLE",
@@ -4342,7 +4463,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53025"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53025",
+ "dominant_hex_real": "#785f3a"
},
{
"sku": "GLM-53024--SAMPLE",
@@ -4377,7 +4499,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53024"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53024",
+ "dominant_hex_real": "#7c5b6f"
},
{
"sku": "GLM-53031--SAMPLE",
@@ -4414,7 +4537,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53031"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53031",
+ "dominant_hex_real": "#ac6d0d"
},
{
"sku": "GLM-53030--SAMPLE",
@@ -4448,7 +4572,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53030"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53030",
+ "dominant_hex_real": "#ad8129"
},
{
"sku": "GLM-53034--SAMPLE",
@@ -4482,7 +4607,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53034"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53034",
+ "dominant_hex_real": "#989b87"
},
{
"sku": "GLM-53033--SAMPLE",
@@ -4516,7 +4642,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53033"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53033",
+ "dominant_hex_real": "#818889"
},
{
"sku": "GLM-53032--SAMPLE",
@@ -4551,7 +4678,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53032"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53032",
+ "dominant_hex_real": "#5f8679"
},
{
"sku": "GLM-53036--SAMPLE",
@@ -4585,7 +4713,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53036"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53036",
+ "dominant_hex_real": "#898a79"
},
{
"sku": "GLM-53035--SAMPLE",
@@ -4621,7 +4750,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53035"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53035",
+ "dominant_hex_real": "#cab5a6"
},
{
"sku": "GLM-53038--SAMPLE",
@@ -4656,7 +4786,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53038"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53038",
+ "dominant_hex_real": "#927851"
},
{
"sku": "GLM-53037--SAMPLE",
@@ -4691,7 +4822,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53037"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53037",
+ "dominant_hex_real": "#7f7f7d"
},
{
"sku": "GLM-53041--SAMPLE",
@@ -4725,7 +4857,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53041"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53041",
+ "dominant_hex_real": "#4a3320"
},
{
"sku": "GLM-53040--SAMPLE",
@@ -4758,7 +4891,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53040"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53040",
+ "dominant_hex_real": "#373635"
},
{
"sku": "GLM-53039--SAMPLE",
@@ -4792,7 +4926,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53039"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53039",
+ "dominant_hex_real": "#8c8682"
},
{
"sku": "GLM-53043--SAMPLE",
@@ -4826,7 +4961,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53043"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53043",
+ "dominant_hex_real": "#98265d"
},
{
"sku": "GLM-53042--SAMPLE",
@@ -4861,7 +4997,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53042"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53042",
+ "dominant_hex_real": "#5d9294"
},
{
"sku": "GLM-53046--SAMPLE",
@@ -4896,7 +5033,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53046"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53046",
+ "dominant_hex_real": "#817751"
},
{
"sku": "GLM-53044--SAMPLE",
@@ -4931,7 +5069,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53044"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53044",
+ "dominant_hex_real": "#601e3a"
},
{
"sku": "GLM-53048--SAMPLE",
@@ -4968,7 +5107,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53048"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53048",
+ "dominant_hex_real": "#737a72"
},
{
"sku": "GLM-53047--SAMPLE",
@@ -5002,7 +5142,8 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53047"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53047",
+ "dominant_hex_real": "#947f48"
},
{
"sku": "GLM-53049--SAMPLE",
@@ -5036,6 +5177,7 @@
],
"max_price": 94.5,
"aesthetic": "glitter",
- "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53049"
+ "product_url": "https://designerwallcoverings.com/products/sting-ray-sequin-glm-53049",
+ "dominant_hex_real": "#383834"
}
]
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 1166389..e96e787 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,8 @@
"dependencies": {
"dotenv": "^17.4.2",
"express": "^4.21.0",
+ "extract-colors": "^4.2.1",
+ "get-pixels": "^3.3.3",
"helmet": "^8.1.0"
}
},
@@ -26,12 +28,76 @@
"node": ">= 0.6"
}
},
+ "node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
"license": "MIT"
},
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+ "license": "MIT"
+ },
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
"node_modules/body-parser": {
"version": "1.20.5",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
@@ -109,6 +175,24 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
@@ -145,6 +229,39 @@
"integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
"license": "MIT"
},
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+ "license": "MIT"
+ },
+ "node_modules/cwise-compiler": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz",
+ "integrity": "sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "uniq": "^1.0.0"
+ }
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-0.0.3.tgz",
+ "integrity": "sha512-Cp+jOa8QJef5nXS5hU7M1DWzXPEIoVR3kbV0dQuVGwROZg8bGf1DcCnkmajBTnvghTtSNMUdRrPjgaT6ZQucbw==",
+ "license": "MIT"
+ },
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -154,6 +271,15 @@
"ms": "2.0.0"
}
},
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -199,6 +325,16 @@
"node": ">= 0.4"
}
},
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "license": "MIT",
+ "dependencies": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -305,6 +441,39 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/extract-colors": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/extract-colors/-/extract-colors-4.2.1.tgz",
+ "integrity": "sha512-QAWcuwxnL9pisK7YfuG8qab6IF7UD6bbKTjiM+QTJ9Xvfi7fBymQd/xTFaPhkzkB5kyq+wla3AHanM7LInFLaQ==",
+ "license": "MIT"
+ },
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "license": "MIT"
+ },
"node_modules/finalhandler": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
@@ -323,6 +492,29 @@
"node": ">= 0.8"
}
},
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -374,6 +566,25 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/get-pixels": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/get-pixels/-/get-pixels-3.3.3.tgz",
+ "integrity": "sha512-5kyGBn90i9tSMUVHTqkgCHsoWoR+/lGbl4yC83Gefyr0HLIhgSWEx/2F/3YgsZ7UpYNuM6pDhDK7zebrUJ5nXg==",
+ "license": "MIT",
+ "dependencies": {
+ "data-uri-to-buffer": "0.0.3",
+ "jpeg-js": "^0.4.1",
+ "mime-types": "^2.0.1",
+ "ndarray": "^1.0.13",
+ "ndarray-pack": "^1.1.1",
+ "node-bitmap": "0.0.1",
+ "omggif": "^1.0.5",
+ "parse-data-uri": "^0.2.0",
+ "pngjs": "^3.3.3",
+ "request": "^2.44.0",
+ "through": "^2.3.4"
+ }
+ },
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
@@ -387,6 +598,15 @@
"node": ">= 0.4"
}
},
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
@@ -399,6 +619,29 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "deprecated": "this library is no longer supported",
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
@@ -452,6 +695,21 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
+ }
+ },
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -470,6 +728,12 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
+ "node_modules/iota-array": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz",
+ "integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==",
+ "license": "MIT"
+ },
"node_modules/ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@@ -479,6 +743,69 @@
"node": ">= 0.10"
}
},
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "license": "MIT"
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "license": "MIT"
+ },
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "license": "MIT"
+ },
+ "node_modules/jpeg-js": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
+ "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+ "license": "MIT"
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT"
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "license": "ISC"
+ },
+ "node_modules/jsprim": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -554,6 +881,26 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
+ "node_modules/ndarray": {
+ "version": "1.0.19",
+ "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz",
+ "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==",
+ "license": "MIT",
+ "dependencies": {
+ "iota-array": "^1.0.0",
+ "is-buffer": "^1.0.2"
+ }
+ },
+ "node_modules/ndarray-pack": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz",
+ "integrity": "sha512-51cECUJMT0rUZNQa09EoKsnFeDL4x2dHRT0VR5U2H5ZgEcm95ZDWcMA5JShroXjHOejmAD/fg8+H+OvUnVXz2g==",
+ "license": "MIT",
+ "dependencies": {
+ "cwise-compiler": "^1.1.2",
+ "ndarray": "^1.0.13"
+ }
+ },
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@@ -563,6 +910,23 @@
"node": ">= 0.6"
}
},
+ "node_modules/node-bitmap": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/node-bitmap/-/node-bitmap-0.0.1.tgz",
+ "integrity": "sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA==",
+ "engines": {
+ "node": ">=v0.6.5"
+ }
+ },
+ "node_modules/oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/object-inspect": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -575,6 +939,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/omggif": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
+ "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==",
+ "license": "MIT"
+ },
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -587,6 +957,15 @@
"node": ">= 0.8"
}
},
+ "node_modules/parse-data-uri": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/parse-data-uri/-/parse-data-uri-0.2.0.tgz",
+ "integrity": "sha512-uOtts8NqDcaCt1rIsO3VFDRsAfgE4c6osG4d9z3l4dCBlxYFzni6Di/oNU270SDrjkfZuUvLZx1rxMyqh46Y9w==",
+ "license": "ISC",
+ "dependencies": {
+ "data-uri-to-buffer": "0.0.3"
+ }
+ },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -602,6 +981,21 @@
"integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
"license": "MIT"
},
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "license": "MIT"
+ },
+ "node_modules/pngjs": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -615,6 +1009,27 @@
"node": ">= 0.10"
}
},
+ "node_modules/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/qs": {
"version": "6.14.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
@@ -654,6 +1069,47 @@
"node": ">= 0.8"
}
},
+ "node_modules/request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/request/node_modules/qs": {
+ "version": "6.5.5",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz",
+ "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -803,6 +1259,31 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/sshpk": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
+ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/statuses": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
@@ -812,6 +1293,12 @@
"node": ">= 0.8"
}
},
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "license": "MIT"
+ },
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -821,6 +1308,37 @@
"node": ">=0.6"
}
},
+ "node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "license": "Unlicense"
+ },
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@@ -834,6 +1352,12 @@
"node": ">= 0.6"
}
},
+ "node_modules/uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==",
+ "license": "MIT"
+ },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -843,6 +1367,15 @@
"node": ">= 0.8"
}
},
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -852,6 +1385,16 @@
"node": ">= 0.4.0"
}
},
+ "node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).",
+ "license": "MIT",
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -860,6 +1403,20 @@
"engines": {
"node": ">= 0.8"
}
+ },
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
}
}
}
diff --git a/package.json b/package.json
index c0b7a6f..443f0d5 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,8 @@
"dependencies": {
"dotenv": "^17.4.2",
"express": "^4.21.0",
+ "extract-colors": "^4.2.1",
+ "get-pixels": "^3.3.3",
"helmet": "^8.1.0"
}
}
diff --git a/public/index.html b/public/index.html
index c190178..300bd37 100644
--- a/public/index.html
+++ b/public/index.html
@@ -592,7 +592,7 @@ textarea:focus-visible,
</script>
<script>
-const state = { q:'', facet:'all', page:1, pages:1, total:0, loading:false, exhausted:false };
+const state = { q:'', facet:'all', sort: (localStorage.getItem('gw_sort') || 'newest'), page:1, pages:1, total:0, loading:false, exhausted:false };
const LABELS = {"all":"All"};
function escAttr(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, c => ({ '&':'&','<':'<','>':'>','"':'"',"'":''' }[c])); }
@@ -657,7 +657,7 @@ function resetGrid() {
async function loadGridPage() {
if (state.loading || state.exhausted) return;
state.loading = true;
- const params = new URLSearchParams({ page:state.page, limit:24 });
+ const params = new URLSearchParams({ page:state.page, limit:24, sort: state.sort || 'newest' });
if (state.q) params.set('q', state.q);
if (state.facet !== 'all') params.set('aesthetic', state.facet);
let data;
diff --git a/scripts/enrich-hex.mjs b/scripts/enrich-hex.mjs
new file mode 100644
index 0000000..358ecb2
--- /dev/null
+++ b/scripts/enrich-hex.mjs
@@ -0,0 +1,122 @@
+#!/usr/bin/env node
+// Per-SKU dominant hex extraction.
+// For each product, downloads the image, scales to 1x1 via sips, reads the
+// pixel, writes back to data/products.json as `dominant_hex_real`.
+//
+// Usage:
+// node scripts/enrich-hex.mjs
+//
+// Idempotent — products already carrying `dominant_hex_real` are skipped
+// unless `--force` is passed.
+
+import fs from 'node:fs/promises';
+import { existsSync } from 'node:fs';
+import path from 'node:path';
+import { execSync } from 'node:child_process';
+import os from 'node:os';
+
+const DATA = path.resolve('data/products.json');
+const FORCE = process.argv.includes('--force');
+const TMP = await fs.mkdtemp(path.join(os.tmpdir(), 'gw-hex-'));
+
+const sh = (c) => execSync(c, { stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
+
+function rgbToHex(r, g, b) {
+ const h = (n) => Math.max(0, Math.min(255, n | 0)).toString(16).padStart(2, '0');
+ return '#' + h(r) + h(g) + h(b);
+}
+
+// Use sips → tiff → parse pixel via plist.
+// Faster + more reliable: use sips to scale to 1x1, then read raw RGBA from tiff.
+async function dominantHexForUrl(url, idx) {
+ const ext = (url.split('?')[0].split('.').pop() || 'jpg').slice(0, 4).toLowerCase();
+ const inFile = path.join(TMP, `in-${idx}.${ext === 'png' ? 'png' : 'jpg'}`);
+ const outFile = path.join(TMP, `out-${idx}.png`);
+ try {
+ sh(`curl -fsSL --max-time 15 -A 'Mozilla/5.0' '${url.replace(/'/g, "'\\''")}' -o '${inFile}'`);
+ if (!existsSync(inFile)) return null;
+ // sips: resample to 1x1, write png
+ sh(`/usr/bin/sips -z 1 1 -s format png '${inFile}' --out '${outFile}'`);
+ if (!existsSync(outFile)) return null;
+ // Read first IDAT-decoded pixel via Node's built-in (no native deps): use
+ // Image data via PNG parser. We'll piggyback on a minimal PNG read by
+ // decoding through a small zlib + filter step. Simpler: use sips one more
+ // time to spit out raw bytes via "sips -g all" giving width/height, then
+ // ask sips to save as TIFF and read first 3 bytes.
+ const tiff = path.join(TMP, `out-${idx}.tiff`);
+ sh(`/usr/bin/sips -s format tiff '${outFile}' --out '${tiff}'`);
+ const buf = await fs.readFile(tiff);
+ // TIFF header: II*\0 (LE) or MM\0* (BE). Walk IFD to find StripOffsets +
+ // BitsPerSample + SamplesPerPixel. Quick & dirty: scan for the first
+ // StripOffsets tag (0x0111) and read pointer.
+ return parseTiffFirstPixel(buf);
+ } catch (e) {
+ return null;
+ } finally {
+ for (const f of [inFile, outFile, path.join(TMP, `out-${idx}.tiff`)]) {
+ try { await fs.unlink(f); } catch {}
+ }
+ }
+}
+
+function parseTiffFirstPixel(buf) {
+ if (buf.length < 8) return null;
+ const le = buf[0] === 0x49 && buf[1] === 0x49;
+ const be = buf[0] === 0x4d && buf[1] === 0x4d;
+ if (!le && !be) return null;
+ const u16 = (o) => le ? buf.readUInt16LE(o) : buf.readUInt16BE(o);
+ const u32 = (o) => le ? buf.readUInt32LE(o) : buf.readUInt32BE(o);
+ const ifd0 = u32(4);
+ const nEntries = u16(ifd0);
+ let stripOffset = null, samplesPerPixel = 3, bitsPerSample = 8;
+ for (let i = 0; i < nEntries; i++) {
+ const o = ifd0 + 2 + i * 12;
+ const tag = u16(o);
+ const type = u16(o + 2);
+ const count = u32(o + 4);
+ const valOff = u32(o + 8);
+ if (tag === 0x0111 /*StripOffsets*/) {
+ stripOffset = (count === 1 && type === 4) ? valOff
+ : (count === 1 && type === 3) ? (valOff & 0xffff)
+ : valOff; // value is offset to array, but for 1x1 strip count=1
+ } else if (tag === 0x0102 /*BitsPerSample*/) {
+ bitsPerSample = (count === 1) ? (type === 3 ? (valOff & 0xffff) : valOff) : 8;
+ } else if (tag === 0x0115 /*SamplesPerPixel*/) {
+ samplesPerPixel = (type === 3 ? (valOff & 0xffff) : valOff);
+ }
+ }
+ if (stripOffset == null || stripOffset + 3 > buf.length) return null;
+ if (bitsPerSample !== 8) return null;
+ const r = buf[stripOffset];
+ const g = buf[stripOffset + 1];
+ const b = buf[stripOffset + 2];
+ return rgbToHex(r, g, b);
+}
+
+(async () => {
+ const raw = await fs.readFile(DATA, 'utf8');
+ const arr = JSON.parse(raw);
+ let touched = 0, skipped = 0, failed = 0;
+ for (let i = 0; i < arr.length; i++) {
+ const p = arr[i];
+ if (!FORCE && p.dominant_hex_real) { skipped++; continue; }
+ const url = p.image_url || p.image || (p.images && p.images[0]) || null;
+ if (!url) { failed++; continue; }
+ process.stdout.write(`[${i + 1}/${arr.length}] ${p.sku || p.handle || ''} ... `);
+ const hex = await dominantHexForUrl(url, i);
+ if (hex) {
+ p.dominant_hex_real = hex;
+ touched++;
+ console.log(hex);
+ } else {
+ failed++;
+ console.log('FAIL');
+ }
+ if ((i + 1) % 10 === 0) {
+ await fs.writeFile(DATA, JSON.stringify(arr, null, 2));
+ }
+ }
+ await fs.writeFile(DATA, JSON.stringify(arr, null, 2));
+ await fs.rm(TMP, { recursive: true, force: true }).catch(() => {});
+ console.log(`\nDone. touched=${touched} skipped=${skipped} failed=${failed}`);
+})();
diff --git a/server.js b/server.js
index 5c5f1c9..7613e96 100644
--- a/server.js
+++ b/server.js
@@ -99,14 +99,21 @@ function rgbOfTag(tag) {
function hexToRgb(h){const m=/^#?([\da-f]{2})([\da-f]{2})([\da-f]{2})$/i.exec(h||'');return m?[parseInt(m[1],16),parseInt(m[2],16),parseInt(m[3],16)]:null;}
function rgbToHsl(r,g,b){r/=255;g/=255;b/=255;const mx=Math.max(r,g,b),mn=Math.min(r,g,b);let h=0,s=0,l=(mx+mn)/2;if(mx!==mn){const d=mx-mn;s=l>.5?d/(2-mx-mn):d/(mx+mn);switch(mx){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4;break;}h*=60;}return[h,s,l];}
function dominantHex(p){
+ if (p.dominant_hex_real && /^#[\da-f]{6}$/i.test(p.dominant_hex_real)) return p.dominant_hex_real;
const tags=(p.tags||[]).map(t=>String(t).toLowerCase());
for (const t of tags){const hx=rgbOfTag(t);if(hx)return hx;}
return '#888';
}
-// Up to 4 distinct color dots from tags
+// Up to 4 distinct color dots: real-pixel hex first, then tag-derived hexes.
function colorDots(p){
const seen=new Set();const out=[];
- for (const t of (p.tags||[])){const hx=rgbOfTag(t);if(hx&&!seen.has(hx)){seen.add(hx);out.push(hx);if(out.length>=4)break;}}
+ if (p.dominant_hex_real && /^#[\da-f]{6}$/i.test(p.dominant_hex_real)) {
+ out.push(p.dominant_hex_real); seen.add(p.dominant_hex_real.toLowerCase());
+ }
+ for (const t of (p.tags||[])){
+ const hx=rgbOfTag(t);
+ if(hx && !seen.has(hx.toLowerCase())){seen.add(hx.toLowerCase());out.push(hx);if(out.length>=4)break;}
+ }
return out;
}
function luminance(p){const rgb=hexToRgb(dominantHex(p));return rgb?(0.2126*rgb[0]+0.7152*rgb[1]+0.0722*rgb[2]):128;}
← 1f42bc0 color: chip dots from product tags; new sorts (light→dark, d
·
back to Glitterwalls
·
snapshot before fleet-grid refine tick 4 0c442ca →