Loading theme toggle
Namespaced · Access-controlled · Enterprise-ready

The ComponentRegistry

Layered, namespaced UI primitives for modern South African digital products. Built on React and Tailwind, distributed via the shadcn registry — scoped per client, secured per token.

Browse Components

Then install any component

npx shadcn@latest add @keystonecore/spinner
Architecture

Three layers. One registry.

A clean dependency direction — internal and client depend on core. Core never depends on either. Access is enforced per bearer token at the API gateway.

The core layer

Reusable, brand-agnostic primitives safe to ship as product IP. Generic enough for any client to consume — buttons, dialogs, data tables, layout shells, auth patterns.

Example registry names

  • core/button
  • core/spinner
  • core/data-table
  • core/site-header
  • core/account-menu

Choose your scope

Each scope maps to a different namespace. Install scripts configure your components.json registry entry automatically — the right URL, the right alias, one command.

@keystonecore Restricted

Keystone Core components

1 · Setup registry

2 · Install components

@visitza Restricted

Visitza components

1 · Setup registry

2 · Install components

Building for a new client? Get in touch to provision a scoped registry and bearer token.

Components

70

Interactive UI primitives with variant support

Spinner

v1.0.0

A phase-aware loading spinner that transitions through loading → filling → complete states, optionally revealing the South African flag on completion.

View docs

Icon Button

v1.0.0

Minimal rounded icon-button primitive with overlay, ghost, and outline variants. Base component for SaveButton, ShareButton, and RecordButton.

View docs

Save Button

v1.0.0

A reusable heart-toggle save button with overlay, ghost, and outline variants.

View docs

Share Button

v1.0.0

A share-action icon button with a lift-off animation on click.

View docs

Record Button

v1.0.0

A microphone-toggle record button with idle, recording, and confirmed states.

View docs

Mobile Nav

v1.0.0

A composable fixed-bottom mobile navigation bar with asChild support.

View docs

Marquee Band

v1.0.0

A composable infinite-scroll ticker strip with light and dark variants.

View docs

Product Card

v1.0.0

A composable product display card with compound sub-components.

View docs

Reveal

v1.0.0

A composable scroll-reveal primitive with shared IntersectionObserver.

View docs

Stay Card

v1.0.0

An opinionated accommodation listing card built on ProductCard.

View docs

Sheet

v1.0.0

A slide-out panel component for mobile navigation and side content.

View docs

Header Nav

v1.0.0

Composable header navigation links with animated active indicators.

View docs

Account Menu

v1.0.0

An auth-aware account dropdown with composable trigger variants.

View docs

Keystone Core Logo

v1.0.0

Geometric dual-chevron emblem for the Keystone Core brand.

View docs

Testimonial Card

v1.0.0

A composable testimonial card with star ratings, quote icon, avatar, and author details.

View docs

Chat

v1.0.0

Platform-agnostic chat UI with theme variants (default, whatsapp, imessage, slack), composable compound components, and paste-to-parse input.

View docs

Camera UI

v1.0.0

Client-only camera button and menu item components with SSR-safe capability detection.

View docs

Image Cropper

v1.0.0

A 1:1 crop dialog with zoom, pan, and circular/square guide overlay.

View docs

Photo Capture Dialog

v1.0.0

Camera capture dialog with front/back switching, capture preview, and file upload fallback.

View docs

Coordinate Pair Input

v1.0.0

Lat/lon pair capture with shared DD/DDM/DMS format toggle, inline N/S/E/W direction toggles, smart paste parser, normalized DD preview, and copy to clipboard.

View docs

Coordinate Input

v1.0.0

Coordinate input supporting DD, DDM, and DMS formats with directional toggle. Includes helpers for parsing, formatting, and clamping latitude/longitude values.

View docs

Date Range Picker

v1.0.0

Accommodation booking date-range picker with 2-month calendar, blocked dates, min/max nights, hover preview, and radio-friendly trigger.

View docs

Counter Input

v1.0.0

Accessible increment / decrement control for numeric values — designed for guest counts, bedroom selectors, and similar booking fields.

