npm.io
0.6.3 • Published 3d ago

@asiri-ng/elements

Licence
Apache-2.0
Version
0.6.3
Deps
0
Size
61.2 MB
Vulns
0
Weekly
0

@asiri-ng/elements

Asiri embeddable web components — framework-agnostic, dependency-free.

Component Status Tag
Consent banner Available <asiri-consent>
Trust badge Available <asiri-trust-badge>
DSR (Data Subject Request) Available <asiri-dsr>
Trust access request Available <asiri-trust-access>
Trust subscribe Available <asiri-trust-subscribe>

npm install is the recommended way to integrate every component: your lockfile pins the exact version, updates arrive through your normal dependency workflow, bundlers tree-shake unused components, and there is no CDN script or SRI hash to maintain. Use the plain <script> tag only when you cannot run a build step (e.g. WordPress or Google Tag Manager).

pnpm add @asiri-ng/elements

Import the consent component (self-registers the asiri-consent custom element):

import '@asiri-ng/elements/consent';

Or import everything (registers all available components):

import '@asiri-ng/elements';

Place the element in your markup:

<asiri-consent notice-id="YOUR_NOTICE_ID"></asiri-consent>

Programmatic mount

import { mountAsiriConsent } from '@asiri-ng/elements/consent';

mountAsiriConsent({ noticeId: 'YOUR_NOTICE_ID' });

Plain <script> tag (no build)

Consent component only:

<script
  src="https://cdn.jsdelivr.net/npm/@asiri-ng/elements@0.6.3/dist/consent.global.js"
  integrity="sha384-REPLACE_WITH_HASH_FROM_NPM_PUBLISH"
  crossorigin="anonymous"
></script>
<asiri-consent notice-id="YOUR_NOTICE_ID"></asiri-consent>

All components (consent + future additions):

<script
  src="https://cdn.jsdelivr.net/npm/@asiri-ng/elements@0.6.3/dist/elements.global.js"
  integrity="sha384-REPLACE_WITH_HASH_FROM_NPM_PUBLISH"
  crossorigin="anonymous"
></script>
<asiri-consent notice-id="YOUR_NOTICE_ID"></asiri-consent>

Always pin the version and include integrity/crossorigin for Subresource Integrity (SRI) protection. Generate the hash after publishing:

curl -sL https://cdn.jsdelivr.net/npm/@asiri-ng/elements@0.6.3/dist/consent.global.js \
  | openssl dgst -sha384 -binary | openssl base64 -A | sed 's/^/sha384-/'

Gating API

window.AsiriConsent.onDecision(({ purposes }) => {
  if (purposes['analytics']) startAnalytics();
});
// or listen to DOM events:
document.addEventListener('asiri-consent', (e) => console.log(e.detail));
window.AsiriConsent methods
Method Returns Description
get() ConsentState | null Current decision, or null before any decision.
onDecision(cb) () => void Subscribe to decisions; fires immediately if already decided. Returns an unsubscribe function.
open() void Re-open the preferences panel.
<asiri-consent> attributes
Attribute Required Default Description
notice-id Yes Your published consent notice ID.
api-base No https://api.asiri.ng Override the API base URL (e.g. staging).
CSS custom properties (design tokens)

The banner ships with a neutral light look. Every colour, radius, shadow, and font is exposed as a --asiri-consent-* custom property that pierces the shadow boundary, so you can restyle it from your page CSS without forking the component:

asiri-consent {
  /* surfaces */
  --asiri-consent-bg: #ffffff; /* banner + panel background */
  --asiri-consent-bg-2: #f7f4ef; /* purpose rows in the preferences panel */
  --asiri-consent-border: #d9dde7;
  --asiri-consent-radius: 16px;
  --asiri-consent-shadow: 0 12px 40px rgba(20, 23, 43, 0.18);
  /* text */
  --asiri-consent-text: #14172b;
  --asiri-consent-muted: #4b5163;
  --asiri-consent-font: -apple-system, sans-serif;
  /* actions */
  --asiri-consent-primary-bg: #19203f; /* Accept all / Save choices */
  --asiri-consent-primary-fg: #f7f3ec;
  --asiri-consent-outline-border: #19203f; /* Reject non-essential */
  --asiri-consent-outline-fg: #19203f;
  --asiri-consent-ghost-fg: #4b5163; /* Customize */
  /* controls */
  --asiri-consent-accent: #19203f; /* toggle "on" state */
  --asiri-consent-toggle-off: #d9dde7;
  --asiri-consent-pill-bg: #f4ead2; /* "Required" pill */
  --asiri-consent-pill-fg: #854a00;
}

