Svelte

Use the <audit-trail> custom element from @everscribe/components-element to embed the audit-trail UI in a Svelte app. The element registers itself as <audit-trail> on import — drop the tag into a .svelte component and you're done.

Source: packages/element

Install

npm install @everscribe/components-element @everscribe/components-styles

The element registers itself globally on import (idempotent — safe to import in multiple modules). The styles package ships the default CSS theme — install it alongside.

Quickstart

<script>
    import "@everscribe/components-element";
    import "@everscribe/components-styles/default.css";
</script>

<audit-trail token-endpoint="/api/embed-token"
             on:audit-trail-error={(e) => console.error(e.detail.error)} />

token-endpoint is a route on your server (not Everscribe's) that returns { token }. The element fetches it on mount, holds it in memory, and re-fetches on 401. Your project API key never touches the browser. See Overview → Minting tokens for the backend side.

If you have a token already, pass it directly:

<audit-trail token={token} token-endpoint="/api/embed-token" />

Pass token-endpoint alongside token so refresh on 401 still works.

Custom auth header on the token fetch

The built-in tokenEndpoint fetcher only sends credentials: 'include' — no custom headers. If your token endpoint needs an extra header (a CSRF token, a tenant identifier, an OAuth bearer), use the JS-only onTokenExpired property via bind:this:

<script>
    import "@everscribe/components-element";
    import { onMount } from "svelte";

    export let currentUser;
    let el;

    onMount(() => {
        el.onTokenExpired = async () => {
            const res = await fetch("/api/embed-token", {
                credentials: "include",
                headers: { "X-Tenant": currentUser.tenantId },
            });
            const { token } = await res.json();
            return token;
        };
    });
</script>

<audit-trail bind:this={el} />

onTokenExpired is invoked both for the initial token fetch (when token attribute is unset) and on every 401 refresh.

Attributes

At least one of token, token-endpoint, or the JS-only onTokenExpired property is required.

Attribute Type Default Notes
token string Embed JWT. If omitted, the element fetches one via token-endpoint/onTokenExpired on mount.
token-endpoint string URL on your backend returning { token }. Used for the initial fetch and for refresh on 401. Sent with credentials: 'include'.
api-base string https://api.everscribe.io/v1/embed Base URL for read endpoints. Override for local dev or self-hosted.
page-size number 25 Events per page.
poll-interval number 5000 Poll cadence in ms. <= 0 disables polling. Below 1000 is clamped with a console.warn.
theme light | dark light Switches the CSS-variable theme.
default-time-range 24h | 7d | 30d | all all Initial time-range preset (read at mount only).

Style and class come from the standard class and style attributes. The element renders into its own light DOM, so the CSS from @everscribe/components-styles/default.css applies the same way it does for the React component.

Properties and methods (JS only)

These can't be expressed as attributes; set them on the element directly via JS.

Property Type Notes
onTokenExpired () => Promise<string> Custom token-fetch callback. Takes precedence over token-endpoint.
refresh() () => void Public method. Triggers a full re-bootstrap (fresh token fetch + fresh stores).

Events

Event detail Notes
audit-trail-error { error: Error } Bubbles. Fired on fetch errors that surface from the events store (network, server, expired token after the refresh chain is exhausted).
<audit-trail on:audit-trail-error={(e) => track("audit_error", e.detail.error)} />

Persistence

Column visibility and filter state persist to localStorage automatically and restore on reload. Same keys and behavior as the React adapter — they're shared between adapters, so customers using both under the same origin share state cleanly.

Vue, Solid, Angular

The same @everscribe/components-element package works in Vue, Solid, and Angular without changes. See Vanilla JS for the framework-free reference; the only thing that changes between frameworks is event-listener syntax.

What next

  • Overview — token model, refresh chain, claim-driven UI, rate limits
  • Styles — theming via CSS variables
  • Vanilla JS — the same custom element, plain HTML