View docs

Filter Chip Group

v1.0.0

A group of toggle chips for single or multi-select filtering — property types, vibes, amenities, and similar facets.

View docs

Preference Strength Selector

v1.0.0

A three-position toggle for expressing preference strength: Required, Preferred, or Any.

View docs

Constraint Message

v1.0.0

Compact inline message for booking constraints and policy notes — neutral, info, warning, or destructive variants.

View docs

Range Input

v1.0.0

Dual min / max input for bounded numeric ranges — price per night, size, distance, and similar filters.

View docs

Search Field Shell

v1.0.0

Server-safe presentational trigger shell for compact booking search bars — consistent label, summary, and focus treatment across search controls.

View docs

Guest Picker

v1.0.0

Popover-based guest selector for accommodation booking — adults, children, infants, and pets with occupancy constraints.

View docs

Amenity Picker

v1.0.0

Chip-based amenity selector with a Command-powered overflow popover for searching the full amenity list.

View docs

Advanced Filters Panel

v1.0.0

Composable right-side Sheet panel for advanced booking filters — composable children API, scrollable body, Apply / Reset actions.

View docs

Booking Search Bar

v1.0.0

Production-ready unified accommodation search bar — destination, date range, guests, and optional advanced filters. Horizontal and stacked layouts.

View docs

Query Combobox

v1.0.0

Free-text search input with grouped autocomplete suggestions. Full ARIA combobox semantics. Shell and input variants.

View docs

Single Date Picker

v1.0.0

Calendar popover for picking a single date. ISO string value, min/max/disabled dates, shell and button trigger variants.

View docs

Party Picker

v1.0.0

Generic category-driven party composition picker. Configure any set of traveller types (adult/child/concession/bags) via PartyCategory[]. GuestPicker is the accommodation wrapper.

View docs

Slot Picker

v1.0.0

Time slot grid for slot-inventory products. Grouped by Morning/Afternoon/Evening. Handles available, limited (spots-left badge), sold-out, and closed states.

View docs

Ticket Mix Editor

v1.0.0

Per-ticket-type quantity selector with per-unit pricing and running total. Enforces min/max total quantities.

View docs

Activity Card

v1.0.0

Result card for an activity / experience / tour. Image, metadata, availability badge, rating, price, and Book CTA.

View docs

Product Option Selector

v1.0.0

Radio card group for selecting a product variant (e.g. Private / Shared / Self-guided). Full ARIA radiogroup semantics.

View docs

Availability Preview Strip

v1.0.0

Horizontal 7-day date strip with colour-coded availability dots. Used as a compact date picker in ActivityBookingSidebar.

View docs

Activity Search Bar

v1.0.0

Horizontal search bar for activity / experience / tour search. Composes QueryCombobox + SingleDatePicker + PartyPicker.

View docs

Activity Booking Sidebar

v1.0.0

Step-by-step booking sidebar for a single activity. Orchestrates product option, date, time slot, and ticket selection with progressive disclosure.

View docs

Stay Search Bar

v1.0.0

Horizontal search bar for accommodation / stay search. Composes QueryCombobox (destination) + DateRangePicker (check-in/out) + GuestPickerPanel (guests).

View docs

Room Occupancy Editor

v1.0.0

Multi-room occupancy allocation editor. One card per room with adults/children/child-age CounterInput rows. Supports adding and removing rooms.

View docs

Property Card

v1.0.0

Result card for an accommodation / stay property. Displays image, star rating, guest score, highlights, cancellation policy, nightly rate, and stay total.

View docs

Rate Plan Selector

v1.0.0

Radio-style rate plan cards for accommodation booking. Shows price per night, stay total, cancellation policy, and meal inclusion.

View docs

Transport Search Bar

v1.0.0

Horizontal search bar for the Transport pillar. Composes two QueryCombobox fields (origin + destination), a date picker that switches between single and range, and a PartyPicker with passenger-specific labels. An optional ToggleGroup mode selector renders below the bar.

View docs

