Migrate Ant Design UIs to shadcn/ui + Tailwind (React/CRA/Vite → Next.js App Router). Use for: component replacement (no wrappers), Tailwind-first styling, canonical component consolidation, global CSS cleanup, route/layout scaffolding, and migration gotchas.
Install with Tessl CLI
npx tessl i github:uzhussain/ant-to-shadcn --skill ant-to-shadcn-migration87
Quality
81%
Does it follow best practices?
Impact
96%
1.05xAverage score across 3 eval scenarios
Comprehensive guide for migrating legacy Ant Design frontends to shadcn/ui + Tailwind (Radix under the hood), covering component equivalence, theming/tokens, layout/navigation, forms/tables, overlays/alerts, accessibility, and bundle-size cleanup. Targets React (CRA/Vite) apps moving to Next.js App Router, with patterns for running Ant and shadcn side-by-side during transition. Includes automated skeleton generation guidance for fresh layouts/pages with role-aware routing.
Use the latest stable versions of:
next ≥ 16.x (App Router)react ≥ 19.xtailwindcss ≥ 3.4.xshadcn/ui latest@radix-ui packages as pulled by shadcn/uiclass-variance-authority, tailwind-merge, lucide-react, sonnerreact-hook-form ≥ 7.x and zod ≥ 3.x for forms (recommended)| Priority | Category | Impact | Prefix | Rules |
|---|---|---|---|---|
| 1 | Setup & Dependencies | CRITICAL | setup- | 5 |
| 2 | Design Tokens & Theming | CRITICAL | theme- | 2 |
| 3 | Layout & Navigation (Responsive) | HIGH | layout- | 3 |
| 4 | Forms & Validation | HIGH | forms- | 3 |
| 5 | Data Display (Tables/Lists) | HIGH | data- | 2 |
| 6 | Feedback & Overlays | HIGH | overlay- | 2 |
| 7 | Content, Icons, Typography | MEDIUM | content- | 1 |
| 8 | Styling & CSS Cleanup | MEDIUM | css- | 2 |
| 9 | Accessibility, Responsiveness & Interop | MEDIUM | a11y- | 4 |
| 10 | Testing & Verification | LOW | test- | 2 |
| 11 | Common Gotchas | HIGH | gotchas- | 4 |
| Ant Design 6.x | shadcn/ui + Tailwind (or pattern) | Notes |
|---|---|---|
| Button | Button, ButtonGroup | |
| FloatButton | Button with fixed/absolute + shadow | |
| Icon | lucide-react | Drop Ant icons |
| Typography | Tailwind text utilities; Typography classes | |
| Divider | Separator | |
| Flex/Grid/Masonry | Tailwind flex/grid; CSS masonry if needed | |
| Layout, Space, Splitter | Tailwind stack/gap; custom splitter with Resizable | |
| Anchor | NavigationMenu/ScrollArea or manual anchor links | |
| Breadcrumb | Breadcrumb | |
| Dropdown | DropdownMenu | |
| Menu | NavigationMenu or Sheet nav | |
| Pagination | Pagination | |
| Steps | Custom flex steps | |
| Tabs | Tabs | |
| AutoComplete/Mentions | Combobox/Command | |
| Cascader/TreeSelect | Combobox with grouped/indented options | |
| Checkbox/Radio | Checkbox, RadioGroup | |
| ColorPicker | Custom popover + color input | |
| DatePicker/TimePicker | Calendar + Popover, time input | |
| Form/Form.Item | Form (RHF) + shadcn fields | |
| Input/InputNumber | Input (number type), InputGroup | |
| Rate | Custom star row using Button/Toggle | |
| Select | Select or Combobox | |
| Slider/Switch | Slider, Switch | |
| Transfer | Dual list with checkboxes and buttons | |
| Upload | File input + dropzone + progress | |
| Avatar | Avatar | |
| Badge/Tag | Badge | |
| Calendar | Calendar | |
| Card | Card | |
| Carousel | Carousel | |
| Collapse | Accordion | |
| Descriptions | Definition list with grid/flex | |
| Empty | Empty or custom empty block | |
| Image | img with Tailwind classes | |
| List | Cards/grid/flex list | |
| Popover/Tooltip | Popover, Tooltip | |
| QRCode | Use QR library + Card | |
| Segmented | ToggleGroup | |
| Statistic | Card + text/metric styling | |
| Table | tanstack + Table | |
| Timeline | Custom vertical list with bullets | |
| Tour | Custom popover walkthrough (command + popover) | |
| Tree | Indented list + checkboxes; virtualize if large | |
| Alert | Alert | |
| Drawer | Sheet | |
| Message/Notification | toast/sonner | |
| Modal/Popconfirm | Dialog / AlertDialog | |
| Progress | Progress | |
| Result | Alert success/error block | |
| Skeleton/Spin | Skeleton or spinner utility | |
| Watermark | CSS background or canvas overlay | |
| Affix | sticky positioning | |
| App/ConfigProvider/Util | Not needed; use shadcn/Tailwind tokens and providers | |
| Pro* (ProTable, etc.) | Compose with tanstack table + filters/forms + cards |
Button/Toggle.Card.background-image or canvas; keep scoped.position: sticky on containers.grid-auto-rows + spans.Card with muted labels.Command/Combobox for search/select; Sonner for toasts; Menubar/Sidebar for complex nav; Spinner for lightweight loading; Chart (community/blocks) where Ant charts were used; Input OTP for code entry; Field/Textarea for richer forms.Form.Item patterns to shadcn + react-hook-form + zod; validation and submission states; success/failure/inline errors.content-icons-typography.a11y-responsive-checks, a11y-motion-contrast, responsive-touch, rtl-l10n.gotchas-ux-fallbacks).perf-bundle-guard).analytics-observability).gotchas-scroll-state).Run scans to route findings to rules:
antd imports and package version → setup-antd-upgrade, setup-, css-legacy, theme-bridge, component mappings.ConfigProvider, theme.useToken → theme-bridge, theme-dark-mode, css-layering.*.less, global.css, index.css) → css-legacy-inventory, css-layering, css-asset-hygiene.style= with Ant tokens → theme-bridge, css-inline-cleanup.NewButton, NewPage, *V2) → gotchas-component-sprawl.Layout.Sider, Menu, Breadcrumb → layout-shell, layout-nav.Form, Form.Item, message, notification, Modal.confirm → forms-*, overlay-*, gotchas-ux-fallbacks.Table, List, Descriptions, Tag, Badge, Empty → data-*, components-* (pagination/result/empty), data-table-tanstack.layout-route-scaffold, layout-auth-discovery, gotchas-coexistence.layout-auth-discovery.@ant-design/icons, global Ant CSS, LESS files → content-icons-typography, css-legacy-inventory, perf-bundle-guard.theme-dark-mode-guardrails.css-asset-hygiene, assets-images.fonts-setup.gotchas-scroll-state.a11y-motion-contrast, a11y-responsive-checks, responsive-touch.rtl-l10n.analytics-observability.# Ant version
npm ls antd
# Ant imports and icons
rg \"antd\" src app
rg \"@ant-design/icons\" src app
# ConfigProvider and tokens
rg \"ConfigProvider\" src app
rg \"theme\\.useToken\" src app
# Ant imperative APIs
rg \"Modal\\.confirm\" src app
rg \"notification\\.\" src app
rg \"message\\.\" src app
# Table/columns
rg \"columns\\s*=\\s*\\[\" src app
# LESS and global CSS
rg --files -g\"*.less\" src app
rg \"global\\.css\" src app
# Dark mode selectors
rg \"\\.dark\" src app
# Assets and fonts
rg --files -g\"*.{png,jpg,jpeg,svg}\" public/ src app
rg \"font-family\" src app
# Responsive/touch/scroll
rg \"overflow\" src app
rg \"scrollIntoView\" src app
# Routes/guards/menus
rg \"<Router\" -g\"*.tsx\" src app
rg \"RequireAuth|useAuth|Clerk|Supabase\" src app
rg \"menu\" src app/components
# Analytics/logging
rg \"track|analytics|logEvent\" src appsetup-antd-upgrade, setup-shadcn-install, setup-shadcn-mcp, setup-legacy-parking, build-envtheme-bridge-tokens, theme-dark-mode-guardrailslayout-route-scaffold, layout-responsive-shell, layout-auth-discoveryforms-rhf-shadcn, forms-api-states, forms-select-date-uploaddata-tables-state, data-table-tanstack, components-pagination, components-result-emptyoverlay-alerts-toasts, overlay-toast-consolecomponents-tabs-steps, components-tree-cascader, components-upload, components-pagination, components-result-emptycontent-icons-typographycss-legacy-inventory, css-asset-hygiene, assets-images, fonts-setupa11y-responsive-checks, a11y-motion-contrast, responsive-touch, rtl-l10nperf-bundle-guardtest-visual-a11y, test-e2e-visualgotchas-coexistence, gotchas-ux-fallbacks, gotchas-scroll-state, gotchas-component-sprawlanalytics-observabilityrules/), starting with setup, CSS cleanup, theming, then layout/forms/data/overlays.components.json and use npx shadcn@latest for additions.88287e9
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.