Dark-site example (only override what you need):

asiri-consent {
  --asiri-consent-bg: #141d36;
  --asiri-consent-text: #eef2fc;
  --asiri-consent-muted: #7d8db4;
  --asiri-consent-border: #2c3757;
  --asiri-consent-bg-2: #232c44;
  --asiri-consent-primary-bg: #f5c542;
  --asiri-consent-primary-fg: #070b16;
  --asiri-consent-outline-fg: #eef2fc;
  --asiri-consent-accent: #f5c542;
}
::part() selectors

For styling beyond the design tokens, the following shadow parts are exposed:

banner, title, description, actions, button, accept, reject, customize, panel, panel-title, panel-description, purposes, purpose, toggle, panel-footer, save.

asiri-consent::part(banner) {
  backdrop-filter: blur(8px);
}
asiri-consent::part(button accept) {
  text-transform: uppercase;
}
Troubleshooting

If the configured notice cannot be loaded (unpublished, deleted, or wrong api-base), the banner still renders with generic copy so visitors are never blocked — but consent decisions are not recorded, and the component logs a [asiri-consent] warning to the console explaining why. Treat that warning as a deploy blocker.


Trust badge

Quick start — no build required
<script
  async
  src="https://cdn.jsdelivr.net/npm/@asiri-ng/elements@0.6.3/dist/trust-badge.global.js"
  integrity="sha384-REPLACE_WITH_HASH_FROM_NPM_PUBLISH"
  crossorigin="anonymous"
></script>
<asiri-trust-badge tenant="YOUR_TENANT_SLUG"></asiri-trust-badge>
Install via npm
import '@asiri-ng/elements/trust-badge';

Place the element in your markup:

<asiri-trust-badge tenant="YOUR_TENANT_SLUG"></asiri-trust-badge>
Programmatic mount
import { mountAsiriTrustBadge } from '@asiri-ng/elements/trust-badge';

mountAsiriTrustBadge({
  tenant: 'YOUR_TENANT_SLUG',
});
<asiri-trust-badge> attributes
Attribute Required Default Description
tenant Yes Your tenant slug (used to load the public trust widget).
api-base No https://api.asiri.ng Override the API base URL (e.g. staging).
variant No compact Backwards-compatible no-op. The element always renders badge-only.
design No saved app setting Badge artwork: option-1 through option-10. Overrides the saved Trust Center setting when present.
theme No light Backwards-compatible no-op for older snippets.
accent No #C58A2A Focus-ring accent colour (CSS colour value).
radius No lg Backwards-compatible no-op for older snippets.
size No md Backwards-compatible no-op for older snippets.
position No bottom-right Backwards-compatible no-op for older snippets.
show-frameworks No true Backwards-compatible no-op for older snippets.
show-updated No true Backwards-compatible no-op for older snippets.
show-powered-by No true Backwards-compatible no-op for older snippets.
locale No browser default Backwards-compatible no-op for older snippets.
trust-url No https://asiri.ng/trust/{tenant} Override the Trust Center link URL.

The api-base override is intended for Asiri production, Asiri staging, and localhost development. Badge attestation verification only trusts JWKS from https://api.asiri.ng, https://api.staging.asiri.ng, or localhost when the embedding page is also local.

CSS custom properties

The badge artwork is bundled into the package as transparent PNG data, so npm and CDN installs do not need separate asset hosting. The element renders only the selected badge image inside a link to the Trust Center. If design is omitted, the element uses the tenant's saved badge design from Settings → Trust Center → Website badge and updates after the public widget cache refreshes. Use design only when you want a specific website install to stay pinned to one badge artwork.

