← back to Wallco Ai
design page: add Share — Pinterest (Pin It) + Instagram (download + open) + Copy link
0f932562cad6d0bb6fbea58fbd5f037367c66eda · 2026-05-13 14:07:58 -0700 · SteveStudio2
Replaces the per-item search chips (Google/1stdibs/Pinterest/Etsy) that
Steve rejected. Adds a dedicated Share block on the design page itself:
- Pinterest: opens pin-it window with image_url + page_url + title
- Instagram: downloads the design PNG (no public IG share URL exists);
on mobile UA also offers instagram://library deep link
- Copy link: writes pageUrl to clipboard
Lives just above the Furnish block, same border-top section style.
Files touched
M data/designs.jsonM server.js
Diff
commit 0f932562cad6d0bb6fbea58fbd5f037367c66eda
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date: Wed May 13 14:07:58 2026 -0700
design page: add Share — Pinterest (Pin It) + Instagram (download + open) + Copy link
Replaces the per-item search chips (Google/1stdibs/Pinterest/Etsy) that
Steve rejected. Adds a dedicated Share block on the design page itself:
- Pinterest: opens pin-it window with image_url + page_url + title
- Instagram: downloads the design PNG (no public IG share URL exists);
on mobile UA also offers instagram://library deep link
- Copy link: writes pageUrl to clipboard
Lives just above the Furnish block, same border-top section style.
---
data/designs.json | 990 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
server.js | 100 +++++-
2 files changed, 1072 insertions(+), 18 deletions(-)
diff --git a/data/designs.json b/data/designs.json
index 0fb6e47..42bfb19 100644
--- a/data/designs.json
+++ b/data/designs.json
@@ -81811,5 +81811,995 @@
"user_scale_good": null,
"user_stars": null,
"room_mockups": []
+ },
+ {
+ "id": 3948,
+ "kind": "seamless_tile",
+ "category": "stoned-animals",
+ "dominant_hex": "#363925",
+ "saturation": 0.213,
+ "title": "Olive Lullaby No.3948",
+ "handle": "wallco-3948",
+ "image_url": "/designs/img/1778705671679_668365358.png",
+ "filename": "1778705671679_668365358.png",
+ "generator": "wallco.ai",
+ "seed": 668365358,
+ "is_published": false,
+ "created_at": "2026-05-13T20:54:40.077335+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3949,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#271b35",
+ "saturation": 0.325,
+ "title": "Mauve Folly No.3949",
+ "handle": "wallco-3949",
+ "image_url": "/designs/img/1778705671679_217070537.png",
+ "filename": "1778705671679_217070537.png",
+ "generator": "wallco.ai",
+ "seed": 217070537,
+ "is_published": false,
+ "created_at": "2026-05-13T20:54:43.507946+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3950,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#826e54",
+ "saturation": 0.215,
+ "title": "Amber Baroque No.3950",
+ "handle": "wallco-3950",
+ "image_url": "/designs/img/1778705701426_1636834227.png",
+ "filename": "1778705701426_1636834227.png",
+ "generator": "wallco.ai",
+ "seed": 1636834227,
+ "is_published": false,
+ "created_at": "2026-05-13T20:55:15.664294+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3951,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#826e54",
+ "saturation": 0.215,
+ "title": "Amber Damask No.3951",
+ "handle": "wallco-3951",
+ "image_url": "/designs/img/var_3950_hue+60_1778705715775.png",
+ "filename": "var_3950_hue+60_1778705715775.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T20:55:17.959276+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3952,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#826e54",
+ "saturation": 0.215,
+ "title": "Amber Heirloom No.3952",
+ "handle": "wallco-3952",
+ "image_url": "/designs/img/var_3950_hue+120_1778705717964.png",
+ "filename": "var_3950_hue+120_1778705717964.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T20:55:20.189607+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3953,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#826e54",
+ "saturation": 0.215,
+ "title": "Amber Atelier No.3953",
+ "handle": "wallco-3953",
+ "image_url": "/designs/img/var_3950_hue+180_1778705720194.png",
+ "filename": "var_3950_hue+180_1778705720194.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T20:55:22.367358+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3954,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#826e54",
+ "saturation": 0.215,
+ "title": "Amber Salon No.3954",
+ "handle": "wallco-3954",
+ "image_url": "/designs/img/var_3950_hue-60_1778705722370.png",
+ "filename": "var_3950_hue-60_1778705722370.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T20:55:24.520491+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3955,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#826e54",
+ "saturation": 0.215,
+ "title": "Amber Baroque No.3955",
+ "handle": "wallco-3955",
+ "image_url": "/designs/img/var_3950_mono_1778705724524.png",
+ "filename": "var_3950_mono_1778705724524.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T20:55:26.798959+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3956,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#261c17",
+ "saturation": 0.246,
+ "title": "Amber Carouse No.3956",
+ "handle": "wallco-3956",
+ "image_url": "/designs/img/1778705761643_748453019.png",
+ "filename": "1778705761643_748453019.png",
+ "generator": "wallco.ai",
+ "seed": 748453019,
+ "is_published": false,
+ "created_at": "2026-05-13T20:56:09.930459+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3957,
+ "kind": "seamless_tile",
+ "category": "stoned-animals",
+ "dominant_hex": "#4a3a3e",
+ "saturation": 0.121,
+ "title": "Rose Spore No.3957",
+ "handle": "wallco-3957",
+ "image_url": "/designs/img/1778705761643_631644010.png",
+ "filename": "1778705761643_631644010.png",
+ "generator": "wallco.ai",
+ "seed": 631644010,
+ "is_published": false,
+ "created_at": "2026-05-13T20:56:12.983643+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3958,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#9abd36",
+ "saturation": 0.556,
+ "title": "Olive Saunter No.3958",
+ "handle": "wallco-3958",
+ "image_url": "/designs/img/1778705834102_1166110329.png",
+ "filename": "1778705834102_1166110329.png",
+ "generator": "wallco.ai",
+ "seed": 1166110329,
+ "is_published": false,
+ "created_at": "2026-05-13T20:57:35.784552+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3959,
+ "kind": "seamless_tile",
+ "category": "stoned-animals",
+ "dominant_hex": "#a58d7f",
+ "saturation": 0.174,
+ "title": "Amber Halcyon No.3959",
+ "handle": "wallco-3959",
+ "image_url": "/designs/img/1778705851667_1970186046.png",
+ "filename": "1778705851667_1970186046.png",
+ "generator": "wallco.ai",
+ "seed": 1970186046,
+ "is_published": false,
+ "created_at": "2026-05-13T20:57:43.083144+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3960,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#b24141",
+ "saturation": 0.465,
+ "title": "Rose Hiccup No.3960",
+ "handle": "wallco-3960",
+ "image_url": "/designs/img/1778705851667_590060845.png",
+ "filename": "1778705851667_590060845.png",
+ "generator": "wallco.ai",
+ "seed": 590060845,
+ "is_published": false,
+ "created_at": "2026-05-13T20:57:46.714036+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3961,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#282523",
+ "saturation": 0.067,
+ "title": "Noir Damask No.3961",
+ "handle": "wallco-3961",
+ "image_url": "/designs/img/1778705895884_572283093.png",
+ "filename": "1778705895884_572283093.png",
+ "generator": "wallco.ai",
+ "seed": 572283093,
+ "is_published": false,
+ "created_at": "2026-05-13T20:58:24.759306+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3962,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#282523",
+ "saturation": 0.067,
+ "title": "Noir Heirloom No.3962",
+ "handle": "wallco-3962",
+ "image_url": "/designs/img/var_3961_hue+60_1778705904864.png",
+ "filename": "var_3961_hue+60_1778705904864.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T20:58:26.971758+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3963,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#282523",
+ "saturation": 0.067,
+ "title": "Noir Atelier No.3963",
+ "handle": "wallco-3963",
+ "image_url": "/designs/img/var_3961_hue+120_1778705906975.png",
+ "filename": "var_3961_hue+120_1778705906975.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T20:58:29.070818+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3964,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#282523",
+ "saturation": 0.067,
+ "title": "Noir Salon No.3964",
+ "handle": "wallco-3964",
+ "image_url": "/designs/img/var_3961_hue+180_1778705909074.png",
+ "filename": "var_3961_hue+180_1778705909074.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T20:58:31.270903+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3965,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#282523",
+ "saturation": 0.067,
+ "title": "Noir Baroque No.3965",
+ "handle": "wallco-3965",
+ "image_url": "/designs/img/var_3961_hue-60_1778705911274.png",
+ "filename": "var_3961_hue-60_1778705911274.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T20:58:33.417868+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3966,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#282523",
+ "saturation": 0.067,
+ "title": "Noir Damask No.3966",
+ "handle": "wallco-3966",
+ "image_url": "/designs/img/var_3961_mono_1778705913421.png",
+ "filename": "var_3961_mono_1778705913421.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T20:58:35.535345+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3967,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#83887e",
+ "saturation": 0.04,
+ "title": "Ash Caprice No.3967",
+ "handle": "wallco-3967",
+ "image_url": "/designs/img/1778705941650_1630976808.png",
+ "filename": "1778705941650_1630976808.png",
+ "generator": "wallco.ai",
+ "seed": 1630976808,
+ "is_published": false,
+ "created_at": "2026-05-13T20:59:09.923125+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3968,
+ "kind": "seamless_tile",
+ "category": "stoned-animals",
+ "dominant_hex": "#313e2b",
+ "saturation": 0.181,
+ "title": "Sage Lullaby No.3968",
+ "handle": "wallco-3968",
+ "image_url": "/designs/img/1778705941650_418597073.png",
+ "filename": "1778705941650_418597073.png",
+ "generator": "wallco.ai",
+ "seed": 418597073,
+ "is_published": false,
+ "created_at": "2026-05-13T20:59:12.955144+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3969,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#e2318c",
+ "saturation": 0.753,
+ "title": "Plum Folly No.3969",
+ "handle": "wallco-3969",
+ "image_url": "/designs/img/1778706031642_1311699350.png",
+ "filename": "1778706031642_1311699350.png",
+ "generator": "wallco.ai",
+ "seed": 1311699350,
+ "is_published": false,
+ "created_at": "2026-05-13T21:00:43.959475+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3970,
+ "kind": "seamless_tile",
+ "category": "stoned-animals",
+ "dominant_hex": "#35373d",
+ "saturation": 0.07,
+ "title": "Noir Stealie No.3970",
+ "handle": "wallco-3970",
+ "image_url": "/designs/img/1778706031643_39777602.png",
+ "filename": "1778706031643_39777602.png",
+ "generator": "wallco.ai",
+ "seed": 39777602,
+ "is_published": false,
+ "created_at": "2026-05-13T21:00:49.791923+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3971,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#b9b08d",
+ "saturation": 0.239,
+ "title": "Honey Damask No.3971",
+ "handle": "wallco-3971",
+ "image_url": "/designs/img/1778706085896_985591414.png",
+ "filename": "1778706085896_985591414.png",
+ "generator": "wallco.ai",
+ "seed": 985591414,
+ "is_published": false,
+ "created_at": "2026-05-13T21:01:36.382036+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3972,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#b9b08d",
+ "saturation": 0.239,
+ "title": "Honey Heirloom No.3972",
+ "handle": "wallco-3972",
+ "image_url": "/designs/img/var_3971_hue+60_1778706096511.png",
+ "filename": "var_3971_hue+60_1778706096511.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T21:01:41.930493+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3973,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#b9b08d",
+ "saturation": 0.239,
+ "title": "Honey Atelier No.3973",
+ "handle": "wallco-3973",
+ "image_url": "/designs/img/var_3971_hue+120_1778706101944.png",
+ "filename": "var_3971_hue+120_1778706101944.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T21:01:44.391995+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3974,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#d25736",
+ "saturation": 0.634,
+ "title": "Rose Soir\u00e9e No.3974",
+ "handle": "wallco-3974",
+ "image_url": "/designs/img/1778706096251_2061806366.png",
+ "filename": "1778706096251_2061806366.png",
+ "generator": "wallco.ai",
+ "seed": 2061806366,
+ "is_published": false,
+ "created_at": "2026-05-13T21:01:45.205661+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3975,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#b9b08d",
+ "saturation": 0.239,
+ "title": "Honey Baroque No.3975",
+ "handle": "wallco-3975",
+ "image_url": "/designs/img/var_3971_hue+180_1778706104398.png",
+ "filename": "var_3971_hue+180_1778706104398.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T21:01:46.805387+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3976,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#b9b08d",
+ "saturation": 0.239,
+ "title": "Honey Damask No.3976",
+ "handle": "wallco-3976",
+ "image_url": "/designs/img/var_3971_hue-60_1778706106811.png",
+ "filename": "var_3971_hue-60_1778706106811.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T21:01:49.54528+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3977,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#b9b08d",
+ "saturation": 0.239,
+ "title": "Honey Heirloom No.3977",
+ "handle": "wallco-3977",
+ "image_url": "/designs/img/var_3971_mono_1778706109575.png",
+ "filename": "var_3971_mono_1778706109575.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T21:01:59.118088+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3978,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#302927",
+ "saturation": 0.103,
+ "title": "Rose Saunter No.3978",
+ "handle": "wallco-3978",
+ "image_url": "/designs/img/1778706125437_139762605.png",
+ "filename": "1778706125437_139762605.png",
+ "generator": "wallco.ai",
+ "seed": 139762605,
+ "is_published": false,
+ "created_at": "2026-05-13T21:02:28.032706+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3979,
+ "kind": "seamless_tile",
+ "category": "stoned-animals",
+ "dominant_hex": "#676947",
+ "saturation": 0.193,
+ "title": "Olive Halcyon No.3979",
+ "handle": "wallco-3979",
+ "image_url": "/designs/img/1778706125435_425647631.png",
+ "filename": "1778706125435_425647631.png",
+ "generator": "wallco.ai",
+ "seed": 425647631,
+ "is_published": false,
+ "created_at": "2026-05-13T21:02:28.032705+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3980,
+ "kind": "seamless_tile",
+ "category": "stoned-animals",
+ "dominant_hex": "#70773c",
+ "saturation": 0.33,
+ "title": "Olive Stealie No.3980",
+ "handle": "wallco-3980",
+ "image_url": "/designs/img/1778706214147_2029538927.png",
+ "filename": "1778706214147_2029538927.png",
+ "generator": "wallco.ai",
+ "seed": 2029538927,
+ "is_published": false,
+ "created_at": "2026-05-13T21:03:43.364327+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3981,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#867366",
+ "saturation": 0.136,
+ "title": "Amber Tipple No.3981",
+ "handle": "wallco-3981",
+ "image_url": "/designs/img/1778706214147_1988391782.png",
+ "filename": "1778706214147_1988391782.png",
+ "generator": "wallco.ai",
+ "seed": 1988391782,
+ "is_published": false,
+ "created_at": "2026-05-13T21:03:47.341682+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3982,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#221f1d",
+ "saturation": 0.079,
+ "title": "Noir Heirloom No.3982",
+ "handle": "wallco-3982",
+ "image_url": "/designs/img/1778706276921_1667240080.png",
+ "filename": "1778706276921_1667240080.png",
+ "generator": "wallco.ai",
+ "seed": 1667240080,
+ "is_published": false,
+ "created_at": "2026-05-13T21:04:46.399373+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3983,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#221f1d",
+ "saturation": 0.079,
+ "title": "Noir Atelier No.3983",
+ "handle": "wallco-3983",
+ "image_url": "/designs/img/var_3982_hue+60_1778706286528.png",
+ "filename": "var_3982_hue+60_1778706286528.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T21:04:48.65852+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3984,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#221f1d",
+ "saturation": 0.079,
+ "title": "Noir Salon No.3984",
+ "handle": "wallco-3984",
+ "image_url": "/designs/img/var_3982_hue+120_1778706288663.png",
+ "filename": "var_3982_hue+120_1778706288663.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T21:04:50.762268+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3985,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#221f1d",
+ "saturation": 0.079,
+ "title": "Noir Baroque No.3985",
+ "handle": "wallco-3985",
+ "image_url": "/designs/img/var_3982_hue+180_1778706290766.png",
+ "filename": "var_3982_hue+180_1778706290766.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T21:04:52.970659+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3986,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#221f1d",
+ "saturation": 0.079,
+ "title": "Noir Damask No.3986",
+ "handle": "wallco-3986",
+ "image_url": "/designs/img/var_3982_hue-60_1778706292974.png",
+ "filename": "var_3982_hue-60_1778706292974.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T21:04:55.051009+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3987,
+ "kind": "seamless_tile",
+ "category": "damask",
+ "dominant_hex": "#221f1d",
+ "saturation": 0.079,
+ "title": "Noir Heirloom No.3987",
+ "handle": "wallco-3987",
+ "image_url": "/designs/img/var_3982_mono_1778706295054.png",
+ "filename": "var_3982_mono_1778706295054.png",
+ "generator": "wallco.ai",
+ "seed": 0,
+ "is_published": false,
+ "created_at": "2026-05-13T21:04:57.238373+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3988,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#952c51",
+ "saturation": 0.544,
+ "title": "Rose Saunter No.3988",
+ "handle": "wallco-3988",
+ "image_url": "/designs/img/1778706301673_1803476129.png",
+ "filename": "1778706301673_1803476129.png",
+ "generator": "wallco.ai",
+ "seed": 1803476129,
+ "is_published": false,
+ "created_at": "2026-05-13T21:05:10.237132+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3989,
+ "kind": "seamless_tile",
+ "category": "stoned-animals",
+ "dominant_hex": "#7d5a47",
+ "saturation": 0.276,
+ "title": "Amber Halcyon No.3989",
+ "handle": "wallco-3989",
+ "image_url": "/designs/img/1778706301672_452495870.png",
+ "filename": "1778706301672_452495870.png",
+ "generator": "wallco.ai",
+ "seed": 452495870,
+ "is_published": false,
+ "created_at": "2026-05-13T21:05:13.955575+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3990,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#333126",
+ "saturation": 0.146,
+ "title": "Honey Hiccup No.3990",
+ "handle": "wallco-3990",
+ "image_url": "/designs/img/1778706352033_625489924.png",
+ "filename": "1778706352033_625489924.png",
+ "generator": "wallco.ai",
+ "seed": 625489924,
+ "is_published": false,
+ "created_at": "2026-05-13T21:06:02.833673+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3991,
+ "kind": "seamless_tile",
+ "category": "stoned-animals",
+ "dominant_hex": "#332f2d",
+ "saturation": 0.062,
+ "title": "Noir Trip No.3991",
+ "handle": "wallco-3991",
+ "image_url": "/designs/img/1778706391703_443963802.png",
+ "filename": "1778706391703_443963802.png",
+ "generator": "wallco.ai",
+ "seed": 443963802,
+ "is_published": false,
+ "created_at": "2026-05-13T21:06:41.167725+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
+ },
+ {
+ "id": 3992,
+ "kind": "seamless_tile",
+ "category": "drunk-animals",
+ "dominant_hex": "#b25232",
+ "saturation": 0.561,
+ "title": "Amber Tableau No.3992",
+ "handle": "wallco-3992",
+ "image_url": "/designs/img/1778706391703_354618.png",
+ "filename": "1778706391703_354618.png",
+ "generator": "wallco.ai",
+ "seed": 354618,
+ "is_published": false,
+ "created_at": "2026-05-13T21:06:45.910698+00:00",
+ "motifs": [],
+ "user_removed": false,
+ "user_color_good": null,
+ "user_style_good": null,
+ "user_scale_good": null,
+ "user_stars": null,
+ "room_mockups": []
}
]
\ No newline at end of file
diff --git a/server.js b/server.js
index 06627fb..3cd2579 100644
--- a/server.js
+++ b/server.js
@@ -6206,6 +6206,87 @@ ${htmlHeader('/designs')}
</div>
</div>
+ <!-- Share this design — Pinterest (one-click Pin) + Instagram
+ (download image + open IG). Per Steve's 2026-05-13 ask. -->
+ <div class="share-block" style="margin-top:22px;padding-top:18px;border-top:1px solid var(--line)">
+ <label style="font:11px var(--sans);text-transform:uppercase;letter-spacing:.08em;color:var(--ink-faint);display:block;margin-bottom:8px">Share this design</label>
+ <div style="display:flex;gap:8px;flex-wrap:wrap;align-items:center">
+ <button type="button" id="share-pinterest" style="padding:10px 16px;background:#e60023;color:#fff;border:0;border-radius:6px;font:600 12px var(--sans);letter-spacing:.06em;text-transform:uppercase;cursor:pointer;display:inline-flex;align-items:center;gap:6px">
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.4 0 0 5.4 0 12c0 5.1 3.1 9.4 7.6 11.2-.1-.9-.2-2.4 0-3.4.2-.9 1.4-5.8 1.4-5.8s-.4-.7-.4-1.8c0-1.7 1-2.9 2.2-2.9 1 0 1.5.8 1.5 1.7 0 1-.7 2.6-1 4-.3 1.2.6 2.1 1.7 2.1 2.1 0 3.7-2.2 3.7-5.4 0-2.8-2-4.8-4.9-4.8-3.3 0-5.3 2.5-5.3 5.1 0 1 .4 2.1.9 2.7.1.1.1.2.1.3l-.3 1.4c-.1.2-.2.3-.4.2-1.5-.7-2.4-2.9-2.4-4.6 0-3.7 2.7-7.1 7.8-7.1 4.1 0 7.3 2.9 7.3 6.8 0 4.1-2.6 7.4-6.2 7.4-1.2 0-2.3-.6-2.7-1.4l-.7 2.8c-.3 1-1 2.3-1.5 3.1 1.1.3 2.3.5 3.5.5 6.6 0 12-5.4 12-12C24 5.4 18.6 0 12 0z"/></svg>
+ Pin it
+ </button>
+ <button type="button" id="share-instagram" style="padding:10px 16px;background:linear-gradient(45deg,#f09433,#e6683c,#dc2743,#cc2366,#bc1888);color:#fff;border:0;border-radius:6px;font:600 12px var(--sans);letter-spacing:.06em;text-transform:uppercase;cursor:pointer;display:inline-flex;align-items:center;gap:6px">
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.16c3.2 0 3.58 0 4.85.07 1.17.05 1.8.25 2.23.41.56.22.96.48 1.38.9.42.42.68.82.9 1.38.16.42.36 1.06.41 2.23.06 1.27.07 1.64.07 4.85s0 3.58-.07 4.85c-.05 1.17-.25 1.8-.41 2.23-.22.56-.48.96-.9 1.38a3.7 3.7 0 0 1-1.38.9c-.42.16-1.06.36-2.23.41-1.27.06-1.64.07-4.85.07s-3.58 0-4.85-.07c-1.17-.05-1.8-.25-2.23-.41a3.7 3.7 0 0 1-1.38-.9 3.7 3.7 0 0 1-.9-1.38c-.16-.42-.36-1.06-.41-2.23C2.16 15.58 2.16 15.2 2.16 12s0-3.58.07-4.85c.05-1.17.25-1.8.41-2.23.22-.56.48-.96.9-1.38.42-.42.82-.68 1.38-.9.42-.16 1.06-.36 2.23-.41C8.42 2.16 8.8 2.16 12 2.16M12 0C8.74 0 8.33 0 7.05.07 5.78.13 4.9.33 4.14.63a5.85 5.85 0 0 0-2.13 1.38A5.85 5.85 0 0 0 .63 4.14C.33 4.9.13 5.78.07 7.05.01 8.33 0 8.74 0 12c0 3.26.01 3.67.07 4.95.06 1.27.26 2.15.56 2.91.31.79.73 1.46 1.38 2.13a5.85 5.85 0 0 0 2.13 1.38c.76.3 1.64.5 2.91.56C8.33 23.99 8.74 24 12 24c3.26 0 3.67-.01 4.95-.07 1.27-.06 2.15-.26 2.91-.56a5.85 5.85 0 0 0 2.13-1.38 5.85 5.85 0 0 0 1.38-2.13c.3-.76.5-1.64.56-2.91.06-1.28.07-1.69.07-4.95s-.01-3.67-.07-4.95c-.06-1.27-.26-2.15-.56-2.91a5.85 5.85 0 0 0-1.38-2.13A5.85 5.85 0 0 0 19.86.63C19.1.33 18.22.13 16.95.07 15.67.01 15.26 0 12 0zm0 5.84A6.16 6.16 0 1 0 18.16 12 6.16 6.16 0 0 0 12 5.84M12 16a4 4 0 1 1 4-4 4 4 0 0 1-4 4m6.41-11.85a1.44 1.44 0 1 0 1.44 1.44 1.44 1.44 0 0 0-1.44-1.44"/></svg>
+ Share to Instagram
+ </button>
+ <button type="button" id="share-copy-link" style="padding:10px 14px;background:#fff;color:var(--ink);border:1px solid var(--line);border-radius:6px;font:600 12px var(--sans);letter-spacing:.06em;text-transform:uppercase;cursor:pointer">
+ 🔗 Copy link
+ </button>
+ <span id="share-status" class="muted" style="font:11px var(--sans);color:var(--ink-faint);"></span>
+ </div>
+ <div style="font:10.5px var(--sans);color:var(--ink-faint);margin-top:6px;letter-spacing:.04em">
+ Pin opens Pinterest's pin-it window. Instagram downloads the design image — open IG, tap +, choose the saved image.
+ </div>
+ </div>
+ <script>
+ (function(){
+ const pageUrl = window.location.href;
+ const imgUrl = ${JSON.stringify('https://wallco.ai' + design.image_url)};
+ const title = ${JSON.stringify((design.title || 'wallco.ai design') + ' — wallco.ai original wallpaper')};
+ const handle = ${JSON.stringify(design.handle || ('design-' + design.id))};
+ const stat = document.getElementById('share-status');
+
+ // Pinterest — opens the pin-create window in a small popup.
+ // Pinterest fetches the image directly from imgUrl + back-links
+ // to pageUrl.
+ const pinBtn = document.getElementById('share-pinterest');
+ if (pinBtn) pinBtn.addEventListener('click', () => {
+ const u = 'https://pinterest.com/pin/create/button/?url='
+ + encodeURIComponent(pageUrl)
+ + '&media=' + encodeURIComponent(imgUrl)
+ + '&description=' + encodeURIComponent(title);
+ window.open(u, 'pinit', 'width=750,height=620,scrollbars=yes');
+ });
+
+ // Instagram — IG has no public share URL. Best UX on desktop:
+ // download the image, then prompt user to upload it in IG.
+ // On mobile, attempt the instagram://library deep link first;
+ // fall back to download.
+ const igBtn = document.getElementById('share-instagram');
+ if (igBtn) igBtn.addEventListener('click', async () => {
+ stat.textContent = 'preparing image…';
+ try {
+ const r = await fetch(imgUrl);
+ const blob = await r.blob();
+ const a = document.createElement('a');
+ a.href = URL.createObjectURL(blob);
+ a.download = handle + '.png';
+ document.body.appendChild(a); a.click(); a.remove();
+ setTimeout(() => URL.revokeObjectURL(a.href), 1000);
+ const isMobile = /Mobi|Android|iPhone|iPad/i.test(navigator.userAgent);
+ if (isMobile) {
+ stat.innerHTML = '✓ Saved — <a href="instagram://library" style="color:var(--accent)">open Instagram</a>';
+ } else {
+ stat.innerHTML = '✓ Saved <strong>' + handle + '.png</strong> — open Instagram on your phone, tap +, choose the image.';
+ }
+ } catch (e) {
+ stat.innerHTML = '<span style="color:#b91c1c">Download failed: ' + (e.message || String(e)) + '</span>';
+ }
+ });
+
+ // Copy link to clipboard
+ const copyBtn = document.getElementById('share-copy-link');
+ if (copyBtn) copyBtn.addEventListener('click', async () => {
+ try {
+ await navigator.clipboard.writeText(pageUrl);
+ const t = copyBtn.textContent;
+ copyBtn.textContent = '✓ Copied';
+ setTimeout(() => { copyBtn.textContent = t; }, 1500);
+ } catch { stat.textContent = 'copy failed'; }
+ });
+ })();
+ </script>
+
<!-- Furnish this design — coordinated furniture + lighting + decor
recommendations scoped to residential / commercial / hospitality /
healthcare. POSTs to /api/design/:id/furnish. -->
@@ -6244,27 +6325,10 @@ ${htmlHeader('/designs')}
const j = await r.json();
if (!j.ok) throw new Error(j.error || 'gen failed');
let html = '';
- // Each item gets clickable "find images" chips so the text
- // recommendation becomes a visual lookup tool. Steve's
- // 2026-05-13 feedback: "but nothing generated" — text alone
- // doesn't satisfy a furnishing browse.
- const searchChips = (q) => {
- const enc = encodeURIComponent(q);
- return '<span style="display:inline-flex;gap:4px;margin-left:6px;font-size:10px;vertical-align:middle;flex-wrap:wrap">'
- + '<a href="https://www.google.com/search?tbm=isch&q=' + enc + '" target="_blank" rel="noopener" style="padding:2px 7px;border-radius:9999px;background:#eff6ff;color:#1d4ed8;text-decoration:none;border:1px solid #bfdbfe">🖼 Google</a>'
- + '<a href="https://www.1stdibs.com/search/?q=' + enc + '" target="_blank" rel="noopener" style="padding:2px 7px;border-radius:9999px;background:#fef3c7;color:#92400e;text-decoration:none;border:1px solid #fde68a">1stdibs</a>'
- + '<a href="https://www.pinterest.com/search/pins/?q=' + enc + '" target="_blank" rel="noopener" style="padding:2px 7px;border-radius:9999px;background:#fee2e2;color:#b91c1c;text-decoration:none;border:1px solid #fecaca">Pinterest</a>'
- + '<a href="https://www.etsy.com/search?q=' + enc + '" target="_blank" rel="noopener" style="padding:2px 7px;border-radius:9999px;background:#fef9c3;color:#854d0e;text-decoration:none;border:1px solid #fde047">Etsy</a>'
- + '</span>';
- };
for (const cat of (j.categories || [])) {
html += '<div style="margin-bottom:14px"><div style="font:600 11px var(--sans);text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint);margin-bottom:6px">' + cat.category + '</div><ul style="margin:0;padding-left:18px">';
for (const item of (cat.items || [])) {
- const q = (item.name || '') + (item.detail ? ' ' + item.detail.split(/[.,]/)[0] : '');
- html += '<li style="margin-bottom:6px"><strong>' + item.name + '</strong>'
- + (item.detail ? ' — <span style="color:var(--ink-soft,#555)">' + item.detail + '</span>' : '')
- + searchChips(q)
- + '</li>';
+ html += '<li style="margin-bottom:4px"><strong>' + item.name + '</strong>' + (item.detail ? ' — <span style="color:var(--ink-soft,#555)">' + item.detail + '</span>' : '') + '</li>';
}
html += '</ul></div>';
}
← 829515f wallco: add full sort options (oldest/title-desc/vivid/muted
·
back to Wallco Ai
·
furnish: disk-backed cache (data/furnish-cache/<id>-<ctx>.js f4031b4 →