Transport Quick Filters

v1.0.0

Promoted filter row for transport result pages. Boolean chip toggles (Direct only, Refundable, Baggage included, Time of day) plus a visually distinct Sort select. Always visible above results without requiring the AdvancedFiltersPanel sheet.

View docs

Transport Result Row

v1.0.0

Timetable-style result row for the Transport pillar. Segment-aware comparison row showing times, route, duration, stops, price, and trust signals without an image shell. Inline Collapsible for cancellation terms, inclusions, and pickup instructions.

View docs

Transport Empty State

v1.0.0

Transport-specific empty and error state panel with presets for no-routes, indirect-only, unavailable, invalid-route, provider-error, stale-route, and price-unavailable scenarios. Includes a TransportNoResults convenience component.

View docs

Results Card Shell

v1.0.0

Server-safe image + content shell for result cards. Use as the base for ActivityCard, PropertyCard, or any custom result card.

View docs

Booking Summary Card

v1.0.0

Booking confirmation / review summary card with image, title, itemised price breakdown, total, and cancellation policy.

View docs

Active Filter Chips

v1.0.0

Horizontal row of active filter chips with individual remove buttons and an optional Clear All action.

View docs

Results Header

v1.0.0

Results page header showing result count, search context, and optional sort/filter controls.

View docs

Results Grid

v1.0.0

Responsive result card grid. Cards variant: 1→2→3 columns. List variant: single column for horizontal cards.

View docs

Empty State

v1.0.0

Centred zero-results empty state with icon, title, description, and optional CTA action.

View docs

Availability Badges

v1.0.0

AvailabilityBadge (single status badge) and AvailabilityBadges (row of per-variant badges). Used on ActivityCard, PropertyCard, and calendar cells.

View docs

Photo Upload

v1.0.0

Composable photo upload with drag-drop, camera capture, image cropping, and preview — designed to compose with shadcn Avatar.

View docs

Email Primitives

v1.0.0

Themed React Email component wrappers with shadcn-style defaults. Tailwind-first — resolved theme tokens are injected via Tailwind config, not inline styles. Wraps the full @react-email/components surface: Html, Head, Body, Tailwind, Container, Section, Row, Column, Text, Heading, Button, Link, Hr, Img, Preview, Font, Markdown, CodeBlock, CodeInline. Also exports: DEFAULT_EMAIL_THEME, emailButtonVariants (cva). Pass theme to Body, Tailwind, Hr, and EmailMetaList explicitly.

View docs

Email Card

v1.0.0

shadcn/ui Card translated for React Email. Full Card API: Card (with optional accent-bar prop), CardHeader, CardTitle, CardDescription, CardContent, CardFooter. Accent bar uses a triple height approach (CSS class + inline style + HTML attribute) for Outlook compatibility.

View docs

Email Badge

v1.0.0

shadcn/ui Badge translated for React Email. Inline <span> label with cva variants: default, secondary, outline, muted, destructive, success, warning. Size variants: sm, default, lg. Success and warning use hardcoded hex since they fall outside the shadcn semantic token set.

View docs

Email Alert

v1.0.0

shadcn/ui Alert translated for React Email. Uses a narrow left-accent Column to simulate CSS border-left (email-safe; Column width uses triple approach for Outlook). Variants: default, info, success, warning, destructive. Includes AlertTitle and AlertDescription sub-components.

View docs

Email Composites

v1.0.0

Higher-level helpers that eliminate repeated boilerplate across templates. EmailLogo — conditional centred logo section. EmailEyebrow — small uppercase label above headings, defaults to text-primary. EmailFooter — copyright line with optional support email and unsubscribe link. EmailMetaList — key-value metadata table (receipts, bookings) with background applied at the <td> level for Outlook compatibility; accepts optional theme prop.

View docs

Admin Stat

v1.0.0

A single metric card with label, large value, optional sub-text, icon, and trend indicator. Use independently or compose into AdminDashboard.

View docs

Admin Activity Feed

v1.0.0