All design tokens are exposed on :host so you can override them from outside:

asiri-trust-badge {
  --asiri-tb-accent: #7c3aed;
  --asiri-tb-radius: 8px;
}
::part() selectors

The following shadow parts are exposed for targeted styling:

mark, cta, badge-image.


DSR (Data Subject Request)

Allow your users to submit privacy requests (access, erasure, rectification, portability, restriction, objection) directly from your product.

Quick start — no build required
<script
  async
  src="https://cdn.jsdelivr.net/npm/@asiri-ng/elements@0.6.3/dist/dsr.global.js"
></script>
<asiri-dsr tenant="YOUR_TENANT_SLUG"></asiri-dsr>
Install via npm
import '@asiri-ng/elements/dsr';

Place the element in your markup:

<asiri-dsr tenant="YOUR_TENANT_SLUG" variant="button" theme="auto"></asiri-dsr>
Programmatic mount
import { mountAsiriDsr } from '@asiri-ng/elements/dsr';

mountAsiriDsr({ tenant: 'YOUR_TENANT_SLUG', variant: 'inline', theme: 'auto' });
<asiri-dsr> attributes
Attribute Required Default Description
tenant Yes Your tenant slug.
api-base No https://api.asiri.ng Override the API base URL (e.g. staging).
variant No button Layout: button (trigger → modal), inline, floating (fixed).
theme No light Colour mode: light, dark, auto.
accent No #142044 Brand accent colour (CSS colour value).
radius No md Corner radius: sm, md, lg, pill.
size No md Relative size: sm, md, lg.
position No bottom-right Floating variant position: bottom-left/right, top-left/right.
label No Privacy request Trigger button text.
locale No browser default BCP 47 locale (reserved for future use).
turnstile-site-key No Cloudflare Turnstile site key — enables captcha on the form.
CSS custom properties (design tokens)

All tokens are exposed on :host so you can override from outside:

asiri-dsr {
  --asiri-dsr-accent: #7c3aed;
  --asiri-dsr-radius: 8px;
  --asiri-dsr-bg: #ffffff;
  --asiri-dsr-bg-2: #f8fafc;
  --asiri-dsr-text: #101322;
  --asiri-dsr-muted: #647084;
  --asiri-dsr-border: #dfe4ee;
  --asiri-dsr-shadow: 0 22px 64px rgba(16, 24, 40, 0.14);
  --asiri-dsr-danger: #c0392b;
  --asiri-dsr-success: #2f9b63;
  --asiri-dsr-font: Inter, sans-serif;
}

Token precedence: accent / radius attributes take priority over CSS token overrides, which take priority over built-in defaults. Only set them if explicitly provided by the consumer.

::part() selectors

trigger, float-button, dialog, backdrop, header, form, field, label, input, select, textarea, submit, cancel, success, error, close.

Captcha (Turnstile)

When turnstile-site-key is set the component lazily injects the Cloudflare Turnstile script and renders the challenge widget inside the form. The resulting token is sent as captchaToken in the POST body. If the attribute is omitted the form submits without a token.


Trust access request

Let prospects request access to gated resources (SOC 2 report, security questionnaire, sandbox) straight from your Trust Center. Renders a button that opens a modal email-capture form (or an inline form).

Quick start — no build required
<script
  async
  src="https://cdn.jsdelivr.net/npm/@asiri-ng/elements@0.6.3/dist/trust-access.global.js"
></script>
<asiri-trust-access tenant="YOUR_TENANT_SLUG"></asiri-trust-access>
Install via npm
import '@asiri-ng/elements/trust-access';
<asiri-trust-access tenant="YOUR_TENANT_SLUG" variant="button" theme="auto"></asiri-trust-access>
Programmatic mount
import { mountAsiriTrustAccess } from '@asiri-ng/elements/trust-access';

