Application Kits/Asset Tokenization

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

Application Code

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 CategoryCountExamples
Asset Management15AssetCard, AssetTable, AssetDetails
Authentication8WalletConnect, LoginForm, KYCStatus
Transaction UI12TransferModal, MintForm, BurnDialog
Data Display10PortfolioChart, YieldGraph, Holdings
Admin Tools5UserManager, 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:

ServiceHookPurpose
ChainalysisuseComplianceCheck()Transaction screening
OnfidouseIdentityVerification()KYC document verification
FireblocksuseCustodialWallet()Institutional custody
ChainlinkusePriceOracle()Real-time asset pricing
The GraphuseSubgraphQuery()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