Timestamped event log with kind icons (token, client, registry). Use independently or compose into AdminDashboard.

View docs

Visitza Logo

v1.0.0

The Visitza wordmark with South African flag emblem. Full-colour and mono modes. Lives in the Visitza client scope — not core.

View docs

Visitza Emblem

v1.0.0

The Visitza location-pin emblem with SA flag — compact mark for avatars, favicons, and 404 heroes.

View docs

Visitza Branded Logo

v1.0.0

PartnerLogo, SupplierLogo, and AdminLogo — wordmark plus vertical separator and uppercase product suffix.

View docs

Visitza — Public 404 Page

v1.0.0

Full-page not-found for the Visitza public product: semantic tokens, gradient accent bar, emblem, soft glows. Install as app/not-found.tsx (registry:page) in a Next.js app with Visitza theme.

View docs

Visitza Email Components

v1.0.0

Thin, composable Visitza email micro-components. VisitzaBodyText (body copy), VisitzaMetaText (meta/caption), VisitzaPrimaryCta (Section + Button, accepts href + children + className only). Eliminates repeated inline-style patterns across templates.

View docs

Hooks

50

Browser API hooks for progressive enhancement

Booking Search Types

v1.0.0

Shared ISO-string-based value model for multi-domain booking search (accommodation + activities). Serializable, URL-safe, server-friendly.

View docs

Transport Result Row Utils

v1.0.0

Exported pure helpers for transport result display: formatTransportTime (timezone-safe), formatTransportDuration, formatStopsLabel, extractOffsetMinutes. Testable independently of the React component.

View docs

Transport Split View Contract

v1.0.0

Map/split-view integration contract for the Transport pillar. Defines TransportMapPin, TransportSplitViewConfig, extractMapPins, and extractMapPinsFromRows. Library-agnostic — consumers adapt to their map implementation.

View docs

usePrefersReducedMotion

v1.0.0

SSR-safe React hook that returns true when the user has enabled 'Reduce motion' in their OS accessibility settings.

View docs

useWebShare

v1.0.0

A React hook for sharing content using the Web Share API.

View docs

useGeolocation

v1.0.0

A React hook for accessing the browser Geolocation API with one-shot and continuous watch modes.

View docs

useNetworkInformation

v1.0.0

A React hook for accessing the Network Information API with real-time updates.

View docs

useVibration

v1.0.0

A React hook for controlling device vibration via the Vibration API. SSR-safe.

View docs

useAudioRecorder

v1.0.0

A comprehensive React hook for audio recording with real-time analysis.

View docs

useIndexedDB

v1.0.0

A generic React hook for IndexedDB CRUD operations with automatic database initialisation. SSR-safe.

View docs

useLocalStorage

v1.0.0

A React hook for managing localStorage with automatic JSON serialisation. SSR-safe.

View docs

useClientCapabilities

v1.0.0

SSR-safe hook for detecting client capabilities (camera, mounted state) using useSyncExternalStore.

View docs

useAttachmentManager

v1.0.0

Hook for managing file attachments with local preview, upload progress, and message linking.

View docs

useChatImport

v1.0.0

Hook for managing chat import state with a parser function dependency.

View docs

formatPrice

v1.0.0

Lightweight locale-aware price formatter using Intl.NumberFormat. Defaults to South African Rand (ZAR).

View docs

Chat Types

v1.0.0

Platform-agnostic types for chat data (messages, participants, attachments) compatible with WhatsApp, Telegram, iMessage, and custom sources.

View docs

WhatsApp Parser

v1.0.0

Parses WhatsApp chat exports into generic Chat format with attachment and file matching support.

View docs

Visitza email shared

v1.0.0

email-guards (URLs, recipients, subjects, hex colors) plus escape helpers, inline logo, palettes, renderVisitzaEmailLayout, and CTA rows for Visitza transactional emails.

View docs

Waitlist Email

v1.0.0

Renders waitlist confirmation emails (HTML + plain text) for public, partner, and supplier products. Compatible with any email service.

View docs

Email confirmation

v1.0.0

