Asset Tokenization UI Customization: Complete Guide to Frontend Branding & Development
Learn how to customize, rebrand, and extend the SettleMint Asset Tokenization Kit frontend with Next.js, Tailwind CSS, and React components for enterprise blockchain applications.
Who needs asset tokenization UI customization?
The SettleMint Asset Tokenization Kit (ATK) frontend customization is essential for:
- Financial institutions deploying private securities tokenization platforms
- Real estate companies creating property tokenization marketplaces
- Fund managers building investor portals for tokenized funds
- Enterprise developers integrating blockchain interfaces with existing systems
- Fintech startups launching compliant digital asset platforms
Quick Facts: The ATK frontend processes over 10,000 transactions daily across deployed instances, with 99.9% uptime and sub-second response times for asset operations.
The modular open-source platform enables fast deployment of asset tokenization solutions. While it includes infrastructure and smart contract templates, the frontend DApp—built with Next.js 15 and Tailwind CSS 3.4—serves as the primary interface for users and clients. The source code is available on GitHub - SettleMint Asset Tokenization Kit on GitHub
Frontend Focus
This guide covers the Next.js DApp located in kit/dapp/
Component Library
50+ pre-built React components for asset tokenization
REST APIs
Enterprise-grade APIs for seamless integration
API integration capabilities
Project structure deep dive
The frontend application follows Next.js 15 App Router conventions:
kit/dapp/
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── (auth)/ # Authentication flows
│ │ ├── assets/ # Asset management views
│ │ ├── dashboard/ # Analytics dashboards
│ │ └── api/ # API routes
│ ├── components/ # 50+ React components
│ │ ├── ui/ # Base UI components
│ │ ├── assets/ # Asset-specific widgets
│ │ └── layout/ # Layout components
│ ├── hooks/ # 20+ custom React hooks
│ ├── lib/ # External integrations
│ ├── utils/ # Helper functions
│ ├── types/ # TypeScript definitions
│ └── i18n/ # 12 language translations
└── public/ # Static assets
Pre-built components for rapid development:
Component Category | Count | Examples |
---|---|---|
Asset Management | 15 | AssetCard, AssetTable, AssetDetails |
Authentication | 8 | WalletConnect, LoginForm, KYCStatus |
Transaction UI | 12 | TransferModal, MintForm, BurnDialog |
Data Display | 10 | PortfolioChart, YieldGraph, Holdings |
Admin Tools | 5 | UserManager, RoleAssigner, AuditLog |
Custom hooks for blockchain interactions:
// Essential hooks for tokenization
useWallet() // Wallet connection & management
useAssets() // Asset CRUD operations
usePermissions() // Role-based access control
useTransactions() // Transaction history & status
useCompliance() // KYC/AML checks
useAnalytics() // Platform metrics
Technology stack specifications
Next.js 15.3
Server-side rendering, 40% faster builds, React Server Components
Tailwind CSS 3.4
JIT compilation, 200+ utility classes, dark mode support
TypeScript 5.0
100% type coverage, strict mode, advanced generics
React 19
Concurrent features, automatic batching, Suspense boundaries
Wagmi 2.0
Ethereum interactions, wallet management, contract hooks
TanStack Query
Data fetching, caching, real-time synchronization
Performance metrics: Initial page load under 1.5s, 95+ Lighthouse score, 60fps animations
Component customization guide
Identify components to customize
Navigate to kit/dapp/src/components/
and explore:
- Asset components: Modify for your asset types (real estate, securities, carbon credits)
- Authentication: Adapt for your KYC/AML providers
- Dashboard widgets: Create industry-specific analytics
Apply domain-specific modifications
// Example: Customizing AssetCard for real estate
export function PropertyCard({ asset }: PropertyCardProps) {
return (
<Card className="hover:shadow-xl transition-shadow">
<CardHeader>
<Badge>{asset.propertyType}</Badge>
<h3>{asset.address}</h3>
</CardHeader>
<CardContent>
<div className="grid grid-cols-2 gap-4">
<Stat label="Square Feet" value={asset.sqft} />
<Stat label="Token Price" value={asset.tokenPrice} />
<Stat label="Rental Yield" value={asset.yield} />
<Stat label="Occupancy" value={asset.occupancy} />
</div>
</CardContent>
</Card>
);
}
Implement design system
Create a unified design system:
/* tailwind.config.js */
module.exports = {
theme: {
extend: {
colors: {
primary: '#1E40AF', // Your brand blue
secondary: '#7C3AED', // Accent purple
success: '#10B981', // Status green
warning: '#F59E0B', // Alert orange
},
fontFamily: {
sans: ['Inter', 'system-ui'],
mono: ['JetBrains Mono', 'monospace'],
},
},
},
};
Test across devices
Ensure responsive design:
- Mobile: 375px - 768px
- Tablet: 768px - 1024px
- Desktop: 1024px+
- 4K displays: 2560px+
Creating custom routes and views
Custom hooks for blockchain logic
// Custom hook for KYC integration
export function useKYCVerification() {
const { address } = useWallet();
const [status, setStatus] = useState<KYCStatus>('pending');
useEffect(() => {
async function checkKYC() {
const result = await verifyWithProvider(address);
setStatus(result.status);
}
checkKYC();
}, [address]);
return { status, isVerified: status === 'approved' };
}
// Hook for real-time asset pricing
export function useAssetPricing(assetId: string) {
return useQuery({
queryKey: ['pricing', assetId],
queryFn: () => fetchPriceData(assetId),
refetchInterval: 60000, // Update every minute
});
}
Common integrations implemented via custom hooks:
Service | Hook | Purpose |
---|---|---|
Chainalysis | useComplianceCheck() | Transaction screening |
Onfido | useIdentityVerification() | KYC document verification |
Fireblocks | useCustodialWallet() | Institutional custody |
Chainlink | usePriceOracle() | Real-time asset pricing |
The Graph | useSubgraphQuery() | Blockchain data indexing |
Hook development patterns:
// 1. Error handling
export function useAssetTransfer() {
const [error, setError] = useState<Error | null>(null);
const [isLoading, setIsLoading] = useState(false);
const transfer = useCallback(async (params) => {
try {
setIsLoading(true);
setError(null);
const result = await executeTransfer(params);
return result;
} catch (err) {
setError(err);
throw err;
} finally {
setIsLoading(false);
}
}, []);
return { transfer, error, isLoading };
}
// 2. Optimistic updates
export function useOptimisticBalance() {
const queryClient = useQueryClient();
const updateBalance = (amount: bigint) => {
queryClient.setQueryData(['balance'], (old) => old + amount);
};
return { updateBalance };
}
Enterprise branding implementation
Define your design tokens
// src/styles/tokens.ts
export const brandTokens = {
colors: {
// Primary palette
primary: {
50: '#eff6ff',
500: '#3b82f6',
900: '#1e3a8a',
},
// Semantic colors
success: '#10b981',
warning: '#f59e0b',
error: '#ef4444',
},
typography: {
fontFamily: {
sans: 'Inter, system-ui, -apple-system',
display: 'Cal Sans, Inter',
},
fontSize: {
xs: '0.75rem',
sm: '0.875rem',
base: '1rem',
lg: '1.125rem',
xl: '1.25rem',
},
},
spacing: {
unit: 4, // Base unit in pixels
},
borderRadius: {
sm: '0.25rem',
md: '0.375rem',
lg: '0.5rem',
full: '9999px',
},
};
Configure Tailwind CSS
// tailwind.config.js
module.exports = {
darkMode: 'class',
theme: {
extend: {
colors: brandTokens.colors,
fontFamily: brandTokens.typography.fontFamily,
animation: {
'fade-in': 'fadeIn 0.5s ease-in-out',
'slide-up': 'slideUp 0.3s ease-out',
},
},
},
plugins: [
require('@tailwindcss/forms'),
require('@tailwindcss/typography'),
],
};
Replace brand assets
Asset specifications:
- Logo: SVG format, 200x50px, transparent background
- Favicon: 32x32px and 16x16px ICO files
- Backgrounds: 1920x1080px minimum, WebP format
- Icons: 24x24px SVG, single color for theming
kit/dapp/public/
├── logo.svg # Main logo
├── logo-dark.svg # Dark mode variant
├── favicon.ico # Browser favicon
├── backgrounds/
│ ├── hero.webp # Landing page hero
│ ├── pattern.svg # Repeating patterns
│ └── gradient.webp # Background gradients
└── icons/ # Custom icon set
Implement theme switching
// src/components/theme-toggle.tsx
export function ThemeToggle() {
const [theme, setTheme] = useState<'light' | 'dark'>('light');
useEffect(() => {
const root = document.documentElement;
root.classList.toggle('dark', theme === 'dark');
}, [theme]);
return (
<button
onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}
className="p-2 rounded-lg bg-gray-100 dark:bg-gray-800"
>
{theme === 'light' ? '🌙' : '☀️'}
</button>
);
}
Performance tip: Use WebP images for 30% smaller file sizes. Implement lazy loading for background images to improve initial page load.
Internationalization and localization
Utility functions and type safety
Essential utility functions for tokenization platforms:
// src/utils/formatters.ts
export const formatters = {
// Format token amounts with decimals
tokenAmount: (amount: bigint, decimals: number) => {
const divisor = 10n ** BigInt(decimals);
const whole = amount / divisor;
const fraction = amount % divisor;
return `${whole}.${fraction.toString().padStart(decimals, '0')}`;
},
// Format currency with locale
currency: (amount: number, currency = 'USD') => {
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency,
minimumFractionDigits: 2,
}).format(amount);
},
// Format dates for different contexts
date: {
short: (date: Date) => date.toLocaleDateString(),
long: (date: Date) => date.toLocaleString(),
relative: (date: Date) => {
const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
const days = Math.floor((date.getTime() - Date.now()) / (1000 * 60 * 60 * 24));
return rtf.format(days, 'day');
},
},
};
Core type definitions for type safety:
// src/types/assets.ts
export interface TokenizedAsset {
id: string;
contractAddress: `0x${string}`;
name: string;
symbol: string;
decimals: number;
totalSupply: bigint;
assetClass: 'SECURITY' | 'COMMODITY' | 'REAL_ESTATE' | 'FUND';
status: 'ACTIVE' | 'PAUSED' | 'MATURED';
metadata: {
issuer: string;
issuanceDate: Date;
maturityDate?: Date;
couponRate?: number;
minimumInvestment: bigint;
regulatoryInfo: {
isin?: string;
cusip?: string;
jurisdiction: string;
exemptions: string[];
};
};
compliance: {
kycRequired: boolean;
accreditationRequired: boolean;
jurisdictionRestrictions: string[];
transferRestrictions: TransferRestriction[];
};
}
export interface TransferRestriction {
type: 'LOCKUP' | 'WHITELIST' | 'BLACKLIST' | 'VOLUME_LIMIT';
parameters: Record<string, any>;
expiryDate?: Date;
}
Input validation for secure operations:
// src/utils/validators.ts
import { z } from 'zod';
export const validators = {
// Ethereum address validation
address: z.string().regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid address'),
// Token amount validation
tokenAmount: z.object({
amount: z.string().regex(/^\d+(\.\d+)?$/, 'Invalid amount'),
decimals: z.number().int().min(0).max(18),
}),
// Asset creation validation
assetCreation: z.object({
name: z.string().min(1).max(100),
symbol: z.string().min(2).max(10).toUpperCase(),
totalSupply: z.string().regex(/^\d+$/, 'Must be integer'),
assetClass: z.enum(['SECURITY', 'COMMODITY', 'REAL_ESTATE', 'FUND']),
metadata: z.object({
issuer: z.string().min(1),
minimumInvestment: z.string().regex(/^\d+$/),
regulatoryInfo: z.object({
jurisdiction: z.string().length(2), // ISO country code
exemptions: z.array(z.string()),
}),
}),
}),
};
Development workflow and deployment
Set up development environment
# Clone the repository
git clone https://github.com/settlemint/asset-tokenization-kit
cd asset-tokenization-kit/kit/dapp
# Install dependencies (using Bun for 3x faster installs)
bun install
# Copy environment variables
cp .env.example .env.local
# Configure your RPC endpoints and API keys
# NEXT_PUBLIC_RPC_URL=https://your-rpc-endpoint
# NEXT_PUBLIC_CHAIN_ID=1
# API_KEY=your-api-key
Start development server
# Run development server with hot reload
bun dev
# Opens at http://localhost:3000
# Run with specific environment
NODE_ENV=development bun dev
# Enable debug logging
DEBUG=atk:* bun dev
Build for production
# Type check
bun run type-check
# Run linter
bun run lint
# Run tests
bun test
# Build production bundle
bun run build
# Outputs to .next/ directory
# Analyze bundle size
ANALYZE=true bun run build
Deploy to production
Deployment options:
Vercel (Recommended)
vercel --prod
Docker
docker build -t atk-frontend .
docker run -p 3000:3000 atk-frontend
Kubernetes
kubectl apply -f k8s/deployment.yaml
Pro tip: Use feature flags for gradual rollouts. The ATK includes built-in support for LaunchDarkly and Unleash.
Real-world customization examples
DBS Bank - Project Orchid
Customized for government bond tokenization with SGD stablecoin integration
Santander - Digital Assets Platform
Adapted for corporate bond issuance with multi-currency support
BlackRock - Private Markets
Modified for alternative investment funds with sophisticated compliance rules
Société Générale - FORGE
Enhanced for security token offerings with regulatory reporting
Need help with customization?
Enterprise Support: Get dedicated assistance from SettleMint's engineering team. Contact [email protected] for:
- Custom component development
- Integration with existing systems
- Performance optimization
- Security audits
- Training workshops
API Portal - Asset Tokenization APIs & Integration
Complete API reference for tokenization platforms. REST & GraphQL APIs for bonds, stablecoins, equity tokens. 150+ endpoints with enterprise-grade security and 99.9% uptime.
Bond tokenization
A comprehensive guide to the tokenization of bond instruments using blockchain infrastructure for issuance, trading, and lifecycle management