/* Product catalog — per-product copy, options, and specs for the detail pages.
   Written product-by-product (modeled on how Vistaprint writes each food-packaging
   PDP distinctly: own description, own size system, own materials, own spec values),
   then voiced for Wonderful Choice. Keys must match the Lineup menu names exactly. */

(function () {
  const PRINTS = ["Plain", "Logo only", "Full-print"];

  // Every product has four bespoke shots at assets/products/<slug>-1..4.jpg
  // (generated from image-prompts.md). Slug = lowercased name, runs of
  // non-alphanumerics collapsed to dashes — must stay in sync with that file.
  function slugify(name) { return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, ""); }
  function shots(name) { return [1, 2, 3, 4].map((n) => `assets/products/${slugify(name)}-${n}.jpg`); }

  // category defaults: option values, spec building blocks, quantity tiers
  const CATS = {
    drinkware: { quantities: ["250", "500", "1,000", "2,500", "5,000"],
      material: "Food-grade cup board, 300 gsm, PE-lined", eco: "PE-lined — recycling varies by city; PLA-lined (commercially compostable) on request" },
    lids:      { quantities: ["500", "1,000", "2,500", "5,000"],
      material: "Food-grade PP / PET", eco: "Recyclable №5 / №1; paper option available" },
    sleeves:   { quantities: ["250", "500", "1,000", "2,500"],
      material: "Corrugated kraft board", eco: "100% recycled fiber, curbside recyclable" },
    straws:    { quantities: ["500", "1,000", "5,000", "10,000"],
      material: "Food-grade, drink-safe", eco: "Plastic-free options available" },
    togo:      { quantities: ["100", "250", "500", "1,000", "2,500"],
      material: "Greaseproof food board, 350 gsm", eco: "PLA-lined option — commercially compostable" },
    bakery:    { quantities: ["50", "100", "250", "500", "1,000"],
      material: "Food-grade board, grease-resistant", eco: "100% recyclable kraft option" },
    bags:      { quantities: ["200", "500", "1,000", "3,000"],
      material: "High recycled-content kraft", eco: "Varies by material — kraft styles recyclable & compostable" },
    wraps:     { quantities: ["500", "1,000", "2,500", "5,000"],
      material: "Food-grade greaseproof paper", eco: "Papers chlorine-free & industrially compostable; film items vary" },
    labels:    { quantities: ["250", "500", "1,000", "2,500"],
      material: "Pressure-sensitive label stock", eco: "Recyclable paper facestocks; film & thermal stocks vary" },
  };

  // item(name, catKey, tag, desc, { sizes, materials, sizeLabel, extraSpecs, printNote })
  const ITEMS = [];
  function item(name, cat, tag, desc, o) { ITEMS.push({ name, cat, tag, desc, o: o || {} }); }

  /* ============ 01 · Drinkware — Cups & Bottles ============ */
  item("Hot Cups", "drinkware", "8–20 oz · Coffee & Tea",
    "The workhorse of the counter. Smooth-sided hot cups in single or double wall, PE-lined so the seam never weeps. Holds a 180°F pour without going soft — your logo stays crisp from first sip to last.",
    { sizes: ["8 oz", "12 oz", "16 oz", "20 oz"], materials: ["Single-wall", "Double-wall", "Ripple wall"] });
  item("Insulated Hollow Cups", "drinkware", "10 oz · 12 oz · 16 oz · 22 oz · No sleeve needed",
    "An air pocket between two walls does the sleeve's job for free. Cool to the touch at full brew temperature — hand them across the counter without a wince.",
    { sizes: ["10 oz", "12 oz", "16 oz", "22 oz"], materials: ["Hollow double-wall"], extraSpecs: { "Heat rating": "Holds 190°F brew, cool outer wall" } });
  item("Corrugated Cups", "drinkware", "Extra-grip kraft · 8–16 oz",
    "Fluted kraft sidewall with real tooth — the cup customers don't fumble. The ridges print beautifully in one or two inks for that classic roadside look.",
    { sizes: ["8 oz", "12 oz", "16 oz"], materials: ["Kraft corrugated", "White corrugated"] });
  item("Brushed Gold & Silver Cups", "drinkware", "Metallic finish · 8–16 oz",
    "Foil-look board with a brushed metallic sheen. For the latte that costs a little more and looks like it. Pair with a black or white logo and let the metal do the talking.",
    { sizes: ["8 oz", "12 oz", "16 oz"], materials: ["Brushed gold", "Brushed silver"], eco: "Metallized board — not curbside recyclable", extraSpecs: { Finish: "Metallized board, smudge-resistant" } });
  item("Cup-Within-a-Cup", "drinkware", "Built-in sleeve · 12–16 oz",
    "Two cups bonded into one — the inner holds the drink, the outer is your billboard with a built-in air gap. No sleeve to slip off, no second SKU to stock.",
    { sizes: ["12 oz", "16 oz"], materials: ["Double-cup bonded"] });
  item("Diagonal-Mouth Cups", "drinkware", "The slant rim · 12–16 oz",
    "The rim cuts on a bias, so the cup photographs like nothing else on the shelf. A favorite for tea shops and seasonal drops — the slant is the design.",
    { sizes: ["12 oz", "16 oz"], materials: ["Single-wall", "Double-wall"] });
  item("Double-Wall Hollow Cups", "drinkware", "Cool to the touch · 8–22 oz",
    "Full hollow-chamber construction top to bottom. The drink stays hot longer, the hand stays comfortable, and the printable surface is dead flat for fine-line art.",
    { sizes: ["8 oz", "12 oz", "16 oz", "22 oz"], materials: ["Hollow double-wall"] });
  item("PET Cold Cups", "drinkware", "Crystal clear · 12–24 oz",
    "Heavy-gauge PET, BPA-free and clear as glass — iced drinks look like the menu photo. One to four colors front and back, or frost the whole cup and go subtle. Pairs with our 98 mm flat and dome lids.",
    { sizes: ["12 oz", "16 oz", "20 oz", "24 oz"], materials: ["Clear PET", "Frosted PET"], eco: "Recyclable №1 (PET)",
      extraSpecs: { Plastic: "Heavy-gauge PET, BPA-free & non-toxic", "Lid fit": "98 mm flat & dome" } });
  item("Injection / Frosted Cups", "drinkware", "Molded matte · 360–700 ml",
    "Injection-molded PP with a frosted, matte hand-feel — the heavyweight cup for signature drinks. Reusable-grade walls that read premium the second they hit the table.",
    { sizes: ["360 ml", "500 ml", "700 ml"], materials: ["Clear PP", "Frosted PP"], eco: "Recyclable №5 (PP)" });
  item("Square Cups", "drinkware", "Clear or frosted · 360–700 ml",
    "Four flat faces, four billboards. The square profile stacks tight, grips easy, and gives your art a flat panel — no curve distortion.",
    { sizes: ["360 ml", "500 ml", "700 ml"], materials: ["Clear", "Frosted"], eco: "Recyclable №5 (PP)" });
  item("U-Shape Cups", "drinkware", "Bubble-tea classic · 500–700 ml",
    "The rounded-bottom cup built for boba — pearls gather where the straw lands. Wide 90 mm mouth seals clean with film or snap lids.",
    { sizes: ["500 ml", "700 ml"], materials: ["Clear PP", "Frosted PP"], eco: "Recyclable №5 (PP)", extraSpecs: { "Seal options": "Film-seal or 90 mm snap lid" } });
  item("In-Mold-Label Cups", "drinkware", "Art baked in · 360–700 ml",
    "The label is fused into the cup wall at molding — photo-quality art that never peels, scuffs, or washes off. The most durable print we make.",
    { sizes: ["360 ml", "500 ml", "700 ml"], materials: ["Glossy IML", "Matte IML"], eco: "Recyclable №5 (PP)", printNote: "Photo-quality in-mold label (CMYK process), 360°" });
  item("Bottles", "drinkware", "Custom printed · 250–500 ml",
    "Clear PET bottles for cold brew, juice, and house sodas. Tamper-band caps, full-wrap print or label — the grab-and-go fridge never looked so organized.",
    { sizes: ["250 ml", "350 ml", "500 ml"], materials: ["Clear PET", "Frosted PET"], eco: "Recyclable №1 (PET)", extraSpecs: { Cap: "Tamper-evident, white or black" } });
  item("Custom Printed Cups", "drinkware", "Your run, your art",
    "Bring a logo, a napkin sketch, or a full wrap concept — we print any cup in the lineup to match. Pantone-matched inks, up to four colors, mock-up with every quote.",
    { sizes: ["8 oz", "12 oz", "16 oz", "20 oz"], materials: ["Single-wall", "Double-wall", "Ripple wall", "PET"] });

  /* ============ 02 · Lids & Toppers ============ */
  const LID_SIZES = ["80 mm", "90 mm", "98 mm"];
  item("Flat Lids", "lids", "Straw-slot classic",
    "The everyday cold-cup lid: low-profile PET with an X-slot that grips the straw and doesn't pop off in the cup carrier.",
    { sizes: LID_SIZES, materials: ["Clear PET", "Black PP"] });
  item("High-Dome Lids", "lids", "Room for foam",
    "Clearance for whipped cream, cheese foam, and tall toppings. Crystal PET dome shows the good stuff off instead of squashing it.",
    { sizes: ["90 mm", "98 mm"], materials: ["Clear PET"], extraSpecs: { "Dome height": "40 mm topping clearance" } });
  item("Semi-Circular Lids", "lids", "Half-dome profile",
    "Half the height of a full dome — topping room without the tippy stack. Plays nicely with delivery bags and tight cup carriers.",
    { sizes: ["90 mm", "98 mm"], materials: ["Clear PET"] });
  item("90° Rotating Lids", "lids", "Twist to sip",
    "Quarter-turn opens the sip port, quarter-turn seals it. The fidget-friendly lid that keeps a commute spill-free.",
    { sizes: ["90 mm"], materials: ["PP, two-tone"] });
  item("Swivel Lids", "lids", "Slide-action port",
    "A thumb-slide shutter over the drink port — open, close, repeat. Built for hot cups on the move.",
    { sizes: ["80 mm", "90 mm"], materials: ["Black PP", "White PP"] });
  item("Lift-to-Drink Lids", "lids", "Flip tab, no peel",
    "The tab lifts and locks back into the lid — nothing to tear off, nothing to litter. Clean look for hot drinks at events.",
    { sizes: ["80 mm", "90 mm"], materials: ["White PP", "Black PP"] });
  item("Split Hot-Drink Lids", "lids", "Two-part pour control",
    "A split sip port that tempers the first scalding sip. Baristas' pick for extra-hot orders.",
    { sizes: ["80 mm", "90 mm"], materials: ["White PP", "Black PP"] });
  item("Panda Lids", "lids", "The cult favorite",
    "Round ears, tiny face, completely unnecessary and absolutely beloved. The lid people photograph before they drink. Fits standard U-cups.",
    { sizes: ["90 mm"], materials: ["White PP", "Pink PP", "Black PP"], extraSpecs: { Note: "Stacks with flat lids for transport" } });
  item("Flip Leak-Proof Lids", "lids", "Spill-stop seal",
    "Gasket-seal flip lid tested upside-down. For delivery runs, car cup-holders, and anyone who's lost a latte to a pothole.",
    { sizes: ["90 mm"], materials: ["PP with silicone gasket"], extraSpecs: { Tested: "Inverted shake, zero-drip" } });
  item("Clamshell Lids", "lids", "Hinged top",
    "A hinged lid that opens like a locket — sample window on top, full seal underneath. Great for dessert cups and toppings bars.",
    { sizes: ["90 mm", "98 mm"], materials: ["Clear PET"] });
  item("Injection / Siamese Lids", "lids", "Twin-port molded",
    "Injection-molded with two sealed ports — straw on one side, sip on the other. One lid, every drinking style.",
    { sizes: ["90 mm"], materials: ["Clear PP"] });
  item("PET Snap Drink Lids", "lids", "Positive click fit",
    "Snaps on with an audible click and stays there. The carry-out insurance policy for clear cold cups.",
    { sizes: ["90 mm", "92 mm", "98 mm"], materials: ["Clear PET"] });
  item("PET Double-Hole Lids", "lids", "Boba twin-straw",
    "Two pre-cut ports: one wide for the boba straw, one standard. No stabbing, no splash-back, no film sealer needed.",
    { sizes: ["90 mm", "95 mm"], materials: ["Clear PET"] });
  item("Paper Lids", "lids", "Plastic-free",
    "Pressed paper-fiber lids that go in the same bin as the cup. Fits hot cups 80–90 mm; embossed logo available instead of ink.",
    { sizes: ["80 mm", "90 mm"], materials: ["Bagasse fiber", "Kraft paper"], eco: "Home-compostable, plastic-free" });

  /* ============ 03 · Sleeves, Carriers & Holders ============ */
  item("Snap / Card-Buckle Sleeves", "sleeves", "Locks flat, snaps on",
    "Ships dead-flat, snaps into shape with a card buckle — no glue line to crack. Full-wrap print area for punchy sleeve art.",
    { sizes: ["Fits 8–12 oz", "Fits 12–16 oz", "Fits 16–22 oz"], materials: ["Kraft", "White", "Black"] });
  item("Double-Layer Sleeves", "sleeves", "Extra insulation",
    "Two plies of fluted kraft for the extra-hot pour. The sleeve that means it.",
    { sizes: ["Fits 8–12 oz", "Fits 12–16 oz"], materials: ["Kraft corrugated", "White corrugated"] });
  item("Special-Shaped Sleeves", "sleeves", "Die-cut to your art",
    "Scalloped, notched, peaked — the sleeve cut to your design instead of a straight band. Send the shape; we make the die.",
    { sizes: ["Fits 8–12 oz", "Fits 12–16 oz", "Fits 16–22 oz"], materials: ["Kraft", "White"], extraSpecs: { Tooling: "Custom die-cut included on 1,000+" } });
  item("Corrugated Cup Carriers", "sleeves", "2-cup & 4-cup",
    "Fold-flat corrugated carriers that lock cups at the waist. Stack twenty behind the register; pop one open in two seconds.",
    { sizes: ["2-cup", "4-cup"], materials: ["Kraft corrugated"] });
  item("Handheld Carriers / Trays", "sleeves", "Molded pulp · 2 & 4 cup",
    "Molded-pulp trays with deep wells — the drive-thru standard. Carries four talls one-handed without a wobble.",
    { sizes: ["2-cup", "4-cup"], materials: ["Natural pulp"], extraSpecs: { Stacking: "Nests in towers of 50" } });
  item("Cup Holders", "sleeves", "Counter & cart",
    "Single-cup kraft holders with a wide grip collar — for markets, carts, and anywhere a hot cup needs a handle.",
    { sizes: ["Fits 8–16 oz"], materials: ["Kraft", "White"] });

  /* ============ 04 · Straws & Stir Sticks ============ */
  item("Paper Straws", "straws", "3-ply, no soggy collapse",
    "Three plies of food-grade paper wound tight — crisp through a full iced drink, not just the first five minutes. Stripes, solids, or full custom print.",
    { sizes: ["6 × 197 mm", "8 × 200 mm", "12 × 210 mm (boba)"], materials: ["3-ply paper"], extraSpecs: { "Soak test": "Stays crisp up to 60 min in cold drinks" } });
  item("PLA Straws", "straws", "Plant-based clear",
    "Corn-based PLA with the clarity and snap of plastic, none of the guilt. Certified commercially compostable; cold drinks only.",
    { sizes: ["6 × 197 mm", "8 × 200 mm", "12 × 210 mm (boba)"], materials: ["Clear PLA", "Tinted PLA"], extraSpecs: { Cert: "BPI compostable, cold use ≤40°C" } });
  item("Paper-Wrapped PP Straws", "straws", "Hygiene-wrapped",
    "Individually wrapped in printable paper sleeves — the wrap is the ad. Standard PP straw inside for maximum durability.",
    { sizes: ["6 × 210 mm", "8 × 210 mm"], materials: ["PP, paper-wrapped"] });
  item("Plastic-Wrapped PP Straws", "straws", "Film-sealed",
    "Film-wrapped PP straws for high-volume counters and vending. Tear-strip opens one-handed.",
    { sizes: ["6 × 210 mm", "8 × 210 mm"], materials: ["PP, film-wrapped"] });
  item("Bamboo-Fiber Straws", "straws", "Natural fiber",
    "Bamboo-fiber composite — rigid like plastic, commercially compostable, with a warm natural fleck customers notice.",
    { sizes: ["8 × 200 mm", "12 × 210 mm (boba)"], materials: ["Bamboo fiber"] });

  /* ============ 05 · To-Go Boxes & Entrée Containers ============ */
  item("Square-Bottom Lunch Boxes", "togo", "Stacks tight, travels flat",
    "The square-bottom workhorse: ships flat, folds in seconds, stacks without toppling. Greaseproof walls hold a saucy entrée with no second bag.",
    { sizes: ["26 oz", "34 oz", "45 oz"], materials: ["White board", "Kraft board"] });
  item("Octagonal Lunch Boxes", "togo", "8 corners, leak-resistant",
    "Eight folded corners lock the walls rigid — the box for heavy rice bowls and braises. Wide mouth for eating straight out of it.",
    { sizes: ["28 oz", "44 oz"], materials: ["Kraft board", "White board"] });
  item("Boat Boxes", "togo", "Open tray · №1–№3",
    "Open-top kraft boats for fries, dumplings, and festival food. Grease-resistant, photographs great in a customer's hand.",
    { sizes: ["№1 (12 oz)", "№2 (24 oz)", "№3 (40 oz)"], materials: ["Kraft", "White"] });
  item("Box-With-Lid", "togo", "Two-piece presentation",
    "Separate base and lid for the order that should feel like a gift. Lid prints edge-to-edge — the unboxing is the moment.",
    { sizes: ["Small", "Medium", "Large"], materials: ["Kraft", "White", "Black"] });
  item("All-in-One Boxes", "togo", "Hinged, one piece",
    "One-piece hinged clamshell, base and lid attached — nothing to mismatch, nothing to lose. Vent slots keep fried food crisp.",
    { sizes: ["Small", "Medium", "Large"], materials: ["Kraft board", "Bagasse"] });
  item("Burger Boxes", "togo", "Clamshell · holds the stack",
    "A tall-hinged clamshell that closes over a double stack without guillotining it. Vented roof so the bun never steams soggy.",
    { sizes: ['4.5" single', '5" double'], materials: ["Kraft board", "Bagasse"] });
  item("Hot-Dog Boxes", "togo", "Tray with walls",
    "Long tray with high walls — dogs, brats, and loaded subs stay dressed in transit. One-color print reads loud at a stand.",
    { sizes: ['7"', '9"'], materials: ["Kraft", "White"] });
  item("French-Fry Boxes", "togo", "Open scoop",
    "The open-mouth scoop built for speed: one motion to fill, wide mouth for sharing. Grease-resistant so the print stays sharp.",
    { sizes: ["Small", "Medium", "Large"], materials: ["White board", "Kraft board"] });
  item("Sushi Boxes", "togo", "Clear-lid tray",
    "Shallow kraft tray with an anti-fog clear lid — the fish gets seen, not steamed. Inserts available for roll counts.",
    { sizes: ["Small (6 pc)", "Medium (9 pc)", "Large (12 pc)"], materials: ["Kraft + PET lid"], extraSpecs: { Lid: "Anti-fog clear PET" } });
  item("Salad Bowls", "togo", "Wide kraft rounds",
    "Wide, shallow kraft bowls that let a salad spread out instead of compressing into a brick. Clear snap lid included.",
    { sizes: ["750 ml", "1,000 ml", "1,300 ml"], materials: ["Kraft, PE-lined", "Kraft, PLA-lined"] });
  item("Soup Buckets", "togo", "Leak-resistant rounds",
    "Round soup cups with rolled rims and a watertight seam — broth survives the delivery bag. Paper or PP lids.",
    { sizes: ["8 oz", "12 oz", "16 oz"], materials: ["White, PE-lined", "Kraft, PLA-lined"], extraSpecs: { Lid: "Paper or clear PP, sold matched" } });
  item("Noodle Buckets", "togo", "The takeout pail",
    "The fold-top noodle pail, straight out of a movie scene. Wire-free, microwave-safe board, and a full wrap of printable kraft.",
    { sizes: ["16 oz", "26 oz", "32 oz"], materials: ["Kraft, PE-lined", "White, PE-lined"] });
  item("Paper Food Covers / Lids", "togo", "Press-fit bowl tops",
    "Pressed paper lids sized to our salad bowls — one material family, no plastic dome, zero fog.",
    { sizes: ["Fits 750 ml", "Fits 1,000 ml", "Fits 1,300 ml"], materials: ["Kraft fiber", "White fiber"] });

  /* ============ 06 · Bakery & Dessert Boxes ============ */
  item("Pizza Boxes", "bakery", 'Corrugated · 10"–16"',
    "Corrugated kraft that holds heat and survives the drive. Grease-resistant base keeps the lid art clean — the pie arrives looking like the menu photo.",
    { sizes: ['10" × 10" × 2"', '12" × 12" × 2"', '14" × 14" × 2"', '16" × 16" × 2"'], materials: ["Kraft corrugated", "White corrugated"],
      extraSpecs: { Venting: "Steam vents standard; cut-outs optional" } });
  item("Toast / Bread Boxes", "bakery", "Window option",
    "Tall boxes sized for shokupan and country loaves, with an optional film window so the crumb does the selling.",
    { sizes: ["Half loaf", "Full loaf"], materials: ["Kraft", "White", "Window kraft"] });
  item("Cake Boxes", "bakery", '6"–10" with board',
    "Square cake boxes with matching gold or white base boards. Side-loading option so a finished cake slides in, not drops in.",
    { sizes: ['6"', '8"', '10"'], materials: ["White", "Kraft", "Window white"], extraSpecs: { Includes: "Matching cake board" } });
  item("Mousse Cake Boxes", "bakery", "Chill-case ready",
    "Crisp-walled boxes with clear lids for mousse and cheesecake slices — fridge-to-counter without condensation drama.",
    { sizes: ["Single slice", "2-slice", "4-slice"], materials: ["White + PET lid"], eco: "Recyclable white board; clear PET lid, recyclable №1" });
  item("Cupcake & Dessert Boxes", "bakery", "Insert-fitted",
    "Boxes with die-cut inserts that hold each cupcake by the collar — half a dozen arrives as half a dozen, not a collage.",
    { sizes: ["1-cavity", "2-cavity", "4-cavity", "6-cavity"], materials: ["White + insert", "Kraft + insert"] });
  item("Portable Egg-Tart Boxes", "bakery", "Built-in handle",
    "A carry handle folded straight from the lid — the egg-tart box that walks out the door like a tiny suitcase.",
    { sizes: ["2 tarts", "4 tarts", "6 tarts"], materials: ["Kraft", "White"] });
  item("Square Egg-Tart Boxes", "bakery", "Counter classic",
    "Square format with a friction lid for stacked tart counts. Prints beautifully in one bold color.",
    { sizes: ["2 tarts", "4 tarts", "6 tarts"], materials: ["Kraft", "White"] });
  item("Gift Boxes", "bakery", "Ribbon-ready",
    "Rigid-feel gift boxes with a matte wrap and ribbon slots. For the holiday box that carries your whole brand on one lid.",
    { sizes: ["Small", "Medium", "Large"], materials: ["Matte white", "Matte black", "Kraft"], extraSpecs: { Extras: "Ribbon slots, foil stamp ready" } });

  /* ============ 07 · Bags & Carryout ============ */
  item("Kraft Paper Bags", "bags", "The everyday carry",
    "Strong kraft with serrated tops, in three footprints from pastry to family order. High recycled-content kraft that takes one-color print like a stamp.",
    { sizes: ['5.5" × 3.25" × 8.25"', '10" × 7" × 12"', '13" × 7" × 13"'], materials: ["Brown kraft", "White kraft"],
      extraSpecs: { Capacity: "Up to 10 lb" } });
  item("Square-Bottom Kraft Bags", "bags", "Stands on its own",
    "Flat square bases that stand open for fast packing and don't tip the soup. The line cook's favorite bag.",
    { sizes: ['10" × 7" × 12"', '13" × 7" × 13"', '16" × 6" × 12"'], materials: ["Brown kraft", "White kraft"], extraSpecs: { Capacity: "Up to 15 lb" } });
  item("Window Pointed-Bottom Bags", "bags", "Show the goods",
    "Pointed-bottom pastry bags with a film window — croissants advertise themselves. Greaseproof lining keeps the window clear.",
    { sizes: ["Small", "Medium"], materials: ["Kraft + window", "White + window"] });
  item("Handle / Tote Bags", "bags", "Twisted & flat handle",
    "Twisted-handle totes that carry like luggage — rated 10–20 lb by size, full-front print area, handles that don't pull through.",
    { sizes: ['13" × 7" × 13"', '14" × 9.65" × 16"', '16" × 6" × 12"'], materials: ["Brown kraft, twisted handle", "White kraft, twisted handle", "Flat handle"],
      extraSpecs: { Capacity: "10–20 lb by size" } });
  item("Drink-Carrier Bags", "bags", "Cups ride upright",
    "Tall, narrow bags with internal gussets that hold one, two, or four cups dead upright. Delivery's best friend.",
    { sizes: ["1-cup", "2-cup", "4-cup"], materials: ["Kraft", "White"] });
  item("OPP Clear Plastic Bags", "bags", "Crystal retail",
    "Glass-clear OPP with self-seal strips — for cookies, merch, and anything that sells on sight.",
    { sizes: ['4" × 6"', '6" × 9"', '8" × 11"'], materials: ["Clear OPP, self-seal"] });
  item("Plastic Bags", "bags", "Heavy-duty carry",
    "Thick-gauge LDPE carriers with die-cut handles. The wet-weather backup that still shows the logo proud.",
    { sizes: ["Small", "Medium", "Large"], materials: ["White LDPE", "Clear LDPE"] });
  item("Greaseproof Paper Bags", "bags", "Fry-counter spec",
    "Open-top greaseproof bags for fries, churros, and fried chicken — oil stays off hands and print stays sharp.",
    { sizes: ["Small", "Medium", "Large"], materials: ["White greaseproof", "Kraft greaseproof"] });
  item("Insulated Delivery Bags", "bags", "Foil-lined, keeps it hot",
    "Foil-laminated liner inside printable kraft — holds temperature for the last mile. Zip or fold-top closures.",
    { sizes: ["Small", "Medium", "Large"], materials: ["Kraft + foil liner"], extraSpecs: { Holds: "Hot ≥45 min in transit" } });

  /* ============ 08 · Wraps, Liners & Papers ============ */
  item("Greaseproof / Deli Paper", "wraps", "The basket liner",
    "Printed deli sheets that turn any basket into your brand. Chlorine-free greaseproof stock — burgers wrap, fries rest, art shows.",
    { sizes: ['10" × 10"', '12" × 12"', '14" × 14"'], materials: ["White greaseproof", "Kraft greaseproof"] });
  item("Food-Wrapping Paper", "wraps", "Counter roll & sheet",
    "All-purpose food wrap in sheets or rolls — sandwiches, shawarma, sticky pastries. Custom-printed in repeat pattern.",
    { sizes: ['12" × 12"', '14" × 14"', "Roll (15\" × 1,000')"], materials: ["White", "Kraft"] });
  item("Leak-Proof Paper", "wraps", "Sauce-rated",
    "Poly-free barrier paper rated for dressed and sauced items. Folds crisp, holds tight, recycles clean.",
    { sizes: ['12" × 12"', '14" × 14"'], materials: ["Barrier-coated white"] });
  item("Sealing / Lidding Film", "wraps", "Cup-sealer rolls",
    "Printable sealing film for 90 mm and 95 mm cups — the boba-shop standard. Peels in one pull, prints in full color.",
    { sizes: ["90 mm roll", "95 mm roll"], materials: ["PP film", "PET film"], extraSpecs: { Fits: "Standard cup sealers, ~3,000 seals/roll" } });
  item("Napkins & Paper Towels", "wraps", "1-ply & 2-ply",
    "Cocktail to dinner sizes in 1- or 2-ply, printed edge to edge. The cheapest square inch of branding on the table.",
    { sizes: ["Cocktail 5\"", "Lunch 6.5\"", "Dinner 8.5\""], materials: ["1-ply white", "2-ply white", "2-ply kraft"] });

  /* ============ 09 · Labels & Stickers ============ */
  item("Label Paper", "labels", "Sheets & rolls",
    "Blank or printed label stock in sheets and rolls — gloss, matte, kraft, or clear. Run them through your own printer or let us print the lot.",
    { sizes: ['Sheets (8.5" × 11")', "Rolls (2\" core)"], materials: ["Gloss", "Matte", "Kraft", "Clear"] });
  item("Receipt / Thermal Paper", "labels", "57 & 80 mm rolls",
    "BPA-free thermal rolls with your logo printed on the back — every receipt is a tiny flyer.",
    { sizes: ["57 × 40 mm", "80 × 80 mm"], materials: ["BPA-free thermal"], extraSpecs: { Print: "Back-of-roll logo printing" } });
  item("“Sealed for Freshness” Stickers", "labels", "Tamper-evident",
    "Round seals that tear on opening — delivery customers see untouched food, you see fewer disputes.",
    { sizes: ['1.5" circle', '2" circle'], materials: ["Gloss white", "Kraft", "Security slit"] });
  item("Lid Reminder Stickers", "labels", "Order-mark dots",
    "Color-coded dots for marking decaf, oat, extra-shot — baristas read the lid, not the ticket.",
    { sizes: ['0.75" dot', '1" dot'], materials: ["Matte white", "Fluorescent"] });
  item("Expiration-Date Stickers", "labels", "Write-on matte",
    "Matte write-on labels for prep dates and use-bys. Pen-friendly surface, freezer-grade adhesive.",
    { sizes: ['1" × 2"', '2" × 3"'], materials: ["Matte write-on, freezer adhesive"] });
  item("Custom Cup Stickers", "labels", "Die-cut your art",
    "Die-cut stickers that turn plain stock cups into branded ones — the small-batch way to test a look before a printed run.",
    { sizes: ['2" circle', '3" circle', "Custom die-cut"], materials: ["Gloss", "Matte", "Clear"] });

  /* ---- specials (Lineup “House Specials” use these names) ---- */
  item("Double-Wall Ripple", "drinkware", "10 oz · 12 oz · 16 oz · 22 oz · No sleeve needed",
    "Our house special: insulated hollow hot cup with a rippled grip. Up to four inks, Pantone-matched — and no sleeve line item ever again.",
    { sizes: ["10 oz", "12 oz", "16 oz", "22 oz"], materials: ["Hollow double-wall, rippled"] });
  item("PET Cold Cup", "drinkware", "Crystal clear · 12–24 oz",
    "Heavy-gauge PET, BPA-free and clear as glass — iced drinks look like the menu photo. Frosted on request; pairs with our 98 mm snap lids.",
    { sizes: ["12 oz", "16 oz", "20 oz", "24 oz"], materials: ["Clear PET", "Frosted PET"],
      eco: "Recyclable №1 (PET)", extraSpecs: { Plastic: "Heavy-gauge PET, BPA-free & non-toxic" } });
  item("Square-Bottom To-Go", "togo", "Lunch box · lid in",
    "Greaseproof square-bottom board box. Stacks tight, travels flat, holds the heat — the box the food truck runs on.",
    { sizes: ["26 oz", "34 oz", "45 oz"], materials: ["White board", "Kraft board"] });

  /* ---- build finished product objects ---- */
  const CATALOG = {};
  ITEMS.forEach(({ name, cat, tag, desc, o }) => {
    const c = CATS[cat];
    const sizes = o.sizes || ["Small", "Medium", "Large"];
    const quantities = o.quantities || c.quantities;
    const specs = [
      { name: "Sizes",      value: sizes.join(" · ") },
      { name: "Material",   value: (o.materials || []).join(", ") || c.material },
      { name: "Printing",   value: o.printNote || "Up to 4 colors, Pantone-matched" },
      { name: "Food safe",  value: "FDA contact-safe, food-grade low-migration inks" },
      { name: "Eco",        value: o.eco || c.eco },
      { name: "Turnaround", value: "Quoted with your order" },
      { name: "MOQ",        value: `${quantities[0]} units` },
    ];
    if (o.extraSpecs) Object.keys(o.extraSpecs).forEach((k) => specs.push({ name: k, value: o.extraSpecs[k] }));
    // The Special Craft finishes apply to paper cups (per the factory's
    // process line) — flag paper drinkware so its PDPs show the craft strip.
    const isPaperCup = cat === "drinkware" &&
      (name === "Custom Printed Cups" || !/\b(PET|PP|IML)\b/i.test((o.materials || []).join(" ")));
    CATALOG[name.toLowerCase()] = {
      name, tag, desc,
      craft: isPaperCup,
      sizes, quantities,
      materials: o.materials || ["Kraft", "White"],
      prints: PRINTS,
      photo: shots(name)[0],
      gallery: shots(name),
      specs: specs.slice(0, 10),
    };
  });

  window.WC_CATALOG_GET = function (name) {
    if (!name) return null;
    return CATALOG[String(name).trim().toLowerCase()] || null;
  };
})();