Magic-link style email verification template with the same Visitza layout as waitlist emails.

View docs

Transport Search Params

v1.0.0

Serialize and parse TransportSearchValue to/from URLSearchParams. Flat, human-readable param scheme (from_id, to_id, dm, pax_*) for shareable, bookmarkable transport search URLs.

View docs

Booking Date Helpers

v1.0.0

Shared ISO date parsing, formatting, and arithmetic helpers for the booking component system. Single source of truth for parseISODate, toISODate, todayISO, addDays, and formatDisplayDate.

View docs

Booking Money Formatter

v1.0.0

Shared Intl.NumberFormat-based money formatting for Money objects. Converts smallest-unit amounts (e.g. cents) to locale-aware currency strings.

View docs

Booking Availability Helpers

v1.0.0

Shared availability status label/variant config and helper functions. Single source of truth for availability display logic across badges and cards.

View docs

Email Types

v1.0.0

Core contracts for the email subsystem: EmailAddress, EmailAttachment, EmailMessage, EmailSendResult, EmailRenderResult, EmailProvider, EmailThemeTokens, EmailTemplateDefinition<Props>, EmailTemplateRenderContext. Runtime-neutral — no env access or provider SDKs.

View docs

Email Guards

v1.0.0

Validation and sanitization utilities: hex color validation, URL safety checks (blocks javascript:/data: schemes), email address normalization, subject-line clamping, plain-text clamping, numeric range clamping. Safe to use server-side or in edge runtimes.

View docs

Email URLs

v1.0.0

URL construction helpers for email template links. Builds and validates absolute https URLs for magic links, password resets, email confirmations, and unsubscribe flows. Receives siteUrl from the template render context — never reads env vars.

View docs

Email Theme

v1.0.0

Bridges shadcn HSL design tokens to email-safe concrete hex values. Exports: hslToHex, resolveEmailTheme, createEmailTailwindConfig, KC_DEFAULT_HSL_TOKENS. The Tailwind config uses pixelBasedPreset-compatible output for React Email.

View docs

Email Render

v1.0.0

Runtime-neutral render pipeline. Exports: renderEmailTemplate (EmailTemplateDefinition → EmailRenderResult), buildEmailMessage (compose render result + envelope into EmailMessage), renderAndSend (render → build → send in one call), EmailEnvelope type. Depends on @react-email/render — templates and primitives never import it directly.

View docs

Email Render — Next.js

v1.0.0

Next.js render adapter. Exports createEmailRenderer(config?) factory that reads process.env.NEXT_PUBLIC_SITE_URL and wraps the core render pipeline. The only place in the email subsystem that reads process.env. Also re-exports buildEmailMessage and renderAndSend for convenience.

View docs

Email Render — Supabase Edge

v1.0.0

Supabase Edge Function (Deno) render adapter. Same API as core/email-render-next — createEmailRenderer(config?) — but reads Deno.env.get('SITE_URL'). Requires @react-email/render mapped via deno.json import map: 'npm:@react-email/render@^2.0.5'. The only place in the email subsystem that reads Deno.env.

View docs

Email Provider — Resend

v1.0.0

Resend EmailProvider adapter. Exports createResendProvider({ apiKey, defaultFrom? }). Maps EmailMessage to Resend SDK: tags Record → [{ name, value }], idempotencyKey → SDK options arg (not raw header), attachments with Buffer/Uint8Array content. Works in Node.js and Supabase Edge (Resend SDK is edge-compatible).

View docs

Email Provider — SMTP

v1.0.0

Nodemailer SMTP EmailProvider adapter. Node.js only — not compatible with Supabase Edge. Exports createSmtpProvider({ host, port, secure?, auth?, tls? }). secure defaults to true when port === 465. idempotencyKey and correlationId are forwarded as X-Idempotency-Key / X-Correlation-Id headers for observability. Suitable for production SMTP and local dev (Mailhog/Mailpit).

View docs

Magic Link Email

v1.0.0

