Utvecklare

Lägg till Atria på valfri webbplats på en minut.

En enda skripttagg för alla teknikstackar. Nedan hittar du exakt var du lägger till den i ditt ramverk, plus några viktiga saker att känna till.

<script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
~3.5 kB
gzip-komprimerad laddare utan beroenden
Shadow DOM
din CSS och vår möts aldrig
2 direktiv
allt en strikt CSP behöver
Laddas vid behov
chatten läses in vid första klicket

Välj din teknikstack

Hittar du inte din teknikstack? Om den renderar HTML fungerar snabbstart fungerar.

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.

  1. Öppna Agenter i Atrias admin, välj en agent och kopiera kodsnutten. Den innehåller redan agentens ID (som börjar med agt_).

  2. Klistra in den precis före den avslutande </body>-taggen på varje sida där chatten ska visas. Ett defer-skript i <head> fungerar också.

    index.html
    <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
  3. Föredrar du attribut framför frågeparametrar? data-agent-id fungerar på samma sätt.

    html
    <script src="https://atria.bemagic.online/widget.js" data-agent-id="agt_YOUR_AGENT_ID" defer></script>
  4. 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.

  1. 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.

  2. Själva chatten är en iframe som levereras från https://atria.bemagic.online och skapas först när en besökare öppnar knappen. Inget tungt läses in före det.

  3. 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.

  4. 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 i sessionStorage, så att chatten följer besökaren mellan sidor.

  5. 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.

  1. Ange window.AtriaSettings var 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.

  1. Lägg till Atrias ursprung i script-src (för att läsa in laddaren) och frame-src (för att visa chatten). Du behöver inte ändra connect-src, style-src eller img-src: knappens stilar använder konstruerbara formatmallar som inte blockeras av style-src.

    http
    Content-Security-Policy: script-src 'self' https://atria.bemagic.online; frame-src https://atria.bemagic.online;
  2. 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.

  1. 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.

  2. Om ett ramverk byter ut hela <body> (Turbo, htmx boost, Astro-vyövergångar, Livewire wire:navigate, swup eller Barba) lägger knappen tillbaka sig själv automatiskt.

  3. 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.

  1. 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.

  2. Den lagrar ett anonymt besökar-ID i localStorage samt den aktuella konversationens ID och panelens läge i sessionStorage. 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.

  3. 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.

  1. Syns knappen inte alls? Öppna konsolen. Ett CSP-fel som nämner script-src betyder att du måste tillåta https://atria.bemagic.online. Inget fel? Kontrollera att taggen inte använder type="module" och inte har buntats, kombinerats eller fördröjts av en optimerare.

  2. Visas knappen men panelen är tom? Lägg till https://atria.bemagic.online i frame-src (eller child-src / default-src).

  3. Säger chatten att agenten inte är tillgänglig? agentId saknas eller är felaktigt. Kopiera kodsnutten igen från Admin → Agenter.

  4. 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.

  5. 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.

  1. 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>
      );
    }
  2. Om du anger säkerhetsheaders i next.config.ts tillå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;
  3. Använder du en nonce-baserad CSP från proxy.ts (middleware.ts fö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.

  1. 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.

  1. 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>
      );
    }
  2. 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 />;
    }
  3. Ange CSP-headers i entry.server.tsx (eller en headers-export) och lägg till Atria i script-src och frame-src.

Gatsby

#

Använd Gatsby's <Script> med strategin post-hydrate.

  1. 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.

  1. 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",
            },
          ],
        },
      },
    });
  2. 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.

  1. 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>
  2. Om du använder kit.csp lä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.

  1. is:inline talar 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.

  1. 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>
  2. 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.

  1. 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.

  1. 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.

  1. Klistra in den före den avslutande body-taggen (public/index.html i 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>
  2. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. Klistra in den före den avslutande body-taggen i src/index.html (Angular) eller index.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>.

  1. 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.

  1. Hugo:

    layouts/_default/baseof.html
      {{ block "main" . }}{{ end }}
      <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
    </body>
  2. Jekyll:

    _layouts/default.html
      {{ content }}
      <script src="https://atria.bemagic.online/widget.js?agentId=agt_YOUR_AGENT_ID" defer></script>
    </body>
  3. 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.

  1. 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.

  1. 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.

  1. 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>
  2. 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.

  1. 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>
  2. 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.

  1. 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>
  2. Med django-csp 4 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.

  1. 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.

  1. MVC och Razor Pages använder Views/Shared/_Layout.cshtml (eller Pages/Shared/_Layout.cshtml). Blazor använder Components/App.razor eller wwwroot/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.

  1. 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.

  1. Öppna layout/theme.liquid via 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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.

  1. 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>

Redo när du är.

Skapa en agent, kopiera kodsnutten och du är igång.

Kom igång med Atria