Guide for Developers
Installation, setup, and your first component with Fidus Design System
Installation
Install the Fidus UI component library using your preferred package manager:
Using npm
npm install @fidus/uiUsing pnpm
pnpm add @fidus/uiUsing yarn
yarn add @fidus/uiPrerequisites
Fidus Design System requires the following dependencies in your project:
- React 18.0 or higher
- TypeScript 5.0 or higher (recommended)
- Tailwind CSS 3.0 or higher
Note on Styling
Fidus components use Tailwind CSS for styling. If you do not have Tailwind CSS installed in your project, follow the Tailwind CSS installation guide for your framework.
Basic Setup with Next.js
Here is how to set up Fidus Design System in a Next.js project:
1. Create a Next.js Project
npx create-next-app@latest my-fidus-app
cd my-fidus-app2. Install Fidus UI
npm install @fidus/ui3. Configure Tailwind CSS
Update your tailwind.config.js to include Fidus components:
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
'./pages/**/*.{js,ts,jsx,tsx,mdx}',
'./components/**/*.{js,ts,jsx,tsx,mdx}',
'./app/**/*.{js,ts,jsx,tsx,mdx}',
// Include Fidus UI components
'./node_modules/@fidus/ui/**/*.{js,ts,jsx,tsx}',
],
theme: {
extend: {
// Fidus design tokens
spacing: {
'xs': '0.25rem', // 4px
'sm': '0.5rem', // 8px
'md': '1rem', // 16px
'lg': '1.5rem', // 24px
'xl': '2rem', // 32px
'2xl': '3rem', // 48px
},
},
},
plugins: [],
}4. Add Global Styles
Create or update app/globals.css:
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
/* Fidus Design Tokens */
--color-primary: #2563eb;
--color-secondary: #64748b;
--color-success: #16a34a;
--color-warning: #f59e0b;
--color-danger: #dc2626;
--spacing-xs: 0.25rem;
--spacing-sm: 0.5rem;
--spacing-md: 1rem;
--spacing-lg: 1.5rem;
--spacing-xl: 2rem;
}Your First Component
Let's create a simple page with a Button component:
Import and Use Button
import { Button } from '@fidus/ui/button';;
export default function HomePage() {
const handleClick = () => {
alert('Button clicked!');
};
return (
<div className="p-8">
<h1 className="text-3xl font-bold mb-6">
Welcome to Fidus
</h1>
<div className="space-x-4">
<Button variant="primary" onClick={handleClick}>
Primary Button
</Button>
<Button variant="secondary" onClick={handleClick}>
Secondary Button
</Button>
<Button variant="outline" onClick={handleClick}>
Outline Button
</Button>
</div>
</div>
);
}Result
You should now see three styled buttons on your page. All buttons are fully accessible, support keyboard navigation, and follow Fidus design principles.
Importing Components
Fidus UI exports all components from the main package. You can import them individually or as a group:
Named Imports (Recommended)
import { Button } from '@fidus/ui/button';
import { Card } from '@fidus/ui/card';
import { Alert } from '@fidus/ui/alert';;Available Components
Core components available in the library:
- Layout: Container, Stack, Grid
- Forms: Button, Input, Textarea, Checkbox, Radio, Select, DatePicker, TimePicker
- Data Display: Card, Table, Badge, Avatar
- Feedback: Alert, Toast, Progress, Spinner
- Navigation: Tabs, Breadcrumbs
- Overlay: Modal, Dialog, Tooltip
TypeScript Support
Fidus Design System is built with TypeScript and provides complete type definitions:
import { Button } from '@fidus/ui/button';;
// Component with typed props
interface MyComponentProps {
onSubmit: () => void;
disabled?: boolean;
}
export function MyComponent({ onSubmit, disabled }: MyComponentProps) {
return (
<Button
variant="primary"
size="large"
onClick={onSubmit}
disabled={disabled}
>
Submit
</Button>
);
}
// Using ButtonProps for custom wrappers
export function CustomButton(props: ButtonProps) {
return <Button {...props} className="my-custom-class" />;
}Type Safety
All component props are fully typed, providing autocomplete and compile-time error checking. This helps catch issues early and improves developer experience.
Styling Components
Fidus components use Tailwind CSS and CSS variables for styling:
Using CSS Variables
<div
style={{
padding: 'var(--spacing-md)',
margin: 'var(--spacing-lg)',
color: 'var(--color-primary)',
}}
>
Content with design tokens
</div>Extending Component Styles
import { Button } from '@fidus/ui/button';;
// Add additional classes to components
<Button
variant="primary"
className="shadow-lg hover:shadow-xl transition-shadow"
>
Custom Styled Button
</Button>Important: Never Hardcode Spacing
Always use CSS variables or Tailwind classes for spacing:
// ❌ BAD: Hardcoded values
<div style={{ padding: '16px', margin: '8px' }}>
// ✅ GOOD: CSS variables
<div style={{
padding: 'var(--spacing-md)',
margin: 'var(--spacing-sm)'
}}>
// ✅ GOOD: Tailwind classes
<div className="p-md m-sm">Theme Configuration
Fidus supports light and dark themes out of the box:
Setting Up Dark Mode
// tailwind.config.js
module.exports = {
darkMode: 'class', // Enable class-based dark mode
// ... rest of config
}
// In your root layout or theme provider
<html className={theme === 'dark' ? 'dark' : ''}>
<body>{children}</body>
</html>Dark Mode CSS Variables
/* globals.css */
:root {
--color-background: #ffffff;
--color-foreground: #000000;
}
.dark {
--color-background: #0f172a;
--color-foreground: #f1f5f9;
}Form Example
Here is a complete example of a form using Fidus components:
import { useState } from 'react';
import { Button } from '@fidus/ui/button';
import { Alert } from '@fidus/ui/alert';;
export function ContactForm() {
const [formData, setFormData] = useState({
name: '',
email: '',
message: '',
});
const [submitted, setSubmitted] = useState(false);
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
// Handle form submission
setSubmitted(true);
};
return (
<form onSubmit={handleSubmit} className="space-y-6">
{submitted && (
<Alert variant="success">
Thank you! Your message has been sent.
</Alert>
)}
<Input
label="Name"
value={formData.name}
onChange={(e) =>
setFormData({ ...formData, name: e.target.value })
}
required
/>
<Input
label="Email"
type="email"
value={formData.email}
onChange={(e) =>
setFormData({ ...formData, email: e.target.value })
}
required
/>
<Textarea
label="Message"
value={formData.message}
onChange={(e) =>
setFormData({ ...formData, message: e.target.value })
}
rows={5}
required
/>
<Button type="submit" variant="primary">
Send Message
</Button>
</form>
);
}Testing Components
Fidus components are designed to be easily testable with common testing libraries:
Using Vitest and React Testing Library
import { render, screen, fireEvent } from '@testing-library/react';
import { Button } from '@fidus/ui/button';;
import { describe, it, expect, vi } from 'vitest';
describe('Button', () => {
it('should render with text', () => {
render(<Button>Click me</Button>);
expect(screen.getByText('Click me')).toBeInTheDocument();
});
it('should call onClick when clicked', () => {
const handleClick = vi.fn();
render(<Button onClick={handleClick}>Click me</Button>);
fireEvent.click(screen.getByText('Click me'));
expect(handleClick).toHaveBeenCalledOnce();
});
it('should be disabled when disabled prop is true', () => {
render(<Button disabled>Click me</Button>);
expect(screen.getByText('Click me')).toBeDisabled();
});
});Test IDs
All Fidus components include data-test-id attributes for easy selection in tests. Use single values without spaces:
// ✅ GOOD: Single value
<Button data-test-id="submit-button">Submit</Button>
// ❌ BAD: Multiple values
<Button data-test-id="submit button">Submit</Button>Next Steps
Need Help?
If you encounter issues or have questions about using Fidus Design System:
- Check the component documentation for API details
- Review the patterns section for common use cases
- Visit the contributing guide to report bugs or request features