Skip to content

Components

26 reusable components built on shadcn/ui + Tailwind CSS 4:

ComponentPurpose
buttonPrimary action buttons
calendarDate picker calendar
confirm-dialogConfirmation modals (danger variant for destructive)
date-range-pickerDate range selection
empty-stateEmpty data placeholders
fieldForm field wrapper with label + error
google-drive-pickerDrive file selection
inputText input
kpi-cardMetric display cards
labelForm labels
markdown-editorRich text editor
markdown-previewMarkdown renderer
mood-selectorStudent mood feedback
multi-selectMulti-value selection
popoverFloating content
price-inputCurrency amount input
resource-pickerResource selection dialog
sheetSlide-over panels
skeletonLoading placeholders
star-rating1-5 star display/input
status-badgeColored status indicators
tag-multi-selectTag selection with search
template-pickerTemplate selection dialog
textareaMulti-line text input
toggle-switchBoolean toggle
emoji-pickerEmoji selection popover (11 categories, search, toggle)
timezone-selectTimezone selector with search, dynamic GMT offsets, browser detection, compact mode

Unified timezone selector used across the app (settings, booking, student portal, widgets).

Props:

PropTypeDefaultDescription
valuestringIANA timezone ID
onChange(tz: string) => voidCallback
groupedbooleantrueShow region group headers
searchablebooleantrueShow search input
compactbooleanfalseCompact inline style: icon + label + chevron, no border
placeholderstringPlaceholder when no value
errorbooleanfalseError styling

Features:

  • Search: Real-time regex matching across IANA ID, city name, and GMT offset
  • Dynamic GMT offsets: Uses Intl.DateTimeFormat with timeZoneName: 'shortOffset' — offsets update with DST changes
  • Browser detection: Auto-includes browser timezone via Intl.DateTimeFormat().resolvedOptions().timeZone, shows “(detected)” badge
  • 6 curated regions: Pacific, Americas, Europe, Africa, Asia, Oceania (49 zones covering Spanish teachers + global students)
  • Compact mode: text-xs, no border, minimal layout — used in widgets and lightweight layouts

Exports: getTimezoneLabel(ianaId) → “Madrid (GMT+1)”, BROWSER_TIMEZONE constant

Popover with 11 emoji categories (smileys, hands, animals, nature, food, activities, travel, objects, education, symbols, flags), search input, and toggle on/off behavior. Used in tag management for tag icons.

  • WeekCalendarGrid: Week view with draggable events
  • AgendaListView: Chronological session list
  • EventDetailPanel: Session detail sheet
  • RescheduleSheet: Reschedule flow
  • ScheduleSelector: Calendar/schedule picker
  • ActionSheet: Quick actions menu
  • AvailabilityEditor: Edit time off/extra availability

Materials (/components/materials/, 13 files)

Section titled “Materials (/components/materials/, 13 files)”

Google Drive-style file browser:

  • Breadcrumb navigation
  • Folder tree sidebar
  • List, grid, kanban views
  • Template & resource editors
  • Move-to-folder dialog
  • DnD wrapper (dnd-kit)
  • Toolbar with search + filters
  • Review card (rating, content, actions)
  • Review form (student submission)
  • Import form (external platforms)
  • Response form (teacher reply)
  • Settings panel
  • Public reviews section
  • Booking/storefront/reviews config forms
  • Preview panel with live rendering
  • Embed code section
  • Analytics badge
  • Variant list
  • Widget editor
  • Dirty state hook

Storefront (/components/storefront/, 5 files)

Section titled “Storefront (/components/storefront/, 5 files)”
  • Service card
  • Storefront grid
  • Booking sheet
  • Auth gate (magic link prompt)
  • Student context bar

dnd-kit powered board:

  • Board container
  • Column (droppable)
  • Card (draggable)
  • Layout wrapper

Command Palette (/components/command-palette/, 2 files)

Section titled “Command Palette (/components/command-palette/, 2 files)”
  • CommandPalette: Cmd+K dialog with student search via TanStack Query
  • ShortcutHelp: Shift+? dialog showing all shortcuts in 2-column grid
  • ServiceWizard: 3-dimension picker (delivery x group x structure)