# clean-design-system > A quiet, editorial design system for complex search applications. > 68 independently installable components in TypeScript, styled > with plain CSS custom properties — no runtime, no CSS framework, no build > plugin. Light and dark from one attribute. WCAG 2.2 AA contrast and keyboard > behaviour throughout, checked by axe over every story in CI. Docs and live examples: https://gitu.github.io/clean-design-system/ Source: https://github.com/gitu/clean-design-system ## Two ways to install **Copy the source in** (no account needed, and the files become yours): npx shadcn@latest add https://gitu.github.io/clean-design-system/r/.json The shadcn CLI installs from any public registry URL. Transitive dependencies resolve automatically — asking for `date-input` brings the tokens, `cx` and the seven components a date field is made of. Everything lands under one `components/ui/cds/` namespace and imports its neighbours relatively, so it works the same in Vite, Next and Remix. Requires a `components.json` at the project root; Tailwind is *not* used or required. **Or as a package** (GitHub Packages — needs a token with `read:packages`, even though the package is public): npm install @gitu/clean-design-system ## Rules that apply to everything - Wrap the tree in `` and import the stylesheet once. Nothing is styled without it. - Class names are prefixed `cds-`. The reset is wrapped in `:where()`, so it has zero specificity and cannot outrank your own CSS or Tailwind. - Colour comes from `--cds-color-*` custom properties; there are three theme blocks (light, `prefers-color-scheme: dark`, and `[data-cds-theme='dark']`) kept in sync by a build check. - Form controls wrapped in `` inherit their id, `aria-describedby`, invalid and required state automatically — do not wire those by hand. - Every component takes `className` and merges it. - Charts are the only thing with runtime dependencies (three `@visx/*` packages). - Self-hosted fonts are optional; the tokens fall back to Georgia and the system sans. ## Components Every component below installs with the command shown. Names are the kebab-cased component name. Full props for all of them: https://gitu.github.io/clean-design-system/llms-full.txt ### Root #### ThemeProvider The root wrapper. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/theme-provider.json Exports: ThemeProvider, ThemeToggle, useTheme Depends on: icon, icon-button ### Primitives #### Avatar A person, as a picture or as their initials. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/avatar.json Exports: Avatar #### Badge A read-only status marker: pipeline state, document type, embargo flag. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/badge.json Exports: Badge #### Button The system's one button. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/button.json Exports: Button Depends on: spinner #### Callout An inline status block: what just happened, and what to do about it. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/callout.json Exports: Callout Depends on: icon, icon-button #### Divider A hairline rule — the main structural device in this system. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/divider.json Exports: Divider #### Icon One glyph from the set, drawn rather than loaded. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/icon.json Exports: Icon, iconNames #### IconButton A square Button carrying an icon and nothing else. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/icon-button.json Exports: IconButton Depends on: button, spinner #### Kbd Keyboard shortcut hint. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/kbd.json Exports: Kbd #### Progress A determinate or indeterminate progress bar. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/progress.json Exports: Progress #### Skeleton Loading placeholder. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/skeleton.json Exports: Skeleton #### Slider One value along a range. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/slider.json Exports: Slider Depends on: field #### Spinner An indeterminate wait. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/spinner.json Exports: Spinner #### Tag A value the user put into the interface — an applied filter, a chosen keyword. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/tag.json Exports: Tag Depends on: icon ### Forms #### Calendar A month grid for picking a day or a span. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/calendar.json Exports: Calendar Depends on: icon, icon-button #### Checkbox A real under a drawn box. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/checkbox.json Exports: Checkbox Depends on: field, icon #### DateInput A date you can type or point at. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/date-input.json Exports: DateInput Depends on: button, calendar, field, icon, input #### DateRangePicker A button that opens a two-month calendar and reports a span. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/date-range-picker.json Exports: DateRangePicker Depends on: button, calendar, icon #### DateTimeInput A date and a time, as two fields that behave like one value. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/date-time-input.json Exports: DateTimeInput Depends on: calendar, date-input, field, time-input #### Field Label, hint, error and the ARIA wiring between them. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/field.json Exports: Field, FieldContext, useFieldControl #### FileDrop A drop target for files. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/file-drop.json Exports: FileDrop Depends on: field, icon #### Input A single-line text field, with room either side of the text. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/input.json Exports: Input Depends on: field #### MarkdownEditor A text field for prose, with the markup it accepts made visible. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/markdown-editor.json Exports: MarkdownEditor Depends on: field, icon, icon-button, markdown #### Radio One option in a mutually exclusive set. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/radio.json Exports: Radio, RadioGroup #### SegmentedControl A small set of mutually exclusive choices shown all at once — sort order, result density, time window. npx shadcn@latest add https://gitu.github.io/clean-design-system/r/segmented-control.json Exports: SegmentedControl #### Select A native