darkroom-ui
v0.2.5
Published
Monochrome editorial React component library with CSS-variable light/dark theming
Maintainers
Readme
darkroom-ui
Monochrome editorial React component library — warm paper and charcoal tones, CSS-variable light/dark mode, no accent palette.
| | | |---|---| | Site | darkroom-ui.dev | | Storybook | storybook.darkroom-ui.dev | | npm | darkroom-ui | | Repository | github.com/laradiaz/darkroom-ui |
Install
npm install darkroom-ui
# or
pnpm add darkroom-uiInstall a specific version from Git (without npm):
pnpm add git+ssh://[email protected]:laradiaz/darkroom-ui.git#v0.2.5Peer dependencies: react and react-dom (v18+).
Usage
Import component styles once in your app entry (~45 KB):
import "darkroom-ui/style.css";Load fonts separately (optional, ~87 KB woff2):
import "darkroom-ui/fonts.css";Bundled defaults: Cormorant Garamond (--font-display) and DM Sans (--font-sans). Override anytime CSS variables if you bring your own faces:
:root {
--font-display: "Newsreader", serif;
--font-sans: "IBM Plex Mono", monospace; /* or keep a sans for UI */
}Recommended free fonts
Editorial serifs (display / long-form):
| Font | Notes | |------|--------| | Newsreader | Contemporary, strong for digital reading | | EB Garamond | Literary classic | | Noticia Text | Sturdy newspaper text | | Instrument Serif | Expressive headlines (less ideal as body) |
Typewriter / mono:
| Font | Notes | |------|--------| | Courier Prime | Polished Courier | | IBM Plex Mono | Clean modern mono | | Cutive Mono | Warm typewriter feel | | Special Elite | Distressed accent type (not body) |
Pairings to try:
| Pairing | Mood | |---------|------| | Newsreader + IBM Plex Mono | Modern editorial | | EB Garamond + Courier Prime | Literary / archive | | Instrument Serif + Cutive Mono | Fashion or art magazine |
import {
Button,
Heading,
PostCard,
NavBar,
Hero,
Footer,
useDarkroomDarkMode,
DarkroomUIProvider,
} from "darkroom-ui";
function App() {
const { toggle, darkModeEnabled } = useDarkroomDarkMode();
return (
<DarkroomUIProvider config={{ containerSize: "lg" }}>
<Button type="button" variant="ghost" onClick={toggle}>
{darkModeEnabled ? "Light" : "Dark"}
</Button>
<Heading level={1}>Hello</Heading>
<Button variant="primary">Get started</Button>
</DarkroomUIProvider>
);
}Tree-shaking entry (no CSS side effects)
import { Button } from "darkroom-ui/core";
import "darkroom-ui/style.css";
import "darkroom-ui/fonts.css";Per-component subpaths
import { Button } from "darkroom-ui/button";
import { Hero } from "darkroom-ui/hero";
import "darkroom-ui/style.css";Available subpaths: button, select, file-dropzone, badge, typography, layout, grid, divider, media, card, hero, navigation, footer, core.
Design tokens only
@import "darkroom-ui/tokens.css";CSS bundle sizes
| Import | Approx. size |
|--------|----------------|
| darkroom-ui/style.css | ~45 KB |
| darkroom-ui/fonts.css | ~1 KB CSS + ~87 KB woff2 |
| darkroom-ui/tokens.css | ~1 KB |
Optional provider
DarkroomUIProvider sets defaults for the whole tree:
| Config | Purpose |
|--------|---------|
| unstyled | Skip CSS module classes |
| containerSize | Default Container width |
| socialLinkMode | Default SocialLink mode |
| themeStorageKey | Reserved for theme persistence |
All components accept unstyled and slotProps for DOM customization.
Dark mode
Dark mode uses the dark class on <html>:
<html class="dark">Or use useDarkroomDarkMode() — toggles html.dark, persists to localStorage, and returns:
| Value | Description |
|-------|-------------|
| theme | "light" | "dark" | "system" |
| resolved | Effective "light" | "dark" |
| setTheme | Set preference |
| toggle | Flip light ↔ dark |
| darkModeEnabled | resolved === "dark" |
Components
Form
| Component | Description |
|-----------|-------------|
| FileDropzone | Drag-and-drop / click file picker |
| NewsletterSignup | Email form |
| Select | Custom listbox select |
Button
| Component | Description |
|-----------|-------------|
| Button | primary / ghost / link |
| NavMenuButton | Mobile nav menu toggle (hamburger) |
Content
| Component | Description |
|-----------|-------------|
| Badge | default / stamp / outline |
| Divider | Section divider |
| Heading, Text, Label | Typography |
| Media | Image with caption / overlay |
| PostCard | Linked content teaser |
Layout
| Component | Description |
|-----------|-------------|
| ContentGrid | Responsive grid |
| Footer | Site footer |
| Hero | Image/video hero |
| NavBar | Navigation |
| Page, Container, Section | Page shell |
| SocialLink | Icon or text social link |
Interactive docs: storybook.darkroom-ui.dev.
Development
pnpm install
pnpm run build
pnpm test
pnpm run check-publish
pnpm run check-publish:full
pnpm run storybookStorybook deploys to GitHub Pages on push to main (pnpm run build-storybook).
Publish
Maintainers only:
npm login
pnpm run build
pnpm run check-publish
npm publish --access publicFor version bumps after the initial release: ./scripts/release.sh patch (or minor / major).
License
MIT
