diff --git a/packages/drafts-realm/Product/03b3e910-a7ea-4881-b2cc-a1bb738530d9.json b/packages/drafts-realm/Product/03b3e910-a7ea-4881-b2cc-a1bb738530d9.json new file mode 100644 index 0000000000..6b1a68d930 --- /dev/null +++ b/packages/drafts-realm/Product/03b3e910-a7ea-4881-b2cc-a1bb738530d9.json @@ -0,0 +1,37 @@ +{ + "data": { + "type": "card", + "attributes": { + "images": [ + "https://i.etsystatic.com/8595526/r/il/b3b96c/3064849416/il_1588xN.3064849416_r41c.jpg", + "https://i.etsystatic.com/8595526/r/il/19a557/3064848658/il_1588xN.3064848658_m2t5.jpg", + "https://i.etsystatic.com/8595526/r/il/ac2b0b/3064860134/il_1588xN.3064860134_mm80.jpg", + "https://i.etsystatic.com/8595526/r/il/0e8ff6/3112592903/il_1588xN.3112592903_hq05.jpg", + "https://i.etsystatic.com/8595526/r/il/370ede/3064859840/il_1588xN.3064859840_rft0.jpg" + ], + "unitPriceCents": 10277, + "usShippingCostCents": 0, + "leadTimeDays": 14, + "deliveryWindowDays": 19, + "isReturnable": false, + "details": "This listing is a special deal. It's a HEAVILY DISCOUNTED package of the 2 busts that I make and sell separately – Marcus Aurelius and Seneca.\n\nThese busts look and feel great. Their rustic appearance is a joy to look at. The stone cold concrete is mesmerising to the touch!\n\nIn the past, my customers were buying these separately for a full price, but now you can get these two together and pay around 25% less.", + "reviewsCount": 385, + "reviewsAverage": 4.99, + "title": "MARCUS + SENECA Premium Concrete Busts | Stoic Set", + "description": null + }, + "relationships": { + "seller": { + "links": { + "self": "../Seller/2e039829-9d63-4e06-a257-0986614d9242" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../product", + "name": "Product" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Product/12df8671-2b17-4922-9a48-0ee8d795dd88.json b/packages/drafts-realm/Product/12df8671-2b17-4922-9a48-0ee8d795dd88.json new file mode 100644 index 0000000000..ca43502820 --- /dev/null +++ b/packages/drafts-realm/Product/12df8671-2b17-4922-9a48-0ee8d795dd88.json @@ -0,0 +1,38 @@ +{ + "data": { + "type": "card", + "attributes": { + "images": [ + "https://i.etsystatic.com/11651126/r/il/8a1854/4271282645/il_1588xN.4271282645_d35m.jpg", + "https://i.etsystatic.com/11651126/r/il/2e5686/4223621734/il_1588xN.4223621734_17qx.jpg", + "https://i.etsystatic.com/11651126/r/il/fe1115/4223621718/il_1588xN.4223621718_tizf.jpg", + "https://i.etsystatic.com/11651126/r/il/fce17f/4223621812/il_1588xN.4223621812_hy7b.jpg", + "https://i.etsystatic.com/11651126/r/il/06bf3d/4271279657/il_1588xN.4271279657_qfzy.jpg", + "https://i.etsystatic.com/11651126/r/il/4bfeaa/3556279056/il_1588xN.3556279056_gtc2.jpg" + ], + "unitPriceCents": 12454, + "usShippingCostCents": 0, + "leadTimeDays": 7, + "deliveryWindowDays": 3, + "isReturnable": true, + "details": "Men’s linen pajama set leaves your body feeling nothing but comfort while you sleep. Linen fabric is known for its natural breathability and moisture-wicking qualities, and it feels super soft on your skin. This linen pajama set includes a long-sleeve top that has a front button closure and long pants with an adjustable waistline.\n\nDetails:\n\n* Loose fit\n* Waist adjustable with drawstrings\n* Front closure with buttons\n* Lightweight linen (approx. 135 gsm)\n* Model is wearing size M and is 5'9\" (180 cm)\n\nFabrics & care:\n\n* OEKO-TEX certified (2019OK0776)\n* Made from 100% European flax\n* Stone washed for maximum softness\n* Machine washable\n", + "reviewsCount": 23274, + "reviewsAverage": 4.5, + "title": "Men's linen pajama set VIGO", + "description": null + }, + "relationships": { + "seller": { + "links": { + "self": "../Seller/1d6caa4a-92f6-4b39-b831-bd466a2f962e" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../product", + "name": "Product" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Product/13e1dc95-e84d-4ddd-ad17-fa6b3c59cca5.json b/packages/drafts-realm/Product/13e1dc95-e84d-4ddd-ad17-fa6b3c59cca5.json new file mode 100644 index 0000000000..d99361b40a --- /dev/null +++ b/packages/drafts-realm/Product/13e1dc95-e84d-4ddd-ad17-fa6b3c59cca5.json @@ -0,0 +1,39 @@ +{ + "data": { + "type": "card", + "attributes": { + "images": [ + "https://i.etsystatic.com/39837875/r/il/b458dc/4902254774/il_794xN.4902254774_hzf8.jpg", + "https://i.etsystatic.com/39837875/r/il/b62b08/4642226673/il_794xN.4642226673_edpy.jpg", + "https://i.etsystatic.com/39837875/r/il/b4b626/4593983984/il_794xN.4593983984_dtsw.jpg", + "https://i.etsystatic.com/39837875/r/il/b6fa16/4642262485/il_794xN.4642262485_m9qh.jpg", + "https://i.etsystatic.com/39837875/r/il/39f782/4594019308/il_794xN.4594019308_gx5u.jpg", + "https://i.etsystatic.com/39837875/r/il/a99508/4642267017/il_794xN.4642267017_et2z.jpg", + "https://i.etsystatic.com/39837875/r/il/f9cc89/5588274509/il_794xN.5588274509_3l0i.jpg" + ], + "unitPriceCents": 2486, + "usShippingCostCents": 748, + "leadTimeDays": 2, + "deliveryWindowDays": 11, + "isReturnable": false, + "details": "Premium Quality Personalized Laser Engraving.\n\nHeavy Base Rock Whiskey glass, 11 oz.\n\nHandMade Laser Etched and Personalized. \n\nDishwasher safe.\n\nGreat Gift For Any Special Occasion.\n\n", + "reviewsCount": 4401, + "reviewsAverage": 4.88, + "title": "Custom Whiskey Glass with premium quality side and bottom engraving", + "description": null + }, + "relationships": { + "seller": { + "links": { + "self": "../Seller/16eb2270-4a77-4d2e-85cf-302d1a5ae467" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../product", + "name": "Product" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Product/1c49353e-2705-44c5-b008-13cd709eb743.json b/packages/drafts-realm/Product/1c49353e-2705-44c5-b008-13cd709eb743.json new file mode 100644 index 0000000000..3d71bb9f41 --- /dev/null +++ b/packages/drafts-realm/Product/1c49353e-2705-44c5-b008-13cd709eb743.json @@ -0,0 +1,38 @@ +{ + "data": { + "type": "card", + "attributes": { + "images": [ + "https://i.etsystatic.com/16364929/r/il/ebc7de/1494228250/il_1588xN.1494228250_qeqn.jpg", + "https://i.etsystatic.com/16364929/r/il/939689/1494228286/il_1588xN.1494228286_rtii.jpg", + "https://i.etsystatic.com/16364929/r/il/b8b190/1494228324/il_1588xN.1494228324_5rtn.jpg", + "https://i.etsystatic.com/16364929/r/il/52e5be/1494228362/il_1588xN.1494228362_nd20.jpg", + "https://i.etsystatic.com/16364929/r/il/56284f/1541707445/il_1588xN.1541707445_e3fh.jpg", + "https://i.etsystatic.com/16364929/r/il/83c065/1494228636/il_1588xN.1494228636_a9lq.jpg" + ], + "unitPriceCents": 1500, + "usShippingCostCents": 0, + "leadTimeDays": 6, + "deliveryWindowDays": 7, + "isReturnable": false, + "details": "California Beach Volleyball played against a sunset. This beach decor scene would look great on any wall. It features a lifeguard tower with beach volleyball players in the background. This art would look great in any room. Bright colors and a simple design!\n\nThis artwork can be customized. If you need a particular color or size, please message me. I will do my best to accommodate!\n\nQUALITY:\n\nPrints are produced using a professional printer using quality archival pigment inks to ensure vivid and rich colored prints. Actual colors may vary slightly as each monitor displays colors differently.\n\nSHIPPING:\n\nMy large prints are wrapped in a bag and packaged in a wide poster tube for protection. Smaller prints will be sealed in a bag and mailed in a sturdy hardbacked envelope. Items will be weighed before shipping, in order to get accurate shipping cost to your location.\n", + "reviewsCount": 63, + "reviewsAverage": 4.921, + "title": "California Beach Volleyball Sunset, Beach Decor, Beach Wall Art", + "description": null + }, + "relationships": { + "seller": { + "links": { + "self": "../Seller/3c27ee4e-acea-4d88-bf8c-b5700360ddea" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../product", + "name": "Product" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Product/4c2a356e-ec74-4a49-9aa2-a88df64cf446.json b/packages/drafts-realm/Product/4c2a356e-ec74-4a49-9aa2-a88df64cf446.json new file mode 100644 index 0000000000..b162fbc02a --- /dev/null +++ b/packages/drafts-realm/Product/4c2a356e-ec74-4a49-9aa2-a88df64cf446.json @@ -0,0 +1,38 @@ +{ + "data": { + "type": "card", + "attributes": { + "images": [ + "https://i.etsystatic.com/20762234/r/il/eaaa62/4838318536/il_1588xN.4838318536_7nxb.jpg", + "https://i.etsystatic.com/20762234/r/il/72a997/5535384969/il_1588xN.5535384969_j6y5.jpg", + "https://i.etsystatic.com/20762234/r/il/796792/5535384921/il_1588xN.5535384921_rqh5.jpg", + "https://i.etsystatic.com/20762234/r/il/645e2d/5487271838/il_1588xN.5487271838_awnh.jpg", + "https://i.etsystatic.com/20762234/r/il/dbd300/5487271790/il_1588xN.5487271790_cbul.jpg", + "https://i.etsystatic.com/20762234/r/il/bad68b/5529797514/il_1588xN.5529797514_8moe.jpg" + ], + "unitPriceCents": 5841, + "usShippingCostCents": 0, + "leadTimeDays": 2, + "deliveryWindowDays": 12, + "isReturnable": true, + "details": "✅ DO YOUR OWN THING – Trade a cask for the bottle and create authentic whiskey flavor with our exclusive woodchip blends. The only extra you need is a bottle of neutral alcohol to infuse as a base. Why not craft homemade whiskey from a bottle you already have?\n\n✅ GET CREATIVE WITH NATURE - Experiment with three types of oak and six herbs & spices to give your cocktail a truly personal touch. All our botanicals are 100% natural, and freshly sourced and come in glass tubes with real corks. Here’s to the environment!\n\n✅ PAMPER YOUR EYES & PALATE -Our diy alcohol gift set includes six stainless steel whiskey ice cubes, two lovely glass prep bottles, and quality ingredients. Using the included labels, give your product a name and add your own touches.\n\n✅ BECOME A PRO AT THE BAR -Irish Blend and Scotch Single Malt to the original American Bourbon You'll get everything you need to succeed at your first-ever craft cocktail tasting, including a snappy glossary and three fantastic basic recipes!\n\n✅ GIVE THE GIFT OF PURE ENJOYMENT - Our gift kit is the ideal present for whiskey lovers and dabblers of both genders: a spirit(ed) surprise for friends & family. At birthday parties, under the Christmas tree, or at a wedding reception: do your own thing – DO YOUR WHISKY Infusion!\n\nDO YOUR WHISKY - the premium DIY kit that takes your whiskey experience to the next level. Our kit includes everything you need to add a botanical infusion touch to your whiskey, resulting in a natural aroma that will make your whiskey taste even better. The DO YOUR WHISKY kit contains a variety of spices to infuse your whiskey with your own unique flavors. With our pre-selected recipe ideas, you can get started right away and experiment with different botanicals to find the perfect blend for your taste. Our kit includes six stainless steel ice cubes to keep your drink chilled without watering it down, two empty glass bottles with the DO YOUR WHISKY label for you to personalize your creation, and twelve glass cylinders to store your infused whiskey. With DO YOUR WHISKY, making your own handmade whiskey has never been easier. All you need to do is purchase your preferred alcohol to get started.\n\nPersonalized Whiskey cocktail will taste better with your particular flavor - Do Your Whisky! Be unique and utilize top-notch spices to produce your own characteristic odor. You may brew your own homemade whiskey with the DO YOUR WHISKY kit's materials. Twelve glass cylinders, two empty glass bottles with the DO YOUR WHISKY label so you may personalize your concoction, six stainless steel ice cubes, and three pre-selected recipe ideas are all included in the kit. All you need to do to get started is purchase the booze.\n\nExperimenting with the botanicals will create an extraordinary taste experience you will not find in any industrially produced whiskey. How do you DO YOUR WHISKY?\n\nBOTANICALS\n\n* 🌿 american sweetheart (2x)\n* 🌿 dark chocolate (2x)\n* 🌿 vanilla dream (2x)\n* 🌿 bird's eye chili\n* 🌿 orange peel\n* 🌿 chai mix\n* 🌿 cocoa beans\n* 🌿 cinnamon\n* 🌿 coffee beans\n\n100% recyclable packaging\n100% biodegradable product\n\nAll you need is a neutral alcohol as a base and you are ready to make your Whiskey at home, yes seriously!\n\nWe recommend using a mild vodka as a base. Russian Standard or Smirnoff Vodka have proven to be particularly good. With the whiskey set you can also take a white whisky, un-aged bourbon or a corn schnapps. Corn schnapps can be found under the name \"moonshine\".\n\nPlease Note - This product does not include alcohol.Take advantage of our exclusive holiday deals and give the perfect Valentine's gift to your beloved partners, wives, husbands, girlfriends, and boyfriends with our special discounts.\n\n", + "reviewsCount": 14626, + "reviewsAverage": 4.9014, + "title": "DIY Whiskey Making Kit", + "description": null + }, + "relationships": { + "seller": { + "links": { + "self": "../Seller/f215492e-1917-4f66-a1f2-33561830236b" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../product", + "name": "Product" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Product/518dbfc8-a9fa-4403-8422-885edb64063f.json b/packages/drafts-realm/Product/518dbfc8-a9fa-4403-8422-885edb64063f.json new file mode 100644 index 0000000000..0f316ebd7b --- /dev/null +++ b/packages/drafts-realm/Product/518dbfc8-a9fa-4403-8422-885edb64063f.json @@ -0,0 +1,37 @@ +{ + "data": { + "type": "card", + "attributes": { + "images": [ + "https://i.etsystatic.com/24503655/r/il/26b64c/2537115502/il_794xN.2537115502_l5au.jpg", + "https://i.etsystatic.com/24503655/r/il/016c07/2592289458/il_794xN.2592289458_bnh2.jpg", + "https://i.etsystatic.com/24503655/r/il/6d3e74/2493387386/il_794xN.2493387386_fwr7.jpg", + "https://i.etsystatic.com/24503655/r/il/6d3e74/2493387386/il_794xN.2493387386_fwr7.jpg", + "https://i.etsystatic.com/24503655/r/il/43ea3a/2541041993/il_794xN.2541041993_1yzc.jpg" + ], + "unitPriceCents": 899, + "usShippingCostCents": 400, + "leadTimeDays": 2, + "deliveryWindowDays": 10, + "isReturnable": false, + "details": "Keep your hands germ-free while you’re on the go with our refillable vegan leather handsanitizer carrier.\n\nSimply attach it to your purse or key chain.\n\n* Vegan Leather\n* Convenient Keychain Clip\n* Handy Wrist strap\n* Includes a 1 oz Refillable Bottle\n\nHand Sanitizer Keychain and 1 oz. Bottle\n\nNever find yourself without your favorite lotion, hand sanitizer, or soap when you need it the most.\n\nSix Feet Away’s unique design makes it easy to carry your favorite hand sanitizer or lotion. Fill our leak proof 1 oz bottle with hand sanitizer, alcohol gel,or your favorite product and attach it to your keys, bag, purse, or back-pack.\n\nNOTE: The Refillable Bottle is sent Empty", + "reviewsCount": 852, + "reviewsAverage": 4.97, + "title": "Hand Sanitizer Holder Keychain", + "description": null + }, + "relationships": { + "seller": { + "links": { + "self": "../Seller/6ed2258d-f760-4d94-b0e6-48a5f5a37c3d" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../product", + "name": "Product" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Product/8e84d4ff-5528-4872-8734-491774c40a47.json b/packages/drafts-realm/Product/8e84d4ff-5528-4872-8734-491774c40a47.json new file mode 100644 index 0000000000..13a5d9b806 --- /dev/null +++ b/packages/drafts-realm/Product/8e84d4ff-5528-4872-8734-491774c40a47.json @@ -0,0 +1,37 @@ +{ + "data": { + "type": "card", + "attributes": { + "images": [ + "https://i.etsystatic.com/15040126/r/il/29ad12/5605593265/il_1588xN.5605593265_kf13.jpg", + "https://i.etsystatic.com/15040126/r/il/8ab9a8/5605593345/il_1588xN.5605593345_al14.jpg", + "https://i.etsystatic.com/15040126/r/il/a62b8c/5575513721/il_1588xN.5575513721_3kz2.jpg", + "https://i.etsystatic.com/15040126/r/il/a3047f/5527399772/il_1588xN.5527399772_5ghd.jpg", + "https://i.etsystatic.com/15040126/r/il/1740d3/5617188945/il_1588xN.5617188945_7wi9.jpg" + ], + "unitPriceCents": 1756, + "usShippingCostCents": 0, + "leadTimeDays": 7, + "deliveryWindowDays": 12, + "isReturnable": false, + "details": "There's nothing better than warming-up with a nice cup of your favorite beverage out of this simple and funny mug. The perfect gift for a competitive person who enjoys coffee, tea or hot chocolate.\n\n* ⭐ White or Black Ceramic Mug\n* ⭐ 11-oz Size or 15-oz Size (NEW!)\n* ⭐ Double Sided Design\n* ⭐ Microwave Safe\n* ⭐ Dishwasher Safe\n\n✅ Our Guarantee: If your mug arrives damaged or with a print quality issue, please message us directly with a photo and we will replace it free of charge! We always stand by the quality of our products!\n", + "reviewsCount": 137, + "reviewsAverage": 4.84, + "title": "Ultimate Frisbee Player Mug, Tears of the People I Beat", + "description": null + }, + "relationships": { + "seller": { + "links": { + "self": "../Seller/83611506-061b-4d44-841b-342796449a96" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../product", + "name": "Product" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Product/92df64d3-65b7-48a6-9a4c-e7b13a9b0ec5.json b/packages/drafts-realm/Product/92df64d3-65b7-48a6-9a4c-e7b13a9b0ec5.json new file mode 100644 index 0000000000..8d3f47ace1 --- /dev/null +++ b/packages/drafts-realm/Product/92df64d3-65b7-48a6-9a4c-e7b13a9b0ec5.json @@ -0,0 +1,38 @@ +{ + "data": { + "type": "card", + "attributes": { + "images": [ + "https://i.etsystatic.com/14024996/r/il/250e89/1980044674/il_794xN.1980044674_aq4n.jpg", + "https://i.etsystatic.com/14024996/r/il/7419f5/1980329888/il_794xN.1980329888_phjf.jpg", + "https://i.etsystatic.com/14024996/r/il/cee84b/1179325444/il_794xN.1179325444_1y3h.jpg", + "https://i.etsystatic.com/14024996/r/il/bfed35/1210494745/il_794xN.1210494745_c5zt.jpg", + "https://i.etsystatic.com/14024996/r/il/d812cd/1946487050/il_794xN.1946487050_suco.jpg", + "https://i.etsystatic.com/14024996/r/il/3d1f28/2002648593/il_794xN.2002648593_mx8z.jpg" + ], + "unitPriceCents": 11309, + "usShippingCostCents": 0, + "leadTimeDays": 8, + "deliveryWindowDays": 6, + "isReturnable": true, + "details": "Introducing our The Great Wave off Kanagawa Leather Print Reproduction, a stunning piece of art that will transform your wall into a masterpiece.\n\nOur prints are printed on high-quality eco leather, giving a unique texture and feel that is superior to traditional canvas.\n\nEach print is handmade in Italy, ensuring the highest quality and durability.\n\nProduct Features:\n\n* Eco-leather print\n* Washable panels\n* UV-resistant coating\n* Stretched over polished pinewood frames\n* Ready to hang\n* Handmade in Italy\n* Thickness of each product is 1\" (2.5 cm)", + "reviewsCount": 329, + "reviewsAverage": 4.9, + "title": "The Great Wave off Kanagawa Leather Print Reproduction", + "description": null + }, + "relationships": { + "seller": { + "links": { + "self": "../Seller/703dfdde-8279-42de-ab57-3cdd1d8695bc" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../product", + "name": "Product" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Product/d7d548f1-22ab-4332-a793-fa2aaf8f894a.json b/packages/drafts-realm/Product/d7d548f1-22ab-4332-a793-fa2aaf8f894a.json new file mode 100644 index 0000000000..f95176cda6 --- /dev/null +++ b/packages/drafts-realm/Product/d7d548f1-22ab-4332-a793-fa2aaf8f894a.json @@ -0,0 +1,37 @@ +{ + "data": { + "type": "card", + "attributes": { + "images": [ + "https://i.etsystatic.com/16555624/r/il/9ee34f/4407428528/il_794xN.4407428528_nmcn.jpg", + "https://i.etsystatic.com/16555624/r/il/ccdf1c/4956749805/il_1140xN.4956749805_p8sh.jpg", + "https://i.etsystatic.com/16555624/r/il/235022/4956749015/il_1140xN.4956749015_t2ns.jpg", + "https://i.etsystatic.com/16555624/r/il/a8ebe7/4897680164/il_1140xN.4897680164_5r0c.jpg", + "https://i.etsystatic.com/16555624/r/il/a93d93/4897672816/il_1140xN.4897672816_mrfd.jpg" + ], + "unitPriceCents": 3440, + "usShippingCostCents": 850, + "leadTimeDays": 13, + "deliveryWindowDays": 20, + "isReturnable": true, + "details": "This tender hummingbird window hanging made of stained glass is a lovely decor for your home or garden as this cute green bird with flower will gladden your eye every day 😊 This marvellous work of hummingbird art can be hanged on a window and make you a bit happier by simply looking at it due to its beauty and vibrant colours 😍 Besides, this bird suncatcher could be hanged in the garden near a hummingbird feeder to attract birds’ attention 🐦 This adorable window hanging will be a unique gift for the loved ones 🎁\n\n!‼️ Please, note: this item is handcrafted - glass could slightly differ.\n\nThis stained glass item is made using L.C. Tiffany method of copper foil. During the process of manufacturing goods we use only the high quality materials, such as:\n\n* Stained Glass\n* Copper Foil\n* Tin\n* Stained Glass Paints\n\nEach stained glass decor is safely packaged into a box for delivering it to customer in excellent condition.", + "reviewsCount": 32517, + "reviewsAverage": 4.85, + "title": "Hummingbird stained glass window hangings", + "description": null + }, + "relationships": { + "seller": { + "links": { + "self": "../Seller/dc28a198-e047-4d68-b45d-968c7bfc75f5" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../product", + "name": "Product" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/ProductList/b325edb9-6088-4db1-9629-502c42c02d70.json b/packages/drafts-realm/ProductList/b325edb9-6088-4db1-9629-502c42c02d70.json new file mode 100644 index 0000000000..42db9db431 --- /dev/null +++ b/packages/drafts-realm/ProductList/b325edb9-6088-4db1-9629-502c42c02d70.json @@ -0,0 +1,63 @@ +{ + "data": { + "type": "card", + "attributes": { + "title": null, + "description": null, + "thumbnailURL": null + }, + "relationships": { + "products.0": { + "links": { + "self": "../Product/d7d548f1-22ab-4332-a793-fa2aaf8f894a" + } + }, + "products.1": { + "links": { + "self": "../Product/92df64d3-65b7-48a6-9a4c-e7b13a9b0ec5" + } + }, + "products.2": { + "links": { + "self": "../Product/12df8671-2b17-4922-9a48-0ee8d795dd88" + } + }, + "products.3": { + "links": { + "self": "../Product/4c2a356e-ec74-4a49-9aa2-a88df64cf446" + } + }, + "products.4": { + "links": { + "self": "../Product/8e84d4ff-5528-4872-8734-491774c40a47" + } + }, + "products.5": { + "links": { + "self": "../Product/1c49353e-2705-44c5-b008-13cd709eb743" + } + }, + "products.6": { + "links": { + "self": "../Product/03b3e910-a7ea-4881-b2cc-a1bb738530d9" + } + }, + "products.7": { + "links": { + "self": "../Product/518dbfc8-a9fa-4403-8422-885edb64063f" + } + }, + "products.8": { + "links": { + "self": "../Product/13e1dc95-e84d-4ddd-ad17-fa6b3c59cca5" + } + } + }, + "meta": { + "adoptsFrom": { + "module": "../product-list", + "name": "ProductList" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Seller/16eb2270-4a77-4d2e-85cf-302d1a5ae467.json b/packages/drafts-realm/Seller/16eb2270-4a77-4d2e-85cf-302d1a5ae467.json new file mode 100644 index 0000000000..6d4e04002a --- /dev/null +++ b/packages/drafts-realm/Seller/16eb2270-4a77-4d2e-85cf-302d1a5ae467.json @@ -0,0 +1,16 @@ +{ + "data": { + "type": "card", + "attributes": { + "title": "HMGiftCollection", + "description": null, + "thumbnailURL": null + }, + "meta": { + "adoptsFrom": { + "module": "../seller", + "name": "Seller" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Seller/1d6caa4a-92f6-4b39-b831-bd466a2f962e.json b/packages/drafts-realm/Seller/1d6caa4a-92f6-4b39-b831-bd466a2f962e.json new file mode 100644 index 0000000000..e53b555672 --- /dev/null +++ b/packages/drafts-realm/Seller/1d6caa4a-92f6-4b39-b831-bd466a2f962e.json @@ -0,0 +1,16 @@ +{ + "data": { + "type": "card", + "attributes": { + "title": "MagicLinen", + "description": null, + "thumbnailURL": null + }, + "meta": { + "adoptsFrom": { + "module": "../seller", + "name": "Seller" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Seller/2e039829-9d63-4e06-a257-0986614d9242.json b/packages/drafts-realm/Seller/2e039829-9d63-4e06-a257-0986614d9242.json new file mode 100644 index 0000000000..c2620b298d --- /dev/null +++ b/packages/drafts-realm/Seller/2e039829-9d63-4e06-a257-0986614d9242.json @@ -0,0 +1,16 @@ +{ + "data": { + "type": "card", + "attributes": { + "title": "jurgenstudio", + "description": null, + "thumbnailURL": null + }, + "meta": { + "adoptsFrom": { + "module": "../seller", + "name": "Seller" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Seller/3c27ee4e-acea-4d88-bf8c-b5700360ddea.json b/packages/drafts-realm/Seller/3c27ee4e-acea-4d88-bf8c-b5700360ddea.json new file mode 100644 index 0000000000..88f9baf506 --- /dev/null +++ b/packages/drafts-realm/Seller/3c27ee4e-acea-4d88-bf8c-b5700360ddea.json @@ -0,0 +1,16 @@ +{ + "data": { + "type": "card", + "attributes": { + "title": "CreativeJuicesBoCo", + "description": null, + "thumbnailURL": null + }, + "meta": { + "adoptsFrom": { + "module": "../seller", + "name": "Seller" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Seller/6ed2258d-f760-4d94-b0e6-48a5f5a37c3d.json b/packages/drafts-realm/Seller/6ed2258d-f760-4d94-b0e6-48a5f5a37c3d.json new file mode 100644 index 0000000000..9baf9d0543 --- /dev/null +++ b/packages/drafts-realm/Seller/6ed2258d-f760-4d94-b0e6-48a5f5a37c3d.json @@ -0,0 +1,16 @@ +{ + "data": { + "type": "card", + "attributes": { + "title": "SixFeetAwayGoods", + "description": null, + "thumbnailURL": null + }, + "meta": { + "adoptsFrom": { + "module": "../seller", + "name": "Seller" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Seller/703dfdde-8279-42de-ab57-3cdd1d8695bc.json b/packages/drafts-realm/Seller/703dfdde-8279-42de-ab57-3cdd1d8695bc.json new file mode 100644 index 0000000000..7b928986aa --- /dev/null +++ b/packages/drafts-realm/Seller/703dfdde-8279-42de-ab57-3cdd1d8695bc.json @@ -0,0 +1,16 @@ +{ + "data": { + "type": "card", + "attributes": { + "title": "LWhomedecor", + "description": null, + "thumbnailURL": null + }, + "meta": { + "adoptsFrom": { + "module": "../seller", + "name": "Seller" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Seller/83611506-061b-4d44-841b-342796449a96.json b/packages/drafts-realm/Seller/83611506-061b-4d44-841b-342796449a96.json new file mode 100644 index 0000000000..dabf27f7fd --- /dev/null +++ b/packages/drafts-realm/Seller/83611506-061b-4d44-841b-342796449a96.json @@ -0,0 +1,16 @@ +{ + "data": { + "type": "card", + "attributes": { + "title": "WowJustWowDesigns", + "description": null, + "thumbnailURL": null + }, + "meta": { + "adoptsFrom": { + "module": "../seller", + "name": "Seller" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Seller/dc28a198-e047-4d68-b45d-968c7bfc75f5.json b/packages/drafts-realm/Seller/dc28a198-e047-4d68-b45d-968c7bfc75f5.json new file mode 100644 index 0000000000..0698ac6fd6 --- /dev/null +++ b/packages/drafts-realm/Seller/dc28a198-e047-4d68-b45d-968c7bfc75f5.json @@ -0,0 +1,16 @@ +{ + "data": { + "type": "card", + "attributes": { + "title": "GlassArtStories", + "description": null, + "thumbnailURL": null + }, + "meta": { + "adoptsFrom": { + "module": "../seller", + "name": "Seller" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/Seller/f215492e-1917-4f66-a1f2-33561830236b.json b/packages/drafts-realm/Seller/f215492e-1917-4f66-a1f2-33561830236b.json new file mode 100644 index 0000000000..805d250b10 --- /dev/null +++ b/packages/drafts-realm/Seller/f215492e-1917-4f66-a1f2-33561830236b.json @@ -0,0 +1,16 @@ +{ + "data": { + "type": "card", + "attributes": { + "title": "doyourgin", + "description": null, + "thumbnailURL": null + }, + "meta": { + "adoptsFrom": { + "module": "../seller", + "name": "Seller" + } + } + } +} \ No newline at end of file diff --git a/packages/drafts-realm/product-list.gts b/packages/drafts-realm/product-list.gts new file mode 100644 index 0000000000..0f6b6493a0 --- /dev/null +++ b/packages/drafts-realm/product-list.gts @@ -0,0 +1,230 @@ +import { + CardDef, + field, + linksToMany, +} from 'https://cardstack.com/base/card-api'; +import { Component } from 'https://cardstack.com/base/card-api'; +import { + Product as ProductCard, + formatUsd, + EmbeddedProductComponent, +} from './product'; +import GlimmerComponent from '@glimmer/component'; +import { fn } from '@ember/helper'; +import { on } from '@ember/modifier'; +import { BoxelInput } from '@cardstack/boxel-ui/components'; +// @ts-ignore TS1206: Decorators are not valid here. +import { action } from '@ember/object'; +// @ts-ignore TS1206: Decorators are not valid here. +import { tracked } from '@glimmer/tracking'; + +interface FeaturedProductComponentSignature { + Args: { + model: ProductCard | undefined; + viewProduct: (arg0: ProductCard | undefined) => void; + }; +} + +class FeaturedProductComponent extends GlimmerComponent { + +} + +export class ProductList extends CardDef { + @field products = linksToMany(ProductCard); + static displayName = 'Product List'; + + static isolated = class Isolated extends Component { + // @ts-ignore TS1206: Decorators are not valid here. + @tracked filterText = ''; + + // @ts-ignore TS1206: Decorators are not valid here. + @action + updateFilter(event: Event) { + this.filterText = (event.target as any).value.toLowerCase(); + } + + get filteredProducts() { + let { filterText } = this; + if (!filterText) return this.args.model.products; + return this.args.model.products?.filter((product) => { + return product.title?.toLowerCase().includes(filterText); + }); + } + + get featuredProduct() { + return this.filteredProducts?.[0]; + } + + get productsForGrid() { + return this.filteredProducts?.slice(1) || []; + } + + // @ts-ignore TS1206: Decorators are not valid here. + @action + viewProduct(model: ProductCard | undefined) { + if (model && this.args.context?.actions?.viewCard) { + this.args.context.actions.viewCard(model); + } else { + console.warn( + 'Product card opening functionality is not available here.', + ); + } + } + + + }; + + /* + + static embedded = class Embedded extends Component { + + } + + static atom = class Atom extends Component { + + } + + static edit = class Edit extends Component { + + } + + + + + + */ +} diff --git a/packages/drafts-realm/product.gts b/packages/drafts-realm/product.gts new file mode 100644 index 0000000000..552eddc018 --- /dev/null +++ b/packages/drafts-realm/product.gts @@ -0,0 +1,466 @@ +import MarkdownField from 'https://cardstack.com/base/markdown'; +import BooleanField from 'https://cardstack.com/base/boolean'; +import NumberField from 'https://cardstack.com/base/number'; +import { Seller as SellerCard } from './seller'; +import { + CardDef, + field, + linksTo, + contains, + containsMany, + StringField, +} from 'https://cardstack.com/base/card-api'; +import { Component } from 'https://cardstack.com/base/card-api'; +import GlimmerComponent from '@glimmer/component'; +// @ts-ignore TS1206: Decorators are not valid here. +import { tracked } from '@glimmer/tracking'; +// @ts-ignore TS1206: Decorators are not valid here. +import { action } from '@ember/object'; +import { on } from '@ember/modifier'; +import { fn } from '@ember/helper'; +import { cn, eq } from '@cardstack/boxel-ui/helpers'; + +const usdFormatter = new Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD', +}); + +export function formatUsd(val: number | undefined) { + if (val === undefined) { + return ''; + } + return usdFormatter.format(val / 100); +} + +const numberFormatter = new Intl.NumberFormat('en-US'); + +export function formatNumber(val: number | undefined) { + if (val === undefined) { + return ''; + } + return numberFormatter.format(val); +} + +function expectedArrivalDescription( + leadTimeDays: number, + deliveryWindowDays: number, +) { + let min = leadTimeDays; + let max = leadTimeDays + deliveryWindowDays; + // calculate a date range, relative to today + let minDate = new Date(); + minDate.setDate(minDate.getDate() + min); + let maxDate = new Date(); + maxDate.setDate(maxDate.getDate() + max); + let minMonth = minDate.toLocaleString('default', { month: 'short' }); + let maxMonth = maxDate.toLocaleString('default', { month: 'short' }); + let minDay = minDate.getDate(); + let maxDay = maxDate.getDate(); + if (minMonth === maxMonth) { + return `${minMonth} ${minDay}–${maxDay}`; + } else { + return `${minMonth} ${minDay}–${maxMonth} ${maxDay}`; + } +} +interface EmbeddedProductComponentSignature { + Element: HTMLDivElement; + Args: { + model: Partial; + }; +} + +export class EmbeddedProductComponent extends GlimmerComponent { + +} + +interface ProductImagesSignature { + Element: HTMLDivElement; + Args: { + images: string[] | undefined; + activeImage: string | undefined; + onSelectImage: (arg0: string) => void; + }; +} + +class ProductImages extends GlimmerComponent { + +} + +interface StarRatingSignature { + Element: HTMLDivElement; + Args: { + value: number | undefined; + }; +} + +class StarRating extends GlimmerComponent { + get rating() { + return this.args.value || 0; + } + maxRating = 5; + fullClassNames = 'star-full'; + emptyClassNames = 'star-empty'; + + get stars() { + let rating = Math.round(this.rating); + let starsArray = []; + for (let i = 1; i <= this.maxRating; i++) { + starsArray.push({ rating: i, full: rating >= i }); + } + return starsArray; + } + +} + +export class Product extends CardDef { + static displayName = 'Product'; + + // use title field for product title + + @field images = containsMany(StringField); + @field seller = linksTo(SellerCard); + @field unitPriceCents = contains(NumberField); + @field usShippingCostCents = contains(NumberField); + @field leadTimeDays = contains(NumberField); + @field deliveryWindowDays = contains(NumberField); + @field isReturnable = contains(BooleanField); + @field details = contains(MarkdownField); + @field reviewsCount = contains(NumberField); + @field reviewsAverage = contains(NumberField); + @field thumbnailURL = contains(StringField, { + computeVia(this: Product) { + return this.images?.[0]; + }, + }); + + static embedded = class Embedded extends Component { + + }; + + static isolated = class Isolated extends Component { + // @ts-ignore TS1206: Decorators are not valid here. + @tracked activeImage = this.args.model.images?.[0]; + + // @ts-ignore TS1206: Decorators are not valid here. + @action updateActiveImage(image: string) { + this.activeImage = image; + } + + get leadTimeDays() { + return this.args.model.leadTimeDays || 0; + } + + get deliveryWindowDays() { + return this.args.model.deliveryWindowDays || 0; + } + + + }; + + /* + static atom = class Atom extends Component { + + } + + static edit = class Edit extends Component { + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + */ +} diff --git a/packages/drafts-realm/seller.gts b/packages/drafts-realm/seller.gts new file mode 100644 index 0000000000..a42056c116 --- /dev/null +++ b/packages/drafts-realm/seller.gts @@ -0,0 +1,25 @@ +import { CardDef } from 'https://cardstack.com/base/card-api'; +import { Component } from 'https://cardstack.com/base/card-api'; +export class Seller extends CardDef { + static displayName = "Seller"; + + static embedded = class Embedded extends Component { + + } + + /* + static isolated = class Isolated extends Component { + + } + + static atom = class Atom extends Component { + + } + + static edit = class Edit extends Component { + + } + */ +} \ No newline at end of file