263 lines
6.5 KiB
Markdown
263 lines
6.5 KiB
Markdown
# Tailwind 4 + Shadcn/ui Setup Complete ✅
|
|
|
|
## What's Been Configured
|
|
|
|
### 1. Tailwind CSS 4 (CSS-First Approach)
|
|
- Using `@import` directive (no PostCSS required)
|
|
- Clean CSS variables for theming
|
|
- Dark mode support built-in
|
|
- Responsive utilities
|
|
|
|
### 2. Shadcn/ui Components
|
|
- **Card**: Display article content
|
|
- CardHeader
|
|
- CardTitle
|
|
- CardDescription
|
|
- CardContent
|
|
- CardFooter
|
|
- **Button**: Interactive elements (available but not used yet)
|
|
|
|
### 3. Utilities
|
|
- `cn()` function for merging Tailwind classes
|
|
- Uses `clsx` for conditional classes
|
|
- Uses `tailwind-merge` for Tailwind-specific merging
|
|
|
|
### 4. TypeScript Configuration
|
|
- Path aliases configured: `@/` → `./src/`
|
|
- shadcn/ui aliases: `@/components`, `@/utils`
|
|
|
|
## How to Use
|
|
|
|
### Using Existing Components
|
|
|
|
```tsx
|
|
import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@/components/ui/card'
|
|
|
|
export function MyComponent() {
|
|
return (
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>Title</CardTitle>
|
|
<CardDescription>Description</CardDescription>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<p>Content goes here</p>
|
|
</CardContent>
|
|
<CardFooter>
|
|
<span>Footer content</span>
|
|
</CardFooter>
|
|
</Card>
|
|
)
|
|
}
|
|
```
|
|
|
|
### Using Tailwind Classes
|
|
|
|
```tsx
|
|
export function MyComponent() {
|
|
return (
|
|
<div className="p-4 bg-background text-foreground">
|
|
<h1 className="text-2xl font-bold">Title</h1>
|
|
<p className="text-muted-foreground">Description</p>
|
|
</div>
|
|
)
|
|
}
|
|
```
|
|
|
|
### Using the cn() Utility
|
|
|
|
```tsx
|
|
import { cn } from '@/lib/utils'
|
|
|
|
export function MyComponent({ className, isActive }: Props) {
|
|
return (
|
|
<div className={cn(
|
|
"base-class p-4",
|
|
isActive && "active-class",
|
|
className
|
|
)}>
|
|
Content
|
|
</div>
|
|
)
|
|
}
|
|
```
|
|
|
|
## Adding More Shadcn/ui Components
|
|
|
|
### Using the CLI
|
|
|
|
```bash
|
|
cd frontend
|
|
npx shadcn@latest add [component-name]
|
|
```
|
|
|
|
### Recommended Components to Add
|
|
|
|
```bash
|
|
npx shadcn@latest add badge # For article tags
|
|
npx shadcn@latest add input # For search
|
|
npx shadcn@latest add dialog # For article details modal
|
|
npx shadcn@latest add tabs # For organizing content
|
|
npx shadcn@latest add separator # For visual separation
|
|
npx shadcn@latest add skeleton # For loading states
|
|
npx shadcn@latest add pagination # For article list navigation
|
|
```
|
|
|
|
### Manual Installation
|
|
|
|
If CLI doesn't work, you can manually create components:
|
|
|
|
1. Visit [ui.shadcn.com](https://ui.shadcn.com)
|
|
2. Find the component you want
|
|
3. Copy the code
|
|
4. Create file: `frontend/src/components/ui/[component].tsx`
|
|
5. Import and use
|
|
|
|
## Customization
|
|
|
|
### Theme Colors
|
|
|
|
Edit `src/index.css`:
|
|
|
|
```css
|
|
:root {
|
|
--background: 0 0% 100%; /* Background color */
|
|
--foreground: 222.2 84% 4.9%; /* Text color */
|
|
--primary: 222.2 47.4% 11.2%; /* Primary color */
|
|
--card: 0 0% 100%; /* Card background */
|
|
/* ... more variables */
|
|
}
|
|
```
|
|
|
|
### Adding Custom Colors to Tailwind
|
|
|
|
Edit `tailwind.config.js`:
|
|
|
|
```js
|
|
theme: {
|
|
extend: {
|
|
colors: {
|
|
brand: {
|
|
50: '#f0f9ff',
|
|
100: '#e0e7ff',
|
|
500: '#3b82f6',
|
|
// ... more shades
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Current Implementation
|
|
|
|
### App.tsx
|
|
|
|
The main app displays:
|
|
- Header with "Placebo.mk" title
|
|
- Subtitle "Sarcastic news from Macedonia"
|
|
- Responsive grid of article cards (1/2/3 columns)
|
|
- Each card shows:
|
|
- Featured image (if available)
|
|
- Title (truncated to 2 lines)
|
|
- Excerpt (truncated to 3 lines)
|
|
- Content preview (truncated to 4 lines)
|
|
- Creation date
|
|
- View count
|
|
- Loading and error states
|
|
- Empty state when no articles
|
|
|
|
## Dark Mode
|
|
|
|
To enable dark mode, add a toggle:
|
|
|
|
```tsx
|
|
import { useEffect } from 'react'
|
|
|
|
export function ThemeToggle() {
|
|
useEffect(() => {
|
|
const isDark = localStorage.getItem('theme') === 'dark'
|
|
document.documentElement.classList.toggle('dark', isDark)
|
|
}, [])
|
|
|
|
const toggleTheme = () => {
|
|
const isDark = document.documentElement.classList.toggle('dark')
|
|
localStorage.setItem('theme', isDark ? 'dark' : 'light')
|
|
}
|
|
|
|
return (
|
|
<button onClick={toggleTheme}>
|
|
Toggle Theme
|
|
</button>
|
|
)
|
|
}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Tailwind Classes Not Applying
|
|
|
|
1. Check that `@tailwind` directives are in `src/index.css`
|
|
2. Restart dev server: `npm run dev`
|
|
3. Hard refresh browser: Ctrl+Shift+R
|
|
4. Check browser DevTools → Elements → Computed Styles
|
|
|
|
### Component Not Found
|
|
|
|
1. Check file exists: `frontend/src/components/ui/[component].tsx`
|
|
2. Check export name matches: `export const ComponentName = ...`
|
|
3. Check import path: `@/components/ui/component`
|
|
4. Restart TypeScript server (VSCode: Cmd+Shift+P → "TypeScript: Restart TS Server")
|
|
|
|
### TypeScript Errors
|
|
|
|
1. Check `tsconfig.json` has `@/` paths configured
|
|
2. Restart TypeScript server
|
|
3. Run: `npm run type-check`
|
|
4. Check `components.json` aliases
|
|
|
|
## Performance Tips
|
|
|
|
1. **Image Optimization**: Add `loading="lazy"` to article images
|
|
2. **Code Splitting**: Use `lazy()` for large components
|
|
3. **Query Caching**: TanStack Query caches automatically
|
|
4. **Bundle Analysis**: Run `npm run build` and check bundle size
|
|
|
|
## File Structure
|
|
|
|
```
|
|
frontend/
|
|
├── src/
|
|
│ ├── components/
|
|
│ │ └── ui/ # shadcn/ui components
|
|
│ │ ├── button.tsx
|
|
│ │ └── card.tsx
|
|
│ ├── lib/
|
|
│ │ ├── api.ts # API functions
|
|
│ │ ├── query-client.ts # TanStack Query
|
|
│ │ └── utils.ts # cn() utility
|
|
│ ├── App.tsx # Main application
|
|
│ ├── index.css # Tailwind + CSS variables
|
|
│ └── main.tsx
|
|
├── components.json # shadcn config
|
|
├── tailwind.config.js # Tailwind configuration
|
|
└── package.json
|
|
```
|
|
|
|
## Next Steps
|
|
|
|
1. **Add article detail page**: Click on card to view full article
|
|
2. **Add search input**: Filter articles by title/content
|
|
3. **Add category filter**: Filter by article category
|
|
4. **Add tag badges**: Display article tags
|
|
5. **Add pagination**: Navigate through large article lists
|
|
6. **Add dark mode toggle**: Switch between light/dark themes
|
|
7. **Add article detail modal**: View article without leaving page
|
|
|
|
## Resources
|
|
|
|
- [Tailwind CSS 4 Docs](https://tailwindcss.com/docs/installation/using-postcss)
|
|
- [Shadcn/ui Documentation](https://ui.shadcn.com)
|
|
- [Radix UI](https://www.radix-ui.com/) - Underlying component library
|
|
- [Lucide Icons](https://lucide.dev/) - Icon library (installed)
|
|
- [TanStack Query Docs](https://tanstack.com/query/latest)
|