🧩

Component Library

Gedeelde React 19 componenten in packages/ui β€” importeerbaar via @teezu/ui

React 19 TypeScript 5.9 strict Tailwind CSS 4 Radix UI CVA Lucide React React Hook Form + Zod

πŸ“¦ Monorepo Package

Installatie & import

# Bouwen vanuit monorepo root
pnpm --filter @teezu/ui build

# Importeren in elke app
import { Button, GlassCard, Badge } from '@teezu/ui'

Package locatie: packages/ui/

Tech stack

  • Framework React 19 + TypeScript 5.9 strict
  • Styling Tailwind CSS 4 (utility classes)
  • Primitives Radix UI (accessibility)
  • Variants CVA (class-variance-authority)
  • Icons Lucide React
  • Forms React Hook Form + Zod

🎨 Design System

Purple
#4C1D95
Pink
#EC4899
Blue
#3B82F6
Gold
#F59E0B

Kleuren zijn gedefinieerd als Tailwind CSS 4 custom properties in packages/ui/src/theme.css.

πŸ”˜ Button

CVA-gebaseerde button met 4 TeezU-specifieke variants en 3 maten. Gebouwd op een Radix UI Slot primitive voor asChild support.

Live preview

Variants (CVA)

primaryPaars gradient β€” primaire CTA's
ghostTransparant β€” secundaire acties
tipGoud β€” tip-acties in chat/live
unlockRoze β€” premium content ontgrendelen
import { Button } from '@teezu/ui'

// Primary
<Button variant="primary" size="md" onClick={handleClick}>
  Verstuur
</Button>

// Tip button
<Button variant="tip" size="sm" onClick={() => openTipModal()}>
  πŸ’° Stuur Tip
</Button>

// Unlock button
<Button variant="unlock" size="lg" disabled={isPending}>
  πŸ”“ Ontgrendel Premium
</Button>

// asChild (Radix Slot)
<Button variant="ghost" asChild>
  <a href="/profile">Profiel</a>
</Button>

πŸƒ Cards

Vier context-specifieke card-varianten, allemaal als wrapper rond GlassCard.

Luna_X
@luna_x Β· Creator
βœ“ Verified

ProfileCard

πŸ“Έ
Premium Post

ContentCard β€” met unlock overlay indien premium

LIVE πŸ‘ 1.2K kijkers
Livestream Titel

StreamCard β€” met viewer count & live badge

Provider Name
Provider Β· 4.8 β˜…

ProviderCard β€” rating & service info

import { ProfileCard, ContentCard, StreamCard, ProviderCard } from '@teezu/ui'

<ProfileCard user={user} showVerified showFollowButton />
<ContentCard post={post} onUnlock={handleUnlock} />
<StreamCard stream={stream} onJoin={handleJoin} />
<ProviderCard provider={provider} onBook={handleBook} />

πŸͺŸ GlassCard

Basiscomponent voor glass-morphism styling β€” overal in de UI gebruikt als container. Combineert backdrop-blur, semi-transparante achtergrond en subtiele border.

Example Glass Card

Glassmorphism effect met blur en transparantie. Werkt op alle achtergronden.

import { GlassCard } from '@teezu/ui'

// Basis
<GlassCard className="p-6">
  <h3>Titel</h3>
  <p>Content</p>
</GlassCard>

// Met extra blur intensity
<GlassCard blur="heavy" className="p-8">
  <ModalContent />
</GlassCard>

πŸͺŸ Modals

Gebouwd op @radix-ui/react-dialog voor volledige accessibility (focus trap, ARIA, escape-sluiten).

🧞
AI Genie Modal

AI prompt-invoer, response streaming, kopieer/bewaar acties

πŸ“œ
Consent Modal

18+ leeftijdsverificatie, consent-logging naar audit ledger

πŸ’°
Tip Modal

Bedrag invoer, wallet-saldo check, bevestiging & animatie

import { AIGenieModal, ConsentModal, TipModal } from '@teezu/ui'

<AIGenieModal
  open={showGenie}
  onClose={() => setShowGenie(false)}
  targetUserId={creator.id}
/>

<ConsentModal
  open={needsConsent}
  onAccept={handleConsentAccepted}
  onDecline={() => router.push('/')}
/>

<TipModal
  open={showTip}
  recipientId={creator.id}
  walletBalance={wallet.balance}
  onSuccess={handleTipSent}
/>

πŸ… Badges

Kleine status-indicators voor rollen, moods en verificatiestatus.

