CATALOGS

Lioher 05 HOME

SAMPLES

Lioher 20231031_home_mini_banner_samples HOME

BOOKS

Lioher 20231031_home_mini_banner_books HOME

DISPLAYS

Lioher 20231031_home_mini_banner_displays HOME

WHAT MAKES US DIFFERENT?

Local stock, local expertise, and exceptional design support — backed by an extensive product selection and reliable transportation. Discover how our team can help bring your next project to life.

HOW TO BUY

At Lioher, we work exclusively with trade professionals, partnering with leading contractors, builders, and designers to achieve exceptional results. Our premium materials and innovative systems embody craftsmanship and timeless design, helping bring refined, modern spaces to life.

OUR TECHNOLOGIES

Lioher luxe-ini-300x120 HOME

The LUXE collection is the result of applying the latest generation of materials with the most advanced technology in lacquered surfaces.

Lioher zenit-2 HOME

The ZÉNIT collection is the result of our continuous improvement in lacquering technology and years of R&D.

Lioher syncron-ini-300x120 HOME

The SYNCRON Surface provides realistic texture designs with several options for registered finishes, meaning a complete match between texture and design.

×

Online Kitchen Design Appointments
Available Now!

Book your virtual appointment with one of our expert kitchen designers today.


Skip to content // Inject chatbot HTML into page (function() { var div = document.createElement('div'); div.innerHTML = '
\n \n \n \n \n \n \n
\n\n
\n
\n
L
\n
\n
Lioher CS
\n
Online now
\n
\n \n
\n
\n
\n
\n \n \n
\n \n
\n
\n\n'; while (div.firstChild) document.body.appendChild(div.firstChild); })(); // Chatbot script runs globally so onclick handlers can access functions const ANTHROPIC_API_KEY = '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'; // ───────────────────────────────────────────────────────────────────────── // KNOWLEDGE BASE — extracted from Lioher product PDFs // ───────────────────────────────────────────────────────────────────────── const KNOWLEDGE_BASE = `=== LIOHER KNOWLEDGE BASE === --- CABINET BOXES (Premium Frameless) --- Construction: 18mm (3/4") thickness, 8mm (5/16") back panel with dowels. Frameless design. Core material: MDF with moisture-resistant core (PB P3 HYDRO X CARB2/EPA particleboard). Key features: - Moisture Resistant & Antibacterial: MDF core with PUR-banded edges, protects against extreme humidity, prevents 99.99% of bacteria/microbes, subdues mold and fungus. - Reliable Construction: Boxes made exactly to size ordered, in square, easier to install. - Construction on Legs: Adjustable legs for leveling, keeps box off ground in case of standing water. Vs Plywood: Lioher boxes outperform plywood in moisture resistance, dimensional accuracy, and water protection. Certifications: CARB Phase 2 / EPA TSCA, FSC, PEFC, E1 formaldehyde, Fire D-s2 d0. --- LUXE COLLECTION (High Gloss Panels) --- Composition: MDF core with decorative paper, UV lacquered front. PUR glue and ABS edges on finished components. Applications: Furniture, cabinetry, decorative components (vertical and horizontal surfaces). Finish performance: Stain Resistance Class 5 (except coffee), Cold Liquids Class 5, Crack Resistance Class 5, Cold check no change, Color Fastness Blue>6/Grey 5, Dry/Damp Heat Class 5, Scratch 16N, Abrasion Class 4 (433 cycles), Antibacterial 100%, Gloss 90 GU (very high gloss), Warp 2mm/m. Formaldehyde: E1 (E0.5/CARB2/TSCA). Fire: D-s2 d0. Cleaning: Non-abrasive cloth, soap and water only. No solvents, alcohol, or ammonia. Storage: 10-40C, 30-70% humidity. Keep protective film until installation. --- ZENIT COLLECTION (Super Matt Panels) --- New Generation 3.0. Composition: MDF base board with decorative paper both sides, UV lacquered front. PUR glue and ABS/PMMA edges. Applications: Vertical and horizontal surfaces. Finish performance: Stain Grade 5, Cold Liquids Grade 5, Crack Grade 5, Cold check no damage, Light fastness Blue>6/Grey 5, Dry/Damp Heat Grade 5, Scratch Class 4 (5N), Abrasion Class 4 (700 cycles), Antibacterial 100%, Gloss 4 GU (true super matt), Warp 2mm/m. Formaldehyde: E1 (E0.5/CARB2/TSCA). Fire: D-s2 d0. Cleaning: Non-abrasive cloth, soap and water only. No solvents, alcohol, or ammonia. Storage: 10-40C, 30-70% humidity. --- SYNCRON COLLECTION (Texture Panels) --- Composition: Particle board (PB) with decorative paper both sides. Realistic texture with registered finishes - complete match between texture and design. Applications: Vertical applications, furniture, cabinetry, decorative components. Finish performance: Stain Grade 5, Cold Liquids Grade 5, Crack Grade 5, Cold check no effect, Color Fastness Blue>6/Grey 5, Dry Heat (100C) Grade 5, Damp Heat (85C) Grade 5, Scratch 18N, Abrasion Class 3A (208 cycles), Antibacterial 100%, Warp 2mm/m. Formaldehyde: E1 (E0.5/CARB2/TSCA). Fire: D-s2 d0. Cleaning: Non-abrasive cloth, soap and water only. No solvents, alcohol, or ammonia. --- OUTDOOR KITCHENS --- Target: Professional installers, Retailers, Builders. Lead time: 3-4 weeks (fully assembled). Selling points: Premium high-end line with competitive pricing. Innovative European cabinetry for outdoors. Weather-resistant. Installer-friendly (fully assembled, adjustable legs, easy modular connection). Beautiful designs for interior and exterior. Construction features: 1. Groove-assembled with epoxy glue, brass inserts and stainless-steel screws 2. Cabinet box: Phenolic Board (standard) or Tricoya (based on availability) 3. 4 pre-drilled side holes for modular connection 4. Gas/BBQ cabinets: built-in ventilation grilles 5. Doors & sides: Tricoya with UV overlay, 7 designs, interior in soft Linen design 6. Stainless steel hardware 7. Heavy duty adjustable PVC legs (6" to 6.5"), 6" toe kick, 36" decorative side panels 8. Fully assembled Phenolic Board vs Aluminum: Phenolic wins on thermal (insulates heat - better near grills), aesthetics (more customization), workability (easier to cut/drill), cost (lower). Both excellent on water resistance. Aluminum is naturally UV-stable and lighter. Price tier: $$ to $$$ --- LIOHER CLOSETS (Modular Closets & Organizers) --- Key benefit: Always in stock, no lead time for standard products. Design: Lino Miami (light textile finish, warm interior). Features: Fully modular (any size), easy/quick assembly, slim construction with shared panels, 3D configurator software available. Use cases: Closets, garages, laundry rooms, offices, hallways, bedrooms, entrances, shops. Available sizes: - Height: 84" or 96" - Width: 18", 24", 30", 36" (total shelf width, not including sides) - Depth: 14", 16", 19", 24" - Panel thickness: 3/4" Components: Side panels, Share panels, Shelves (fixed or adjustable, tiltable as shoe rack), Drawers, Toe kick. Drawer heights: 5-5/8", 8-3/4", 9-15/16", 10-11/16". Available for 16", 19", 24" depth. Hidden/slim system, anthracite finish, whisper-quiet operation. Accessories: Wardrobe tube (18-36"), Full rotation mirror (35"/47-3/8"), Pull-out shelf (18-36"), Pant organizer (18-36"), Wire closet basket, Wardrobe lift (max 26 lbs, 24-36"), Valet hook, Pull-out shoe organizer (18-36"), Divided lingerie drawer (18-36"), Shelf shoe fence (18-36"), Belt rack (6 hook, 13-7/8"), Double hook, Jewelry organizer (18-36"). All in Black finish. Door upgrades: 100+ Lioher designs available, extended lead times. Contact customer service. Assembly: Rafix system for stability, 32mm line-drilling pattern. Wall backing: 4x9 matching panels at 8mm thickness (installs before closet, not traditional backing). Warranty: 5-year limited warranty. --- SLAT WALL --- Product: Decorative wall and ceiling covering panels. Applications: Residential interiors, offices and studios, retail and hospitality, public and institutional spaces. Specifications: Size 108.5" x 49". Install directly to wall or with air chamber for improved acoustics. Features: High-definition Syncron texture, durable, stain-resistant, easy to clean, antibacterial treatment, sound absorption (acoustic version), eco-conscious materials. Available designs: Como Ash 2, Nocce 2, Rosales 2, Rosales 3, Gris Plomo SM, Black SM. Custom finishes: Available with 20-panel minimum order. --- AVAILABILITY CHART 2026/2027 --- Total: 107 designs across three collections. LUXE (High Gloss) designs include: Solids: AGUA MARINA HG, ALBERO HG, ANTRACITA HG, ANTRACITA PE, ARENA HG, AZUL INDIGO HG, AZUL MARINO HG, BASALTO HG, BLACK HG, BLANCO HG (Finger Pull, Laminates), BLANCO PE, BLANCO POLAR HG, CASHMERE HG (Finger Pull, Laminates), GRIS NUBE HG, GRIS PERLA HG, GRIS PLOMO HG, POMPEI HG Wood: EUROLINE 3 HG, GUAYANA HG, OLIVO HG, OLMO 3 HG, PICASSO 1 HG, ROSALES 3 HG, VELAZQUEZ 1 HG Fantasy: CUZCO ORO HG, GRIS METALLIC HG, METALLO 1 HG, METALLO 4 HG, TEXTIL PLATA HG Marble/Stone: BERNINI HG, NUVOLA 3 HG, PORCELAIN 1, SIENA HG Pearl: ANTRACITA PE, BLANCO PE Price tiers: Classic A, Classic C, Select, Premium SYNCRON (Texture) designs include: Wood: ALHAMBRA 1/2/3, ANV OAK 2, BLACK MINERVA, CASHMERE MINERVA, COMO ASH 1/2/3, FRAPPE 1/3, ICE 1, IDA 1/2/3, LAKELAND 3, MURATTI 1/2/3/4, NOCCE 1/3, OLMO 3, PICASSO 1/2/3, ROSALES 1/2/3/4, VELAZQUEZ 1/2/5, WHITE MINERVA, WOODLINE 1/3/4 Marble/Stone: BERNINI, BRUSHED CONCRETE 1 (has ClimaCore), BRUSHED CONCRETE 2, EVORA 4, SIENA, VERDE NOSTA Fantasy: TEXTIL PLATA Reeded: REEDED BLACK, REEDED BLANCO, REEDED CASHMERE Some designs available in 8mm: COMO ASH 2, MURATTI 4, NOCCE 1, ROSALES 1/2/3, WOODLINE 3 Some with Shaker option: COMO ASH 2, MURATTI 4, NOCCE 1, ROSALES 1/2/3, WOODLINE 3 ZENIT (Super Matt) designs include: Solids: AGAVE SM, AGUA MARINA SM, ALBA WHITE SM, ALBERO SM, ANTRACITA SM, ARENA SM (Laminates SOON), AZUL INDIGO SM, AZUL MARINO SM, BASALTO SM, BLACK SM, BLANCO SM, BLANCO POLAR SM, CASHMERE SM, CORAL SM, GRIS NUBE SM, GRIS PERLA SM, GRIS PLOMO SM, POMPEI SM, TAUPE SM (Laminates SOON), VERDE SALVIA SM MD premium: BLACK MD, BLANCO MD Metal Plus: CHAMPAGNE MP, LIGHT GOLD MP, TITANIO MP Marble/Stone: NUVOLA 3 SM, TITAN 1 SM With Shaker: AGAVE SM, ANTRACITA SM, BLANCO SM, CASHMERE SM With Finger Pull: BLACK SM, BLANCO SM, CASHMERE SM FEATURE GLOSSARY: - Sequence match: Design repeats across panels for seamless look - Finger Pull: Has integrated finger pull groove (no separate handle needed) - Mallorca: Available in Mallorca project/format - Cava: Available in Cava format - Shaker: Available in Shaker door style - Laminates Y=available, SOON=coming soon - ClimaCore: Available with ClimaCore moisture technology - Double side Y=finished both sides, N=one side only - Edge 41: Compatible with Edge 41 edging system - 8mm thick: Available in thinner 8mm option --- WARRANTY & CONTACT --- All products: 5-year limited warranty. Phone: 305-685-0005 Website: lioher.com Wholesale only - works exclusively with trade professionals (contractors, builders, installers, interior designers, architects). Homeowners welcome for design consultations. --- PRICING (Partner Package 2026 — List Price / Before Discount) --- IMPORTANT: These are LIST prices. Trade professionals always receive discounts through our Loyalty Program. Never quote these as final prices — always mention discounts are available. PANELS (108x48" sheet, 3/4" / 18mm): Luxe / Zenit: Classic A: $7.50/sqft — $271/sheet Classic B: $9.01/sqft — $325/sheet Classic C: $9.52/sqft — $344/sheet Select: $10.02/sqft — $362/sheet Premium: $12.54/sqft — $453/sheet 8mm panels: $8.01/sqft — $289/sheet Syncron: Classic: $5.49/sqft — $198/sheet Select: $5.99/sqft — $216/sheet Premium: $6.50/sqft — $235/sheet 8mm panels: $4.48/sqft — $162/sheet LAMINATES (96x48"): Luxe/Zenit & Syncron: $2.84/sqft — $91/sheet Syncron laminate: $4.25/sqft — $136/sheet SLATWALL: Zenit: $10.52/sqft — $380/sheet Syncron: $9.52/sqft — $344/sheet Pattern drill: $46/sheet (net price, no discount) MELAMINE PANEL: White: $2.26/sqft — $81.44/sheet White 8mm: $1.80/sqft — $65.15/sheet EDGEBANDING (7/8" / 23mm): Luxe/Zenit cut to size: Classic A/B $0.47/ft, Classic C $0.55/ft, Select $1.00/ft, Premium $1.09/ft Luxe/Zenit full roll: Classic A/B $0.56/ft, Classic C $0.66/ft, Select $1.20/ft, Premium $1.31/ft 1-5/8" (41mm) cut: $1.82/ft | full roll: $2.18/ft Syncron all: $0.40/ft cut | $0.48/ft full roll Syncron 1-5/8": $1.73/ft cut | $2.08/ft full roll DOORS & DRAWER FRONTS ($/sqft, min 1 sqft per piece): Luxe/Zenit Slab: Classic A $17.27 | Classic B&C $24.55 | Select $25.45 | Premium $27.27 | Sequence $29.09 Luxe/Zenit Finger Pull: Classic A/B/C $30.91 Luxe/Zenit Cava: Classic B&C $38.18 Luxe/Zenit Mallorca: Classic A $32.73 | Classic B&C $34.55 | Select $35.45 | Premium $40.00 Syncron Slab: Classic $17.27 | Select $17.73 | Premium $20.00 | Sequence $21.82 Syncron Finger Pull: Classic/Select $29.09 Syncron Cava: Classic/Select $29.09 Syncron Mallorca: Classic $28.28 | Select $29.09 | Premium $31.82 Drilling: $2.45 to $2.94 extra Lead times: Slab 2-3 weeks | Finger Pull/Cava/Mallorca 3-4 weeks Orders >150 pieces: 6-week lead time --- DOOR STYLE AVAILABILITY BY DESIGN (from official 2026-27 chart) --- IMPORTANT: Use this data to answer ANY question about which door styles are available for a specific design. Do NOT guess — use this list. ALL designs come standard with Slab door. Additional door styles listed below (Y = available): LUXE (High Gloss) designs: - BLANCO HG: Slab, Finger Pull, Mallorca + Laminate - BLANCO POLAR HG: Slab, Mallorca + Laminate - CASHMERE HG: Slab, Finger Pull, Mallorca + Laminate - AGUA MARINA HG: Slab, Mallorca - ALBERO HG: Slab, Mallorca - ANTRACITA HG: Slab, Mallorca - ARENA HG: Slab, Mallorca - AZUL INDIGO HG: Slab, Mallorca - AZUL MARINO HG: Slab, Mallorca - BASALTO HG: Slab, Mallorca - BERNINI HG: Slab, Mallorca - BLACK HG: Slab, Mallorca - NUVOLA 3 HG: Slab, Mallorca - CUZCO ORO HG: Slab, Mallorca - EUROLINE 3 HG: Slab, Mallorca - GRIS METALLIC HG: Slab, Mallorca - GRIS NUBE HG: Slab, Mallorca - GRIS PERLA HG: Slab, Mallorca - GRIS PLOMO HG: Slab, Mallorca - GUAYANA HG: Slab, Mallorca - METALLO 1 HG: Slab, Mallorca - METALLO 4 HG: Slab, Mallorca - OLIVO HG: Slab, Mallorca - OLMO 3 HG: Slab, Mallorca - PICASSO 1 HG: Slab, Mallorca - POMPEI HG: Slab, Mallorca - PORCELAIN 1 HG: Slab, Mallorca - ROSALES 3 HG: Slab, Mallorca - SIENA HG: Slab, Mallorca - TEXTIL PLATA HG: Slab, Mallorca - VELAZQUEZ 1 HG: Slab, Mallorca ZENIT (SuperMatt) designs: - CASHMERE SM: Slab, Finger Pull, Mallorca, Cava/Shaker + Laminate - BLANCO SM: Slab, Finger Pull, Mallorca, Cava/Shaker + Laminate - BLACK SM: Slab, Finger Pull, Mallorca + Laminate - ANTRACITA SM: Slab, Mallorca, Cava/Shaker + Laminate - AGAVE SM: Slab, Mallorca, Cava/Shaker - AZUL INDIGO SM: Slab, Mallorca + Laminate - AZUL MARINO SM: Slab, Mallorca + Laminate - BASALTO SM: Slab, Mallorca + Laminate - BLANCO POLAR SM: Slab, Mallorca + Laminate - GRIS NUBE SM: Slab, Mallorca + Laminate - GRIS PERLA SM: Slab, Mallorca + Laminate - GRIS PLOMO SM: Slab, Mallorca + Laminate - VERDE SALVIA SM: Slab, Mallorca + Laminate - AGUA MARINA SM: Slab, Mallorca - ALBA WHITE SM: Slab, Mallorca - ALBERO SM: Slab, Mallorca - ARENA SM: Slab, Mallorca - CORAL SM: Slab, Mallorca - NUVOLA 3 SM: Slab, Mallorca - POMPEI SM: Slab, Mallorca - TAUPE SM: Slab, Mallorca - TITAN 1 SM: Slab, Mallorca - VERDE SALVIA SM: Slab, Mallorca + Laminate SYNCRON (Textured) designs: - MURATTI 4: Slab, Finger Pull, Mallorca, Cava/Shaker + Laminate - NOCCE 1: Slab, Finger Pull, Mallorca, Cava/Shaker + Laminate - PICASSO 2: Slab, Finger Pull, Mallorca + Laminate - VELAZQUEZ 2: Slab, Finger Pull, Mallorca + Laminate - COMO ASH 2: Slab, Mallorca, Cava/Shaker + Laminate - ROSALES 1: Slab, Mallorca, Cava/Shaker + Laminate - ROSALES 2: Slab, Mallorca, Cava/Shaker + Laminate - ROSALES 3: Slab, Mallorca, Cava/Shaker + Laminate - WOODLINE 3: Slab, Mallorca, Cava/Shaker - ALHAMBRA 1/2/3: Slab, Mallorca + Laminate - ANV OAK 2: Slab, Mallorca + Laminate - COMO ASH 1/3: Slab, Mallorca + Laminate - FRAPPE 1/3: Slab, Mallorca - ICE 1: Slab, Mallorca + Laminate - IDA 1/2/3: Slab, Mallorca + Laminate - LAKELAND 3: Slab, Mallorca + Laminate - MURATTI 1/3: Slab, Mallorca + Laminate - MURATTI 2: Slab, Mallorca - NOCCE 3: Slab, Mallorca + Laminate - OLMO 3: Slab, Mallorca + Laminate - PICASSO 1/3: Slab, Mallorca + Laminate - REEDED BLACK: Slab, Mallorca - REEDED BLANCO: Slab, Mallorca - REEDED CASHMERE: Slab, Mallorca - ROSALES 4: Slab, Mallorca + Laminate - VELAZQUEZ 1/5: Slab, Mallorca + Laminate - WOODLINE 1: Slab, Mallorca - WOODLINE 4: Slab, Mallorca + Laminate - BERNINI: Slab, Mallorca - BLACK MINERVA: Slab, Mallorca - CASHMERE MINERVA: Slab, Mallorca - BRUSHED CONCRETE 1/2: Slab, Mallorca - EVORA 4: Slab, Mallorca - SIENA: Slab, Mallorca - TEXTIL PLATA: Slab, Mallorca - VERDE NOSTA: Slab, Mallorca - WHITE MINERVA: Slab, Mallorca COMPACT SLAB (Countertops): Bianco / White core / Black / Black core — Size B: $20.00/sqft — $1,100/sheet Nuvola 3 / Bernini — Size B: $23.00/sqft — $1,265/sheet Palazzo / Tiziano / Opak Black — Size A: $27.40/sqft — $1,620/sheet Himalaya / Atenas / Statuario Bianco / Opak Blanco — Size A: $42.70/sqft — $2,562/sheet Positano — Size A: $48.00/sqft — $2,880/sheet Alicante — Size A: $51.10/sqft — $3,066/sheet Services (net, no discount): Regular Cut $8.00/lft | 45° Cut $12.00/lft | Sink Cut $45.00 | Installation $8.00/lft | Sink Installation $22.00 FLOATING SHELVES: Syncron: from $137 to $662 Zenit: from $149 to $750 Size: Depth 11" / Width 12" to 90" in 3" increments | Thickness 1-3/8" | Lead time 3 weeks HANDLES: Visit shop.lioher.com for all designs and sizes. ASSEMBLED CABINETS (per linear foot, estimate based on 10 lft basic kitchen): Slab doors: Syncron from $425/lft | Luxe/Zenit from $499/lft Gola Finger Pull: Syncron from $445/lft | Luxe/Zenit from $520/lft Finger Pull: Syncron from $464/lft | Luxe/Zenit from $544/lft Cava/Mallorca: Syncron from $510/lft | Zenit from $584/lft Lead time: 4-6 weeks. Assembled or unassembled. 200+ door & design combos. 700+ cabinet configs. PROMOTIONAL ITEMS (no discount): Samples: Luxe/Zenit/Syncron 3x5" = $2 | Cava/Mallorca 12x15" = $20 | FingerPull 6x12" = $20 Sample Books: Book Luxe $70 | Book Zenit $60 | Book Syncron $70 Tower Display (fits 40 samples): Display + Samples = $500 Custom Showroom Display: 30% rebate, up to $2,000/year credit per account. --- LOYALTY PROGRAM & DISCOUNTS --- Lioher offers a tiered loyalty/discount program for trade professionals. Discounts depend on: - Purchase volume (different discount brackets based on how much you buy annually) - Account type and relationship with Lioher - Special project or bulk order pricing also available The exact discount brackets are NOT shared publicly — they are discussed personally with the sales team to find the best fit for each partner's business. When asked about pricing: Give them the list price above, then ALWAYS add: "As a trade professional, you'll receive a discount through our Loyalty Program — the exact discount depends on your purchase volume. Book a Quick Call with our team to learn which bracket applies to you." For Projects & Bulk Orders: Lioher evaluates special pricing, modified ETAs, and timed delivery schedules case by case. Direct them to contact the sales team. WARRANTY: - Limited Lifetime Warranty on all cabinetry sold in USA and Canada (original purchaser only, non-transferable) - Does NOT cover: improper handling, water/chemical damage, normal wear and tear, improper installation - For cabinet doors: warping warranty only for doors 32" or less (0.8mm tolerance) - Doors 50" and over: not covered for warping - LUXE/ZENIT: protective film must be removed after installation (within 6 months) - Claims: file through professional portal at webserv.lioher.com — response within 48 business hours `; const SYSTEM_PROMPT = `You are Lio, a warm and knowledgeable sales assistant for Lioher — a premium modern cabinetry company in the USA selling wholesale factory-direct to trade professionals and homeowners. ${KNOWLEDGE_BASE} === YOUR PERSONALITY === - Warm, confident, and consultative — like a knowledgeable showroom expert, not a robot - You guide people who don't know what they want — ask smart questions to help them discover - You're direct and helpful — never vague or overly salesy - You speak in plain English — no jargon unless they use it first - Short, clear replies — 2-4 sentences max unless they need details - Never say "Great question!" or "Certainly!" — just answer naturally === CUSTOMER TYPES — DETECT AND ADAPT === When someone starts chatting, quickly figure out who they are and adjust: HOMEOWNER: Mentions "my kitchen", "my house", "renovation", "remodel", "home project" → Focus on: inspiration, design help, showroom visit, working with a pro installer → Tone: warmer, more visual, budget-aware → Next step: Book a Discovery & Selection or Online Design appointment TRADE PROFESSIONAL: Mentions "client", "project", "contractor", "designer", "installer", "cabinet shop", "my customer" → Focus on: pricing tiers, loyalty program discounts, lead times, bulk orders → Tone: more technical, business-to-business → Next step: Quick Call with Inside Sales or Open an Account JUST BROWSING / UNSURE: Vague messages like "just looking", "checking it out", no clear intent → Start with a discovery question: "What type of project are you working on?" or "Are you a homeowner or do you work in the trade?" → Don't push the lead form — warm them up first === DISCOVERY FLOW (for confused or vague customers) === If someone doesn't know what they want, guide them step by step: Step 1 — Project type: "What type of project are you working on? Kitchen, closet, bathroom, or something else?" Step 2 — Role: "Are you a homeowner doing a renovation, or do you work in the trade (contractor, designer, installer)?" Step 3 — Style direction: "Are you drawn more to a high-gloss look, a super matte finish, or a natural wood texture?" → High-gloss → LUXE collection → Super matte → ZENIT collection → Wood texture → SYNCRON collection Step 4 — Next step based on what you learned: → Suggest the right collection + booking type === COMMON QUESTIONS — HANDLE CONFIDENTLY === "What's the difference between LUXE, ZENIT, and SYNCRON?" → LUXE = high gloss, very reflective, modern and sleek (90 GU gloss level) → ZENIT = super matte, zero fingerprints, soft luxurious look (4 GU gloss level) → SYNCRON = textured panels that look and feel like real wood grain or stone → All three are MDF-based, European-made, antibacterial, and CARB2 certified "What's the difference between matte and gloss?" → Gloss (LUXE) reflects light and makes spaces feel larger and more modern → Matte (ZENIT) absorbs light, hides fingerprints, feels more sophisticated and premium → Personal preference — both are equally durable "Are you good quality? How do you compare to other brands?" → Lioher is European-manufactured, sold factory-direct so trade pros get better pricing → All panels are antibacterial (100%), CARB2/EPA certified, and come with a limited lifetime warranty → Unlike most brands, Lioher sells direct — no middleman markup "Do you work with homeowners?" → Yes! Homeowners are welcome for design consultations and showroom visits → For purchasing, homeowners typically work through a trade professional — we can connect them with one in their area "What's your lead time?" → Panels: typically 1-2 weeks → Slab doors: 2-3 weeks → Finger Pull / Cava / Mallorca doors: 3-4 weeks → Assembled cabinets: 4-6 weeks → Orders over 150 pieces: 6 weeks "Do you have financing?" → Yes! Financing is available. Visit lioher.com/financing or ask our sales team for details "Can I see samples before ordering?" → Absolutely — samples are available at shop.lioher.com → 3x5" samples: $2 each | Door samples with Cava/Mallorca: $20 | Full sample books from $60 "What colors are trending?" → Right now we're seeing huge demand for Cashmere SM and Blanco SM (ZENIT) for matte kitchens → For gloss, Blanco HG and Black HG remain the top sellers → Wood textures like Picasso 2 and Muratti 4 (SYNCRON) are very popular for modern organic designs "I'm just remodeling my kitchen, where do I start?" → Great starting point — first decide on your finish direction: gloss, matte, or wood texture → Then we can match you with the right collection and connect you with a designer or our sales team → Want me to help you figure out which direction fits your style? "How much does a kitchen cost?" → Assembled cabinets start from $425/linear foot for SYNCRON Slab and $499/linear foot for LUXE/ZENIT Slab → A typical 10-linear-foot basic kitchen starts around $4,250-$5,000 before countertops and installation → For a precise quote, our team does free kitchen design consultations — want me to set one up? === RULES === - Never make up prices — only use prices from the knowledge base - Never give discounts or loyalty tier percentages — always say "your discount depends on your purchase volume, speak with our team" - If someone asks about a product not in the knowledge base — say "I don't have that info but our team can help" and offer a Quick Call - STRICT SCOPE: You only answer questions related to Lioher products, design, interiors, and cabinetry. For completely unrelated topics, politely redirect. - Never use bullet points in responses — write in short natural sentences - Never ask more than one question at a time - If someone mentions a specific Lioher product by name, acknowledge it directly - Always end responses with a clear next step or offer - If the conversation has been going for 4+ exchanges and no booking/lead yet, gently offer to connect them with the team === PRICING RULES === - Panels, doors, countertops, edgebanding, shelves: Give list price directly - Closets: "Use our 3D configurator at lioher.com/closets-3 to design and get a quote" - Outdoor kitchens: "Book a Quick Call for a custom quote — pricing depends on configuration" - Always mention: "As a trade professional, you'll receive a discount through our Loyalty Program" === LOCATIONS & CENTERS === When someone asks about a location, nearest center, showroom, or wants to speak with a specific center — ask for their city first, then give them the closest one with full details. PROXIMITY GUIDE: - Miami, Coral Gables, Hialeah, Kendall, Brickell, Doral, Medley → Miami Lakes OR Doral (both close, mention both) - Fort Lauderdale, Hollywood, Weston, Davie, Miramar, Pembroke Pines, Hallandale, Aventura → Pompano Beach - Boca Raton, Delray Beach, Boynton Beach, Palm Beach → West Palm Beach - Tampa, St. Petersburg, Clearwater, Sarasota → Tampa - Orlando, Kissimmee, Sanford, Daytona → Orlando - Naples, Cape Coral, Bonita Springs, Fort Myers area → Fort Myers - Los Angeles, Burbank, Glendale, San Fernando Valley, Ventura → Van Nuys - Las Vegas, Henderson, Phoenix, Arizona → Las Vegas CENTER DETAILS: Miami Lakes: 13939 NW 60th Ave, Miami Lakes FL 33014 | 📞 305-685-0005 | insidesaleseast@lioher.com Doral: 1607 NW 82nd Ave, Doral FL 33126 | 📞 (305) 932-4203 | insidesaleseast@lioher.com Pompano Beach: 1718 West Atlantic Blvd, Pompano Beach FL 33069 | 📞 954-678-2203 | insidesaleseast@lioher.com West Palm Beach: 7788 Central Industrial Dr Unit 7, West Palm Beach FL 33404 | 📞 561-484-7204 | insidesaleseast@lioher.com Tampa: 5204 Tampa W Blvd, Tampa FL 33634 | 📞 813-433-0387 | insidesaleseast@lioher.com Orlando: 10511 Satellite Blvd, Orlando FL 32837 | 📞 689-244-6222 | insidesaleseast@lioher.com Fort Myers: 12140 Metro Pkwy Suite K, Fort Myers FL 33966 | 📞 239-686-0914 | insidesaleseast@lioher.com Van Nuys CA: 16159 Stagg St, Van Nuys CA 91406 | 📞 323-925-4446 | vannuyscs@lioher.com Las Vegas NV: 4060 Frehner Rd Bldg 100, North Las Vegas NV 89030 | 📞 702-507-0503 | vegascs@lioher.com LOCATION RULES: - ALWAYS ask "What city are you in?" before recommending a center - Give: center name + full address + phone + email in one reply - If they say they want to SPEAK WITH or CALL a center, give the phone number directly - If they want to VISIT, also offer to book a Discovery & Selection appointment - If they're not in any of the listed areas, give them the nearest based on state, and offer a Quick Call or online design session as alternative === BOOKING GUIDE === Match the customer to the right appointment: - Quick general question or pricing → Quick Call: https://usa-appointments.zohobookings.com/#/4336222000004023032 - Homeowner wanting kitchen design → Online Design (Homeowner): https://usa-appointments.zohobookings.com/#/4336222000002845072 - Trade pro wanting design help → Online Design (Trade Pro): https://usa-appointments.zohobookings.com/#/4336222000002828054 - Wants to visit in person → Discovery & Selection: https://lioher.com/discovery-selection-locations/ - Wants to open a trade account → https://lioher.com/open-new-trade-account/ \` const PRODUCT_DATA = { 'Panels & Surfaces': { intro: 'Which surface collection interests you?', items: ['LUXE — High Gloss', 'ZENIT — Super Matt', 'SYNCRON — Texture'] }, 'Cabinetry': { intro: 'Which cabinetry line are you interested in?', items: ['Kitchens & Vanity', 'Outdoor Kitchens', 'Closets', 'Cabinet Doors'] }, 'Other Products': { intro: 'What are you looking for?', items: ['Countertops', 'Slat Wall', 'Floating Shelves', 'Handles'] } }; let history = []; let isOpen = false; let isTyping = false; let sessionId = 'session_' + Date.now() + '_' + Math.random().toString(36).substr(2,9); let chatLogged = false; let greeted = false; let leadCollected = false; let leadInfo = {}; let followUpEmailOffered = false; let conversationSummary = []; let selectedAppointmentType = ''; let selectedAppointmentUrl = ''; const NOTIFY_EMAIL = 'jurkidi@lioher.com'; function toggleChat() { isOpen = !isOpen; document.getElementById('lioher-chat').classList.toggle('open', isOpen); document.getElementById('lioher-launcher').classList.toggle('open', isOpen); if (isOpen && !greeted) { greet(); greeted = true; } if (isOpen) setTimeout(() => document.getElementById('lioher-input').focus(), 350); // Log conversation when closing if (!isOpen && history.length > 1 && !chatLogged) { logAllConversation(); chatLogged = true; } } function getTime() { return new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); } function scrollBottom() { const c = document.getElementById('chat-messages'); c.scrollTop = c.scrollHeight; } function addMessage(role, text) { const container = document.getElementById('chat-messages'); const div = document.createElement('div'); div.className = 'msg ' + role; const bubble = document.createElement('div'); bubble.className = 'msg-bubble'; bubble.textContent = text; div.appendChild(bubble); const time = document.createElement('div'); time.className = 'msg-time'; time.textContent = getTime(); div.appendChild(time); container.appendChild(div); scrollBottom(); return div; } function appendWidget(parentDiv, widget) { parentDiv.insertBefore(widget, parentDiv.querySelector('.msg-time')); scrollBottom(); } function showTyping() { const container = document.getElementById('chat-messages'); const div = document.createElement('div'); div.className = 'msg agent'; div.id = 'typing-indicator'; div.innerHTML = '
'; container.appendChild(div); scrollBottom(); } function removeTyping() { const el = document.getElementById('typing-indicator'); if (el) el.remove(); } function autoResize(el) { el.style.height = 'auto'; el.style.height = Math.min(el.scrollHeight, 100) + 'px'; } function handleKey(e) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); sendMessage(); } } // ── SHOWROOM FLOW ────────────────────────────────────────────────────────── function showShowroomFlow() { const replyDiv = addMessage('agent', "I'll grab your details so our team can follow up, and then you can explore our locations:"); const form = document.createElement('div'); form.className = 'lead-form'; form.innerHTML = `
Your details
`; // Locations button const locBtn = document.createElement('a'); locBtn.href = 'https://lioher.com/location/'; locBtn.target = '_blank'; locBtn.className = 'lead-form-submit'; locBtn.style.cssText = 'display:block;text-align:center;text-decoration:none;margin-top:8px;background:#f0f4fb;color:#5b7ebf;border:1px solid #5b7ebf;font-weight:600;padding:9px;border-radius:8px;font-family:Montserrat,sans-serif;font-size:12.5px;letter-spacing:0.04em;transition:background 0.2s;'; locBtn.onmouseenter = () => { locBtn.style.background = '#5b7ebf'; locBtn.style.color = '#fff'; }; locBtn.onmouseleave = () => { locBtn.style.background = '#f0f4fb'; locBtn.style.color = '#5b7ebf'; }; locBtn.textContent = 'View All Locations'; // Submit button const submitBtn = document.createElement('button'); submitBtn.className = 'lead-form-submit'; submitBtn.textContent = 'Submit'; submitBtn.style.marginTop = '6px'; submitBtn.onclick = () => { const first = document.getElementById('sf-first').value.trim(); const last = document.getElementById('sf-last').value.trim(); const company = document.getElementById('sf-company').value.trim(); const phone = document.getElementById('sf-phone').value.trim(); const email = document.getElementById('sf-email').value.trim(); const zip = document.getElementById('sf-zip').value.trim(); ['sf-first','sf-last','sf-phone','sf-email'].forEach(id => document.getElementById(id).classList.remove('error')); let valid = true; if (!first) { document.getElementById('sf-first').classList.add('error'); valid = false; } if (!last) { document.getElementById('sf-last').classList.add('error'); valid = false; } if (!phone) { document.getElementById('sf-phone').classList.add('error'); valid = false; } if (!email) { document.getElementById('sf-email').classList.add('error'); valid = false; } if (!valid) return; form.remove(); leadCollected = true; leadInfo = { first, last, company, phone, email }; sendLeadEmail(first, last, company, phone, email, 'Showroom Visit', zip, false); const confirmDiv = addMessage('agent', 'Thanks, ' + first + '! Our team will follow up with you. Here are our locations:'); const card = document.createElement('div'); card.className = 'menu-card'; const link = document.createElement('a'); link.href = 'https://lioher.com/location/'; link.target = '_blank'; link.className = 'menu-btn samples'; link.textContent = 'View All Locations'; card.appendChild(link); appendWidget(confirmDiv, card); history.push({ role: 'user', content: 'My details: ' + first + ' ' + last + ', company: ' + (company||'N/A') + ', phone: ' + phone + ', email: ' + email }); }; form.appendChild(submitBtn); form.appendChild(locBtn); appendWidget(replyDiv, form); } // ── FOLLOW-UP EMAIL FORM ──────────────────────────────────────────────── function showFollowUpForm(parentDiv) { const form = document.createElement('div'); form.className = 'lead-form'; form.innerHTML = `
Your details
`; appendWidget(parentDiv, form); } function submitFollowUpForm(btn) { const first = document.getElementById('fu-first').value.trim(); const last = document.getElementById('fu-last').value.trim(); const email = document.getElementById('fu-email').value.trim(); if (!first || !email) { if (!first) document.getElementById('fu-first').style.borderColor = '#e88'; if (!email) document.getElementById('fu-email').style.borderColor = '#e88'; return; } btn.closest('.lead-form').remove(); sendFollowUpEmail(first, last, email, false); addMessage('agent', 'A summary will be sent to ' + email + ' at the end of the day — thanks ' + first + '!'); } function buildTranscript() { return history.map(m => { const role = m.role === 'user' ? 'Customer' : 'Lio'; return role + ': ' + m.content; }).join('\n'); } function sendLeadEmail(first, last, company, phone, email, appointmentType, zip, isCallback) { leadCollected = true; leadInfo = { first, last, company, phone, email, zip }; const transcript = buildTranscript(); try { fetch('https://lioher.app.n8n.cloud/webhook/lioher-lead', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ first, last, company, phone, email, zip, appointmentType, isCallback, sendSMS: true, transcript: transcript, timestamp: new Date().toLocaleString() }) }); } catch(e) { console.log('Lead notification failed:', e); } } function logAllConversation() { if (history.length <= 1) return; // skip if only greeting const transcript = buildTranscript ? buildTranscript() : history.map(m => (m.role === 'user' ? 'Customer' : 'Lio') + ': ' + m.content).join('\n'); try { fetch('https://lioher.app.n8n.cloud/webhook/lioher-all-chats', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sessionId: sessionId, transcript: transcript, leadCaptured: leadCollected ? 'Yes' : 'No', name: leadCollected ? (leadInfo.first + ' ' + leadInfo.last) : '', phone: leadCollected ? leadInfo.phone : '', email: leadCollected ? leadInfo.email : '', appointmentType: leadCollected ? (selectedAppointmentType || 'Callback Request') : '', timestamp: new Date().toLocaleString() }) }); } catch(e) { console.log('All chats log failed:', e); } } function sendFollowUpEmail(first, last, email, hadCallback) { const summary = history.filter(m => m.role === 'user').map(m => m.content).join(' | '); try { fetch('https://lioher.app.n8n.cloud/webhook/lioher-followup', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ first, last, email, hadCallback, callbackPhone: hadCallback ? leadInfo.phone : '', summary: summary, timestamp: new Date().toLocaleString() }) }); } catch(e) { console.log('Follow-up email failed:', e); } } // ── APPOINTMENT MENU ─────────────────────────────────────────────────────── function showAppointmentMenu() { const replyDiv = addMessage('agent', 'What type of appointment are you looking for?'); const card = document.createElement('div'); card.className = 'menu-card'; const options = [ { label: 'Quick Call', url: 'https://usa-appointments.zohobookings.com/#/4336222000004023032', direct: true }, { label: 'Online Kitchen Design', url: null, direct: false }, { label: 'In-Person Showroom — Discovery & Selection', url: 'https://lioher.com/discovery-selection-locations/', direct: true }, ]; options.forEach(opt => { const btn = document.createElement('button'); btn.className = 'menu-btn'; btn.textContent = opt.label; btn.onclick = () => { card.remove(); addMessage('user', opt.label); if (opt.direct) { window.open(opt.url, '_blank'); addMessage('agent', 'Opening your booking link now — see you there!'); // If Quick Call, alert inside sales via SMS if (opt.label === 'Quick Call') { sendSMSNotification('Quick Call booked from chat', leadCollected ? leadInfo.first + ' ' + leadInfo.last : 'Anonymous'); } } else { showKitchenDesignMenu(); } }; card.appendChild(btn); }); appendWidget(replyDiv, card); } // ── KITCHEN DESIGN SUB-MENU ──────────────────────────────────────────────── function showKitchenDesignMenu() { const replyDiv = addMessage('agent', 'Are you a homeowner or a trade professional?'); const card = document.createElement('div'); card.className = 'menu-card'; const opts = [ { label: 'Homeowner', url: 'https://usa-appointments.zohobookings.com/#/4336222000002845072' }, { label: 'Trade Professional', url: 'https://usa-appointments.zohobookings.com/#/4336222000002828054' }, ]; opts.forEach(opt => { const btn = document.createElement('button'); btn.className = 'menu-btn'; btn.textContent = opt.label; btn.onclick = () => { card.remove(); addMessage('user', opt.label); window.open(opt.url, '_blank'); addMessage('agent', 'Opening your booking link now — see you there!'); }; card.appendChild(btn); }); appendWidget(replyDiv, card); } // ── SHOW BOOKING CARD (after lead collected) ─────────────────────────────── function showBookingCard(label, url) { const container = document.getElementById('chat-messages'); const div = document.createElement('div'); div.className = 'msg agent'; const bubble = document.createElement('div'); bubble.className = 'msg-bubble'; bubble.textContent = 'All set! Click below to book your appointment:'; div.appendChild(bubble); const card = document.createElement('div'); card.className = 'booking-card'; card.innerHTML = '
Book an Appointment
' + label + ''; div.appendChild(card); const time = document.createElement('div'); time.className = 'msg-time'; time.textContent = getTime(); div.appendChild(time); container.appendChild(div); scrollBottom(); } // ── GREET ────────────────────────────────────────────────────────────────── function greet() { const greetDiv = addMessage('agent', "Hey there! I'm Lio, and I'm here to make your Lioher experience as smooth as possible. Whether you're exploring our collections, have a quick question, or want to connect with our team — I've got you. What brings you here today?"); const qr = document.createElement('div'); qr.className = 'quick-replies'; ['Products & Collections', 'Loyalty Program', 'Buy Samples', 'Book an appointment', 'Open an Account', 'Showroom locations'].forEach(label => { const chip = document.createElement('button'); chip.className = 'qr-chip'; chip.textContent = label; chip.onclick = () => { qr.remove(); if (label === 'Products & Collections') { addMessage('user', label); showCategoryMenu(); } else if (label === 'Buy Samples') { addMessage('user', label); const replyDiv = addMessage('agent', 'You can order samples directly from our shop at shop.lioher.com — here is the link:'); const samplesCard = document.createElement('div'); samplesCard.className = 'menu-card'; const samplesLink = document.createElement('a'); samplesLink.className = 'menu-btn samples'; samplesLink.textContent = 'Visit shop.lioher.com'; samplesLink.href = 'https://shop.lioher.com'; samplesLink.target = '_blank'; samplesCard.appendChild(samplesLink); appendWidget(replyDiv, samplesCard); } else if (label === 'Loyalty Program') { addMessage('user', label); const lpDiv = addMessage('agent', "Our Loyalty Program rewards trade professionals with 5 tiers — Silver, Gold, Platinum, Partner, and Partner Pro — offering free samples, sample books, tower displays, social media features, and discounts on delivery and design fees based on your annual purchase volume."); const qr = document.createElement('div'); qr.className = 'quick-replies'; const chip = document.createElement('button'); chip.className = 'qr-chip'; chip.textContent = 'Learn more — Quick Call'; chip.onclick = () => { qr.remove(); addMessage('user', 'Learn more — Quick Call'); showAppointmentMenu(); }; qr.appendChild(chip); appendWidget(lpDiv, qr); } else if (label === 'Book an appointment') { addMessage('user', label); showAppointmentMenu(); } else if (label === 'Open an Account') { addMessage('user', label); const replyDiv = addMessage('agent', 'You can open a new trade account here:'); const accountCard = document.createElement('div'); accountCard.className = 'menu-card'; const accountLink = document.createElement('a'); accountLink.className = 'menu-btn samples'; accountLink.textContent = 'Open a Trade Account'; accountLink.href = 'https://webserv.lioher.com/privatearea/registration.php'; accountLink.target = '_blank'; accountCard.appendChild(accountLink); appendWidget(replyDiv, accountCard); } else if (label === 'Showroom locations') { addMessage('user', label); showShowroomFlow(); } else { sendUserMessage(label); } }; qr.appendChild(chip); }); appendWidget(greetDiv, qr); } // ── CATEGORY MENU ────────────────────────────────────────────────────────── function showCategoryMenu() { const replyDiv = addMessage('agent', 'What category are you interested in?'); const card = document.createElement('div'); card.className = 'menu-card'; card.innerHTML = ''; Object.keys(PRODUCT_DATA).forEach(cat => { const btn = document.createElement('button'); btn.className = 'menu-btn'; btn.textContent = cat; btn.onclick = () => { card.remove(); addMessage('user', cat); showProductsInCategory(cat); }; card.appendChild(btn); }); // Buy samples button const samplesBtn = document.createElement('a'); samplesBtn.className = 'menu-btn samples'; samplesBtn.textContent = 'Buy Samples'; samplesBtn.href = 'https://shop.lioher.com'; samplesBtn.target = '_blank'; card.appendChild(samplesBtn); appendWidget(replyDiv, card); } // ── PRODUCTS IN CATEGORY (multi-select) ─────────────────────────────────── function showProductsInCategory(category) { const data = PRODUCT_DATA[category]; const replyDiv = addMessage('agent', data.intro); const card = document.createElement('div'); card.className = 'menu-card'; // Checkbox items const checkboxes = []; data.items.forEach(item => { const label = document.createElement('label'); label.style.cssText = 'display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:7px;border:1px solid rgba(91,126,191,0.2);background:#fff;cursor:pointer;margin-bottom:5px;font-size:12.5px;font-family:DM Sans,sans-serif;color:#1a1a1a;transition:background 0.15s;'; label.onmouseenter = () => label.style.background = 'rgba(91,126,191,0.08)'; label.onmouseleave = () => { if (!cb.checked) label.style.background = '#fff'; }; const cb = document.createElement('input'); cb.type = 'checkbox'; cb.value = item; cb.style.cssText = 'width:15px;height:15px;accent-color:#5b7ebf;cursor:pointer;flex-shrink:0;'; cb.onchange = () => { label.style.background = cb.checked ? 'rgba(91,126,191,0.12)' : '#fff'; }; checkboxes.push(cb); label.appendChild(cb); label.appendChild(document.createTextNode(item)); card.appendChild(label); }); // Confirm button const confirmBtn = document.createElement('button'); confirmBtn.className = 'lead-form-submit'; confirmBtn.textContent = 'Continue'; confirmBtn.style.marginTop = '10px'; confirmBtn.onclick = () => { const selected = checkboxes.filter(c => c.checked).map(c => c.value); if (selected.length === 0) { confirmBtn.style.background = '#e88'; setTimeout(() => confirmBtn.style.background = '', 600); return; } card.remove(); const userMsg = selected.join(', '); addMessage('user', userMsg); const hasClosets = userMsg.includes('Closets') && !userMsg.includes(','); const followDiv = addMessage('agent', hasClosets ? 'Great! Explore our closet line or design your own:' : 'What would you like to know?'); if (hasClosets) { const cc = document.createElement('div'); cc.className = 'menu-card'; const lb = document.createElement('a'); lb.className = 'menu-btn samples'; lb.textContent = 'Learn More About Closets'; lb.href = 'https://lioher.com/closets-3/'; lb.target = '_blank'; const cb = document.createElement('a'); cb.className = 'menu-btn'; cb.textContent = 'Design Your Own Closet — 3D Configurator'; cb.href = 'https://17squares.com/Lioher/?designer=1'; cb.target = '_blank'; cb.style.cssText = 'margin-top:5px;display:block;'; cc.appendChild(lb); cc.appendChild(cb); appendWidget(followDiv, cc); } const qr = document.createElement('div'); qr.className = 'quick-replies'; ['Materials & finishes', 'Availability', 'Pricing', 'Quick Call'].forEach(q => { const chip = document.createElement('button'); chip.className = 'qr-chip'; chip.textContent = q; chip.onclick = () => { qr.remove(); if (q === 'Quick Call') { addMessage('user', 'Quick Call'); window.open('https://usa-appointments.zohobookings.com/#/4336222000004023032', '_blank'); addMessage('agent', 'Opening your booking link now — see you there!'); } else { sendUserMessage('About ' + userMsg + ': ' + q); } }; qr.appendChild(chip); }); appendWidget(followDiv, qr); history.push({ role: 'user', content: 'I am interested in: ' + userMsg }); }; card.appendChild(confirmBtn); appendWidget(replyDiv, card); } // ── LEAD FORM ────────────────────────────────────────────────────────────── function showLeadForm(parentDiv) { const form = document.createElement('div'); form.className = 'lead-form'; form.innerHTML = `
Your details
`; appendWidget(parentDiv, form); } function submitLeadForm(btn) { const first = document.getElementById('lf-first').value.trim(); const last = document.getElementById('lf-last').value.trim(); const company = document.getElementById('lf-company').value.trim(); const phone = document.getElementById('lf-phone').value.trim(); const email = document.getElementById('lf-email').value.trim(); ['lf-first','lf-last','lf-phone','lf-email'].forEach(id => document.getElementById(id).classList.remove('error')); let valid = true; if (!first) { document.getElementById('lf-first').classList.add('error'); valid = false; } if (!last) { document.getElementById('lf-last').classList.add('error'); valid = false; } if (!phone) { document.getElementById('lf-phone').classList.add('error'); valid = false; } if (!email) { document.getElementById('lf-email').classList.add('error'); valid = false; } if (!valid) return; btn.closest('.lead-form').remove(); const container = document.getElementById('chat-messages'); const div = document.createElement('div'); div.className = 'msg agent'; const bubble = document.createElement('div'); bubble.className = 'msg-bubble'; if (!selectedAppointmentUrl) { bubble.textContent = 'Got it, ' + first + '! Our team will give you a call back shortly.'; } else { bubble.textContent = 'Thanks, ' + first + '! Choose your appointment type:'; } div.appendChild(bubble); // Only show booking card if they picked an appointment type if (selectedAppointmentUrl) { const card = document.createElement('div'); card.className = 'booking-card'; card.innerHTML = '
Book an Appointment
' + selectedAppointmentType + ''; div.appendChild(card); } const time = document.createElement('div'); time.className = 'msg-time'; time.textContent = getTime(); div.appendChild(time); container.appendChild(div); scrollBottom(); history.push({ role: 'user', content: 'My details: ' + first + ' ' + last + ', company: ' + (company||'N/A') + ', phone: ' + phone + ', email: ' + email }); history.push({ role: 'assistant', content: 'Thanks ' + first + ', here are your booking options.' }); // Send lead to n8n sendLeadEmail(first, last, company, phone, email, selectedAppointmentType || 'Callback Request', '', !selectedAppointmentUrl); leadCollected = true; leadInfo = { first, last, company, phone, email }; } // ── SEND ─────────────────────────────────────────────────────────────────── function sendMessage() { const input = document.getElementById('lioher-input'); const text = input.value.trim(); if (!text || isTyping) return; input.value = ''; input.style.height = 'auto'; sendUserMessage(text); } async function sendUserMessage(text) { addMessage('user', text); history.push({ role: 'user', content: text }); document.getElementById('lioher-send').disabled = true; isTyping = true; showTyping(); try { const response = await fetch('https://api.anthropic.com/v1/messages', { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': ANTHROPIC_API_KEY, 'anthropic-version': '2023-06-01', 'anthropic-dangerous-direct-browser-access': 'true' }, body: JSON.stringify({ model: 'claude-sonnet-4-20250514', max_tokens: 200, system: SYSTEM_PROMPT, messages: history }) }); const data = await response.json(); const reply = data.content?.[0]?.text || "I'm having trouble connecting. Please try again."; history.push({ role: 'assistant', content: reply }); removeTyping(); const t = text.toLowerCase(); const r = reply.toLowerCase(); const bookingWords = ['book', 'appointment', 'schedule', 'call', 'meeting', 'showroom', 'consult']; const wantsBooking = bookingWords.some(kw => t.includes(kw) || r.includes(kw)); const speakWords = ['speak with', 'talk to', 'talk to someone', 'connect me', 'real person', 'human', 'agent', 'representative', 'someone from']; const wantsHuman = speakWords.some(kw => t.includes(kw)); // Detect conversation winding down — offer follow-up email summary const endSignals = ['thank you', 'thanks', 'that\'s all', 'thats all', 'bye', 'goodbye', 'perfect', 'great', 'awesome', 'got it', 'sounds good', 'no more questions']; const isEnding = endSignals.some(s => t.includes(s)); if (isEnding && !followUpEmailOffered) { followUpEmailOffered = true; setTimeout(() => { const endDiv = addMessage('agent', 'Would you like a follow-up email summary of our conversation?'); const qr = document.createElement('div'); qr.className = 'quick-replies'; ['Yes, send me a summary', 'No thanks'].forEach(label => { const chip = document.createElement('button'); chip.className = 'qr-chip'; chip.textContent = label; chip.onclick = () => { qr.remove(); if (label.startsWith('Yes')) { addMessage('user', label); if (leadCollected) { // Already have their info — send summary directly sendFollowUpEmail(leadInfo.first, leadInfo.last, leadInfo.email, true); addMessage('agent', 'A summary will be sent to ' + leadInfo.email + ' at the end of the day!'); } else { // Collect their email addMessage('user', label); const emailDiv = addMessage('agent', 'What email should I send it to?'); showFollowUpForm(emailDiv); } } else { addMessage('user', label); addMessage('agent', 'No problem! Feel free to come back anytime.'); } }; qr.appendChild(chip); }); appendWidget(endDiv, qr); }, 1000); } // Re-show main menu chips if AI replied to a greeting const greetingTriggers = ['hi', 'hello', 'hey', 'hola', 'good morning', 'good afternoon', 'good evening', 'sup', 'what\'s up', 'whats up']; const isGreeting = greetingTriggers.some(g => t.trim() === g || t.trim() === g + '!' || t.trim() === g + '.'); // Detect pricing / loyalty program questions const pricingWords = ['price', 'pricing', 'cost', 'how much', 'rate', 'discount', 'loyalty', 'bracket', 'promo', 'deal', 'offer', 'sqft', 'per foot', 'per sheet']; const wantsPricing = pricingWords.some(kw => t.includes(kw)); // COLLECT_LEAD: AI decided user said yes to a callback if (reply.trim() === 'COLLECT_LEAD') { if (!leadCollected) { const rd = addMessage('agent', "Perfect! Let me grab your details and someone will call you back shortly."); showLeadForm(rd); } else { addMessage('agent', "You're all set — our team will be in touch at " + leadInfo.phone + " soon!"); } } else { const msgDiv = addMessage('agent', reply); // After pricing/loyalty reply — show Yes/No callback chips (always show form regardless) if (wantsPricing && !isGreeting) { const qr = document.createElement('div'); qr.className = 'quick-replies'; ['Yes, call me back', 'No thanks'].forEach(label => { const chip = document.createElement('button'); chip.className = 'qr-chip'; chip.textContent = label; chip.onclick = () => { qr.remove(); addMessage('user', label); // Always show the form regardless of yes or no if (!leadCollected) { const rd = addMessage('agent', label.startsWith('Yes') ? "Great! Let me grab your details and a rep will call you back." : "No problem! In case you change your mind, here are your details form:"); showLeadForm(rd); } else { // Already have their info — trigger callback notification sendLeadEmail(leadInfo.first, leadInfo.last, leadInfo.company, leadInfo.phone, leadInfo.email, 'Pricing Callback Request', leadInfo.zip || '', true); addMessage('agent', label.startsWith('Yes') ? "Our team will call " + leadInfo.phone + " soon!" : "You're all set — feel free to ask anything else!"); } }; qr.appendChild(chip); }); appendWidget(msgDiv, qr); } // Re-show main options after a mid-convo greeting if (isGreeting) { const qr = document.createElement('div'); qr.className = 'quick-replies'; ['Products & Collections', 'Loyalty Program', 'Buy Samples', 'Book an appointment', 'Open an Account', 'Showroom locations'].forEach(label => { const chip = document.createElement('button'); chip.className = 'qr-chip'; chip.textContent = label; chip.onclick = () => { qr.remove(); if (label === 'Products & Collections') { addMessage('user', label); showCategoryMenu(); } else if (label === 'Buy Samples') { addMessage('user', label); const rd = addMessage('agent', 'You can order samples at shop.lioher.com:'); const sc = document.createElement('div'); sc.className = 'menu-card'; const sl = document.createElement('a'); sl.className = 'menu-btn samples'; sl.textContent = 'Visit shop.lioher.com'; sl.href = 'https://shop.lioher.com'; sl.target = '_blank'; sc.appendChild(sl); appendWidget(rd, sc); } else if (label === 'Loyalty Program') { addMessage('user', label); const lpDiv = addMessage('agent', "Our Loyalty Program has 5 tiers — Silver, Gold, Platinum, Partner, and Partner Pro — with perks like free samples, sample books, tower displays, social media promotions, and delivery/design fee discounts based on your annual volume."); const qr2 = document.createElement('div'); qr2.className = 'quick-replies'; const lpc = document.createElement('button'); lpc.className = 'qr-chip'; lpc.textContent = 'Learn more — Quick Call'; lpc.onclick = () => { qr2.remove(); addMessage('user', 'Learn more — Quick Call'); showAppointmentMenu(); }; qr2.appendChild(lpc); appendWidget(lpDiv, qr2); } else if (label === 'Book an appointment') { addMessage('user', label); showAppointmentMenu(); } else if (label === 'Open an Account') { addMessage('user', label); const rd = addMessage('agent', 'Open a new trade account here:'); const ac = document.createElement('div'); ac.className = 'menu-card'; const al = document.createElement('a'); al.className = 'menu-btn samples'; al.textContent = 'Open a Trade Account'; al.href = 'https://webserv.lioher.com/privatearea/registration.php'; al.target = '_blank'; ac.appendChild(al); appendWidget(rd, ac); } else if (label === 'Showroom locations') { addMessage('user', label); showShowroomFlow(); } else { sendUserMessage(label); } }; qr.appendChild(chip); }); appendWidget(msgDiv, qr); } else if (wantsHuman && !leadCollected) { const qr = document.createElement('div'); qr.className = 'quick-replies'; const chip = document.createElement('button'); chip.className = 'qr-chip'; chip.textContent = 'Yes, set up a call'; chip.onclick = () => { qr.remove(); addMessage('user', 'Yes, set up a call'); const rd = addMessage('agent', "Perfect! Let me grab your details and someone will call you back shortly."); showLeadForm(rd); }; qr.appendChild(chip); appendWidget(msgDiv, qr); } else if (wantsBooking && !leadCollected) { showLeadForm(msgDiv); } else if (wantsBooking && leadCollected) { showBookingCard(selectedAppointmentType || 'Book an Appointment', selectedAppointmentUrl || 'https://usa-appointments.zohobookings.com/#/4336222000004023032'); } } } catch (err) { removeTyping(); addMessage('agent', "Having trouble connecting. Please visit lioher.com or call us directly."); console.error(err); } isTyping = false; document.getElementById('lioher-send').disabled = false; } // ── AUTO POPUP BUBBLE ────────────────────────────────────────────────────── let bubbleShown = false; function showPopupBubble() { if (bubbleShown || isOpen) return; bubbleShown = true; const bubble = document.createElement('div'); bubble.id = 'lio-popup-bubble'; bubble.style.cssText = 'position:fixed;bottom:104px;right:28px;background:#ffffff;border:1px solid rgba(91,126,191,0.25);border-radius:16px 16px 4px 16px;padding:12px 16px;font-family:Montserrat,Arial,sans-serif;font-size:13px;font-weight:400;color:#1a1a1a;max-width:220px;box-shadow:0 8px 32px rgba(0,0,0,0.14);z-index:9997;cursor:pointer;line-height:1.5;opacity:0;transform:translateY(12px) scale(0.9);transition:opacity 0.35s ease,transform 0.35s cubic-bezier(0.34,1.56,0.64,1);'; bubble.innerHTML = '
Any questions? I\'m here to help! 👋
'; document.body.appendChild(bubble); // Animate in requestAnimationFrame(() => { requestAnimationFrame(() => { bubble.style.opacity = '1'; bubble.style.transform = 'translateY(0) scale(1)'; }); }); function closeBubble() { bubble.style.opacity = '0'; bubble.style.transform = 'translateY(8px) scale(0.95)'; setTimeout(() => { if (bubble.parentNode) bubble.remove(); }, 300); } document.getElementById('lio-bubble-x').addEventListener('click', function(e) { e.stopPropagation(); closeBubble(); }); bubble.addEventListener('click', function() { closeBubble(); if (!isOpen) toggleChat(); }); // Auto-hide after 8 seconds setTimeout(closeBubble, 8000); } // Show bubble after 3 seconds if user hasn't opened chat setTimeout(showPopupBubble, 3000);