Component Library

623+ components across frontend/src/components/. Base layer is Shadcn/ui + Radix UI primitives in components/ui/, with domain-specific feature components in dedicated subdirectories.

UI Primitives (components/ui/)

101 base components. Storybook is mandatory for all new additions (CSF3, tags: ['autodocs']).

CategoryComponents
Primitivesbutton, card, badge, label, checkbox, toggle, switch
Dialogsdialog, alert-dialog, sheet, drawer
Menusdropdown-menu, context-menu, menubar
Formsinput, select, combobox, textarea, date-picker, multi-select
Data Tablesdata-table, compact-data-table, file-table, file-upload-table
Layoutaccordion, tabs, collapsible, separator, resizable
Feedbacktoast (Sonner), progress, spinner, banner-message, skeleton
Navigationbreadcrumb, pagination, command
Customaction-chip-selector, bulk-edit-toolbar, color-coded-card, EnvironmentBanner

Feature Component Directories

DirectoryFilesFeatureRelated Page
document-obtaining/59Document collection workflowsDocument Obtaining
form-builder/29Dynamic form editor/rendererForm Builder
files/25File upload, preview, managementFiles
portal/23Customer-facing portal UIPortal
building-components-redesign/18Building component managementBuilding Components
invoices/15Invoice creation and listingInvoices
quotes/9Quote managementQuotes
audit-log/8Activity tracking displayAudit Logs
document-review/8Document review workflowDocument Review
pdf/8PDF template editor/previewPDF Templates
feedback/7Feedback collection UIFeedback System
shared/6Cross-domain reusable components
workflow/5Workflow visualizationWorkflows
sidebar/4App navigation sidebarRouting

Component Decomposition Rule

Files exceeding 600 lines must be split per Component Decomposition:

ModuleContains
fooService.tsPure functions, constants, types (zero React)
useFooState.tsState, queries, mutations, handlers
FooSection.tsxPresentational (props + useTranslation)
Foo.tsxOrchestrator (calls hook, composes sections)

Styling

  • TailwindCSS 4 utility classes
  • Brand colors: Primary #91C832, Secondary #007C57, Gray-50 #F9FAFB
  • Shadcn/ui theming via CSS variables
  • Lock exact versions for UI dependencies (no ^ or ~)