Super Admin Admin Moderator Creator Provider Member Plus Viewer
😈 Naughty πŸ”₯ Horny πŸ’œ Romantic 😴 Chill 😊 Playful
βœ“ Verified Creator βœ“ Verified Provider ⭐ Elite
import { RoleBadge, MoodBadge, VerifiedBadge } from '@teezu/ui'

<RoleBadge role="creator" />
<MoodBadge mood="naughty" />
<VerifiedBadge type="creator" />

⌨️ Inputs

Alle inputs zijn geΓ―ntegreerd met react-hook-form via Controller, gevalideerd met Zod schemas uit @teezu/types.

πŸ’¬
πŸ”
✨
import { ChatInput, SearchInput, PromptInput } from '@teezu/ui'
import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import { chatMessageSchema } from '@teezu/types'

const { control, handleSubmit } = useForm({
  resolver: zodResolver(chatMessageSchema)
})

<ChatInput
  control={control}
  name="message"
  onSend={handleSubmit(onSend)}
  maxLength={500}
/>

<SearchInput
  value={query}
  onChange={setQuery}
  placeholder="Zoek creators, content..."
/>

<PromptInput
  control={control}
  name="prompt"
  onRun={handleSubmit(onPrompt)}
/>

🧭 Navigation

Drie navigatiecomponenten voor desktop, mobiel en drawer-flows. Reageren op useAppStore Zustand slice voor actieve route & sidebar-state.

Sidebar (desktop)
  • β€’ Routes: Home, Discover, Live, Chat, Wallet
  • β€’ Collapse/expand via toggleSidebar
  • β€’ Avatar + rol-badge onderaan
Bottom Nav (mobiel)
  • β€’ 5 iconen (Lucide React)
  • β€’ Active state met pink indicator
  • β€’ Verborgen bij keyboard open
Drawer
  • β€’ Radix UI Sheet primitive
  • β€’ Slide-in van rechts of onder
  • β€’ Gebruik voor filters & instellingen
import { Sidebar, BottomNav, Drawer } from '@teezu/ui'
import { useAppStore } from '@/store'

const { isSidebarOpen, toggleSidebar } = useAppStore()

// Desktop layout
<Sidebar isOpen={isSidebarOpen} onToggle={toggleSidebar} />

// Mobile layout
<BottomNav activeRoute={router.pathname} />

// Drawer (bijv. filters)
<Drawer open={showFilters} onClose={() => setShowFilters(false)} side="right">
  <FilterPanel />
</Drawer>

πŸ«₯ Overlays

Twee speciale overlay-componenten voor creator livestream-controls en AI strip.

Freeze & Reveal

❄️
STREAM BEVROREN
Kijk voor 50 tokens om te onthullen

Blur overlay met token-gated reveal. Blauwe glow bij actieve freeze.

AI Strip

✨ AI Genie Suggestie

"Probeer een roleplay scenario met neon-noir esthetiek..."

Horizontale strip onder de stream met AI-gegenereerde suggesties.

import { FreezeRevealOverlay, AIStrip } from '@teezu/ui'

<FreezeRevealOverlay
  isFrozen={streamState.frozen}
  tokenCost={50}
  onReveal={handleReveal}
  glowColor="blue"
/>

<AIStrip
  suggestions={aiSuggestions}
  onSelect={handleSuggestionSelect}
  isLoading={aiLoading}
/>

πŸ“‹ Compleet Overzicht

Buttons & Actions
  • β€’ Button (primary / ghost / tip / unlock)
  • β€’ IconButton
  • β€’ CopyButton
  • β€’ LoadingButton
Cards
  • β€’ GlassCard
  • β€’ ProfileCard
  • β€’ ContentCard
  • β€’ StreamCard
  • β€’ ProviderCard
Modals
  • β€’ AIGenieModal
  • β€’ ConsentModal
  • β€’ TipModal
  • β€’ ConfirmModal
Badges
  • β€’ RoleBadge
  • β€’ MoodBadge
  • β€’ VerifiedBadge
  • β€’ TierBadge
Inputs & Forms
  • β€’ ChatInput
  • β€’ SearchInput
  • β€’ PromptInput
  • β€’ FormField (+ Zod)
Navigation
  • β€’ Sidebar
  • β€’ BottomNav
  • β€’ Drawer
  • β€’ Tabs
Overlays
  • β€’ FreezeRevealOverlay
  • β€’ AIStrip
  • β€’ UnlockGate
  • β€’ PremiumBlur
Feedback
  • β€’ Toast (Sonner)
  • β€’ Spinner
  • β€’ LoadingSkeleton
  • β€’ ProgressBar
Media & Display
  • β€’ Avatar
  • β€’ LazyImage
  • β€’ VideoPlayer
  • β€’ Tooltip (Radix)