# 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 (

Title

Description

) } ``` ### 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)