iGrant.io use-case UI (default look and feel)
When to use
The default chrome for any iGrant.io frontend (igrantio-issuer-frontend,
igrantio-verifier-frontend, or a bespoke use-case UI). Reach for it whenever
the user has not specified their own UI or layout. It gives you the iGrant.io
navbar, footer, theme, and a small set of primitives so a flow looks on-brand
with zero design work. If the user brings their own design system, skip this.
Intentionally minimal: a theme, a shell, a few primitives, strings-driven i18n.
No component-library sprawl, and no runtime deps beyond what
igrantio-frontend-client already uses (React peer plus qrcode).
Before you build: run the integrator intake in igrantio-ows-overview - environment, API key, tenancy, backend host, webhooks, frontend - one question at a time, a recommended default with each.
What it provides (references/)
assets/ - vendored brand assets: iGrant_210_55_BW.svg (the white
iGrant.io logo) and whatsapp.png.
ui/theme.css - the single source of truth for every token and
use-case style, at exact iGrant.io values: typography (Plus Jakarta Sans
body, Byrd headings - copy the woff2 files from an iGrant.io
deployment's /assets/fonts/ into ui/fonts/, otherwise it falls back to
Plus Jakarta Sans), palette, buttons, split layout, stepper cards with the
offset-shadow number box, heading scale, content card, step navigation,
form fields, QR box, status stages, and the navbar/footer chrome. Read the
file for the numbers; do not invent new ones.
ui/Header.tsx and ui/Footer.tsx - a 1:1 port of the landing-page
Navbar.astro and Footer.astro (navbar 5.4375rem = 87px, logo 3.4375rem =
55px, black #000 bar, nav links 16px with 0.125rem letter-spacing and
carets, bordered language <select>, rounded 1.25rem Demo CTA; footer with
copyright, ISO/IEC 27001 badge, social icons with #464646 divider borders,
legal links, and the mobile WhatsApp float). Values reused from the source,
not invented.
ui/AppShell.tsx - the default page frame: ` {children}
ui/primitives.tsx - small styled building blocks only: SplitLayout,
Stepper / Step (number box, tick, active card), ContentCard,
StepNav, Panel, Field, Button (primary / secondary / ghost),
QrBox, StatusStage. Nothing beyond these.
ui/strings.ts - a typed UiStrings object plus the default English
en. All visible chrome text (and the nav/social/legal links) lives here; to
localize, spread en and override.
Reference layout (vendor into your app)
Copy ./references/ui into your app at src/ui/ and
./references/assets into src/assets/ (Header/Footer
import the logo and WhatsApp icon from ../assets).
ui/
theme.css AppShell.tsx Header.tsx Footer.tsx
primitives.tsx strings.ts index.ts assets.d.ts
assets/
iGrant_210_55_BW.svg whatsapp.png
Usage
import { AppShell, SplitLayout, Stepper, Step, ContentCard, StepNav, Button, QrBox, StatusStage } from "./ui";
<AppShell>
<SplitLayout
sidebar={
<Stepper>
<Step number={1} title="Request" done />
<Step number={2} title="Scan QR" detail="Use your EUDI Wallet" active />
<Step number={3} title="Issued" />
</Stepper>
}
>
<ContentCard>
<h2>Scan the QR code</h2>
<QrBox><img src={qrDataUri} alt="Scan to continue" /></QrBox>
<StatusStage tone="success" actions={<Button variant="primary">Done</Button>}>
Credential accepted.
</StatusStage>
<StepNav back={<Button>Back</Button>} next={<Button variant="primary">Next</Button>} />
</ContentCard>
</SplitLayout>
</AppShell>
Localize by passing your own strings:
import { AppShell, en } from "./ui";
const sv = { ...en, langLabel: "Valj sprak", demo: { label: "Demo", href: "/demo" } };
<AppShell strings={sv} header={{ languages: [{ code: "en", label: "English" }, { code: "sv", label: "Svenska" }] }} />
Composition
- Pairs with
igrantio-frontend-client: render its QrCode inside QrBox, and
drive Step/StatusStage from the SSE status of useIssuance /
useVerification.
igrantio-issuer-frontend and igrantio-verifier-frontend use this shell by
default for their demo components.
Clean-code notes
- One concern per file: tokens/layout in
theme.css, chrome in Header/Footer,
reusable bits in primitives.tsx, all text in strings.ts.
- No component library, no CSS framework, no new npm runtime deps.
- Exact navbar/footer values come from the landing page; do not invent new ones.
Validation / done criteria
cd references && npm install && npm run typecheck passes.
- The logo is the real white
iGrant_210_55_BW.svg; palette and dimensions
match the landing page.
1---2name: igrantio-usecase-ui3description: Default iGrant.io look and feel for EUDI Wallet (EUDIW) and European Business Wallet (EUBW) use-case frontends, ported at exact values from the iGrant.io use-case SDK and landing page: design tokens, Byrd + Plus Jakarta Sans typography, split layout with sticky stepper cards, uppercase buttons, content card, QR box, status stages, page shell, and strings-driven i18n. Used by default when the user has not specified their own UI or layout.4license: Apache-2.05---67# iGrant.io use-case UI (default look and feel)89## When to use10The default chrome for any iGrant.io frontend (`igrantio-issuer-frontend`,11`igrantio-verifier-frontend`, or a bespoke use-case UI). Reach for it whenever12the user has not specified their own UI or layout. It gives you the iGrant.io13navbar, footer, theme, and a small set of primitives so a flow looks on-brand14with zero design work. If the user brings their own design system, skip this.1516Intentionally minimal: a theme, a shell, a few primitives, strings-driven i18n.17No component-library sprawl, and no runtime deps beyond what18`igrantio-frontend-client` already uses (React peer plus `qrcode`).1920**Before you build**: run the integrator intake in `igrantio-ows-overview` - environment, API key, tenancy, backend host, webhooks, frontend - one question at a time, a recommended default with each.2122## What it provides (`references/`)23- **`assets/`** - vendored brand assets: `iGrant_210_55_BW.svg` (the white24 iGrant.io logo) and `whatsapp.png`.25- **`ui/theme.css`** - the single source of truth for every token and26 use-case style, at exact iGrant.io values: typography (Plus Jakarta Sans27 body, **Byrd** headings - copy the woff2 files from an iGrant.io28 deployment's `/assets/fonts/` into `ui/fonts/`, otherwise it falls back to29 Plus Jakarta Sans), palette, buttons, split layout, stepper cards with the30 offset-shadow number box, heading scale, content card, step navigation,31 form fields, QR box, status stages, and the navbar/footer chrome. Read the32 file for the numbers; do not invent new ones.33- **`ui/Header.tsx`** and **`ui/Footer.tsx`** - a 1:1 port of the landing-page34 `Navbar.astro` and `Footer.astro` (navbar 5.4375rem = 87px, logo 3.4375rem =35 55px, black `#000` bar, nav links 16px with 0.125rem letter-spacing and36 carets, bordered language `<select>`, rounded 1.25rem Demo CTA; footer with37 copyright, ISO/IEC 27001 badge, social icons with `#464646` divider borders,38 legal links, and the mobile WhatsApp float). Values reused from the source,39 not invented.40- **`ui/AppShell.tsx`** - the default page frame: `<Header/> {children}41 <Footer/>` plus the theme. Consumers wrap a flow in this.42- **`ui/primitives.tsx`** - small styled building blocks only: `SplitLayout`,43 `Stepper` / `Step` (number box, tick, active card), `ContentCard`,44 `StepNav`, `Panel`, `Field`, `Button` (`primary` / `secondary` / `ghost`),45 `QrBox`, `StatusStage`. Nothing beyond these.46- **`ui/strings.ts`** - a typed `UiStrings` object plus the default English47 `en`. All visible chrome text (and the nav/social/legal links) lives here; to48 localize, spread `en` and override.4950## Reference layout (vendor into your app)51Copy [`./references/ui`](./references/ui) into your app at `src/ui/` and52[`./references/assets`](./references/assets) into `src/assets/` (Header/Footer53import the logo and WhatsApp icon from `../assets`).54```55ui/56 theme.css AppShell.tsx Header.tsx Footer.tsx57 primitives.tsx strings.ts index.ts assets.d.ts58assets/59 iGrant_210_55_BW.svg whatsapp.png60```6162## Usage63```tsx64import { AppShell, SplitLayout, Stepper, Step, ContentCard, StepNav, Button, QrBox, StatusStage } from "./ui";6566<AppShell>67 <SplitLayout68 sidebar={69 <Stepper>70 <Step number={1} title="Request" done />71 <Step number={2} title="Scan QR" detail="Use your EUDI Wallet" active />72 <Step number={3} title="Issued" />73 </Stepper>74 }75 >76 <ContentCard>77 <h2>Scan the QR code</h2>78 <QrBox><img src={qrDataUri} alt="Scan to continue" /></QrBox>79 <StatusStage tone="success" actions={<Button variant="primary">Done</Button>}>80 Credential accepted.81 </StatusStage>82 <StepNav back={<Button>Back</Button>} next={<Button variant="primary">Next</Button>} />83 </ContentCard>84 </SplitLayout>85</AppShell>86```8788Localize by passing your own strings:89```tsx90import { AppShell, en } from "./ui";9192const sv = { ...en, langLabel: "Valj sprak", demo: { label: "Demo", href: "/demo" } };93<AppShell strings={sv} header={{ languages: [{ code: "en", label: "English" }, { code: "sv", label: "Svenska" }] }} />94```9596## Composition97- Pairs with `igrantio-frontend-client`: render its `QrCode` inside `QrBox`, and98 drive `Step`/`StatusStage` from the SSE status of `useIssuance` /99 `useVerification`.100- `igrantio-issuer-frontend` and `igrantio-verifier-frontend` use this shell by101 default for their demo components.102103## Clean-code notes104- One concern per file: tokens/layout in `theme.css`, chrome in Header/Footer,105 reusable bits in `primitives.tsx`, all text in `strings.ts`.106- No component library, no CSS framework, no new npm runtime deps.107- Exact navbar/footer values come from the landing page; do not invent new ones.108109## Validation / done criteria110- `cd references && npm install && npm run typecheck` passes.111- The logo is the real white `iGrant_210_55_BW.svg`; palette and dimensions112 match the landing page.