tinte
CLAUDE.md624 starsChanged 3 months agoMITView on GitHub
Generate, compile, install, and preview design systems from one source of truth. Compatible with shadcn/cli v4 presets and registries. Continuous Scale: bg → bg-2 → ui → ui-2 → ui-3 → tx-3 → tx-2 → tx Token Meanings: Editors: shadcn/ui, VS Code Terminals: Alacritty, Kitty, Warp, Windows Terminal Design Tools: GIMP, Slack All providers have rich visual previews using actual theme data.
The file
Show its rules and text
We split this CLAUDE.md into the rules it gives an agent
92 rules. About 0 are common, 57 are distinctive, and 35 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈57
Distinctive · estimate
This author's own choices. Worth a look.
35
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 87
All providers have rich visual previews using actual theme data.
- Distinctive: line 124
All previews use real converted theme data
- Distinctive: line 131
No comments unless requested
- Distinctive: line 142
Test all format conversions (Rayso ↔ TweakCN ↔ VS Code ↔ shadcn)
- Distinctive: line 143
Verify WCAG contrast ratios
- Distinctive: line 144
Test light/dark mode switching
- Distinctive: line 152
No infinite loops or circular dependencies
- Distinctive: line 170
MUST: Full keyboard support per WAI-ARIA APG
- Very specific: line 171
MUST: Visible focus rings (:focus-visible.
- Distinctive: line 172
MUST: Manage focus (trap, move, and return) per APG patterns
- Distinctive: line 174
MUST: Hit target ≥24px (mobile ≥44px) If visual <24px, expand hit area
- Very specific: line 175
MUST: Mobile <input> font-size ≥16px or set:
- Distinctive: line 182
NEVER: Disable browser zoom
- Very specific: line 183
MUST: touch-action: manipulation to prevent double-tap zoom.
- Distinctive: line 185
MUST: Hydration-safe inputs (no lost focus/value)
- Very specific: line 186
NEVER: Block paste in <input>/<textarea>
- Distinctive: line 187
MUST: Loading buttons show spinner and keep original label
- Very specific: line 188
MUST: Enter submits focused text input In <textarea>, ⌘/Ctrl+Enter submits.
- Distinctive: line 189
MUST: Keep submit enabled until request starts.
- Distinctive: line 190
MUST: Don’t block typing; accept free text and validate after
- Distinctive: line 191
MUST: Allow submitting incomplete forms to surface validation
- Distinctive: line 192
MUST: Errors inline next to fields.
- Very specific: line 193
MUST: autocomplete + meaningful name.
- Very specific: line 194
SHOULD: Disable spellcheck for emails/codes/usernames
- Very specific: line 195
SHOULD: Placeholders end with ellipsis and show example pattern (eg, +1 (123) 456-7890, sk-012345…)
- Distinctive: line 196
MUST: Warn on unsaved changes before navigation
- Distinctive: line 197
MUST: Compatible with password managers & 2FA.
- Distinctive: line 198
MUST: Trim values to handle text expansion trailing spaces
- Distinctive: line 199
MUST: No dead zones on checkboxes/radios.
- Very specific: line 201
MUST: URL reflects state (deep-link filters/tabs/pagination/expanded panels) Prefer libs like nuqs
- Distinctive: line 202
MUST: Back/Forward restores scroll
- Very specific: line 203
MUST: Links are links—use <a>/<Link> for navigation (support Cmd/Ctrl/middle-click)
- Distinctive: line 205
SHOULD: Optimistic UI; reconcile on response.
- Distinctive: line 206
MUST: Confirm destructive actions or provide Undo window
- Very specific: line 207
MUST: Use polite aria-live for toasts/inline validation
- Very specific: line 208
SHOULD: Ellipsis (…) for options that open follow-ups (eg, “Rename…”)
- Distinctive: line 210
MUST: Design forgiving interactions (generous targets, clear affordances.
- Distinctive: line 211
MUST: Delay first tooltip in a group.
- Very specific: line 212
MUST: Intentional overscroll-behavior: contain in modals/drawers
- Very specific: line 213
MUST: During drag, disable text selection and set inert on dragged element/containers
- Distinctive: line 214
MUST: No “dead-looking” interactive zones—if it looks clickable, it is
- Distinctive: line 216
SHOULD: Autofocus on desktop when there’s a single primary input.
- Very specific: line 220
MUST: Honor prefers-reduced-motion (provide reduced variant)
- Distinctive: line 221
SHOULD: Prefer CSS > Web Animations API > JS libraries
- Very specific: line 222
MUST: Animate compositor-friendly props (transform, opacity).
- Distinctive: line 223
SHOULD: Animate only to clarify cause/effect or add deliberate delight
- Very specific: line 224
SHOULD: Choose easing to match the change (size/distance/trigger)
- Distinctive: line 225
MUST: Animations are interruptible and input-driven (avoid autoplay)
- Very specific: line 226
MUST: Correct transform-origin (motion starts where it “physically” should)
- Distinctive: line 230
SHOULD: Optical alignment.
- Very specific: line 231
MUST: Deliberate alignment to grid/baseline/edges/optical centers—no accidental placement
- Very specific: line 232
SHOULD: Balance icon/text lockups (stroke/weight/size/spacing/color)
- Distinctive: line 233
MUST: Verify mobile, laptop, ultra-wide (simulate ultra-wide at 50% zoom)
- Distinctive: line 234
MUST: Respect safe areas (use env(safe-area-inset-\*))
- Distinctive: line 235
MUST: Avoid unwanted scrollbars.
- Distinctive: line 239
SHOULD: Inline help first.
- Distinctive: line 240
MUST: Skeletons mirror final content to avoid layout shift
- Very specific: line 241
MUST: <title> matches current context
- Distinctive: line 242
MUST: No dead ends; always offer next step/recovery
- Very specific: line 243
MUST: Design empty/sparse/dense/error states
- Distinctive: line 244
SHOULD: Curly quotes (“ ”).
- Very specific: line 245
MUST: Tabular numbers for comparisons (font-variant-numeric: tabular-nums or a mono like Geist Mono)
- Distinctive: line 246
MUST: Redundant status cues (not color-only).
- Distinctive: line 247
MUST: Don’t ship the schema—visuals may omit labels but accessible names still exist
- Very specific: line 248
MUST: Use the ellipsis character … (not ``)
- Very specific: line 249
MUST: scroll-margin-top on headings for anchored links.
- Very specific: line 250
MUST: Resilient to user-generated content (short/avg/very long)
- Very specific: line 251
MUST: Locale-aware dates/times/numbers/currency
- Very specific: line 252
MUST: Accurate names (aria-label), decorative elements aria-hidden, verify in the Accessibility Tree
- Very specific: line 253
MUST: Icon-only buttons have descriptive aria-label
- Very specific: line 254
MUST: Prefer native semantics (button, a, label, table) before ARIA
- Distinctive: line 255
SHOULD: Right-clicking the nav logo surfaces brand assets
- Very specific: line 256
MUST: Use non-breaking spaces to glue terms: 10 MB, ⌘ + K, Vercel SDK
- Distinctive: line 260
SHOULD: Test iOS Low Power Mode and macOS Safari
- Distinctive: line 261
MUST: Measure reliably (disable extensions that skew runtime)
- Distinctive: line 262
MUST: Track and minimize re-renders (React DevTools/React Scan)
- Distinctive: line 263
MUST: Profile with CPU/network throttling
- Distinctive: line 264
MUST: Batch layout reads/writes.
- Very specific: line 265
MUST: Mutations (POST/PATCH/DELETE) target <500 ms
- Distinctive: line 266
SHOULD: Prefer uncontrolled inputs.
- Very specific: line 267
MUST: Virtualize large lists (eg, virtua)
- Distinctive: line 268
MUST: Preload only above-the-fold images.
- Distinctive: line 269
MUST: Prevent CLS from images (explicit dimensions or reserved space)
- Distinctive: line 273
SHOULD: Layered shadows (ambient + direct)
- Distinctive: line 274
SHOULD: Crisp edges via semi-transparent borders + shadows
- Distinctive: line 275
SHOULD: Nested radii: child ≤ parent.
- Very specific: line 276
SHOULD: Hue consistency: tint borders/shadows/text toward bg hue
- Distinctive: line 277
MUST: Accessible charts (color-blind-friendly palettes)
- Distinctive: line 278
MUST: Meet contrast—prefer APCA over WCAG 2
- Very specific: line 279
MUST: Increase contrast on :hover/:active/:focus
- Distinctive: line 280
SHOULD: Match browser UI to bg
- Distinctive: line 281
SHOULD: Avoid gradient banding (use masks when needed)
≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Tinte - Agent-Native Design System Infrastructure
Generate, compile, install, and preview design systems from one source of truth. Compatible with shadcn/cli v4 presets and registries.
What It Does
- Compile theme graph to shadcn v4
registry:base+registry:fontpresets - Convert between 19+ theme formats (shadcn/ui, VS Code, terminals, design tools)
- Generate semantic color palettes using OKLCH color space
- Extract themes from images via Ray API
- Live theme editing with real-time preview
- Serve installable presets:
npx shadcn@latest add https://tinte.dev/api/preset/{slug}
Tech Stack
- Next.js 16 with TypeScript and App Router
- Tailwind CSS + shadcn/ui for UI components
- Culori for OKLCH color manipulation
- Shiki + Monaco Editor for syntax highlighting
- Zustand + nuqs for state management
- React Context for theme state
- Bun for package management
Architecture
Key Directories
src/
├── app/ # Pages (workbench, experiment, bingo, vscode)
├── providers/theme.tsx # Single theme context provider
├── components/
│ ├── shared/ # Theme components (switcher, selector, editor)
│ ├── preview/ # Provider-specific previews (vscode, shadcn, terminals)
│ └── workbench/ # Workbench components
├── hooks/ # Custom hooks (theme, monaco, shiki, workbench)
├── stores/ # Zustand stores (workbench, export)
├── lib/ # Conversion logic and providers registry
└── types/ # TypeScript definitionsColor Philosophy - Flexoki-Inspired
Continuous Scale: bg → bg-2 → ui → ui-2 → ui-3 → tx-3 → tx-2 → tx
- Light mode: bg (lightest) → tx (darkest)
- Dark mode: bg (darkest) → tx (lightest)
- OKLCH color space for perceptual consistency
Token Meanings:
bg/bg-2: Main/elevated surfacesui/ui-2/ui-3: Borders, hover states, active statestx-3/tx-2/tx: Faint, muted, primary textprimary/accent/secondary: Functional colors
State Management
Theme System (Context Provider)
- Single
ThemeProviderwraps entire app - localStorage persistence with DOM updates
- Zero state desync between components
- Perfect SSR/hydration handling
Workbench (Zustand + nuqs)
- Zustand stores: Server state (chatId, split, loading)
- nuqs: URL state (activeTab, provider) with automatic sync
- Zero prop drilling, zero useState/useEffect patterns
- Perfect browser navigation support
Providers System
Type-Safe Registry
- ThemeProvider: Basic conversion & export
- PreviewableProvider: Adds live preview component
- Registry-based with compile-time validation
Supported Providers
Editors: shadcn/ui, VS Code Terminals: Alacritty, Kitty, Warp, Windows Terminal Design Tools: GIMP, Slack
All providers have rich visual previews using actual theme data.
Development
Commands
bun install # Install dependencies
bun dev # Start development server
bun build # Production build
bun run lint # Lint code
bun run type-check # TypeScript validationKey Pages
/workbench- Main theme editor with live preview/experiment- Rayso → shadcn conversion testing/bingo- TweakCN → Rayso conversion testing/vscode- VS Code theme preview and export
Architecture Highlights
VS Code Preview (Optimized)
- Modular components: monaco-preview, shiki-preview, tokens-preview
- Custom hooks: use-monaco-editor, use-shiki-highlighter
- Version-based caching, 50ms transitions, zero theme conflicts
Monaco + Shiki Integration
- Perfect consistency using
@shikijs/monaco - Identical theme structure between both systems
- Smart initialization, no disposal conflicts
Provider Previews
- All previews use real converted theme data
- Dynamic light/dark mode switching
- Type-safe integration with provider outputs
- Performance optimized with memoization
Code Style
- No comments unless requested
- Semantic naming following Flexoki philosophy
- Type safety throughout
- Modular architecture with single responsibility
- Custom hooks for complex logic
- Minimal useEffect usage
Testing
Theme Conversion
- Test all format conversions (Rayso ↔ TweakCN ↔ VS Code ↔ shadcn)
- Verify WCAG contrast ratios
- Test light/dark mode switching
- Export and install themes in target applications
State Management
- URL synchronization with browser navigation
- Theme persistence across page refreshes
- Component isolation with global state access
- No infinite loops or circular dependencies
Key Features
- Live workbench: Real-time editing with instant preview
- Universal previews: Rich visuals for all supported providers
- Type-safe conversions: Compile-time validation throughout
- Performance optimized: Smart caching, minimal re-renders
- URL state sync: Shareable URLs with preserved state
- Provider status: Clear indicators for available vs planned providers
- Export functionality: Download themes in multiple formats
- Responsive design: Works on mobile and desktop
Concise rules for building accessible, fast, delightful UIs Use MUST/SHOULD/NEVER to guide decisions
Interactions
- Keyboard
- MUST: Full keyboard support per WAI-ARIA APG
- MUST: Visible focus rings (
:focus-visible; group with:focus-within) - MUST: Manage focus (trap, move, and return) per APG patterns
- Targets & input
- MUST: Hit target ≥24px (mobile ≥44px) If visual <24px, expand hit area
- MUST: Mobile
<input>font-size ≥16px or set:<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover" /> - NEVER: Disable browser zoom
- MUST:
touch-action: manipulationto prevent double-tap zoom; set-webkit-tap-highlight-colorto match design
- Inputs & forms (behavior)
- MUST: Hydration-safe inputs (no lost focus/value)
- NEVER: Block paste in
<input>/<textarea> - MUST: Loading buttons show spinner and keep original label
- MUST: Enter submits focused text input In
<textarea>, ⌘/Ctrl+Enter submits; Enter adds newline - MUST: Keep submit enabled until request starts; then disable, show spinner, use idempotency key
- MUST: Don’t block typing; accept free text and validate after
- MUST: Allow submitting incomplete forms to surface validation
- MUST: Errors inline next to fields; on submit, focus first error
- MUST:
autocomplete+ meaningfulname; correcttypeandinputmode - SHOULD: Disable spellcheck for emails/codes/usernames
- SHOULD: Placeholders end with ellipsis and show example pattern (eg,
+1 (123) 456-7890,sk-012345…) - MUST: Warn on unsaved changes before navigation
- MUST: Compatible with password managers & 2FA; allow pasting one-time codes
- MUST: Trim values to handle text expansion trailing spaces
- MUST: No dead zones on checkboxes/radios; label+control share one generous hit target
- State & navigation
- MUST: URL reflects state (deep-link filters/tabs/pagination/expanded panels) Prefer libs like nuqs
- MUST: Back/Forward restores scroll
- MUST: Links are links—use
<a>/<Link>for navigation (support Cmd/Ctrl/middle-click)
- Feedback
- SHOULD: Optimistic UI; reconcile on response; on failure show error and rollback or offer Undo
- MUST: Confirm destructive actions or provide Undo window
- MUST: Use polite
aria-livefor toasts/inline validation - SHOULD: Ellipsis (
…) for options that open follow-ups (eg, “Rename…”)
- Touch/drag/scroll
- MUST: Design forgiving interactions (generous targets, clear affordances; avoid finickiness)
- MUST: Delay first tooltip in a group; subsequent peers no delay
- MUST: Intentional
overscroll-behavior: containin modals/drawers - MUST: During drag, disable text selection and set
inerton dragged element/containers - MUST: No “dead-looking” interactive zones—if it looks clickable, it is
- Autofocus
- SHOULD: Autofocus on desktop when there’s a single primary input; rarely on mobile (to avoid layout shift)
Animation
- MUST: Honor
prefers-reduced-motion(provide reduced variant) - SHOULD: Prefer CSS > Web Animations API > JS libraries
- MUST: Animate compositor-friendly props (
transform,opacity); avoid layout/repaint props (top/left/width/height) - SHOULD: Animate only to clarify cause/effect or add deliberate delight
- SHOULD: Choose easing to match the change (size/distance/trigger)
- MUST: Animations are interruptible and input-driven (avoid autoplay)
- MUST: Correct
transform-origin(motion starts where it “physically” should)
Layout
- SHOULD: Optical alignment; adjust by ±1px when perception beats geometry
- MUST: Deliberate alignment to grid/baseline/edges/optical centers—no accidental placement
- SHOULD: Balance icon/text lockups (stroke/weight/size/spacing/color)
- MUST: Verify mobile, laptop, ultra-wide (simulate ultra-wide at 50% zoom)
- MUST: Respect safe areas (use env(safe-area-inset-*))
- MUST: Avoid unwanted scrollbars; fix overflows
Content & Accessibility
- SHOULD: Inline help first; tooltips last resort
- MUST: Skeletons mirror final content to avoid layout shift
- MUST:
<title>matches current context - MUST: No dead ends; always offer next step/recovery
- MUST: Design empty/sparse/dense/error states
- SHOULD: Curly quotes (“ ”); avoid widows/orphans
- MUST: Tabular numbers for comparisons (
font-variant-numeric: tabular-numsor a mono like Geist Mono) - MUST: Redundant status cues (not color-only); icons have text labels
- MUST: Don’t ship the schema—visuals may omit labels but accessible names still exist
- MUST: Use the ellipsis character
…(not ``) - MUST:
scroll-margin-topon headings for anchored links; include a “Skip to content” link; hierarchical<h1–h6> - MUST: Resilient to user-generated content (short/avg/very long)
- MUST: Locale-aware dates/times/numbers/currency
- MUST: Accurate names (
aria-label), decorative elementsaria-hidden, verify in the Accessibility Tree - MUST: Icon-only buttons have descriptive
aria-label - MUST: Prefer native semantics (
button,a,label,table) before ARIA - SHOULD: Right-clicking the nav logo surfaces brand assets
- MUST: Use non-breaking spaces to glue terms:
10 MB,⌘ + K,Vercel SDK
Performance
- SHOULD: Test iOS Low Power Mode and macOS Safari
- MUST: Measure reliably (disable extensions that skew runtime)
- MUST: Track and minimize re-renders (React DevTools/React Scan)
- MUST: Profile with CPU/network throttling
- MUST: Batch layout reads/writes; avoid unnecessary reflows/repaints
- MUST: Mutations (
POST/PATCH/DELETE) target <500 ms - SHOULD: Prefer uncontrolled inputs; make controlled loops cheap (keystroke cost)
- MUST: Virtualize large lists (eg,
virtua) - MUST: Preload only above-the-fold images; lazy-load the rest
- MUST: Prevent CLS from images (explicit dimensions or reserved space)
Design
- SHOULD: Layered shadows (ambient + direct)
- SHOULD: Crisp edges via semi-transparent borders + shadows
- SHOULD: Nested radii: child ≤ parent; concentric
- SHOULD: Hue consistency: tint borders/shadows/text toward bg hue
- MUST: Accessible charts (color-blind-friendly palettes)
- MUST: Meet contrast—prefer APCA over WCAG 2
- MUST: Increase contrast on
:hover/:active/:focus - SHOULD: Match browser UI to bg
- SHOULD: Avoid gradient banding (use masks when needed)
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

