# 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 (
Title
Description
Content goes here
Footer content
)
}
```
### Using Tailwind Classes
```tsx
export function MyComponent() {
return (
)
}
```
### Using the cn() Utility
```tsx
import { cn } from '@/lib/utils'
export function MyComponent({ className, isActive }: Props) {
return (
Content
)
}
```
## 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 (
)
}
```
## 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)