mountAsiriTrustAccess({ tenant: 'YOUR_TENANT_SLUG', variant: 'inline', theme: 'auto' });
<asiri-trust-access> attributes
Attribute Required Default Description
tenant Yes Your tenant slug.
api-base No https://api.asiri.ng Override the API base URL (e.g. staging).
variant No button Layout: button (trigger → modal) or inline.
label No Request access Trigger button text.
resource-id No Identifier of the gated resource being requested.
theme No light Colour mode: light, dark, auto.
accent No #142044 Brand accent colour (CSS colour value).
radius No md Corner radius: sm, md, lg, pill.
size No md Relative size: sm, md, lg.
locale No browser default BCP 47 locale (reserved for future use).
turnstile-site-key No Cloudflare Turnstile site key — enables captcha on the form.

Form fields: email (required), name (optional), company (optional), message (required).

CSS custom properties (design tokens)
asiri-trust-access {
  --asiri-ta-accent: #7c3aed;
  --asiri-ta-radius: 8px;
  --asiri-ta-bg: #ffffff;
  --asiri-ta-bg-2: #f8fafc;
  --asiri-ta-text: #101322;
  --asiri-ta-muted: #647084;
  --asiri-ta-border: #dfe4ee;
  --asiri-ta-shadow: 0 22px 64px rgba(16, 24, 40, 0.14);
  --asiri-ta-danger: #c0392b;
  --asiri-ta-success: #2f9b63;
  --asiri-ta-font: Inter, sans-serif;
}

Token precedence: accent / radius attributes beat CSS token overrides, which beat built-in defaults.

::part() selectors

trigger, dialog, backdrop, header, form, field, label, input, textarea, submit, cancel, success, error, close.


Trust subscribe

Capture emails for security/compliance update notifications from your Trust Center. Renders a button that opens a modal email-capture form (or an inline form).

Quick start — no build required
<script
  async
  src="https://cdn.jsdelivr.net/npm/@asiri-ng/elements@0.6.3/dist/trust-subscribe.global.js"
></script>
<asiri-trust-subscribe tenant="YOUR_TENANT_SLUG"></asiri-trust-subscribe>
Install via npm
import '@asiri-ng/elements/trust-subscribe';
<asiri-trust-subscribe
  tenant="YOUR_TENANT_SLUG"
  variant="button"
  theme="auto"
></asiri-trust-subscribe>
Programmatic mount
import { mountAsiriTrustSubscribe } from '@asiri-ng/elements/trust-subscribe';

mountAsiriTrustSubscribe({ tenant: 'YOUR_TENANT_SLUG', variant: 'inline', theme: 'auto' });
<asiri-trust-subscribe> attributes
Attribute Required Default Description
tenant Yes Your tenant slug.
api-base No https://api.asiri.ng Override the API base URL (e.g. staging).
variant No button Layout: button (trigger → modal) or inline.
label No Subscribe to updates Trigger button text.
segment No Subscription segment / list identifier.
theme No light Colour mode: light, dark, auto.
accent No #142044 Brand accent colour (CSS colour value).
radius No md Corner radius: sm, md, lg, pill.
size No md Relative size: sm, md, lg.
locale No browser default BCP 47 locale (reserved for future use).
turnstile-site-key No Cloudflare Turnstile site key — enables captcha on the form.

Form fields: email (required), name (optional), company (optional).

CSS custom properties (design tokens)
asiri-trust-subscribe {
  --asiri-ts-accent: #7c3aed;
  --asiri-ts-radius: 8px;
  --asiri-ts-bg: #ffffff;
  --asiri-ts-bg-2: #f8fafc;
  --asiri-ts-text: #101322;
  --asiri-ts-muted: #647084;
  --asiri-ts-border: #dfe4ee;
  --asiri-ts-shadow: 0 22px 64px rgba(16, 24, 40, 0.14);
  --asiri-ts-danger: #c0392b;
  --asiri-ts-success: #2f9b63;
  --asiri-ts-font: Inter, sans-serif;
}

Token precedence: accent / radius attributes beat CSS token overrides, which beat built-in defaults.

::part() selectors

trigger, dialog, backdrop, header, form, field, label, input, submit, cancel, success, error, close.