@rajkrajpj/cultivate-ui-library
Version:
A modern, type-safe, accessible React component library for fintech investor forms. Build complete investor forms in minutes with zero configuration, supporting multiple regulations (RegA+, RegD, RegCF) and investor types.
725 lines (574 loc) • 20.5 kB
Markdown
# Cultivate UI Library - Implementation Plan & Architecture
## 1. Library Overview
The Cultivate UI Library is a complete, production-ready React component library specifically designed for fintech investor forms. It provides a regulation-agnostic core that supports multiple securities regulations (RegA+, RegD, RegCF) through configuration-driven architecture.
### 1.1 Current Implementation Status
✅ **Completed Features:**
- Complete 12-step investor form wizard
- Multi-investor type support (Individual, Joint, Company, Trust, IRA)
- Regulation-specific configurations (RegA+, RegD, RegCF)
- Production-ready UI components based on shadcn/ui
- TypeScript-first with comprehensive type safety
- Form persistence with localStorage
- Custom step handlers for API integration
- Comprehensive validation with Zod schemas
- Mobile-responsive design
### 1.2 Architecture Principles
- **Configuration-Driven**: Differences between regulations handled through configuration objects
- **Zero-Configuration Default**: Works out of the box with sensible defaults
- **API-Agnostic**: Library provides hooks interface, consumers provide API implementation
- **Type-Safe**: Full TypeScript support with strict typing throughout
- **Accessible**: WCAG 2.1 AA compliance built-in
- **Performance-Optimized**: Efficient rendering and data management
## 2. Core API & Consumer Usage
### 2.1 Basic Usage Pattern
```tsx
import {
createDefaultSteps,
InvestorFormData,
InvestorFormWizard,
} from "@rajkrajpj/cultivate-ui-library"
// Zero configuration - complete investor form in ~25 lines
const BasicInvestorForm = () => {
const offeringParams = {
offeringId: "offering-123",
companyName: "My Company",
sharePrice: 10,
minInvestment: 100,
maxInvestment: 10000,
deadline: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
regulation: "regA",
}
const steps = createDefaultSteps({
regulation: offeringParams.regulation,
})
const handleComplete = async (formData: Partial<InvestorFormData>) => {
await fetch("/api/investments", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(formData),
})
}
return (
<InvestorFormWizard<InvestorFormData>
steps={steps}
regulation={offeringParams.regulation}
offeringParams={offeringParams}
onComplete={handleComplete}
/>
)
}
```
### 2.2 Advanced Usage with Custom Step Handlers
```tsx
import { StepHandlers } from "@rajkrajpj/cultivate-ui-library"
const stepHandlers: StepHandlers = {
onGetStartedSubmit: async (data) => {
// Save lead information immediately
await fetch("/api/leads", {
method: "POST",
body: JSON.stringify({
email: data.email,
firstName: data.firstName,
lastName: data.lastName,
}),
})
},
onInvestmentAmountSubmit: async (data) => {
// Validate investment against offering limits
await fetch("/api/validate-investment", {
method: "POST",
body: JSON.stringify({
amount: data.investmentAmount,
investorType: data.investorType,
}),
})
},
onIdentityInfoSubmit: async (data) => {
// Submit KYC/AML verification
await fetch("/api/kyc-verification", {
method: "POST",
body: JSON.stringify({
ssn: data.ssn,
birthDate: data.birthDate,
address: {
address1: data.address1,
city: data.city,
state: data.state,
zip: data.zip,
},
}),
})
},
onPaymentsSubmit: async (data) => {
// Process final investment
await fetch("/api/investments/submit", {
method: "POST",
body: JSON.stringify(data),
})
},
}
const steps = createDefaultSteps({
regulation: "regCF",
enableDebugLogs: process.env.NODE_ENV === "development",
stepHandlers,
customSuccessHandler: () => {
window.location.href = "/investment-success"
},
})
```
## 3. Component Architecture
### 3.1 Core Components
#### **InvestorFormWizard**
Main orchestrator component that manages the multi-step form flow.
```tsx
interface InvestorFormWizardProps<T> {
steps: StepConfig<T>[] // Step configurations
regulation: string // "regA" | "regD" | "regCF" | "custom"
theme?: any // Theme configuration
offeringParams?: OfferingParams // Offering-specific parameters
onStepChange?: (step: number, data: Partial<T>) => void
onComplete?: (data: Partial<T>) => Promise<void>
onError?: (error: Error, step: string) => void
persistenceKey?: string // LocalStorage key for persistence
initialData?: Partial<T> // Pre-populate form data
className?: string // Custom CSS classes
}
```
#### **Page Components**
Pre-built step components that handle specific form sections:
- `GetStarted` - Email, name collection, optional agreement (RegCF)
- `SelectInvestorType` - Individual, Joint, Company, Trust/IRA selection
- `PersonalInfo` - Personal details based on investor type
- `AddressInfo` - Address information collection
- `InvestmentAmount` - Investment amount with validation
- `PaymentSelection` - Payment method selection
### 3.2 UI Component Library
The library includes a complete set of UI components based on shadcn/ui patterns:
```tsx
// Available UI components
import {
Button,
Card,
Checkbox,
Dialog,
Input,
Label,
Select,
Tabs
} from "@rajkrajpj/cultivate-ui-library"
```
**Key Features:**
- Radix UI primitives for accessibility
- CVA (Class Variance Authority) for variant management
- Tailwind CSS for styling
- forwardRef pattern for all form components
- Consistent design tokens
## 4. Data Management & State
### 4.1 Form Data Structure
The library uses a comprehensive `InvestorFormData` interface that handles all investor types:
```tsx
interface InvestorFormData {
// Basic Information
email: string
firstName: string
lastName: string
investorType: "individual" | "joint" | "company" | "trust" | "ira"
// Investment Data
investmentAmount: number
totalShares: number
isAccredited: boolean
// Identity Information
birthDate: string
ssn: string
tin?: string
// Address Information
address1: string
city: string
state: string
zip: string
country: string
// Conditional Fields Based on Investor Type
// Joint Account Fields
joint_firstName?: string
joint_lastName?: string
joint_birthDate?: string
joint_ssn?: string
// Company Fields
company_name?: string
company_title?: string
company_entityType?: string
company_stateOfFormation?: string
// Trust Fields
trust_name?: string
trust_title?: string
trust_dateOfFormation?: string
trust_stateOfFormation?: string
// IRA Fields
ira_accountType?: string
ira_custodianName?: string
ira_accountNumber?: string
// Payment Information
paymentMethod?: string
paymentUrl?: string
// Additional Fields
phone?: string
isUSCitizen?: boolean
}
```
### 4.2 State Management Strategy
- **React Hook Form**: Primary form state management with Zod validation
- **Step-Level State**: Each step maintains its own form state
- **Cross-Step Persistence**: Automatic localStorage persistence with debounced saving
- **Data Merging**: Sophisticated merging logic via `mergeInvestorFormData` utility
### 4.3 Validation Architecture
- **Zod-Based Schemas**: Type-safe validation with custom refinements
- **Step-Level Validation**: Each step has its own validation schema
- **Regulation-Specific Rules**: Conditional validation based on regulation type
- **Real-Time Validation**: Immediate feedback on form interactions
## 5. Regulation Support
### 5.1 Supported Regulations
#### **Regulation A+ (RegA)**
```tsx
const steps = createDefaultSteps({
regulation: "regA",
// Features:
// - Supports both accredited and unaccredited investors
// - Investment limits for unaccredited investors
// - No agreement checkbox requirement
})
```
#### **Regulation Crowdfunding (RegCF)**
```tsx
const steps = createDefaultSteps({
regulation: "regCF",
// Features:
// - Shows agreement checkbox on first step for guest flows
// - Annual investment limits based on income/net worth
// - Simplified KYC requirements
})
```
#### **Regulation D (RegD)**
```tsx
const steps = createDefaultSteps({
regulation: "regD",
// Features:
// - Requires accreditation verification
// - No investment limits for accredited investors
// - Enhanced KYC requirements
})
```
### 5.2 Regulation-Specific Features
**Conditional Field Rendering:**
- Agreement checkbox for RegCF guest flows
- Enhanced accreditation verification for RegD
- Investment limit calculations for RegA+/RegCF
**Step Flow Variations:**
- RegD may skip unaccredited investor steps
- RegCF includes additional disclosure steps
- Custom steps can be added per regulation
## 6. API Integration Architecture
### 6.1 Step Handler Pattern
The library uses a step handler pattern that allows consumers to inject custom API calls at specific points in the form flow:
```tsx
interface StepHandlers {
onGetStartedSubmit?: (data: InvestorFormData) => Promise<void>
onInvestorTypeSubmit?: (data: InvestorFormData) => Promise<void>
onPersonalInfoSubmit?: (data: InvestorFormData) => Promise<void>
onAddressInfoSubmit?: (data: InvestorFormData) => Promise<void>
onIdentityInfoSubmit?: (data: InvestorFormData) => Promise<void>
onInvestmentAmountSubmit?: (data: InvestorFormData) => Promise<void>
onSelfAccreditationSubmit?: (data: InvestorFormData) => Promise<void>
onUnaccreditedInvestorSubmit?: (data: InvestorFormData) => Promise<void>
onAcknowledgementSubmit?: (data: InvestorFormData) => Promise<void>
onPaymentSelectionSubmit?: (data: InvestorFormData) => Promise<void>
onPaymentsSubmit?: (data: InvestorFormData) => Promise<void>
}
```
### 6.2 API-Agnostic Design
The library doesn't make any API calls directly. Instead, it provides:
1. **Hook Points**: Clear points where consumers can inject API calls
2. **Data Contracts**: Well-defined data structures for API integration
3. **Error Handling**: Consistent error handling patterns
4. **Loading States**: Built-in loading state management
## 7. Default Form Flow
### 7.1 12-Step Default Flow
The `createDefaultSteps` function creates a comprehensive 12-step investor form:
1. **Get Started** - Email, name collection, optional agreement
2. **Select Investor Type** - Individual, Joint, Company, Trust/IRA
3. **Personal Information** - Personal details based on investor type
4. **Address Information** - Address fields with validation
5. **Identity Information** - SSN, DOB, identity verification
6. **Investment Amount** - Investment amount selection with calculations
7. **Self Accreditation** - Accreditation verification (if required)
8. **Unaccredited Investor** - Income/net worth disclosure (conditional)
9. **Acknowledgement** - Agreements and certifications
10. **Payment Selection** - Payment method selection
11. **Payments** - Payment processing and external URL generation
12. **Success Investment** - Success confirmation page
### 7.2 Step Configuration Options
```tsx
interface CreateDefaultStepsOptions {
regulation: "regA" | "regD" | "regCF" | "custom"
enableDebugLogs?: boolean
stepHandlers?: StepHandlers
customSuccessHandler?: () => void
}
```
## 8. Offering Configuration
### 8.1 OfferingParams Interface
```tsx
interface OfferingParams {
offeringId: string // Unique offering identifier
companyName: string // Company name for display
sharePrice: number // Price per share
minInvestment: number // Minimum investment amount
maxInvestment: number // Maximum investment amount
deadline: Date // Offering deadline
regulation: "regA" | "regD" | "regCF" // Regulation type
customContent?: {
welcomeMessage?: string // Custom welcome text
riskDisclosure?: string // Risk disclosure text
investmentTerms?: string // Investment terms
legalFooter?: string // Legal footer text
disclaimers?: string[] // Array of disclaimers
}
features?: {
allowInternational?: boolean // Allow international investors
requireAccreditation?: boolean // Require accreditation check
enableCrypto?: boolean // Accept cryptocurrency
}
}
```
### 8.2 Dynamic Validation
The library automatically validates investment amounts against offering parameters:
- Minimum/maximum investment validation
- Share price calculations
- Deadline enforcement
- Regulation-specific limits
## 9. Utilities & Helpers
### 9.1 Core Utilities
```tsx
// Step configuration helper
import { createStepConfig } from "@rajkrajpj/cultivate-ui-library"
const customSteps = createStepConfig([
{
id: "custom-step",
component: MyCustomStep,
title: "Custom Step",
validationSchema: myValidationSchema,
}
])
// Data merging utility
import { mergeInvestorFormData } from "@rajkrajpj/cultivate-ui-library"
const mergedData = mergeInvestorFormData(existingData, newStepData)
```
### 9.2 Default Step Creation
```tsx
import { createDefaultSteps } from "@rajkrajpj/cultivate-ui-library"
// Zero configuration
const basicSteps = createDefaultSteps({
regulation: "regA"
})
// With custom handlers
const advancedSteps = createDefaultSteps({
regulation: "regCF",
enableDebugLogs: true,
stepHandlers: myStepHandlers,
customSuccessHandler: () => window.location.href = "/success"
})
```
## 10. Styling & Theming
### 10.1 Tailwind CSS Integration
The library is built with Tailwind CSS and requires consumers to include Tailwind in their projects:
```js
// tailwind.config.js
module.exports = {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/@rajkrajpj/cultivate-ui-library/**/*.{js,ts,jsx,tsx}",
],
// ...rest of config
}
```
### 10.2 CSS Custom Properties
The library uses CSS custom properties for theming, allowing runtime theme customization:
```css
:root {
--primary: #e11d48;
--primary-foreground: #fff;
--background: #f9fafb;
/* ...other theme variables */
}
```
### 10.3 Component Variants
All components use CVA (Class Variance Authority) for consistent variant management:
```tsx
// Example button variants
const buttonVariants = cva(
"inline-flex items-center justify-center rounded-md text-sm font-medium",
{
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
outline: "border border-input bg-background hover:bg-accent",
},
size: {
default: "h-10 px-4 py-2",
sm: "h-9 rounded-md px-3",
lg: "h-11 rounded-md px-8",
},
},
}
)
```
## 11. Error Handling & Persistence
### 11.1 Error Handling Strategy
```tsx
<InvestorFormWizard
steps={steps}
regulation="regA"
offeringParams={offeringParams}
onError={(error, stepId) => {
console.error(`Error in step ${stepId}:`, error)
// Custom error handling logic
}}
onComplete={handleComplete}
/>
```
### 11.2 Form Persistence
Automatic localStorage persistence with configurable keys:
```tsx
<InvestorFormWizard
steps={steps}
regulation="regA"
offeringParams={offeringParams}
persistenceKey="investor-form-draft" // Auto-saves to localStorage
initialData={savedFormData} // Pre-populate with saved data
onComplete={handleComplete}
/>
```
**Persistence Features:**
- Debounced saving (500ms delay)
- Automatic data restoration on page reload
- Clear cache on successful submission
- Step tracking for resume capability
## 12. Package Distribution & Installation
### 12.1 NPM Package
```bash
npm install @rajkrajpj/cultivate-ui-library
```
### 12.2 Required Setup
```tsx
// 1. Import styles in your app entry point
import "@rajkrajpj/cultivate-ui-library/styles"
// 2. Add to Tailwind config
module.exports = {
content: [
"./src/**/*.{js,ts,jsx,tsx}",
"./node_modules/@rajkrajpj/cultivate-ui-library/**/*.{js,ts,jsx,tsx}",
],
}
// 3. Use in your components
import { InvestorFormWizard } from "@rajkrajpj/cultivate-ui-library"
```
### 12.3 Bundle Output
- **ESM and CJS bundles** for broad compatibility
- **TypeScript declaration files** for full type support
- **CSS styles** with Tailwind integration
- **Tree-shaking support** for optimal bundle sizes
## 13. Migration Benefits
### 13.1 Before/After Comparison
**Before (Legacy Implementation):**
- ~500+ lines of boilerplate code
- Custom step management logic
- Manual validation implementation
- Custom persistence logic
- Regulation-specific hard-coding
- Limited reusability
**After (Library Usage):**
- ~25-50 lines of business logic
- Zero configuration option
- Built-in validation and persistence
- Regulation-agnostic architecture
- Full reusability across projects
- Production-ready components
### 13.2 Key Migration Benefits
1. **Massive Code Reduction**: 90%+ reduction in boilerplate code
2. **Improved Maintainability**: Centralized logic in the library
3. **Enhanced Compliance**: Built-in regulation support
4. **Better UX**: Consistent, tested user experience
5. **Faster Development**: New forms can be built in minutes
6. **Type Safety**: Full TypeScript support throughout
## 14. Production Readiness
### 14.1 Current Status
✅ **Production Features Implemented:**
- Complete 12-step investor form flow
- Multi-investor type support (Individual, Joint, Company, Trust, IRA)
- Regulation-specific logic (RegA+, RegD, RegCF)
- Comprehensive validation with Zod
- Form persistence and recovery
- Error handling and loading states
- Mobile-responsive design
- Accessibility compliance (WCAG 2.1 AA)
- TypeScript support with strict typing
- Bundle optimization and tree-shaking
### 14.2 API Stability
The current API is stable and production-ready:
- **Semantic Versioning**: Following semver for all releases
- **Backward Compatibility**: Non-breaking changes in minor versions
- **TypeScript Support**: Full type safety with IntelliSense
- **Documentation**: Comprehensive docs and examples
### 14.3 Performance Characteristics
- **Bundle Size**: Optimized for tree-shaking, minimal footprint
- **Runtime Performance**: Efficient React patterns, optimized re-renders
- **Memory Usage**: Proper cleanup and memory management
- **Load Times**: Code-splitting and lazy loading support
## 15. Future Enhancements
### 15.1 Planned Features
**Phase 1 (Next Release):**
- Enhanced theming system with design tokens
- Additional regulation support (Reg S, custom regulations)
- Advanced validation rules engine
- Multi-language support
**Phase 2 (Future):**
- Visual form builder for custom steps
- Advanced analytics integration
- Enhanced mobile optimization
- Real-time collaboration features
### 15.2 Community & Extensibility
The library is designed for extensibility:
- **Custom Step Components**: Easy to add custom steps
- **Custom Validation**: Pluggable validation system
- **Theme Customization**: Full control over styling
- **API Integration**: Flexible hooks for any backend
## 16. Success Metrics
### 16.1 Development Efficiency
- **Code Reduction**: 90%+ reduction in implementation code
- **Development Time**: New investor forms in 15-30 minutes
- **Maintenance Overhead**: Centralized in library, minimal per-project maintenance
### 16.2 User Experience
- **Form Completion Rates**: Optimized flow for maximum completion
- **Mobile Experience**: Responsive design with touch optimization
- **Accessibility**: WCAG 2.1 AA compliance out of the box
- **Performance**: Fast load times and smooth interactions
### 16.3 Business Impact
- **Faster Time to Market**: Rapid deployment of new offerings
- **Reduced Development Costs**: Minimal custom development required
- **Improved Compliance**: Built-in regulation support
- **Enhanced Scalability**: Consistent patterns across all forms
This implementation plan reflects the current state of the Cultivate UI Library as a production-ready, comprehensive solution for fintech investor forms that significantly reduces development complexity while providing enterprise-grade features and compliance support.