- README: add all 6 packages, React/Tailwind usage sections, remove glows refs - CLAUDE.md: rewrite for 6 packages, 4-layer parity, build.cjs, storefront migration as implemented reference - Package READMEs: fix monorepo links, remove glows references Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
10 KiB
CLAUDE.md — DT Design System
Project Overview
Monorepo for the Dangerous Things design system. Six npm packages publish under @dangerousthings/*:
- tokens — canonical design tokens in TypeScript, compiled to JS and auto-generated as CSS custom properties
- web — CSS themes (bevels, forms, animations) consumed by web apps
- react — React web components wrapping web CSS
- react-native — React Native components built on React Native Paper
- tailwind-preset — Tailwind CSS v3 preset mapping DT tokens
- hex-background — 3D hexagon grid background (Three.js)
Two brand themes: dt (neon cyberpunk / beveled), classic (dark navy / magenta).
Build & Tooling
- Turbo orchestrates builds;
packages/tokensmust build first (dependency for web and react-native). - Build everything:
npm run build - Typecheck everything:
npm run typecheck - Tokens build:
tscthennode dist/scripts/generate-css.js - Web build:
node scripts/build.cjs(copies CSS, assembles brand token CSS, copies fonts) - React Native build:
tsc - Versioning: Changesets (
npx changeset,npm run version-packages,npm run release)
Architecture Rules
- Tokens are the single source of truth. Never hard-code color, typography, or shape values in web or react-native packages — always reference the tokens package.
- Web package is pure CSS — no JavaScript runtime except the optional
theme-registrymodule. - React Native components wrap React Native Paper and must list it (and react, react-native, react-native-svg, react-native-safe-area-context) as peer dependencies, never bundled dependencies.
Feature Parity
When adding or modifying a design token, component, or visual behavior, keep all four layers in sync:
- Tokens — add/update the value in every brand file (
packages/tokens/src/brands/{dt,classic}.ts) and in the shared type (packages/tokens/src/types.ts). - Web — if the token maps to a CSS component, update the relevant CSS file under
packages/web/src/components/. Ensure the CSS custom property name matches the token path (e.g.,--dt-color-brand-primary). - React — if there is a React web component wrapper, update or create the corresponding component in
packages/react/src/components/. - React Native — update the corresponding component(s) under
packages/react-native/src/components/and ensure the theme provider maps the new token.
Parity Checklist (use before closing any PR)
- New tokens exist in all brand files with correct values
- Token types are updated if the shape of the token object changed
- CSS generation script produces the expected custom properties (
npm run build:tokensthen inspectdist/css/) - Web CSS files reference the new/changed custom properties
- React web components are updated if applicable
- React Native components consume the new tokens via the theme
- All packages build cleanly (
npm run build) - TypeScript typechecks pass (
npm run typecheck)
Testing
No test framework is configured yet. When adding tests, follow the guidance below.
Strategy
- Tokens: unit tests for token value correctness and CSS generation output. Verify every brand file satisfies the shared type. Snapshot the generated CSS files.
- Web: visual regression tests or snapshot tests for the compiled CSS. Ensure each brand's generated stylesheet contains expected custom properties.
- React Native: component rendering tests with React Native Testing Library. Test that each component renders without errors under every brand theme. Test interactive behaviors (press, toggle, expand).
Conventions (apply once a framework is added)
- Place test files next to source:
foo.ts→foo.test.ts,DTButton.tsx→DTButton.test.tsx. - Name test blocks clearly:
describe("DTButton"),it("renders in contained mode"). - Run tests via Turbo: add a
testtask toturbo.jsonand per-packagetestscripts. - CI should run
turbo run testalongsidebuildandtypecheck.
Maintenance
Adding a New Component
- If it needs new tokens, add them to all brand files and types first.
- If there is a web equivalent, add a CSS file in
packages/web/src/components/. - Create a React web component wrapper in
packages/react/src/components/DTFoo.tsxand re-export frompackages/react/src/index.ts. - Create the React Native component in
packages/react-native/src/components/DTFoo.tsxand re-export frompackages/react-native/src/index.ts. - Create a changeset:
npx changeset— select affected packages and describe the change.
Adding a New Brand
- Create
packages/tokens/src/brands/newbrand.tsimplementing the fullBrandTokenstype. - Re-export it from
packages/tokens/src/index.ts. - The CSS generation script will pick it up automatically.
- Add the brand to the React Native
DTThemeProviderbrand union. - Update this file and the README.
Modifying Tokens
- Always start in
packages/tokens/src/types.tsif the token shape changes. - Update every brand file — the TypeScript compiler will flag missing properties.
- Rebuild tokens (
npm run build:tokens) and verify the generated CSS before touching downstream packages.
CI
GitHub Actions runs on push to main and on PRs:
- Builds across Node 18, 20, 22
- Runs typecheck
- Validates changesets on PRs (
npx changeset status)
Code Style
- TypeScript strict mode.
- CSS uses BEM-ish class names prefixed with
dt-(e.g.,.dt-bevel-card). - React Native components are prefixed
DT(e.g.,DTButton). - Keep files focused — one component per file, one brand per file.
Storefront Component Migration — Implementation Reference
The DT Shopify Storefront (dt-shopify-storefront) is the genesis project for this design system.
The storefront features documented below have been migrated into the design system. This section
serves as a reference for the implemented components and their locations.
Implemented Features
| Feature | CSS (web) | React Component | Notes |
|---|---|---|---|
| Card Color Modes | .mode-normal, .mode-emphasis, .mode-warning, .mode-success, .mode-other in bevels.css |
DTCard |
Five modes with *-selected variants at 70% opacity |
| Card Progress Bar | .dt-card-progress in bevels.css |
DTCard (progress prop) |
Vertical left-edge bar, 0-100%, fills on hover |
| Card Chip Badges | .dt-badge-overlay in bevels.css |
DTBadgeOverlay |
Positioned bottom-right, mode-color-aware |
| Card Hover/Selected | .card.selected and hover states in bevels.css |
DTCard |
Fills with var(--dt-card-color-selected) |
| Staggered Container | .dt-stagger-container in animations.css |
DTStaggerContainer |
CSS nth-child staggered animation-delay |
| Animation Library | animations.css |
-- | dt-scale-in, dt-fade-in, dt-slide-up, dt-pulse, dt-ping, dt-spin, transition utilities |
| Filter System UI | .dt-menu-item, .dt-filter-header, .dt-filter-overlay in forms-dt.css |
DTMenu, DTMobileFilterOverlay |
Nested menus, filter accordions, mobile overlay |
| Feature Legend | feature-legend.css |
DTFeatureLegend |
Icon grid with rotated labels, mode-colored header, feature states |
| Theme Branching | [data-brand="dt"] / [data-brand="classic"] CSS scoping |
-- | No JS conditionals needed; CSS handles visual differences |
| Scrollbar Styling | scrollbar.css (.dt-scrollbar) |
-- | Thin scrollbar with mode-normal color |
Card color modes reference:
| Mode | Token | Default (DT dark) | Use Case |
|---|---|---|---|
mode-normal |
--color-primary |
#00FFFF cyan |
Default product cards |
mode-emphasis |
--color-secondary |
#FFFF00 yellow |
Highlighted/selected states |
mode-warning |
--color-error |
#FF0000 red |
Lab products, warnings |
mode-success |
--color-accent |
#00FF00 green |
Positive/success states |
mode-other |
--color-other |
#FF00FF magenta |
Bundles, alternative states |
Theme branching differences (handled by CSS, not JS):
| Aspect | Cyberpunk (data-brand="dt") |
Clean (data-brand="classic") |
|---|---|---|
| Clip-paths | Heavy bevels | border-radius: 0.75rem |
| Colors | Neon (#00FFFF, #FF00FF) | B&W or muted tones |
| Hover effects | Pulse glow animations | None |
| Typography | Tektur | system-ui sans-serif |
| Text shadows | 0 0 8px var(--mode) |
None |
| Borders | Thick neon (5px top) | Subtle 1px |
Icon Set — Product Features & Filtering
Canonical icon set for the DT design system, sourced from react-icons.
Product Feature Icons (react-icons/md — Material Design):
| Feature | Icon | Package |
|---|---|---|
| Illumination | MdLightbulbOutline |
react-icons/md |
| Visibility/Glow | MdOutlineVisibility |
react-icons/md |
| Data Sharing | MdOutlineMobileScreenShare |
react-icons/md |
| UID Cloning/Magic | MdOutlineCopyAll |
react-icons/md |
| Payment/NFC | MdOutlineCreditCard |
react-icons/md |
| Smartphone Compat | MdOutlinePhonelinkRing |
react-icons/md |
| Access Control | MdOutlineVpnKey |
react-icons/md |
| Sensors | MdOutlineThermostat |
react-icons/md |
| NFC Sensing | MdOutlineSensors |
react-icons/md |
| Fitness/Bio | MdOutlineFitbit |
react-icons/md |
| Vibration | MdOutlineVibration |
react-icons/md |
| Exploration | MdOutlineExplore |
react-icons/md |
| Cryptography | LuBinary |
react-icons/lu |
| Digital Security | FaUserShield |
react-icons/fa |
| Temperature (alt) | BsThermometerHalf |
react-icons/bs |
UI Control Icons:
| Control | Icon | Package |
|---|---|---|
| Filter toggle | MdFilterList |
react-icons/md |
| Expand/collapse | MdExpandMore |
react-icons/md |
| Close/dismiss | MdClose |
react-icons/md |
| Dropdown arrow | MdOutlineKeyboardArrowDown |
react-icons/md |
| No image placeholder | MdOutlineHideImage |
react-icons/md |
| More details | CgMoreR |
react-icons/cg |
| Loading spinner | FaSpinner |
react-icons/fa6 |
| Cart | FaCartShopping |
react-icons/fa6 |
| Add to cart | FaCartPlus |
react-icons/fa6 |
| Search | FaMagnifyingGlass |
react-icons/fa6 |
| Back | FaArrowLeft |
react-icons/fa6 |
| User (logged in) | FaUser |
react-icons/fa6 |
| User (logged out) | FaUserSlash |
react-icons/fa6 |
| Delete | FaTrash |
react-icons/fa |
Custom SVG Icons (ThemeToggle.tsx):
- Sun icon (24x24) — switch to clean theme
- Terminal/matrix icon (24x24) — switch to cyberpunk theme
Icon display standard: Feature icons render at 42px in the UseCaseLegend grid. UI icons at 1.5em.
Icons inherit color from their parent's --mode variable.
Known Issues
(none currently)