← back to Dw Vendor Microsites
build schumacher (Schumacher) -> BUILT, port 10008, 5338 skus, img 0.95
76a0658c2f3ed41b9628b8494a69a44babea41c6 · 2026-06-30 14:56:56 -0700 · Steve
Files touched
M manifest.jsonA staging/bnwalls.jsonlA vendors/rebel_walls/viewer/fieldmap.jsonA vendors/rebel_walls/viewer/public/buybutton.jsA vendors/rebel_walls/viewer/public/index.htmlA vendors/rebel_walls/viewer/server.jsA vendors/schumacher/viewer/fieldmap.jsonA vendors/schumacher/viewer/public/buybutton.jsA vendors/schumacher/viewer/public/index.htmlA vendors/schumacher/viewer/server.js
Diff
commit 76a0658c2f3ed41b9628b8494a69a44babea41c6
Author: Steve <steve@designerwallcoverings.com>
Date: Tue Jun 30 14:56:56 2026 -0700
build schumacher (Schumacher) -> BUILT, port 10008, 5338 skus, img 0.95
---
manifest.json | 10 +-
staging/bnwalls.jsonl | 113 +++++++
vendors/rebel_walls/viewer/fieldmap.json | 6 +
vendors/rebel_walls/viewer/public/buybutton.js | 70 +++++
vendors/rebel_walls/viewer/public/index.html | 414 ++++++++++++++++++++++++
vendors/rebel_walls/viewer/server.js | 417 +++++++++++++++++++++++++
vendors/schumacher/viewer/fieldmap.json | 6 +
vendors/schumacher/viewer/public/buybutton.js | 70 +++++
vendors/schumacher/viewer/public/index.html | 414 ++++++++++++++++++++++++
vendors/schumacher/viewer/server.js | 417 +++++++++++++++++++++++++
10 files changed, 1934 insertions(+), 3 deletions(-)
diff --git a/manifest.json b/manifest.json
index de9e4c2..ebba188 100644
--- a/manifest.json
+++ b/manifest.json
@@ -74,9 +74,13 @@
"table_count": 5338,
"samples_only": true,
"status": "OK",
- "build_status": "PENDING",
+ "build_status": "BUILT",
"deploy_status": "PENDING",
- "wave": 3
+ "wave": 3,
+ "port": 10008,
+ "sku_count": 5338,
+ "image_health": 0.95,
+ "image_status": "HEALTHY"
},
"black_edition": {
"vendor_code": "black_edition",
@@ -1857,7 +1861,7 @@
"wave": 16
}
},
- "updated_at": "2026-06-30T14:56:46.056786",
+ "updated_at": "2026-06-30T14:56:56.084153",
"stats": {
"total_vendors": 118,
"buildable": 117,
diff --git a/staging/bnwalls.jsonl b/staging/bnwalls.jsonl
new file mode 100644
index 0000000..5b7f992
--- /dev/null
+++ b/staging/bnwalls.jsonl
@@ -0,0 +1,113 @@
+{"id": 154, "mfr_sku": "17115", "dw_sku": "DWBN-270002", "pattern_name": null, "color_name": "Beige", "collection": "Frvan Gogh 2", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18420/3570x2832-fit-xjzpUwh4XnEQBEgepjpEZTj92Xrbsx5WAhaq83I0.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:33.254131+00:00", "created_at": "2026-02-24T19:09:43.26088+00:00", "updated_at": "2026-04-01T22:24:42.021737+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18420/3570x2832-fit-xjzpUwh4XnEQBEgepjpEZTj92Xrbsx5WAhaq83I0.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20225/3570x2832-fit-iQmD2cmKpptzxpyn20KXMPoqNZF1xqi8Tb29NgAK.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and durable construction make it suitable for both commercial and residential interiors.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 158, "mfr_sku": "17121", "dw_sku": "DWBN-270006", "pattern_name": null, "color_name": "Beige", "collection": "Frvan Gogh 2", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18415/3570x2832-fit-XmQuztjoEjShOdJzjInvJrozRLS8NdzrlEqR6ZHU.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:37.998166+00:00", "created_at": "2026-02-24T19:09:43.262969+00:00", "updated_at": "2026-04-01T22:24:51.312321+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18415/3570x2832-fit-XmQuztjoEjShOdJzjInvJrozRLS8NdzrlEqR6ZHU.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20220/3570x2832-fit-tZt86NDyDuhObUwGBQDu0Cu8FowlRhSWVaDY4dLT.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, modern aesthetic. Its durable construction makes it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 159, "mfr_sku": "17124", "dw_sku": "DWBN-270007", "pattern_name": null, "color_name": "Beige", "collection": "Van Gogh 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18416/3570x2832-fit-EfHFxDckRmEHa7XMQuQOsBwgV6INjlpIXkwyz7Ed.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:39.652915+00:00", "created_at": "2026-02-24T19:09:43.263647+00:00", "updated_at": "2026-04-01T22:24:54.492385+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18416/3570x2832-fit-EfHFxDckRmEHa7XMQuQOsBwgV6INjlpIXkwyz7Ed.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20221/3570x2832-fit-Rx2e6GDhTjyD6Zg8w3Zu0SCVexy66gt9VAQiOvWC.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Art", "rooms": "", "color_primary": "White, Beige", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Gray", "White"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and durable construction make it suitable for both commercial and residential interiors seeking a touch of understated elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 161, "mfr_sku": "17132", "dw_sku": "DWBN-270010", "pattern_name": null, "color_name": "Beige", "collection": "Frvan Gogh 2", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18414/3570x2832-fit-Mtc4fGdtrAGEJm9M3tgnl3FcOHwqm0Necp42ZwEh.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:42.860237+00:00", "created_at": "2026-02-24T19:09:43.264875+00:00", "updated_at": "2026-04-01T22:25:00.568942+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18414/3570x2832-fit-Mtc4fGdtrAGEJm9M3tgnl3FcOHwqm0Necp42ZwEh.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20219/3570x2832-fit-Ostb8UND2bZkVrJsn1pq8LFnDbZ5Nq3vH2PYeK5T.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle, textured abstract pattern in a neutral beige tone. Its minimalist design and easy-to-clean surface make it ideal for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 148, "mfr_sku": "17140", "dw_sku": "DWBN-270011", "pattern_name": null, "color_name": "Beige", "collection": "Nlvan Gogh", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "12.6\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23272/3570x2832-fit-UnV2EZsaiMZsGTR9pCQFlkuqY6yQaVk0yUpGVeg3.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:23.555495+00:00", "created_at": "2026-02-24T19:09:43.257609+00:00", "updated_at": "2026-04-01T22:24:21.235942+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23272/3570x2832-fit-UnV2EZsaiMZsGTR9pCQFlkuqY6yQaVk0yUpGVeg3.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23276/3570x2832-fit-W9JG4xXYJr4x2S7dcrL9PPNhPdEUj14mdDd9f4Yo.jpg\"]", "fire_rating": "B-s2-d0", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Flowers, Classic, Art", "rooms": "", "color_primary": "Blue", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "White", "Taupe"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in neutral beige tones, creating a sophisticated and calming atmosphere. Its minimalist design makes it suitable for a variety of commercial and residential spaces seeking a touch of understated elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 149, "mfr_sku": "17141", "dw_sku": "DWBN-270012", "pattern_name": null, "color_name": "Beige", "collection": "Nlvan Gogh", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "12.6\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/2583/3570x2832-fit-180906673717141.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:25.11335+00:00", "created_at": "2026-02-24T19:09:43.258155+00:00", "updated_at": "2026-04-01T22:24:24.416881+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/2583/3570x2832-fit-180906673717141.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20579/3570x2832-fit-8ToeMK6tbo7k2xrsZAK4spojAg6OYeyM3jaX3QKs.jpg\"]", "fire_rating": "B-s2-d0", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Flowers, Classic, Art", "rooms": "", "color_primary": "Green, Beige, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and durable construction make it suitable for both commercial and residential applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 151, "mfr_sku": "17143", "dw_sku": "DWBN-270014", "pattern_name": null, "color_name": "Beige", "collection": "Nlvan Gogh", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "12.6\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23279/3570x2832-fit-1AfQmX1enGONtLeesNAFgycnMyajFlgbJQe3mqjL.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:28.553798+00:00", "created_at": "2026-02-24T19:09:43.259166+00:00", "updated_at": "2026-04-01T22:24:32.542958+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23279/3570x2832-fit-1AfQmX1enGONtLeesNAFgycnMyajFlgbJQe3mqjL.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23281/3570x2832-fit-iFX9eniIvf8N8Ua39iMM2E1cyjGrHu7nl6KB3RTX.jpg\"]", "fire_rating": "B-s2-d0", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Flowers, Classic, Art", "rooms": "", "color_primary": "Yellow", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle textured pattern in a neutral beige tone, perfect for adding depth and visual interest to any space. Its easy-to-clean surface makes it ideal for high-traffic areas in both commercial and residential settings.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 157, "mfr_sku": "17117", "dw_sku": "DWBN-270004", "pattern_name": null, "color_name": "Beige", "collection": "Van Gogh 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18422/3570x2832-fit-wOsiyyxKu8DdZIr9sgSzSfNDYa1bGnqbPOiLUUjb.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:36.361809+00:00", "created_at": "2026-02-24T19:09:43.262578+00:00", "updated_at": "2026-04-01T22:24:48.120713+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18422/3570x2832-fit-wOsiyyxKu8DdZIr9sgSzSfNDYa1bGnqbPOiLUUjb.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20227/3570x2832-fit-9tc2BmUtjSU7OijbjXBC1JKmCeN7L6rA1TWpxY5E.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Art", "rooms": "", "color_primary": "White", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in a neutral beige tone, perfect for adding depth without overwhelming a space. Its minimalist design makes it suitable for a variety of commercial and residential applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 156, "mfr_sku": "17128", "dw_sku": "DWBN-270008", "pattern_name": null, "color_name": "Beige", "collection": "Frvan Gogh 2", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18417/3570x2832-fit-PWtkqFxuZzYAlLBPKOX3nfnbBFeJqc10ViI8V4F6.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:34.796587+00:00", "created_at": "2026-02-24T19:09:43.262095+00:00", "updated_at": "2026-04-01T22:24:45.010406+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18417/3570x2832-fit-PWtkqFxuZzYAlLBPKOX3nfnbBFeJqc10ViI8V4F6.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20222/3570x2832-fit-hL44ypzvEaJOLm3R1WYSIKs7Co4a7ANz9UywAz8D.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Gray"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This beige vinyl wallcovering features a subtle textured pattern, adding depth and visual interest to any space. Its durable and easy-to-clean surface makes it ideal for high-traffic commercial or residential environments.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 152, "mfr_sku": "17182", "dw_sku": "DWBN-270017", "pattern_name": null, "color_name": "Beige", "collection": "Van Gogh", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/2541/3570x2832-fit-138754839317182.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:30.10726+00:00", "created_at": "2026-02-24T19:09:43.259715+00:00", "updated_at": "2026-04-01T22:24:35.826523+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/2541/3570x2832-fit-138754839317182.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20565/3570x2832-fit-KjX4FTP259g27Asas2u0YrlnFyBj3n8n73qvSPHL.jpg\"]", "fire_rating": "B-s2-d0", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Classic, Art", "rooms": "", "color_primary": "Beige, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Off-White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle textured pattern in a neutral beige tone, perfect for high-traffic commercial spaces. Its minimalist design and easy-to-clean surface make it a practical and stylish choice.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 82, "mfr_sku": "200288", "dw_sku": "DWBN-270019", "pattern_name": "Ikebana", "color_name": "Beige", "collection": "Dimensions By Edward Van Vliet", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19319/3570x2832-fit-Olv1RqcAn5JhaJEt6y1GNf0QWXVri7rJaMf9qe5F.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:41.952417+00:00", "created_at": "2026-02-24T19:09:43.211465+00:00", "updated_at": "2026-04-01T22:20:52.584381+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19319/3570x2832-fit-Olv1RqcAn5JhaJEt6y1GNf0QWXVri7rJaMf9qe5F.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/21060/3570x2832-fit-75MjQnwZHvRhHgUte7s2GukCLYb5PiyfEHgjHSxU.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Tropical, Geometric, Graphic", "rooms": "", "color_primary": "Blue, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Taupe", "Gray", "Brown"], "ai_styles": ["Contemporary", "Organic Modern", "Minimalist"], "ai_patterns": ["Textured", "Abstract", "Botanical"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "Ikebana offers a subtle, textured backdrop with an organic feel. Its neutral palette and refined texture make it suitable for a variety of interior spaces, adding depth without overwhelming the design.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 172, "mfr_sku": "200360", "dw_sku": "DWBN-270022", "pattern_name": "Sketchwallpaper", "color_name": "Beige", "collection": "Nlviktor Rolf", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20979/3570x2832-fit-COUjSCnti7FH4oqhLLUbQQCE0GomR3x8Pj1TxS3z.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:57.922324+00:00", "created_at": "2026-02-24T19:09:43.27032+00:00", "updated_at": "2026-04-01T22:25:28.646922+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20979/3570x2832-fit-COUjSCnti7FH4oqhLLUbQQCE0GomR3x8Pj1TxS3z.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24725/3570x2832-fit-GGaow3qoq5YJYxeQjXivbrw1sQSIu3RkMJd13vb0.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19993/3570x2832-fit-m6CRzKB8zJxkddTkZjKngJhy7Are7HXuAtfmVXqr.jpg\"]", "fire_rating": "B-s1-d0", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Graphic", "rooms": "", "color_primary": "Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Ideal for creating a sophisticated and calming atmosphere in commercial or residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 173, "mfr_sku": "200412", "dw_sku": "DWBN-270023", "pattern_name": "Cherryblossomtree", "color_name": "Beige", "collection": "Zen", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23471/3570x2832-fit-8KKKszt0sI7F0HEElMKhCGj0i7jkZTVRrOSbOQYw.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:59.258499+00:00", "created_at": "2026-02-24T19:09:43.270663+00:00", "updated_at": "2026-04-01T22:25:31.692523+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23471/3570x2832-fit-8KKKszt0sI7F0HEElMKhCGj0i7jkZTVRrOSbOQYw.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23476/3570x2832-fit-okzNl6rayqAJHSpyMxt4Vus4t3xTcB37DK9tYYBM.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Flowers", "rooms": "", "color_primary": "Cream", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "White", "Gray", "Brown", "Taupe"], "ai_styles": ["Contemporary", "Asian Inspired"], "ai_patterns": ["Floral", "Tree"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This elegant non-woven wallcovering features a delicate cherry blossom tree design, creating a serene and sophisticated atmosphere. Ideal for adding a touch of nature and tranquility to residential or commercial spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 83, "mfr_sku": "200289", "dw_sku": "DWBN-270020", "pattern_name": "Ikebana", "color_name": "Beige", "collection": "Dimensions By Edward Van Vliet", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19321/3570x2832-fit-Zs62so9fpklpGHiCYsnAfZm39zMi3sONsEzV8t9j.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:43.528902+00:00", "created_at": "2026-02-24T19:09:43.212229+00:00", "updated_at": "2026-04-01T22:20:56.095443+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19321/3570x2832-fit-Zs62so9fpklpGHiCYsnAfZm39zMi3sONsEzV8t9j.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/21061/3570x2832-fit-X8VDv9SH6iSHnx5X0MAUiWaAXwWM7wYDCbJU4ME0.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Tropical, Geometric, Graphic", "rooms": "", "color_primary": "Blue, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Taupe", "Light Gray", "Brown"], "ai_styles": ["Contemporary", "Organic Modern", "Minimalist"], "ai_patterns": ["Textured", "Abstract", "Organic"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "Ikebana is a subtly textured non-woven wallcovering that brings a touch of organic modernism to any space. Its neutral beige palette and delicate texture create a calming and sophisticated atmosphere, ideal for both commercial and residential interiors.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 147, "mfr_sku": "17120", "dw_sku": "DWBN-270005", "pattern_name": null, "color_name": "Beige", "collection": "Devan Gogh", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/2609/3570x2832-fit-176200743817120.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:22.216964+00:00", "created_at": "2026-02-24T19:09:43.257029+00:00", "updated_at": "2026-04-01T22:24:17.834475+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/2609/3570x2832-fit-176200743817120.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20591/3570x2832-fit-V5JctEgPkoVY3W0Bt9omtmRmtCjFtGLLEctq74EL.jpg\"]", "fire_rating": "B-s2-d0", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Gray", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and easy installation make it ideal for contemporary commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 75, "mfr_sku": "200435", "dw_sku": "DWBN-270025", "pattern_name": "Royal Heron", "color_name": "Beige", "collection": "Creative Lab", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19559/3570x2832-fit-7PCDel8wBoWoHGw8lsSO2cEp09OILh089pa8e5ie.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:31.108709+00:00", "created_at": "2026-02-24T19:09:43.20537+00:00", "updated_at": "2026-04-01T22:20:30.049547+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19559/3570x2832-fit-7PCDel8wBoWoHGw8lsSO2cEp09OILh089pa8e5ie.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/21024/3570x2832-fit-tVw9Gj3pZGsByFpIMCCN9hcxJLB88Crdn9Ap8OcA.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Tropical, Kids", "rooms": "", "color_primary": "Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Gold", "Brown"], "ai_styles": ["Traditional", "Classic"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle textured pattern in neutral beige and cream tones with gold accents. Its classic design and washable surface make it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 102, "mfr_sku": "200455", "dw_sku": "DWBN-270026", "pattern_name": "Rosegarden", "color_name": "Beige", "collection": "Fiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24727/3570x2832-fit-ixwW16UkuVtNFrz9fPASXqZMxfV7MKVYin1uOvMe.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:13.030152+00:00", "created_at": "2026-02-24T19:09:43.224033+00:00", "updated_at": "2026-04-01T22:21:56.498062+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24727/3570x2832-fit-ixwW16UkuVtNFrz9fPASXqZMxfV7MKVYin1uOvMe.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23678/3570x2832-fit-bCY9j1WARaWtQiHxG9jCWgCUQ7RlUGFsxiifTafG.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Flowers", "rooms": "", "color_primary": "Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Taupe", "Gray", "White"], "ai_styles": ["Traditional", "Classic", "Elegant"], "ai_patterns": ["Floral", "Damask", "Textured"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This Rosegarden wallcovering features a classic damask pattern with a subtle texture, adding depth and sophistication to any space. The durable vinyl material makes it suitable for high-traffic areas in both residential and commercial settings.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 71, "mfr_sku": "219190", "dw_sku": "DWBN-270030", "pattern_name": "Kotori", "color_name": "Beige", "collection": "Christian Fischbacher", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/30146/3570x2832-fit-9eSqiYmyJLAByPdZJknsMgGqjAeNvIUh6Mt0zE6H.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:24.789469+00:00", "created_at": "2026-02-24T19:09:43.202004+00:00", "updated_at": "2026-04-01T22:20:16.896501+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/30146/3570x2832-fit-9eSqiYmyJLAByPdZJknsMgGqjAeNvIUh6Mt0zE6H.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/22261/3570x2832-fit-ZgckavYZhQ32nlUXyXuxnRNSpTOOwtRygZM0P9uw.jpg\"]", "fire_rating": "C-s2-d0", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Tropical, Flowers", "rooms": "", "color_primary": "Blue, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Taupe", "Brown", "Gray"], "ai_styles": ["Contemporary", "Natural", "Minimalist"], "ai_patterns": ["Textured", "Abstract", "Organic"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "Kotori is a sophisticated non-woven wallcovering featuring a subtle, organic texture. Its neutral color palette and minimalist design make it a versatile choice for a range of interior spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 76, "mfr_sku": "219211", "dw_sku": "DWBN-270031", "pattern_name": "Plain", "color_name": "Beige", "collection": "Cubiq", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23037/3570x2832-fit-jWsQBrkuxZjxM1FftymqofvSus89Q5SsqPUScFul.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:32.446893+00:00", "created_at": "2026-02-24T19:09:43.206094+00:00", "updated_at": "2026-04-01T22:20:33.159171+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23037/3570x2832-fit-jWsQBrkuxZjxM1FftymqofvSus89Q5SsqPUScFul.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23289/3570x2832-fit-3e3WmcGoaENipaqqGtdESL5owZrvaL7A4jCrOnmB.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain", "rooms": "", "color_primary": "Grey, Green", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Off-White", "Light Gray"], "ai_styles": ["Minimalist", "Contemporary", "Neutral"], "ai_patterns": ["Textured", "Solid"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, minimalist aesthetic. Its durable construction and neutral beige tone make it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 143, "mfr_sku": "219221", "dw_sku": "DWBN-270032", "pattern_name": null, "color_name": "Beige", "collection": "Smalltalk", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/15956/3570x2832-fit-imagesproducts2457variants219221219221.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:16.027414+00:00", "created_at": "2026-02-24T19:09:43.255019+00:00", "updated_at": "2026-04-01T22:24:04.203944+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/15956/3570x2832-fit-imagesproducts2457variants219221219221.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20100/3570x2832-fit-Pr9wFNG1zFijjGOYfQvz5O9CTITyNZmoZNX92xYZ.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Textile", "rooms": "", "color_primary": "Pink", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and easy installation make it suitable for a variety of commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 238, "mfr_sku": "219306", "dw_sku": "DWBN-270033", "pattern_name": null, "color_name": "Beige", "collection": "Frsmalltalk", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/16046/3570x2832-fit-imagesproducts2465variants219306219306.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:18.506904+00:00", "created_at": "2026-02-24T19:09:43.297208+00:00", "updated_at": "2026-04-01T22:26:04.135882+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/16046/3570x2832-fit-imagesproducts2465variants219306219306.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/25015/3570x2832-fit-7vnMp7i7SISjiqL22NUMqIsVORv3FSHIBpMACsdx.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Off-White"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in a neutral beige tone, perfect for creating a calming and sophisticated atmosphere. Its durable construction and easy installation make it ideal for both commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 140, "mfr_sku": "18348", "dw_sku": "DWBN-270018", "pattern_name": null, "color_name": "Beige", "collection": "Riviera Maison 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19618/3570x2832-fit-AufWPXXPrSLBcDN7SzmCwW8AIgR267oXoUgXrKAB.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:11.756912+00:00", "created_at": "2026-02-24T19:09:43.253252+00:00", "updated_at": "2026-04-01T22:23:54.757827+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19618/3570x2832-fit-AufWPXXPrSLBcDN7SzmCwW8AIgR267oXoUgXrKAB.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20400/3570x2832-fit-z0kJfHZBK9t48Rk9y8lhXJfCRxqntzBvKHTyP6y9.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Textile", "rooms": "", "color_primary": "Brown", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and durable material make it suitable for both commercial and residential spaces seeking a modern, understated aesthetic.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 240, "mfr_sku": "219310", "dw_sku": "DWBN-270034", "pattern_name": null, "color_name": "Beige", "collection": "Frsmalltalk", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/16049/3570x2832-fit-imagesproducts2466variants219310219310.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:19.842767+00:00", "created_at": "2026-02-24T19:09:43.297802+00:00", "updated_at": "2026-04-01T22:26:07.374238+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/16049/3570x2832-fit-imagesproducts2466variants219310219310.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20154/3570x2832-fit-8gDswi251EZvFin0aVQzaf4l2da85btW6aI9ilnG.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Off-White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, modern aesthetic suitable for high-traffic commercial and residential spaces. Its durable and easy-to-clean surface makes it a practical and stylish choice.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 194, "mfr_sku": "219425", "dw_sku": "DWBN-270037", "pattern_name": null, "color_name": "Beige", "collection": "Delinen Stories", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17675/3570x2832-fit-tQqvlbW9KFDtCFcsYBS7krrvmWG0VyuanWzbFN0z.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:08.622306+00:00", "created_at": "2026-02-24T19:09:43.278538+00:00", "updated_at": "2026-04-01T22:25:51.265502+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17675/3570x2832-fit-tQqvlbW9KFDtCFcsYBS7krrvmWG0VyuanWzbFN0z.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/22128/3570x2832-fit-jWTYy6AulBVXCx0aO7cFcLmBIixyEgAVkVg1RqtB.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in neutral beige tones, creating a calming and sophisticated atmosphere. Its minimalist design makes it suitable for a variety of commercial and residential spaces seeking a touch of understated elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 123, "mfr_sku": "219429", "dw_sku": "DWBN-270038", "pattern_name": "Linen", "color_name": "Beige", "collection": "Grounded", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27295/3570x2832-fit-To8IFNaxnS5DGu4ofpOq2TnJlGAAJsiXmGcIaSp1.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:45.87819+00:00", "created_at": "2026-02-24T19:09:43.235729+00:00", "updated_at": "2026-04-01T22:23:03.766374+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27295/3570x2832-fit-To8IFNaxnS5DGu4ofpOq2TnJlGAAJsiXmGcIaSp1.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27526/3570x2832-fit-IjBOHnTjy5KoCSJBLamerRxxvUNJ1qlT3AHFoZJL.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain", "rooms": "", "color_primary": "Yellow", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Off-White"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This linen-look non-woven wallcovering offers a subtle textured effect, perfect for creating a calming and sophisticated atmosphere. Its neutral beige tone makes it a versatile choice for various commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 77, "mfr_sku": "219535", "dw_sku": "DWBN-270039", "pattern_name": null, "color_name": "Beige", "collection": "Dimensions By Edward Van Vliet", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17216/3570x2832-fit-UX9fZmHQpCKWmnKrZf2GTts7CpJGdzjo3qz80FI3.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:34.120631+00:00", "created_at": "2026-02-24T19:09:43.207044+00:00", "updated_at": "2026-04-01T22:20:36.446665+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17216/3570x2832-fit-UX9fZmHQpCKWmnKrZf2GTts7CpJGdzjo3qz80FI3.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20698/3570x2832-fit-pwUTZ0uZTXBz7kxjyY8JQk6uy17iq9neio3b14tj.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Textile", "rooms": "", "color_primary": "Blue, Green, Turquoise", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured design in a neutral beige tone. Its minimalist aesthetic makes it suitable for a variety of commercial and residential spaces seeking a contemporary touch.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 153, "mfr_sku": "17113", "dw_sku": "DWBN-270001", "pattern_name": null, "color_name": "Beige", "collection": "Frvan Gogh 2", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18181/3570x2832-fit-NhRzVOjA7VPyyqWkpZa3HChZ8YIKA7vTRTEqqf3l.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:31.692247+00:00", "created_at": "2026-02-24T19:09:43.260301+00:00", "updated_at": "2026-04-01T22:24:39.031814+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18181/3570x2832-fit-NhRzVOjA7VPyyqWkpZa3HChZ8YIKA7vTRTEqqf3l.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20205/3570x2832-fit-BWzq9aIt80j293K8hGxrARuy8EQbngsAkGqkUezM.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Off-White", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist", "Modern"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle textured pattern in a neutral beige tone, perfect for high-traffic commercial or residential spaces. Its minimalist design provides a clean and modern aesthetic while offering easy maintenance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 146, "mfr_sku": "17116", "dw_sku": "DWBN-270003", "pattern_name": null, "color_name": "Beige", "collection": "Frvan Gogh 2", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18421/3570x2832-fit-hsu6iJyvSHggIpfh0BHtVgu8BW012vDu1RLPaoPq.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:20.880974+00:00", "created_at": "2026-02-24T19:09:43.256641+00:00", "updated_at": "2026-04-01T22:24:14.807375+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18421/3570x2832-fit-hsu6iJyvSHggIpfh0BHtVgu8BW012vDu1RLPaoPq.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20226/3570x2832-fit-DX1WL7NlRidmj1NlxQp8stAde2JCDCvTRCvk4myc.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and easy installation make it suitable for both commercial and residential spaces seeking a touch of understated elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 203, "mfr_sku": "218905", "dw_sku": "DWBN-270028", "pattern_name": "Classyelegance", "color_name": "Beige", "collection": "Detimeless Stories", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23391/3570x2832-fit-QrQxKKVSAqmBlF39bgSrvqOCIjSiVnsi5QjkKAld.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:12.042433+00:00", "created_at": "2026-02-24T19:09:43.281941+00:00", "updated_at": "2026-04-01T22:25:54.578863+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23391/3570x2832-fit-QrQxKKVSAqmBlF39bgSrvqOCIjSiVnsi5QjkKAld.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23454/3570x2832-fit-RkAHIDF5cApQ8x8qkdyzhkuj6H1OHIW3EkoDdFqC.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Traditional", "Elegant"], "ai_patterns": ["Textured"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle textured pattern in a versatile beige tone. Ideal for high-traffic areas, it offers both elegance and practicality for commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 145, "mfr_sku": "200425", "dw_sku": "DWBN-270024", "pattern_name": "Lemondaisies", "color_name": "Beige", "collection": "Studio Pien", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19495/3570x2832-fit-6OUwIxNWQxfqAxByPild6Uk3cHdpLH9ksxJdCDDP.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:19.315958+00:00", "created_at": "2026-02-24T19:09:43.256196+00:00", "updated_at": "2026-04-01T22:24:11.552271+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19495/3570x2832-fit-6OUwIxNWQxfqAxByPild6Uk3cHdpLH9ksxJdCDDP.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19978/3570x2832-fit-Wx19T1zd3nMjUl0XSRyqUSVR9GHqBqXjtKaL9AI4.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Flowers, Graphic", "rooms": "", "color_primary": "Multicolour, Blue", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "White", "Gray", "Taupe"], "ai_styles": ["Traditional", "Classic", "Elegant"], "ai_patterns": ["Floral", "Damask", "Textured"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This elegant wallcovering features a subtle damask pattern with floral accents, creating a classic and refined look. The textured non-woven material adds depth and visual interest, making it suitable for residential or hospitality spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 78, "mfr_sku": "219544", "dw_sku": "DWBN-270040", "pattern_name": null, "color_name": "Beige", "collection": "Dimensions By Edward Van Vliet", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17222/3570x2832-fit-7kjgsMBYcCe6UKYoNSKaCd92bDnUXUuYBBYziO2f.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:35.749865+00:00", "created_at": "2026-02-24T19:09:43.207851+00:00", "updated_at": "2026-04-01T22:20:39.74699+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17222/3570x2832-fit-7kjgsMBYcCe6UKYoNSKaCd92bDnUXUuYBBYziO2f.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20704/3570x2832-fit-x4mci6vQweiNZtdw50IvgKbACxtluU6bTqVlWu5n.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical", "rooms": "", "color_primary": "Green, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "White", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and durable material make it suitable for both commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 79, "mfr_sku": "219616", "dw_sku": "DWBN-270041", "pattern_name": null, "color_name": "Beige", "collection": "Dimensions By Edward Van Vliet", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17264/3570x2832-fit-6KAGmygntY5kcptZVrATnqD9h7wfrstYrPoHO4na.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:37.086286+00:00", "created_at": "2026-02-24T19:09:43.208968+00:00", "updated_at": "2026-04-01T22:20:42.902274+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17264/3570x2832-fit-6KAGmygntY5kcptZVrATnqD9h7wfrstYrPoHO4na.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20745/3570x2832-fit-DUHsUTqaNsoceYKCzQPNSH74M9l7y2k7aT3qhMTi.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Stripes", "rooms": "", "color_primary": "Ochre, Brown", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Off-White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and durable construction make it suitable for both commercial and residential applications seeking a touch of understated elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 165, "mfr_sku": "17146", "dw_sku": "DWBN-270016", "pattern_name": null, "color_name": "Beige", "collection": "Frvan Gogh 2", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18412/3570x2832-fit-MeoppRKR6h6GsskoQrkn8ERmxpRQUv0LRRonNg5y.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:46.118727+00:00", "created_at": "2026-02-24T19:09:43.267033+00:00", "updated_at": "2026-04-01T22:25:06.656258+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18412/3570x2832-fit-MeoppRKR6h6GsskoQrkn8ERmxpRQUv0LRRonNg5y.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20218/3570x2832-fit-VH42V7mfbWlTZPjN4FGGrRBcgnAXAIOcwcMk8fh6.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and elegant finish make it suitable for both commercial and residential spaces seeking a sophisticated backdrop.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 139, "mfr_sku": "200353", "dw_sku": "DWBN-270021", "pattern_name": "Fern", "color_name": "Beige", "collection": "Panthera", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18503/3570x2832-fit-1O7vnuTSdroD6noETnAZGUoxp17dLT2fOIonQwoG.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:10.419788+00:00", "created_at": "2026-02-24T19:09:43.252417+00:00", "updated_at": "2026-04-01T22:23:51.499852+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18503/3570x2832-fit-1O7vnuTSdroD6noETnAZGUoxp17dLT2fOIonQwoG.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/21069/3570x2832-fit-q80ECksfGHJyjWzfGQpesiL5np6WtDMfa4mPO6lk.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Tropical", "rooms": "", "color_primary": "Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Taupe", "Gray"], "ai_styles": ["Natural", "Organic Modern", "Minimalist"], "ai_patterns": ["Textured", "Abstract", "Botanical"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured botanical pattern in neutral beige and cream tones. Its organic design and calming color palette make it ideal for creating serene and sophisticated spaces in both residential and commercial settings.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 144, "mfr_sku": "219312", "dw_sku": "DWBN-270035", "pattern_name": null, "color_name": "Beige", "collection": "Smalltalk", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/16053/3570x2832-fit-219312.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:17.699425+00:00", "created_at": "2026-02-24T19:09:43.255584+00:00", "updated_at": "2026-04-01T22:24:07.398586+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/16053/3570x2832-fit-219312.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20157/3570x2832-fit-pWQqTHCxlKqAaWycsMe3B8ELbwJqFdpMBpAUFbhu.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Textile", "rooms": "", "color_primary": "Blue", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Taupe", "Gray"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle, textured abstract pattern in neutral beige tones. Ideal for high-traffic commercial or residential spaces, it offers both style and easy maintenance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 80, "mfr_sku": "219623", "dw_sku": "DWBN-270042", "pattern_name": null, "color_name": "Beige", "collection": "Dimensions By Edward Van Vliet", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "12.6\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17268/3570x2832-fit-o6fOoFlBbD9xDvGNXttpHiQJ2itvR5isHCEaTSjX.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:38.684925+00:00", "created_at": "2026-02-24T19:09:43.20984+00:00", "updated_at": "2026-04-01T22:20:46.141433+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17268/3570x2832-fit-o6fOoFlBbD9xDvGNXttpHiQJ2itvR5isHCEaTSjX.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20749/3570x2832-fit-LjmtT1XPzjuP9aXPt8HnkBjwnzYBfzyVgTDG72q6.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Textile, Geometric", "rooms": "", "color_primary": "Blue, Ochre, Brown", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "White", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle, textured pattern in a neutral beige tone. Its minimalist design and easy-to-clean surface make it ideal for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 81, "mfr_sku": "219626", "dw_sku": "DWBN-270043", "pattern_name": null, "color_name": "Beige", "collection": "Dimensions By Edward Van Vliet", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "12.6\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17271/3570x2832-fit-67XKgdVlgSdIyoakHmZ1AwAkMx9XiMiNNSSdvJ24.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:40.297924+00:00", "created_at": "2026-02-24T19:09:43.210728+00:00", "updated_at": "2026-04-01T22:20:49.335876+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17271/3570x2832-fit-67XKgdVlgSdIyoakHmZ1AwAkMx9XiMiNNSSdvJ24.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20752/3570x2832-fit-bzzwarK1UYMbdFt3TQueLgPcgIzzoiM1wxl2nYsT.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Textile, Geometric", "rooms": "", "color_primary": "Ochre, Brown, Green", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Off-White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in a neutral beige tone. Its minimalist design and easy installation make it suitable for a variety of commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 164, "mfr_sku": "17145", "dw_sku": "DWBN-270015", "pattern_name": null, "color_name": "Beige", "collection": "Frvan Gogh 2", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18410/3570x2832-fit-DQOMaP69qOmfyPg3ANtpZDXAWZFhQo2POFOZyBiE.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:44.475523+00:00", "created_at": "2026-02-24T19:09:43.266581+00:00", "updated_at": "2026-04-01T22:25:03.632198+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18410/3570x2832-fit-DQOMaP69qOmfyPg3ANtpZDXAWZFhQo2POFOZyBiE.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20217/3570x2832-fit-7dcH8yF28eNShpWpUdnsi40bd93Lt6e5mwkEUyO5.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in a neutral beige tone. Its minimalist design and durable construction make it suitable for both commercial and residential interiors.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 128, "mfr_sku": "219664", "dw_sku": "DWBN-270046", "pattern_name": null, "color_name": "Beige", "collection": "Linen Stories", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17746/3570x2832-fit-LjZVBGFNrbzH6YO3d3nOYjrqripKuatCmx9B8xvw.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:53.290216+00:00", "created_at": "2026-02-24T19:09:43.238277+00:00", "updated_at": "2026-04-01T22:23:18.975364+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17746/3570x2832-fit-LjZVBGFNrbzH6YO3d3nOYjrqripKuatCmx9B8xvw.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/21380/3570x2832-fit-PZ28T5Ry4IiYctqIuhGEhxZNCzt9nC91Q9lIluLm.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Textile", "rooms": "", "color_primary": "Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "White", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and easy installation make it suitable for both commercial and residential spaces seeking a touch of understated elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 129, "mfr_sku": "219860", "dw_sku": "DWBN-270047", "pattern_name": null, "color_name": "Beige", "collection": "Material World", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17480/3570x2832-fit-UK1pKBKe037xWMMdPoPHF4Ey40w0lt8EICHrizXx.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:54.626356+00:00", "created_at": "2026-02-24T19:09:43.238722+00:00", "updated_at": "2026-04-01T22:23:22.052083+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17480/3570x2832-fit-UK1pKBKe037xWMMdPoPHF4Ey40w0lt8EICHrizXx.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/22296/3570x2832-fit-rEUx960BLTNWLF5NRd2azL3VB6bastqDXdrY8yV5.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Textile", "rooms": "", "color_primary": "Green", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design provides a sophisticated backdrop for contemporary interiors, suitable for both commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 141, "mfr_sku": "219881", "dw_sku": "DWBN-270048", "pattern_name": null, "color_name": "Beige", "collection": "Riviera Maison 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "12.6\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19569/3570x2832-fit-SZwYCGM3H8tQi4bj93asPKyKraTYnLVNUc3xw8Ty.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:13.091955+00:00", "created_at": "2026-02-24T19:09:43.253879+00:00", "updated_at": "2026-04-01T22:23:57.876046+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19569/3570x2832-fit-SZwYCGM3H8tQi4bj93asPKyKraTYnLVNUc3xw8Ty.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20334/3570x2832-fit-y0drRMjKlKS9mht42ohceKM7hK1zF6ULFmmyOgzM.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Textile", "rooms": "", "color_primary": "Brown, Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and elegant texture make it suitable for a variety of commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 160, "mfr_sku": "17129", "dw_sku": "DWBN-270009", "pattern_name": null, "color_name": "Beige", "collection": "Van Gogh 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18418/3570x2832-fit-3fVcfukc0rYQHsrgL5mvRodOSgxDxRlY2KoGNAxt.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:41.249647+00:00", "created_at": "2026-02-24T19:09:43.264201+00:00", "updated_at": "2026-04-01T22:24:57.531632+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18418/3570x2832-fit-3fVcfukc0rYQHsrgL5mvRodOSgxDxRlY2KoGNAxt.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20223/3570x2832-fit-ZSYrXeRUjbbaUGC17cS34VEHfeN3vCvvTy0FfL4C.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Art", "rooms": "", "color_primary": "Yellow", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle, textured abstract pattern in a neutral beige tone. Ideal for high-traffic commercial spaces, it offers both style and easy maintenance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 150, "mfr_sku": "17142", "dw_sku": "DWBN-270013", "pattern_name": null, "color_name": "Beige", "collection": "Nlvan Gogh", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "12.6\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/2580/3570x2832-fit-148123717317142.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:26.693755+00:00", "created_at": "2026-02-24T19:09:43.258653+00:00", "updated_at": "2026-04-01T22:24:28.586483+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/2580/3570x2832-fit-148123717317142.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20578/3570x2832-fit-4dAt4vHsHLC28xMST1hYSea4pvGsJgXMH0h6mx6Y.jpg\"]", "fire_rating": "B-s2-d0", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Flowers, Classic, Art", "rooms": "", "color_primary": "White, Green, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Off-White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle textured pattern in a neutral beige tone, perfect for high-traffic commercial or residential spaces. Its minimalist design adds a touch of modern sophistication while providing easy maintenance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 142, "mfr_sku": "219920", "dw_sku": "DWBN-270049", "pattern_name": null, "color_name": "Beige", "collection": "Riviera Maison 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19588/3570x2832-fit-sKMuDsjn65048hSx6tvimOkAWj0R7W2f0vx4ALEN.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:14.690552+00:00", "created_at": "2026-02-24T19:09:43.254465+00:00", "updated_at": "2026-04-01T22:24:01.043647+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19588/3570x2832-fit-sKMuDsjn65048hSx6tvimOkAWj0R7W2f0vx4ALEN.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20360/3570x2832-fit-OLESczfEx5g7m6dS34OdNO0uEJlGM0Dq88pG2dJJ.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Industrial, Classic", "rooms": "", "color_primary": "White, Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in neutral beige tones, adding depth and sophistication to any space. Its minimalist design makes it ideal for contemporary interiors seeking a touch of understated elegance in commercial or residential settings.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 241, "mfr_sku": "219951", "dw_sku": "DWBN-270050", "pattern_name": null, "color_name": "Beige", "collection": "Frriviera Maison 2", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19604/3570x2832-fit-021npGrIAiuHuh9wBVLcxipONkrlHS28deEagCQa.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:21.175745+00:00", "created_at": "2026-02-24T19:09:43.298114+00:00", "updated_at": "2026-04-01T22:26:10.581376+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19604/3570x2832-fit-021npGrIAiuHuh9wBVLcxipONkrlHS28deEagCQa.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20386/3570x2832-fit-ZQVXIyCYeoEvAPHXI3uJjqbp5HT7TWQHFdeVZASv.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and durable construction make it suitable for both commercial and residential applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 251, "mfr_sku": "220000", "dw_sku": "DWBN-270051", "pattern_name": null, "color_name": "Beige", "collection": "Frvan Gogh 2", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17940/3570x2832-fit-hl8G5yf1i7F61k5X16RkKD28rSXJjX7DySXfd1uU.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:22.768048+00:00", "created_at": "2026-02-24T19:09:43.301919+00:00", "updated_at": "2026-04-01T22:26:13.781194+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17940/3570x2832-fit-hl8G5yf1i7F61k5X16RkKD28rSXJjX7DySXfd1uU.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/25602/3570x2832-fit-Q0s8Y9KqyrKy5n0UH7YDLLr03eUvQGhPuCE9naCN.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, modern aesthetic suitable for both commercial and residential spaces. Its durable and easy-to-clean surface makes it a practical choice for high-traffic areas.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 166, "mfr_sku": "220043", "dw_sku": "DWBN-270052", "pattern_name": null, "color_name": "Beige", "collection": "Van Gogh 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17959/3570x2832-fit-NuNcg1EGS4kngB5WS29c3SUA4HMrKtSknsjQOXSq.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:47.456309+00:00", "created_at": "2026-02-24T19:09:43.267445+00:00", "updated_at": "2026-04-01T22:25:09.809906+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/17959/3570x2832-fit-NuNcg1EGS4kngB5WS29c3SUA4HMrKtSknsjQOXSq.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20192/3570x2832-fit-sueeDYTjLTXaEoPIwAEPSeFuabIkUHik4CiYpncl.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Industrial, Art", "rooms": "", "color_primary": "Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "White", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle, textured abstract pattern in a neutral beige tone. Ideal for high-traffic commercial or residential spaces, it offers both style and easy maintenance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 168, "mfr_sku": "220072", "dw_sku": "DWBN-270054", "pattern_name": null, "color_name": "Beige", "collection": "Van Gogh 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18569/3570x2832-fit-cWpmIOr54HGpuN9c35iDwdGqnPhxxgxnL3e1Hh4x.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:51.508097+00:00", "created_at": "2026-02-24T19:09:43.268475+00:00", "updated_at": "2026-04-01T22:25:16.043884+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18569/3570x2832-fit-cWpmIOr54HGpuN9c35iDwdGqnPhxxgxnL3e1Hh4x.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20215/3570x2832-fit-Pxxh7Jq2Iv33w6o30NDiaYBLU10gVHZj107UZ8UX.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Art", "rooms": "", "color_primary": "Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle, textured abstract pattern in a neutral beige tone. Ideal for high-traffic commercial or residential spaces seeking a modern, minimalist aesthetic.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 169, "mfr_sku": "220078", "dw_sku": "DWBN-270055", "pattern_name": null, "color_name": "Beige", "collection": "Van Gogh 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18189/3570x2832-fit-3O8NRIb2hn7f5zI5xe7rNooK3mDLWUvQvPIn6OpT.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:53.109682+00:00", "created_at": "2026-02-24T19:09:43.26894+00:00", "updated_at": "2026-04-01T22:25:19.415503+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18189/3570x2832-fit-3O8NRIb2hn7f5zI5xe7rNooK3mDLWUvQvPIn6OpT.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20208/3570x2832-fit-BDPt3dXLQpD8O3iDSYZL3M1IiOiC19C8fd4n2P0G.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Art", "rooms": "", "color_primary": "Yellow", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle, textured abstract pattern in a neutral beige tone. Ideal for high-traffic commercial or residential spaces, it offers both style and easy maintenance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 170, "mfr_sku": "220083", "dw_sku": "DWBN-270056", "pattern_name": null, "color_name": "Beige", "collection": "Van Gogh 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18200/3570x2832-fit-uJJ62qCcQ9jWZBLZSh96vh2xOTLl7v039jYl7TrW.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:54.725977+00:00", "created_at": "2026-02-24T19:09:43.269437+00:00", "updated_at": "2026-04-01T22:25:22.46298+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18200/3570x2832-fit-uJJ62qCcQ9jWZBLZSh96vh2xOTLl7v039jYl7TrW.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20213/3570x2832-fit-yfFxWZA0lUBYrRhOMRr4SqBtnfXFW48Rl9AQr2YU.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Art", "rooms": "", "color_primary": "White", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in a neutral beige tone. Its minimalist design and durable material make it suitable for both commercial and residential spaces seeking a touch of understated elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 131, "mfr_sku": "220120", "dw_sku": "DWBN-270057", "pattern_name": null, "color_name": "Beige", "collection": "Depanthera", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18026/3570x2832-fit-WxMbFY1ryPT9iQUzupz7svlChBiOHR0DLmAKENUX.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:57.502693+00:00", "created_at": "2026-02-24T19:09:43.241856+00:00", "updated_at": "2026-04-01T22:23:28.19168+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18026/3570x2832-fit-WxMbFY1ryPT9iQUzupz7svlChBiOHR0DLmAKENUX.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28858/3570x2832-fit-7VD1pz2oGf2c8tCX561xFLrlLambz16x9GU0yPin.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28859/3570x2832-fit-SEx6jQE5PIMqXcJXsGEuGMfQYJ3PQIIFIfnfDdAO.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design and easy installation make it suitable for both commercial and residential interiors.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 132, "mfr_sku": "220121", "dw_sku": "DWBN-270058", "pattern_name": null, "color_name": "Beige", "collection": "Depanthera", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19989/3570x2832-fit-vVQ078xZYwjiCsiBUDslMPhJr3GwelPonYCbDcdb.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:59.056493+00:00", "created_at": "2026-02-24T19:09:43.243764+00:00", "updated_at": "2026-04-01T22:23:31.227443+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19989/3570x2832-fit-vVQ078xZYwjiCsiBUDslMPhJr3GwelPonYCbDcdb.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28856/3570x2832-fit-N9QjEGKag553CNkiGjQrXI2dE0kNdVE0xhQIpTGt.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28857/3570x2832-fit-mW6hewOAwDUncBGH1L5OSn4T4kchkb7PQpHkBZaR.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured design in neutral beige tones. Its minimalist aesthetic and durable material make it suitable for both commercial and residential applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 133, "mfr_sku": "220122", "dw_sku": "DWBN-270059", "pattern_name": null, "color_name": "Beige", "collection": "Depanthera", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18028/3570x2832-fit-UWRsZBgDHkwBtYNwAjwS7QrhYrIP2I2hNimPrBMZ.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:00.629508+00:00", "created_at": "2026-02-24T19:09:43.244345+00:00", "updated_at": "2026-04-01T22:23:35.635082+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18028/3570x2832-fit-UWRsZBgDHkwBtYNwAjwS7QrhYrIP2I2hNimPrBMZ.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20522/3570x2832-fit-Q65buHzgTkVtLewxth8MjzTLh3U282WRoRDx32L3.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20523/3570x2832-fit-dVa5L7yoeDLpCw6xapTDlMqAS403Ebum2yoq8xMr.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle textured pattern in a neutral beige tone, perfect for high-traffic commercial or residential spaces. Its minimalist design provides a clean and modern aesthetic.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 134, "mfr_sku": "220123", "dw_sku": "DWBN-270060", "pattern_name": null, "color_name": "Beige", "collection": "Depanthera", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18031/3570x2832-fit-mKa9iqeFzcVDcJhsblowODNd1O0jxgDKKf5MIPQk.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:02.224608+00:00", "created_at": "2026-02-24T19:09:43.244908+00:00", "updated_at": "2026-04-01T22:23:38.790809+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18031/3570x2832-fit-mKa9iqeFzcVDcJhsblowODNd1O0jxgDKKf5MIPQk.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20524/3570x2832-fit-fFh18lYAhy1CwywAY2jpzLcFefBmltT8bzFIJZtP.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20525/3570x2832-fit-wTKPI0OlqM9OaNzM6b5g9gXGB44OqLzE8w1ximz2.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in a neutral beige tone, perfect for adding depth without overwhelming a space. Its minimalist design and easy installation make it suitable for both commercial and residential applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 136, "mfr_sku": "220125", "dw_sku": "DWBN-270062", "pattern_name": null, "color_name": "Beige", "collection": "Depanthera", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18033/3570x2832-fit-9oDx6ZlCb5jiVjaZnTAYRWh900ABL1bT0ilvH6p4.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:05.529879+00:00", "created_at": "2026-02-24T19:09:43.250477+00:00", "updated_at": "2026-04-01T22:23:42.11954+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18033/3570x2832-fit-9oDx6ZlCb5jiVjaZnTAYRWh900ABL1bT0ilvH6p4.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20529/3570x2832-fit-89YvGAbcoUIiZFyxcJHv2RwtaOUFbiuQIrdiyHgW.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle, textured abstract pattern in a neutral beige tone. Its easy-to-clean surface makes it ideal for high-traffic commercial and residential spaces seeking a modern, minimalist aesthetic.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 137, "mfr_sku": "220140", "dw_sku": "DWBN-270063", "pattern_name": null, "color_name": "Beige", "collection": "Nlpanthera", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "12.6\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18042/3570x2832-fit-g3ngLytBr1Cyj5NZDXR6JU07goXM8Kzwwq7wBiN9.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:07.121143+00:00", "created_at": "2026-02-24T19:09:43.251062+00:00", "updated_at": "2026-04-01T22:23:45.231909+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18042/3570x2832-fit-g3ngLytBr1Cyj5NZDXR6JU07goXM8Kzwwq7wBiN9.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20535/3570x2832-fit-IyvMskJ92Zqz2UqYCYBGO5O7YT0RLla58BGMtFzL.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical", "rooms": "", "color_primary": "Cream, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, modern aesthetic with a durable and easy-to-clean surface. Its neutral beige tone provides a versatile backdrop for a variety of interior spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 138, "mfr_sku": "220150", "dw_sku": "DWBN-270064", "pattern_name": null, "color_name": "Beige", "collection": "Panthera", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18050/3570x2832-fit-xXTLWyafvEkgtQko8hBtZjah7nehCxmyIYZXksUR.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:08.686138+00:00", "created_at": "2026-02-24T19:09:43.251564+00:00", "updated_at": "2026-04-01T22:23:48.40573+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18050/3570x2832-fit-xXTLWyafvEkgtQko8hBtZjah7nehCxmyIYZXksUR.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20542/3570x2832-fit-6GNSyLPyUjUT5y0zjK33OLFyv4bnLOuN14YsJTE9.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Textile", "rooms": "", "color_primary": "White", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This beige vinyl wallcovering features a subtle, textured pattern, adding depth and visual interest to any space. Its durable and easy-to-clean surface makes it ideal for high-traffic commercial or residential environments.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 130, "mfr_sku": "220191", "dw_sku": "DWBN-270065", "pattern_name": null, "color_name": "Beige", "collection": "Frmilano", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18436/3570x2832-fit-VPXxLsr0bNN85PdoN1sR64KErsbRveBHubJ1qaDf.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:55.962302+00:00", "created_at": "2026-02-24T19:09:43.239208+00:00", "updated_at": "2026-04-01T22:23:25.117736+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18436/3570x2832-fit-VPXxLsr0bNN85PdoN1sR64KErsbRveBHubJ1qaDf.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20002/3570x2832-fit-DsFQnluEopEgjgwfBtjGA0EojJWNCXe5pI6JnyCA.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, modern aesthetic with a durable and easy-to-clean surface. Its neutral beige tone and minimalist design make it suitable for a variety of commercial and residential applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 103, "mfr_sku": "220421", "dw_sku": "DWBN-270066", "pattern_name": "Silk", "color_name": "Beige", "collection": "Fiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23892/3570x2832-fit-dsMY3HwDWq4qgBGs2Za7ysAF9r1LcBEAC7RLFPZN.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:14.591375+00:00", "created_at": "2026-02-24T19:09:43.224653+00:00", "updated_at": "2026-04-01T22:21:59.639956+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23892/3570x2832-fit-dsMY3HwDWq4qgBGs2Za7ysAF9r1LcBEAC7RLFPZN.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23908/3570x2832-fit-DXr2e6MbCIhNgDtkiofKzyxxJiphsl1tB5SrgZkF.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain", "rooms": "", "color_primary": "Beige", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Off-White"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, sophisticated look with its neutral beige tone. Its durable and easy-to-clean surface makes it ideal for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 183, "mfr_sku": "220430", "dw_sku": "DWBN-270067", "pattern_name": "Silk", "color_name": "Beige", "collection": "Defiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23900/3570x2832-fit-P2dewrCkArQ9DLgxr4MiDX0NJJdutK2mUM0ozpUb.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:04.126+00:00", "created_at": "2026-02-24T19:09:43.2747+00:00", "updated_at": "2026-04-01T22:25:41.24152+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23900/3570x2832-fit-P2dewrCkArQ9DLgxr4MiDX0NJJdutK2mUM0ozpUb.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23912/3570x2832-fit-o38lBRU4ydH6ZTtRxLRY3mhjYOm1Nh3JcGOt0aNz.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Off-White"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in neutral beige tones, creating a sophisticated and minimalist backdrop. Its understated elegance makes it suitable for a variety of commercial and residential spaces seeking a touch of refined simplicity.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 104, "mfr_sku": "220434", "dw_sku": "DWBN-270068", "pattern_name": "Silk", "color_name": "Beige", "collection": "Fiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23904/3570x2832-fit-EMYbTqc1V3XoMN35DdY3w15Equs0oZljSMnB5Z9z.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:16.238727+00:00", "created_at": "2026-02-24T19:09:43.225188+00:00", "updated_at": "2026-04-01T22:22:02.771754+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23904/3570x2832-fit-EMYbTqc1V3XoMN35DdY3w15Equs0oZljSMnB5Z9z.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23584/3570x2832-fit-bqYR1OIMnJJ8RHbMhj5aNksjICZbwLtnQeHSBrv0.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain", "rooms": "", "color_primary": "Beige", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Off-White"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, sophisticated look with its neutral beige tone. Its durable vinyl construction makes it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 93, "mfr_sku": "220440", "dw_sku": "DWBN-270070", "pattern_name": "Birds of Paradise", "color_name": "Beige", "collection": "Fiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23371/3570x2832-fit-HjV4dq2iT3EkidWyFMsbpdcxyTWNy5ggTxQnAm5r.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:59.098112+00:00", "created_at": "2026-02-24T19:09:43.218768+00:00", "updated_at": "2026-04-01T22:21:28.307475+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23371/3570x2832-fit-HjV4dq2iT3EkidWyFMsbpdcxyTWNy5ggTxQnAm5r.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23517/3570x2832-fit-YdkhY8Glyl2v2eekk8uxhS1aDo4RkV1rdU8UZA64.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Flowers", "rooms": "", "color_primary": "Cream, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Gold", "Brown", "Green", "White"], "ai_styles": ["Tropical", "Contemporary"], "ai_patterns": ["Floral", "Birds"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This Birds of Paradise wallcovering brings a touch of tropical elegance to any space. The detailed floral and bird design on a soft beige background creates a serene and inviting atmosphere.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 94, "mfr_sku": "220441", "dw_sku": "DWBN-270071", "pattern_name": "Birds of Paradise", "color_name": "Beige", "collection": "Frfiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23491/3570x2832-fit-9WPbrpwCObYRUsdRaA3iJvCFpna4Mbg6npjEq7qw.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:00.752797+00:00", "created_at": "2026-02-24T19:09:43.219301+00:00", "updated_at": "2026-04-01T22:21:31.517702+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23491/3570x2832-fit-9WPbrpwCObYRUsdRaA3iJvCFpna4Mbg6npjEq7qw.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23518/3570x2832-fit-yCFSZL0FObIEDtSQ1KGRN4GGDNnZnDMXKX2mVvQY.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Gold", "Brown", "Cream", "White"], "ai_styles": ["Tropical", "Contemporary"], "ai_patterns": ["Floral", "Birds"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This Birds of Paradise wallcovering brings a touch of tropical elegance to any space. The design features detailed birds and floral elements on a textured beige background, perfect for creating a luxurious and inviting atmosphere.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 95, "mfr_sku": "220442", "dw_sku": "DWBN-270072", "pattern_name": "Birds of Paradise", "color_name": "Beige", "collection": "Fiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23494/3570x2832-fit-BQ9n8EJD2gezfZQ36Wc9t2cwzKRAbr8j9zIRgg38.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:02.341689+00:00", "created_at": "2026-02-24T19:09:43.219923+00:00", "updated_at": "2026-04-01T22:21:34.862182+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23494/3570x2832-fit-BQ9n8EJD2gezfZQ36Wc9t2cwzKRAbr8j9zIRgg38.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23519/3570x2832-fit-787UDU28j5HNH27C61EvcalaTst8vfyDeiyhvpWV.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Flowers", "rooms": "", "color_primary": "Beige, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Cream", "Gold", "Green", "White"], "ai_styles": ["Tropical", "Contemporary"], "ai_patterns": ["Floral", "Birds"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This Birds of Paradise wallcovering brings a touch of exotic elegance to any space. The detailed floral and bird design creates a vibrant and inviting atmosphere, perfect for creating a statement wall.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 96, "mfr_sku": "220443", "dw_sku": "DWBN-270073", "pattern_name": "Birds of Paradise", "color_name": "Beige", "collection": "Frfiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23495/3570x2832-fit-f6hXLDc08fvkSNHzkjMDlqqc9PIm9aHJIEYe7hpI.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:03.946674+00:00", "created_at": "2026-02-24T19:09:43.220507+00:00", "updated_at": "2026-04-01T22:21:38.065628+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23495/3570x2832-fit-f6hXLDc08fvkSNHzkjMDlqqc9PIm9aHJIEYe7hpI.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23520/3570x2832-fit-zTFmDA5dXZhEvWRaUUA2KWtPme94VWrK7o9kcxm8.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Gold", "Brown", "Green", "White"], "ai_styles": ["Tropical", "Contemporary"], "ai_patterns": ["Botanical", "Birds"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This Birds of Paradise wallcovering brings a touch of tropical elegance to any space. The detailed botanical design and subtle color palette create a sophisticated and inviting atmosphere, perfect for residential or hospitality projects.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 97, "mfr_sku": "220444", "dw_sku": "DWBN-270074", "pattern_name": "Birds of Paradise", "color_name": "Beige", "collection": "Fiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23496/3570x2832-fit-W7F8vg1M9KwsGylvEwrz72O3reH8FdllWUxCScic.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:05.515538+00:00", "created_at": "2026-02-24T19:09:43.22104+00:00", "updated_at": "2026-04-01T22:21:41.120933+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23496/3570x2832-fit-W7F8vg1M9KwsGylvEwrz72O3reH8FdllWUxCScic.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23521/3570x2832-fit-wAMuFK85xBrHT99pZ6lx0NfygA6cdnLwFaViJNnw.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Flowers", "rooms": "", "color_primary": "Yellow, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Green", "Brown", "Cream", "Gold"], "ai_styles": ["Tropical", "Contemporary"], "ai_patterns": ["Floral", "Birds"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This Birds of Paradise wallcovering brings a touch of tropical elegance to any space. The detailed botanical design and subtle color palette create a sophisticated and inviting atmosphere.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 98, "mfr_sku": "220445", "dw_sku": "DWBN-270075", "pattern_name": "Birds of Paradise", "color_name": "Beige", "collection": "Frfiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23497/3570x2832-fit-gt5XUhjGhx4SqsZe4um70a8x9xjTA48M9mPO3cpp.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:07.164965+00:00", "created_at": "2026-02-24T19:09:43.221608+00:00", "updated_at": "2026-04-01T22:21:44.161814+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23497/3570x2832-fit-gt5XUhjGhx4SqsZe4um70a8x9xjTA48M9mPO3cpp.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23522/3570x2832-fit-bimM0hIM9caxo6nBQDlWJv0zFOeMzOq6ZcS93n3F.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Green", "Brown", "White", "Gray"], "ai_styles": ["Tropical", "Contemporary"], "ai_patterns": ["Botanical", "Birds"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This Birds of Paradise wallcovering brings a touch of tropical elegance to any space. The detailed botanical and bird design on a neutral beige background creates a serene and inviting atmosphere.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 99, "mfr_sku": "220446", "dw_sku": "DWBN-270076", "pattern_name": "Birds of Paradise", "color_name": "Beige", "collection": "Frfiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23498/3570x2832-fit-okS9wkbZD4IWZX5Knta1Zz2H1IAAEC4YmDYRH9cY.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:08.733151+00:00", "created_at": "2026-02-24T19:09:43.222156+00:00", "updated_at": "2026-04-01T22:21:47.21334+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23498/3570x2832-fit-okS9wkbZD4IWZX5Knta1Zz2H1IAAEC4YmDYRH9cY.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23523/3570x2832-fit-cFJmjTxcaHld3KKSiv4j9gr0xDSx8cK3360ytScE.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Taupe", "Brown", "Green", "Gray"], "ai_styles": ["Tropical", "Contemporary"], "ai_patterns": ["Floral", "Birds"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This Birds of Paradise wallcovering brings a touch of tropical elegance to any space. The detailed floral and bird design on a neutral background creates a sophisticated and inviting atmosphere.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 101, "mfr_sku": "220472", "dw_sku": "DWBN-270077", "pattern_name": "Paisleypoetry", "color_name": "Beige", "collection": "Defiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23508/3570x2832-fit-qrl6wXUbzsZpGBpm4y5nbtZSzJHszIOcFGR1k14A.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:11.693689+00:00", "created_at": "2026-02-24T19:09:43.223312+00:00", "updated_at": "2026-04-01T22:21:53.308787+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23508/3570x2832-fit-qrl6wXUbzsZpGBpm4y5nbtZSzJHszIOcFGR1k14A.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23534/3570x2832-fit-ivceFx8xg4LNCZ44aKH0bDwcit9pYtIXqbTCBY2u.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "Paisley", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Taupe", "Brown", "Gold"], "ai_styles": ["Traditional", "Classic"], "ai_patterns": ["Paisley", "Textured"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This vinyl wallcovering features a classic paisley pattern with a subtle texture, adding depth and visual interest. Its durable construction makes it suitable for high-traffic areas in residential and commercial spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 100, "mfr_sku": "220483", "dw_sku": "DWBN-270078", "pattern_name": "Blooming", "color_name": "Beige", "collection": "Fiore", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23515/3570x2832-fit-BVhTxt7gwzYJJE8dL9SsDswvyONO1KSiWz7jVmoD.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:10.355971+00:00", "created_at": "2026-02-24T19:09:43.222682+00:00", "updated_at": "2026-04-01T22:21:50.204627+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23515/3570x2832-fit-BVhTxt7gwzYJJE8dL9SsDswvyONO1KSiWz7jVmoD.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/23854/3570x2832-fit-QFloZ24O6xegViRiKjgO0bzDW66XhqT97aF5wHNU.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Flowers", "rooms": "", "color_primary": "Blue, Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, modern aesthetic. Its neutral beige tone and durable construction make it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 167, "mfr_sku": "220071", "dw_sku": "DWBN-270053", "pattern_name": null, "color_name": "Beige", "collection": "Van Gogh 2", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18174/3570x2832-fit-GTWrsJYJoeVV9J9ogrcb8bQrXo8m4wJ26cA4MVjF.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:49.092919+00:00", "created_at": "2026-02-24T19:09:43.267965+00:00", "updated_at": "2026-04-01T22:25:13.061915+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/18174/3570x2832-fit-GTWrsJYJoeVV9J9ogrcb8bQrXo8m4wJ26cA4MVjF.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20202/3570x2832-fit-hi0ge1hVPBZoO1GBuGdsCAEboAV7ltxltJ1T4tMI.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Art", "rooms": "", "color_primary": "Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle textured pattern in a neutral beige tone. Its minimalist design and easy-to-clean surface make it ideal for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 116, "mfr_sku": "220503", "dw_sku": "DWBN-270079", "pattern_name": "Leather", "color_name": "Beige", "collection": "Grand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26939/3570x2832-fit-1qywsei9X313gDWpmiphqALwyCp8W1q4MbVusnwP.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:34.75195+00:00", "created_at": "2026-02-24T19:09:43.231966+00:00", "updated_at": "2026-04-01T22:22:41.064875+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26939/3570x2832-fit-1qywsei9X313gDWpmiphqALwyCp8W1q4MbVusnwP.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27403/3570x2832-fit-jBO0c81W4zeuxiq61SZRQZy0ObWCuljZcQznTj5X.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Natural materials", "rooms": "", "color_primary": "Brown", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#E6D8C2", "ai_colors": ["Beige", "Cream", "Light Brown", "Taupe"], "ai_styles": ["Modern", "Minimalist", "Industrial"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This leather-look vinyl wallcovering offers a sophisticated and durable solution for high-traffic areas. Its textured surface provides visual interest while maintaining a clean and modern aesthetic, ideal for commercial and hospitality environments.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 190, "mfr_sku": "220504", "dw_sku": "DWBN-270080", "pattern_name": "Leather", "color_name": "Beige", "collection": "Degrand Safari", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26940/3570x2832-fit-mYHthsiAfpzlrp7Tf0c0qLlfuNiz9yxodhTdVSjU.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:05.713761+00:00", "created_at": "2026-02-24T19:09:43.277192+00:00", "updated_at": "2026-04-01T22:25:44.562058+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26940/3570x2832-fit-mYHthsiAfpzlrp7Tf0c0qLlfuNiz9yxodhTdVSjU.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27404/3570x2832-fit-PQfFyoj7Ltw9SLrUCGJPUX8rlz5Rw6YYpaIltDvd.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Tan"], "ai_styles": ["Modern", "Minimalist", "Industrial"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This durable vinyl wallcovering offers the sophisticated look of leather with a subtle texture. Its neutral beige tone and easy-to-clean surface make it ideal for high-traffic commercial spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 117, "mfr_sku": "220506", "dw_sku": "DWBN-270081", "pattern_name": "Leather", "color_name": "Beige", "collection": "Grand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26942/3570x2832-fit-4HsPRxQf6w7NOt5cstijuwfHskyj4wNEqwviJbIb.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:36.373982+00:00", "created_at": "2026-02-24T19:09:43.232541+00:00", "updated_at": "2026-04-01T22:22:44.177591+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26942/3570x2832-fit-4HsPRxQf6w7NOt5cstijuwfHskyj4wNEqwviJbIb.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27406/3570x2832-fit-RM7tKcgxeTtQyaFA4WtKkNMcGwIPrrUcYy5mywOt.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Natural materials", "rooms": "", "color_primary": "Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#E0D8C6", "ai_colors": ["Beige", "Cream", "Light Brown", "Taupe"], "ai_styles": ["Modern", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This vinyl wallcovering offers the sophisticated look of leather with a subtle texture. Its durable construction makes it ideal for high-traffic commercial spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 191, "mfr_sku": "220507", "dw_sku": "DWBN-270082", "pattern_name": "Leather", "color_name": "Beige", "collection": "Degrand Safari", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26943/3570x2832-fit-G5297LRyf6oibI3XBopHm0sm25ZyCutRQdGYsdm5.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:07.286067+00:00", "created_at": "2026-02-24T19:09:43.277533+00:00", "updated_at": "2026-04-01T22:25:47.899706+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26943/3570x2832-fit-G5297LRyf6oibI3XBopHm0sm25ZyCutRQdGYsdm5.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27171/3570x2832-fit-1qWibwaNMGY6VdgpwGa8uGKWNMWxV2Ev3mOkBljP.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Taupe"], "ai_styles": ["Modern", "Minimalist", "Contemporary"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, modern aesthetic with a durable and easy-to-clean surface. Its neutral beige tone provides a versatile backdrop for a variety of commercial interiors.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 119, "mfr_sku": "220520", "dw_sku": "DWBN-270083", "pattern_name": "Savanna", "color_name": "Beige", "collection": "Grand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26960/3570x2832-fit-l0SyioOj51ItlbyWOZibZjViIbFo0nMOOYtd1cO2.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:39.600712+00:00", "created_at": "2026-02-24T19:09:43.233641+00:00", "updated_at": "2026-04-01T22:22:50.821231+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26960/3570x2832-fit-l0SyioOj51ItlbyWOZibZjViIbFo0nMOOYtd1cO2.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27409/3570x2832-fit-ggZGbqqRs3dk543ejA1q61wIp0usadDbaBrSXIe8.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain, Geometric", "rooms": "", "color_primary": "White", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Taupe", "White"], "ai_styles": ["Contemporary", "Natural", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "Savanna is a sophisticated non-woven wallcovering featuring a subtle textured design. Its neutral color palette and organic feel make it ideal for creating a calming and inviting atmosphere in both residential and commercial spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 121, "mfr_sku": "220530", "dw_sku": "DWBN-270084", "pattern_name": "Zebracrossing", "color_name": "Beige", "collection": "Grand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "6.3\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26964/3570x2832-fit-NmUexWjqEIvViTV6SIpbFRhLwBgNlo7CTV8MRVq7.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:43.208337+00:00", "created_at": "2026-02-24T19:09:43.234627+00:00", "updated_at": "2026-04-01T22:22:57.393445+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26964/3570x2832-fit-NmUexWjqEIvViTV6SIpbFRhLwBgNlo7CTV8MRVq7.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27412/3570x2832-fit-VzeDaMjAHD1kunu9bU8RKKvSaqWpiyuDD6Cnx5vE.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical", "rooms": "", "color_primary": "Beige", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Taupe", "Brown", "Gray"], "ai_styles": ["Contemporary", "Modern"], "ai_patterns": ["Abstract", "Textured"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features an abstract textured pattern in neutral beige tones. Its contemporary style and easy-to-clean surface make it ideal for high-traffic commercial spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 120, "mfr_sku": "220542", "dw_sku": "DWBN-270085", "pattern_name": "Scalypython", "color_name": "Beige", "collection": "Grand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26972/3570x2832-fit-SeyoBAwyLlJnxGtID6LvVxv5cAfmDk9HFBPMcRr8.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:41.623414+00:00", "created_at": "2026-02-24T19:09:43.234127+00:00", "updated_at": "2026-04-01T22:22:54.151653+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26972/3570x2832-fit-SeyoBAwyLlJnxGtID6LvVxv5cAfmDk9HFBPMcRr8.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27160/3570x2832-fit-e2q6fBsaB3xhLFnX9nI6V4CFXBAUzO53JheZ0IgW.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical", "rooms": "", "color_primary": "Beige, Brown", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Taupe", "Brown", "Gray"], "ai_styles": ["Contemporary", "Modern"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, abstract pattern in neutral beige tones, perfect for adding depth and visual interest to any space. Its durable vinyl construction makes it ideal for high-traffic commercial and residential environments.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 105, "mfr_sku": "220550", "dw_sku": "DWBN-270086", "pattern_name": "Exuberantleopard", "color_name": "Beige", "collection": "Grand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26974/3570x2832-fit-JyQw5i2Tmg4qyu6rF5jJ3syrPTwMxqz82Jw4lsAB.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:17.797716+00:00", "created_at": "2026-02-24T19:09:43.225767+00:00", "updated_at": "2026-04-01T22:22:05.780716+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26974/3570x2832-fit-JyQw5i2Tmg4qyu6rF5jJ3syrPTwMxqz82Jw4lsAB.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27417/3570x2832-fit-sWfEIkfQc0nfm0t4VxXLTAlKOsNOYeyDWvZEjSSs.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical", "rooms": "", "color_primary": "White", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Black", "Cream"], "ai_styles": ["Modern", "Animal Print"], "ai_patterns": ["Animal Print"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This modern vinyl wallcovering features a bold leopard print design. The textured surface adds depth and visual interest, making it a statement piece for any interior.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 106, "mfr_sku": "220551", "dw_sku": "DWBN-270087", "pattern_name": "Exuberantleopard", "color_name": "Beige", "collection": "Grand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26975/3570x2832-fit-1ksS7ftQyStv20GNCAIfWLFaXRgoFzcWif53ye4s.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:19.419908+00:00", "created_at": "2026-02-24T19:09:43.226487+00:00", "updated_at": "2026-04-01T22:22:08.933081+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26975/3570x2832-fit-1ksS7ftQyStv20GNCAIfWLFaXRgoFzcWif53ye4s.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27418/3570x2832-fit-J1wye3zpUAMqGNTKjykl4zg5EasjEFGcdrCvLN4M.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical", "rooms": "", "color_primary": "Beige", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Black", "Cream", "Tan"], "ai_styles": ["Contemporary", "Modern"], "ai_patterns": ["Animal Print", "Leopard"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This vinyl wallcovering features a bold leopard print design in neutral beige and brown tones. It's a durable and stylish choice for adding a touch of modern flair to any interior space.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 107, "mfr_sku": "220552", "dw_sku": "DWBN-270088", "pattern_name": "Exuberantleopard", "color_name": "Beige", "collection": "Nlgrand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26976/3570x2832-fit-uRxMpkxlFL8jiGqqdRHV1Q5iSDaDTNWQjW3OA4gt.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:21.012357+00:00", "created_at": "2026-02-24T19:09:43.226988+00:00", "updated_at": "2026-04-01T22:22:12.350113+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26976/3570x2832-fit-uRxMpkxlFL8jiGqqdRHV1Q5iSDaDTNWQjW3OA4gt.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27163/3570x2832-fit-YxwQQf1tU9Jk6wJmmmSGiZpuK0EkPomW6mFn9GNE.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27164/3570x2832-fit-N6OUZVavCvygD3fCL6mAFDGUDkKHml0evh38cMpF.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical", "rooms": "", "color_primary": "Beige, Brown", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Black", "Cream"], "ai_styles": ["Contemporary", "Glam"], "ai_patterns": ["Animal Print", "Leopard"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This exuberant leopard print wallcovering adds a touch of wild sophistication to any space. The textured vinyl material provides durability and visual interest, making it suitable for high-traffic areas.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 108, "mfr_sku": "220553", "dw_sku": "DWBN-270089", "pattern_name": "Exuberantleopard", "color_name": "Beige", "collection": "Degrand Safari", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26977/3570x2832-fit-y8ZDmnCdnytPntBv608UuaiRM0VFz84pG4qkumdX.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:22.349091+00:00", "created_at": "2026-02-24T19:09:43.22745+00:00", "updated_at": "2026-04-01T22:22:15.412452+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26977/3570x2832-fit-y8ZDmnCdnytPntBv608UuaiRM0VFz84pG4qkumdX.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27419/3570x2832-fit-9mUw3HVShRMsFpi1BE05VYXI8Nd6xcEbTmcv1SYc.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "Animal Print", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Black", "Cream"], "ai_styles": ["Contemporary", "Modern"], "ai_patterns": ["Animal Print", "Leopard"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This exuberant leopard print wallcovering adds a bold, contemporary touch to any space. The textured vinyl material provides durability and visual interest, making it suitable for both commercial and residential applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 109, "mfr_sku": "220554", "dw_sku": "DWBN-270090", "pattern_name": "Exuberantleopard", "color_name": "Beige", "collection": "Nlgrand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26978/3570x2832-fit-pAMcrxT1MW5D9eHuyXT0yWJaExDY5hJN4BkRKsOW.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:23.905545+00:00", "created_at": "2026-02-24T19:09:43.228022+00:00", "updated_at": "2026-04-01T22:22:18.493548+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26978/3570x2832-fit-pAMcrxT1MW5D9eHuyXT0yWJaExDY5hJN4BkRKsOW.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27177/3570x2832-fit-95mjku91QgsG940GOF0ZQhonpLqzNeOsFIQE21P1.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical", "rooms": "", "color_primary": "Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Black", "Cream", "Taupe"], "ai_styles": ["Contemporary", "Modern"], "ai_patterns": ["Animal Print", "Leopard"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This exuberant leopard print wallcovering adds a bold and contemporary touch to any space. The textured vinyl material provides durability and visual interest, making it suitable for both residential and commercial applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 110, "mfr_sku": "220555", "dw_sku": "DWBN-270091", "pattern_name": "Exuberantleopard", "color_name": "Beige", "collection": "Grand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26979/3570x2832-fit-J1aWCvXNX6daaRnGwRLptwIfasmGIGigWw2pk024.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:25.521044+00:00", "created_at": "2026-02-24T19:09:43.228588+00:00", "updated_at": "2026-04-01T22:22:21.667526+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26979/3570x2832-fit-J1aWCvXNX6daaRnGwRLptwIfasmGIGigWw2pk024.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27420/3570x2832-fit-dj1Ru3sVsIkSGI81hK7qENlpy5MyK156nY13AHwD.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical", "rooms": "", "color_primary": "Black", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Black", "Cream", "Tan"], "ai_styles": ["Contemporary", "Modern"], "ai_patterns": ["Animal Print", "Leopard"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This vinyl wallcovering features a bold leopard print design, perfect for adding a touch of contemporary style to any space. The textured surface enhances the visual appeal and provides durability for high-traffic areas.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 111, "mfr_sku": "220560", "dw_sku": "DWBN-270092", "pattern_name": "Greenery", "color_name": "Green", "collection": "Frgrand Safari", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26980/3570x2832-fit-wZ2jNEwgHAVP3vbO0ifaAC4b27R7bJMSl449EWiN.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:27.15429+00:00", "created_at": "2026-02-24T19:09:43.229129+00:00", "updated_at": "2026-04-01T22:22:24.883057+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26980/3570x2832-fit-wZ2jNEwgHAVP3vbO0ifaAC4b27R7bJMSl449EWiN.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27421/3570x2832-fit-ZthPKYcEnj6IqniRnwnPelYKQH9q2lX4goD9TwEO.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#7A8B6C", "ai_colors": ["Green", "Olive Green", "Beige", "Cream", "Brown"], "ai_styles": ["Natural", "Organic", "Contemporary"], "ai_patterns": ["Textured", "Abstract", "Botanical"], "ai_background_color": "Green", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle botanical texture in varying shades of green, creating a natural and calming atmosphere. Its organic aesthetic makes it suitable for both residential and commercial interiors seeking a touch of biophilic design.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 112, "mfr_sku": "220561", "dw_sku": "DWBN-270093", "pattern_name": "Greenery", "color_name": "Light Beige", "collection": "Nlgrand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26981/3570x2832-fit-yKExS39NAoMfnQ6kMpvr8OkGYG3yytkLmfhuAxem.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:28.490917+00:00", "created_at": "2026-02-24T19:09:43.229633+00:00", "updated_at": "2026-04-01T22:22:28.140645+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26981/3570x2832-fit-yKExS39NAoMfnQ6kMpvr8OkGYG3yytkLmfhuAxem.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29372/3570x2832-fit-OIK3T1jYpzzGKRYWPhhKQ1i3Pndm0R3errkm1H0C.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29373/3570x2832-fit-hKoC17HcuoOOCkn7RauYptQJQinkVFvDZN0YHWH3.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical, Flowers", "rooms": "", "color_primary": "Green", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Light Beige", "Cream", "Light Gray", "Sage Green", "Olive Green"], "ai_styles": ["Contemporary", "Natural", "Organic"], "ai_patterns": ["Textured", "Abstract", "Botanical"], "ai_background_color": "Light Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle botanical texture in a calming palette of beige and green. Its natural and organic aesthetic makes it suitable for creating serene and inviting spaces in both residential and commercial environments.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 113, "mfr_sku": "220562", "dw_sku": "DWBN-270094", "pattern_name": "Greenery", "color_name": "Light Green", "collection": "Frgrand Safari", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26982/3570x2832-fit-RS0IIP6x5ihIjExkftkCXbPd0NAZJazSybcs81nB.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:30.06792+00:00", "created_at": "2026-02-24T19:09:43.230198+00:00", "updated_at": "2026-04-01T22:22:31.334924+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26982/3570x2832-fit-RS0IIP6x5ihIjExkftkCXbPd0NAZJazSybcs81nB.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27179/3570x2832-fit-Waiw36r3GbUoEAcscfLwl1opGHrwIM5mkoEiDBQp.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#D0DBC4", "ai_colors": ["Light Green", "Cream", "Beige", "White", "Gray"], "ai_styles": ["Natural", "Organic", "Contemporary"], "ai_patterns": ["Textured", "Abstract", "Botanical"], "ai_background_color": "Light Green", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle textured botanical pattern in light green tones, creating a calming and organic atmosphere. Ideal for commercial and residential spaces seeking a touch of nature and tranquility.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 114, "mfr_sku": "220563", "dw_sku": "DWBN-270095", "pattern_name": "Greenery", "color_name": "Beige", "collection": "Frgrand Safari", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26983/3570x2832-fit-UQQ3KdyJKDSKzi26n1bT4T4lRvftLs58nQZrgQhj.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:31.606577+00:00", "created_at": "2026-02-24T19:09:43.230743+00:00", "updated_at": "2026-04-01T22:22:34.563209+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26983/3570x2832-fit-UQQ3KdyJKDSKzi26n1bT4T4lRvftLs58nQZrgQhj.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27422/3570x2832-fit-O0slGtbsdspPjEN2M4gbWbYU3E8xjYXrUIcD3x8P.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29374/3570x2832-fit-tgbFNF5Ivg88OeiHCyi6ZmxUjiX1G5o7aUMofM7C.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Green", "Olive Green", "Cream", "Brown"], "ai_styles": ["Natural", "Organic"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured design inspired by nature. Its neutral beige and green tones create a calming and organic atmosphere, ideal for both residential and commercial spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 115, "mfr_sku": "220564", "dw_sku": "DWBN-270096", "pattern_name": "Greenery", "color_name": "Beige", "collection": "Nlgrand Safari", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26984/3570x2832-fit-jxkVTQ0Rl5zRPfzdZx0XXK4LXGP57P9vHCIJJze5.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:33.155432+00:00", "created_at": "2026-02-24T19:09:43.231391+00:00", "updated_at": "2026-04-01T22:22:37.642391+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26984/3570x2832-fit-jxkVTQ0Rl5zRPfzdZx0XXK4LXGP57P9vHCIJJze5.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27423/3570x2832-fit-sTywziC4IhfwvgVThZ6gxcejFwTtR6XR0qlOAmHd.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Tropical, Flowers", "rooms": "", "color_primary": "Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Green", "White"], "ai_styles": ["Natural", "Organic"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, organic texture in neutral beige and cream tones. Its calming and natural aesthetic makes it suitable for both commercial and residential spaces seeking a touch of understated elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 122, "mfr_sku": "220611", "dw_sku": "DWBN-270099", "pattern_name": "Dancette", "color_name": "Beige", "collection": "Grounded", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27569/3570x2832-fit-oC0BWqlTpjymODKGrb6Y0Rbc8T9b54kRT1MSJ71a.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:44.543029+00:00", "created_at": "2026-02-24T19:09:43.235212+00:00", "updated_at": "2026-04-01T22:23:00.343593+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27569/3570x2832-fit-oC0BWqlTpjymODKGrb6Y0Rbc8T9b54kRT1MSJ71a.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27503/3570x2832-fit-0SaklTl6wo3nGWe3YXr4w9RiI2zprWhOH2ReFZMQ.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Textile", "rooms": "", "color_primary": "Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Gold", "Brown"], "ai_styles": ["Contemporary", "Modern"], "ai_patterns": ["Geometric", "Textured"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "Dancette is a modern vinyl wallcovering featuring a subtle geometric texture. Its neutral beige color and durable construction make it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 124, "mfr_sku": "220630", "dw_sku": "DWBN-270100", "pattern_name": "Obanzi", "color_name": "Beige", "collection": "Nlgrounded", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27578/3570x2832-fit-67JFekfQbWCuh4MZYaT3h1NtTMXYK5A7nhPYUxXQ.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:47.480109+00:00", "created_at": "2026-02-24T19:09:43.236243+00:00", "updated_at": "2026-04-01T22:23:06.720857+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27578/3570x2832-fit-67JFekfQbWCuh4MZYaT3h1NtTMXYK5A7nhPYUxXQ.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27510/3570x2832-fit-Rp7bthmjWePizQIuWgLoRJyG1o8H2DoX8xCOI1OG.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Stripes", "rooms": "", "color_primary": "White", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist", "Modern"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, modern aesthetic. Its durable construction and neutral color palette make it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 125, "mfr_sku": "220631", "dw_sku": "DWBN-270101", "pattern_name": "Obanzi", "color_name": "Beige", "collection": "Degrounded", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27579/3570x2832-fit-kqFj4zNfwqHmazyCG5zGBBAs8nxOveC2hyPBDyfm.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:48.814296+00:00", "created_at": "2026-02-24T19:09:43.236706+00:00", "updated_at": "2026-04-01T22:23:09.647778+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27579/3570x2832-fit-kqFj4zNfwqHmazyCG5zGBBAs8nxOveC2hyPBDyfm.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27491/3570x2832-fit-orkrLJzscZxecoBGaAdEMsB9gqAuAmGalhhvWa50.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Brown"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, modern aesthetic with its neutral beige color and abstract pattern. Its durable vinyl construction makes it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 126, "mfr_sku": "220632", "dw_sku": "DWBN-270102", "pattern_name": "Obanzi", "color_name": "Beige", "collection": "Nlgrounded", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27580/3570x2832-fit-lFCoe0q1cQ8UmTX8cMt9MAxUAM7qEO4nOK9FUm9t.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:50.416126+00:00", "created_at": "2026-02-24T19:09:43.237236+00:00", "updated_at": "2026-04-01T22:23:12.78829+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27580/3570x2832-fit-lFCoe0q1cQ8UmTX8cMt9MAxUAM7qEO4nOK9FUm9t.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28852/3570x2832-fit-A2cog3URCSO9lFOxVWtrchdQOS7cVuvB4Vrne5oZ.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28853/3570x2832-fit-gO3eiGqtJY2otJy0ZkdRDsAHQqkKidn0yTtAQeYf.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Stripes", "rooms": "", "color_primary": "Grey", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "Brown"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "Obanzi is a durable vinyl wallcovering featuring a subtle, textured abstract pattern. Its neutral beige color and minimalist style make it suitable for a variety of commercial and residential applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 127, "mfr_sku": "220633", "dw_sku": "DWBN-270103", "pattern_name": "Obanzi", "color_name": "Beige", "collection": "Nlgrounded", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27581/3570x2832-fit-YwFfBpwPTPooYP8HmNhJTka446tmN5M6oXO5lVgc.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:51.954284+00:00", "created_at": "2026-02-24T19:09:43.237792+00:00", "updated_at": "2026-04-01T22:23:15.801884+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27581/3570x2832-fit-YwFfBpwPTPooYP8HmNhJTka446tmN5M6oXO5lVgc.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27511/3570x2832-fit-hd24OjuzKHmZaIJYOUI0qDhCMQW0UQX6CsrBaFST.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Stripes", "rooms": "", "color_primary": "Beige", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Gray", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This textured vinyl wallcovering in a neutral beige offers a subtle and modern aesthetic. Its durable and easy-to-clean surface makes it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 84, "mfr_sku": "220783", "dw_sku": "DWBN-270104", "pattern_name": "Dinozoo", "color_name": "Beige", "collection": "Doodleedo", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29082/3570x2832-fit-txTHKqLwQoNyXFr9XpV9O0Webalc1BGuDvK44J1B.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:44.865517+00:00", "created_at": "2026-02-24T19:09:43.2132+00:00", "updated_at": "2026-04-01T22:20:59.0164+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29082/3570x2832-fit-txTHKqLwQoNyXFr9XpV9O0Webalc1BGuDvK44J1B.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27778/3570x2832-fit-LUnnK54lQuizgOUqnDU2oEUdVF6mAS9V1o2sBNTB.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27779/3570x2832-fit-cOo3kzXMS5nUN2hN8GC0mwVkLkWpzhoBK5RsD9V4.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Kids", "rooms": "", "color_primary": "Black, White", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Cream", "Taupe", "Gray"], "ai_styles": ["Traditional", "Classic"], "ai_patterns": ["Animal Print", "Textured"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This textured vinyl wallcovering features a subtle animal print design in neutral beige tones. Its durable construction makes it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 86, "mfr_sku": "220790", "dw_sku": "DWBN-270105", "pattern_name": "Odeer", "color_name": "Beige", "collection": "Nldoodleedo", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28872/3570x2832-fit-PwXvv1rLBtJWPRfg5QF0bcwc78NnEXzA5dvQinAV.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:47.770772+00:00", "created_at": "2026-02-24T19:09:43.214777+00:00", "updated_at": "2026-04-01T22:21:05.553411+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28872/3570x2832-fit-PwXvv1rLBtJWPRfg5QF0bcwc78NnEXzA5dvQinAV.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28873/3570x2832-fit-Tc2EABLQ4J9adyRV12KqdaogQ1sF19HzzIGsqmA1.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Kids, Tropical", "rooms": "", "color_primary": "Beige", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Taupe", "Gray"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige and cream tones. Its minimalist design and durable construction make it suitable for both commercial and residential interiors seeking a touch of understated elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 87, "mfr_sku": "220791", "dw_sku": "DWBN-270106", "pattern_name": "Odeer", "color_name": "Beige", "collection": "Nldoodleedo", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": "25.2\"", "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28874/3570x2832-fit-pAylNAWB2ow4ImUkPvqqxgcg5wwjvvp8QGPB0HAh.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:49.362615+00:00", "created_at": "2026-02-24T19:09:43.215409+00:00", "updated_at": "2026-04-01T22:21:08.797007+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28874/3570x2832-fit-pAylNAWB2ow4ImUkPvqqxgcg5wwjvvp8QGPB0HAh.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27781/3570x2832-fit-UT3wkweGqzKBQ7iQvUGgKej0tRQLAsGEmYTitQmx.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Kids, Tropical", "rooms": "", "color_primary": "Pink", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This textured vinyl wallcovering offers a subtle, modern aesthetic with a durable and easy-to-clean surface. Its neutral beige tone and minimalist design make it suitable for a variety of commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 88, "mfr_sku": "220792", "dw_sku": "DWBN-270107", "pattern_name": "Odeer", "color_name": "Beige", "collection": "Dedoodleedo", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28875/3570x2832-fit-xtj34mgGUvDJ4wUSwhc9mgNhl0SRNBw9tTWFQJJb.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:50.92738+00:00", "created_at": "2026-02-24T19:09:43.216072+00:00", "updated_at": "2026-04-01T22:21:11.97298+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28875/3570x2832-fit-xtj34mgGUvDJ4wUSwhc9mgNhl0SRNBw9tTWFQJJb.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28876/3570x2832-fit-bJUbjb1RytvrHfzWzoifPeIvIOO95tVI5QPqHLur.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle textured pattern in a neutral beige tone, perfect for high-traffic commercial spaces. Its minimalist design and easy-to-clean surface make it a practical and stylish choice.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 89, "mfr_sku": "220793", "dw_sku": "DWBN-270108", "pattern_name": "Odeer", "color_name": "Beige", "collection": "Frdoodleedo", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28879/3570x2832-fit-JvrzaFd9bA4P2T7TfGKHebmac2Pvgx21wPehpQhO.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:52.478091+00:00", "created_at": "2026-02-24T19:09:43.216644+00:00", "updated_at": "2026-04-01T22:21:15.229682+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28879/3570x2832-fit-JvrzaFd9bA4P2T7TfGKHebmac2Pvgx21wPehpQhO.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28880/3570x2832-fit-qbiHOY8Yx3BCim7Vmf7cKywxN33kWIGV1oCBCx3a.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist", "Neutral"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured design in neutral beige tones. Its minimalist aesthetic and durable construction make it suitable for both commercial and residential applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 90, "mfr_sku": "220794", "dw_sku": "DWBN-270109", "pattern_name": "Odeer", "color_name": "Beige", "collection": "Frdoodleedo", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28877/3570x2832-fit-lSnYKEs0vQptmAQ6D5L5QavkIE2SUjsHDcCjiP0N.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:54.039846+00:00", "created_at": "2026-02-24T19:09:43.217218+00:00", "updated_at": "2026-04-01T22:21:18.4597+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28877/3570x2832-fit-lSnYKEs0vQptmAQ6D5L5QavkIE2SUjsHDcCjiP0N.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28878/3570x2832-fit-MR1JRvOv60tZTnflz5muBnjrA1BSUpyMaDLVY7Ks.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in a neutral beige tone. Its minimalist design and durable construction make it suitable for both commercial and residential applications.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 85, "mfr_sku": "220802", "dw_sku": "DWBN-270110", "pattern_name": "Mix Match", "color_name": "Beige", "collection": "Doodleedo", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29088/3570x2832-fit-yHZuxxpHeroLOvcjN11UyumvUN2Zm5AsszHnLgEF.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:46.20264+00:00", "created_at": "2026-02-24T19:09:43.214015+00:00", "updated_at": "2026-04-01T22:21:02.132413+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29088/3570x2832-fit-yHZuxxpHeroLOvcjN11UyumvUN2Zm5AsszHnLgEF.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29092/3570x2832-fit-wkOFXePMGOmOSWCLpp7JqH94xEZCikGKhSodualk.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Plain", "rooms": "", "color_primary": "Green", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured abstract pattern in neutral beige tones. Its minimalist design makes it suitable for a variety of commercial and residential spaces seeking a modern and understated aesthetic.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 175, "mfr_sku": "220804", "dw_sku": "DWBN-270111", "pattern_name": "Mix Match", "color_name": "Beige", "collection": "Dedoodleedo", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29093/3570x2832-fit-ZY7tertll4ZhebeUffb9GbBqMGIgJNDynNbSUfR5.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:02.471973+00:00", "created_at": "2026-02-24T19:09:43.271802+00:00", "updated_at": "2026-04-01T22:25:37.991292+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29093/3570x2832-fit-ZY7tertll4ZhebeUffb9GbBqMGIgJNDynNbSUfR5.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29094/3570x2832-fit-WWQJHg4IJ8zADReIUmVPb85cRvtbMuLcx9CIeMSx.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Brown", "White", "Gray"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This durable vinyl wallcovering features a subtle, textured pattern in a neutral beige tone. Ideal for high-traffic commercial or residential spaces, it offers a modern and minimalist aesthetic with easy maintenance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 74, "mfr_sku": "220859", "dw_sku": "DWBN-270113", "pattern_name": "Chapter One", "color_name": "Beige", "collection": "Color Stories New", "product_type": "Wallcovering", "width": "53 cm", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28293/3570x2832-fit-wgneo4FNkk8SjouhYYixUNxCdTvRVMVSsA4zCIlV.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:29.443171+00:00", "created_at": "2026-02-24T19:09:43.204577+00:00", "updated_at": "2026-04-01T22:20:26.868753+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28293/3570x2832-fit-wgneo4FNkk8SjouhYYixUNxCdTvRVMVSsA4zCIlV.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28295/3570x2832-fit-FblsyQEbCzzGLPqL4JzjbUxWQdQjOzr6cLDYOs0e.jpg\"]", "fire_rating": "", "finish": "Scrubbable", "application": "", "match_type": "", "coverage": "", "features": "Washable, Scrubbable", "design": "Plain", "rooms": "", "color_primary": "Beige", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 20.87, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured design in a neutral beige tone. Its minimalist aesthetic makes it suitable for a variety of commercial and residential spaces seeking a touch of understated elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 171, "mfr_sku": "300331", "dw_sku": "DWBN-270114", "pattern_name": "Almondblossombyvangogh", "color_name": "Beige", "collection": "Van Gogh 2", "product_type": "Commercial Wallcovering", "width": "57.09\"", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24549/3570x2832-fit-UaIZNAExRwckHmmXKYosbdhHQP0pi4eXE2sFJYXB.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:34:56.310323+00:00", "created_at": "2026-02-24T19:09:43.269915+00:00", "updated_at": "2026-04-01T22:25:25.675703+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24549/3570x2832-fit-UaIZNAExRwckHmmXKYosbdhHQP0pi4eXE2sFJYXB.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24550/3570x2832-fit-vqNyRmiJXgPp3LtynIbWzT10VX52a250E0NpZEc6.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "W: 57.09\" x H: 57.09\"", "features": "Washable", "design": "Classic", "rooms": "", "color_primary": "Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Blue", "Gray", "Brown", "White"], "ai_styles": ["Traditional", "Classic", "Artistic"], "ai_patterns": ["Floral", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 57.09, "on_shopify": false, "ai_description": "This wallcovering features a delicate floral design inspired by Van Gogh's Almond Blossom, bringing a touch of classic artistry to any space. The soft color palette and non-woven material create a sophisticated and inviting atmosphere.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 72, "mfr_sku": "300338", "dw_sku": "DWBN-270115", "pattern_name": "Dark Ferns", "color_name": "Green", "collection": "Circles", "product_type": "Commercial Wallcovering", "width": "57.09\"", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24450/3570x2832-fit-2aQebRiBnCgJRKfTjvNacQIt5F9qUu3pcUtJhnXe.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:26.127549+00:00", "created_at": "2026-02-24T19:09:43.202873+00:00", "updated_at": "2026-04-01T22:20:20.301344+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24450/3570x2832-fit-2aQebRiBnCgJRKfTjvNacQIt5F9qUu3pcUtJhnXe.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24481/3570x2832-fit-YCBf1yA7xeF2teAbVu6fXqAG1Sj80W4h3mE0hg9Z.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "W: 57.09\" x H: 57.09\"", "features": "Washable", "design": "Flowers", "rooms": "", "color_primary": "Green", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#364132", "ai_colors": ["Green", "Dark Green", "Olive Green", "Brown", "Beige"], "ai_styles": ["Tropical", "Nature-Inspired"], "ai_patterns": ["Botanical", "Fern", "Leaf"], "ai_background_color": "Green", "ai_tags": null, "width_inches": 57.09, "on_shopify": false, "ai_description": "This non-woven wallcovering features a dense, dark green fern pattern, creating a lush, tropical ambiance. Ideal for bringing a touch of nature indoors, this design is suitable for both residential and commercial spaces seeking an organic aesthetic.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 73, "mfr_sku": "300340", "dw_sku": "DWBN-270116", "pattern_name": "Indoor Flowersbymijkekonijn", "color_name": "Beige", "collection": "Circles", "product_type": "Commercial Wallcovering", "width": "57.09\"", "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24646/3570x2832-fit-PCBiHQv9t3K3tl3cVLY2pJ2k3ke31mZRYhgTIITI.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:27.811814+00:00", "created_at": "2026-02-24T19:09:43.203488+00:00", "updated_at": "2026-04-01T22:20:23.693043+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24646/3570x2832-fit-PCBiHQv9t3K3tl3cVLY2pJ2k3ke31mZRYhgTIITI.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/24650/3570x2832-fit-5trwTSEBnQiwdZ2ckZibezm9dkuFilQcA7si0iME.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "W: 57.09\" x H: 57.09\"", "features": "Washable", "design": "Flowers", "rooms": "", "color_primary": "Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "White", "Light Gray", "Brown", "Green"], "ai_styles": ["Contemporary", "Modern"], "ai_patterns": ["Floral", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": 57.09, "on_shopify": false, "ai_description": "This contemporary non-woven wallcovering features a delicate floral design in neutral tones. Its light and airy aesthetic makes it suitable for both residential and commercial interiors seeking a touch of organic elegance.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "unknown", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 118, "mfr_sku": "300411", "dw_sku": "DWBN-270117", "pattern_name": "Rainforest", "color_name": "Beige", "collection": "Grand Safari", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26997/3570x2832-fit-rmJUyzdyeFDpBqIOsMxjTNtOmzLNokiBp81YLQTB.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:33:37.958767+00:00", "created_at": "2026-02-24T19:09:43.233144+00:00", "updated_at": "2026-04-01T22:22:47.440483+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/26997/3570x2832-fit-rmJUyzdyeFDpBqIOsMxjTNtOmzLNokiBp81YLQTB.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27065/3570x2832-fit-lrthNEqxYevcu4pehHU61l3RsxM2nfClMK1joiKM.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Tropical", "rooms": "", "color_primary": "Green", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Taupe", "Cream", "Green"], "ai_styles": ["Natural", "Organic"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This Rainforest wallcovering evokes a sense of natural tranquility with its textured, organic design. The neutral color palette and subtle pattern make it a versatile choice for both residential and commercial spaces seeking a sophisticated, calming atmosphere.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 70, "mfr_sku": "300419", "dw_sku": "DWBN-270118", "pattern_name": "Greenery", "color_name": "Beige", "collection": "Bn Studio Collection", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28459/3570x2832-fit-ceyJhNxoVLRYuoMnzS1GzJWQOnqKIDLHply69gqE.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:23.455769+00:00", "created_at": "2026-02-24T19:09:43.198129+00:00", "updated_at": "2026-04-01T22:20:13.818743+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28459/3570x2832-fit-ceyJhNxoVLRYuoMnzS1GzJWQOnqKIDLHply69gqE.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28466/3570x2832-fit-Te9rkmMFUtkR05QsdBuIsB8xH6agcmCesE7FK5xm.jpg\"]", "fire_rating": "", "finish": "Non-washable", "application": "", "match_type": "", "coverage": "", "features": "", "design": "Tropical, Flowers", "rooms": "", "color_primary": "Green", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Taupe", "Light Gray", "White"], "ai_styles": ["Contemporary", "Minimalist", "Natural"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in neutral beige tones, creating a calming and sophisticated atmosphere. Its minimalist design and natural aesthetic make it suitable for a variety of interior spaces, adding depth and warmth without overwhelming the overall design.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 216, "mfr_sku": "300437", "dw_sku": "DWBN-270119", "pattern_name": "Dinoland", "color_name": "Beige", "collection": "Frdoodleedo", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28963/3570x2832-fit-bqsLXcsQ6VvkBU7TEDCF7DSRGmJqnXkzNLMV2zq2.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:15.315764+00:00", "created_at": "2026-02-24T19:09:43.287036+00:00", "updated_at": "2026-04-01T22:25:57.73972+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/28963/3570x2832-fit-bqsLXcsQ6VvkBU7TEDCF7DSRGmJqnXkzNLMV2zq2.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/29026/3570x2832-fit-DZkW5hdR40HNjA5erSTXe5Kr1weAqwHe2kGtOzX8.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Cream", "Gray"], "ai_styles": ["Contemporary", "Modern"], "ai_patterns": ["Abstract", "Textured"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This textured vinyl wallcovering features a subtle abstract pattern in neutral beige tones. Its durable construction makes it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 92, "mfr_sku": "30566", "dw_sku": "DWBN-270122", "pattern_name": "Italianlandscapewithumbrellapinesbyhendrikvoogd", "color_name": "Beige", "collection": "Famous Painters", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19483/3570x2832-fit-ReR2TZnkZZ4jPZF4UfIlaeO4M0k1UZyXObJHMRnc.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:57.325314+00:00", "created_at": "2026-02-24T19:09:43.218289+00:00", "updated_at": "2026-04-01T22:21:25.056444+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19483/3570x2832-fit-ReR2TZnkZZ4jPZF4UfIlaeO4M0k1UZyXObJHMRnc.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20935/3570x2832-fit-sAPBgefR268gqTfROIGo111XhS6JX3s7glkHkmdT.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Classic, Art", "rooms": "", "color_primary": "Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Brown", "Green", "Gray", "White", "Taupe"], "ai_styles": ["Traditional", "Scenic"], "ai_patterns": ["Landscape", "Nature"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This wallcovering features a classic Italian landscape scene with umbrella pines, creating a serene and timeless atmosphere. The neutral color palette and detailed imagery make it suitable for adding a touch of elegance to residential or hospitality spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 234, "mfr_sku": "30602", "dw_sku": "DWBN-270123", "pattern_name": "Theworld", "color_name": "Beige", "collection": "Frriviera Maison", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19468/3570x2832-fit-SKJR6UG5BLWKishsZQfECTc6Eo9fwvgc4LBdBo6F.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:16.88783+00:00", "created_at": "2026-02-24T19:09:43.295397+00:00", "updated_at": "2026-04-01T22:26:00.998737+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/19468/3570x2832-fit-SKJR6UG5BLWKishsZQfECTc6Eo9fwvgc4LBdBo6F.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/20919/3570x2832-fit-4z1QE7yPze6CrBFnvR7UZMuehuyz9NJ7FDbpK5zb.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured design in neutral beige tones. Its minimalist aesthetic and durable construction make it suitable for both commercial and residential interiors.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 91, "mfr_sku": "300443", "dw_sku": "DWBN-270120", "pattern_name": "Strawberry Fieldxl", "color_name": "Beige", "collection": "Doodleedo", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27369/3570x2832-fit-0SyAwbJ15cbmTvZ2TM4Ay4qwkmQXppDwoTvSuhZV.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:32:55.645595+00:00", "created_at": "2026-02-24T19:09:43.217761+00:00", "updated_at": "2026-04-01T22:21:21.697956+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27369/3570x2832-fit-0SyAwbJ15cbmTvZ2TM4Ay4qwkmQXppDwoTvSuhZV.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/27804/3570x2832-fit-ohBSSqY3v8SiilO7H50OTtQ5A3nFJ1VhgRIFe4bC.jpg\"]", "fire_rating": "", "finish": "Washable", "application": "", "match_type": "", "coverage": "", "features": "Washable", "design": "Kids, Tropical", "rooms": "", "color_primary": "Multicolour", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Light Gray", "White", "Taupe"], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This non-woven wallcovering features a subtle, textured pattern in neutral beige tones, creating a sophisticated and calming atmosphere. Its durable construction makes it suitable for high-traffic commercial and residential spaces.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
+{"id": 174, "mfr_sku": "300451", "dw_sku": "DWBN-270121", "pattern_name": "Marble", "color_name": "Beige", "collection": "Debn Studio Collection", "product_type": "Wallcovering", "width": null, "length": null, "repeat_v": null, "repeat_h": null, "material": null, "price_retail": null, "price_trade": null, "image_url": "https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/30098/3570x2832-fit-GsF9w8X2vTnh6IQPcw05EvLWEzeDMRzMT9hBbiR6.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-03-15T16:35:00.876735+00:00", "created_at": "2026-02-24T19:09:43.2712+00:00", "updated_at": "2026-04-01T22:25:34.904197+00:00", "all_images": "[\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/30098/3570x2832-fit-GsF9w8X2vTnh6IQPcw05EvLWEzeDMRzMT9hBbiR6.jpg\",\"https://bn-walls.s3.eu-central-1.amazonaws.com/image-responsive/30114/3570x2832-fit-XkMziUsFzJkgHQmD0EiLJnRO2UROIDP7kXqius1Y.jpg\"]", "fire_rating": "", "finish": "", "application": "", "match_type": "", "coverage": "", "features": "", "design": "Marble", "rooms": "", "color_primary": "", "color_secondary": "", "us_distributor": "", "showroom_locations": "", "about_vendor": "", "color_hex": "#F5F5DC", "ai_colors": ["Beige", "Cream", "Gray", "Taupe", "White"], "ai_styles": ["Contemporary", "Minimalist", "Modern"], "ai_patterns": ["Abstract", "Textured", "Marble"], "ai_background_color": "Beige", "ai_tags": null, "width_inches": null, "on_shopify": false, "ai_description": "This vinyl wallcovering features a subtle marble texture in neutral tones, perfect for adding depth and sophistication to any space. Its durable construction makes it ideal for high-traffic areas in both commercial and residential settings.", "dominant_color_hex": null, "image_rejected": false, "image_rejection_reason": null, "repeat_classification": null, "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": null}
diff --git a/vendors/rebel_walls/viewer/fieldmap.json b/vendors/rebel_walls/viewer/fieldmap.json
new file mode 100644
index 0000000..6ec8a91
--- /dev/null
+++ b/vendors/rebel_walls/viewer/fieldmap.json
@@ -0,0 +1,6 @@
+{
+ "title": "Rebel Walls",
+ "samples_only": true,
+ "vendor_code": "rebel_walls",
+ "subdomain": "rebel-walls"
+}
diff --git a/vendors/rebel_walls/viewer/public/buybutton.js b/vendors/rebel_walls/viewer/public/buybutton.js
new file mode 100644
index 0000000..f479e9a
--- /dev/null
+++ b/vendors/rebel_walls/viewer/public/buybutton.js
@@ -0,0 +1,70 @@
+/* Shopify sample checkout for the DW vendor microsites.
+ *
+ * These vendor lines are OFF Shopify (no per-product Shopify variant), so "Request
+ * Sample" cannot add a per-product variant. Instead it uses ONE generic "Memo Sample"
+ * Shopify product/variant and adds it to a real Shopify cart once per requested swatch,
+ * carrying each swatch's pattern/color/SKU/vendor as line-item custom properties, then
+ * opens Shopify's secure hosted checkout. The order line-items tell fulfillment which
+ * swatches to pull.
+ *
+ * Config is injected by the server at /config.js as window.DWV_CFG = {
+ * domain: '<store>.myshopify.com', storefrontToken: '<token>', sampleVariantId: '<gid or numeric>'
+ * }. Until storefrontToken + sampleVariantId are set, this falls back to the no-payment
+ * JSONL sample-request endpoint (POST /api/sample-request) so the button always works.
+ */
+(function () {
+ var CFG = window.DWV_CFG || {};
+ var ready = CFG.storefrontToken && CFG.sampleVariantId && CFG.domain;
+ var client = null, checkoutId = null;
+
+ function loadSDK(cb) {
+ if (window.ShopifyBuy && window.ShopifyBuy.buildClient) return cb();
+ var s = document.createElement('script');
+ s.src = 'https://sdks.shopifycdn.com/js-buy-sdk/latest/index.umd.min.js';
+ s.onload = cb; s.onerror = function () { ready = false; cb(); };
+ document.head.appendChild(s);
+ }
+
+ function ensureClient(cb) {
+ if (client) return cb();
+ loadSDK(function () {
+ if (!window.ShopifyBuy || !ready) { ready = false; return cb(); }
+ client = window.ShopifyBuy.buildClient({ domain: CFG.domain, storefrontAccessToken: CFG.storefrontToken });
+ client.checkout.create().then(function (co) { checkoutId = co.id; cb(); }).catch(function () { ready = false; cb(); });
+ });
+ }
+
+ // items: [{sku, mfr_sku, pattern_name, color_name, line}] -> Shopify checkout
+ function shopifyCheckout(items, contact) {
+ return new Promise(function (resolve, reject) {
+ ensureClient(function () {
+ if (!ready || !client || !checkoutId) return reject(new Error('shopify-unavailable'));
+ var lines = items.slice(0, 250).map(function (it) {
+ return {
+ variantId: CFG.sampleVariantId,
+ quantity: 1,
+ customAttributes: [
+ { key: 'Pattern', value: String(it.pattern_name || it.sku || '') },
+ { key: 'Color', value: String(it.color_name || '') },
+ { key: 'SKU', value: String(it.mfr_sku || it.sku || '') },
+ { key: 'Line', value: String(it.line || '') }
+ ]
+ };
+ });
+ var attrs = [];
+ if (contact && contact.name) attrs.push({ key: 'Requested by', value: contact.name });
+ var p = client.checkout.addLineItems(checkoutId, lines);
+ p.then(function (co) {
+ if (attrs.length) return client.checkout.updateAttributes(checkoutId, { customAttributes: attrs }).then(function () { return co; });
+ return co;
+ }).then(function (co) { window.location.href = co.webUrl; resolve(co); }).catch(reject);
+ });
+ });
+ }
+
+ // Expose for the viewer's sample modal. Returns true if Shopify path is wired.
+ window.DWV_SAMPLE = {
+ available: function () { return !!ready; },
+ checkout: shopifyCheckout
+ };
+})();
diff --git a/vendors/rebel_walls/viewer/public/index.html b/vendors/rebel_walls/viewer/public/index.html
new file mode 100644
index 0000000..ce0d82b
--- /dev/null
+++ b/vendors/rebel_walls/viewer/public/index.html
@@ -0,0 +1,414 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="robots" content="noindex, nofollow">
+<title>Trade Lines</title>
+<style>
+ :root{
+ --cols: 5; /* density-driven grid columns */
+ --ink:#1c1a17; --muted:#6f6a62; --line:#e7e2da; --bg:#faf8f4; --card:#fff;
+ --accent:#7a6a52; --accent2:#3c5a4a;
+ }
+ *{box-sizing:border-box}
+ html,body{margin:0}
+ body{font:15px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;color:var(--ink);background:var(--bg)}
+ a{color:inherit}
+ header.top{padding:22px 24px 12px;border-bottom:1px solid var(--line);background:#fff;position:sticky;top:0;z-index:30}
+ .brand{font-size:24px;letter-spacing:.04em;font-weight:600}
+ .brand small{display:block;font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--muted);font-weight:500;margin-top:3px}
+ .count{color:var(--muted);font-size:13px;margin-left:auto}
+ .toprow{display:flex;align-items:flex-end;gap:18px;flex-wrap:wrap}
+ /* controls bar */
+ .controls{display:flex;gap:14px;align-items:center;flex-wrap:wrap;padding:12px 24px;border-bottom:1px solid var(--line);background:#fff;position:sticky;top:73px;z-index:20}
+ .controls label{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);display:flex;flex-direction:column;gap:4px}
+ select,input[type=search],input[type=text],input[type=email],textarea{font:inherit;padding:7px 9px;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink)}
+ input[type=range]{width:120px}
+ .grow{flex:1;min-width:180px}
+ .density{display:flex;flex-direction:column;gap:4px}
+ .cartbtn{margin-left:auto;background:var(--ink);color:#fff;border:none;border-radius:8px;padding:9px 16px;font-weight:600;cursor:pointer;letter-spacing:.02em}
+ .cartbtn .n{display:inline-block;background:var(--accent2);border-radius:20px;padding:1px 8px;margin-left:6px;font-size:12px}
+ /* active-filter chips bar */
+ .activebar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:10px 24px;border-bottom:1px solid var(--line);background:#fcfbf8}
+ .activebar.empty{display:none}
+ .achip{display:inline-flex;align-items:center;gap:6px;background:var(--ink);color:#fff;border-radius:20px;padding:4px 6px 4px 11px;font-size:12.5px;line-height:1}
+ .achip .k{opacity:.6;text-transform:uppercase;letter-spacing:.06em;font-size:10px}
+ .achip .x{border:none;background:rgba(255,255,255,.2);color:#fff;border-radius:50%;width:18px;height:18px;cursor:pointer;font-size:13px;line-height:1;padding:0}
+ .clearall{margin-left:auto;border:1px solid var(--line);background:#fff;border-radius:7px;padding:6px 12px;cursor:pointer;font-size:12.5px}
+ /* layout */
+ .wrap{display:flex;align-items:flex-start}
+ aside{width:248px;flex:0 0 248px;padding:18px 16px 60px;border-right:1px solid var(--line);position:sticky;top:135px;max-height:calc(100vh - 135px);overflow:auto}
+ aside h3{font-size:11px;text-transform:uppercase;letter-spacing:.12em;color:var(--muted);margin:18px 0 8px}
+ aside h3:first-child{margin-top:0}
+ /* facet CHIPS (toggle, multi-select) */
+ .chips{display:flex;flex-wrap:wrap;gap:6px}
+ .chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:#fff;border-radius:18px;padding:4px 10px;font-size:12.5px;cursor:pointer;user-select:none}
+ .chip .cc{color:var(--muted);font-size:10.5px}
+ .chip.on{background:var(--ink);color:#fff;border-color:var(--ink)}
+ .chip.on .cc{color:rgba(255,255,255,.7)}
+ .chip.zero{opacity:.38;cursor:default;pointer-events:none}
+ .chip .swatch{width:11px;height:11px;border-radius:50%;border:1px solid rgba(0,0,0,.2);flex:0 0 auto}
+ .facet-search{width:100%;margin-bottom:8px;padding:5px 8px;font-size:13px}
+ .facet-scroll{max-height:230px;overflow:auto;padding-right:4px}
+ .clearbtn{margin-top:14px;width:100%;padding:8px;border:1px solid var(--line);background:#fff;border-radius:7px;cursor:pointer;font-size:13px}
+ main{flex:1;padding:18px 24px 80px;min-width:0}
+ .grid{display:grid;grid-template-columns:repeat(var(--cols),minmax(0,1fr));gap:14px}
+ /* MINIMAL image-forward cards: image + hex dot(s) only; detail on hover/focus */
+ .card{position:relative;background:var(--card);border:1px solid var(--line);border-radius:10px;overflow:hidden;display:flex;flex-direction:column}
+ .card .imgwrap{aspect-ratio:1/1;background:#f1ede6;overflow:hidden;position:relative}
+ .card img{width:100%;height:100%;object-fit:cover;display:block}
+ .card .dots{position:absolute;left:8px;bottom:8px;display:flex;gap:4px;z-index:2}
+ .card .dot{width:14px;height:14px;border-radius:50%;border:1px solid rgba(255,255,255,.85);box-shadow:0 0 0 1px rgba(0,0,0,.18)}
+ /* reveal overlay (hover or .open via click) */
+ .reveal{position:absolute;inset:auto 0 0 0;background:linear-gradient(to top,rgba(20,18,15,.92),rgba(20,18,15,.78) 60%,rgba(20,18,15,0));color:#fff;padding:30px 11px 11px;transform:translateY(101%);transition:transform .18s ease;display:flex;flex-direction:column;gap:3px}
+ .card:hover .reveal,.card.open .reveal,.card:focus-within .reveal{transform:translateY(0)}
+ .reveal .ptitle{font-weight:600;font-size:13.5px;line-height:1.25}
+ .reveal .rmeta{font-size:11.5px;color:rgba(255,255,255,.82)}
+ .reveal .badge{display:inline-block;font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;background:rgba(255,255,255,.16);border-radius:20px;padding:2px 7px;align-self:flex-start;margin-bottom:1px}
+ .reqbtn{margin-top:6px;border:1px solid #fff;background:transparent;color:#fff;border-radius:7px;padding:6px;font-size:12px;font-weight:600;cursor:pointer}
+ .reqbtn.in{background:var(--accent2);border-color:var(--accent2)}
+ #sentinel{height:60px}
+ .status{text-align:center;color:var(--muted);padding:24px;font-size:13px}
+ /* modal */
+ .overlay{position:fixed;inset:0;background:rgba(28,26,23,.45);display:none;align-items:flex-start;justify-content:center;z-index:50;padding:40px 16px;overflow:auto}
+ .overlay.open{display:flex}
+ .modal{background:#fff;border-radius:12px;max-width:560px;width:100%;padding:22px 24px 26px}
+ .modal h2{margin:0 0 4px;font-size:20px}
+ .modal p.sub{margin:0 0 16px;color:var(--muted);font-size:13px}
+ .cartlist{max-height:230px;overflow:auto;border:1px solid var(--line);border-radius:8px;margin-bottom:16px}
+ .citem{display:flex;align-items:center;gap:10px;padding:8px 10px;border-bottom:1px solid var(--line);font-size:13px}
+ .citem:last-child{border-bottom:none}
+ .citem img{width:42px;height:42px;object-fit:cover;border-radius:6px;background:#eee}
+ .citem .x{margin-left:auto;border:none;background:none;color:var(--muted);cursor:pointer;font-size:18px}
+ .field{display:flex;flex-direction:column;gap:4px;margin-bottom:11px}
+ .field label{font-size:12px;color:var(--muted)}
+ .row2{display:flex;gap:11px}.row2 .field{flex:1}
+ .submit{width:100%;background:var(--ink);color:#fff;border:none;border-radius:8px;padding:12px;font-weight:600;font-size:15px;cursor:pointer;margin-top:4px}
+ .submit:disabled{opacity:.5;cursor:default}
+ .closex{float:right;border:none;background:none;font-size:22px;cursor:pointer;color:var(--muted);line-height:1}
+ .ok{background:#eef5ef;border:1px solid #cfe3d4;color:#2c5d3c;padding:12px;border-radius:8px;font-size:14px}
+ @media(max-width:820px){aside{display:none}.controls{top:auto;position:static}}
+</style>
+</head>
+<body>
+<header class="top">
+ <div class="toprow">
+ <div class="brand" id="brand">Trade Lines<small>Designer Wallcoverings</small></div>
+ <div class="count" id="count">loading…</div>
+ </div>
+</header>
+
+<div class="controls">
+ <label class="grow">Search
+ <input type="search" id="q" placeholder="pattern, color, SKU, collection…" autocomplete="off">
+ </label>
+ <label>Sort
+ <select id="sort">
+ <option value="newest">Newest</option>
+ <option value="family">Color Family</option>
+ <option value="style">Style</option>
+ <option value="pattern">Pattern A→Z</option>
+ <option value="color_name">Color name A→Z</option>
+ <option value="collection">Collection A→Z</option>
+ <option value="line">Line</option>
+ <option value="product_type">Product Type</option>
+ <option value="material">Material</option>
+ <option value="light">Light → Dark</option>
+ <option value="dark">Dark → Light</option>
+ <option value="hue">Color Wheel (hue)</option>
+ <option value="sku">SKU A→Z</option>
+ </select>
+ </label>
+ <label class="density">Density
+ <input type="range" id="density" min="2" max="8" step="1" value="5">
+ </label>
+ <button class="cartbtn" id="cartbtn">Request Samples<span class="n" id="cartn">0</span></button>
+</div>
+
+<!-- active-filter chips -->
+<div class="activebar empty" id="activebar"></div>
+
+<div class="wrap">
+ <aside id="facets"></aside>
+ <main>
+ <div class="grid" id="grid"></div>
+ <div id="sentinel"></div>
+ <div class="status" id="status"></div>
+ </main>
+</div>
+
+<!-- sample request modal -->
+<div class="overlay" id="overlay">
+ <div class="modal">
+ <button class="closex" id="closex">×</button>
+ <h2>Request Samples</h2>
+ <p class="sub">No payment — we’ll mail trade samples of the items below.</p>
+ <div id="formArea">
+ <div class="cartlist" id="cartlist"></div>
+ <form id="reqform">
+ <div class="row2">
+ <div class="field"><label>Name *</label><input type="text" name="name" required></div>
+ <div class="field"><label>Email *</label><input type="email" name="email" required></div>
+ </div>
+ <div class="row2">
+ <div class="field"><label>Company / Studio</label><input type="text" name="company"></div>
+ <div class="field"><label>Phone</label><input type="text" name="phone"></div>
+ </div>
+ <div class="field"><label>Shipping address</label><textarea name="address" rows="2"></textarea></div>
+ <div class="field"><label>Notes</label><textarea name="notes" rows="2" placeholder="Optional"></textarea></div>
+ <button class="submit" id="submitbtn" type="submit">Submit sample request</button>
+ </form>
+ </div>
+ <div id="doneArea" style="display:none"></div>
+ </div>
+</div>
+
+<script>
+// per-vendor localStorage namespace (set after /api/config so two microsites don't collide)
+let NS = 'dwvm';
+const LS = {
+ get:(k,d)=>{try{const v=localStorage.getItem(NS+'.'+k);return v==null?d:JSON.parse(v);}catch{return d;}},
+ set:(k,v)=>{try{localStorage.setItem(NS+'.'+k,JSON.stringify(v));}catch{}}
+};
+const $ = (s)=>document.querySelector(s);
+const grid=$('#grid'), statusEl=$('#status'), countEl=$('#count');
+
+// approximate swatch color per family (for the chip dot)
+const FAMILY_SWATCH = {
+ 'Red':'#c0392b','Orange/Brown':'#b5651d','Yellow':'#e1c340','Green':'#4a7c3f','Teal':'#2a9d8f',
+ 'Blue':'#3a6ea5','Purple':'#7e57c2','Pink':'#e08aa8','Neutral/Beige':'#d8cbb3','Black':'#222',
+ 'Grey':'#9a9a9a','White':'#f4f4f0'
+};
+// pretty labels for the active-chip key
+const FACET_LABEL = {family:'Color',style:'Style',material_bucket:'Material',enriched:'Status',line:'Line',product_type:'Type',collection:'Collection'};
+
+// ---- persisted UI state ----
+let sort, density, cart, active;
+let offset=0, total=0, loading=false, done=false;
+const LIMIT=60;
+
+function qs(){
+ const p=new URLSearchParams();
+ p.set('sort',sort); p.set('offset',offset); p.set('limit',LIMIT);
+ const q=$('#q').value.trim(); if(q) p.set('q',q);
+ for(const k of Object.keys(active)){ if(active[k] && active[k].length) p.set(k, active[k].join('|')); }
+ return p.toString();
+}
+function reset(){ offset=0; total=0; done=false; grid.innerHTML=''; statusEl.textContent=''; renderActive(); load(); }
+
+async function load(){
+ if(loading||done) return;
+ loading=true; statusEl.textContent='loading…';
+ try{
+ const r=await fetch('/api/skus?'+qs());
+ const d=await r.json();
+ total=d.total;
+ for(const row of d.rows) grid.appendChild(card(row));
+ offset += d.rows.length;
+ if(offset>=total || d.rows.length===0) done=true;
+ countEl.textContent = total.toLocaleString()+' of '+d.all.toLocaleString()+' products';
+ statusEl.textContent = done ? (total? 'End of results — '+total.toLocaleString()+' shown' : 'No products match your filters.') : '';
+ }catch(e){ statusEl.textContent='Error loading products.'; }
+ loading=false;
+}
+
+function inCart(sku){ return cart.some(c=>c.sku===sku); }
+function esc(s){ return String(s==null?'':s).replace(/[&<>"]/g,c=>({'&':'&','<':'<','>':'>','"':'"'}[c])); }
+
+// MINIMAL card: image + hex dot(s) only; everything else in hover/click reveal
+function card(row){
+ const el=document.createElement('div'); el.className='card'; el.tabIndex=0;
+ const img = row.image ? `<img loading="lazy" src="${row.image}" alt="${esc(row.pattern_name)}" onerror="this.style.opacity=.25">` : '';
+ let dots='';
+ if(row.color_hex) dots += `<span class="dot" style="background:${row.color_hex}" title="${row.color_hex}"></span>`;
+ if(!row.color_hex && row.family) dots += `<span class="dot" style="background:${FAMILY_SWATCH[row.family]||'#bbb'}" title="${esc(row.family)}"></span>`;
+ const lineBadge = row.line ? `<span class="badge">${esc(row.line)}</span>` : '';
+ el.innerHTML = `
+ <div class="imgwrap">
+ ${img}
+ <div class="dots">${dots}</div>
+ <div class="reveal">
+ ${lineBadge}
+ <div class="ptitle">${esc(row.pattern_name)}</div>
+ <div class="rmeta">${esc(row.color_name||'—')}${row.family?' · '+esc(row.family):''}</div>
+ ${row.collection?`<div class="rmeta">${esc(row.collection)}</div>`:''}
+ <button class="reqbtn ${inCart(row.sku)?'in':''}" data-sku="${esc(row.sku)}">${inCart(row.sku)?'✓ In sample request':'Request Sample'}</button>
+ </div>
+ </div>`;
+ // click anywhere on card (not the button) toggles the reveal open (touch/click reveal)
+ el.addEventListener('click',(e)=>{ if(e.target.closest('.reqbtn')) return; el.classList.toggle('open'); });
+ el.querySelector('.reqbtn').addEventListener('click',(e)=>{e.stopPropagation();toggleCart(row, e.currentTarget);});
+ return el;
+}
+
+// ---- cart ----
+function toggleCart(row, btn){
+ if(inCart(row.sku)){ cart=cart.filter(c=>c.sku!==row.sku); }
+ else cart.push({sku:row.sku,mfr_sku:row.mfr_sku,pattern_name:row.pattern_name,color_name:row.color_name,line:row.line,image:row.image});
+ LS.set('cart',cart);
+ if(btn){ btn.classList.toggle('in',inCart(row.sku)); btn.textContent=inCart(row.sku)?'✓ In sample request':'Request Sample'; }
+ $('#cartn').textContent=cart.length;
+}
+
+// ---- active-filter chip bar (removable) ----
+function renderActive(){
+ const bar=$('#activebar'); bar.innerHTML='';
+ let any=false;
+ for(const k of Object.keys(active)){
+ for(const v of (active[k]||[])){
+ any=true;
+ const c=document.createElement('span'); c.className='achip';
+ const label = k==='enriched' ? (v==='enriched'?'Enriched':'Unenriched') : v;
+ c.innerHTML=`<span class="k">${esc(FACET_LABEL[k]||k)}</span><span>${esc(label)}</span><button class="x" title="remove">×</button>`;
+ c.querySelector('.x').addEventListener('click',()=>{ active[k]=active[k].filter(x=>x!==v); if(!active[k].length) delete active[k]; LS.set('filters',active); loadFacets(); reset(); });
+ bar.appendChild(c);
+ }
+ }
+ if(any){
+ const clr=document.createElement('button'); clr.className='clearall'; clr.textContent='Clear all';
+ clr.addEventListener('click',()=>{active={};LS.set('filters',active);loadFacets();reset();});
+ bar.appendChild(clr);
+ bar.classList.remove('empty');
+ } else bar.classList.add('empty');
+}
+
+function toggleFacet(key,value){
+ active[key]=active[key]||[];
+ if(active[key].includes(value)) active[key]=active[key].filter(v=>v!==value);
+ else active[key].push(value);
+ if(!active[key].length) delete active[key];
+ LS.set('filters',active); loadFacets(); reset();
+}
+
+// ---- facets as CHIPS ----
+async function loadFacets(){
+ const r=await fetch('/api/facets'); const d=await r.json();
+ const f=d.facets;
+ const meta=[
+ ['family','Color Family',f.family,false,true],
+ ['style','Style',f.style,false,false],
+ ['material_bucket','Material',f.material_bucket,false,false],
+ ['enriched','Enrichment',f.enriched,false,false],
+ ['line','Line',f.line,false,false],
+ ['product_type','Product Type',f.product_type,false,false],
+ ['collection','Collection',f.collection,true,false],
+ ];
+ const root=$('#facets'); root.innerHTML='';
+ for(const [key,title,vals,searchable,swatch] of meta){
+ if(!vals || !vals.length) continue;
+ const h=document.createElement('h3'); h.textContent=title; root.appendChild(h);
+ let search=null;
+ if(searchable){
+ search=document.createElement('input'); search.type='text'; search.className='facet-search'; search.placeholder='Filter '+title.toLowerCase()+'…';
+ root.appendChild(search);
+ }
+ const box=document.createElement('div'); box.className=searchable?'chips facet-scroll':'chips';
+ for(const {value,count} of vals){
+ const on=(active[key]||[]).includes(value);
+ const chip=document.createElement('span');
+ chip.className='chip'+(on?' on':'')+(count===0&&!on?' zero':'');
+ chip.dataset.v=value.toLowerCase();
+ const label = key==='enriched' ? (value==='enriched'?'Enriched':'Unenriched') : value;
+ const sw = swatch ? `<span class="swatch" style="background:${FAMILY_SWATCH[value]||'#bbb'}"></span>` : '';
+ chip.innerHTML=`${sw}<span>${esc(label)}</span><span class="cc">${count}</span>`;
+ if(!(count===0&&!on)) chip.addEventListener('click',()=>toggleFacet(key,value));
+ box.appendChild(chip);
+ }
+ root.appendChild(box);
+ if(search) search.addEventListener('input',()=>{const t=search.value.toLowerCase();box.querySelectorAll('.chip').forEach(l=>l.style.display=l.dataset.v.includes(t)?'':'none');});
+ }
+ const clear=document.createElement('button'); clear.className='clearbtn'; clear.textContent='Clear all filters';
+ clear.addEventListener('click',()=>{active={};LS.set('filters',active);loadFacets();reset();});
+ root.appendChild(clear);
+}
+
+// ---- controls ----
+$('#sort').addEventListener('change',e=>{sort=e.target.value;LS.set('sort',sort);reset();});
+$('#density').addEventListener('input',e=>{density=+e.target.value;LS.set('density',density);document.documentElement.style.setProperty('--cols',density);});
+let qt; $('#q').addEventListener('input',()=>{clearTimeout(qt);qt=setTimeout(reset,250);});
+
+// ---- infinite scroll ----
+new IntersectionObserver((ents)=>{ if(ents[0].isIntersecting) load(); },{rootMargin:'600px'}).observe($('#sentinel'));
+
+// ---- sample modal ----
+const overlay=$('#overlay');
+function openCart(){
+ renderCartList();
+ $('#formArea').style.display = cart.length? '' : 'none';
+ $('#doneArea').style.display='none'; $('#doneArea').innerHTML='';
+ overlay.classList.add('open');
+}
+function closeCart(){ overlay.classList.remove('open'); }
+$('#cartbtn').addEventListener('click',openCart);
+$('#closex').addEventListener('click',closeCart);
+overlay.addEventListener('click',e=>{if(e.target===overlay)closeCart();});
+
+function renderCartList(){
+ const list=$('#cartlist');
+ if(!cart.length){ list.innerHTML='<div class="status">No items yet. Click “Request Sample” on a product.</div>'; return; }
+ list.innerHTML='';
+ cart.forEach(it=>{
+ const row=document.createElement('div'); row.className='citem';
+ row.innerHTML=`${it.image?`<img src="${it.image}">`:''}
+ <div><strong>${esc(it.pattern_name||it.sku)}</strong><br><span style="color:#6f6a62">${esc(it.color_name||'')} ${it.line?'· '+esc(it.line):''}</span></div>
+ <button class="x" title="remove">×</button>`;
+ row.querySelector('.x').addEventListener('click',()=>{cart=cart.filter(c=>c.sku!==it.sku);LS.set('cart',cart);$('#cartn').textContent=cart.length;document.querySelectorAll('.reqbtn').forEach(b=>{if(b.dataset.sku===it.sku){b.classList.remove('in');b.textContent='Request Sample';}});openCart();});
+ list.appendChild(row);
+ });
+}
+
+$('#reqform').addEventListener('submit',async e=>{
+ e.preventDefault();
+ if(!cart.length) return;
+ const fd=new FormData(e.target);
+ const payload={items:cart};
+ for(const [k,v] of fd.entries()) payload[k]=v;
+ const btn=$('#submitbtn'); btn.disabled=true; btn.textContent='Submitting…';
+ // Shopify checkout path (real sample order) when wired; else no-payment request below.
+ if(window.DWV_SAMPLE && window.DWV_SAMPLE.available()){
+ try{ btn.textContent='Opening secure checkout…'; await window.DWV_SAMPLE.checkout(cart,{name:payload.name,email:payload.email}); return; }
+ catch(err){ /* fall through to the no-payment request flow */ }
+ }
+ try{
+ const r=await fetch('/api/sample-request',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)});
+ const d=await r.json();
+ if(d.ok){
+ cart=[]; LS.set('cart',cart); $('#cartn').textContent=0;
+ document.querySelectorAll('.reqbtn.in').forEach(b=>{b.classList.remove('in');b.textContent='Request Sample';});
+ $('#formArea').style.display='none';
+ $('#doneArea').style.display='';
+ $('#doneArea').innerHTML=`<div class="ok">Thank you, ${esc(payload.name)} — your request for ${d.count} sample${d.count===1?'':'s'} was received. We’ll be in touch at ${esc(payload.email)}.</div>`;
+ } else { btn.disabled=false; btn.textContent='Submit sample request'; alert(d.error||'Could not submit.'); }
+ }catch(err){ btn.disabled=false; btn.textContent='Submit sample request'; alert('Network error.'); }
+});
+
+// ---- boot: read /api/config for title + per-vendor namespace, then hydrate state ----
+(async function boot(){
+ try{
+ const cfg=await (await fetch('/api/config')).json();
+ if(cfg.title){
+ document.title = cfg.title;
+ $('#brand').innerHTML = esc(cfg.title)+'<small>Designer Wallcoverings</small>';
+ NS = 'dwvm.'+cfg.title.replace(/[^a-z0-9]+/gi,'_').toLowerCase();
+ }
+ window.DWV_CFG = cfg.shopify || {};
+ if(window.DWV_CFG.storefrontToken && window.DWV_CFG.sampleVariantId){
+ await new Promise(res=>{const s=document.createElement('script');s.src='/buybutton.js';s.onload=res;s.onerror=res;document.head.appendChild(s);});
+ }
+ }catch{}
+ sort = LS.get('sort','newest');
+ density = LS.get('density',5);
+ cart = LS.get('cart',[]);
+ active = LS.get('filters',{});
+ $('#sort').value=sort;
+ $('#density').value=density;
+ document.documentElement.style.setProperty('--cols',density);
+ $('#cartn').textContent=cart.length;
+ renderActive();
+ loadFacets();
+ load();
+})();
+</script>
+</body>
+</html>
diff --git a/vendors/rebel_walls/viewer/server.js b/vendors/rebel_walls/viewer/server.js
new file mode 100644
index 0000000..9904dbf
--- /dev/null
+++ b/vendors/rebel_walls/viewer/server.js
@@ -0,0 +1,417 @@
+#!/usr/bin/env node
+/**
+ * DW Vendor Microsite — generalized catalog viewer (LOCAL, read-only browse + sample-order).
+ *
+ * Generalized from ~/Projects/cowtan-lines/viewer/server.js. The engine is
+ * vendor-agnostic: buildRows / sorters / facets / the /api/sample-request flow are
+ * uniform across every vendor's catalog schema (the staging JSONL is already
+ * normalized to the canonical cowtan shape by lib/export-catalog.sh).
+ *
+ * What is vendor-specific (read from argv / env / fieldmap.json):
+ * - JSONL source path : argv[3] || env VENDOR_JSONL || ../staging/cowtan.jsonl
+ * - banner / page title : env VENDOR_TITLE || fieldmap.title || 'Vendor Trade Lines'
+ * - samples-only policy : fieldmap.samples_only (no prices/checkout when true)
+ *
+ * These lines are intentionally OFF Shopify — the ONLY purchase action is a no-payment
+ * sample request. No prices are sold, no Shopify links, no checkout.
+ *
+ * Zero dependencies. Images are live vendor CDN URLs, used as-is (never upscaled).
+ * node server.js [port] [jsonl] [fieldmap]
+ * port default 0 = OS-assigned free port
+ * jsonl default env VENDOR_JSONL || ../staging/cowtan.jsonl
+ * fieldmap default env VENDOR_FIELDMAP || ./fieldmap.json (optional)
+ */
+const http = require('http');
+const fs = require('fs');
+const path = require('path');
+
+const PORT = parseInt(process.argv[2] || '0', 10);
+const DIR = path.join(__dirname, '..', '..', '..', 'staging'); // repo/vendors/<v>/viewer -> repo/staging
+const SRC = process.argv[3] || process.env.VENDOR_JSONL || path.join(__dirname, '..', 'staging', 'cowtan.jsonl');
+const FIELDMAP_PATH = process.argv[4] || process.env.VENDOR_FIELDMAP || path.join(__dirname, 'fieldmap.json');
+const PUBLIC = path.join(__dirname, 'public');
+const DATA = path.join(__dirname, 'data');
+const REQUESTS = path.join(DATA, 'sample-requests.jsonl');
+
+let FIELDMAP = {};
+try { if (fs.existsSync(FIELDMAP_PATH)) FIELDMAP = JSON.parse(fs.readFileSync(FIELDMAP_PATH, 'utf8')); } catch { FIELDMAP = {}; }
+const TITLE = process.env.VENDOR_TITLE || FIELDMAP.title || 'Vendor Trade Lines';
+const SAMPLES_ONLY = FIELDMAP.samples_only !== false; // default true (samples-only / no checkout)
+
+const readJsonl = (f) => (fs.existsSync(f)
+ ? fs.readFileSync(f, 'utf8').trim().split('\n').filter(Boolean).map((l) => { try { return JSON.parse(l); } catch { return null; } }).filter(Boolean)
+ : []);
+
+const num = (v) => { if (v == null) return null; const m = String(v).match(/[\d.]+/); return m ? parseFloat(m[0]) : null; };
+
+// perceived luminance 0..255 from #rrggbb
+function lum(hex) {
+ if (!hex || hex[0] !== '#' || hex.length !== 7) return null;
+ const r = parseInt(hex.slice(1, 3), 16), g = parseInt(hex.slice(3, 5), 16), b = parseInt(hex.slice(5, 7), 16);
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
+}
+// hue 0..360 from #rrggbb (for color-wheel sort)
+function hue(hex) {
+ if (!hex || hex[0] !== '#' || hex.length !== 7) return null;
+ let r = parseInt(hex.slice(1, 3), 16) / 255, g = parseInt(hex.slice(3, 5), 16) / 255, b = parseInt(hex.slice(5, 7), 16) / 255;
+ const mx = Math.max(r, g, b), mn = Math.min(r, g, b), d = mx - mn;
+ if (d === 0) return -1; // grayscale -> sort to end
+ let h;
+ if (mx === r) h = ((g - b) / d) % 6;
+ else if (mx === g) h = (b - r) / d + 2;
+ else h = (r - g) / d + 4;
+ h *= 60; if (h < 0) h += 360;
+ return h;
+}
+
+// ---- ENHANCED bucketing (Steve's spec) ------------------------------------
+// Full HSL from #rrggbb -> {h:0..360, s:0..1, l:0..1} or null.
+function hsl(hex) {
+ if (!hex || hex[0] !== '#' || hex.length !== 7) return null;
+ let r = parseInt(hex.slice(1, 3), 16) / 255, g = parseInt(hex.slice(3, 5), 16) / 255, b = parseInt(hex.slice(5, 7), 16) / 255;
+ if ([r, g, b].some((v) => Number.isNaN(v))) return null;
+ const mx = Math.max(r, g, b), mn = Math.min(r, g, b), d = mx - mn;
+ const l = (mx + mn) / 2;
+ let s = 0, h = 0;
+ if (d !== 0) {
+ s = l > 0.5 ? d / (2 - mx - mn) : d / (mx + mn);
+ if (mx === r) h = ((g - b) / d) % 6;
+ else if (mx === g) h = (b - r) / d + 2;
+ else h = (r - g) / d + 4;
+ h *= 60; if (h < 0) h += 360;
+ }
+ return { h, s, l };
+}
+
+// Canonical color families (order = display order; 0-count still listed by facets()).
+const COLOR_FAMILIES = ['Red', 'Orange/Brown', 'Yellow', 'Green', 'Teal', 'Blue', 'Purple', 'Pink', 'Neutral/Beige', 'Black', 'Grey', 'White'];
+// ai_colors hint words -> family (fallback when hex absent/ambiguous).
+const AI_COLOR_TO_FAMILY = {
+ red: 'Red', crimson: 'Red', scarlet: 'Red', burgundy: 'Red', maroon: 'Red', wine: 'Red',
+ orange: 'Orange/Brown', terracotta: 'Orange/Brown', rust: 'Orange/Brown', brown: 'Orange/Brown', tan: 'Orange/Brown', camel: 'Orange/Brown', copper: 'Orange/Brown', bronze: 'Orange/Brown', amber: 'Orange/Brown', coffee: 'Orange/Brown', chocolate: 'Orange/Brown',
+ yellow: 'Yellow', gold: 'Yellow', mustard: 'Yellow', ochre: 'Yellow',
+ green: 'Green', olive: 'Green', sage: 'Green', lime: 'Green', emerald: 'Green', forest: 'Green', moss: 'Green',
+ teal: 'Teal', turquoise: 'Teal', aqua: 'Teal', cyan: 'Teal',
+ blue: 'Blue', navy: 'Blue', indigo: 'Blue', cobalt: 'Blue', azure: 'Blue', denim: 'Blue',
+ purple: 'Purple', violet: 'Purple', lavender: 'Purple', plum: 'Purple', mauve: 'Purple', lilac: 'Purple',
+ pink: 'Pink', rose: 'Pink', blush: 'Pink', fuchsia: 'Pink', magenta: 'Pink', coral: 'Pink', salmon: 'Pink',
+ beige: 'Neutral/Beige', cream: 'Neutral/Beige', ivory: 'Neutral/Beige', taupe: 'Neutral/Beige', sand: 'Neutral/Beige', linen: 'Neutral/Beige', natural: 'Neutral/Beige', oatmeal: 'Neutral/Beige', greige: 'Neutral/Beige', stone: 'Neutral/Beige',
+ black: 'Black', charcoal: 'Black', ebony: 'Black', onyx: 'Black',
+ grey: 'Grey', gray: 'Grey', silver: 'Grey', slate: 'Grey', pewter: 'Grey', smoke: 'Grey',
+ white: 'White', chalk: 'White', alabaster: 'White', snow: 'White',
+};
+// hue-degrees -> chromatic family bucket.
+function familyFromHue(h) {
+ if (h < 15 || h >= 345) return 'Red';
+ if (h < 45) return 'Orange/Brown';
+ if (h < 70) return 'Yellow';
+ if (h < 160) return 'Green';
+ if (h < 195) return 'Teal';
+ if (h < 255) return 'Blue';
+ if (h < 290) return 'Purple';
+ if (h < 345) return 'Pink';
+ return 'Red';
+}
+// Derive the color family for a row. hex first (HSL), ai_colors as fallback hint.
+function colorFamily(hex, aiColors) {
+ const c = hsl(hex);
+ if (c) {
+ // low-saturation -> achromatic by luminance
+ if (c.s < 0.12) {
+ if (c.l < 0.18) return 'Black';
+ if (c.l > 0.88) return 'White';
+ if (c.l > 0.70) return 'Neutral/Beige';
+ return 'Grey';
+ }
+ // low-ish sat + warm hue + mid/high lum -> beige rather than a vivid family
+ if (c.s < 0.22 && c.l > 0.62 && (c.h < 70 || c.h >= 330)) return 'Neutral/Beige';
+ return familyFromHue(c.h);
+ }
+ // hex missing/invalid -> ai_colors hint (first matchable word)
+ if (Array.isArray(aiColors)) {
+ for (const w of aiColors) {
+ const key = String(w || '').trim().toLowerCase();
+ if (AI_COLOR_TO_FAMILY[key]) return AI_COLOR_TO_FAMILY[key];
+ // partial: "dark green" -> green
+ for (const word of key.split(/[^a-z]+/)) if (AI_COLOR_TO_FAMILY[word]) return AI_COLOR_TO_FAMILY[word];
+ }
+ }
+ return null;
+}
+
+// Canonical styles (display order). Derived from ai_styles + ai_patterns keywords.
+const STYLE_BUCKETS = ['Floral', 'Botanical', 'Damask', 'Toile', 'Stripe', 'Geometric', 'Plaid/Check', 'Trellis', 'Animal/Fauna', 'Scenic/Mural', 'Abstract', 'Texture/Plain', 'Metallic', 'Traditional', 'Modern'];
+const STYLE_KEYWORDS = [
+ ['Floral', ['floral', 'flower', 'rose', 'peony', 'bloom', 'blossom', 'chintz']],
+ ['Botanical', ['botanical', 'leaf', 'leaves', 'fern', 'palm', 'foliage', 'tree', 'vine', 'garden', 'jungle', 'tropical']],
+ ['Damask', ['damask', 'medallion', 'ogee']],
+ ['Toile', ['toile']],
+ ['Stripe', ['stripe', 'striped', 'pinstripe', 'ticking']],
+ ['Plaid/Check', ['plaid', 'check', 'tartan', 'gingham', 'houndstooth', 'windowpane']],
+ ['Trellis', ['trellis', 'lattice', 'fretwork']],
+ ['Geometric', ['geometric', 'chevron', 'herringbone', 'diamond', 'hexagon', 'grid', 'dot', 'polka', 'moroccan', 'fret', 'greek key', 'op art']],
+ ['Animal/Fauna', ['animal', 'bird', 'butterfly', 'fauna', 'leopard', 'zebra', 'tiger', 'peacock', 'fish', 'insect', 'skin', 'hide']],
+ ['Scenic/Mural', ['scenic', 'mural', 'landscape', 'panoramic', 'chinoiserie', 'view', 'cityscape', 'map']],
+ ['Metallic', ['metallic', 'foil', 'mica', 'gilt', 'gilded', 'shimmer', 'glitter']],
+ ['Texture/Plain', ['texture', 'textured', 'plain', 'solid', 'grasscloth', 'linen', 'woven', 'weave', 'sisal', 'cork', 'faux', 'concrete', 'stucco', 'plaster', 'leather', 'suede', 'tweed']],
+ ['Abstract', ['abstract', 'organic', 'watercolor', 'marble', 'painterly', 'brushstroke', 'ombre', 'tie dye', 'splatter']],
+ ['Traditional', ['traditional', 'classic', 'heritage', 'colonial', 'victorian']],
+ ['Modern', ['modern', 'contemporary', 'minimal', 'mid-century', 'midcentury', 'scandinavian']],
+];
+// First matching style bucket from the row's ai_styles + ai_patterns words.
+function styleBucket(aiStyles, aiPatterns) {
+ const words = [];
+ for (const arr of [aiStyles, aiPatterns]) if (Array.isArray(arr)) for (const w of arr) words.push(String(w || '').toLowerCase());
+ const blob = ' ' + words.join(' ') + ' ';
+ for (const [bucket, kws] of STYLE_KEYWORDS) for (const kw of kws) if (blob.includes(kw)) return bucket;
+ return null;
+}
+
+// Material buckets from material / product_type strings.
+const MATERIAL_BUCKETS = ['Non-woven', 'Paper', 'Vinyl', 'Grasscloth', 'Fabric/Textile', 'Cork', 'Mylar/Metallic', 'Leather/Suede', 'Mural', 'Other'];
+const MATERIAL_KEYWORDS = [
+ ['Non-woven', ['non-woven', 'nonwoven', 'non woven']],
+ ['Grasscloth', ['grasscloth', 'grass cloth', 'sisal', 'jute', 'hemp', 'raffia', 'arrowroot', 'seagrass']],
+ ['Vinyl', ['vinyl', 'pvc', 'type ii', 'type 2', 'commercial']],
+ ['Cork', ['cork']],
+ ['Mylar/Metallic', ['mylar', 'metallic', 'foil', 'mica']],
+ ['Leather/Suede', ['leather', 'suede', 'ultrasuede', 'hide']],
+ ['Mural', ['mural', 'panel', 'panoramic']],
+ ['Fabric/Textile', ['fabric', 'textile', 'linen', 'silk', 'cotton', 'wool', 'velvet', 'woven', 'weave']],
+ ['Paper', ['paper', 'wallpaper', 'wallcovering', 'pulp']],
+];
+function materialBucket(material, ptype) {
+ const blob = ' ' + (String(material || '') + ' ' + String(ptype || '')).toLowerCase() + ' ';
+ if (blob.trim() === '') return null;
+ for (const [bucket, kws] of MATERIAL_KEYWORDS) for (const kw of kws) if (blob.includes(kw)) return bucket;
+ return null;
+}
+
+function buildRows() {
+ const rows = [];
+ let i = 0;
+ for (const r of readJsonl(SRC)) {
+ let images = [];
+ if (Array.isArray(r.all_images)) images = r.all_images;
+ else if (typeof r.all_images === 'string' && r.all_images.trim()) { try { images = JSON.parse(r.all_images); } catch { images = []; } }
+ if (!images.length && r.image_url) images = [r.image_url];
+ const ptype = (r.product_type || '').replace(/^./, (c) => c.toUpperCase()); // normalize casing
+ const parseArr = (v) => Array.isArray(v) ? v : (typeof v === 'string' && v.trim() ? (() => { try { return JSON.parse(v); } catch { return []; } })() : []);
+ const aiColors = parseArr(r.ai_colors), aiStyles = parseArr(r.ai_styles), aiPatterns = parseArr(r.ai_patterns);
+ const enriched = (aiColors.length > 0 || aiStyles.length > 0); // ai_colors OR ai_styles non-empty
+ rows.push({
+ idx: i++,
+ sku: r.dw_sku || r.mfr_sku || String(i),
+ mfr_sku: r.mfr_sku || null,
+ pattern_name: r.pattern_name || r.mfr_sku || '(untitled)',
+ color_name: r.color_name || null,
+ collection: r.collection || null,
+ product_type: ptype || null,
+ material: r.material || null,
+ width: r.width || null,
+ repeat_v: r.repeat_v || null,
+ repeat_h: r.repeat_h || null,
+ color_primary: r.color_primary || null,
+ color_hex: r.color_hex || null,
+ ai_colors: aiColors,
+ ai_styles: aiStyles,
+ ai_patterns: aiPatterns,
+ repeat_classification: r.repeat_classification || null,
+ finish: r.finish || null,
+ application: r.application || null,
+ coverage: r.coverage || null,
+ fire_rating: r.fire_rating || null,
+ line: r.line || r.material || null,
+ image: r.image_url || images[0] || null,
+ images,
+ image_count: images.length,
+ // ENHANCED buckets (server-side)
+ family: colorFamily(r.color_hex, aiColors),
+ style: styleBucket(aiStyles, aiPatterns),
+ material_bucket: materialBucket(r.material, ptype),
+ enriched,
+ _lum: lum(r.color_hex),
+ _hue: hue(r.color_hex),
+ });
+ }
+ return rows;
+}
+
+let ROWS = buildRows();
+fs.watchFile(SRC, { interval: 5000 }, () => { ROWS = buildRows(); });
+
+const cmpStr = (a, b) => String(a == null ? '' : a).localeCompare(String(b == null ? '' : b), undefined, { sensitivity: 'base' });
+const nullsLast = (v) => (v == null ? Infinity : v);
+
+const sorters = {
+ newest: null, // natural staged order
+ pattern: (a, b) => cmpStr(a.pattern_name, b.pattern_name),
+ color_name: (a, b) => cmpStr(a.color_name, b.color_name),
+ collection: (a, b) => cmpStr(a.collection, b.collection) || cmpStr(a.pattern_name, b.pattern_name),
+ line: (a, b) => cmpStr(a.line, b.line) || cmpStr(a.pattern_name, b.pattern_name),
+ product_type: (a, b) => cmpStr(a.product_type, b.product_type) || cmpStr(a.pattern_name, b.pattern_name),
+ material: (a, b) => cmpStr(a.material, b.material) || cmpStr(a.pattern_name, b.pattern_name),
+ // light -> dark: brightest first; missing-hex always sort last
+ light: (a, b) => { const la = a._lum == null ? -1 : a._lum, lb = b._lum == null ? -1 : b._lum; return lb - la; },
+ // dark -> light: darkest first; missing-hex always sort last
+ dark: (a, b) => { const la = a._lum == null ? 999 : a._lum, lb = b._lum == null ? 999 : b._lum; return la - lb; },
+ hue: (a, b) => {
+ // grayscale (-1) and null sort to the very end
+ const ha = a._hue == null || a._hue < 0 ? 9999 : a._hue;
+ const hb = b._hue == null || b._hue < 0 ? 9999 : b._hue;
+ return ha - hb;
+ },
+ sku: (a, b) => cmpStr(a.mfr_sku || a.sku, b.mfr_sku || b.sku),
+ // group by canonical color family (display order), nulls last, then by hue within
+ family: (a, b) => {
+ const ia = a.family == null ? 999 : COLOR_FAMILIES.indexOf(a.family);
+ const ib = b.family == null ? 999 : COLOR_FAMILIES.indexOf(b.family);
+ if (ia !== ib) return ia - ib;
+ const ha = a._hue == null || a._hue < 0 ? 9999 : a._hue, hb = b._hue == null || b._hue < 0 ? 9999 : b._hue;
+ return ha - hb;
+ },
+ // group by canonical style (display order), nulls last, then pattern name
+ style: (a, b) => {
+ const ia = a.style == null ? 999 : STYLE_BUCKETS.indexOf(a.style);
+ const ib = b.style == null ? 999 : STYLE_BUCKETS.indexOf(b.style);
+ return ia - ib || cmpStr(a.pattern_name, b.pattern_name);
+ },
+};
+
+function facets() {
+ // ENHANCED facets: color-family / style / material (bucketed) REPLACE raw color_primary
+ // as the color facet. Plus enriched, line, product_type, collection.
+ const fam = {}, sty = {}, mat = {};
+ const f = { line: {}, product_type: {}, collection: {} };
+ let enrichedN = 0, unenrichedN = 0;
+ for (const r of ROWS) {
+ const bump = (o, v) => { if (v == null || v === '') return; o[v] = (o[v] || 0) + 1; };
+ bump(fam, r.family);
+ bump(sty, r.style);
+ bump(mat, r.material_bucket);
+ bump(f.line, r.line);
+ bump(f.product_type, r.product_type);
+ bump(f.collection, r.collection);
+ if (r.enriched) enrichedN++; else unenrichedN++;
+ }
+ // canonical-ordered facets: every value listed even at count 0 (UI greys 0s)
+ const ordered = (canon, counts) => canon.map((value) => ({ value, count: counts[value] || 0 }));
+ // count-desc for free-form facets; collection alpha (searchable)
+ const byCount = (counts) => Object.entries(counts).sort((a, b) => b[1] - a[1]).map(([value, count]) => ({ value, count }));
+ const byAlpha = (counts) => Object.entries(counts).sort((a, b) => a[0].localeCompare(b[0])).map(([value, count]) => ({ value, count }));
+ return {
+ family: ordered(COLOR_FAMILIES, fam),
+ style: ordered(STYLE_BUCKETS, sty),
+ material_bucket: ordered(MATERIAL_BUCKETS, mat),
+ enriched: [
+ { value: 'enriched', count: enrichedN },
+ { value: 'unenriched', count: unenrichedN },
+ ],
+ line: byCount(f.line),
+ product_type: byCount(f.product_type),
+ collection: byAlpha(f.collection),
+ };
+}
+
+const json = (res, code, obj) => { res.writeHead(code, { 'Content-Type': 'application/json' }); res.end(JSON.stringify(obj)); };
+
+const server = http.createServer((req, res) => {
+ const u = new URL(req.url, 'http://localhost');
+
+ if (u.pathname === '/api/config') {
+ return json(res, 200, { title: TITLE, samples_only: SAMPLES_ONLY, total: ROWS.length,
+ shopify: {
+ domain: process.env.SHOPIFY_STORE_DOMAIN || 'designer-laboratory-sandbox.myshopify.com',
+ storefrontToken: process.env.SHOPIFY_STOREFRONT_TOKEN || '',
+ sampleVariantId: process.env.SHOPIFY_SAMPLE_VARIANT_ID || ''
+ } });
+ }
+
+ if (u.pathname === '/api/facets') {
+ return json(res, 200, { total: ROWS.length, facets: facets() });
+ }
+
+ if (u.pathname === '/api/skus') {
+ const q = (u.searchParams.get('q') || '').trim().toLowerCase();
+ const sort = u.searchParams.get('sort') || 'newest';
+ const offset = parseInt(u.searchParams.get('offset') || '0', 10);
+ const limit = Math.min(parseInt(u.searchParams.get('limit') || '60', 10), 200);
+ // multi-select facets: pipe-separated ('|'). Buckets + free-form + enriched.
+ const sel = (k) => { const v = u.searchParams.get(k); return v ? v.split('|').filter(Boolean) : []; };
+ const fFam = sel('family'), fStyle = sel('style'), fMat = sel('material_bucket');
+ const fEnr = sel('enriched'); // 'enriched' | 'unenriched' (multi tolerated -> OR)
+ const fLine = sel('line'), fType = sel('product_type'), fColl = sel('collection');
+
+ let rows = ROWS;
+ const inAny = (arr, val) => arr.length === 0 || arr.includes(val == null ? '' : val);
+ const enrMatch = (r) => {
+ if (!fEnr.length) return true;
+ const wantE = fEnr.includes('enriched'), wantU = fEnr.includes('unenriched');
+ return (wantE && r.enriched) || (wantU && !r.enriched);
+ };
+ rows = rows.filter((r) =>
+ inAny(fFam, r.family) && inAny(fStyle, r.style) && inAny(fMat, r.material_bucket) &&
+ inAny(fLine, r.line) && inAny(fType, r.product_type) && inAny(fColl, r.collection) && enrMatch(r));
+ if (q) {
+ rows = rows.filter((r) => (
+ (r.pattern_name || '') + ' ' + (r.color_name || '') + ' ' + (r.mfr_sku || '') + ' ' +
+ (r.sku || '') + ' ' + (r.collection || '')).toLowerCase().includes(q));
+ }
+ if (sorters[sort]) rows = [...rows].sort(sorters[sort]);
+ const page = rows.slice(offset, offset + limit);
+ return json(res, 200, { total: rows.length, all: ROWS.length, offset, limit, rows: page });
+ }
+
+ if (u.pathname === '/api/sample-request' && req.method === 'POST') {
+ let body = '';
+ req.on('data', (c) => { body += c; if (body.length > 1e6) req.destroy(); });
+ req.on('end', () => {
+ let p; try { p = JSON.parse(body || '{}'); } catch { return json(res, 400, { ok: false, error: 'bad json' }); }
+ const name = (p.name || '').toString().trim();
+ const email = (p.email || '').toString().trim();
+ const items = Array.isArray(p.items) ? p.items.slice(0, 200) : [];
+ if (!name || !email || !/.+@.+\..+/.test(email) || !items.length) {
+ return json(res, 400, { ok: false, error: 'name, valid email, and at least one item are required' });
+ }
+ const rec = {
+ ts: new Date().toISOString(),
+ vendor: TITLE,
+ name, email,
+ company: (p.company || '').toString().trim() || null,
+ phone: (p.phone || '').toString().trim() || null,
+ address: (p.address || '').toString().trim() || null,
+ notes: (p.notes || '').toString().trim() || null,
+ items: items.map((it) => ({
+ sku: (it.sku || '').toString(),
+ mfr_sku: (it.mfr_sku || '').toString() || null,
+ pattern_name: (it.pattern_name || '').toString() || null,
+ color_name: (it.color_name || '').toString() || null,
+ line: (it.line || '').toString() || null,
+ })),
+ ua: (req.headers['user-agent'] || '').slice(0, 200),
+ };
+ try {
+ fs.mkdirSync(DATA, { recursive: true });
+ fs.appendFileSync(REQUESTS, JSON.stringify(rec) + '\n');
+ } catch (e) {
+ return json(res, 500, { ok: false, error: 'could not save request' });
+ }
+ return json(res, 200, { ok: true, count: rec.items.length });
+ });
+ return;
+ }
+
+ // static
+ let pth = u.pathname === '/' ? '/index.html' : u.pathname;
+ const file = path.join(PUBLIC, path.normalize(pth).replace(/^(\.\.[/\\])+/, ''));
+ if (!file.startsWith(PUBLIC) || !fs.existsSync(file) || fs.statSync(file).isDirectory()) { res.writeHead(404); return res.end('not found'); }
+ const ext = path.extname(file);
+ const mime = { '.html': 'text/html; charset=utf-8', '.js': 'text/javascript', '.css': 'text/css', '.svg': 'image/svg+xml', '.png': 'image/png', '.jpg': 'image/jpeg', '.ico': 'image/x-icon' }[ext] || 'text/plain';
+ res.writeHead(200, { 'Content-Type': mime });
+ res.end(fs.readFileSync(file));
+});
+
+server.listen(PORT, () => {
+ const addr = server.address();
+ console.log(`${TITLE} viewer -> http://localhost:${addr.port} (${ROWS.length} products${SAMPLES_ONLY ? ', samples-only' : ''})`);
+});
diff --git a/vendors/schumacher/viewer/fieldmap.json b/vendors/schumacher/viewer/fieldmap.json
new file mode 100644
index 0000000..2956641
--- /dev/null
+++ b/vendors/schumacher/viewer/fieldmap.json
@@ -0,0 +1,6 @@
+{
+ "title": "Schumacher",
+ "samples_only": true,
+ "vendor_code": "schumacher",
+ "subdomain": "schumacher"
+}
diff --git a/vendors/schumacher/viewer/public/buybutton.js b/vendors/schumacher/viewer/public/buybutton.js
new file mode 100644
index 0000000..f479e9a
--- /dev/null
+++ b/vendors/schumacher/viewer/public/buybutton.js
@@ -0,0 +1,70 @@
+/* Shopify sample checkout for the DW vendor microsites.
+ *
+ * These vendor lines are OFF Shopify (no per-product Shopify variant), so "Request
+ * Sample" cannot add a per-product variant. Instead it uses ONE generic "Memo Sample"
+ * Shopify product/variant and adds it to a real Shopify cart once per requested swatch,
+ * carrying each swatch's pattern/color/SKU/vendor as line-item custom properties, then
+ * opens Shopify's secure hosted checkout. The order line-items tell fulfillment which
+ * swatches to pull.
+ *
+ * Config is injected by the server at /config.js as window.DWV_CFG = {
+ * domain: '<store>.myshopify.com', storefrontToken: '<token>', sampleVariantId: '<gid or numeric>'
+ * }. Until storefrontToken + sampleVariantId are set, this falls back to the no-payment
+ * JSONL sample-request endpoint (POST /api/sample-request) so the button always works.
+ */
+(function () {
+ var CFG = window.DWV_CFG || {};
+ var ready = CFG.storefrontToken && CFG.sampleVariantId && CFG.domain;
+ var client = null, checkoutId = null;
+
+ function loadSDK(cb) {
+ if (window.ShopifyBuy && window.ShopifyBuy.buildClient) return cb();
+ var s = document.createElement('script');
+ s.src = 'https://sdks.shopifycdn.com/js-buy-sdk/latest/index.umd.min.js';
+ s.onload = cb; s.onerror = function () { ready = false; cb(); };
+ document.head.appendChild(s);
+ }
+
+ function ensureClient(cb) {
+ if (client) return cb();
+ loadSDK(function () {
+ if (!window.ShopifyBuy || !ready) { ready = false; return cb(); }
+ client = window.ShopifyBuy.buildClient({ domain: CFG.domain, storefrontAccessToken: CFG.storefrontToken });
+ client.checkout.create().then(function (co) { checkoutId = co.id; cb(); }).catch(function () { ready = false; cb(); });
+ });
+ }
+
+ // items: [{sku, mfr_sku, pattern_name, color_name, line}] -> Shopify checkout
+ function shopifyCheckout(items, contact) {
+ return new Promise(function (resolve, reject) {
+ ensureClient(function () {
+ if (!ready || !client || !checkoutId) return reject(new Error('shopify-unavailable'));
+ var lines = items.slice(0, 250).map(function (it) {
+ return {
+ variantId: CFG.sampleVariantId,
+ quantity: 1,
+ customAttributes: [
+ { key: 'Pattern', value: String(it.pattern_name || it.sku || '') },
+ { key: 'Color', value: String(it.color_name || '') },
+ { key: 'SKU', value: String(it.mfr_sku || it.sku || '') },
+ { key: 'Line', value: String(it.line || '') }
+ ]
+ };
+ });
+ var attrs = [];
+ if (contact && contact.name) attrs.push({ key: 'Requested by', value: contact.name });
+ var p = client.checkout.addLineItems(checkoutId, lines);
+ p.then(function (co) {
+ if (attrs.length) return client.checkout.updateAttributes(checkoutId, { customAttributes: attrs }).then(function () { return co; });
+ return co;
+ }).then(function (co) { window.location.href = co.webUrl; resolve(co); }).catch(reject);
+ });
+ });
+ }
+
+ // Expose for the viewer's sample modal. Returns true if Shopify path is wired.
+ window.DWV_SAMPLE = {
+ available: function () { return !!ready; },
+ checkout: shopifyCheckout
+ };
+})();
diff --git a/vendors/schumacher/viewer/public/index.html b/vendors/schumacher/viewer/public/index.html
new file mode 100644
index 0000000..ce0d82b
--- /dev/null
+++ b/vendors/schumacher/viewer/public/index.html
@@ -0,0 +1,414 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<meta name="robots" content="noindex, nofollow">
+<title>Trade Lines</title>
+<style>
+ :root{
+ --cols: 5; /* density-driven grid columns */
+ --ink:#1c1a17; --muted:#6f6a62; --line:#e7e2da; --bg:#faf8f4; --card:#fff;
+ --accent:#7a6a52; --accent2:#3c5a4a;
+ }
+ *{box-sizing:border-box}
+ html,body{margin:0}
+ body{font:15px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;color:var(--ink);background:var(--bg)}
+ a{color:inherit}
+ header.top{padding:22px 24px 12px;border-bottom:1px solid var(--line);background:#fff;position:sticky;top:0;z-index:30}
+ .brand{font-size:24px;letter-spacing:.04em;font-weight:600}
+ .brand small{display:block;font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--muted);font-weight:500;margin-top:3px}
+ .count{color:var(--muted);font-size:13px;margin-left:auto}
+ .toprow{display:flex;align-items:flex-end;gap:18px;flex-wrap:wrap}
+ /* controls bar */
+ .controls{display:flex;gap:14px;align-items:center;flex-wrap:wrap;padding:12px 24px;border-bottom:1px solid var(--line);background:#fff;position:sticky;top:73px;z-index:20}
+ .controls label{font-size:11px;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);display:flex;flex-direction:column;gap:4px}
+ select,input[type=search],input[type=text],input[type=email],textarea{font:inherit;padding:7px 9px;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink)}
+ input[type=range]{width:120px}
+ .grow{flex:1;min-width:180px}
+ .density{display:flex;flex-direction:column;gap:4px}
+ .cartbtn{margin-left:auto;background:var(--ink);color:#fff;border:none;border-radius:8px;padding:9px 16px;font-weight:600;cursor:pointer;letter-spacing:.02em}
+ .cartbtn .n{display:inline-block;background:var(--accent2);border-radius:20px;padding:1px 8px;margin-left:6px;font-size:12px}
+ /* active-filter chips bar */
+ .activebar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:10px 24px;border-bottom:1px solid var(--line);background:#fcfbf8}
+ .activebar.empty{display:none}
+ .achip{display:inline-flex;align-items:center;gap:6px;background:var(--ink);color:#fff;border-radius:20px;padding:4px 6px 4px 11px;font-size:12.5px;line-height:1}
+ .achip .k{opacity:.6;text-transform:uppercase;letter-spacing:.06em;font-size:10px}
+ .achip .x{border:none;background:rgba(255,255,255,.2);color:#fff;border-radius:50%;width:18px;height:18px;cursor:pointer;font-size:13px;line-height:1;padding:0}
+ .clearall{margin-left:auto;border:1px solid var(--line);background:#fff;border-radius:7px;padding:6px 12px;cursor:pointer;font-size:12.5px}
+ /* layout */
+ .wrap{display:flex;align-items:flex-start}
+ aside{width:248px;flex:0 0 248px;padding:18px 16px 60px;border-right:1px solid var(--line);position:sticky;top:135px;max-height:calc(100vh - 135px);overflow:auto}
+ aside h3{font-size:11px;text-transform:uppercase;letter-spacing:.12em;color:var(--muted);margin:18px 0 8px}
+ aside h3:first-child{margin-top:0}
+ /* facet CHIPS (toggle, multi-select) */
+ .chips{display:flex;flex-wrap:wrap;gap:6px}
+ .chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:#fff;border-radius:18px;padding:4px 10px;font-size:12.5px;cursor:pointer;user-select:none}
+ .chip .cc{color:var(--muted);font-size:10.5px}
+ .chip.on{background:var(--ink);color:#fff;border-color:var(--ink)}
+ .chip.on .cc{color:rgba(255,255,255,.7)}
+ .chip.zero{opacity:.38;cursor:default;pointer-events:none}
+ .chip .swatch{width:11px;height:11px;border-radius:50%;border:1px solid rgba(0,0,0,.2);flex:0 0 auto}
+ .facet-search{width:100%;margin-bottom:8px;padding:5px 8px;font-size:13px}
+ .facet-scroll{max-height:230px;overflow:auto;padding-right:4px}
+ .clearbtn{margin-top:14px;width:100%;padding:8px;border:1px solid var(--line);background:#fff;border-radius:7px;cursor:pointer;font-size:13px}
+ main{flex:1;padding:18px 24px 80px;min-width:0}
+ .grid{display:grid;grid-template-columns:repeat(var(--cols),minmax(0,1fr));gap:14px}
+ /* MINIMAL image-forward cards: image + hex dot(s) only; detail on hover/focus */
+ .card{position:relative;background:var(--card);border:1px solid var(--line);border-radius:10px;overflow:hidden;display:flex;flex-direction:column}
+ .card .imgwrap{aspect-ratio:1/1;background:#f1ede6;overflow:hidden;position:relative}
+ .card img{width:100%;height:100%;object-fit:cover;display:block}
+ .card .dots{position:absolute;left:8px;bottom:8px;display:flex;gap:4px;z-index:2}
+ .card .dot{width:14px;height:14px;border-radius:50%;border:1px solid rgba(255,255,255,.85);box-shadow:0 0 0 1px rgba(0,0,0,.18)}
+ /* reveal overlay (hover or .open via click) */
+ .reveal{position:absolute;inset:auto 0 0 0;background:linear-gradient(to top,rgba(20,18,15,.92),rgba(20,18,15,.78) 60%,rgba(20,18,15,0));color:#fff;padding:30px 11px 11px;transform:translateY(101%);transition:transform .18s ease;display:flex;flex-direction:column;gap:3px}
+ .card:hover .reveal,.card.open .reveal,.card:focus-within .reveal{transform:translateY(0)}
+ .reveal .ptitle{font-weight:600;font-size:13.5px;line-height:1.25}
+ .reveal .rmeta{font-size:11.5px;color:rgba(255,255,255,.82)}
+ .reveal .badge{display:inline-block;font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;background:rgba(255,255,255,.16);border-radius:20px;padding:2px 7px;align-self:flex-start;margin-bottom:1px}
+ .reqbtn{margin-top:6px;border:1px solid #fff;background:transparent;color:#fff;border-radius:7px;padding:6px;font-size:12px;font-weight:600;cursor:pointer}
+ .reqbtn.in{background:var(--accent2);border-color:var(--accent2)}
+ #sentinel{height:60px}
+ .status{text-align:center;color:var(--muted);padding:24px;font-size:13px}
+ /* modal */
+ .overlay{position:fixed;inset:0;background:rgba(28,26,23,.45);display:none;align-items:flex-start;justify-content:center;z-index:50;padding:40px 16px;overflow:auto}
+ .overlay.open{display:flex}
+ .modal{background:#fff;border-radius:12px;max-width:560px;width:100%;padding:22px 24px 26px}
+ .modal h2{margin:0 0 4px;font-size:20px}
+ .modal p.sub{margin:0 0 16px;color:var(--muted);font-size:13px}
+ .cartlist{max-height:230px;overflow:auto;border:1px solid var(--line);border-radius:8px;margin-bottom:16px}
+ .citem{display:flex;align-items:center;gap:10px;padding:8px 10px;border-bottom:1px solid var(--line);font-size:13px}
+ .citem:last-child{border-bottom:none}
+ .citem img{width:42px;height:42px;object-fit:cover;border-radius:6px;background:#eee}
+ .citem .x{margin-left:auto;border:none;background:none;color:var(--muted);cursor:pointer;font-size:18px}
+ .field{display:flex;flex-direction:column;gap:4px;margin-bottom:11px}
+ .field label{font-size:12px;color:var(--muted)}
+ .row2{display:flex;gap:11px}.row2 .field{flex:1}
+ .submit{width:100%;background:var(--ink);color:#fff;border:none;border-radius:8px;padding:12px;font-weight:600;font-size:15px;cursor:pointer;margin-top:4px}
+ .submit:disabled{opacity:.5;cursor:default}
+ .closex{float:right;border:none;background:none;font-size:22px;cursor:pointer;color:var(--muted);line-height:1}
+ .ok{background:#eef5ef;border:1px solid #cfe3d4;color:#2c5d3c;padding:12px;border-radius:8px;font-size:14px}
+ @media(max-width:820px){aside{display:none}.controls{top:auto;position:static}}
+</style>
+</head>
+<body>
+<header class="top">
+ <div class="toprow">
+ <div class="brand" id="brand">Trade Lines<small>Designer Wallcoverings</small></div>
+ <div class="count" id="count">loading…</div>
+ </div>
+</header>
+
+<div class="controls">
+ <label class="grow">Search
+ <input type="search" id="q" placeholder="pattern, color, SKU, collection…" autocomplete="off">
+ </label>
+ <label>Sort
+ <select id="sort">
+ <option value="newest">Newest</option>
+ <option value="family">Color Family</option>
+ <option value="style">Style</option>
+ <option value="pattern">Pattern A→Z</option>
+ <option value="color_name">Color name A→Z</option>
+ <option value="collection">Collection A→Z</option>
+ <option value="line">Line</option>
+ <option value="product_type">Product Type</option>
+ <option value="material">Material</option>
+ <option value="light">Light → Dark</option>
+ <option value="dark">Dark → Light</option>
+ <option value="hue">Color Wheel (hue)</option>
+ <option value="sku">SKU A→Z</option>
+ </select>
+ </label>
+ <label class="density">Density
+ <input type="range" id="density" min="2" max="8" step="1" value="5">
+ </label>
+ <button class="cartbtn" id="cartbtn">Request Samples<span class="n" id="cartn">0</span></button>
+</div>
+
+<!-- active-filter chips -->
+<div class="activebar empty" id="activebar"></div>
+
+<div class="wrap">
+ <aside id="facets"></aside>
+ <main>
+ <div class="grid" id="grid"></div>
+ <div id="sentinel"></div>
+ <div class="status" id="status"></div>
+ </main>
+</div>
+
+<!-- sample request modal -->
+<div class="overlay" id="overlay">
+ <div class="modal">
+ <button class="closex" id="closex">×</button>
+ <h2>Request Samples</h2>
+ <p class="sub">No payment — we’ll mail trade samples of the items below.</p>
+ <div id="formArea">
+ <div class="cartlist" id="cartlist"></div>
+ <form id="reqform">
+ <div class="row2">
+ <div class="field"><label>Name *</label><input type="text" name="name" required></div>
+ <div class="field"><label>Email *</label><input type="email" name="email" required></div>
+ </div>
+ <div class="row2">
+ <div class="field"><label>Company / Studio</label><input type="text" name="company"></div>
+ <div class="field"><label>Phone</label><input type="text" name="phone"></div>
+ </div>
+ <div class="field"><label>Shipping address</label><textarea name="address" rows="2"></textarea></div>
+ <div class="field"><label>Notes</label><textarea name="notes" rows="2" placeholder="Optional"></textarea></div>
+ <button class="submit" id="submitbtn" type="submit">Submit sample request</button>
+ </form>
+ </div>
+ <div id="doneArea" style="display:none"></div>
+ </div>
+</div>
+
+<script>
+// per-vendor localStorage namespace (set after /api/config so two microsites don't collide)
+let NS = 'dwvm';
+const LS = {
+ get:(k,d)=>{try{const v=localStorage.getItem(NS+'.'+k);return v==null?d:JSON.parse(v);}catch{return d;}},
+ set:(k,v)=>{try{localStorage.setItem(NS+'.'+k,JSON.stringify(v));}catch{}}
+};
+const $ = (s)=>document.querySelector(s);
+const grid=$('#grid'), statusEl=$('#status'), countEl=$('#count');
+
+// approximate swatch color per family (for the chip dot)
+const FAMILY_SWATCH = {
+ 'Red':'#c0392b','Orange/Brown':'#b5651d','Yellow':'#e1c340','Green':'#4a7c3f','Teal':'#2a9d8f',
+ 'Blue':'#3a6ea5','Purple':'#7e57c2','Pink':'#e08aa8','Neutral/Beige':'#d8cbb3','Black':'#222',
+ 'Grey':'#9a9a9a','White':'#f4f4f0'
+};
+// pretty labels for the active-chip key
+const FACET_LABEL = {family:'Color',style:'Style',material_bucket:'Material',enriched:'Status',line:'Line',product_type:'Type',collection:'Collection'};
+
+// ---- persisted UI state ----
+let sort, density, cart, active;
+let offset=0, total=0, loading=false, done=false;
+const LIMIT=60;
+
+function qs(){
+ const p=new URLSearchParams();
+ p.set('sort',sort); p.set('offset',offset); p.set('limit',LIMIT);
+ const q=$('#q').value.trim(); if(q) p.set('q',q);
+ for(const k of Object.keys(active)){ if(active[k] && active[k].length) p.set(k, active[k].join('|')); }
+ return p.toString();
+}
+function reset(){ offset=0; total=0; done=false; grid.innerHTML=''; statusEl.textContent=''; renderActive(); load(); }
+
+async function load(){
+ if(loading||done) return;
+ loading=true; statusEl.textContent='loading…';
+ try{
+ const r=await fetch('/api/skus?'+qs());
+ const d=await r.json();
+ total=d.total;
+ for(const row of d.rows) grid.appendChild(card(row));
+ offset += d.rows.length;
+ if(offset>=total || d.rows.length===0) done=true;
+ countEl.textContent = total.toLocaleString()+' of '+d.all.toLocaleString()+' products';
+ statusEl.textContent = done ? (total? 'End of results — '+total.toLocaleString()+' shown' : 'No products match your filters.') : '';
+ }catch(e){ statusEl.textContent='Error loading products.'; }
+ loading=false;
+}
+
+function inCart(sku){ return cart.some(c=>c.sku===sku); }
+function esc(s){ return String(s==null?'':s).replace(/[&<>"]/g,c=>({'&':'&','<':'<','>':'>','"':'"'}[c])); }
+
+// MINIMAL card: image + hex dot(s) only; everything else in hover/click reveal
+function card(row){
+ const el=document.createElement('div'); el.className='card'; el.tabIndex=0;
+ const img = row.image ? `<img loading="lazy" src="${row.image}" alt="${esc(row.pattern_name)}" onerror="this.style.opacity=.25">` : '';
+ let dots='';
+ if(row.color_hex) dots += `<span class="dot" style="background:${row.color_hex}" title="${row.color_hex}"></span>`;
+ if(!row.color_hex && row.family) dots += `<span class="dot" style="background:${FAMILY_SWATCH[row.family]||'#bbb'}" title="${esc(row.family)}"></span>`;
+ const lineBadge = row.line ? `<span class="badge">${esc(row.line)}</span>` : '';
+ el.innerHTML = `
+ <div class="imgwrap">
+ ${img}
+ <div class="dots">${dots}</div>
+ <div class="reveal">
+ ${lineBadge}
+ <div class="ptitle">${esc(row.pattern_name)}</div>
+ <div class="rmeta">${esc(row.color_name||'—')}${row.family?' · '+esc(row.family):''}</div>
+ ${row.collection?`<div class="rmeta">${esc(row.collection)}</div>`:''}
+ <button class="reqbtn ${inCart(row.sku)?'in':''}" data-sku="${esc(row.sku)}">${inCart(row.sku)?'✓ In sample request':'Request Sample'}</button>
+ </div>
+ </div>`;
+ // click anywhere on card (not the button) toggles the reveal open (touch/click reveal)
+ el.addEventListener('click',(e)=>{ if(e.target.closest('.reqbtn')) return; el.classList.toggle('open'); });
+ el.querySelector('.reqbtn').addEventListener('click',(e)=>{e.stopPropagation();toggleCart(row, e.currentTarget);});
+ return el;
+}
+
+// ---- cart ----
+function toggleCart(row, btn){
+ if(inCart(row.sku)){ cart=cart.filter(c=>c.sku!==row.sku); }
+ else cart.push({sku:row.sku,mfr_sku:row.mfr_sku,pattern_name:row.pattern_name,color_name:row.color_name,line:row.line,image:row.image});
+ LS.set('cart',cart);
+ if(btn){ btn.classList.toggle('in',inCart(row.sku)); btn.textContent=inCart(row.sku)?'✓ In sample request':'Request Sample'; }
+ $('#cartn').textContent=cart.length;
+}
+
+// ---- active-filter chip bar (removable) ----
+function renderActive(){
+ const bar=$('#activebar'); bar.innerHTML='';
+ let any=false;
+ for(const k of Object.keys(active)){
+ for(const v of (active[k]||[])){
+ any=true;
+ const c=document.createElement('span'); c.className='achip';
+ const label = k==='enriched' ? (v==='enriched'?'Enriched':'Unenriched') : v;
+ c.innerHTML=`<span class="k">${esc(FACET_LABEL[k]||k)}</span><span>${esc(label)}</span><button class="x" title="remove">×</button>`;
+ c.querySelector('.x').addEventListener('click',()=>{ active[k]=active[k].filter(x=>x!==v); if(!active[k].length) delete active[k]; LS.set('filters',active); loadFacets(); reset(); });
+ bar.appendChild(c);
+ }
+ }
+ if(any){
+ const clr=document.createElement('button'); clr.className='clearall'; clr.textContent='Clear all';
+ clr.addEventListener('click',()=>{active={};LS.set('filters',active);loadFacets();reset();});
+ bar.appendChild(clr);
+ bar.classList.remove('empty');
+ } else bar.classList.add('empty');
+}
+
+function toggleFacet(key,value){
+ active[key]=active[key]||[];
+ if(active[key].includes(value)) active[key]=active[key].filter(v=>v!==value);
+ else active[key].push(value);
+ if(!active[key].length) delete active[key];
+ LS.set('filters',active); loadFacets(); reset();
+}
+
+// ---- facets as CHIPS ----
+async function loadFacets(){
+ const r=await fetch('/api/facets'); const d=await r.json();
+ const f=d.facets;
+ const meta=[
+ ['family','Color Family',f.family,false,true],
+ ['style','Style',f.style,false,false],
+ ['material_bucket','Material',f.material_bucket,false,false],
+ ['enriched','Enrichment',f.enriched,false,false],
+ ['line','Line',f.line,false,false],
+ ['product_type','Product Type',f.product_type,false,false],
+ ['collection','Collection',f.collection,true,false],
+ ];
+ const root=$('#facets'); root.innerHTML='';
+ for(const [key,title,vals,searchable,swatch] of meta){
+ if(!vals || !vals.length) continue;
+ const h=document.createElement('h3'); h.textContent=title; root.appendChild(h);
+ let search=null;
+ if(searchable){
+ search=document.createElement('input'); search.type='text'; search.className='facet-search'; search.placeholder='Filter '+title.toLowerCase()+'…';
+ root.appendChild(search);
+ }
+ const box=document.createElement('div'); box.className=searchable?'chips facet-scroll':'chips';
+ for(const {value,count} of vals){
+ const on=(active[key]||[]).includes(value);
+ const chip=document.createElement('span');
+ chip.className='chip'+(on?' on':'')+(count===0&&!on?' zero':'');
+ chip.dataset.v=value.toLowerCase();
+ const label = key==='enriched' ? (value==='enriched'?'Enriched':'Unenriched') : value;
+ const sw = swatch ? `<span class="swatch" style="background:${FAMILY_SWATCH[value]||'#bbb'}"></span>` : '';
+ chip.innerHTML=`${sw}<span>${esc(label)}</span><span class="cc">${count}</span>`;
+ if(!(count===0&&!on)) chip.addEventListener('click',()=>toggleFacet(key,value));
+ box.appendChild(chip);
+ }
+ root.appendChild(box);
+ if(search) search.addEventListener('input',()=>{const t=search.value.toLowerCase();box.querySelectorAll('.chip').forEach(l=>l.style.display=l.dataset.v.includes(t)?'':'none');});
+ }
+ const clear=document.createElement('button'); clear.className='clearbtn'; clear.textContent='Clear all filters';
+ clear.addEventListener('click',()=>{active={};LS.set('filters',active);loadFacets();reset();});
+ root.appendChild(clear);
+}
+
+// ---- controls ----
+$('#sort').addEventListener('change',e=>{sort=e.target.value;LS.set('sort',sort);reset();});
+$('#density').addEventListener('input',e=>{density=+e.target.value;LS.set('density',density);document.documentElement.style.setProperty('--cols',density);});
+let qt; $('#q').addEventListener('input',()=>{clearTimeout(qt);qt=setTimeout(reset,250);});
+
+// ---- infinite scroll ----
+new IntersectionObserver((ents)=>{ if(ents[0].isIntersecting) load(); },{rootMargin:'600px'}).observe($('#sentinel'));
+
+// ---- sample modal ----
+const overlay=$('#overlay');
+function openCart(){
+ renderCartList();
+ $('#formArea').style.display = cart.length? '' : 'none';
+ $('#doneArea').style.display='none'; $('#doneArea').innerHTML='';
+ overlay.classList.add('open');
+}
+function closeCart(){ overlay.classList.remove('open'); }
+$('#cartbtn').addEventListener('click',openCart);
+$('#closex').addEventListener('click',closeCart);
+overlay.addEventListener('click',e=>{if(e.target===overlay)closeCart();});
+
+function renderCartList(){
+ const list=$('#cartlist');
+ if(!cart.length){ list.innerHTML='<div class="status">No items yet. Click “Request Sample” on a product.</div>'; return; }
+ list.innerHTML='';
+ cart.forEach(it=>{
+ const row=document.createElement('div'); row.className='citem';
+ row.innerHTML=`${it.image?`<img src="${it.image}">`:''}
+ <div><strong>${esc(it.pattern_name||it.sku)}</strong><br><span style="color:#6f6a62">${esc(it.color_name||'')} ${it.line?'· '+esc(it.line):''}</span></div>
+ <button class="x" title="remove">×</button>`;
+ row.querySelector('.x').addEventListener('click',()=>{cart=cart.filter(c=>c.sku!==it.sku);LS.set('cart',cart);$('#cartn').textContent=cart.length;document.querySelectorAll('.reqbtn').forEach(b=>{if(b.dataset.sku===it.sku){b.classList.remove('in');b.textContent='Request Sample';}});openCart();});
+ list.appendChild(row);
+ });
+}
+
+$('#reqform').addEventListener('submit',async e=>{
+ e.preventDefault();
+ if(!cart.length) return;
+ const fd=new FormData(e.target);
+ const payload={items:cart};
+ for(const [k,v] of fd.entries()) payload[k]=v;
+ const btn=$('#submitbtn'); btn.disabled=true; btn.textContent='Submitting…';
+ // Shopify checkout path (real sample order) when wired; else no-payment request below.
+ if(window.DWV_SAMPLE && window.DWV_SAMPLE.available()){
+ try{ btn.textContent='Opening secure checkout…'; await window.DWV_SAMPLE.checkout(cart,{name:payload.name,email:payload.email}); return; }
+ catch(err){ /* fall through to the no-payment request flow */ }
+ }
+ try{
+ const r=await fetch('/api/sample-request',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)});
+ const d=await r.json();
+ if(d.ok){
+ cart=[]; LS.set('cart',cart); $('#cartn').textContent=0;
+ document.querySelectorAll('.reqbtn.in').forEach(b=>{b.classList.remove('in');b.textContent='Request Sample';});
+ $('#formArea').style.display='none';
+ $('#doneArea').style.display='';
+ $('#doneArea').innerHTML=`<div class="ok">Thank you, ${esc(payload.name)} — your request for ${d.count} sample${d.count===1?'':'s'} was received. We’ll be in touch at ${esc(payload.email)}.</div>`;
+ } else { btn.disabled=false; btn.textContent='Submit sample request'; alert(d.error||'Could not submit.'); }
+ }catch(err){ btn.disabled=false; btn.textContent='Submit sample request'; alert('Network error.'); }
+});
+
+// ---- boot: read /api/config for title + per-vendor namespace, then hydrate state ----
+(async function boot(){
+ try{
+ const cfg=await (await fetch('/api/config')).json();
+ if(cfg.title){
+ document.title = cfg.title;
+ $('#brand').innerHTML = esc(cfg.title)+'<small>Designer Wallcoverings</small>';
+ NS = 'dwvm.'+cfg.title.replace(/[^a-z0-9]+/gi,'_').toLowerCase();
+ }
+ window.DWV_CFG = cfg.shopify || {};
+ if(window.DWV_CFG.storefrontToken && window.DWV_CFG.sampleVariantId){
+ await new Promise(res=>{const s=document.createElement('script');s.src='/buybutton.js';s.onload=res;s.onerror=res;document.head.appendChild(s);});
+ }
+ }catch{}
+ sort = LS.get('sort','newest');
+ density = LS.get('density',5);
+ cart = LS.get('cart',[]);
+ active = LS.get('filters',{});
+ $('#sort').value=sort;
+ $('#density').value=density;
+ document.documentElement.style.setProperty('--cols',density);
+ $('#cartn').textContent=cart.length;
+ renderActive();
+ loadFacets();
+ load();
+})();
+</script>
+</body>
+</html>
diff --git a/vendors/schumacher/viewer/server.js b/vendors/schumacher/viewer/server.js
new file mode 100644
index 0000000..9904dbf
--- /dev/null
+++ b/vendors/schumacher/viewer/server.js
@@ -0,0 +1,417 @@
+#!/usr/bin/env node
+/**
+ * DW Vendor Microsite — generalized catalog viewer (LOCAL, read-only browse + sample-order).
+ *
+ * Generalized from ~/Projects/cowtan-lines/viewer/server.js. The engine is
+ * vendor-agnostic: buildRows / sorters / facets / the /api/sample-request flow are
+ * uniform across every vendor's catalog schema (the staging JSONL is already
+ * normalized to the canonical cowtan shape by lib/export-catalog.sh).
+ *
+ * What is vendor-specific (read from argv / env / fieldmap.json):
+ * - JSONL source path : argv[3] || env VENDOR_JSONL || ../staging/cowtan.jsonl
+ * - banner / page title : env VENDOR_TITLE || fieldmap.title || 'Vendor Trade Lines'
+ * - samples-only policy : fieldmap.samples_only (no prices/checkout when true)
+ *
+ * These lines are intentionally OFF Shopify — the ONLY purchase action is a no-payment
+ * sample request. No prices are sold, no Shopify links, no checkout.
+ *
+ * Zero dependencies. Images are live vendor CDN URLs, used as-is (never upscaled).
+ * node server.js [port] [jsonl] [fieldmap]
+ * port default 0 = OS-assigned free port
+ * jsonl default env VENDOR_JSONL || ../staging/cowtan.jsonl
+ * fieldmap default env VENDOR_FIELDMAP || ./fieldmap.json (optional)
+ */
+const http = require('http');
+const fs = require('fs');
+const path = require('path');
+
+const PORT = parseInt(process.argv[2] || '0', 10);
+const DIR = path.join(__dirname, '..', '..', '..', 'staging'); // repo/vendors/<v>/viewer -> repo/staging
+const SRC = process.argv[3] || process.env.VENDOR_JSONL || path.join(__dirname, '..', 'staging', 'cowtan.jsonl');
+const FIELDMAP_PATH = process.argv[4] || process.env.VENDOR_FIELDMAP || path.join(__dirname, 'fieldmap.json');
+const PUBLIC = path.join(__dirname, 'public');
+const DATA = path.join(__dirname, 'data');
+const REQUESTS = path.join(DATA, 'sample-requests.jsonl');
+
+let FIELDMAP = {};
+try { if (fs.existsSync(FIELDMAP_PATH)) FIELDMAP = JSON.parse(fs.readFileSync(FIELDMAP_PATH, 'utf8')); } catch { FIELDMAP = {}; }
+const TITLE = process.env.VENDOR_TITLE || FIELDMAP.title || 'Vendor Trade Lines';
+const SAMPLES_ONLY = FIELDMAP.samples_only !== false; // default true (samples-only / no checkout)
+
+const readJsonl = (f) => (fs.existsSync(f)
+ ? fs.readFileSync(f, 'utf8').trim().split('\n').filter(Boolean).map((l) => { try { return JSON.parse(l); } catch { return null; } }).filter(Boolean)
+ : []);
+
+const num = (v) => { if (v == null) return null; const m = String(v).match(/[\d.]+/); return m ? parseFloat(m[0]) : null; };
+
+// perceived luminance 0..255 from #rrggbb
+function lum(hex) {
+ if (!hex || hex[0] !== '#' || hex.length !== 7) return null;
+ const r = parseInt(hex.slice(1, 3), 16), g = parseInt(hex.slice(3, 5), 16), b = parseInt(hex.slice(5, 7), 16);
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
+}
+// hue 0..360 from #rrggbb (for color-wheel sort)
+function hue(hex) {
+ if (!hex || hex[0] !== '#' || hex.length !== 7) return null;
+ let r = parseInt(hex.slice(1, 3), 16) / 255, g = parseInt(hex.slice(3, 5), 16) / 255, b = parseInt(hex.slice(5, 7), 16) / 255;
+ const mx = Math.max(r, g, b), mn = Math.min(r, g, b), d = mx - mn;
+ if (d === 0) return -1; // grayscale -> sort to end
+ let h;
+ if (mx === r) h = ((g - b) / d) % 6;
+ else if (mx === g) h = (b - r) / d + 2;
+ else h = (r - g) / d + 4;
+ h *= 60; if (h < 0) h += 360;
+ return h;
+}
+
+// ---- ENHANCED bucketing (Steve's spec) ------------------------------------
+// Full HSL from #rrggbb -> {h:0..360, s:0..1, l:0..1} or null.
+function hsl(hex) {
+ if (!hex || hex[0] !== '#' || hex.length !== 7) return null;
+ let r = parseInt(hex.slice(1, 3), 16) / 255, g = parseInt(hex.slice(3, 5), 16) / 255, b = parseInt(hex.slice(5, 7), 16) / 255;
+ if ([r, g, b].some((v) => Number.isNaN(v))) return null;
+ const mx = Math.max(r, g, b), mn = Math.min(r, g, b), d = mx - mn;
+ const l = (mx + mn) / 2;
+ let s = 0, h = 0;
+ if (d !== 0) {
+ s = l > 0.5 ? d / (2 - mx - mn) : d / (mx + mn);
+ if (mx === r) h = ((g - b) / d) % 6;
+ else if (mx === g) h = (b - r) / d + 2;
+ else h = (r - g) / d + 4;
+ h *= 60; if (h < 0) h += 360;
+ }
+ return { h, s, l };
+}
+
+// Canonical color families (order = display order; 0-count still listed by facets()).
+const COLOR_FAMILIES = ['Red', 'Orange/Brown', 'Yellow', 'Green', 'Teal', 'Blue', 'Purple', 'Pink', 'Neutral/Beige', 'Black', 'Grey', 'White'];
+// ai_colors hint words -> family (fallback when hex absent/ambiguous).
+const AI_COLOR_TO_FAMILY = {
+ red: 'Red', crimson: 'Red', scarlet: 'Red', burgundy: 'Red', maroon: 'Red', wine: 'Red',
+ orange: 'Orange/Brown', terracotta: 'Orange/Brown', rust: 'Orange/Brown', brown: 'Orange/Brown', tan: 'Orange/Brown', camel: 'Orange/Brown', copper: 'Orange/Brown', bronze: 'Orange/Brown', amber: 'Orange/Brown', coffee: 'Orange/Brown', chocolate: 'Orange/Brown',
+ yellow: 'Yellow', gold: 'Yellow', mustard: 'Yellow', ochre: 'Yellow',
+ green: 'Green', olive: 'Green', sage: 'Green', lime: 'Green', emerald: 'Green', forest: 'Green', moss: 'Green',
+ teal: 'Teal', turquoise: 'Teal', aqua: 'Teal', cyan: 'Teal',
+ blue: 'Blue', navy: 'Blue', indigo: 'Blue', cobalt: 'Blue', azure: 'Blue', denim: 'Blue',
+ purple: 'Purple', violet: 'Purple', lavender: 'Purple', plum: 'Purple', mauve: 'Purple', lilac: 'Purple',
+ pink: 'Pink', rose: 'Pink', blush: 'Pink', fuchsia: 'Pink', magenta: 'Pink', coral: 'Pink', salmon: 'Pink',
+ beige: 'Neutral/Beige', cream: 'Neutral/Beige', ivory: 'Neutral/Beige', taupe: 'Neutral/Beige', sand: 'Neutral/Beige', linen: 'Neutral/Beige', natural: 'Neutral/Beige', oatmeal: 'Neutral/Beige', greige: 'Neutral/Beige', stone: 'Neutral/Beige',
+ black: 'Black', charcoal: 'Black', ebony: 'Black', onyx: 'Black',
+ grey: 'Grey', gray: 'Grey', silver: 'Grey', slate: 'Grey', pewter: 'Grey', smoke: 'Grey',
+ white: 'White', chalk: 'White', alabaster: 'White', snow: 'White',
+};
+// hue-degrees -> chromatic family bucket.
+function familyFromHue(h) {
+ if (h < 15 || h >= 345) return 'Red';
+ if (h < 45) return 'Orange/Brown';
+ if (h < 70) return 'Yellow';
+ if (h < 160) return 'Green';
+ if (h < 195) return 'Teal';
+ if (h < 255) return 'Blue';
+ if (h < 290) return 'Purple';
+ if (h < 345) return 'Pink';
+ return 'Red';
+}
+// Derive the color family for a row. hex first (HSL), ai_colors as fallback hint.
+function colorFamily(hex, aiColors) {
+ const c = hsl(hex);
+ if (c) {
+ // low-saturation -> achromatic by luminance
+ if (c.s < 0.12) {
+ if (c.l < 0.18) return 'Black';
+ if (c.l > 0.88) return 'White';
+ if (c.l > 0.70) return 'Neutral/Beige';
+ return 'Grey';
+ }
+ // low-ish sat + warm hue + mid/high lum -> beige rather than a vivid family
+ if (c.s < 0.22 && c.l > 0.62 && (c.h < 70 || c.h >= 330)) return 'Neutral/Beige';
+ return familyFromHue(c.h);
+ }
+ // hex missing/invalid -> ai_colors hint (first matchable word)
+ if (Array.isArray(aiColors)) {
+ for (const w of aiColors) {
+ const key = String(w || '').trim().toLowerCase();
+ if (AI_COLOR_TO_FAMILY[key]) return AI_COLOR_TO_FAMILY[key];
+ // partial: "dark green" -> green
+ for (const word of key.split(/[^a-z]+/)) if (AI_COLOR_TO_FAMILY[word]) return AI_COLOR_TO_FAMILY[word];
+ }
+ }
+ return null;
+}
+
+// Canonical styles (display order). Derived from ai_styles + ai_patterns keywords.
+const STYLE_BUCKETS = ['Floral', 'Botanical', 'Damask', 'Toile', 'Stripe', 'Geometric', 'Plaid/Check', 'Trellis', 'Animal/Fauna', 'Scenic/Mural', 'Abstract', 'Texture/Plain', 'Metallic', 'Traditional', 'Modern'];
+const STYLE_KEYWORDS = [
+ ['Floral', ['floral', 'flower', 'rose', 'peony', 'bloom', 'blossom', 'chintz']],
+ ['Botanical', ['botanical', 'leaf', 'leaves', 'fern', 'palm', 'foliage', 'tree', 'vine', 'garden', 'jungle', 'tropical']],
+ ['Damask', ['damask', 'medallion', 'ogee']],
+ ['Toile', ['toile']],
+ ['Stripe', ['stripe', 'striped', 'pinstripe', 'ticking']],
+ ['Plaid/Check', ['plaid', 'check', 'tartan', 'gingham', 'houndstooth', 'windowpane']],
+ ['Trellis', ['trellis', 'lattice', 'fretwork']],
+ ['Geometric', ['geometric', 'chevron', 'herringbone', 'diamond', 'hexagon', 'grid', 'dot', 'polka', 'moroccan', 'fret', 'greek key', 'op art']],
+ ['Animal/Fauna', ['animal', 'bird', 'butterfly', 'fauna', 'leopard', 'zebra', 'tiger', 'peacock', 'fish', 'insect', 'skin', 'hide']],
+ ['Scenic/Mural', ['scenic', 'mural', 'landscape', 'panoramic', 'chinoiserie', 'view', 'cityscape', 'map']],
+ ['Metallic', ['metallic', 'foil', 'mica', 'gilt', 'gilded', 'shimmer', 'glitter']],
+ ['Texture/Plain', ['texture', 'textured', 'plain', 'solid', 'grasscloth', 'linen', 'woven', 'weave', 'sisal', 'cork', 'faux', 'concrete', 'stucco', 'plaster', 'leather', 'suede', 'tweed']],
+ ['Abstract', ['abstract', 'organic', 'watercolor', 'marble', 'painterly', 'brushstroke', 'ombre', 'tie dye', 'splatter']],
+ ['Traditional', ['traditional', 'classic', 'heritage', 'colonial', 'victorian']],
+ ['Modern', ['modern', 'contemporary', 'minimal', 'mid-century', 'midcentury', 'scandinavian']],
+];
+// First matching style bucket from the row's ai_styles + ai_patterns words.
+function styleBucket(aiStyles, aiPatterns) {
+ const words = [];
+ for (const arr of [aiStyles, aiPatterns]) if (Array.isArray(arr)) for (const w of arr) words.push(String(w || '').toLowerCase());
+ const blob = ' ' + words.join(' ') + ' ';
+ for (const [bucket, kws] of STYLE_KEYWORDS) for (const kw of kws) if (blob.includes(kw)) return bucket;
+ return null;
+}
+
+// Material buckets from material / product_type strings.
+const MATERIAL_BUCKETS = ['Non-woven', 'Paper', 'Vinyl', 'Grasscloth', 'Fabric/Textile', 'Cork', 'Mylar/Metallic', 'Leather/Suede', 'Mural', 'Other'];
+const MATERIAL_KEYWORDS = [
+ ['Non-woven', ['non-woven', 'nonwoven', 'non woven']],
+ ['Grasscloth', ['grasscloth', 'grass cloth', 'sisal', 'jute', 'hemp', 'raffia', 'arrowroot', 'seagrass']],
+ ['Vinyl', ['vinyl', 'pvc', 'type ii', 'type 2', 'commercial']],
+ ['Cork', ['cork']],
+ ['Mylar/Metallic', ['mylar', 'metallic', 'foil', 'mica']],
+ ['Leather/Suede', ['leather', 'suede', 'ultrasuede', 'hide']],
+ ['Mural', ['mural', 'panel', 'panoramic']],
+ ['Fabric/Textile', ['fabric', 'textile', 'linen', 'silk', 'cotton', 'wool', 'velvet', 'woven', 'weave']],
+ ['Paper', ['paper', 'wallpaper', 'wallcovering', 'pulp']],
+];
+function materialBucket(material, ptype) {
+ const blob = ' ' + (String(material || '') + ' ' + String(ptype || '')).toLowerCase() + ' ';
+ if (blob.trim() === '') return null;
+ for (const [bucket, kws] of MATERIAL_KEYWORDS) for (const kw of kws) if (blob.includes(kw)) return bucket;
+ return null;
+}
+
+function buildRows() {
+ const rows = [];
+ let i = 0;
+ for (const r of readJsonl(SRC)) {
+ let images = [];
+ if (Array.isArray(r.all_images)) images = r.all_images;
+ else if (typeof r.all_images === 'string' && r.all_images.trim()) { try { images = JSON.parse(r.all_images); } catch { images = []; } }
+ if (!images.length && r.image_url) images = [r.image_url];
+ const ptype = (r.product_type || '').replace(/^./, (c) => c.toUpperCase()); // normalize casing
+ const parseArr = (v) => Array.isArray(v) ? v : (typeof v === 'string' && v.trim() ? (() => { try { return JSON.parse(v); } catch { return []; } })() : []);
+ const aiColors = parseArr(r.ai_colors), aiStyles = parseArr(r.ai_styles), aiPatterns = parseArr(r.ai_patterns);
+ const enriched = (aiColors.length > 0 || aiStyles.length > 0); // ai_colors OR ai_styles non-empty
+ rows.push({
+ idx: i++,
+ sku: r.dw_sku || r.mfr_sku || String(i),
+ mfr_sku: r.mfr_sku || null,
+ pattern_name: r.pattern_name || r.mfr_sku || '(untitled)',
+ color_name: r.color_name || null,
+ collection: r.collection || null,
+ product_type: ptype || null,
+ material: r.material || null,
+ width: r.width || null,
+ repeat_v: r.repeat_v || null,
+ repeat_h: r.repeat_h || null,
+ color_primary: r.color_primary || null,
+ color_hex: r.color_hex || null,
+ ai_colors: aiColors,
+ ai_styles: aiStyles,
+ ai_patterns: aiPatterns,
+ repeat_classification: r.repeat_classification || null,
+ finish: r.finish || null,
+ application: r.application || null,
+ coverage: r.coverage || null,
+ fire_rating: r.fire_rating || null,
+ line: r.line || r.material || null,
+ image: r.image_url || images[0] || null,
+ images,
+ image_count: images.length,
+ // ENHANCED buckets (server-side)
+ family: colorFamily(r.color_hex, aiColors),
+ style: styleBucket(aiStyles, aiPatterns),
+ material_bucket: materialBucket(r.material, ptype),
+ enriched,
+ _lum: lum(r.color_hex),
+ _hue: hue(r.color_hex),
+ });
+ }
+ return rows;
+}
+
+let ROWS = buildRows();
+fs.watchFile(SRC, { interval: 5000 }, () => { ROWS = buildRows(); });
+
+const cmpStr = (a, b) => String(a == null ? '' : a).localeCompare(String(b == null ? '' : b), undefined, { sensitivity: 'base' });
+const nullsLast = (v) => (v == null ? Infinity : v);
+
+const sorters = {
+ newest: null, // natural staged order
+ pattern: (a, b) => cmpStr(a.pattern_name, b.pattern_name),
+ color_name: (a, b) => cmpStr(a.color_name, b.color_name),
+ collection: (a, b) => cmpStr(a.collection, b.collection) || cmpStr(a.pattern_name, b.pattern_name),
+ line: (a, b) => cmpStr(a.line, b.line) || cmpStr(a.pattern_name, b.pattern_name),
+ product_type: (a, b) => cmpStr(a.product_type, b.product_type) || cmpStr(a.pattern_name, b.pattern_name),
+ material: (a, b) => cmpStr(a.material, b.material) || cmpStr(a.pattern_name, b.pattern_name),
+ // light -> dark: brightest first; missing-hex always sort last
+ light: (a, b) => { const la = a._lum == null ? -1 : a._lum, lb = b._lum == null ? -1 : b._lum; return lb - la; },
+ // dark -> light: darkest first; missing-hex always sort last
+ dark: (a, b) => { const la = a._lum == null ? 999 : a._lum, lb = b._lum == null ? 999 : b._lum; return la - lb; },
+ hue: (a, b) => {
+ // grayscale (-1) and null sort to the very end
+ const ha = a._hue == null || a._hue < 0 ? 9999 : a._hue;
+ const hb = b._hue == null || b._hue < 0 ? 9999 : b._hue;
+ return ha - hb;
+ },
+ sku: (a, b) => cmpStr(a.mfr_sku || a.sku, b.mfr_sku || b.sku),
+ // group by canonical color family (display order), nulls last, then by hue within
+ family: (a, b) => {
+ const ia = a.family == null ? 999 : COLOR_FAMILIES.indexOf(a.family);
+ const ib = b.family == null ? 999 : COLOR_FAMILIES.indexOf(b.family);
+ if (ia !== ib) return ia - ib;
+ const ha = a._hue == null || a._hue < 0 ? 9999 : a._hue, hb = b._hue == null || b._hue < 0 ? 9999 : b._hue;
+ return ha - hb;
+ },
+ // group by canonical style (display order), nulls last, then pattern name
+ style: (a, b) => {
+ const ia = a.style == null ? 999 : STYLE_BUCKETS.indexOf(a.style);
+ const ib = b.style == null ? 999 : STYLE_BUCKETS.indexOf(b.style);
+ return ia - ib || cmpStr(a.pattern_name, b.pattern_name);
+ },
+};
+
+function facets() {
+ // ENHANCED facets: color-family / style / material (bucketed) REPLACE raw color_primary
+ // as the color facet. Plus enriched, line, product_type, collection.
+ const fam = {}, sty = {}, mat = {};
+ const f = { line: {}, product_type: {}, collection: {} };
+ let enrichedN = 0, unenrichedN = 0;
+ for (const r of ROWS) {
+ const bump = (o, v) => { if (v == null || v === '') return; o[v] = (o[v] || 0) + 1; };
+ bump(fam, r.family);
+ bump(sty, r.style);
+ bump(mat, r.material_bucket);
+ bump(f.line, r.line);
+ bump(f.product_type, r.product_type);
+ bump(f.collection, r.collection);
+ if (r.enriched) enrichedN++; else unenrichedN++;
+ }
+ // canonical-ordered facets: every value listed even at count 0 (UI greys 0s)
+ const ordered = (canon, counts) => canon.map((value) => ({ value, count: counts[value] || 0 }));
+ // count-desc for free-form facets; collection alpha (searchable)
+ const byCount = (counts) => Object.entries(counts).sort((a, b) => b[1] - a[1]).map(([value, count]) => ({ value, count }));
+ const byAlpha = (counts) => Object.entries(counts).sort((a, b) => a[0].localeCompare(b[0])).map(([value, count]) => ({ value, count }));
+ return {
+ family: ordered(COLOR_FAMILIES, fam),
+ style: ordered(STYLE_BUCKETS, sty),
+ material_bucket: ordered(MATERIAL_BUCKETS, mat),
+ enriched: [
+ { value: 'enriched', count: enrichedN },
+ { value: 'unenriched', count: unenrichedN },
+ ],
+ line: byCount(f.line),
+ product_type: byCount(f.product_type),
+ collection: byAlpha(f.collection),
+ };
+}
+
+const json = (res, code, obj) => { res.writeHead(code, { 'Content-Type': 'application/json' }); res.end(JSON.stringify(obj)); };
+
+const server = http.createServer((req, res) => {
+ const u = new URL(req.url, 'http://localhost');
+
+ if (u.pathname === '/api/config') {
+ return json(res, 200, { title: TITLE, samples_only: SAMPLES_ONLY, total: ROWS.length,
+ shopify: {
+ domain: process.env.SHOPIFY_STORE_DOMAIN || 'designer-laboratory-sandbox.myshopify.com',
+ storefrontToken: process.env.SHOPIFY_STOREFRONT_TOKEN || '',
+ sampleVariantId: process.env.SHOPIFY_SAMPLE_VARIANT_ID || ''
+ } });
+ }
+
+ if (u.pathname === '/api/facets') {
+ return json(res, 200, { total: ROWS.length, facets: facets() });
+ }
+
+ if (u.pathname === '/api/skus') {
+ const q = (u.searchParams.get('q') || '').trim().toLowerCase();
+ const sort = u.searchParams.get('sort') || 'newest';
+ const offset = parseInt(u.searchParams.get('offset') || '0', 10);
+ const limit = Math.min(parseInt(u.searchParams.get('limit') || '60', 10), 200);
+ // multi-select facets: pipe-separated ('|'). Buckets + free-form + enriched.
+ const sel = (k) => { const v = u.searchParams.get(k); return v ? v.split('|').filter(Boolean) : []; };
+ const fFam = sel('family'), fStyle = sel('style'), fMat = sel('material_bucket');
+ const fEnr = sel('enriched'); // 'enriched' | 'unenriched' (multi tolerated -> OR)
+ const fLine = sel('line'), fType = sel('product_type'), fColl = sel('collection');
+
+ let rows = ROWS;
+ const inAny = (arr, val) => arr.length === 0 || arr.includes(val == null ? '' : val);
+ const enrMatch = (r) => {
+ if (!fEnr.length) return true;
+ const wantE = fEnr.includes('enriched'), wantU = fEnr.includes('unenriched');
+ return (wantE && r.enriched) || (wantU && !r.enriched);
+ };
+ rows = rows.filter((r) =>
+ inAny(fFam, r.family) && inAny(fStyle, r.style) && inAny(fMat, r.material_bucket) &&
+ inAny(fLine, r.line) && inAny(fType, r.product_type) && inAny(fColl, r.collection) && enrMatch(r));
+ if (q) {
+ rows = rows.filter((r) => (
+ (r.pattern_name || '') + ' ' + (r.color_name || '') + ' ' + (r.mfr_sku || '') + ' ' +
+ (r.sku || '') + ' ' + (r.collection || '')).toLowerCase().includes(q));
+ }
+ if (sorters[sort]) rows = [...rows].sort(sorters[sort]);
+ const page = rows.slice(offset, offset + limit);
+ return json(res, 200, { total: rows.length, all: ROWS.length, offset, limit, rows: page });
+ }
+
+ if (u.pathname === '/api/sample-request' && req.method === 'POST') {
+ let body = '';
+ req.on('data', (c) => { body += c; if (body.length > 1e6) req.destroy(); });
+ req.on('end', () => {
+ let p; try { p = JSON.parse(body || '{}'); } catch { return json(res, 400, { ok: false, error: 'bad json' }); }
+ const name = (p.name || '').toString().trim();
+ const email = (p.email || '').toString().trim();
+ const items = Array.isArray(p.items) ? p.items.slice(0, 200) : [];
+ if (!name || !email || !/.+@.+\..+/.test(email) || !items.length) {
+ return json(res, 400, { ok: false, error: 'name, valid email, and at least one item are required' });
+ }
+ const rec = {
+ ts: new Date().toISOString(),
+ vendor: TITLE,
+ name, email,
+ company: (p.company || '').toString().trim() || null,
+ phone: (p.phone || '').toString().trim() || null,
+ address: (p.address || '').toString().trim() || null,
+ notes: (p.notes || '').toString().trim() || null,
+ items: items.map((it) => ({
+ sku: (it.sku || '').toString(),
+ mfr_sku: (it.mfr_sku || '').toString() || null,
+ pattern_name: (it.pattern_name || '').toString() || null,
+ color_name: (it.color_name || '').toString() || null,
+ line: (it.line || '').toString() || null,
+ })),
+ ua: (req.headers['user-agent'] || '').slice(0, 200),
+ };
+ try {
+ fs.mkdirSync(DATA, { recursive: true });
+ fs.appendFileSync(REQUESTS, JSON.stringify(rec) + '\n');
+ } catch (e) {
+ return json(res, 500, { ok: false, error: 'could not save request' });
+ }
+ return json(res, 200, { ok: true, count: rec.items.length });
+ });
+ return;
+ }
+
+ // static
+ let pth = u.pathname === '/' ? '/index.html' : u.pathname;
+ const file = path.join(PUBLIC, path.normalize(pth).replace(/^(\.\.[/\\])+/, ''));
+ if (!file.startsWith(PUBLIC) || !fs.existsSync(file) || fs.statSync(file).isDirectory()) { res.writeHead(404); return res.end('not found'); }
+ const ext = path.extname(file);
+ const mime = { '.html': 'text/html; charset=utf-8', '.js': 'text/javascript', '.css': 'text/css', '.svg': 'image/svg+xml', '.png': 'image/png', '.jpg': 'image/jpeg', '.ico': 'image/x-icon' }[ext] || 'text/plain';
+ res.writeHead(200, { 'Content-Type': mime });
+ res.end(fs.readFileSync(file));
+});
+
+server.listen(PORT, () => {
+ const addr = server.address();
+ console.log(`${TITLE} viewer -> http://localhost:${addr.port} (${ROWS.length} products${SAMPLES_ONLY ? ', samples-only' : ''})`);
+});
← bb10e42 build andrew_martin (Andrew Martin) -> BUILT, port 10007, 11
·
back to Dw Vendor Microsites
·
build rebel_walls (Rebel Walls) -> BUILT, port 10008, 4124 s 7d62fd9 →