Meta tags:
description= Dein Fachversand für Vaporizer zur Aromatherapie, Zubehör & Ersatzteile. Professionell, zuverlässig und diskret.;
Headings (most frequently used words):
vaporizer, für, tragbare, und, ein, zubehör, bei, wie, verbrennen, du, neu, tischvaporizer, warum, ist, kräuterverdampfer, zu, auch, kaufen, beim, fachversand, aus, hannover, venty, nur, 285, günstig, nie, 85, klein, feuerzeug, versandkostenfrei, take, it, veazy, stilus, pro, max, express, lieferung, verdampfen, statt, jeden, geschmack, das, passende, gerät, was, suchst, storz, bickel, sonderangebote, mechanische, vapotools, dosierkapseln, 157grad, grinder, unsere, marken, nichts, verpassen, im, blog, stationäre, gutes, vorteile, des, verdampfens, gegenüber, dem, rauchen, verdampfer, flexibilität, diskretion, ihre, leistungsstarken, funktionen, konvektion, vs, konduktion, verdampfern, essentielles, erweitertes, dampferlebnis, deinen, uns, bestellen, solltest, fragen, antworten, faqs, welcher, der, beste, den, ihr, habt, es, so, wichtig, kräuter, nicht, kann, mit, tabak, verwendet, werden, eignen, sich, kräutervaporizer, öl, sind, einfach, reinigen,
Text of the page (most frequently used words):
const (118), auf (82), lager (78), schnellansicht (78), sonderpreis (78), style (77), und (67), #vaporizer (65), window (57), 157grad (54), den (54), für (52), vapotools (52), config (48), textelement (42), normalpreis (41), sparst (41), review (41), optionen (40), der (39), warenkorb (39), return (38), card (36), document (35), die (33), instanceid (33), mit (30), dynavap (30), layoutconfig (29), full (29), bickel (27), for (25), storz (24), function (24), bei (22), ist (22), display (22), summary (22), von (21), the (21), length (21), text (21), true (21), splide (21), arizer (20), alle (20), animation (20), transform (20), zubehör (19), ein (19), highlight (19), werden (18), farben (18), ansehen (18), index (18), queryselector (18), container (18), versch (17), grinder (17), let (17), bis (16), sich (16), oder (16), pax (16), else (16), opacity (16), cards (16), kräuter (15), verdampfer (15), carousel (15), aus (14), nicht (14), venty (14), false (14), none (14), settimeout (14), bullets (14), zum (13), set (13), preview (13), reviews (13), 100 (13), carouselelement (13), kräuterverdampfer (12), das (12), photo_urls (12), foreach (12), widget (12), 2026 (11), wie (11), kann (11), dampf (11), dosierkapseln (11), max (11), generate (11), and (11), translations (11), ease (11), out (11), createelement (11), businessdata (11), button (11), modal (11), uns (10), dem (10), beim (10), tragbare (10), mighty (10), wir (10), eine (10), marken (10), norddampf (10), tlg (10), veazy (10), privacy (10), add (10), case (10), slide (10), textcontent (10), width (10), appendchild (10), mode (10), expanded (10), sind (9), des (9), edelstahl (9), html (9), use (9), transition (9), break (9), position (9), custom (9), aisummarycard (9), state (9), block (9), addeventlistener (9), marquee (9), produkte (9), sie (8), wird (8), uhr (8), als (8), auch (8), xmax (8), black (8), photo (8), enabled (8), with (8), reviewid (8), cardid (8), animationobserver_ (8), left (8), scale (8), reviewstoshow (8), reviewshtml (8), instance (8), currentstate (8), collapsed (8), autoscroll (8), autoplay (8), splideconfig (8), splideinstance_ (8), bullet (8), einem (7), einen (7), gibt (7), solo (7), tisch (7), volcano (7), rauchen (7), puffco (7), leaf (7), fenix (7), wolkenkraft (7), xvape (7), 150 (7), based (7), height (7), getstate (7), filteredreviewids (7), aisummaryinserted (7), css (7), csstext (7), ismarqueemode (7), hasautoplay (7), perview (7), bulletscontainer (7), inkl (7), zurück (7), über (6), versandkostenfrei (6), verdampfen (6), welcher (6), nur (6), welche (6), dass (6), extraktion (6), aber (6), konvektion (6), oktober (6), neu (6), 119 (6), dosierkapsel (6), passend (6), einzeln (6), 5er (6), characterlimit (6), author_name (6), disable_google_links (6), customizer (6), summarytouse (6), get (6), configuration (6), setup (6), viewport (6), getelementbyid (6), innerhtml (6), div (6), center (6), background (6), first (6), aisummaryposition (6), math (6), viewportmeta (6), columns (6), more (6), all (6), mainwidget (6), initialize (6), queryselectorall (6), original (6), originalcard (6), classlist (6), border (6), nav (6), 255 (6), perpage (6), active (6), 159 (6), relict (6), kaufberatung (6), versand (5), support (5), hannover (5), lassen (5), etwa (5), temperatur (5), verbrennen (5), sogar (5), können (5), wirkstoffe (5), konduktion (5), hybrid (5), einer (5), crafty (5), weiterlesen (5), near (5), dark (5), mad (5), heaters (5), ispire (5), auxo (5), hizen (5), noids (5), new (5), 129 (5), dosierkapselbehälter (5), mini (5), check (5), show (5), count (5), reviewtext (5), target (5), reviewcount (5), fallback (5), when (5), line (5), meta (5), replace (5), observer (5), entry (5), rgba (5), breakpoint (5), current (5), splide__slide (5), image (5), closebutton (5), info (5), gap (5), click (5), widgetconfigs (5), tragbar (5), bücher (5), datenschutzerklärung (4), deutsch (4), blog (4), bestellung (4), tag (4), wesentlich (4), kräutern (4), weniger (4), bieten (4), boveda (4), cannabis (4), dieser (4), kräuterkammer (4), man (4), bubbler (4), wasserfilter (4), somit (4), tischvaporizer (4), mechanische (4), klein (4), wer (4), vorteile (4), smono (4), vape (4), ohne (4), proxy (4), pro (4), photoshtml (4), shouldtruncate (4), show_full_text (4), aisummary (4), keep (4), available (4), class (4), data (4), null (4), from (4), linediv (4), sweep (4), top (4), currentdisplaycount (4), found (4), specific (4), ensure (4), name (4), renderwidget (4), update (4), getfilteredreviews (4), applycssvariables (4), async (4), await (4), find (4), clones (4), determine (4), newstate (4), show_more (4), viewer (4), photoindex (4), cursor (4), white (4), dot (4), closemodal (4), autoplayspeed (4), slides_per_view_desktop (4), mount (4), store (4), slidescount (4), splide__bullet (4), aufbewahrung (4), spar (4), 135 (4), 285 (4), sonderangebote (4), kleinste (4), deutschland (4), günstig (4), ersatzteile (4), widerrufsbelehrung (3), sprache (3), hinweise (3), nach (3), informationen (3), mehr (3), deine (3), kauf (3), online (3), kein (3), zahlung (3), innerhalb (3), deutschlands (3), aktion (3), einige (3), allerdings (3), sollte (3), eignen (3), kräutervaporizer (3), tabak (3), großer (3), leistung (3), gerät (3), gut (3), shop (3), wenn (3), mail (3), ihre (3), verschickt (3), kaufen (3), welches (3), diese (3), sehr (3), dafür (3), außerdem (3), direkt (3), vorteil (3), arbeiten (3), zur (3), besten (3), noch (3), jene (3), erhitzt (3), eines (3), stationäre (3), funktionen (3), feuerzeug (3), geräte (3), erzeugen (3), varianten (3), etwas (3), plus (3), handelt (3), torz (3), greifen (3), kontrolle (3), gegenüber (3), vaphit (3), cuboo (3), aromed (3), alu (3), ceramic (3), ultra (3), premium (3), flow (3), 299 (3), core (3), kit (3), 269 (3), wand (3), pen (3), air (3), photos (3), maxphotos (3), photostoshow (3), remainingcount (3), last (3), authorname (3), critical (3), exists (3), iscustomizercontext (3), not (3), metatext (3), create (3), exist (3), apply (3), translatey (3), translatex (3), originaltext (3), lines (3), hidden (3), absolute (3), sweepcount (3), performsweep (3), after (3), generatebusinessheader (3), place_id (3), google (3), generatewidgettitle (3), generategooglefooter (3), show_bullets (3), responsive (3), content (3), applyresponsivegrid (3), actual (3), 768px (3), reviews_to_show (3), hide (3), existingstyle (3), remove (3), selector (3), global (3), this (3), default (3), toggle (3), functionality (3), flex (3), pointer (3), radius (3), 8px (3), handlekeydown (3), init (3), filtered (3), resizetimeout (3), initializesplidenormal (3), speed (3), only (3), show_arrows (3), pagination (3), pauseonhover (3), hover_pause (3), normal (3), needed (3), setupcarouselbullets (3), simple (3), time (3), activebulletindex (3), rating (3), stealth (3), system (3), starter (3), 149 (3), passt (3), kompakter (3), seit (3), 2019 (3), bisher (3), mwst (3), solange (3), vorrat (3), reicht (3), sortiment (3), fundgrube (3), angebote (3), taschen (3), pens (3), mechanisch (3), bauart (3), zuerst (2), agb (2), folge (2), english (2), bezahlen (2), kannst (2), service (2), kontakt (2), deinen (2), erklären (2), 0511 (2), 26232729 (2), kundenservice (2), beratung (2), per (2), selben (2), regel (2), recht (2), reinigen (2), einfach (2), sein (2), verwendung (2), konzentrat (2), möglich (2), verwendet (2), tragbaren (2), verwenden (2), medizinisch (2), unterschied (2), warum (2), wichtig (2), vom (2), geschmack (2), was (2), fragen (2), möchten (2), dein (2), sondern (2), via (2), telefon (2), dich (2), sowie (2), zubehörteile (2), beraten (2), erfolgt (2), halten (2), praktischen (2), genau (2), weiterhin (2), bestimmten (2), sorgen (2), kapseln (2), unterwegs (2), platziert (2), vapes (2), vielzahl (2), dampferlebnis (2), bzw (2), weitere (2), normalen (2), machen (2), meisten (2), dampfqualität (2), kommen (2), ganz (2), konvektionsvaporizer (2), zwei (2), verschiedene (2), während (2), mundstück (2), classic (2), desktop (2), mitgeführt (2), dampfproduktion (2), einsetzen (2), akku (2), leistungsstarken (2), elektronische (2), besonders (2), intensiver (2), weiterer (2), kleiner (2), moderne (2), medic (2), modell (2), unter (2), eindrucksvollen (2), nämlich (2), aller (2), dazu (2), fast (2), mobile (2), größtenteils (2), verbrannt (2), viele (2), medizinische (2), zwecke (2), verdampfens (2), immer (2), zigarette (2), tuttlingen (2), inhale (2), grenco (2), science (2), high (2), bestellt (2), 499 (2), 169 (2), plenty (2), 219 (2), 265 (2), 399 (2), konkav (2), ausverkauft (2), cnc (2), blumen (2), 5tlg (2), aluminium (2), champagne (2), mist (2), special (2), edition (2), heizsystem (2), 209 (2), cenote (2), cap (2), wechselakku (2), tempest (2), titan (2), generatereviewphotos (2), settings (2), slice (2), overlay (2), generatereviewcard (2), character_limit (2), handle (2), generateinitialsavatar (2), fix (2), show_review_header (2), during (2), generation (2), reviewheaderhtml (2), generateaisummarycard (2), ai_summary_enabled (2), sample (2), samplesummary (2), provided (2), don (2), headertext (2), showcount (2), metatemplate (2), ai_summary_shadow (2), shadow (2), iconmapping (2), iconhtml (2), attribute (2), cardhtml (2), intersection (2), setupanimationobserver (2), entries (2), dataset (2), applytextanimation (2), visible (2), observe (2), 60px (2), increased (2), 80px (2), borderright (2), solid (2), typeinterval (2), reveal (2), trim (2), cubic (2), bezier (2), transformorigin (2), 275 (2), rotatex (2), 90deg (2), bottom (2), relative (2), overflow (2), linear (2), transparent (2), multiple (2), 800 (2), clean (2), parentnode (2), removechild (2), start (2), business (2), write (2), url (2), using (2), widget_title (2), headinglevel (2), powered (2), fixed (2), generatewidgethtml (2), custommessage (2), aisummaryenabled (2), user_ratings_total (2), access (2), inserted (2), floor (2), reviewsdata (2), end (2), ensureviewportmeta (2), head (2), media (2), matchmedia (2), 480px (2), matches (2), render (2), load (2), setstate (2), fallbackbehavior (2), are (2), custom_css (2), applycustomcss (2), dom (2), initcarousel (2), customcss (2), scopedcss (2), match (2), functions (2), buttons (2), shouldn (2), including (2), non (2), cloned (2), closest (2), contains (2), clone (2), them (2), sync (2), read (2), show_less (2), classname (2), align (2), items (2), justify (2), src (2), 10px (2), 15px (2), color (2), 35px (2), navigation (2), stoppropagation (2), navdot (2), navindex (2), body (2), keydown (2), resize (2), marquee_mode (2), initializesplidemarquee (2), implementation (2), extension (2), try (2), autoplay_speed (2), 5000 (2), gap_spacing (2), scrollspeed (2), type (2), arrows (2), breakpoints (2), 768 (2), slides_per_view_tablet (2), 430 (2), slides_per_view_mobile (2), rewind (2), interval (2), extensions (2), backward (2), compatibility (2), also (2), splideinstance (2), catch (2), error (2), splide__bullets (2), filteredcount (2), actualreviewscount (2), min (2), bulletshtml (2), event (2), updateactivebullet (2), currentindex (2), generatestarhtml (2), substring (2), formatdate (2), mechanischer (2), induktionsheizgerät (2), vapcaps (2), debowler (2), äris (2), 109 (2), dual (2), heating (2), intellisense (2), technologie (2), hause (2), 189 (2), vier (2), 220 (2), passende (2), bezahlt (2), heute (2), fachversand (2), dash (2), aktionspreis (2), geschenkgutschein (2), magical (2), butter (2), decarboxylierung (2), feuerzeuge (2), feinwaagen (2), lufterfrischer (2), reinigung (2), mir (2), bitte, bestätige, ich, habe, gelesen, akzeptiere, neuen, fenster, geöffnet, batteriegesetz, elektro, elektronikgeräten, verpackungsgesetz, gesetzliche, impressum, allgemeine, geschäftsbedingungen, rechtliches, eps, nachnahme, mastercard, visa, rechnung, klarna, vorkasse, überweisung, paypal, rechten, europa, rechte, widerruf, möchtest, widerrufen, ladengeschäft, abholung, ricklingen, dhl, unserem, unkompliziert, modelle, reinigungsaufwand, geringer, konkurrenz, keinesfalls, gesundheitsschädlich, unbedingt, unterlassen, egal, hingegen, speziellem, oftmals, vorgesehen, bedeutet, gesehen, schädliche, stoffe, freisetzt, technischer, sicht, hier, zweifelsohne, genannt, übertrumpft, ansonsten, persönlichen, anwenders, abhängig, solchen, bewertet, beste, ihr, habt, antworten, faqs, geht, dir, stets, neue, artikel, diesem, bereich, kompetenten, freundlichen, direkten, chat, gerne, anwendung, kostenloser, kaufbetrag, euro, zahlungseingang, ware, taggleich, bestellen, solltest, eure, langen, zeitraum, frisch, packs, feuchtigkeitsregulierenden, gel, befüllten, tütchen, übrigens, arten, benötigst, bezüglich, führerscheinentzug, dann, buch, führerschein, theo, pütz, richtige, erfreuen, beliebtheit, hersteller, versteht, praktisches, produzieren, jeder, dampfenthusiast, gebrauchen, blackleaf, beliebt, kräuterkapseln, modellen, einfacher, dosieren, solche, schnelle, ausgewechselt, sauberer, kammer, füllkissen, geliefert, sodass, ihnen, verdampft, liquids, üblicherweise, zigaretten, eingesetzt, geeignet, zubehörteilen, gesteigertes, anstelle, mundstücks, inhaliert, kühlen, angenehmer, essentielles, erweitertes, beide, methoden, haben, vor, nachteile, erhältlichen, premiumverdampfer, konvektionsmethode, wahrgenommen, konduktionsverdampfer, betreffend, heran, erschwinglicher, grundsätzlich, heiztechnologien, heißer, luft, umströmt, richtigen, abgeben, gezogen, verdampfern, nahezu, jedem, beliebter, stellt, weiterentwicklung, dar, bietet, möglichkeit, schlauch, mithilfe, ballons, inhalieren, headshop, zwar, belieben, tragbarer, stärkere, länger, stück, steckdose, strom, versorgt, jedoch, benötigen, hitzequelle, jet, betrieb, erfordern, aufmerksamen, umgang, denn, lange, inhalts, wiederum, lässt, elektronischen, ohnehin, dabei, geld, sparen, möchte, komplett, sturmfeuerzeug, entscheiden, kandidat, sieht, zudem, stylisch, verfügt, einfache, handhabung, seiner, größten, gar, aussieht, diskret, einsatzbar, gute, nachricht, voraussetzungen, krankenkasse, erstattet, anzumerken, technisch, unterscheidet, mag, dennoch, starke, wünscht, anschauen, obwohl, kompakte, maße, aufweist, überzeugt, dieses, erschwinglich, starry, problem, damit, hat, verdampfers, tiefer, brieftasche, getrost, brandneuen, wahrscheinlich, zeiten, getrocknete, mittlerweile, lage, meist, weiteres, hosenasche, passen, überall, hin, elektronisch, gewährleisten, genaue, bleibt, nutzer, selbst, überlassen, lieber, sanften, mächtige, dampfwolken, erzeugt, flexibilität, diskretion, dampfens, vergleich, höhere, effizienz, teil, hohen, dampfen, lediglich, bleiben, erhalten, muss, kraut, gleichen, effekt, erzielen, birgt, traditionellen, größte, umstand, erhitzen, freigesetzt, schädlichen, verbrennungsprodukten, kohlenmonoxid, teer, vermieden, lunge, belastet, trockene, beimischung, konsumiert, schädlich, durch, präzise, dampftemperatur, gewährleistet, verschrieben, bekommt, umständen, verschreiben, nachfolgend, zeigen, euch, thematisieren, zwischen, gehen, ziehen, fazit, ende, beantworten, wieder, thema, erreichen, nichtsdestotrotz, sei, stelle, erwähnt, vaporizers, rauch, vergleichbar, oft, kaum, sichtbar, doch, wirkung, vorhanden, kräuterliebhaber, ihrer, genießen, nutzen, wunder, schließlich, kleine, technische, mächtig, überflüssig, gutes, arbeitet, direkte, hitze, induktionsheizer, bequemes, heizen, geschichte, deutschen, herstellers, testsieger, händlersicht, beiträge, bekommst, bestätigen, abmelden, jederzeit, anmelden, adresse, melden, gelegentlich, angeboten, neuheiten, nichts, verpassen, newsletter, anzeigen, yllvape, xtar, woodzl, weecke, vestratto, vapman, vapesuite, truemidity, tobaliq, tightpac, bulldog, sticky, brick, schmandweg, raw, purize, noaks, nass, nachtschatten, verlag, molicel, limpuro, limelight, keeppower, höfer, chemie, rollz, flowermate, davinci, chill, steel, pipes, champ, polyflame, canamix, calumet, spiritpipes, boundless, bormioli, rocco, blokk, apollo, airvape, autorisierter, händler, angebotenen, unsere, längere, lieferzeit, weiß, extreme, leistungsstarker, xq2, 179, 359, 539, 140, plastic, zufällige, farbe, magnet, grau, anodisiert, square, herb, silber, potenter, dab, vielen, extras, vorteilen, 249, konzentrate, wax, glass, recycler, dockingstation, armor, thermisches, upgrade, captive, kompakt, smart, kompromisslos, stick, vollkonvektion, 118, adapter, melt, hot, knife, sauberes, konzentraten, lotus, glaspfeife, logo, borosilikatglas, accessory, goldüberzogene, stecken, siebe, 3er, glas, größen, airse, hyperdyn, glasmundstück, schrauben, neo, show_review_photos, dynamic, setting, max_photos_per_review, photourl, remaining, author, use_initials_only, getinitials, authorimage, disable_google_images, profile_photo_url, authorurl, author_url, linktarget, _blank, people, love, shopping, here, staff, super, helpful, always, goes, extra, mile, delivery, great, quality, products, customers, coming, back, most, mention, excellent, quick, responses, ai_summary_header_text, ai_summary_show_count, ai_summary_meta_text, shadowclass, medium, ai_summary_text_animation, icon, brain, sparkles, star, chart, lightbulb, magic, ai_summary_icon, animationclass, animate, animations, triggers, doesn, intersectionobserver, isintersecting, unobserve, threshold, trigger, rootmargin, 0px, switch, 30px, 40px, typewriter, 2px, 667eea, setinterval, charat, clearinterval, 500, split, filter, 300, bounce, 175, 885, flip, 0deg, zoom, fade, gradient, 102, 126, 234, sweeps, times, final, 200, header, compact, layout, like, screenshot, show_business_header, build, writereviewurl, https, search, com, local, writereview, placeid, title, show_widget_title, widget_title_heading_level, footer, show_footer, complete, message, __show_message__, fallback_message, matching, ai_summary_position, ai_summary, debug, control, handled, template, level, track, has, been, avoid, duplicates, insert, positions, before, adding, second, third, middle, already, behavior, device, initial, query, detection, queries, detect, columns_mobile, columns_tablet, tablet, columns_desktop, carouseltemplatecolumns, repeat, 1fr, multi, location, load_reviews, getbusinessdata, reset, operations, isloading, limit, should, fallback_behavior, main, element, just, there, updated, proper, scoping, scope, includes, interactivity, togglereviewtext_, less, toggleaisummarytext_, openphotoviewer_, 10000, img, auto, 80vh, object, fit, contain, right, font, size, 24px, padding, 1px, eee, 333, 5px, dots, close, keyboard, key, escape, removeeventlistener, prevent, closing, clicking, expose, globally, results, small, delay, ready, design, cleartimeout, 250, readystate, loading, domcontentloaded, cleanup, page, unloads, beforeunload, disconnect, rendered, direct, marquee_speed, loop, direction, widget_direction, ltr, rtl, drag, 1000, easing, pauseonfocus, autostart, fails, basic, permove, move, one, slides, calculate, number, bulletsneeded, ceil, listeners, clicks, listener, movement, moved, powered_by, show_write_review, write_review, google_reviews, show_product_associations, generateproductassociations, byy, vapcap, woodwynd, vong, duradyn, titanium, tip, maximale, glaskappe, dunklem, finish, storage, dynabank, modulares, live, höchste, dampfer, ansprüche, 349, argo, ink, pre, 178, 148, bundle, 108, 124, pot, extraktor, 158, 297, klassiker, ehrlicher, 263, suchst, verschiedenen, 110, usb, leistungsstark, perfekter, balance, mobilität, 199, nano, 239, stiftformat, xlux, roffu, lite, konvektionsheiztechnologie, modernen, hammah, four, heizmodi, 229, 164, version, versenden, ehrlich, herstellerunabhängig, eigenem, erstes, umstieg, finden, statt, jeden, versandfrei, gegen, aufpreis, zustellung, nächsten, werktag, express, lieferung, jetzt, xxl, stilus, leicht, take, preis, heizt, sekunden, regelt, gradgenau, 190, wiegt, gramm, tage, lang, deep, nordic, blue, nie, sonntag, blitzangebot, unseren, produkten, leer, gib, erhalte, kostenlosen, konto, hauptmenü, schließen, löschen, instagram, facebook, tel, brauchst, hilfe, inhalt,
Text of the page (random words):
ransition none highlight style left 100 settimeout highlight style transition left 0 8s ease in out performsweep 50 800 else clean up highlight after final sweep settimeout if highlight parentnode highlight parentnode removechild highlight 800 start first sweep settimeout performsweep 200 break generate business header html compact layout like screenshot function generatebusinessheader if window layoutconfig show_business_header return build write review url using place_id const writereviewurl businessdata place_id https search google com local writereview placeid businessdata place_id businessdata url return privacy disable_google_links businessdata name businessdata name businessdata rating generatestarhtml businessdata rating businessdata user_ratings_total translations google_reviews window layoutconfig show_write_review privacy disable_google_links translations write_review generate widget title html function generatewidgettitle if window layoutconfig show_widget_title true window layoutconfig widget_title return const headinglevel window layoutconfig widget_title_heading_level h2 return window layoutconfig widget_title headinglevel generate google footer with powered by text fixed function generategooglefooter if window layoutconfig show_footer return return translations powered_by generate complete widget html function generatewidgethtml const reviewstoshow getstate filteredreviewids slice 0 getstate currentdisplaycount handle custom message fallback if reviewstoshow length 1 reviewstoshow 0 __show_message__ const custommessage window layoutconfig fallback_message no matching reviews found return generatewidgettitle generatebusinessheader custommessage generategooglefooter let reviewshtml get ai summary configuration const aisummaryenabled window layoutconfig ai_summary_enabled true const aisummaryposition window layoutconfig ai_summary_position first const aisummary businessdata ai_summary const reviewcount businessdata user_ratings_total reviewstoshow length debug ai summary generate ai summary card if enabled access control handled at template level const aisummarycard aisummaryenabled generateaisummarycard aisummary reviewcount track if ai summary has been inserted to avoid duplicates let aisummaryinserted false position based html generation if aisummaryposition first aisummarycard reviewshtml aisummarycard aisummaryinserted true reviewstoshow foreach reviewid index insert ai summary at specific positions before adding the review if aisummarycard aisummaryinserted if aisummaryposition second index 1 reviewshtml aisummarycard aisummaryinserted true else if aisummaryposition third index 2 reviewshtml aisummarycard aisummaryinserted true else if aisummaryposition middle index math floor reviewstoshow length 2 reviewshtml aisummarycard aisummaryinserted true const review reviewsdata reviews reviewid if review reviewshtml generatereviewcard reviewid review else add ai summary at the end if position is last and not already inserted if aisummaryposition last aisummarycard aisummaryinserted reviewshtml aisummarycard return generatewidgettitle generatebusinessheader reviewshtml window layoutconfig show_arrows true window layoutconfig show_bullets true generategooglefooter ensure viewport meta tag exists for responsive behavior function ensureviewportmeta let viewportmeta document queryselector meta name viewport if viewportmeta viewportmeta document createelement meta viewportmeta name viewport viewportmeta content width device width initial scale 1 0 document head appendchild viewportmeta responsive carousel columns using css media query detection function applyresponsivegrid const carouselelement document queryselector instanceid gr carousel if carouselelement return ensure viewport meta tag exists first ensureviewportmeta let columns let breakpoint use css media queries to detect actual breakpoint if window matchmedia max width 480px matches columns window layoutconfig columns_mobile 1 breakpoint mobile 480px else if window matchmedia max width 768px matches columns window layoutconfig columns_tablet 2 breakpoint tablet 768px else columns window layoutconfig columns_desktop 3 breakpoint desktop 768px carouselelement style carouseltemplatecolumns repeat columns 1fr render widget function renderwidget multi location update business data based on current load_reviews config businessdata getbusinessdata critical fix don t reset state during load more operations if getstate isloading for carousel use all available reviews up to reviews_to_show limit const currentdisplaycount math max getstate currentdisplaycount 0 window layoutconfig reviews_to_show 12 const filteredreviewids getfilteredreviews setstate currentdisplaycount filteredreviewids const container document getelementbyid gr carousel container instanceid if container return check if widget should be hidden when no reviews found and fallback is hide if getstate filteredreviewids length 0 const fallbackbehavior window layoutconfig fallback_behavior all if fallbackbehavior hide hide the main widget element not just the container const mainwidget document getelementbyid instanceid if mainwidget mainwidget style display none else container style display none return else ensure widget is visible if there are reviews const mainwidget document getelementbyid instanceid if mainwidget mainwidget style display else container style display container innerhtml generatewidgethtml applycssvariables apply custom css if provided if window layoutconfig custom_css applycustomcss window layoutconfig custom_css initialize carousel after dom is updated settimeout async applyresponsivegrid await initcarousel 50 apply custom css with proper scoping function applycustomcss customcss let existingstyle document getelementbyid custom css instanceid if existingstyle existingstyle remove const style document createelement style style id custom css instanceid scope css to widget instance const scopedcss customcss replace g function match selector if selector includes instanceid return match return instanceid selector style textcontent scopedcss document head appendchild style global functions for interactivity with translations window togglereviewtext_ instanceid replace g _ function reviewid if full text mode is enabled show more buttons shouldn t exist if window layoutconfig show_full_text false return find all cards with this review id including clones const cards document queryselectorall instanceid data review id reviewid if cards length return find the original non cloned card to determine current state let originalcard null let currentstate collapsed default state cards foreach card const slide card closest splide__slide if slide slide classlist contains splide__slide clone originalcard card const full card queryselector gr text full currentstate full full style display block expanded collapsed if no original card found use the first available card to determine state if originalcard cards length 0 const full cards 0 queryselector gr text full currentstate full full style display block expanded collapsed toggle state for all cards original clones to keep them in sync const newstate currentstate expanded collapsed expanded cards foreach card const preview card queryselector gr text preview const full card queryselector gr text full const button card queryselector gr read more if preview full button if newstate expanded preview style display none full style display block button textcontent translations show_less else preview style display block full style display none button textcontent translations show_more toggle ai summary text show more less functionality window toggleaisummarytext_ instanceid replace g _ function if full text mode is enabled show more buttons shouldn t exist if window layoutconfig show_full_text false return find ai summary cards including clones for carousel mode const cards document queryselectorall instanceid gr ai summary card if cards length return find the original non cloned card to determine current state let originalcard null let currentstate collapsed default state cards foreach card const slide card closest splide__slide if slide slide classlist contains splide__slide clone originalcard card const full card queryselector gr text full currentstate full full style display block expanded collapsed if no original card found use the first available card to determine state if originalcard cards length 0 const full cards 0 queryselector gr text full currentstate full full style display block expanded collapsed toggle state for all ai summary cards original clones to keep them in sync const newstate currentstate expanded collapsed expanded cards foreach card const preview card queryselector gr text preview const full card queryselector gr text full const button card queryselector gr read more if preview full button if newstate expanded preview style display none full style display block button textcontent translations show_less else preview style display block full style display none button textcontent translations show_more photo viewer functionality window openphotoviewer_ instanceid replace g _ function reviewid photoindex const review reviewsdata reviews reviewid if review review photo_urls review photo_urls length 0 return create photo viewer modal const modal document createelement div modal classname gr photo viewer modal modal style csstext position fixed top 0 left 0 width 100 height 100 background rgba 0 0 0 0 9 z index 10000 display flex align items center justify content center cursor pointer const container document createelement div container classname gr photo viewer container container style csstext position relative max width 90 max height 90 background white border radius 8px overflow hidden cursor default const image document createelement img image src review photo_urls photoindex image style csstext width 100 height auto max height 80vh object fit contain display block const closebutton document createelement button closebutton innerhtml closebutton style csstext position absolute top 10px right 15px background rgba 0 0 0 0 5 color white border none font size 24px cursor pointer border radius 50 width 35px height 35px display flex align items center justify content center const info document createelement div info style csstext padding 15px border top 1px solid eee color 333 info innerhtml review author_name photo photoindex 1 of review photo_urls length navigation for multiple photos if review photo_urls length 1 const nav document createelement div nav style csstext position absolute bottom 10px left 50 transform translatex 50 display flex gap 5px review photo_urls foreach _ index const dot document createelement button dot style csstext width 8px height 8px border radius 50 border none background index photoindex white rgba 255 255 255 0 5 cursor pointer dot addeventlistener click e e stoppropagation image src review photo_urls index info innerhtml review author_name photo index 1 of review photo_urls length update nav dots nav queryselectorall button foreach navdot navindex navdot style background navindex index white rgba 255 255 255 0 5 nav appendchild dot container appendchild nav container appendchild image container appendchild closebutton container appendchild info modal appendchild container document body appendchild modal close functionality const closemodal document body removechild modal closebutton addeventlistener click closemodal modal addeventlistener click e if e target modal closemodal keyboard navigation const handlekeydown e if e key escape closemodal document removeeventlistener keydown handlekeydown document addeventlistener keydown handlekeydown prevent modal from closing when clicking on container container addeventlistener click e e stoppropagation expose functions globally for customizer access window applycssvariables applycssvariables window renderwidget renderwidget window getfilteredreviews getfilteredreviews initialize widget function init initialize filtered results setstate filteredreviewids getfilteredreviews small delay to ensure dom is ready settimeout renderwidget 100 re render on window resize for responsive design let resizetimeout window addeventlistener resize cleartimeout resizetimeout resizetimeout settimeout applycssvariables applyresponsivegrid 250 start the widget if document readystate loading document addeventlistener domcontentloaded init else init cleanup animation observer when page unloads window addeventlistener beforeunload function if animationobserver_ animationobserver_ disconnect animationobserver_ null initialize carousel after widget is rendered async function initcarousel const carouselelement document queryselector gr reviews carousel instanceid if carouselelement return get instance specific config const config window widgetconfigs instanceid if config return check if marquee mode is enabled const ismarqueemode config marquee_mode false if ismarqueemode await initializesplidemarquee else await initializesplidenormal splide js marquee implementation with autoscroll extension async function initializesplidemarquee const carouselelement document queryselector gr reviews carousel instanceid if carouselelement return try add splide class carouselelement classlist add splide get instance specific config const config window widgetconfigs instanceid if config return configuration for marquee mode const autoplayspeed config autoplay_speed 5000 const hasautoplay config autoplay true const perview config slides_per_view_desktop 3 const gap config gap_spacing 20 check if marquee mode is enabled const ismarqueemode config marquee_mode false use direct marquee speed for autoscroll only if marquee mode and autoplay const scrollspeed hasautoplay ismarqueemode config marquee_speed 1 0 const splideconfig type loop direction config widget_direction ltr critical rtl support perpage perview gap gap arrows config show_arrows false pagination false use custom bullets drag true speed 1000 easing linear breakpoints 768 perpage config slides_per_view_tablet 2 430 perpage config slides_per_view_mobile 1 add autoscroll configuration only if marquee mode and autoplay are enabled if hasautoplay ismarqueemode splideconfig autoscroll speed scrollspeed pauseonhover config hover_pause true pauseonfocus true autostart true rewind true else if hasautoplay ismarqueemode normal autoplay configuration splideconfig autoplay true splideconfig interval autoplayspeed splideconfig pauseonhover config hover_pause true initialize splide const splide new splide carouselelement splideconfig mount with autoscroll extension only if marquee mode is enabled if hasautoplay ismarqueemode window splide extensions autoscroll splide mount autoscroll window splide extensions autoscroll else splide mount store instance for this widget instance window splideinstance_ instanceid splide backward compatibility also store as global for customizer if iscustomizercontext window splideinstance splide setup custom bullets if needed if ...
|