Generic passwordless sign-in / email-verification template. Auth email pattern: eyebrow → heading → body → Alert(warning) expiry note → Button(lg) CTA → Hr → security disclaimer. Uses EmailLogo, EmailEyebrow, EmailFooter composites.

View docs

Reset Password Email

v1.0.0

Generic password reset template. Same auth email pattern as magic-link: Alert(warning) for the expiry note, Button(lg) CTA, security disclaimer. Uses EmailLogo, EmailEyebrow, EmailFooter composites.

View docs

Welcome Email

v1.0.0

Generic post-signup welcome / onboarding template. Demonstrates the numbered next-steps pattern: bold-title + muted-body Text pairs below an Hr separator. Conditional CTA Button(lg). Uses EmailLogo, EmailEyebrow, EmailFooter composites.

View docs

Notification Email (Basic)

v1.0.0

Generic one-section transactional notification template. Title and body are props — suitable for booking confirmations, status updates, or system alerts. Optional CTA Button. Uses EmailLogo, EmailEyebrow, EmailFooter composites.

View docs

Newsletter Email (Basic)

v1.0.0

Generic newsletter template with headline, intro copy, and optional CTA. Features a split accent bar (60% primary / 40% secondary) using percentage Column widths with Outlook-compatible width attributes. Uses EmailLogo, EmailEyebrow, EmailFooter composites.

View docs

Review Request Email (Basic)

v1.0.0

Generic post-experience review request template. Star rating hint rendered as a large Unicode character. Uses accent="secondary" card and text-secondary eyebrow to visually distinguish from auth/transactional emails. Uses EmailLogo, EmailEyebrow, EmailFooter composites.

View docs

Receipt Email (Basic)

v1.0.0

Generic transactional receipt template. Confirm → detail → total hierarchy: Alert(success) confirms payment amount first, EmailMetaList shows order metadata, LineItemRow sub-component renders each line, two-column Row/Column total with inline textAlign for Outlook. Uses EmailLogo, EmailEyebrow, EmailFooter, EmailMetaList composites.

View docs

Visitza Email Defaults

v1.0.0

Single source of truth for Visitza email brand configuration. Exports VisitzaEmailDefaults, VISITZA_EMAIL_DEFAULTS table (public/partner/supplier), and getVisitzaEmailDefaults(product) helper. Replaces the old email-brands dual-table approach.

View docs

Visitza Email Theme

v1.0.0

Maps a Visitza product's palette and brand colors into a resolved EmailThemeTokens object. Exports getVisitzaEmailTheme(product). Use this when you need the theme tokens outside of VisitzaEmailLayout.

View docs

Visitza Email Layout

v1.0.0

Shared React Email layout for Visitza transactional emails. Accepts product (public/partner/supplier) and derives brand config + theme tokens internally. Dark-themed card with gradient accent bar, inline SVG logo, and branded footer.

View docs

Visitza — Email Verification

v1.0.0

React Email address verification (magic link) template for Visitza. Supports all three product variants with dark theming.

View docs

Visitza — Reset Password

v1.0.0

React Email password-reset template for Visitza. Single-action layout with expiry note and plain-text fallback link. Supports all three product variants.

View docs

Visitza — Waitlist

v1.0.0

React Email waitlist confirmation template for Visitza. Supports public, partner, and supplier product variants with brand-aware dark theming.

View docs

Visitza — Booking Confirmed

v1.0.0

React Email booking confirmation template for Visitza. Includes booking reference, experience name, date/time, meeting point, optional line-item breakdown and total, and a view-booking CTA.

View docs

Visitza — Booking Cancelled

v1.0.0

React Email booking cancellation notice for Visitza. Includes booking reference, experience, optional cancellation reason, refund amount, and refund timeline note.

View docs

Visitza — Booking Reminder

v1.0.0

React Email upcoming-experience reminder for Visitza. Sent 24–48 hours before the experience. Highlights date, time, and meeting point.

View docs

Visitza — Review Request

v1.0.0

React Email post-experience review request for Visitza. Short, single-action layout with experience name, optional date context, and direct review link.

View docs