← back to Dw Vendor Microsites
build zoffany (Zoffany) -> BUILT, port 10090, 384 skus, img 0.992
f52a6525bf36c22a53800ce74b8800822ba5306e · 2026-06-30 15:05:18 -0700 · Steve
Files touched
M manifest.jsonA staging/baker_lifestyle.jsonlA vendors/zoffany/viewer/fieldmap.jsonA vendors/zoffany/viewer/public/buybutton.jsA vendors/zoffany/viewer/public/index.htmlA vendors/zoffany/viewer/server.js
Diff
commit f52a6525bf36c22a53800ce74b8800822ba5306e
Author: Steve <steve@designerwallcoverings.com>
Date: Tue Jun 30 15:05:18 2026 -0700
build zoffany (Zoffany) -> BUILT, port 10090, 384 skus, img 0.992
---
manifest.json | 10 +-
staging/baker_lifestyle.jsonl | 74 +++++
vendors/zoffany/viewer/fieldmap.json | 6 +
vendors/zoffany/viewer/public/buybutton.js | 70 +++++
vendors/zoffany/viewer/public/index.html | 414 ++++++++++++++++++++++++++++
vendors/zoffany/viewer/server.js | 417 +++++++++++++++++++++++++++++
6 files changed, 988 insertions(+), 3 deletions(-)
diff --git a/manifest.json b/manifest.json
index e4fcf7b..feb2199 100644
--- a/manifest.json
+++ b/manifest.json
@@ -2085,9 +2085,13 @@
"table_count": 384,
"samples_only": true,
"status": "OK",
- "build_status": "PENDING",
+ "build_status": "BUILT",
"deploy_status": "PENDING",
- "wave": 12
+ "wave": 12,
+ "port": 10090,
+ "sku_count": 384,
+ "image_health": 0.992,
+ "image_status": "HEALTHY"
},
"atomic50": {
"vendor_code": "atomic50",
@@ -2237,7 +2241,7 @@
"wave": 16
}
},
- "updated_at": "2026-06-30T15:05:14.335998",
+ "updated_at": "2026-06-30T15:05:18.682001",
"stats": {
"total_vendors": 118,
"buildable": 117,
diff --git a/staging/baker_lifestyle.jsonl b/staging/baker_lifestyle.jsonl
new file mode 100644
index 0000000..a32efe1
--- /dev/null
+++ b/staging/baker_lifestyle.jsonl
@@ -0,0 +1,74 @@
+{"id": 128, "mfr_sku": "PW78000.5", "dw_sku": "DWBL-820001", "pattern_name": "Exbury Star", "color_name": "Biscuit", "collection": "Homes & Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": null, "repeat_h": null, "material": "Paper - 100%", "price_retail": 29.9, "price_trade": 14.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzm-bcuyps-eme61q/PW78000_5.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:07.032008+00:00", "created_at": "2026-02-24T20:09:19.552716+00:00", "updated_at": "2026-02-25T03:28:07.032008+00:00", "color_hex": "#F0E6D2", "ai_colors": [{"hex": "#F0E6D2", "name": "Beige", "percentage": 55}, {"hex": "#D1B992", "name": "Sand", "percentage": 45}], "ai_styles": ["Traditional"], "ai_patterns": ["Geometric"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Sand", "Traditional", "Geometric", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate geometric pattern reminiscent of traditional Japanese designs. The neutral beige and sand tones create a calming and sophisticated atmosphere. Ideal for adding subtle texture and visual interest to living rooms, bedrooms, or studies.", "dominant_color_hex": "#F0E6D2", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 15, "mfr_sku": "PW78001.4", "dw_sku": "DWBL-820003", "pattern_name": "Scampston Trail", "color_name": "Silver", "collection": "Homes & Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "14 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 116.0, "price_trade": 58.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzn-btf3d4-6dpv2c/PW78001_4.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.15204+00:00", "created_at": "2026-02-24T20:09:17.755303+00:00", "updated_at": "2026-02-25T03:28:06.15204+00:00", "color_hex": "#F5F1E3", "ai_colors": [{"hex": "#F5F1E3", "name": "Cream", "percentage": 60}, {"hex": "#A39B8E", "name": "Taupe", "percentage": 30}, {"hex": "#F2F2F2", "name": "White", "percentage": 5}, {"hex": "#D9D9D9", "name": "Light Gray", "percentage": 5}], "ai_styles": ["Traditional"], "ai_patterns": ["Floral", "Botanical"], "ai_background_color": "Cream", "ai_tags": ["Cream", "White", "Taupe", "Brown", "Light Gray", "Traditional", "Floral", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate floral pattern with winding stems and small, stylized flowers. The design evokes a sense of classic elegance and understated beauty. It is well-suited for creating a serene and inviting atmosphere in bedrooms, living rooms, or dining areas.", "dominant_color_hex": "#F5F1E3", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 13, "mfr_sku": "PW78003.3", "dw_sku": "DWBL-820005", "pattern_name": "Mottisfont", "color_name": "Ivory/Stone", "collection": "Homes & Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "24 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 116.0, "price_trade": 58.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzn-fd2xzc-81ghb6/PW78003_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.15074+00:00", "created_at": "2026-02-24T20:09:17.753666+00:00", "updated_at": "2026-02-25T03:28:06.15074+00:00", "color_hex": "#E5D9C6", "ai_colors": [{"hex": "#E5D9C6", "name": "Beige", "percentage": 50}, {"hex": "#F2F2F2", "name": "Off-white", "percentage": 30}, {"hex": "#B3A694", "name": "Taupe", "percentage": 15}, {"hex": "#D1D1D1", "name": "Gray", "percentage": 5}], "ai_styles": ["Traditional"], "ai_patterns": ["Floral"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Off-white", "Taupe", "Brown", "Gray", "Traditional", "Floral", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate floral pattern with roses and hydrangeas. The neutral color palette evokes a sense of classic elegance and tranquility. Ideal for creating a serene and inviting atmosphere in bedrooms, living rooms, or dining areas.", "dominant_color_hex": "#E5D9C6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 29, "mfr_sku": "PW78004.3", "dw_sku": "DWBL-820006", "pattern_name": "Charlecote", "color_name": "Stone", "collection": "Homes & Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "2 in", "repeat_h": "4 in", "material": "Paper - 100%", "price_retail": 116.0, "price_trade": 58.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzn-9wbdhs-85sn4m/PW78004_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.373806+00:00", "created_at": "2026-02-24T20:09:17.76605+00:00", "updated_at": "2026-02-25T03:28:06.373806+00:00", "color_hex": "#E0D8C7", "ai_colors": [{"hex": "#E0D8C7", "name": "Beige", "percentage": 55}, {"hex": "#F2EFE6", "name": "Off-white", "percentage": 45}], "ai_styles": ["Contemporary"], "ai_patterns": ["Geometric"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Off-white", "Contemporary", "Geometric", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a geometric pattern of stylized floral shapes in off-white against a beige background. The design offers a clean, modern aesthetic with a subtle textural quality. Recommended for use in residential or commercial spaces seeking a sophisticated and understated look.", "dominant_color_hex": "#E0D8C7", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 26, "mfr_sku": "PW78005.6", "dw_sku": "DWBL-820009", "pattern_name": "Chillingham", "color_name": "Ivory/Bronze", "collection": "Homes & Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "20 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 31.9, "price_trade": 15.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzo-begd2o-4wgo0g/PW78005_6.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.371838+00:00", "created_at": "2026-02-24T20:09:17.763529+00:00", "updated_at": "2026-02-25T03:28:06.371838+00:00", "color_hex": "#F5F3E8", "ai_colors": [{"hex": "#F5F3E8", "name": "Off-white", "percentage": 65}, {"hex": "#C2A779", "name": "Tan", "percentage": 35}], "ai_styles": ["Chinoiserie"], "ai_patterns": ["Toile"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Tan", "Chinoiserie", "Toile", "Paper", "Animal", "Insects", "Birds", "Dog"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic toile pattern with whimsical Chinoiserie motifs. The design evokes a sense of historical elegance and playful charm. Ideal for creating a sophisticated yet inviting atmosphere in living rooms, bedrooms, or studies.", "dominant_color_hex": "#F5F3E8", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 46, "mfr_sku": "PW78007.1", "dw_sku": "DWBL-820011", "pattern_name": "Rare Breeds", "color_name": "Aqua", "collection": "Opera Garden", "product_type": "Wallcovering", "width": "27\"", "length": null, "repeat_v": "12 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 35.9, "price_trade": 17.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzn-bp0ofk-z57vc/PW78007_1.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.589027+00:00", "created_at": "2026-02-24T20:09:17.777797+00:00", "updated_at": "2026-02-25T03:28:06.589027+00:00", "color_hex": "#B0C4B5", "ai_colors": [{"hex": "#B0C4B5", "name": "Pale Green", "percentage": 50}, {"hex": "#D2B48C", "name": "Tan", "percentage": 25}, {"hex": "#F8F8FF", "name": "White", "percentage": 15}, {"hex": "#000000", "name": "Black", "percentage": 10}], "ai_styles": ["Farmhouse"], "ai_patterns": ["Animal"], "ai_background_color": "Pale Green", "ai_tags": ["Pale Green", "Tan", "White", "Black", "Farmhouse", "Animal", "Paper", "Insects", "Chicken"], "width_inches": 27.0, "on_shopify": false, "ai_description": "This wallcovering features a charming chicken motif scattered across a pale green background. The farmhouse style evokes a sense of rustic comfort and nostalgia. It is recommended for use in kitchens, nurseries, or any space seeking a touch of whimsy.", "dominant_color_hex": "#B0C4B5", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 48, "mfr_sku": "PW78009.1", "dw_sku": "DWBL-820012", "pattern_name": "Bantam Trail", "color_name": "Aqua", "collection": "Opera Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "5 in", "repeat_h": "5 in", "material": "Paper - 100%", "price_retail": 29.9, "price_trade": 14.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzp-4y6hao-e1bf7c/PW78009_1.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.590253+00:00", "created_at": "2026-02-24T20:09:17.779167+00:00", "updated_at": "2026-02-25T03:28:06.590253+00:00", "color_hex": "#F2EFE3", "ai_colors": [{"hex": "#F2EFE3", "name": "Beige", "percentage": 65}, {"hex": "#589799", "name": "Teal", "percentage": 35}], "ai_styles": ["Farmhouse", "Scandinavian"], "ai_patterns": ["Botanical"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Teal", "Blue", "Farmhouse", "Scandinavian", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate botanical pattern of teal sprigs against a soft beige background. The design evokes a sense of calm and simplicity, making it ideal for creating a cozy and inviting atmosphere. Recommended for bedrooms, nurseries, or any space where a touch of nature is desired.", "dominant_color_hex": "#F2EFE3", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 52, "mfr_sku": "PW78009.2", "dw_sku": "DWBL-820013", "pattern_name": "Bantam Trail", "color_name": "Silver", "collection": "Opera Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "5 in", "repeat_h": "5 in", "material": "Paper - 100%", "price_retail": 29.9, "price_trade": 14.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzo-6p5l1c-66ty52/PW78009_2.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.821657+00:00", "created_at": "2026-02-24T20:09:17.781645+00:00", "updated_at": "2026-02-25T03:28:06.821657+00:00", "color_hex": "#F5F0E6", "ai_colors": [{"hex": "#F5F0E6", "name": "Off-white", "percentage": 55}, {"hex": "#84867E", "name": "Gray", "percentage": 45}], "ai_styles": ["Traditional", "Farmhouse"], "ai_patterns": ["Botanical"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Gray", "Traditional", "Farmhouse", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate botanical pattern of small, stylized leaves in a soft gray hue against an off-white background. The design evokes a sense of understated elegance and rustic charm, making it suitable for traditional and farmhouse-style interiors. Ideal for creating a serene and inviting atmosphere in bedrooms, living rooms, or dining areas.", "dominant_color_hex": "#F5F0E6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 44, "mfr_sku": "PW78011.2", "dw_sku": "DWBL-820014", "pattern_name": "Tumbling Leaves", "color_name": "Linen", "collection": "Opera Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "15 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 53.9, "price_trade": 26.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzp-95cjnc-f4jt1e/PW78011_2.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.587153+00:00", "created_at": "2026-02-24T20:09:17.776207+00:00", "updated_at": "2026-02-25T03:28:06.587153+00:00", "color_hex": "#E5DCC4", "ai_colors": [{"hex": "#E5DCC4", "name": "Beige", "percentage": 70}, {"hex": "#F5F3ED", "name": "Off-white", "percentage": 30}], "ai_styles": ["Scandinavian", "Minimalist"], "ai_patterns": ["Botanical"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Off-white", "Scandinavian", "Minimalist", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate botanical pattern of various leaf silhouettes in a soft off-white against a warm beige background. The minimalist style and neutral color palette create a serene and calming atmosphere. It is ideal for bedrooms, living rooms, or any space where a touch of nature and understated elegance is desired.", "dominant_color_hex": "#E5DCC4", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 40, "mfr_sku": "PW78015.1", "dw_sku": "DWBL-820021", "pattern_name": "April Showers", "color_name": "Ivory/Stone", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "10 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 51.9, "price_trade": 25.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzp-bv444g-g7wzge/PW78015_1.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.583772+00:00", "created_at": "2026-02-24T20:09:17.773594+00:00", "updated_at": "2026-02-25T03:28:06.583772+00:00", "color_hex": "#F5F3ED", "ai_colors": [{"hex": "#F5F3ED", "name": "Off-white", "percentage": 45}, {"hex": "#A7A899", "name": "Sage Green", "percentage": 30}, {"hex": "#D1D0C7", "name": "Light Gray", "percentage": 15}, {"hex": "#E3E4D9", "name": "Pale Green", "percentage": 10}], "ai_styles": ["Scandinavian", "Minimalist"], "ai_patterns": ["Abstract"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Sage Green", "Green", "Light Gray", "Pale Green", "Scandinavian", "Minimalist", "Abstract", "Paper"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a subtle abstract pattern of stylized raindrops in muted sage green and light gray tones against an off-white background. The design evokes a sense of calm and tranquility, lending a minimalist and Scandinavian-inspired aesthetic. It is well-suited for residential and commercial spaces seeking a touch of understated elegance.", "dominant_color_hex": "#F5F3ED", "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": "Paper - 100%"}
+{"id": 73, "mfr_sku": "PW78019.1", "dw_sku": "DWBL-820033", "pattern_name": "Roundel", "color_name": "Ivory/Stone", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "14 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 29.9, "price_trade": 14.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzq-feydg8-e5cmih/PW78019_1.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.150022+00:00", "created_at": "2026-02-24T20:09:18.636805+00:00", "updated_at": "2026-02-25T03:28:06.150022+00:00", "color_hex": "#F5F3ED", "ai_colors": [{"hex": "#F5F3ED", "name": "Off-white", "percentage": 50}, {"hex": "#B8B1A5", "name": "Taupe", "percentage": 25}, {"hex": "#7A756B", "name": "Gray", "percentage": 15}, {"hex": "#D0C7B1", "name": "Beige", "percentage": 10}], "ai_styles": ["Contemporary"], "ai_patterns": ["Geometric"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Taupe", "Brown", "Gray", "Beige", "Contemporary", "Geometric", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a modern geometric pattern of overlapping circles in neutral tones. The design offers a subtle yet sophisticated aesthetic, perfect for creating a calming and stylish atmosphere. Recommended for living rooms, bedrooms, or any space where a touch of contemporary elegance is desired.", "dominant_color_hex": "#F5F3ED", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 82, "mfr_sku": "PW78021.3", "dw_sku": "DWBL-820038", "pattern_name": "Coffee Bean", "color_name": "Cherry/Silver", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "6 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 49.9, "price_trade": 24.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzr-g33deg-o07a2/PW78021_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.368201+00:00", "created_at": "2026-02-24T20:09:18.877486+00:00", "updated_at": "2026-02-25T03:28:06.368201+00:00", "color_hex": "#E67363", "ai_colors": [{"hex": "#E67363", "name": "Coral", "percentage": 50}, {"hex": "#A3A967", "name": "Olive Green", "percentage": 30}, {"hex": "#D9D9D9", "name": "Silver", "percentage": 10}, {"hex": "#000000", "name": "Black", "percentage": 10}], "ai_styles": ["Mid-century Modern", "Art Deco"], "ai_patterns": ["Geometric"], "ai_background_color": "Coral", "ai_tags": ["Coral", "Red", "Olive Green", "Green", "Silver", "Gray", "Black", "Mid-century Modern", "Art Deco", "Geometric", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a geometric trellis pattern with stylized leaf motifs. The Mid-Century Modern style is enhanced by the Art Deco color palette. Recommended for residential spaces seeking a touch of retro sophistication.", "dominant_color_hex": "#E67363", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 132, "mfr_sku": "PW78014.4", "dw_sku": "DWBL-820020", "pattern_name": "Lime Wash Plain", "color_name": "Silver", "collection": "Opera Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": null, "repeat_h": null, "material": "Paper - 100%", "price_retail": 39.9, "price_trade": 19.95, "image_url": "https://www.kravet.com/media/catalog/product/placeholder/default/placeholder-thumb-kk.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:07.035221+00:00", "created_at": "2026-02-24T20:09:19.55591+00:00", "updated_at": "2026-02-25T03:28:07.035221+00:00", "color_hex": "#696969", "ai_colors": [{"hex": "#696969", "name": "Steel Gray", "percentage": 35}, {"hex": "#4682B4", "name": "Steel Blue", "percentage": 30}, {"hex": "#D3D3D3", "name": "Light Gray", "percentage": 25}, {"hex": "#FFFFFF", "name": "White", "percentage": 10}], "ai_styles": ["Minimalist", "Contemporary"], "ai_patterns": ["Geometric"], "ai_background_color": "Off-white", "ai_tags": ["Steel Gray", "Gray", "Steel Blue", "Light Gray", "White", "Minimalist", "Contemporary", "Geometric", "Off-white", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a geometric pattern of stylized 'K' shapes in contrasting gray and blue tones. The minimalist design and cool color palette create a contemporary and sophisticated aesthetic. Ideal for modern interiors seeking a subtle yet impactful visual element.", "dominant_color_hex": "#696969", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 23, "mfr_sku": "PW78005.2", "dw_sku": "DWBL-820008", "pattern_name": "Chillingham", "color_name": "Blue", "collection": "Homes & Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "20 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 116.0, "price_trade": 58.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzp-4eavq0-9jgk67/PW78005_2.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.370058+00:00", "created_at": "2026-02-24T20:09:17.761113+00:00", "updated_at": "2026-02-25T03:28:06.370058+00:00", "color_hex": "#4169E1", "ai_colors": null, "ai_styles": null, "ai_patterns": null, "ai_background_color": null, "ai_tags": [], "width_inches": 20.0, "on_shopify": false, "ai_description": null, "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": "Paper - 100%"}
+{"id": 3, "mfr_sku": "PW78013.3", "dw_sku": "DWBL-820019", "pattern_name": "Gazebo Stripe", "color_name": "Green", "collection": "Opera Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": null, "repeat_h": null, "material": "Paper - 100%", "price_retail": 98.0, "price_trade": 49.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzp-aekiwg-9d56ph/PW78013_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:05.931046+00:00", "created_at": "2026-02-24T20:09:17.743089+00:00", "updated_at": "2026-02-25T03:28:05.931046+00:00", "color_hex": "#A3B97E", "ai_colors": [{"hex": "#A3B97E", "name": "Sage Green", "percentage": 45}, {"hex": "#F5F3E6", "name": "Off-white", "percentage": 30}, {"hex": "#C0CE9F", "name": "Light Sage Green", "percentage": 15}, {"hex": "#FFFFFF", "name": "White", "percentage": 10}], "ai_styles": ["Traditional", "Farmhouse"], "ai_patterns": ["Stripe"], "ai_background_color": "Off-white", "ai_tags": ["Sage Green", "Green", "Off-white", "Light Sage Green", "White", "Traditional", "Farmhouse", "Stripe", "Paper"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic stripe pattern in varying shades of green and off-white. The design evokes a sense of calm and traditional style, perfect for creating a cozy and inviting atmosphere. Recommended for use in bedrooms, living rooms, or any space where a touch of understated elegance is desired.", "dominant_color_hex": "#A3B97E", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 1, "mfr_sku": "PW78027.2", "dw_sku": "DWBL-820050", "pattern_name": "Hawkbury", "color_name": "Aqua/Taupe", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "1 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 179.0, "price_trade": 89.5, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzt-2rsaj4-7etsu2/PW78027_2.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:05.696246+00:00", "created_at": "2026-02-24T20:09:17.735838+00:00", "updated_at": "2026-02-25T03:28:05.696246+00:00", "color_hex": "#F5F3EB", "ai_colors": [{"hex": "#F5F3EB", "name": "Off-white", "percentage": 45}, {"hex": "#B9B1A3", "name": "Taupe", "percentage": 30}, {"hex": "#D1D0C9", "name": "Light Gray", "percentage": 15}, {"hex": "#99B1A9", "name": "Sea Green", "percentage": 10}], "ai_styles": ["Traditional", "Coastal"], "ai_patterns": ["Geometric"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Taupe", "Brown", "Light Gray", "Sea Green", "Traditional", "Coastal", "Geometric", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a geometric pattern with circular and scalloped motifs. The color palette is soft and muted, creating a calming and sophisticated mood. It is suitable for residential and commercial spaces seeking a touch of understated elegance.", "dominant_color_hex": "#F5F3EB", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 4, "mfr_sku": "PW78033.5", "dw_sku": "DWBL-820063", "pattern_name": "Kashmira", "color_name": "Indigo", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "4 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 262.0, "price_trade": 131.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-l5txc-5hwm31/PW78033_5.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:05.933057+00:00", "created_at": "2026-02-24T20:09:17.744431+00:00", "updated_at": "2026-02-25T03:28:05.933057+00:00", "color_hex": "#F5F3EE", "ai_colors": [{"hex": "#F5F3EE", "name": "Off-white", "percentage": 45}, {"hex": "#B9CDE1", "name": "Light Blue", "percentage": 30}, {"hex": "#D7DDE5", "name": "Pale Blue", "percentage": 15}, {"hex": "#5B82A9", "name": "Denim Blue", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Trellis"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Light Blue", "Pale Blue", "Denim Blue", "Traditional", "Trellis", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic trellis pattern with a delicate floral motif within each quatrefoil shape. The soft color palette creates a calming and sophisticated mood. Recommended for use in bedrooms, living rooms, or any space where a touch of elegance is desired.", "dominant_color_hex": "#F5F3EE", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 106, "mfr_sku": "PW78019.5", "dw_sku": "DWBL-820035", "pattern_name": "Roundel", "color_name": "Aqua/Teal/Silver", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "14 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 29.9, "price_trade": 14.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzr-1t2pyo-dv4xlz/PW78019_5.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.586624+00:00", "created_at": "2026-02-24T20:09:19.105547+00:00", "updated_at": "2026-02-25T03:28:06.586624+00:00", "color_hex": "#D2E5E5", "ai_colors": [{"hex": "#D2E5E5", "name": "Pale Aqua", "percentage": 45}, {"hex": "#5F8599", "name": "Steel Blue", "percentage": 30}, {"hex": "#9DBEA7", "name": "Seafoam Green", "percentage": 15}, {"hex": "#F0F0F0", "name": "Off-white", "percentage": 10}], "ai_styles": ["Contemporary"], "ai_patterns": ["Geometric"], "ai_background_color": "Pale Aqua", "ai_tags": ["Pale Aqua", "Blue", "Steel Blue", "Gray", "Seafoam Green", "Off-white", "Contemporary", "Geometric", "Paper"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a playful geometric pattern of overlapping circles in varying shades of blue and green. The contemporary style is both modern and inviting. Recommended for residential spaces seeking a touch of understated elegance.", "dominant_color_hex": "#D2E5E5", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 124, "mfr_sku": "PW78023.1", "dw_sku": "DWBL-820040", "pattern_name": "Comber", "color_name": "Blue", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": null, "repeat_h": null, "material": "Paper - 100%", "price_retail": 39.9, "price_trade": 19.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzr-b4ohmw-bfc66p/PW78023_1.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.825986+00:00", "created_at": "2026-02-24T20:09:19.33413+00:00", "updated_at": "2026-02-25T03:28:06.825986+00:00", "color_hex": "#F5F1E5", "ai_colors": [{"hex": "#F5F1E5", "name": "Pale Beige", "percentage": 55}, {"hex": "#C8D5E0", "name": "Light Blue Gray", "percentage": 45}], "ai_styles": ["Contemporary"], "ai_patterns": ["Textured"], "ai_background_color": "Pale Beige", "ai_tags": ["Pale Beige", "Light Blue Gray", "Contemporary", "Textured", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a subtle, textured pattern in pale beige and light blue gray. Its contemporary style creates a calming and sophisticated mood. Recommended for residential spaces seeking a touch of understated elegance.", "dominant_color_hex": "#F5F1E5", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "texture", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 122, "mfr_sku": "PW78025.3", "dw_sku": "DWBL-820047", "pattern_name": "Lullford", "color_name": "Ivory/Bronze", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "5 in", "repeat_h": "3 in", "material": "Paper - 100%", "price_retail": 29.9, "price_trade": 14.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzs-eihlu0-2yif3j/PW78025_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.824144+00:00", "created_at": "2026-02-24T20:09:19.331961+00:00", "updated_at": "2026-02-25T03:28:06.824144+00:00", "color_hex": "#F5F0E6", "ai_colors": [{"hex": "#F5F0E6", "name": "Cream", "percentage": 65}, {"hex": "#D4C4A9", "name": "Beige", "percentage": 35}], "ai_styles": ["Traditional"], "ai_patterns": ["Trellis", "Geometric"], "ai_background_color": "Cream", "ai_tags": ["Cream", "White", "Beige", "Traditional", "Trellis", "Geometric", "Non-woven"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic trellis pattern in a soft beige and cream color palette. The design evokes a sense of understated elegance and timeless style. It is ideal for creating a serene and inviting atmosphere in residential spaces.", "dominant_color_hex": "#F5F0E6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 110, "mfr_sku": "PW78029.5", "dw_sku": "DWBL-820057", "pattern_name": "Denbury", "color_name": "Celery", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "12 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 39.9, "price_trade": 19.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzt-3pfpn4-dr47xg/PW78029_5.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.588597+00:00", "created_at": "2026-02-24T20:09:19.10819+00:00", "updated_at": "2026-02-25T03:28:06.588597+00:00", "color_hex": "#D0E8C7", "ai_colors": [{"hex": "#D0E8C7", "name": "Pale Green", "percentage": 65}, {"hex": "#F5FAF2", "name": "Off-white", "percentage": 35}], "ai_styles": ["Traditional", "Farmhouse"], "ai_patterns": ["Floral", "Botanical"], "ai_background_color": "Pale Green", "ai_tags": ["Pale Green", "Off-white", "Traditional", "Farmhouse", "Floral", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate floral pattern with winding vines and small blossoms. The soft, muted color palette evokes a sense of calm and serenity, perfect for creating a cozy and inviting atmosphere. Ideal for bedrooms, nurseries, or any space where a touch of nature-inspired elegance is desired.", "dominant_color_hex": "#D0E8C7", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 8, "mfr_sku": "PW78029.8", "dw_sku": "DWBL-820058", "pattern_name": "Denbury", "color_name": "Ivory/Chalk", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "12 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 136.0, "price_trade": 68.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzt-a3vnyo-cblpdv/PW78029_8.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.146866+00:00", "created_at": "2026-02-24T20:09:17.748391+00:00", "updated_at": "2026-02-25T03:28:06.146866+00:00", "color_hex": "#F5F0E1", "ai_colors": [{"hex": "#F5F0E1", "name": "Beige", "percentage": 60}, {"hex": "#FFFFFF", "name": "White", "percentage": 40}], "ai_styles": ["Traditional", "Scandinavian"], "ai_patterns": ["Floral", "Botanical"], "ai_background_color": "Beige", "ai_tags": ["Beige", "White", "Traditional", "Scandinavian", "Floral", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate floral pattern in white against a soft beige background. The design evokes a sense of classic elegance and understated charm. Ideal for creating a serene and inviting atmosphere in bedrooms, living rooms, or nurseries.", "dominant_color_hex": "#F5F0E1", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 19, "mfr_sku": "PW78034.3", "dw_sku": "DWBL-820066", "pattern_name": "Parvani", "color_name": "Teal/Lime", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "26\"", "length": null, "repeat_v": "26 in", "repeat_h": null, "material": "Non Woven - 100%", "price_retail": 196.0, "price_trade": 98.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-2qgzlk-68skdc/PW78034_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.367341+00:00", "created_at": "2026-02-24T20:09:17.75803+00:00", "updated_at": "2026-02-25T03:28:06.367341+00:00", "color_hex": "#73B9C9", "ai_colors": [{"hex": "#73B9C9", "name": "Aqua", "percentage": 45}, {"hex": "#9AC97E", "name": "Lime Green", "percentage": 30}, {"hex": "#73898F", "name": "Grayish Teal", "percentage": 15}, {"hex": "#F5F3E6", "name": "Off-white", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Damask", "Floral"], "ai_background_color": "Off-white", "ai_tags": ["Aqua", "Blue", "Lime Green", "Green", "Grayish Teal", "Off-white", "Traditional", "Damask", "Floral", "Vinyl", "Animal", "Insects"], "width_inches": 26.0, "on_shopify": false, "ai_description": "This wallcovering features a damask pattern with floral motifs in aqua, lime green, and grayish teal on an off-white background. The design evokes a sense of classic elegance and tranquility. Recommended for creating a serene and sophisticated atmosphere in residential spaces.", "dominant_color_hex": "#73B9C9", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Non Woven - 100%"}
+{"id": 31, "mfr_sku": "PW78036.1", "dw_sku": "DWBL-820069", "pattern_name": "Madira", "color_name": "Stone", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "11 in", "repeat_h": null, "material": "Non Woven - 100%", "price_retail": 168.0, "price_trade": 84.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-5ndl5s-1vxwew/PW78036_1.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.374887+00:00", "created_at": "2026-02-24T20:09:17.767724+00:00", "updated_at": "2026-02-25T03:28:06.374887+00:00", "color_hex": "#F5F0E6", "ai_colors": [{"hex": "#F5F0E6", "name": "Cream", "percentage": 65}, {"hex": "#C2B8A9", "name": "Taupe", "percentage": 35}], "ai_styles": ["Traditional"], "ai_patterns": ["Paisley"], "ai_background_color": "Cream", "ai_tags": ["Cream", "White", "Taupe", "Brown", "Traditional", "Paisley", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic paisley pattern in a soft taupe hue against a cream backdrop. The design evokes a sense of timeless elegance and understated sophistication. Ideal for creating a serene and inviting atmosphere in living rooms, bedrooms, or studies.", "dominant_color_hex": "#F5F0E6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Non Woven - 100%"}
+{"id": 58, "mfr_sku": "PW78015.2", "dw_sku": "DWBL-820022", "pattern_name": "April Showers", "color_name": "Delft/Silver", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "10 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 33.9, "price_trade": 16.95, "image_url": "https://www.kravet.com/media/catalog/product/placeholder/default/placeholder-thumb-kk.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:07.032608+00:00", "created_at": "2026-02-24T20:09:17.785892+00:00", "updated_at": "2026-02-25T03:28:07.032608+00:00", "color_hex": "#696969", "ai_colors": [{"hex": "#696969", "name": "Steel Gray", "percentage": 40}, {"hex": "#4682B4", "name": "Steel Blue", "percentage": 35}, {"hex": "#F5F5F5", "name": "Off-white", "percentage": 25}], "ai_styles": ["Minimalist", "Contemporary"], "ai_patterns": ["Geometric", "Abstract"], "ai_background_color": "Off-white", "ai_tags": ["Steel Gray", "Gray", "Steel Blue", "Off-white", "Minimalist", "Contemporary", "Geometric", "Abstract", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a modern geometric pattern with stylized letterforms. The minimalist design and cool color palette create a contemporary and sophisticated mood. It is suitable for residential and commercial spaces seeking a clean and understated aesthetic.", "dominant_color_hex": "#696969", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 45, "mfr_sku": "PW78019.3", "dw_sku": "DWBL-820034", "pattern_name": "Roundel", "color_name": "Cherry/Denim/Cream", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "14 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 53.9, "price_trade": 26.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzq-aj6208-8apic8/PW78019_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.587646+00:00", "created_at": "2026-02-24T20:09:17.777103+00:00", "updated_at": "2026-02-25T03:28:06.587646+00:00", "color_hex": "#F5F3ED", "ai_colors": [{"hex": "#F5F3ED", "name": "Off-white", "percentage": 45}, {"hex": "#779ECB", "name": "Cornflower Blue", "percentage": 30}, {"hex": "#BC4749", "name": "Rose Madder", "percentage": 15}, {"hex": "#C0C4C2", "name": "Light Gray", "percentage": 10}], "ai_styles": ["Contemporary"], "ai_patterns": ["Geometric"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Cornflower Blue", "Rose Madder", "Pink", "Light Gray", "Contemporary", "Geometric", "Non-woven"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a playful geometric pattern of overlapping circles in cornflower blue, rose madder, and light gray. The design evokes a modern and cheerful style, perfect for adding a touch of whimsy to any space. Recommended for residential interiors, particularly bedrooms, living rooms, or nurseries.", "dominant_color_hex": "#F5F3ED", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 59, "mfr_sku": "PW78024.1", "dw_sku": "DWBL-820042", "pattern_name": "Ryton", "color_name": "Blue", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "2 in", "repeat_h": "1 in", "material": "Paper - 100%", "price_retail": 136.0, "price_trade": 68.0, "image_url": "https://www.kravet.com/media/catalog/product/placeholder/default/placeholder-thumb-kk.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:07.033536+00:00", "created_at": "2026-02-24T20:09:17.786483+00:00", "updated_at": "2026-02-25T03:28:07.033536+00:00", "color_hex": "#F2F2F2", "ai_colors": [{"hex": "#696969", "name": "Steel Gray", "percentage": 30}, {"hex": "#4682B4", "name": "Steel Blue", "percentage": 25}, {"hex": "#F2F2F2", "name": "Off-white", "percentage": 45}], "ai_styles": ["Minimalist", "Contemporary"], "ai_patterns": ["Geometric", "Abstract"], "ai_background_color": "Off-white", "ai_tags": ["Steel Gray", "Gray", "Steel Blue", "Off-white", "Minimalist", "Contemporary", "Geometric", "Abstract", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a modern geometric pattern with stylized 'K' shapes in contrasting gray and blue tones. The minimalist design offers a contemporary and clean aesthetic. Ideal for adding a subtle yet sophisticated touch to residential or commercial spaces.", "dominant_color_hex": "#F2F2F2", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 30, "mfr_sku": "PW78025.1", "dw_sku": "DWBL-820046", "pattern_name": "Lullford", "color_name": "Blue", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "5 in", "repeat_h": "3 in", "material": "Paper - 100%", "price_retail": 35.9, "price_trade": 17.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzs-95onls-do3g32/PW78025_1.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.374359+00:00", "created_at": "2026-02-24T20:09:17.766868+00:00", "updated_at": "2026-02-25T03:28:06.374359+00:00", "color_hex": "#B0C4DE", "ai_colors": [{"hex": "#B0C4DE", "name": "Light Blue", "percentage": 70}, {"hex": "#F5F5F5", "name": "Off-white", "percentage": 30}], "ai_styles": ["Contemporary"], "ai_patterns": ["Trellis", "Geometric"], "ai_background_color": "Light Blue", "ai_tags": ["Light Blue", "Off-white", "Contemporary", "Trellis", "Geometric", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic trellis pattern with a modern twist. The light blue background and off-white trellis create a calming and sophisticated atmosphere. Ideal for bedrooms, living rooms, or any space where a touch of elegance is desired.", "dominant_color_hex": "#B0C4DE", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 39, "mfr_sku": "PW78037.6", "dw_sku": "DWBL-820074", "pattern_name": "Raja", "color_name": "Dove Grey", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "9 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 43.9, "price_trade": 21.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzv-4izvts-b1nl9u/PW78037_6.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.58291+00:00", "created_at": "2026-02-24T20:09:17.772869+00:00", "updated_at": "2026-02-25T03:28:06.58291+00:00", "color_hex": "#E3DED1", "ai_colors": [{"hex": "#E3DED1", "name": "Beige", "percentage": 65}, {"hex": "#F5F4F0", "name": "Off-white", "percentage": 35}], "ai_styles": ["Traditional"], "ai_patterns": ["Damask"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Off-white", "Traditional", "Damask", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic damask pattern in off-white against a soft beige background. The design evokes a sense of timeless elegance and sophistication. Recommended for use in living rooms, bedrooms, or any space where a touch of traditional charm is desired.", "dominant_color_hex": "#E3DED1", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 126, "mfr_sku": "PW78000.6", "dw_sku": "DWBL-820002", "pattern_name": "Exbury Star", "color_name": "Leaf", "collection": "Homes & Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": null, "repeat_h": null, "material": "Paper - 100%", "price_retail": 39.9, "price_trade": 19.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzn-2cgsd4-2i5ku9/PW78000_6.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.827844+00:00", "created_at": "2026-02-24T20:09:19.335601+00:00", "updated_at": "2026-02-25T03:28:06.827844+00:00", "color_hex": "#E3E6D0", "ai_colors": [{"hex": "#E3E6D0", "name": "Pale Green", "percentage": 55}, {"hex": "#F0F1E3", "name": "Light Beige", "percentage": 45}], "ai_styles": ["Traditional"], "ai_patterns": ["Geometric"], "ai_background_color": "Pale Green", "ai_tags": ["Pale Green", "Light Beige", "Traditional", "Geometric", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate geometric pattern of interlocking triangles and starbursts. The subtle color palette creates a calming and sophisticated mood. Recommended for bedrooms, living rooms, or any space where a touch of understated elegance is desired.", "dominant_color_hex": "#E3E6D0", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 109, "mfr_sku": "PW78012.2", "dw_sku": "DWBL-820016", "pattern_name": "Gravel", "color_name": "Linen", "collection": "Opera Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "4 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 29.9, "price_trade": 14.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzp-fx6nzs-2p99by/PW78012_2.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.588134+00:00", "created_at": "2026-02-24T20:09:19.107643+00:00", "updated_at": "2026-02-25T03:28:06.588134+00:00", "color_hex": "#F5F5DC", "ai_colors": [{"hex": "#F5F5DC", "name": "Beige", "percentage": 45}, {"hex": "#D2B48C", "name": "Tan", "percentage": 30}, {"hex": "#D3D3D3", "name": "Light Gray", "percentage": 15}, {"hex": "#808080", "name": "Gray", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Textured"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Tan", "Light Gray", "Gray", "Traditional", "Textured", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a textured pattern reminiscent of coffee beans. Its neutral color palette and subtle design create a warm and inviting atmosphere. Ideal for kitchens, dining rooms, or coffee shops seeking a cozy and sophisticated ambiance.", "dominant_color_hex": "#F5F5DC", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "texture", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 113, "mfr_sku": "PW78015.8", "dw_sku": "DWBL-820024", "pattern_name": "April Showers", "color_name": "Spring/Lime", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "10 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 39.9, "price_trade": 19.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzp-c5r9c0-3wjpyd/PW78015_8.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.589827+00:00", "created_at": "2026-02-24T20:09:19.109497+00:00", "updated_at": "2026-02-25T03:28:06.589827+00:00", "color_hex": "#E0E5DF", "ai_colors": [{"hex": "#E0E5DF", "name": "Pale Green", "percentage": 45}, {"hex": "#B3D131", "name": "Chartreuse", "percentage": 30}, {"hex": "#7A855F", "name": "Olive Green", "percentage": 15}, {"hex": "#F2F2F2", "name": "White", "percentage": 10}], "ai_styles": ["Contemporary", "Scandinavian"], "ai_patterns": ["Abstract"], "ai_background_color": "Pale Green", "ai_tags": ["Pale Green", "Chartreuse", "Green", "Olive Green", "White", "Contemporary", "Scandinavian", "Abstract", "Paper"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features an abstract pattern of teardrop shapes in shades of green and white. The mood is fresh and modern, with a touch of whimsy. Recommended for use in bedrooms, bathrooms, or any space where a light and airy feel is desired.", "dominant_color_hex": "#E0E5DF", "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": "Paper - 100%"}
+{"id": 131, "mfr_sku": "PW78016.4", "dw_sku": "DWBL-820025", "pattern_name": "Tasie Stripe", "color_name": "Honeycombe/Stone", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": null, "repeat_h": null, "material": "Paper - 100%", "price_retail": 29.9, "price_trade": 14.95, "image_url": "https://www.kravet.com/media/catalog/product/placeholder/default/placeholder-thumb-kk.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:07.034453+00:00", "created_at": "2026-02-24T20:09:19.555006+00:00", "updated_at": "2026-02-25T03:28:07.034453+00:00", "color_hex": "#696969", "ai_colors": [{"hex": "#696969", "name": "Steel Gray", "percentage": 35}, {"hex": "#4682B4", "name": "Steel Blue", "percentage": 30}, {"hex": "#D3D3D3", "name": "Light Gray", "percentage": 25}, {"hex": "#FFFFFF", "name": "White", "percentage": 10}], "ai_styles": ["Minimalist", "Contemporary"], "ai_patterns": ["Geometric"], "ai_background_color": "Off-white", "ai_tags": ["Steel Gray", "Gray", "Steel Blue", "Light Gray", "White", "Minimalist", "Contemporary", "Geometric", "Off-white", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a stylized geometric pattern of overlapping 'K' shapes. The minimalist design and cool color palette create a modern and sophisticated aesthetic. Ideal for adding a subtle yet impactful visual element to contemporary interiors.", "dominant_color_hex": "#696969", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 116, "mfr_sku": "PW78023.4", "dw_sku": "DWBL-820041", "pattern_name": "Comber", "color_name": "Silver", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": null, "repeat_h": null, "material": "Paper - 100%", "price_retail": 39.9, "price_trade": 19.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzs-234mig-ctzmua/PW78023_4.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.592632+00:00", "created_at": "2026-02-24T20:09:19.110853+00:00", "updated_at": "2026-02-25T03:28:06.592632+00:00", "color_hex": "#E0E0E0", "ai_colors": [{"hex": "#E0E0E0", "name": "Light Gray", "percentage": 60}, {"hex": "#BDBDBD", "name": "Gray", "percentage": 40}], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Textured", "Abstract"], "ai_background_color": "Light Gray", "ai_tags": ["Light Gray", "Gray", "Contemporary", "Minimalist", "Textured", "Abstract", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a subtle abstract pattern with a textured effect. Its neutral color palette and minimalist style create a calming and sophisticated atmosphere. Recommended for use in any residential or commercial space seeking a modern and understated aesthetic.", "dominant_color_hex": "#E0E0E0", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "texture", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 55, "mfr_sku": "PW78034.2", "dw_sku": "DWBL-820065", "pattern_name": "Parvani", "color_name": "Grey/Yellow", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "26\"", "length": null, "repeat_v": "26 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 45.9, "price_trade": 22.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-2i0szc-7t7nry/PW78034_2.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.824946+00:00", "created_at": "2026-02-24T20:09:17.783874+00:00", "updated_at": "2026-02-25T03:28:06.824946+00:00", "color_hex": "#F5F3E6", "ai_colors": [{"hex": "#F5F3E6", "name": "Off-white", "percentage": 50}, {"hex": "#A3A197", "name": "Gray", "percentage": 25}, {"hex": "#D4B87D", "name": "Gold", "percentage": 15}, {"hex": "#E1D7C1", "name": "Beige", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Damask"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Gray", "Gold", "Yellow", "Beige", "Traditional", "Damask", "Vinyl", "Animal", "Insects"], "width_inches": 26.0, "on_shopify": false, "ai_description": "This wallcovering features a classic damask pattern in a muted palette of off-white, gray, and gold. The design evokes a sense of timeless elegance and sophistication. It is well-suited for creating a refined atmosphere in residential or commercial spaces.", "dominant_color_hex": "#F5F3E6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 57, "mfr_sku": "PW78036.2", "dw_sku": "DWBL-820070", "pattern_name": "Madira", "color_name": "Grey/Yellow", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "11 in", "repeat_h": null, "material": "Non Woven - 100%", "price_retail": 41.9, "price_trade": 20.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-bnkxs0-3h14gl/PW78036_2.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:07.030933+00:00", "created_at": "2026-02-24T20:09:17.785302+00:00", "updated_at": "2026-02-25T03:28:07.030933+00:00", "color_hex": "#F5F3E9", "ai_colors": [{"hex": "#F5F3E9", "name": "Off-white", "percentage": 55}, {"hex": "#A7A9A2", "name": "Gray", "percentage": 30}, {"hex": "#E5D39D", "name": "Pale Yellow", "percentage": 15}], "ai_styles": ["Traditional"], "ai_patterns": ["Paisley"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Gray", "Pale Yellow", "Traditional", "Paisley", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic paisley pattern in soft gray and pale yellow hues. The design evokes a sense of timeless elegance and understated sophistication. Ideal for creating a serene and inviting atmosphere in bedrooms, living rooms, or studies.", "dominant_color_hex": "#F5F3E9", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Non Woven - 100%"}
+{"id": 63, "mfr_sku": "PW78015.7", "dw_sku": "DWBL-820023", "pattern_name": "April Showers", "color_name": "Biscuit/Silver", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "10 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 29.9, "price_trade": 14.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzp-9oc4g0-6he8xk/PW78015_7.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:05.932392+00:00", "created_at": "2026-02-24T20:09:18.397344+00:00", "updated_at": "2026-02-25T03:28:05.932392+00:00", "color_hex": "#E5D9C1", "ai_colors": [{"hex": "#E5D9C1", "name": "Beige", "percentage": 45}, {"hex": "#A39577", "name": "Taupe", "percentage": 30}, {"hex": "#D8D8D0", "name": "Light Gray", "percentage": 15}, {"hex": "#B8B8B0", "name": "Gray", "percentage": 10}], "ai_styles": ["Contemporary"], "ai_patterns": ["Abstract"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Taupe", "Brown", "Light Gray", "Gray", "Contemporary", "Abstract", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features an abstract pattern of stylized raindrops in neutral tones. The design evokes a sense of calm and tranquility, making it suitable for creating a serene atmosphere. Recommended for bedrooms, bathrooms, or any space where a subtle and sophisticated touch is desired.", "dominant_color_hex": "#E5D9C1", "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": "Paper - 100%"}
+{"id": 51, "mfr_sku": "PW78017.8", "dw_sku": "DWBL-820028", "pattern_name": "Ming", "color_name": "Lime/Silver", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "10 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 53.9, "price_trade": 26.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzq-5vl1qg-fvzvd/PW78017_8.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.82066+00:00", "created_at": "2026-02-24T20:09:17.781104+00:00", "updated_at": "2026-02-25T03:28:06.82066+00:00", "color_hex": "#D0E149", "ai_colors": [{"hex": "#D0E149", "name": "Chartreuse", "percentage": 65}, {"hex": "#F0F0F0", "name": "Off-white", "percentage": 35}], "ai_styles": ["Contemporary", "Abstract"], "ai_patterns": ["Abstract"], "ai_background_color": "Chartreuse", "ai_tags": ["Chartreuse", "Green", "Off-white", "Contemporary", "Abstract", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features an abstract, crackled pattern in off-white against a chartreuse background. The contemporary style creates a lively and modern atmosphere. Recommended for use in residential or commercial spaces seeking a unique and eye-catching design.", "dominant_color_hex": "#D0E149", "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": "Paper - 100%"}
+{"id": 54, "mfr_sku": "PW78018.1", "dw_sku": "DWBL-820029", "pattern_name": "Kathak Paisley", "color_name": "Ivory/Silver", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "9 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 98.0, "price_trade": 49.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzq-czts0g-etlwjc/PW78018_1.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.823075+00:00", "created_at": "2026-02-24T20:09:17.783208+00:00", "updated_at": "2026-02-25T03:28:06.823075+00:00", "color_hex": "#4A4A4A", "ai_colors": [{"hex": "#4A4A4A", "name": "Dark Gray", "percentage": 45}, {"hex": "#D1C19F", "name": "Beige", "percentage": 30}, {"hex": "#A3A3A3", "name": "Gray", "percentage": 15}, {"hex": "#F5F5F5", "name": "Off-white", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Paisley"], "ai_background_color": "Off-white", "ai_tags": ["Dark Gray", "Beige", "Gray", "Off-white", "Traditional", "Paisley", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic paisley pattern in shades of gray and beige. The traditional style evokes a sense of timeless elegance and sophistication. It is recommended for residential use in living rooms, bedrooms, or hallways.", "dominant_color_hex": "#4A4A4A", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 2, "mfr_sku": "PW78027.5", "dw_sku": "DWBL-820053", "pattern_name": "Hawkbury", "color_name": "Red/Green", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "1 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 179.0, "price_trade": 89.5, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzs-egft74-2p7ago/PW78027_5.jpg", "in_stock": true, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:05.698007+00:00", "created_at": "2026-02-24T20:09:17.741361+00:00", "updated_at": "2026-02-25T03:28:05.698007+00:00", "color_hex": "#F5F3ED", "ai_colors": [{"hex": "#F5F3ED", "name": "Off-white", "percentage": 45}, {"hex": "#E67A6F", "name": "Coral", "percentage": 30}, {"hex": "#D4D0C9", "name": "Light Gray", "percentage": 15}, {"hex": "#FFFFFF", "name": "White", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Geometric"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Coral", "Red", "Light Gray", "White", "Traditional", "Geometric", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a geometric pattern with coral and light gray accents on an off-white background. The design evokes a traditional style with a touch of understated elegance. It is recommended for residential use, adding a subtle yet sophisticated touch to any room.", "dominant_color_hex": "#F5F3ED", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 27, "mfr_sku": "PW78031.5", "dw_sku": "DWBL-820061", "pattern_name": "Latika", "color_name": "Indigo", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "26\"", "length": null, "repeat_v": "17 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 248.0, "price_trade": 124.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-3ydrs-ci6vej/PW78031_5.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.372381+00:00", "created_at": "2026-02-24T20:09:17.764528+00:00", "updated_at": "2026-02-25T03:28:06.372381+00:00", "color_hex": "#F5F3E9", "ai_colors": [{"hex": "#F5F3E9", "name": "Off-white", "percentage": 45}, {"hex": "#D4C18A", "name": "Gold", "percentage": 30}, {"hex": "#5B7A9A", "name": "Steel Blue", "percentage": 15}, {"hex": "#A0C1D3", "name": "Light Blue", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Paisley"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Gold", "Yellow", "Steel Blue", "Gray", "Light Blue", "Traditional", "Paisley", "Paper", "Animal", "Insects"], "width_inches": 26.0, "on_shopify": false, "ai_description": "This wallcovering features a classic paisley pattern with intricate detailing. The color palette of gold, steel blue, and off-white creates a sophisticated and timeless aesthetic. Ideal for adding a touch of elegance to any residential space.", "dominant_color_hex": "#F5F3E9", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 53, "mfr_sku": "PW78036.3", "dw_sku": "DWBL-820071", "pattern_name": "Madira", "color_name": "Aqua/Coral", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "11 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 39.9, "price_trade": 19.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-brmlls-7bwvj1/PW78036_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.822479+00:00", "created_at": "2026-02-24T20:09:17.782386+00:00", "updated_at": "2026-02-25T03:28:06.822479+00:00", "color_hex": "#F8F5F0", "ai_colors": [{"hex": "#F8F5F0", "name": "Off-white", "percentage": 55}, {"hex": "#7EC4C9", "name": "Aqua", "percentage": 30}, {"hex": "#F28B82", "name": "Coral", "percentage": 15}], "ai_styles": ["Traditional"], "ai_patterns": ["Paisley"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Aqua", "Blue", "Coral", "Red", "Traditional", "Paisley", "Paper"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic paisley pattern in a refreshing color palette. The traditional design is updated with a light and airy feel, making it suitable for a variety of spaces. Ideal for adding a touch of elegance to bedrooms, living rooms, or hallways.", "dominant_color_hex": "#F8F5F0", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 56, "mfr_sku": "PW78037.3", "dw_sku": "DWBL-820072", "pattern_name": "Raja", "color_name": "Teal", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "9 in", "repeat_h": null, "material": "Non Woven - 100%", "price_retail": 65.9, "price_trade": 32.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-bo9kco-f0rz3c/PW78037_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.827027+00:00", "created_at": "2026-02-24T20:09:17.784533+00:00", "updated_at": "2026-02-25T03:28:06.827027+00:00", "color_hex": "#A7D1C9", "ai_colors": [{"hex": "#A7D1C9", "name": "Seafoam Green", "percentage": 65}, {"hex": "#F0F5F3", "name": "Off-white", "percentage": 34}, {"hex": "#D2B48C", "name": "Beige", "percentage": 1}], "ai_styles": ["Traditional"], "ai_patterns": ["Damask"], "ai_background_color": "Seafoam Green", "ai_tags": ["Seafoam Green", "Off-white", "Beige", "Traditional", "Damask", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic damask pattern in off-white against a seafoam green background. The design evokes a sense of timeless elegance and sophistication. Recommended for use in bedrooms, living rooms, or dining areas to create a refined and inviting atmosphere.", "dominant_color_hex": "#A7D1C9", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Non Woven - 100%"}
+{"id": 133, "mfr_sku": "PW78012.3", "dw_sku": "DWBL-820017", "pattern_name": "Gravel", "color_name": "Stone", "collection": "Opera Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "4 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 29.9, "price_trade": 14.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzp-5spcpk-b5j4mo/PW78012_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:07.035988+00:00", "created_at": "2026-02-24T20:09:19.556851+00:00", "updated_at": "2026-02-25T03:28:07.035988+00:00", "color_hex": "#F5F0E6", "ai_colors": [{"hex": "#F5F0E6", "name": "Beige", "percentage": 45}, {"hex": "#D4C9B5", "name": "Tan", "percentage": 30}, {"hex": "#E6DDC8", "name": "Light Beige", "percentage": 15}, {"hex": "#C2B7A3", "name": "Pale Brown", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Textured"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Tan", "Light Beige", "Pale Brown", "Traditional", "Textured", "Vinyl"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a subtle coffee bean texture in neutral tones. Its traditional style and textured pattern create a warm and inviting atmosphere. Recommended for residential use in living rooms, bedrooms, or kitchens.", "dominant_color_hex": "#F5F0E6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "texture", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 11, "mfr_sku": "PW78017.6", "dw_sku": "DWBL-820027", "pattern_name": "Ming", "color_name": "Cobalt", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "10 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 53.9, "price_trade": 26.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzq-7r7i60-48dcbs/PW78017_6.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.149079+00:00", "created_at": "2026-02-24T20:09:17.75151+00:00", "updated_at": "2026-02-25T03:28:06.149079+00:00", "color_hex": "#6495ED", "ai_colors": [{"hex": "#6495ED", "name": "Cornflower Blue", "percentage": 65}, {"hex": "#C0C0C0", "name": "Silver", "percentage": 35}], "ai_styles": ["Contemporary"], "ai_patterns": ["Abstract"], "ai_background_color": "Cornflower Blue", "ai_tags": ["Cornflower Blue", "Silver", "Gray", "Contemporary", "Abstract", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features an abstract, crackled pattern in silver against a cornflower blue background. The design evokes a modern and sophisticated style. Recommended for use in living rooms, bedrooms, or accent walls to add a touch of contemporary elegance.", "dominant_color_hex": "#6495ED", "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": "Paper - 100%"}
+{"id": 50, "mfr_sku": "PW78024.3", "dw_sku": "DWBL-820043", "pattern_name": "Ryton", "color_name": "Stone", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "2 in", "repeat_h": "1 in", "material": "Paper - 100%", "price_retail": 45.9, "price_trade": 22.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzs-2rv55k-6p6xm1/PW78024_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.818567+00:00", "created_at": "2026-02-24T20:09:17.780392+00:00", "updated_at": "2026-02-25T03:28:06.818567+00:00", "color_hex": "#E0DED6", "ai_colors": [{"hex": "#E0DED6", "name": "Light Gray", "percentage": 65}, {"hex": "#F0F0F0", "name": "Off-white", "percentage": 35}], "ai_styles": ["Contemporary", "Minimalist"], "ai_patterns": ["Geometric"], "ai_background_color": "Light Gray", "ai_tags": ["Light Gray", "Off-white", "Contemporary", "Minimalist", "Geometric", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a subtle geometric pattern of small dots arranged in diamond shapes. The light gray and off-white color palette creates a calming and sophisticated mood. Recommended for use in any residential or commercial space seeking a modern and minimalist aesthetic.", "dominant_color_hex": "#E0DED6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 6, "mfr_sku": "PW78026.1", "dw_sku": "DWBL-820049", "pattern_name": "Milcote", "color_name": "Blue", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "20 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 136.0, "price_trade": 68.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzs-ehnrrc-2wnxnu/PW78026_1.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.144786+00:00", "created_at": "2026-02-24T20:09:17.746446+00:00", "updated_at": "2026-02-25T03:28:06.144786+00:00", "color_hex": "#F5F0E6", "ai_colors": [{"hex": "#F5F0E6", "name": "Cream", "percentage": 55}, {"hex": "#6495ED", "name": "Cornflower Blue", "percentage": 45}], "ai_styles": ["Coastal", "Scandinavian"], "ai_patterns": ["Stripe", "Ikat"], "ai_background_color": "Cream", "ai_tags": ["Cream", "White", "Cornflower Blue", "Coastal", "Scandinavian", "Stripe", "Ikat", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a bold stripe pattern with an ikat-inspired design. The combination of cream and cornflower blue creates a calming and sophisticated mood. Recommended for use in bedrooms, living rooms, or any space where a touch of coastal charm is desired.", "dominant_color_hex": "#F5F0E6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 49, "mfr_sku": "PW78028.4", "dw_sku": "DWBL-820054", "pattern_name": "Swanborough", "color_name": "Silver/Stone", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "12 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 190.0, "price_trade": 95.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzs-a7dy9c-egt4ul/PW78028_4.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.591855+00:00", "created_at": "2026-02-24T20:09:17.779806+00:00", "updated_at": "2026-02-25T03:28:06.591855+00:00", "color_hex": "#F5F3F0", "ai_colors": [{"hex": "#F5F3F0", "name": "Off-white", "percentage": 55}, {"hex": "#A0968D", "name": "Taupe", "percentage": 25}, {"hex": "#C2B8B0", "name": "Light Beige", "percentage": 15}, {"hex": "#736B64", "name": "Grayish Brown", "percentage": 5}], "ai_styles": ["Traditional"], "ai_patterns": ["Floral", "Botanical"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Taupe", "Brown", "Light Beige", "Grayish Brown", "Traditional", "Floral", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate floral pattern with winding vines and stylized blossoms. The neutral color palette evokes a sense of understated elegance and timeless charm. Ideal for creating a serene and inviting atmosphere in bedrooms, living rooms, or dining areas.", "dominant_color_hex": "#F5F3F0", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 25, "mfr_sku": "PW78029.4", "dw_sku": "DWBL-820056", "pattern_name": "Denbury", "color_name": "Silver", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "12 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 57.9, "price_trade": 28.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzs-ejq934-3pb6ar/PW78029_4.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.371325+00:00", "created_at": "2026-02-24T20:09:17.762505+00:00", "updated_at": "2026-02-25T03:28:06.371325+00:00", "color_hex": "#FFFFFF", "ai_colors": [{"hex": "#FFFFFF", "name": "White", "percentage": 65}, {"hex": "#D3D3D3", "name": "Light Gray", "percentage": 35}], "ai_styles": ["Traditional"], "ai_patterns": ["Floral", "Botanical"], "ai_background_color": "White", "ai_tags": ["White", "Light Gray", "Traditional", "Floral", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate floral and botanical pattern in light gray against a white background. The design evokes a sense of classic elegance and understated charm. Recommended for creating a serene and inviting atmosphere in residential spaces.", "dominant_color_hex": "#FFFFFF", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 35, "mfr_sku": "PW78033.6", "dw_sku": "DWBL-820064", "pattern_name": "Kashmira", "color_name": "Ivory/Charcoal", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "4 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 262.0, "price_trade": 131.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-2n3hdc-e93i9p/PW78033_6.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.3783+00:00", "created_at": "2026-02-24T20:09:17.77069+00:00", "updated_at": "2026-02-25T03:28:06.3783+00:00", "color_hex": "#F2E9D9", "ai_colors": [{"hex": "#F2E9D9", "name": "Beige", "percentage": 45}, {"hex": "#A39A8F", "name": "Taupe", "percentage": 30}, {"hex": "#D6D0C5", "name": "Light Beige", "percentage": 15}, {"hex": "#C0B9AE", "name": "Gray", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Trellis", "Floral"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Taupe", "Brown", "Light Beige", "Gray", "Traditional", "Trellis", "Floral", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic trellis pattern with delicate floral motifs within each quatrefoil shape. The neutral color palette lends a sophisticated and timeless mood. Recommended for creating an elegant and inviting atmosphere in living rooms, bedrooms, or hallways.", "dominant_color_hex": "#F2E9D9", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 42, "mfr_sku": "PW78011.3", "dw_sku": "DWBL-820015", "pattern_name": "Tumbling Leaves", "color_name": "Green", "collection": "Opera Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "15 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 98.0, "price_trade": 49.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzo-8ygn9k-cewv88/PW78011_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.585073+00:00", "created_at": "2026-02-24T20:09:17.774825+00:00", "updated_at": "2026-02-25T03:28:06.585073+00:00", "color_hex": "#BDBDA0", "ai_colors": [{"hex": "#BDBDA0", "name": "Sage Green", "percentage": 65}, {"hex": "#F2E8D2", "name": "Pale Beige", "percentage": 35}], "ai_styles": ["Scandinavian", "Farmhouse"], "ai_patterns": ["Botanical"], "ai_background_color": "Sage Green", "ai_tags": ["Sage Green", "Green", "Pale Beige", "Scandinavian", "Farmhouse", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate botanical pattern of various leaf silhouettes in a soft, pale beige against a sage green background. The design evokes a sense of natural tranquility and understated elegance, perfect for creating a calming atmosphere. Recommended for use in bedrooms, living rooms, or studies to add a touch of organic charm.", "dominant_color_hex": "#BDBDA0", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 47, "mfr_sku": "PW78018.2", "dw_sku": "DWBL-820030", "pattern_name": "Kathak Paisley", "color_name": "Aqua/Cream", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "9 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 51.9, "price_trade": 25.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzq-df3s60-5l356m/PW78018_2.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.589435+00:00", "created_at": "2026-02-24T20:09:17.7785+00:00", "updated_at": "2026-02-25T03:28:06.589435+00:00", "color_hex": "#F2E8D9", "ai_colors": [{"hex": "#F2E8D9", "name": "Beige", "percentage": 45}, {"hex": "#87B7C9", "name": "Light Blue", "percentage": 30}, {"hex": "#FFFFFF", "name": "White", "percentage": 15}, {"hex": "#A2A4A1", "name": "Gray", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Paisley"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Light Blue", "White", "Gray", "Traditional", "Paisley", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic paisley pattern in light blue, white, and gray on a beige background. The design evokes a sense of timeless elegance and sophistication. Recommended for adding a touch of traditional charm to living rooms, bedrooms, or studies.", "dominant_color_hex": "#F2E8D9", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 38, "mfr_sku": "PW78018.3", "dw_sku": "DWBL-820031", "pattern_name": "Kathak Paisley", "color_name": "Red/Indigo/Biscuit", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "9 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 51.9, "price_trade": 25.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzq-ggefjk-1jiily/PW78018_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.582351+00:00", "created_at": "2026-02-24T20:09:17.77242+00:00", "updated_at": "2026-02-25T03:28:06.582351+00:00", "color_hex": "#F5F3ED", "ai_colors": [{"hex": "#F5F3ED", "name": "Off-white", "percentage": 45}, {"hex": "#6495ED", "name": "Cornflower Blue", "percentage": 30}, {"hex": "#F08080", "name": "Coral", "percentage": 15}, {"hex": "#EEE8AA", "name": "Pale Goldenrod", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Paisley"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Cornflower Blue", "Coral", "Red", "Pale Goldenrod", "Traditional", "Paisley", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic paisley pattern in a palette of cornflower blue, coral, and pale goldenrod against an off-white background. The design evokes a sense of timeless elegance and sophistication. It is ideally suited for creating a refined and inviting atmosphere in residential spaces.", "dominant_color_hex": "#F5F3ED", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 41, "mfr_sku": "PW78027.3", "dw_sku": "DWBL-820051", "pattern_name": "Hawkbury", "color_name": "Ivory/Bronze", "collection": "Denbury", "product_type": "Commercial Wallcovering", "width": "52\"", "length": null, "repeat_v": "5 cm", "repeat_h": "2.5 cm", "material": "Paper - 100%", "price_retail": 179.0, "price_trade": 89.5, "image_url": "https://www.kravet.com/media/catalog/product/placeholder/default/placeholder-thumb-kk.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.584282+00:00", "created_at": "2026-02-24T20:09:17.774243+00:00", "updated_at": "2026-02-25T03:28:06.584282+00:00", "color_hex": "#696969", "ai_colors": [{"hex": "#696969", "name": "Steel Gray", "percentage": 35}, {"hex": "#4682B4", "name": "Steel Blue", "percentage": 30}, {"hex": "#D3D3D3", "name": "Light Gray", "percentage": 25}, {"hex": "#FFFFFF", "name": "White", "percentage": 10}], "ai_styles": ["Minimalist", "Contemporary"], "ai_patterns": ["Geometric"], "ai_background_color": "Off-white", "ai_tags": ["Steel Gray", "Gray", "Steel Blue", "Light Gray", "White", "Minimalist", "Contemporary", "Geometric", "Off-white", "Non-woven", "Animal", "Insects"], "width_inches": 52.0, "on_shopify": false, "ai_description": "This wallcovering features a stylized geometric pattern of overlapping 'K' shapes. The minimalist design and cool color palette create a modern and sophisticated aesthetic. Ideal for adding a subtle yet impactful design element to any interior space.", "dominant_color_hex": "#696969", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 43, "mfr_sku": "PW78030.3", "dw_sku": "DWBL-820059", "pattern_name": "Kinward", "color_name": "Silver/Ivory", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "10 in", "repeat_h": "10 in", "material": "Paper - 100%", "price_retail": 57.9, "price_trade": 28.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzt-7k8ci0-ehmov0/PW78030_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.585826+00:00", "created_at": "2026-02-24T20:09:17.775454+00:00", "updated_at": "2026-02-25T03:28:06.585826+00:00", "color_hex": "#BDB5A7", "ai_colors": [{"hex": "#BDB5A7", "name": "Taupe", "percentage": 55}, {"hex": "#F2F2F2", "name": "Off-white", "percentage": 45}], "ai_styles": ["Traditional", "Chinoiserie"], "ai_patterns": ["Paisley"], "ai_background_color": "Taupe", "ai_tags": ["Taupe", "Brown", "Off-white", "Traditional", "Chinoiserie", "Paisley", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic paisley pattern in a sophisticated taupe and off-white color palette. The design evokes a sense of timeless elegance and traditional charm. Ideal for creating a refined and inviting atmosphere in living rooms, bedrooms, or studies.", "dominant_color_hex": "#BDB5A7", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 28, "mfr_sku": "PW78016.5", "dw_sku": "DWBL-820026", "pattern_name": "Tasie Stripe", "color_name": "Cream/Teal/Lime", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": null, "repeat_h": null, "material": "Paper - 100%", "price_retail": 55.9, "price_trade": 27.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzq-5ylfqo-b2igkc/PW78016_5.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.373164+00:00", "created_at": "2026-02-24T20:09:17.765327+00:00", "updated_at": "2026-02-25T03:28:06.373164+00:00", "color_hex": "#F2F0E6", "ai_colors": [{"hex": "#F2F0E6", "name": "Beige", "percentage": 75}, {"hex": "#B2D33A", "name": "Chartreuse", "percentage": 10}, {"hex": "#23809F", "name": "Teal", "percentage": 10}, {"hex": "#FFFFFF", "name": "White", "percentage": 5}], "ai_styles": ["Contemporary", "Scandinavian"], "ai_patterns": ["Stripe"], "ai_background_color": "Beige", "ai_tags": ["Beige", "Chartreuse", "Green", "Teal", "Blue", "White", "Contemporary", "Scandinavian", "Stripe", "Vinyl"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a simple stripe pattern in beige, chartreuse, and teal. The clean lines and neutral palette create a contemporary and calming aesthetic. Ideal for bedrooms, living rooms, or any space seeking a touch of modern elegance.", "dominant_color_hex": "#F2F0E6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 36, "mfr_sku": "PW78020.3", "dw_sku": "DWBL-820036", "pattern_name": "Bell Flower", "color_name": "Cherry/Indigo/Buttermilk", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "12 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 63.9, "price_trade": 31.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzr-abut5k-chqvnp/PW78020_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.580765+00:00", "created_at": "2026-02-24T20:09:17.771338+00:00", "updated_at": "2026-02-25T03:28:06.580765+00:00", "color_hex": "#F5F5F3", "ai_colors": [{"hex": "#F5F5F3", "name": "White", "percentage": 55}, {"hex": "#B8B8B3", "name": "Gray", "percentage": 25}, {"hex": "#1E3A7A", "name": "Navy", "percentage": 10}, {"hex": "#B9243A", "name": "Red", "percentage": 10}], "ai_styles": ["Contemporary"], "ai_patterns": ["Botanical"], "ai_background_color": "White", "ai_tags": ["White", "Gray", "Navy", "Blue", "Red", "Contemporary", "Botanical", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a stylized botanical pattern with leaves and abstract floral shapes. The color palette of navy, red, and gray against a white background creates a modern and sophisticated style. Recommended for residential spaces seeking a touch of contemporary elegance.", "dominant_color_hex": "#F5F5F3", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 34, "mfr_sku": "PW78024.7", "dw_sku": "DWBL-820045", "pattern_name": "Ryton", "color_name": "Dove Grey", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "2 in", "repeat_h": "1 in", "material": "Paper - 100%", "price_retail": 31.9, "price_trade": 15.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzs-a5epg0-c1smwv/PW78024_7.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.376999+00:00", "created_at": "2026-02-24T20:09:17.770021+00:00", "updated_at": "2026-02-25T03:28:06.376999+00:00", "color_hex": "#E5E0D6", "ai_colors": [{"hex": "#E5E0D6", "name": "Beige", "percentage": 65}, {"hex": "#F5F4F0", "name": "White", "percentage": 35}], "ai_styles": ["Contemporary"], "ai_patterns": ["Geometric"], "ai_background_color": "Beige", "ai_tags": ["Beige", "White", "Contemporary", "Geometric", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a subtle geometric pattern of diamond shapes formed by small dots. The neutral beige and white color palette creates a calming and sophisticated mood. Ideal for adding a touch of modern elegance to any residential space.", "dominant_color_hex": "#E5E0D6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 37, "mfr_sku": "PW78029.2", "dw_sku": "DWBL-820055", "pattern_name": "Denbury", "color_name": "Aqua", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "12 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 136.0, "price_trade": 68.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzt-79mbew-1h521k/PW78029_2.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.581819+00:00", "created_at": "2026-02-24T20:09:17.771914+00:00", "updated_at": "2026-02-25T03:28:06.581819+00:00", "color_hex": "#C2D1C9", "ai_colors": [{"hex": "#C2D1C9", "name": "Pale Green", "percentage": 55}, {"hex": "#F2F4F0", "name": "Off-white", "percentage": 45}], "ai_styles": ["Traditional", "Farmhouse"], "ai_patterns": ["Floral", "Botanical"], "ai_background_color": "Pale Green", "ai_tags": ["Pale Green", "Off-white", "Traditional", "Farmhouse", "Floral", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate floral pattern with winding vines and small blossoms. The soft, muted color palette evokes a sense of calm and serenity, perfect for creating a cozy and inviting atmosphere. Ideal for bedrooms, living rooms, or any space where a touch of classic elegance is desired.", "dominant_color_hex": "#C2D1C9", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 33, "mfr_sku": "PW78030.6", "dw_sku": "DWBL-820060", "pattern_name": "Kinward", "color_name": "Stone", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "10 in", "repeat_h": "10 in", "material": "Paper - 100%", "price_retail": 33.9, "price_trade": 16.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzt-esf6io-5o3iu6/PW78030_6.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.376383+00:00", "created_at": "2026-02-24T20:09:17.76933+00:00", "updated_at": "2026-02-25T03:28:06.376383+00:00", "color_hex": "#FFFFFF", "ai_colors": [{"hex": "#FFFFFF", "name": "White", "percentage": 55}, {"hex": "#D3D3D3", "name": "Light Gray", "percentage": 45}], "ai_styles": ["Traditional"], "ai_patterns": ["Paisley"], "ai_background_color": "White", "ai_tags": ["White", "Light Gray", "Traditional", "Paisley", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic paisley pattern in a soft, neutral palette. The design evokes a sense of timeless elegance and understated sophistication. Ideal for creating a serene and inviting atmosphere in bedrooms, living rooms, or hallways.", "dominant_color_hex": "#FFFFFF", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 24, "mfr_sku": "PW78034.4", "dw_sku": "DWBL-820067", "pattern_name": "Parvani", "color_name": "Fuchsia", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "26\"", "length": null, "repeat_v": "26 in", "repeat_h": null, "material": "Non Woven - 100%", "price_retail": 45.9, "price_trade": 22.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-6rlmsg-dooziq/PW78034_4.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.370718+00:00", "created_at": "2026-02-24T20:09:17.761775+00:00", "updated_at": "2026-02-25T03:28:06.370718+00:00", "color_hex": "#F26D5D", "ai_colors": [{"hex": "#F26D5D", "name": "Coral", "percentage": 45}, {"hex": "#F59185", "name": "Light Coral", "percentage": 30}, {"hex": "#F7B47A", "name": "Peach", "percentage": 15}, {"hex": "#F9D7C5", "name": "Pale Pink", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Floral", "Paisley"], "ai_background_color": "Off-white", "ai_tags": ["Coral", "Red", "Light Coral", "Peach", "Orange", "Pale Pink", "Traditional", "Floral", "Paisley", "Off-white", "Paper", "Animal", "Insects"], "width_inches": 26.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate floral paisley pattern in shades of coral and peach. The design evokes a sense of classic elegance and refined beauty. It is recommended for use in living rooms, bedrooms, or any space where a touch of traditional charm is desired.", "dominant_color_hex": "#F26D5D", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Non Woven - 100%"}
+{"id": 32, "mfr_sku": "PW78034.5", "dw_sku": "DWBL-820068", "pattern_name": "Parvani", "color_name": "Linen", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "26\"", "length": null, "repeat_v": "26 in", "repeat_h": null, "material": "Non Woven - 100%", "price_retail": 196.0, "price_trade": 98.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-5nf5hk-cwp4jl/PW78034_5.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.375598+00:00", "created_at": "2026-02-24T20:09:17.768478+00:00", "updated_at": "2026-02-25T03:28:06.375598+00:00", "color_hex": "#F5F3E6", "ai_colors": [{"hex": "#F5F3E6", "name": "Off-white", "percentage": 55}, {"hex": "#A09687", "name": "Taupe", "percentage": 25}, {"hex": "#C0B18F", "name": "Beige", "percentage": 15}, {"hex": "#D0C9C0", "name": "Gray", "percentage": 5}], "ai_styles": ["Traditional"], "ai_patterns": ["Damask"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Taupe", "Brown", "Beige", "Gray", "Traditional", "Damask", "Vinyl", "Animal", "Insects"], "width_inches": 26.0, "on_shopify": false, "ai_description": "This wallcovering features a classic damask pattern with intricate floral and scroll motifs. The neutral color palette creates a sophisticated and timeless style. Recommended for living rooms, bedrooms, or any space seeking a touch of elegance.", "dominant_color_hex": "#F5F3E6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Non Woven - 100%"}
+{"id": 14, "mfr_sku": "PW78002.2", "dw_sku": "DWBL-820004", "pattern_name": "Tintinhull Leaf", "color_name": "Leaf", "collection": "Homes & Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "20 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 116.0, "price_trade": 58.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzn-76z1mo-bt3x2d/PW78002_2.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.151343+00:00", "created_at": "2026-02-24T20:09:17.754581+00:00", "updated_at": "2026-02-25T03:28:06.151343+00:00", "color_hex": "#D0D8B0", "ai_colors": [{"hex": "#D0D8B0", "name": "Pale Green", "percentage": 50}, {"hex": "#F0F0E0", "name": "Off-white", "percentage": 30}, {"hex": "#B0A890", "name": "Taupe", "percentage": 15}, {"hex": "#E0D8C0", "name": "Light Beige", "percentage": 5}], "ai_styles": ["Traditional"], "ai_patterns": ["Botanical"], "ai_background_color": "Pale Green", "ai_tags": ["Pale Green", "Off-white", "Taupe", "Brown", "Light Beige", "Traditional", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate botanical pattern of stylized leaves and berries. The soft, muted color palette evokes a sense of calm and sophistication. Ideal for creating a serene and inviting atmosphere in bedrooms, living rooms, or dining areas.", "dominant_color_hex": "#D0D8B0", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 17, "mfr_sku": "PW78005.1", "dw_sku": "DWBL-820007", "pattern_name": "Chillingham", "color_name": "Silver/Aqua", "collection": "Homes & Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "20 in", "repeat_h": "20 in", "material": "Paper - 100%", "price_retail": 35.9, "price_trade": 17.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzn-aowxjc-6865fn/PW78005_1.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.366111+00:00", "created_at": "2026-02-24T20:09:17.756686+00:00", "updated_at": "2026-02-25T03:28:06.366111+00:00", "color_hex": "#F5F5F0", "ai_colors": [{"hex": "#F5F5F0", "name": "Off-white", "percentage": 55}, {"hex": "#468499", "name": "Teal", "percentage": 45}], "ai_styles": ["Chinoiserie", "Traditional"], "ai_patterns": ["Toile"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Teal", "Blue", "Chinoiserie", "Traditional", "Toile", "Paper", "Animal", "Insects", "Dog", "Bird"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic toile pattern with whimsical Chinoiserie elements. The teal motifs against the off-white background create a serene and sophisticated mood. Recommended for adding a touch of elegance to living rooms, bedrooms, or studies.", "dominant_color_hex": "#F5F5F0", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 22, "mfr_sku": "PW78006.3", "dw_sku": "DWBL-820010", "pattern_name": "Hestercombe Sprig", "color_name": "Linen/Silver", "collection": "Homes & Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "5 in", "repeat_h": "10 in", "material": "Paper - 100%", "price_retail": 31.9, "price_trade": 15.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzn-flz7aw-6yawcl/PW78006_3.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.369332+00:00", "created_at": "2026-02-24T20:09:17.760425+00:00", "updated_at": "2026-02-25T03:28:06.369332+00:00", "color_hex": "#F5EFE6", "ai_colors": [{"hex": "#F5EFE6", "name": "Antique White", "percentage": 75}, {"hex": "#A39A8F", "name": "Taupe", "percentage": 25}], "ai_styles": ["Traditional"], "ai_patterns": ["Botanical"], "ai_background_color": "Antique White", "ai_tags": ["Antique White", "Taupe", "Brown", "Traditional", "Botanical", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a delicate botanical motif in a subtle taupe hue against an antique white background. Its traditional style evokes a sense of understated elegance and timelessness. Recommended for creating a serene and sophisticated atmosphere in residential spaces.", "dominant_color_hex": "#F5EFE6", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 20, "mfr_sku": "PW78013.2", "dw_sku": "DWBL-820018", "pattern_name": "Gazebo Stripe", "color_name": "Linen/Silver", "collection": "Opera Garden", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": null, "repeat_h": null, "material": "Paper - 100%", "price_retail": 31.9, "price_trade": 15.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzo-9475og-4iwp98/PW78013_2.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.367766+00:00", "created_at": "2026-02-24T20:09:17.758677+00:00", "updated_at": "2026-02-25T03:28:06.367766+00:00", "color_hex": "#F4F1EA", "ai_colors": [{"hex": "#F4F1EA", "name": "Off-white", "percentage": 45}, {"hex": "#D5C7B0", "name": "Beige", "percentage": 30}, {"hex": "#73716E", "name": "Gray", "percentage": 15}, {"hex": "#FFFFFF", "name": "White", "percentage": 10}], "ai_styles": ["Traditional", "Farmhouse"], "ai_patterns": ["Stripe"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Beige", "Gray", "White", "Traditional", "Farmhouse", "Stripe", "Paper"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic stripe pattern in neutral tones. The design evokes a sense of calm and understated elegance, perfect for creating a cozy and inviting atmosphere. Recommended for bedrooms, living rooms, or any space where a touch of traditional charm is desired.", "dominant_color_hex": "#F4F1EA", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 16, "mfr_sku": "PW78020.7", "dw_sku": "DWBL-820037", "pattern_name": "Bell Flower", "color_name": "Fuchsia/Spring", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "12 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 39.9, "price_trade": 19.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzr-bucw6o-10rsjz/PW78020_7.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.364998+00:00", "created_at": "2026-02-24T20:09:17.756044+00:00", "updated_at": "2026-02-25T03:28:06.364998+00:00", "color_hex": "#F2F2F2", "ai_colors": [{"hex": "#D0C9C0", "name": "Taupe", "percentage": 45}, {"hex": "#8DBD59", "name": "Lime Green", "percentage": 30}, {"hex": "#C9548A", "name": "Rose", "percentage": 15}, {"hex": "#DCDBDC", "name": "Light Gray", "percentage": 10}], "ai_styles": ["Scandinavian", "Mid-century Modern"], "ai_patterns": ["Botanical"], "ai_background_color": "Off-white", "ai_tags": ["Taupe", "Brown", "Lime Green", "Green", "Rose", "Pink", "Light Gray", "Scandinavian", "Mid-century Modern", "Botanical", "Off-white", "Paper"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a stylized botanical pattern with leaves and abstract floral shapes. The color palette is soft and muted, lending a retro Scandinavian style. Recommended for use in bedrooms, living rooms, or any space seeking a touch of understated elegance.", "dominant_color_hex": "#F2F2F2", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 18, "mfr_sku": "PW78024.4", "dw_sku": "DWBL-820044", "pattern_name": "Ryton", "color_name": "Silver", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "2 in", "repeat_h": "1 in", "material": "Paper - 100%", "price_retail": 49.9, "price_trade": 24.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzs-5gxpxs-2dn2ub/PW78024_4.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.366852+00:00", "created_at": "2026-02-24T20:09:17.757369+00:00", "updated_at": "2026-02-25T03:28:06.366852+00:00", "color_hex": "#F5F5F0", "ai_colors": [{"hex": "#F5F5F0", "name": "Off-white", "percentage": 65}, {"hex": "#A9A9A9", "name": "Gray", "percentage": 35}], "ai_styles": ["Contemporary"], "ai_patterns": ["Geometric"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Gray", "Contemporary", "Geometric", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a geometric diamond pattern formed by small dots, creating a subtle yet sophisticated texture. The neutral color palette lends a modern and versatile style to any space. Recommended for use in living rooms, bedrooms, or offices seeking a touch of understated elegance.", "dominant_color_hex": "#F5F5F0", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 21, "mfr_sku": "PW78025.8", "dw_sku": "DWBL-820048", "pattern_name": "Lullford", "color_name": "Chalk", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "5 in", "repeat_h": "3 in", "material": "Paper - 100%", "price_retail": 136.0, "price_trade": 68.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzt-2r9smw-1cht32/PW78025_8.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.368642+00:00", "created_at": "2026-02-24T20:09:17.759523+00:00", "updated_at": "2026-02-25T03:28:06.368642+00:00", "color_hex": "#FAF7ED", "ai_colors": [{"hex": "#FAF7ED", "name": "Off-white", "percentage": 65}, {"hex": "#D3C8B3", "name": "Beige", "percentage": 35}], "ai_styles": ["Traditional"], "ai_patterns": ["Trellis", "Geometric"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Beige", "Traditional", "Trellis", "Geometric", "Non-woven", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic trellis pattern with a subtle geometric design. The neutral color palette evokes a sense of calm and sophistication. Ideal for creating a refined and inviting atmosphere in residential spaces.", "dominant_color_hex": "#FAF7ED", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 7, "mfr_sku": "PW78018.6", "dw_sku": "DWBL-820032", "pattern_name": "Kathak Paisley", "color_name": "Delft/Indigo", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "9 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 98.0, "price_trade": 49.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzr-5zfwyo-4ltbar/PW78018_6.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.146088+00:00", "created_at": "2026-02-24T20:09:17.747451+00:00", "updated_at": "2026-02-25T03:28:06.146088+00:00", "color_hex": "#A0C4DF", "ai_colors": [{"hex": "#A0C4DF", "name": "Light Blue", "percentage": 45}, {"hex": "#F5F5F5", "name": "White", "percentage": 30}, {"hex": "#699AC9", "name": "Cornflower Blue", "percentage": 15}, {"hex": "#4674A6", "name": "Steel Blue", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Paisley"], "ai_background_color": "White", "ai_tags": ["Light Blue", "White", "Cornflower Blue", "Steel Blue", "Gray", "Traditional", "Paisley", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic paisley pattern in varying shades of blue against a white background. The design evokes a sense of timeless elegance and sophistication. Recommended for use in bedrooms, living rooms, or studies to create a refined and inviting atmosphere.", "dominant_color_hex": "#A0C4DF", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 12, "mfr_sku": "PW78021.5", "dw_sku": "DWBL-820039", "pattern_name": "Coffee Bean", "color_name": "Teal/Silver", "collection": "Homes & Gardens II", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "6 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 130.0, "price_trade": 65.0, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzr-eplvww-8a3cpc/PW78021_5.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.149547+00:00", "created_at": "2026-02-24T20:09:17.75235+00:00", "updated_at": "2026-02-25T03:28:06.149547+00:00", "color_hex": "#39A7C9", "ai_colors": [{"hex": "#39A7C9", "name": "Cerulean", "percentage": 45}, {"hex": "#A1927F", "name": "Taupe", "percentage": 30}, {"hex": "#D0D0D0", "name": "Silver", "percentage": 15}, {"hex": "#363636", "name": "Charcoal", "percentage": 10}], "ai_styles": ["Mid-century Modern"], "ai_patterns": ["Geometric", "Trellis"], "ai_background_color": "Cerulean", "ai_tags": ["Cerulean", "Blue", "Taupe", "Brown", "Silver", "Gray", "Charcoal", "Mid-century Modern", "Geometric", "Trellis", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a geometric trellis pattern with stylized leaf motifs. The Mid-Century Modern style is enhanced by the color palette. Recommended for adding a touch of retro sophistication to any interior space.", "dominant_color_hex": "#39A7C9", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 5, "mfr_sku": "PW78027.4", "dw_sku": "DWBL-820052", "pattern_name": "Hawkbury", "color_name": "Silver", "collection": "Denbury", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "1 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 179.0, "price_trade": 89.5, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzt-2prsyo-gg9547/PW78027_4.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:05.93364+00:00", "created_at": "2026-02-24T20:09:17.745532+00:00", "updated_at": "2026-02-25T03:28:05.93364+00:00", "color_hex": "#F5F3ED", "ai_colors": [{"hex": "#F5F3ED", "name": "Off-white", "percentage": 55}, {"hex": "#B3A99D", "name": "Taupe", "percentage": 45}], "ai_styles": ["Traditional"], "ai_patterns": ["Geometric"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Taupe", "Brown", "Traditional", "Geometric", "Paper", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a geometric pattern with a delicate, repeating motif. The neutral color palette lends a sense of understated elegance and sophistication. It is ideal for creating a serene and inviting atmosphere in living rooms, bedrooms, or hallways.", "dominant_color_hex": "#F5F3ED", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 10, "mfr_sku": "PW78031.6", "dw_sku": "DWBL-820062", "pattern_name": "Latika", "color_name": "Stone/Silver", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "26\"", "length": null, "repeat_v": "17 in", "repeat_h": null, "material": "Paper - 100%", "price_retail": 59.9, "price_trade": 29.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzt-c981m8-9je5o5/PW78031_6.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.148532+00:00", "created_at": "2026-02-24T20:09:17.750445+00:00", "updated_at": "2026-02-25T03:28:06.148532+00:00", "color_hex": "#F5F3EE", "ai_colors": [{"hex": "#F5F3EE", "name": "Off-white", "percentage": 45}, {"hex": "#B1A79A", "name": "Taupe", "percentage": 30}, {"hex": "#D1C7B4", "name": "Beige", "percentage": 15}, {"hex": "#D6C08F", "name": "Gold", "percentage": 10}], "ai_styles": ["Traditional"], "ai_patterns": ["Damask", "Paisley"], "ai_background_color": "Off-white", "ai_tags": ["Off-white", "Taupe", "Brown", "Beige", "Gold", "Yellow", "Traditional", "Damask", "Paisley", "Paper", "Animal", "Insects"], "width_inches": 26.0, "on_shopify": false, "ai_description": "This wallcovering features a classic damask pattern with intricate paisley motifs. The neutral color palette creates a sophisticated and timeless style. Ideal for adding a touch of elegance to living rooms, bedrooms, or dining areas.", "dominant_color_hex": "#F5F3EE", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Paper - 100%"}
+{"id": 9, "mfr_sku": "PW78037.4", "dw_sku": "DWBL-820073", "pattern_name": "Raja", "color_name": "Fuchsia", "collection": "Heirloom India", "product_type": "Wallcovering", "width": "20\"", "length": null, "repeat_v": "9 in", "repeat_h": null, "material": "Non Woven - 100%", "price_retail": 41.9, "price_trade": 20.95, "image_url": "https://cdn.brandfolder.io/UT8SLOWQ/at/q45qzu-fn5bi8-761hao/PW78037_4.jpg", "in_stock": false, "discontinued": false, "shopify_product_id": null, "last_scraped": "2026-02-25T03:28:06.147834+00:00", "created_at": "2026-02-24T20:09:17.749429+00:00", "updated_at": "2026-02-25T03:28:06.147834+00:00", "color_hex": "#E63963", "ai_colors": [{"hex": "#E63963", "name": "Rose", "percentage": 65}, {"hex": "#C8A252", "name": "Gold", "percentage": 35}], "ai_styles": ["Traditional"], "ai_patterns": ["Damask"], "ai_background_color": "Rose", "ai_tags": ["Rose", "Pink", "Gold", "Yellow", "Traditional", "Damask", "Vinyl", "Animal", "Insects"], "width_inches": 20.0, "on_shopify": false, "ai_description": "This wallcovering features a classic damask pattern in gold against a rose background. The design evokes a sense of timeless elegance and sophistication. Recommended for adding a touch of traditional charm to living rooms, bedrooms, or dining areas.", "dominant_color_hex": "#E63963", "image_rejected": false, "image_rejection_reason": null, "repeat_classification": "pattern", "tariff_pct": null, "tariff_amount_per_roll": null, "tariff_amount_per_yard": null, "tariff_updated_at": null, "line": "Non Woven - 100%"}
diff --git a/vendors/zoffany/viewer/fieldmap.json b/vendors/zoffany/viewer/fieldmap.json
new file mode 100644
index 0000000..6b657bb
--- /dev/null
+++ b/vendors/zoffany/viewer/fieldmap.json
@@ -0,0 +1,6 @@
+{
+ "title": "Zoffany",
+ "samples_only": true,
+ "vendor_code": "zoffany",
+ "subdomain": "zoffany"
+}
diff --git a/vendors/zoffany/viewer/public/buybutton.js b/vendors/zoffany/viewer/public/buybutton.js
new file mode 100644
index 0000000..f479e9a
--- /dev/null
+++ b/vendors/zoffany/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/zoffany/viewer/public/index.html b/vendors/zoffany/viewer/public/index.html
new file mode 100644
index 0000000..ce0d82b
--- /dev/null
+++ b/vendors/zoffany/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/zoffany/viewer/server.js b/vendors/zoffany/viewer/server.js
new file mode 100644
index 0000000..9904dbf
--- /dev/null
+++ b/vendors/zoffany/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' : ''})`);
+});
← 77c30e8 build zimmer_rohde (Zimmer + Rohde) -> BUILT, port 10089, 93
·
back to Dw Vendor Microsites
·
build zinc_textile (Zinc Textile) -> BUILT, port 10091, 100 860ba1a →