Components
Utility
Utility components for common functionality
Utility Components
Utility components for common functionality like language and theme switching.
LanguageSelector
Switch between supported languages.
Basic Usage
import { LanguageSelector } from '@/components/locale/LanguageSelector'
<LanguageSelector />Features
- Displays all supported languages
- Shows native language names
- Automatically reloads page on change
- Persists selection in cookies
Examples
// Basic usage
<LanguageSelector />
// In a form
<fieldset className="fieldset">
<label className="label">
<span className="label-text">Language</span>
</label>
<LanguageSelector />
</fieldset>
// In settings card
<div className="card bg-base-100 shadow-xl">
<div className="card-body">
<h2 className="card-title">Language Settings</h2>
<fieldset className="fieldset">
<label className="label">
<span className="label-text">Preferred Language</span>
</label>
<LanguageSelector />
</fieldset>
<p className="text-sm opacity-60 mt-2">
Select your preferred language. The page will reload to apply changes.
</p>
</div>
</div>Supported Languages
By default, TikShip supports:
- English (en) - English
- Chinese (zh) - 简体中文
- Spanish (es) - Español
Add more languages in src/config/site.ts:
export const siteConfig = {
locale: {
default: 'en',
supported: [
{ value: 'en', label: 'English', nativeName: 'English' },
{ value: 'zh', label: 'Chinese', nativeName: '简体中文' },
{ value: 'es', label: 'Spanish', nativeName: 'Español' },
{ value: 'fr', label: 'French', nativeName: 'Français' },
],
},
}ThemeSelector
Switch between DaisyUI themes.
Basic Usage
import { ThemeSelector } from '@/components/theme/ThemeSelector'
<ThemeSelector />Features
- 33 DaisyUI themes available
- Live preview of theme colors
- Persists selection in localStorage
- Instant theme switching (no reload)
Examples
// Basic usage
<ThemeSelector />
// In a form
<fieldset className="fieldset">
<label className="label">
<span className="label-text">Theme</span>
</label>
<ThemeSelector />
</fieldset>
// In settings card
<div className="card bg-base-100 shadow-xl">
<div className="card-body">
<h2 className="card-title">Appearance Settings</h2>
<fieldset className="fieldset">
<label className="label">
<span className="label-text">Theme</span>
</label>
<ThemeSelector />
</fieldset>
<p className="text-sm opacity-60 mt-2">
Choose your preferred theme. Changes will be applied immediately.
</p>
</div>
</div>Available Themes
Light Themes:
- light, corporate, cupcake, bumblebee, emerald, fantasy
- wireframe, cmyk, autumn, acid, lemonade, winter
Dark Themes:
- dark, business, night, coffee, dim, sunset
- dracula, synthwave, halloween, forest, aqua, black, luxury
Configure Default Theme
Edit src/config/site.ts:
export const siteConfig = {
theme: {
default: 'system', // 'light', 'dark', or 'system'
lightTheme: 'corporate',
darkTheme: 'business',
},
}Settings Page Example
Complete settings page using utility components:
import { LanguageSelector } from '@/components/locale/LanguageSelector'
import { ThemeSelector } from '@/components/theme/ThemeSelector'
import { Card } from '@/components/ui/Card'
import { Button } from '@/components/ui/Button'
import { Input } from '@/components/ui/Input'
export function SettingsPage() {
return (
<div className="max-w-4xl mx-auto space-y-6 p-6">
<h1 className="text-3xl font-bold">Settings</h1>
{/* Profile Settings */}
<Card title="Profile">
<div className="space-y-4">
<Input label="Name" defaultValue="John Doe" />
<Input label="Email" type="email" defaultValue="john@example.com" />
<Button>Save Changes</Button>
</div>
</Card>
{/* Appearance Settings */}
<Card title="Appearance">
<div className="space-y-4">
<fieldset className="fieldset">
<label className="label">
<span className="label-text">Theme</span>
</label>
<ThemeSelector />
<label className="label">
<span className="label-text-alt">
Choose your preferred color theme
</span>
</label>
</fieldset>
</div>
</Card>
{/* Language Settings */}
<Card title="Language">
<div className="space-y-4">
<fieldset className="fieldset">
<label className="label">
<span className="label-text">Preferred Language</span>
</label>
<LanguageSelector />
<label className="label">
<span className="label-text-alt">
The page will reload when you change the language
</span>
</label>
</fieldset>
</div>
</Card>
{/* Notification Settings */}
<Card title="Notifications">
<div className="space-y-4">
<fieldset className="fieldset">
<label className="label cursor-pointer">
<span className="label-text">Email notifications</span>
<input type="checkbox" className="toggle" defaultChecked />
</label>
</fieldset>
<fieldset className="fieldset">
<label className="label cursor-pointer">
<span className="label-text">Push notifications</span>
<input type="checkbox" className="toggle" />
</label>
</fieldset>
<Button>Save Preferences</Button>
</div>
</Card>
</div>
)
}User Preferences Hook
Custom hook for managing user preferences:
import { useState, useEffect } from 'react'
import { useLocale } from 'next-intl'
export function useUserPreferences() {
const locale = useLocale()
const [theme, setTheme] = useState('system')
useEffect(() => {
const savedTheme = localStorage.getItem('theme')
if (savedTheme) setTheme(savedTheme)
}, [])
const updateTheme = (newTheme: string) => {
setTheme(newTheme)
localStorage.setItem('theme', newTheme)
document.documentElement.setAttribute('data-theme', newTheme)
}
return {
locale,
theme,
updateTheme,
}
}
// Usage
export function Component() {
const { locale, theme, updateTheme } = useUserPreferences()
return (
<div>
<p>Current locale: {locale}</p>
<p>Current theme: {theme}</p>
<button onClick={() => updateTheme('dark')}>Dark Mode</button>
</div>
)
}Next Steps
- Form Components - Buttons, inputs
- Display Components - Cards, alerts
- Data Components - Tables, pagination
- Features - Explore all features