UNPKG

@anyreach/component-library-ui

Version:

React component library built on shadcn/ui foundation following atomic design principles

511 lines (381 loc) 12.8 kB
# @anyreach/component-library-ui A comprehensive React component library built on **shadcn/ui** foundation with **restrictive design patterns** for consistent, beautiful UIs. ## ✨ Features - 🎨 **20+ Production-Ready Components** - Complete UI component ecosystem - 🔒 **Restrictive Design Patterns** - Consistent styling with limited customization for design system coherence -**Built on shadcn/ui** - Leverages Radix UI primitives and modern React patterns - 🎯 **TypeScript First** - Full type safety and excellent DX - 🌗 **Dark Mode Ready** - All components support light/dark themes - 📱 **Responsive Design** - Mobile-first approach with Tailwind CSS -**Accessibility** - WCAG compliant with proper ARIA attributes - 🎭 **Class Variance Authority** - Consistent variant management - 📊 **Advanced Data Table** - Sorting, filtering, pagination, row selection - 🏗️ **Page Templates** - Complete layout components (Navbar, Sidebar, Lists) - 🔤 **Local Font Support** - Beautiful Geist fonts bundled locally for offline support ## 📦 Installation ```bash npm install @anyreach/component-library-ui ``` ### Peer Dependencies This library requires these peer dependencies: ```bash npm install react react-dom tailwindcss ``` ## 🎯 Quick Setup ### 1. Import Styles Import the component styles **with fonts** in your app entry point: ```tsx // In your main App.tsx, _app.tsx, or layout.tsx import '@anyreach/component-library-ui/styles' ``` **Alternative import paths:** ```tsx // Both of these work identically import '@anyreach/component-library-ui/styles' import '@anyreach/component-library-ui/dist/style.css' ``` ### 2. Configure Tailwind CSS Add our component paths to your `tailwind.config.js`: ```js /** @type {import('tailwindcss').Config} */ module.exports = { content: [ './src/**/*.{js,ts,jsx,tsx}', './app/**/*.{js,ts,jsx,tsx}', // For Next.js app directory './pages/**/*.{js,ts,jsx,tsx}', // For Next.js pages directory './node_modules/@anyreach/component-library-ui/dist/**/*.{js,ts,jsx,tsx}', ], theme: { extend: { fontFamily: { sans: ['Geist Sans', 'Inter', 'system-ui', 'sans-serif'], mono: ['Geist Mono', 'JetBrains Mono', 'monospace'], }, }, }, plugins: [], } ``` ### 3. Framework-Specific Configuration #### Next.js Configuration For **Next.js 13+ (App Router)** or **Next.js 12+ (Pages Router)**, add transpilation: ```js // next.config.js /** @type {import('next').NextConfig} */ const nextConfig = { transpilePackages: ['@anyreach/component-library-ui'], experimental: { // Required for proper SSR support esmExternals: 'loose', }, } module.exports = nextConfig ``` #### Vite Configuration For **Vite** projects, no additional configuration needed! Just import and use. #### Create React App For **CRA** projects, use CRACO or eject to configure Tailwind CSS properly. ## 🔤 Font Support This library includes **Geist Sans** and **Geist Mono** fonts bundled locally: -**Offline Support** - Fonts work without internet connection -**No External Requests** - Better privacy and performance -**Self-Contained** - Everything bundled in the npm package -**Optimized Loading** - WOFF2 format with fallbacks ### Font Weights Included - **Geist Sans**: 400, 500, 600, 700 (Regular to Bold) - **Geist Mono**: 400, 500, 600, 700 (Regular to Bold) ### Font CSS Variables The library automatically applies these font families: ```css body { font-family: 'Geist Sans', Inter, system-ui, sans-serif; } .font-mono { font-family: 'Geist Mono', 'JetBrains Mono', monospace; } ``` ## 🚀 Basic Usage ```tsx import { Button, Input, Card, CardHeader, CardContent } from '@anyreach/component-library-ui' function App() { return ( <Card className="w-96"> <CardHeader> <h2>Welcome!</h2> </CardHeader> <CardContent className="space-y-4"> <Input placeholder="Enter your name" /> <Button>Get Started</Button> </CardContent> </Card> ) } ``` ## 🔧 Advanced Integration ### Server-Side Rendering (SSR) The library is fully SSR-compatible with proper hydration: ```tsx // ✅ Works with Next.js, Remix, SvelteKit, etc. import { Button } from '@anyreach/component-library-ui' export default function Page() { return <Button>SSR-safe button</Button> } ``` ### Dynamic Imports For code splitting, you can dynamically import components: ```tsx import dynamic from 'next/dynamic' const DataTable = dynamic( () => import('@anyreach/component-library-ui').then(mod => ({ default: mod.DataTable })), { ssr: false } // Optional: disable SSR for heavy components ) ``` ### Custom Theme Integration Override CSS variables for custom theming: ```css /* In your global CSS */ :root { --background: 0 0% 100%; --foreground: 222.2 84% 4.9%; --primary: 221.2 83.2% 53.3%; --primary-foreground: 210 40% 98%; /* ... other variables */ } .dark { --background: 222.2 84% 4.9%; --foreground: 210 40% 98%; /* ... dark mode overrides */ } ``` ## 📚 Component Categories ### Core Components - **Button** - Primary, secondary, destructive, ghost variants with loading states - **Input** - Text input with search variant and icon support - **Label** - Form labels with proper accessibility ### Form Components - **Checkbox** - Square checkboxes with indeterminate state - **RadioGroup** - Radio button groups with vertical/horizontal layouts - **Textarea** - Multi-line text input with resizing - **Slider** - Range slider with step support ### Display Components - **Avatar** - User avatars with fallback initials and status indicators - **Badge** - Semantic badges with color variants - **Progress** - Progress bars with customizable height - **Separator** - Horizontal/vertical dividers ### Layout Components - **Card** - Content cards with header, content, and footer slots - **Breadcrumb** - Navigation breadcrumbs with ellipsis overflow - **Pagination** - Page navigation with numbered links ### Interactive Components - **Select** - Dropdown selectors with groups and sections - **Calendar** - Date picker with range selection and dropdown navigation - **FileInput** - Drag & drop file uploader with previews ### Overlay Components - **Modal** - Centered dialogs with backdrop - **Sheet** - Side panels with slide animations - **Toast** - Notification system with variants ### Data Components - **DataTable** - Advanced table with sorting, filtering, pagination, and row selection ### Page Template Components - **Navbar** - Top navigation with breadcrumbs and theme toggle - **Sidebar** - Collapsible sidebar with user menu and grouped navigation - **ListTemplate** - Complete list page with layout switching (table/cards/horizontal) ## 💡 Usage Examples ### Button with Loading State ```tsx import { Button } from '@anyreach/component-library-ui' import { Save } from 'lucide-react' function SaveForm() { const [loading, setLoading] = useState(false) return ( <Button variant="default" loading={loading} icon={<Save />}> Save Changes </Button> ) } ``` ### Complete Form ```tsx import { Button, Input, Label, Checkbox, Card, CardHeader, CardContent, } from '@anyreach/component-library-ui' function UserForm() { return ( <Card className="max-w-md"> <CardHeader> <h2>User Registration</h2> </CardHeader> <CardContent className="space-y-4"> <div> <Label htmlFor="email">Email</Label> <Input id="email" type="email" placeholder="user@example.com" /> </div> <div> <Label htmlFor="password">Password</Label> <Input id="password" type="password" /> </div> <Checkbox>I agree to the terms and conditions</Checkbox> <Button className="w-full">Create Account</Button> </CardContent> </Card> ) } ``` ### Data Table with Full Features ```tsx import { DataTable } from '@anyreach/component-library-ui' const columns = [ { key: 'name', title: 'Name', sortable: true, filterable: true }, { key: 'email', title: 'Email', sortable: true }, { key: 'role', title: 'Role', sortable: true, filterable: true }, { key: 'status', title: 'Status', sortable: true, filterable: true }, ] function UsersTable() { return ( <DataTable data={users} columns={columns} keepSearch={true} keepFilters={true} keepPagination={true} keepSort={true} pageSize={20} /> ) } ``` ### Complete Page Layout ```tsx import { Navbar, Sidebar, ListTemplate } from '@anyreach/component-library-ui' function AdminDashboard() { return ( <div className="h-screen flex flex-col"> <Navbar title="Admin Panel" breadcrumbs={breadcrumbs} showThemeToggle={true} /> <div className="flex flex-1"> <Sidebar groups={navigationGroups} showUserMenu={true} userInfo={currentUser} /> <main className="flex-1 p-6"> <ListTemplate title="User Management" data={users} columns={userColumns} layout="cards" onLayoutChange={setLayout} showAddButton={true} onAdd={() => setShowUserModal(true)} /> </main> </div> </div> ) } ``` ## 🛠️ Troubleshooting ### Font Loading Issues **Problem**: Fonts not loading or showing fallbacks ```tsx // ❌ Wrong: CSS not imported import { Button } from '@anyreach/component-library-ui' // Missing CSS import // ✅ Correct: Import CSS first import '@anyreach/component-library-ui/styles' import { Button } from '@anyreach/component-library-ui' ``` ### Next.js Build Errors **Problem**: Module not found or SSR hydration mismatches ```js // ✅ Add to next.config.js module.exports = { transpilePackages: ['@anyreach/component-library-ui'], experimental: { esmExternals: 'loose', }, } ``` ### Tailwind CSS Not Working **Problem**: Component styles not applying ```js // ✅ Add to tailwind.config.js content array module.exports = { content: [ './src/**/*.{js,ts,jsx,tsx}', './node_modules/@anyreach/component-library-ui/dist/**/*.{js,ts,jsx,tsx}', // This line is required ], } ``` ### TypeScript Errors **Problem**: Module declaration not found ```bash # ✅ Install types npm install @types/react @types/react-dom ``` ### Performance Issues **Problem**: Large bundle size ```tsx // ✅ Use specific imports instead of barrel imports import { Button } from '@anyreach/component-library-ui' // Tree-shaking works automatically // ❌ Don't worry about this - our build is optimized import * as Components from '@anyreach/component-library-ui' // Still tree-shaken ``` ## 🎨 Design Philosophy This library follows **restrictive design patterns**: - **Fixed positioning**: Button icons always left, Input icons always right - **Limited variants**: Carefully curated options to maintain consistency - **Zinc color palette**: Subtle, professional color scheme - **Consistent spacing**: Standardized padding, margins, and sizing - **Type safety**: Full TypeScript support with strict interfaces - **Accessibility first**: WCAG compliant with proper ARIA attributes ## 🔧 Development ```bash # Install dependencies npm install # Start development server npm run dev # Build library with fonts npm run build # Clean build artifacts npm run clean # Lint code npm run lint # Fix linting issues npm run lint:fix # Type checking npm run type-check # Run all validations npm run validate ``` ### Build Process The build process includes: 1. **TypeScript compilation** - Generates type definitions 2. **Vite bundling** - Creates ESM and CommonJS builds 3. **CSS generation** - Processes Tailwind CSS with Geist fonts 4. **Font copying** - Bundles local font files for distribution ## 📄 License MIT License - see LICENSE file for details. ## 🤝 Contributing Contributions are welcome! Please read our contributing guidelines and submit pull requests for any improvements. ## 📋 Changelog ### v0.3.0 -**Local Font Support** - Geist Sans & Geist Mono bundled locally - 🚀 **Improved SSR** - Better Next.js and SSR framework compatibility - 📦 **Optimized Build** - Smaller bundle size with tree-shaking - 🔧 **Enhanced DX** - Better TypeScript support and error messages ### v0.2.x - 🐛 Font loading improvements and CDN fallbacks - 🔧 Build configuration enhancements ### v0.1.x - 🎉 Initial release with 20+ components - 📊 Complete page template system - 🔍 Advanced data table with full feature set - 📝 Comprehensive form component collection - 🌗 Dark mode support throughout - 📘 Full TypeScript support --- **Built with ❤️ on shadcn/ui foundation**