Vue
Vue components and composables for verification flows
Installation
npm install @aho-sdk/components-vue
Quick Start
Install the Vue SDK:
npm install @aho-sdk/components-vue
Import and use the components:
<script setup lang="ts">
import { AhoProvider, CredentialButton, Claim } from '@aho-sdk/components-vue';
const config = { publishableKey: 'aho_pub_xxx' };
</script>
<template>
<AhoProvider :config="config">
<CredentialButton
:claims="[Claim.AGE_OVER_21]"
<CredentialButton
:claims="[Claim.GIVEN_NAME, Claim.FAMILY_NAME, Claim.AGE_OVER_21]"
Examples
Basic Usage
Simple age verification with a single claim.
import { createApp, h, ref } from 'vue';
import { AhoProvider, CredentialButton, Claim } from '@aho-sdk/components-vue';
const BasicDemo = {
setup() {
return () => (
<AhoProvider config={{ publishableKey: 'aho_pub_xxx', nonce: '...' }}>
<CredentialButton
claims={[Claim.AGE_OVER_21]}
onVerified={(result) => console.log('Verified:', result)}
>
Verify Age
</CredentialButton>
</AhoProvider>
);
}
};
createApp(BasicDemo).mount('#vue-basic-demo');
Custom Styling
Customize button appearance with CSS custom properties.
import { createApp, h } from 'vue';
import { AhoProvider, CredentialButton, Claim } from '@aho-sdk/components-vue';
const StyledDemo = {
setup() {
return () => (
<AhoProvider config={{ publishableKey: 'aho_pub_xxx', nonce: '...' }}>
<CredentialButton
claims={[Claim.GIVEN_NAME, Claim.FAMILY_NAME]}
class="custom-button"
onVerified={(result) => console.log('Verified:', result)}
>
Verify Identity
</CredentialButton>
</AhoProvider>
);
}
};
createApp(StyledDemo).mount('#vue-styled-demo');
.custom-button {
--aho-button-bg: #059669;
--aho-button-bg-hover: #047857;
--aho-button-radius: 9999px;
}
Event Handling
Handle verification lifecycle with callbacks.
import { createApp, h, ref } from 'vue';
import { AhoProvider, CredentialButton, Claim } from '@aho-sdk/components-vue';
const EventsDemo = {
setup() {
const log = ref('Click button to see events...');
const addLog = (msg) => { log.value += '\n' + new Date().toISOString().substr(11, 12) + ' ' + msg; };
return () => (
<AhoProvider config={{ publishableKey: 'aho_pub_xxx', nonce: '...' }}>
<CredentialButton
claims={[Claim.AGE_OVER_18]}
onVerified={(result) => addLog('verified: ' + JSON.stringify({ verified: result.verified }))}
onError={(error) => addLog('error: ' + error.message)}
>
Verify (Watch Events)
</CredentialButton>
<pre class="mt-4 bg-gray-900 text-gray-100 p-4 rounded-lg text-sm overflow-auto max-h-40">{log.value}</pre>
</AhoProvider>
);
}
};
createApp(EventsDemo).mount('#vue-events-demo');
Credential Display
After verification, display the credential card automatically.
import { createApp, h, ref } from 'vue';
import { AhoProvider, CredentialButton, CredentialDisplay, ALL_CLAIMS } from '@aho-sdk/components-vue';
const DisplayDemo = {
setup() {
const renderUrl = ref(null);
return () => (
<AhoProvider config={{ publishableKey: 'aho_pub_xxx', nonce: '...' }}>
<CredentialButton
claims={ALL_CLAIMS}
onVerified={(result) => { renderUrl.value = result.renderUrl; }}
>
Verify Identity
</CredentialButton>
{renderUrl.value && (
<div class="mt-4">
<p class="text-green-600 font-medium mb-2">Verification successful!</p>
<CredentialDisplay src={renderUrl.value} enableDownload />
</div>
)}
</AhoProvider>
);
}
};
createApp(DisplayDemo).mount('#vue-display-demo');
Display Size Variants
Display credentials in compact (280px), default (400px), or large (600px) max-widths.
import { createApp, h } from 'vue';
import { CredentialDisplay } from '@aho-sdk/components-vue';
const compactData = compactData;
const defaultData = defaultData;
const largeData = largeData;
const SizesDemo = {
setup() {
return () => (
<div class="space-y-6">
<div>
<p class="text-sm font-medium text-gray-500 mb-2">Compact (max-width: 280px)</p>
<CredentialDisplay size="compact" data={compactData} nonce="..." />
</div>
<div>
<p class="text-sm font-medium text-gray-500 mb-2">Default (max-width: 400px)</p>
<CredentialDisplay data={defaultData} nonce="..." />
</div>
<div>
<p class="text-sm font-medium text-gray-500 mb-2">Large (max-width: 600px)</p>
<CredentialDisplay size="large" data={largeData} nonce="..." />
</div>
</div>
);
}
};
createApp(SizesDemo).mount('#vue-sizes-demo');
Display Styling
Customize display appearance with CSS custom properties.
import { createApp, h } from 'vue';
import { CredentialDisplay } from '@aho-sdk/components-vue';
const styledData = styledData;
const StyledDisplayDemo = {
setup() {
return () => <CredentialDisplay data={styledData} class="custom-display" nonce="..." />;
}
};
createApp(StyledDisplayDemo).mount('#vue-styled-display-demo');
.custom-display {
--aho-display-bg: #1f2937;
--aho-display-border: 2px solid #4ade80;
--aho-display-radius: 1rem;
}
Display Events
Handle display lifecycle with callbacks.
<CredentialDisplay
:src="renderUrl"
API Reference
<CredentialButton>
A Vue component that initiates the credential verification flow.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
publishableKey |
string | — | Publishable key (aho_pub_xxx). Required unless set via configure() or AhoProvider. |
claims |
string | string[] | — | Claims to request. Comma-separated string or array. Use 'all' for all claims. |
returnClaims |
boolean | 'all' | string[] | true | Which claims to return in the result. true=all requested, false=none, 'all'=all, array=specific claims. Must be subset of claims. |
documentTypes |
string | string[] | all | Accepted document types (e.g., 'mDL', 'passport'). Defaults to all. |
clientName |
string | — | Display name shown in wallet dialog. |
baseUrl |
string | https://api.aho.com | API base URL. Defaults to production. |
unsupported |
'hide' | 'disable' | 'fallback' | disable | Behavior when browser doesn't support Digital Credentials API. |
disabled |
boolean | false | Disable the button. |
Emits
| Event | Type | Description |
|---|---|---|
@verified |
(result: VerifyResult) | Emitted when verification succeeds |
@error |
(error: Error) | Emitted when verification fails |
@state-change |
(state: VerifyState) | Emitted when state changes |
Slots
| Slot | Description |
|---|---|
default |
Button content (default: "Verify Credential") |
#loading |
Content shown while verifying |
#success |
Content shown on success |
#error |
Content shown on error |
#unsupported |
Content shown when browser unsupported |
<CredentialDisplay>
A Vue component that displays a rendered credential.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
src |
string | — | URL to fetch rendered credential from. |
data |
string | object | — | Pre-fetched render response. JSON string (web) or object (React/Vue). |
size |
'compact' | 'default' | 'large' | default | Display size variant. Controls max-width. |
enableDownload |
boolean | false | Show download button on hover. |
loadingText |
string | Loading... | Text shown while loading. |
errorText |
string | Failed to load credential | Text shown on error. |
verifyAuthenticity |
boolean | false | Verify credential authenticity and show trust indicator with link to verification page. |
Emits
| Event | Type | Description |
|---|---|---|
@loaded |
(format: string, templateKey?: string) | Emitted when content loads |
@error |
(error: Error) | Emitted when loading fails |
@download |
(format: string, filename: string) | Emitted when download triggered |
AhoPlugin
Vue plugin for configuration.
Config Options
| Property | Type | Description |
|---|---|---|
publishableKey
*
|
string | Publishable key (aho_pub_xxx) |
baseUrl
|
string | Override API base URL |
nonce
|
string | CSP nonce for child components |