{"id":49001170,"url":"https://github.com/saebyn/radish-ui","last_synced_at":"2026-04-18T18:37:09.963Z","repository":{"id":348619816,"uuid":"1198982644","full_name":"saebyn/radish-ui","owner":"saebyn","description":"Tailwind CSS components for react-admin. Like shadcn/ui, but for react-admin — use ra-core for the headless state management and own your UI components.","archived":false,"fork":false,"pushed_at":"2026-04-09T23:45:47.000Z","size":684,"stargazers_count":1,"open_issues_count":23,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-10T01:28:21.034Z","etag":null,"topics":["headless-ui","react-admin","shadcn","tailwindcss","typescript","ui-components"],"latest_commit_sha":null,"homepage":"http://saebyn.info/radish-ui/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/saebyn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-02T00:26:38.000Z","updated_at":"2026-04-07T14:19:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/saebyn/radish-ui","commit_stats":null,"previous_names":["saebyn/radish-ui"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/saebyn/radish-ui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saebyn%2Fradish-ui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saebyn%2Fradish-ui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saebyn%2Fradish-ui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saebyn%2Fradish-ui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/saebyn","download_url":"https://codeload.github.com/saebyn/radish-ui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saebyn%2Fradish-ui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31980475,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T17:30:12.329Z","status":"ssl_error","status_checked_at":"2026-04-18T17:29:59.069Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["headless-ui","react-admin","shadcn","tailwindcss","typescript","ui-components"],"created_at":"2026-04-18T18:37:09.264Z","updated_at":"2026-04-18T18:37:09.955Z","avatar_url":"https://github.com/saebyn.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# radish-ui\n\n[![npm: @radish-ui/core](https://img.shields.io/npm/v/%40radish-ui%2Fcore?label=%40radish-ui%2Fcore)](https://www.npmjs.com/package/@radish-ui/core)\n[![npm: @radish-ui/cli](https://img.shields.io/npm/v/%40radish-ui%2Fcli?label=%40radish-ui%2Fcli)](https://www.npmjs.com/package/@radish-ui/cli)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\n**📖 [Documentation](https://radish-ui.saebyn.dev/)**\n\nTailwind CSS components for react-admin. Like shadcn/ui, but for react-admin — use `ra-core` for the headless state management and own your UI components.\n\n\u003e [!WARNING]\n\u003e **Early development — not production-ready.**\n\u003e This project is brand new. Many components are missing, and those that exist are not fully implemented or tested. The API may change rapidly without notice and is not yet stable. Use at your own risk, and expect breaking changes.\n\n## What is this?\n\n`radish-ui` provides:\n\n- **`@radish-ui/core`** — A small npm package that wraps `ra-core` primitives (Admin, ListBase, hooks) and provides a `cn()` utility for Tailwind class merging.\n- **`@radish-ui/cli`** — A CLI tool for copying registry components into your project and keeping them in sync with upstream changes.\n- **Registry components** — Copy/paste Tailwind-styled components (Layout, Datagrid, List, TextField, etc.) that you own and can customize freely.\n\n## Philosophy\n\nThis project takes the same approach as [shadcn/ui](https://ui.shadcn.com/): instead of installing a component library and fighting its styles, you copy the components directly into your project and make them your own.\n\nThe difference from plain react-admin: **zero Material UI**. All styling is Tailwind CSS. The headless state management comes from `ra-core`.\n\n## Getting Started\n\n### 1. Install the core package\n\n```bash\npnpm add @radish-ui/core ra-core react react-dom\n```\n\n### 2. Add components with the CLI\n\n```bash\n# Add a single component\nnpx @radish-ui/cli add datagrid\n\n# Add multiple components at once\nnpx @radish-ui/cli add layout datagrid list text-field\n```\n\nComponents are copied into `./src/components/radish/` by default (configurable via `--target` or `radish.json`).\n\nA `radish.lock.json` file is created to track which registry version each file came from.\n\n### 3. Keep components up to date\n\n```bash\n# Update unmodified components to the latest registry versions\n# (files you've customized are left untouched)\nnpx @radish-ui/cli sync\n\n# Force-overwrite all components regardless of local changes\nnpx @radish-ui/cli sync --force\n```\n\n### 4. See upstream changes before syncing\n\n```bash\nnpx @radish-ui/cli diff datagrid\n```\n\n## CLI reference\n\n```\nradish add \u003ccomponents...\u003e [options]\n  --registry \u003cpath\u003e    Path to registry directory\n  --target \u003cpath\u003e      Output directory (default: ./src/components/radish)\n  --force              Overwrite existing files\n\nradish sync [options]\n  --registry \u003cpath\u003e    Path to registry directory\n  --target \u003cpath\u003e      Output directory (default: ./src/components/radish)\n  --force              Overwrite all files, ignoring local modifications\n\nradish diff \u003ccomponent\u003e [options]\n  --registry \u003cpath\u003e    Path to registry directory\n  --target \u003cpath\u003e      Output directory (default: ./src/components/radish)\n```\n\n## Configuration file\n\nInstead of passing flags every time, create a `radish.json` in your project root:\n\n```json\n{\n  \"registry\": \"./path/to/registry\",\n  \"outputDir\": \"src/components/radish\"\n}\n```\n\nCLI flags take precedence over the config file.\n\n## Available components\n\n| Name            | Files                                                                                                                     |\n| --------------- | ------------------------------------------------------------------------------------------------------------------------- |\n| `skeleton`      | `skeleton/skeleton.tsx`                                                                                                   |\n| `layout`        | `layout/layout.tsx`, `layout/sidebar.tsx`, `layout/menu.tsx`                                                              |\n| `datagrid`      | `list/datagrid.tsx`                                                                                                       |\n| `list`          | `list/list.tsx`                                                                                                           |\n| `pagination`    | `list/pagination.tsx`                                                                                                     |\n| `show`          | `detail/show.tsx`, `detail/simple-show-layout.tsx`                                                                        |\n| `edit`          | `detail/edit.tsx`                                                                                                         |\n| `create`        | `detail/create.tsx`                                                                                                       |\n| `text-field`    | `field/text-field.tsx`                                                                                                    |\n| `boolean-field` | `field/boolean-field.tsx`                                                                                                 |\n| `number-field`  | `field/number-field.tsx`                                                                                                  |\n| `date-field`    | `field/date-field.tsx`                                                                                                    |\n| `edit-button`   | `button/edit-button.tsx`                                                                                                  |\n| `delete-button` | `button/delete-button.tsx`                                                                                                |\n| `create-button` | `button/create-button.tsx`                                                                                                |\n| `simple-form`   | `form/simple-form.tsx`, `form/text-input.tsx`, `form/number-input.tsx`, `form/select-input.tsx`, `form/boolean-input.tsx` |\n\n## Storybook\n\nRegistry components can be previewed and developed in isolation using Storybook:\n\n```bash\npnpm install\ncd packages/registry\npnpm storybook\n```\n\nThis starts a local Storybook instance at [http://localhost:6006](http://localhost:6006) with stories for all key components (Datagrid, List, Layout, TextField).\n\nTo build a static Storybook site:\n\n```bash\ncd packages/registry\npnpm storybook:build\n```\n\nStories use mock `ra-core` providers (`ListContextProvider`, `RecordContextProvider`) so components render without a real data source. Find the story files alongside their components in `packages/registry/src/`.\n\n## Demo\n\n```bash\npnpm install\npnpm build\npnpm dev\n```\n\nThis runs `apps/demo` — a working admin panel listing posts from [JSONPlaceholder](https://jsonplaceholder.typicode.com), styled with Tailwind CSS, with zero Material UI.\n\nTo sync the demo app's components with the registry:\n\n```bash\npnpm sync\n```\n\n## Structure\n\n```\nradish-ui/\n├── packages/\n│   ├── core/       # @radish-ui/core — published to npm\n│   ├── cli/        # @radish-ui/cli — published to npm\n│   └── registry/   # Copy/paste components — NOT published\n└── apps/\n    └── demo/       # Working demo app\n```\n\n## Contributing\n\nContributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for setup\ninstructions, development scripts, code-style guidelines, commit format, and PR\nguidelines.\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for a list of notable changes.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaebyn%2Fradish-ui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsaebyn%2Fradish-ui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaebyn%2Fradish-ui/lists"}