Snabbstart
#Atria består av en enda klassisk skripttagg. Den lägger till en supportknapp i hörnet på sidan och öppnar chatten i en isolerad iframe.
Öppna Agenter i Atrias admin, välj en agent och kopiera kodsnutten. Den innehåller redan agentens ID (som börjar med
agt_).Klistra in den precis före den avslutande
</body>-taggen på varje sida där chatten ska visas. Ettdefer-skript i<head>fungerar också.index.html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>Föredrar du attribut framför frågeparametrar?
data-agent-idfungerar på samma sätt.html <script src="https://atria.bemagic.online/widget.js" data-agent-id="agt_YOUR_AGENT_ID" defer></script>Ladda om webbplatsen och klicka på knappen. Meddelanden visas direkt i Admin → Sessioner.
Så fungerar widgeten
#Byggd för att vara en diskret gäst på alla sidor: liten, isolerad och laddas vid behov.
Laddaren är cirka 3,5 kB gzip-komprimerad och saknar beroenden. Den renderar knappen i sin egen shadow root (
#atria-support), så att din CSS inte kan påverka den och dess CSS inte läcker in på sidan.Själva chatten är en iframe som levereras från
https://atria.bemagic.onlineoch skapas först när en besökare öppnar knappen. Inget tungt läses in före det.Alla nätverksförfrågningar sker inuti iframen. Din sida behöver bara tillåta att skriptet läses in och att chatten visas i en frame.
Besökaren får ett anonymt ID som lagras i webbplatsens
localStorage(atria:visitor-id). Den öppna konversationen och chattens öppna/stängda läge sparas isessionStorage, så att chatten följer besökaren mellan sidor.När chatten är minimerad visas nya svar som en markering för olästa meddelanden på knappen.
Identifiera inloggade besökare
#Berätta för Atria vem som chattar, så att agenter och operatörer kan hälsa besökarna välkomna med namn och se användbar kontext.
Ange
window.AtriaSettingsvar som helst på sidan. Värdet läses när besökaren öppnar chatten, så du kan ange det efter inloggning utan att läsa in widgeten igen.html <script> window.AtriaSettings = { visitor: { id: "user_8231", // your user ID (string or number) name: "Marta Silva", email: "marta@example.com", metadata: { plan: "Pro", company: "Crumbs Bakery" }, }, }; </script>
Content Security Policy
#Om webbplatsen skickar en CSP-header tillåter du Atria i två direktiv. Det är allt.
Lägg till Atrias ursprung i
script-src(för att läsa in laddaren) ochframe-src(för att visa chatten). Du behöver inte ändraconnect-src,style-srcellerimg-src: knappens stilar använder konstruerbara formatmallar som inte blockeras avstyle-src.http Content-Security-Policy: script-src 'self' https://atria.bemagic.online; frame-src https://atria.bemagic.online;Använder du nonces med
'strict-dynamic'? Lägg till din nonce i Atrias tagg. Laddaren injicerar aldrig andra skript.html <script nonce="{{ nonce }}" src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
Ensidiga appar och sidövergångar
#Klientbaserad routning, vyövergångar och byten av body hanteras automatiskt.
Läs in skriptet en gång i rotlayouten eller
index.html. Routningsändringar i React, Vue, Svelte, Angular och liknande påverkar det inte.Om ett ramverk byter ut hela
<body>(Turbo, htmx boost, Astro-vyövergångar, Livewirewire:navigate, swup eller Barba) lägger knappen tillbaka sig själv automatiskt.Vid fullständiga sidinläsningar återställs den öppna konversationen och panelens läge, så att besökarna kan fortsätta där de slutade.
Integritet och samtycke
#Vad widgeten lagrar och när den kommunicerar med Atria.
Fram tills besökaren öppnar chatten är den enda begäran till Atria att läsa in
widget.js. Widgeten skapar inga cookies på din webbplats.Den lagrar ett anonymt besökar-ID i
localStoragesamt den aktuella konversationens ID och panelens läge isessionStorage. En session skapas först när besökaren skickar sitt första meddelande, tillsammans med sidans URL, hänvisande sida, webbläsarens språk och tidszon.Om din samtyckesbanner kräver godkännande av supportverktyg först lägger du till skriptet efter samtycket:
js function loadAtria() { const script = document.createElement("script"); script.src = "https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID"; script.defer = true; document.body.appendChild(script); }
Felsökning
#De vanligaste orsakerna, i ordning.
Syns knappen inte alls? Öppna konsolen. Ett CSP-fel som nämner
script-srcbetyder att du måste tillåtahttps://atria.bemagic.online. Inget fel? Kontrollera att taggen inte användertype="module"och inte har buntats, kombinerats eller fördröjts av en optimerare.Visas knappen men panelen är tom? Lägg till
https://atria.bemagic.onlineiframe-src(ellerchild-src/default-src).Säger chatten att agenten inte är tillgänglig?
agentIdsaknas eller är felaktigt. Kopiera kodsnutten igen från Admin → Agenter.Får du React-hydreringsvarningar under utvecklingen? Något lade till noder i
<body>före hydreringen. Läs in Atria efter hydreringen (se guiden för ditt ramverk) så försvinner varningen.Täcker Atria-knappen din egen flytande knapp? Den ligger längst ned till höger, ovanpå allt annat. Flytta din knapp eller dölj en av dem på små skärmar.
Meta-ramverk
Next.js (App Router)
#Använd next/script i rotlayouten så att chatten läses in efter hydrering på alla rutter.
Lägg till skriptet i
app/layout.tsx:app/layout.tsx import Script from "next/script"; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html lang="en"> <body> {children} <Script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" strategy="afterInteractive" /> </body> </html> ); }Om du anger säkerhetsheaders i
next.config.tstillåter du Atria:next.config.ts import type { NextConfig } from "next"; const csp = [ "default-src 'self'", "script-src 'self' https://atria.bemagic.online", "frame-src https://atria.bemagic.online", ].join("; "); const nextConfig: NextConfig = { async headers() { return [ { source: "/:path*", headers: [{ key: "Content-Security-Policy", value: csp }], }, ]; }, }; export default nextConfig;Använder du en nonce-baserad CSP från
proxy.ts(middleware.tsföre Next.js 16)? Läs av nonce-värdet i layouten och skicka det vidare:app/layout.tsx import { headers } from "next/headers"; import Script from "next/script"; export default async function RootLayout({ children }: { children: React.ReactNode }) { const nonce = (await headers()).get("x-nonce") ?? undefined; return ( <html lang="en"> <body> {children} <Script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" strategy="afterInteractive" nonce={nonce} /> </body> </html> ); }
Next.js (Pages Router)
#Läs in den en gång i _app med next/script.
Lägg till skriptet bredvid sidkomponenten:
pages/_app.tsx import type { AppProps } from "next/app"; import Script from "next/script"; export default function App({ Component, pageProps }: AppProps) { return ( <> <Component {...pageProps} /> <Script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" strategy="afterInteractive" /> </> ); }
React Router v7 / Remix
#Lägg till den i root.tsx. I React 18 läser du in den efter hydrering för att undvika varningar.
React 19 (standard i React Router v7): placera taggen i dokumentets body, efter
<Scripts />.app/root.tsx export function Layout({ children }: { children: React.ReactNode }) { return ( <html lang="en"> <head> <Meta /> <Links /> </head> <body> {children} <ScrollRestoration /> <Scripts /> <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer /> </body> </html> ); }React 18 (Remix v2): läs in den från en effect så att React först hinner hydrera dokumentet.
app/root.tsx import { useEffect } from "react"; export default function App() { useEffect(() => { if (document.getElementById("atria-script")) return; const script = document.createElement("script"); script.id = "atria-script"; script.src = "https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID"; document.body.appendChild(script); }, []); return <Outlet />; }Ange CSP-headers i
entry.server.tsx(eller enheaders-export) och lägg till Atria iscript-srcochframe-src.
Gatsby
#Använd Gatsby's <Script> med strategin post-hydrate.
Omslut varje sida en gång i
gatsby-browser:gatsby-browser.tsx import { Script } from "gatsby"; export const wrapPageElement = ({ element }) => ( <> {element} <Script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" strategy="post-hydrate" /> </> );
Nuxt
#Deklarera skriptet i nuxt.config.ts så att det används på alla sidor.
Lägg till den i appens head, i slutet av body:
nuxt.config.ts export default defineNuxtConfig({ app: { head: { script: [ { src: "https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID", defer: true, tagPosition: "bodyClose", }, ], }, }, });Använder du
nuxt-security? Lägg till Atria i dess CSP:nuxt.config.ts export default defineNuxtConfig({ security: { headers: { contentSecurityPolicy: { "script-src": ["'self'", "'nonce-{{nonce}}'", "https://atria.bemagic.online"], "frame-src": ["https://atria.bemagic.online"], }, }, }, });
SvelteKit
#Lägg till den i src/app.html.
Klistra in taggen före den avslutande body-taggen:
src/app.html <body data-sveltekit-preload-data="hover"> <div style="display: contents">%sveltekit.body%</div> <script nonce="%sveltekit.nonce%" src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>Om du använder
kit.csplägger du till Atria i direktiven:svelte.config.js const config = { kit: { csp: { directives: { "script-src": ["self", "https://atria.bemagic.online"], "frame-src": ["https://atria.bemagic.online"], }, }, }, }; export default config;
Astro
#Lägg till den i baslayouten med is:inline.
is:inlinetalar om för Astro att lämna taggen precis som den är skriven:src/layouts/Layout.astro <html lang="en"> <body> <slot /> <script is:inline src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body> </html>
Angular
#Lägg till den i src/index.html, inte i en komponentmall.
Klistra in taggen före den avslutande body-taggen:
src/index.html <body> <app-root></app-root> <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>Läser du in den från kod (till exempel efter samtycke)? Kör den utanför Angular-zonen så att widgetens händelser inte utlöser ändringsdetektering:
ts this.ngZone.runOutsideAngular(() => { const script = document.createElement("script"); script.src = "https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID"; document.body.appendChild(script); });
Qwik City
#Lägg till taggen i src/root.tsx.
Klistra in den i body:
src/root.tsx <body lang="en"> <RouterOutlet /> <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer /> </body>
SolidStart
#Lägg till taggen i serverns inmatningsdokument.
Klistra in den efter appens rot:
src/entry-server.tsx <body> <div id="app">{children}</div> {scripts} <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer /> </body>
UI-bibliotek och SPA:er
React (Vite, Create React App)
#Ensidiga appar behöver bara taggen i index.html.
Klistra in den före den avslutande body-taggen (
public/index.htmli Create React App):index.html <body> <div id="root"></div> <script type="module" src="/src/main.tsx"></script> <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>Behöver du läsa in den villkorligt? Använd en effect och ta inte bort den vid cleanup:
tsx useEffect(() => { if (!user || document.getElementById("atria-script")) return; window.AtriaSettings = { visitor: { id: user.id, name: user.name } }; const script = document.createElement("script"); script.id = "atria-script"; script.src = "https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID"; document.body.appendChild(script); }, [user]);
Vue
#Lägg till taggen i index.html i Vite-projekt.
Klistra in den före den avslutande body-taggen:
index.html <body> <div id="app"></div> <script type="module" src="/src/main.ts"></script> <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>
Svelte (Vite)
#Lägg till taggen i index.html.
Klistra in den före den avslutande body-taggen:
index.html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
Solid, Preact och Lit
#Alla Vite-baserade appar fungerar på samma sätt: en tagg i index.html.
Klistra in den före den avslutande body-taggen:
index.html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
Ember
#Lägg till taggen i app/index.html.
Klistra in den efter
{{content-for "body-footer"}}:app/index.html {{content-for "body-footer"}} <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
Ionic och Capacitor
#Fungerar i hybridappar via WebView med samma tagg i index.html.
Klistra in den före den avslutande body-taggen i
src/index.html(Angular) ellerindex.html(React och Vue):index.html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
Statiska webbplatser och dokumentation
Vanlig HTML, jQuery och Alpine.js
#Klistra in taggen på varje sida, före </body>.
Det är hela installationen:
index.html <!doctype html> <html lang="en"> <body> <!-- your page --> <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body> </html>
Hugo, Jekyll och Eleventy
#Lägg till taggen i baslayouten.
Hugo:
layouts/_default/baseof.html {{ block "main" . }}{{ end }} <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>Jekyll:
_layouts/default.html {{ content }} <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>Eleventy:
_includes/base.njk {{ content | safe }} <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>
Docusaurus
#Registrera skriptet i webbplatsens konfiguration.
Lägg till den i
scripts:docusaurus.config.ts const config = { scripts: [{ src: "https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID", defer: true }], }; export default config;
VitePress
#Lägg till skriptet i webbplatsens head.
Lägg till den i
head:.vitepress/config.ts import { defineConfig } from "vitepress"; export default defineConfig({ head: [["script", { src: "https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID", defer: "" }]], });
Serverrenderade
Ruby on Rails (med Turbo)
#Lägg till taggen i applikationens layout.
Placera den i
<head>så att Turbo läser in den en gång och behåller den mellan besök:app/views/layouts/application.html.erb <head> <%= javascript_include_tag "https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID", defer: true, nonce: true %> </head>Tillåt Atria i CSP-initialiseraren:
config/initializers/content_security_policy.rb Rails.application.configure do config.content_security_policy do |policy| policy.script_src :self, "https://atria.bemagic.online" policy.frame_src "https://atria.bemagic.online" end end
Laravel (Blade, Livewire, Inertia)
#Lägg till taggen i din huvudsakliga Blade-layout.
Blade och Livewire:
resources/views/layouts/app.blade.php <head> <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer data-navigate-once></script> </head>Inertia: lägg till den i rotvyn, utanför
@inertia:resources/views/app.blade.php <body> @inertia <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>
Django och Flask
#Lägg till taggen i basmallen.
Klistra in den före den avslutande body-taggen:
templates/base.html {% block content %}{% endblock %} <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>Med
django-csp4 tillåter du Atria i inställningarna:settings.py CONTENT_SECURITY_POLICY = { "DIRECTIVES": { "script-src": ["'self'", "https://atria.bemagic.online"], "frame-src": ["https://atria.bemagic.online"], }, }
Phoenix (LiveView)
#Lägg till taggen i rotlayouten.
Klistra in den före den avslutande body-taggen:
lib/my_app_web/components/layouts/root.html.heex {@inner_content} <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>
ASP.NET Core (MVC, Razor Pages, Blazor)
#Lägg till taggen i den delade layouten eller Blazors värdsida.
MVC och Razor Pages använder
Views/Shared/_Layout.cshtml(ellerPages/Shared/_Layout.cshtml). Blazor använderComponents/App.razorellerwwwroot/index.html.Views/Shared/_Layout.cshtml @RenderBody() <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>
Webbplatsbyggare och CMS
WordPress
#Köa skriptet från ditt tema eller klistra in det med ett header- och footer-plugin.
Med ett plugin som WPCode lägger du till taggen som en global kodsnutt i sidfoten. Du kan också köa den från ditt barntema:
functions.php add_action('wp_enqueue_scripts', function () { wp_enqueue_script( 'atria', 'https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID', [], null, ['strategy' => 'defer', 'in_footer' => true] ); });
Shopify
#Lägg till taggen i theme.liquid.
Öppna
layout/theme.liquidvia Webbshop → Teman → … → Redigera kod och klistra in taggen före</body>:layout/theme.liquid {{ content_for_layout }} <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script> </body>
Webflow
#Använd anpassad kod för hela webbplatsen.
Gå till Webbplatsinställningar → Anpassad kod, klistra in taggen i sidfotens kod, spara och publicera.
html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
Wix
#Använd Inställningar → Anpassad kod.
Klicka på Lägg till anpassad kod, klistra in taggen, välj Alla sidor och Läs in kod en gång och placera den i slutet av body.
html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
Squarespace
#Använd Kodinjektion.
Gå till Webbplats → Sidor → Webbplatsverktyg → Kodinjektion, klistra in taggen i sidfoten och spara.
html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
Framer
#Använd webbplatsens inställningar för anpassad kod.
Gå till Webbplatsinställningar → Allmänt → Anpassad kod, klistra in taggen vid slutet av <body>-taggen och publicera.
html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
Ghost
#Använd Kodinjektion.
Gå till Inställningar → Kodinjektion, klistra in taggen i webbplatsens sidfot och spara.
html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
HubSpot CMS
#Använd HTML för webbplatsens sidfot.
Gå till Inställningar → Webbplats → Sidor, klistra in taggen i webbplatsens sidfots-HTML och spara.
html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
Google Tag Manager
#Lägg till en anpassad HTML-tagg som aktiveras på alla sidor.
Skapa en anpassad HTML-tagg med kodsnutten och utlösaren Alla sidor (eller din samtyckesutlösare) och publicera sedan behållaren.
html <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>