apparat/ui
github.com/tommyjepsen/apparat-ui- Category
- Developer Tools
- Rank
- No. 1690Tools index
Previous survey · No. 1631 ·
- Pricing
- Open Source
- Type
- TOOL
- Use case
- Coding
- Interfaces
- SDK · Web
- GitHub
- 9 stars
- Date
About
An open-source React and Tailwind CSS component library offering 28 components, 8 composite blocks, and 4 full editor templates for building creative software like canvas editors, node graphs, and motion design tools. It focuses on tactile micro-interactions, scrubbable numeric inputs, and spring-based animations for a precise, monospace aesthetic.
What it does
A set of React controls for the inspector panels of design and animation software: angle dials, drag-to-change number fields, gradient ramps, layer lists, keyframe tracks and a command palette. There is no package to install. The repository is a Vite demo site, and each demo card opens the component's source in a dialog with a copy button, so you paste the file into your own project. Styling runs on Tailwind and a set of CSS color variables with class-based dark mode. Animation comes from Framer Motion and icons from Lucide.
Why it's ranked here
The niche is real and poorly served: general UI kits stop at buttons and forms, while an image or motion tool needs angle dials, levels histograms, easing editors and box-model inputs. This kit ships those under the MIT license with a short dependency list: React 19, Framer Motion, Lucide and two class-name helpers. The limits are just as concrete. The package is marked private and unversioned, the manifest has no test script or test runner, and the larger panels behave like demos more than building blocks. A strong head start for the fiddly controls, not a maintained dependency.
What's good
The small controls are written with care. The color field accepts three- or six-digit hex with or without the leading hash, expands shorthand, uppercases the result, and reverts on bad input or Escape. Controls follow the controlled pattern, value in and change handler out, so they drop into existing state without adapters. Every color resolves through theme variables, so re-skinning means editing one stylesheet rather than hunting hard-coded values. Copying source instead of installing a package means you own the code and can cut what you do not need.
Tradeoffs
The composite panels hold their own state. The layer list takes starting layers and a starting selection but reports nothing back: no callback fires when a layer is hidden, locked or selected, so wiring it to a real document means rewriting it. The canvas editor template takes no props at all and forces a 760-pixel minimum width. Accessibility is thin in places: the color swatch is a clickable div with the native picker removed from the tab order, layer visibility and lock buttons appear only on hover, and much of the label text is 8 or 9 pixels. There is no automated test setup.
How to use it well
Best for a React and Tailwind project that needs a property inspector and wants the fiddly inputs done already: dials, ruler sliders, color and gradient fields. Copy the individual controls and keep state in your own store. Treat the panels and full editor layouts as reference designs to rebuild, adding change callbacks and keyboard access as you go. You will need the Space Mono font and the CSS color variables in place. It does not provide a canvas renderer, hit testing, undo or a document model, so pair it with something that does.
Technical notes+
package.json is "private": true with scripts dev/build/lint/preview (Vite, tsc -b, Oxlint) and no test script; runtime deps are react/react-dom 19, framer-motion, lucide-react, clsx, tailwind-merge. src/App.tsx imports every component twice, once live and once via Vite ?raw, and hands the raw text to CodeModal in src/components/code-modal.tsx, which copies it with navigator.clipboard.writeText. src/components/tool-ui/index.ts re-exports atoms, molecules, organisms and templates. In src/components/tool-ui/organisms/layer-tree.tsx, LayerTreeProps has no change callback and state seeds from initialLayers ?? INITIAL_LAYERS. src/components/tool-ui/molecules/creative-color-picker.tsx validates with /^#([0-9A-F]{3}){1,2}$/i and hides the native input (tabIndex -1, aria-hidden). src/components/tool-ui/templates/canvas-editor.tsx is a prop-less React.FC with min-w-[760px]. tailwind.config.js uses darkMode ["class"], hsl(var(--token)) colors and a Space Mono mono family; src/lib/utils.ts defines cn as twMerge(clsx()).
Observed
- License
- MIT
- Language
- TypeScript, React 19 components
- Packaging
- Package marked private; not installable from npm. Components are copied as source from the demo site's code viewer.
- Interface
- React component library only; no CLI, API or MCP server
- Styling
- Tailwind CSS 3 with CSS-variable color tokens and class-based dark mode
- Runtime dependencies
- framer-motion, lucide-react, clsx, tailwind-merge
- Build tooling
- Vite with TypeScript project build and Oxlint
- Tests
- No test script and no test runner in the manifest
Read from README.md, package.json, src/App.tsx, src/components/tool-ui/index.ts, src/components/tool-ui/organisms/layer-tree.tsx, src/components/tool-ui/molecules/creative-color-picker.tsx, src/components/tool-ui/templates/canvas-editor.tsx, src/components/code-modal.tsx, src/lib/utils.ts, tailwind.config.js.
Tags
Tech Stack
Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.