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.
Then install any component
npx shadcn@latest add @keystonecore/spinnerThree 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/buttoncore/spinnercore/data-tablecore/site-headercore/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 RestrictedKeystone Core components
1 · Setup registry
2 · Install components
@visitza RestrictedVisitza components
1 · Setup registry
2 · Install components
Building for a new client? Get in touch to provision a scoped registry and bearer token.
Themes
6Design tokens, typography, and color system
Teal Orange Theme
v1.0.0Balanced teal-and-orange palette with full sidebar token support.
Cool Teal Orange Theme
v1.0.0Cool-toned variant of the teal-orange palette with a dark sidebar.
Public
v1.0.0Warm editorial theme for Visitza's public-facing product: Jost sans-serif, Playfair Display serif, teal primary, terracotta accents.
Supplier
v1.0.0Professional cool-toned theme for Visitza's supplier portal: Inter, blue-grey primary.
Partner
v1.0.0Teal primary with orange secondary for Visitza's partner portal.
Admin
v1.0.0Indigo-blue primary with a dark sidebar for Visitza's internal admin dashboard.
Components
70Interactive UI primitives with variant support
Spinner
v1.0.0A phase-aware loading spinner that transitions through loading → filling → complete states, optionally revealing the South African flag on completion.
Icon Button
v1.0.0Minimal rounded icon-button primitive with overlay, ghost, and outline variants. Base component for SaveButton, ShareButton, and RecordButton.
Save Button
v1.0.0A reusable heart-toggle save button with overlay, ghost, and outline variants.
Share Button
v1.0.0A share-action icon button with a lift-off animation on click.
Record Button
v1.0.0A microphone-toggle record button with idle, recording, and confirmed states.
Mobile Nav
v1.0.0A composable fixed-bottom mobile navigation bar with asChild support.
Marquee Band
v1.0.0A composable infinite-scroll ticker strip with light and dark variants.
Product Card
v1.0.0A composable product display card with compound sub-components.
Reveal
v1.0.0A composable scroll-reveal primitive with shared IntersectionObserver.
Stay Card
v1.0.0An opinionated accommodation listing card built on ProductCard.
Sheet
v1.0.0A slide-out panel component for mobile navigation and side content.
Header Nav
v1.0.0Composable header navigation links with animated active indicators.
Account Menu
v1.0.0An auth-aware account dropdown with composable trigger variants.
Keystone Core Logo
v1.0.0Geometric dual-chevron emblem for the Keystone Core brand.
Testimonial Card
v1.0.0A composable testimonial card with star ratings, quote icon, avatar, and author details.
Chat
v1.0.0Platform-agnostic chat UI with theme variants (default, whatsapp, imessage, slack), composable compound components, and paste-to-parse input.
Camera UI
v1.0.0Client-only camera button and menu item components with SSR-safe capability detection.
Image Cropper
v1.0.0A 1:1 crop dialog with zoom, pan, and circular/square guide overlay.
Photo Capture Dialog
v1.0.0Camera capture dialog with front/back switching, capture preview, and file upload fallback.
Coordinate Pair Input
v1.0.0Lat/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.
Coordinate Input
v1.0.0Coordinate input supporting DD, DDM, and DMS formats with directional toggle. Includes helpers for parsing, formatting, and clamping latitude/longitude values.
Date Range Picker
v1.0.0Accommodation booking date-range picker with 2-month calendar, blocked dates, min/max nights, hover preview, and radio-friendly trigger.
Counter Input
v1.0.0Accessible increment / decrement control for numeric values — designed for guest counts, bedroom selectors, and similar booking fields.
Filter Chip Group
v1.0.0A group of toggle chips for single or multi-select filtering — property types, vibes, amenities, and similar facets.
Preference Strength Selector
v1.0.0A three-position toggle for expressing preference strength: Required, Preferred, or Any.
Constraint Message
v1.0.0Compact inline message for booking constraints and policy notes — neutral, info, warning, or destructive variants.
Range Input
v1.0.0Dual min / max input for bounded numeric ranges — price per night, size, distance, and similar filters.
Search Field Shell
v1.0.0Server-safe presentational trigger shell for compact booking search bars — consistent label, summary, and focus treatment across search controls.
Guest Picker
v1.0.0Popover-based guest selector for accommodation booking — adults, children, infants, and pets with occupancy constraints.
Amenity Picker
v1.0.0Chip-based amenity selector with a Command-powered overflow popover for searching the full amenity list.
Advanced Filters Panel
v1.0.0Composable right-side Sheet panel for advanced booking filters — composable children API, scrollable body, Apply / Reset actions.
Booking Search Bar
v1.0.0Production-ready unified accommodation search bar — destination, date range, guests, and optional advanced filters. Horizontal and stacked layouts.
Query Combobox
v1.0.0Free-text search input with grouped autocomplete suggestions. Full ARIA combobox semantics. Shell and input variants.
Single Date Picker
v1.0.0Calendar popover for picking a single date. ISO string value, min/max/disabled dates, shell and button trigger variants.
Party Picker
v1.0.0Generic category-driven party composition picker. Configure any set of traveller types (adult/child/concession/bags) via PartyCategory[]. GuestPicker is the accommodation wrapper.
Slot Picker
v1.0.0Time slot grid for slot-inventory products. Grouped by Morning/Afternoon/Evening. Handles available, limited (spots-left badge), sold-out, and closed states.
Ticket Mix Editor
v1.0.0Per-ticket-type quantity selector with per-unit pricing and running total. Enforces min/max total quantities.
Activity Card
v1.0.0Result card for an activity / experience / tour. Image, metadata, availability badge, rating, price, and Book CTA.
Product Option Selector
v1.0.0Radio card group for selecting a product variant (e.g. Private / Shared / Self-guided). Full ARIA radiogroup semantics.
Availability Preview Strip
v1.0.0Horizontal 7-day date strip with colour-coded availability dots. Used as a compact date picker in ActivityBookingSidebar.
Activity Search Bar
v1.0.0Horizontal search bar for activity / experience / tour search. Composes QueryCombobox + SingleDatePicker + PartyPicker.
Activity Booking Sidebar
v1.0.0Step-by-step booking sidebar for a single activity. Orchestrates product option, date, time slot, and ticket selection with progressive disclosure.
Stay Search Bar
v1.0.0Horizontal search bar for accommodation / stay search. Composes QueryCombobox (destination) + DateRangePicker (check-in/out) + GuestPickerPanel (guests).
Room Occupancy Editor
v1.0.0Multi-room occupancy allocation editor. One card per room with adults/children/child-age CounterInput rows. Supports adding and removing rooms.
Property Card
v1.0.0Result card for an accommodation / stay property. Displays image, star rating, guest score, highlights, cancellation policy, nightly rate, and stay total.
Rate Plan Selector
v1.0.0Radio-style rate plan cards for accommodation booking. Shows price per night, stay total, cancellation policy, and meal inclusion.
Transport Search Bar
v1.0.0Horizontal 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.
Transport Quick Filters
v1.0.0Promoted 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.
Transport Result Row
v1.0.0Timetable-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.
Transport Empty State
v1.0.0Transport-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.
Results Card Shell
v1.0.0Server-safe image + content shell for result cards. Use as the base for ActivityCard, PropertyCard, or any custom result card.
Booking Summary Card
v1.0.0Booking confirmation / review summary card with image, title, itemised price breakdown, total, and cancellation policy.
Active Filter Chips
v1.0.0Horizontal row of active filter chips with individual remove buttons and an optional Clear All action.
Results Header
v1.0.0Results page header showing result count, search context, and optional sort/filter controls.
Results Grid
v1.0.0Responsive result card grid. Cards variant: 1→2→3 columns. List variant: single column for horizontal cards.
Empty State
v1.0.0Centred zero-results empty state with icon, title, description, and optional CTA action.
Availability Badges
v1.0.0AvailabilityBadge (single status badge) and AvailabilityBadges (row of per-variant badges). Used on ActivityCard, PropertyCard, and calendar cells.
Photo Upload
v1.0.0Composable photo upload with drag-drop, camera capture, image cropping, and preview — designed to compose with shadcn Avatar.
Email Primitives
v1.0.0Themed 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.
Email Card
v1.0.0shadcn/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.
Email Badge
v1.0.0shadcn/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.
Email Alert
v1.0.0shadcn/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.
Email Composites
v1.0.0Higher-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.
Admin Stat
v1.0.0A single metric card with label, large value, optional sub-text, icon, and trend indicator. Use independently or compose into AdminDashboard.
Admin Activity Feed
v1.0.0Timestamped event log with kind icons (token, client, registry). Use independently or compose into AdminDashboard.
Visitza Logo
v1.0.0The Visitza wordmark with South African flag emblem. Full-colour and mono modes. Lives in the Visitza client scope — not core.
Visitza Emblem
v1.0.0The Visitza location-pin emblem with SA flag — compact mark for avatars, favicons, and 404 heroes.
Visitza Branded Logo
v1.0.0PartnerLogo, SupplierLogo, and AdminLogo — wordmark plus vertical separator and uppercase product suffix.
Visitza — Public 404 Page
v1.0.0Full-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.
Visitza Email Components
v1.0.0Thin, 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.
Blocks
7Composable layout sections and patterns
Waitlist Hero
v1.0.0A dark-cinematic full-screen waitlist hero block with composable sub-components.
Site Header
v1.0.0A composable sticky header with scroll-driven transparent/solid transitions and mobile navigation support.
Footer 1
v1.0.0Composable multi-column footer with brand slot, link groups, socials, separator, and legal bar.
Testimonials Section
v1.0.0A composable testimonials section layout with responsive 3-column grid.
Registry Shell
v1.0.0Sidebar layout shell for internal Keystone Core tooling. Includes navigation, branding, and account menu slots.
Token Manager
v1.0.0Bearer token management UI. Create scoped tokens for client registry access, copy them on first generation, and revoke them with confirmation.
Admin Dashboard
v1.0.0Internal admin overview with registry stats, quick actions, and a recent activity feed. Composed from AdminStat, AdminActivityFeed, and AdminQuickAction.
Hooks
50Browser API hooks for progressive enhancement
Booking Search Types
v1.0.0Shared ISO-string-based value model for multi-domain booking search (accommodation + activities). Serializable, URL-safe, server-friendly.
Transport Result Row Utils
v1.0.0Exported pure helpers for transport result display: formatTransportTime (timezone-safe), formatTransportDuration, formatStopsLabel, extractOffsetMinutes. Testable independently of the React component.
Transport Split View Contract
v1.0.0Map/split-view integration contract for the Transport pillar. Defines TransportMapPin, TransportSplitViewConfig, extractMapPins, and extractMapPinsFromRows. Library-agnostic — consumers adapt to their map implementation.
usePrefersReducedMotion
v1.0.0SSR-safe React hook that returns true when the user has enabled 'Reduce motion' in their OS accessibility settings.
useWebShare
v1.0.0A React hook for sharing content using the Web Share API.
useGeolocation
v1.0.0A React hook for accessing the browser Geolocation API with one-shot and continuous watch modes.
useNetworkInformation
v1.0.0A React hook for accessing the Network Information API with real-time updates.
useVibration
v1.0.0A React hook for controlling device vibration via the Vibration API. SSR-safe.
useAudioRecorder
v1.0.0A comprehensive React hook for audio recording with real-time analysis.
useIndexedDB
v1.0.0A generic React hook for IndexedDB CRUD operations with automatic database initialisation. SSR-safe.
useLocalStorage
v1.0.0A React hook for managing localStorage with automatic JSON serialisation. SSR-safe.
useClientCapabilities
v1.0.0SSR-safe hook for detecting client capabilities (camera, mounted state) using useSyncExternalStore.
useAttachmentManager
v1.0.0Hook for managing file attachments with local preview, upload progress, and message linking.
useChatImport
v1.0.0Hook for managing chat import state with a parser function dependency.
formatPrice
v1.0.0Lightweight locale-aware price formatter using Intl.NumberFormat. Defaults to South African Rand (ZAR).
Chat Types
v1.0.0Platform-agnostic types for chat data (messages, participants, attachments) compatible with WhatsApp, Telegram, iMessage, and custom sources.
WhatsApp Parser
v1.0.0Parses WhatsApp chat exports into generic Chat format with attachment and file matching support.
Visitza email shared
v1.0.0email-guards (URLs, recipients, subjects, hex colors) plus escape helpers, inline logo, palettes, renderVisitzaEmailLayout, and CTA rows for Visitza transactional emails.
Waitlist Email
v1.0.0Renders waitlist confirmation emails (HTML + plain text) for public, partner, and supplier products. Compatible with any email service.
Email confirmation
v1.0.0Magic-link style email verification template with the same Visitza layout as waitlist emails.
Transport Search Params
v1.0.0Serialize and parse TransportSearchValue to/from URLSearchParams. Flat, human-readable param scheme (from_id, to_id, dm, pax_*) for shareable, bookmarkable transport search URLs.
Booking Date Helpers
v1.0.0Shared ISO date parsing, formatting, and arithmetic helpers for the booking component system. Single source of truth for parseISODate, toISODate, todayISO, addDays, and formatDisplayDate.
Booking Money Formatter
v1.0.0Shared Intl.NumberFormat-based money formatting for Money objects. Converts smallest-unit amounts (e.g. cents) to locale-aware currency strings.
Booking Availability Helpers
v1.0.0Shared availability status label/variant config and helper functions. Single source of truth for availability display logic across badges and cards.
Email Types
v1.0.0Core contracts for the email subsystem: EmailAddress, EmailAttachment, EmailMessage, EmailSendResult, EmailRenderResult, EmailProvider, EmailThemeTokens, EmailTemplateDefinition<Props>, EmailTemplateRenderContext. Runtime-neutral — no env access or provider SDKs.
Email Guards
v1.0.0Validation 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.
Email URLs
v1.0.0URL 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.
Email Theme
v1.0.0Bridges 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.
Email Render
v1.0.0Runtime-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.
Email Render — Next.js
v1.0.0Next.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.
Email Render — Supabase Edge
v1.0.0Supabase 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.
Email Provider — Resend
v1.0.0Resend 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).
Email Provider — SMTP
v1.0.0Nodemailer 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).
Magic Link Email
v1.0.0Generic 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.
Reset Password Email
v1.0.0Generic 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.
Welcome Email
v1.0.0Generic 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.
Notification Email (Basic)
v1.0.0Generic 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.
Newsletter Email (Basic)
v1.0.0Generic 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.
Review Request Email (Basic)
v1.0.0Generic 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.
Receipt Email (Basic)
v1.0.0Generic 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.
Visitza Email Defaults
v1.0.0Single 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.
Visitza Email Theme
v1.0.0Maps 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.
Visitza Email Layout
v1.0.0Shared 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.
Visitza — Email Verification
v1.0.0React Email address verification (magic link) template for Visitza. Supports all three product variants with dark theming.
Visitza — Reset Password
v1.0.0React Email password-reset template for Visitza. Single-action layout with expiry note and plain-text fallback link. Supports all three product variants.
Visitza — Waitlist
v1.0.0React Email waitlist confirmation template for Visitza. Supports public, partner, and supplier product variants with brand-aware dark theming.
Visitza — Booking Confirmed
v1.0.0React 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.
Visitza — Booking Cancelled
v1.0.0React Email booking cancellation notice for Visitza. Includes booking reference, experience, optional cancellation reason, refund amount, and refund timeline note.
Visitza — Booking Reminder
v1.0.0React Email upcoming-experience reminder for Visitza. Sent 24–48 hours before the experience. Highlights date, time, and meeting point.
Visitza — Review Request
v1.0.0React Email post-experience review request for Visitza. Short, single-action layout with experience name, optional date context, and direct review link.