All checks were successful
Build & Publish / publish (push) Successful in 1m2s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
233 lines
11 KiB
Markdown
233 lines
11 KiB
Markdown
# Cameleer3 Design System
|
||
|
||
## Before Building UI
|
||
|
||
Always read `COMPONENT_GUIDE.md` before building any UI feature. It contains decision trees for choosing the right component, composition patterns, and the full component index.
|
||
|
||
## Project Structure
|
||
|
||
- `src/design-system/primitives/` — atomic UI components (Button, Input, Badge, etc.)
|
||
- `src/design-system/composites/` — composed components (DataTable, Modal, Toast, etc.)
|
||
- `src/design-system/layout/` — page-level layout (AppShell, Sidebar, TopBar)
|
||
- `src/design-system/providers/` — ThemeProvider
|
||
- `src/design-system/tokens.css` — all design tokens (colors, spacing, typography)
|
||
- `src/pages/` — application pages
|
||
- `src/pages/Inventory/` — component showcase at `/inventory`
|
||
|
||
## Conventions
|
||
|
||
### Styling
|
||
- CSS Modules only — import as `import styles from './Component.module.css'`
|
||
- Use tokens from `tokens.css` — never hardcode hex colors
|
||
- All colors via CSS custom properties — supports light/dark via `[data-theme="dark"]`
|
||
- No inline styles except dynamic values (width from props, etc.)
|
||
|
||
### Components
|
||
- `forwardRef` on all form controls (Input, Textarea, Select, Checkbox, Toggle, Label, FilterPill)
|
||
- Every component accepts a `className` prop
|
||
- Semantic color variants: `'success' | 'warning' | 'error'` pattern
|
||
- Barrel exports: `src/design-system/primitives/index.ts` and `src/design-system/composites/index.ts`
|
||
|
||
### Testing
|
||
- Vitest + React Testing Library + happy-dom
|
||
- Tests co-located: `Component.test.tsx` next to `Component.tsx`
|
||
- Run: `npx vitest run` (all) or `npx vitest run src/path/to/Component` (single)
|
||
- Wrap in `<ThemeProvider>` when component uses `useTheme()` or `hashColor()`
|
||
|
||
### Import Paths
|
||
```tsx
|
||
import { Button, Input } from '../design-system/primitives'
|
||
import { Modal, DataTable, KpiStrip, SplitPane, EntityList, LogViewer, LineChart, AreaChart, BarChart } from '../design-system/composites'
|
||
import type { Column, KpiItem, LogEntry, ChartSeries } from '../design-system/composites'
|
||
import { AppShell } from '../design-system/layout/AppShell'
|
||
import { Sidebar } from '../design-system/layout/Sidebar/Sidebar'
|
||
import { SidebarTree } from '../design-system/layout/Sidebar/SidebarTree'
|
||
import type { SidebarTreeNode } from '../design-system/layout/Sidebar/SidebarTree'
|
||
import { useStarred } from '../design-system/layout/Sidebar/useStarred'
|
||
import { ThemeProvider } from '../design-system/providers/ThemeProvider'
|
||
```
|
||
|
||
## Using This Design System in Other Apps
|
||
|
||
This design system is published as `@cameleer/design-system` to the Gitea npm registry.
|
||
|
||
### Registry: `https://gitea.siegeln.net/api/packages/cameleer/npm/`
|
||
|
||
### Setup in a consuming app
|
||
|
||
1. Add `.npmrc` to the project root:
|
||
|
||
```
|
||
@cameleer:registry=https://gitea.siegeln.net/api/packages/cameleer/npm/
|
||
//gitea.siegeln.net/api/packages/cameleer/npm/:_authToken=${GITEA_TOKEN}
|
||
```
|
||
|
||
Note: CI pipelines for consuming apps also need this `.npmrc` and a `GITEA_TOKEN` secret to fetch the package during `npm ci`.
|
||
|
||
2. Install:
|
||
|
||
```bash
|
||
# Snapshot builds (during development)
|
||
npm install @cameleer/design-system@dev
|
||
|
||
# Stable releases
|
||
npm install @cameleer/design-system
|
||
```
|
||
|
||
3. Add fonts to `index.html` (required — the package does not bundle fonts):
|
||
|
||
```html
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
||
```
|
||
|
||
Without these, `var(--font-body)` and `var(--font-mono)` fall back to `system-ui` / `monospace`.
|
||
|
||
4. Import styles once at app root, then use components:
|
||
|
||
```tsx
|
||
import '@cameleer/design-system/style.css'
|
||
import { Button, AppShell, ThemeProvider } from '@cameleer/design-system'
|
||
```
|
||
|
||
### Import Paths (Consumer)
|
||
|
||
```tsx
|
||
// All components from single entry
|
||
import { Button, Input, Modal, DataTable, KpiStrip, SplitPane, EntityList, LogViewer, StatusText, AppShell, LineChart, AreaChart, BarChart } from '@cameleer/design-system'
|
||
|
||
// Sidebar (compound component — compose your own navigation)
|
||
import { Sidebar, SidebarTree, useStarred } from '@cameleer/design-system'
|
||
import type { SidebarTreeNode } from '@cameleer/design-system'
|
||
|
||
// Types
|
||
import type { Column, DataTableProps, SearchResult, KpiItem, LogEntry } from '@cameleer/design-system'
|
||
|
||
// Providers
|
||
import { ThemeProvider, useTheme } from '@cameleer/design-system'
|
||
import { CommandPaletteProvider, useCommandPalette } from '@cameleer/design-system'
|
||
import { GlobalFilterProvider, useGlobalFilters } from '@cameleer/design-system'
|
||
|
||
// Utils
|
||
import { hashColor } from '@cameleer/design-system'
|
||
|
||
// Recharts theme (for advanced charts — treemap, radar, heatmap, etc.)
|
||
import { rechartsTheme, CHART_COLORS } from '@cameleer/design-system'
|
||
import type { ChartSeries, DataPoint } from '@cameleer/design-system'
|
||
|
||
// Styles (once, at app root)
|
||
import '@cameleer/design-system/style.css'
|
||
|
||
// Brand assets (static files via ./assets/* export)
|
||
import logo from '@cameleer/design-system/assets/cameleer3-logo.png' // full resolution
|
||
import logo32 from '@cameleer/design-system/assets/cameleer3-32.png' // 32×32 favicon
|
||
import logo180 from '@cameleer/design-system/assets/cameleer3-180.png' // Apple touch icon
|
||
import logo192 from '@cameleer/design-system/assets/cameleer3-192.png' // Android/PWA icon
|
||
import logo512 from '@cameleer/design-system/assets/cameleer3-512.png' // PWA splash, og:image
|
||
import logoSvg from '@cameleer/design-system/assets/cameleer3-logo.svg' // high-detail SVG logo
|
||
import camelSvg from '@cameleer/design-system/assets/camel-logo.svg' // simplified camel SVG
|
||
```
|
||
|
||
<!-- gitnexus:start -->
|
||
# GitNexus — Code Intelligence
|
||
|
||
This project is indexed by GitNexus as **design-system** (1536 symbols, 2408 relationships, 23 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.
|
||
|
||
> If any GitNexus tool warns the index is stale, run `npx gitnexus analyze` in terminal first.
|
||
|
||
## Always Do
|
||
|
||
- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `gitnexus_impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user.
|
||
- **MUST run `gitnexus_detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows.
|
||
- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
|
||
- When exploring unfamiliar code, use `gitnexus_query({query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
|
||
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `gitnexus_context({name: "symbolName"})`.
|
||
|
||
## When Debugging
|
||
|
||
1. `gitnexus_query({query: "<error or symptom>"})` — find execution flows related to the issue
|
||
2. `gitnexus_context({name: "<suspect function>"})` — see all callers, callees, and process participation
|
||
3. `READ gitnexus://repo/design-system/process/{processName}` — trace the full execution flow step by step
|
||
4. For regressions: `gitnexus_detect_changes({scope: "compare", base_ref: "main"})` — see what your branch changed
|
||
|
||
## When Refactoring
|
||
|
||
- **Renaming**: MUST use `gitnexus_rename({symbol_name: "old", new_name: "new", dry_run: true})` first. Review the preview — graph edits are safe, text_search edits need manual review. Then run with `dry_run: false`.
|
||
- **Extracting/Splitting**: MUST run `gitnexus_context({name: "target"})` to see all incoming/outgoing refs, then `gitnexus_impact({target: "target", direction: "upstream"})` to find all external callers before moving code.
|
||
- After any refactor: run `gitnexus_detect_changes({scope: "all"})` to verify only expected files changed.
|
||
|
||
## Never Do
|
||
|
||
- NEVER edit a function, class, or method without first running `gitnexus_impact` on it.
|
||
- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis.
|
||
- NEVER rename symbols with find-and-replace — use `gitnexus_rename` which understands the call graph.
|
||
- NEVER commit changes without running `gitnexus_detect_changes()` to check affected scope.
|
||
|
||
## Tools Quick Reference
|
||
|
||
| Tool | When to use | Command |
|
||
|------|-------------|---------|
|
||
| `query` | Find code by concept | `gitnexus_query({query: "auth validation"})` |
|
||
| `context` | 360-degree view of one symbol | `gitnexus_context({name: "validateUser"})` |
|
||
| `impact` | Blast radius before editing | `gitnexus_impact({target: "X", direction: "upstream"})` |
|
||
| `detect_changes` | Pre-commit scope check | `gitnexus_detect_changes({scope: "staged"})` |
|
||
| `rename` | Safe multi-file rename | `gitnexus_rename({symbol_name: "old", new_name: "new", dry_run: true})` |
|
||
| `cypher` | Custom graph queries | `gitnexus_cypher({query: "MATCH ..."})` |
|
||
|
||
## Impact Risk Levels
|
||
|
||
| Depth | Meaning | Action |
|
||
|-------|---------|--------|
|
||
| d=1 | WILL BREAK — direct callers/importers | MUST update these |
|
||
| d=2 | LIKELY AFFECTED — indirect deps | Should test |
|
||
| d=3 | MAY NEED TESTING — transitive | Test if critical path |
|
||
|
||
## Resources
|
||
|
||
| Resource | Use for |
|
||
|----------|---------|
|
||
| `gitnexus://repo/design-system/context` | Codebase overview, check index freshness |
|
||
| `gitnexus://repo/design-system/clusters` | All functional areas |
|
||
| `gitnexus://repo/design-system/processes` | All execution flows |
|
||
| `gitnexus://repo/design-system/process/{name}` | Step-by-step execution trace |
|
||
|
||
## Self-Check Before Finishing
|
||
|
||
Before completing any code modification task, verify:
|
||
1. `gitnexus_impact` was run for all modified symbols
|
||
2. No HIGH/CRITICAL risk warnings were ignored
|
||
3. `gitnexus_detect_changes()` confirms changes match expected scope
|
||
4. All d=1 (WILL BREAK) dependents were updated
|
||
|
||
## Keeping the Index Fresh
|
||
|
||
After committing code changes, the GitNexus index becomes stale. Re-run analyze to update it:
|
||
|
||
```bash
|
||
npx gitnexus analyze
|
||
```
|
||
|
||
If the index previously included embeddings, preserve them by adding `--embeddings`:
|
||
|
||
```bash
|
||
npx gitnexus analyze --embeddings
|
||
```
|
||
|
||
To check whether embeddings exist, inspect `.gitnexus/meta.json` — the `stats.embeddings` field shows the count (0 means no embeddings). **Running analyze without `--embeddings` will delete any previously generated embeddings.**
|
||
|
||
> Claude Code users: A PostToolUse hook handles this automatically after `git commit` and `git merge`.
|
||
|
||
## CLI
|
||
|
||
| Task | Read this skill file |
|
||
|------|---------------------|
|
||
| Understand architecture / "How does X work?" | `.claude/skills/gitnexus/gitnexus-exploring/SKILL.md` |
|
||
| Blast radius / "What breaks if I change X?" | `.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md` |
|
||
| Trace bugs / "Why is X failing?" | `.claude/skills/gitnexus/gitnexus-debugging/SKILL.md` |
|
||
| Rename / extract / split / refactor | `.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md` |
|
||
| Tools, resources, schema reference | `.claude/skills/gitnexus/gitnexus-guide/SKILL.md` |
|
||
| Index, status, clean, wiki CLI commands | `.claude/skills/gitnexus/gitnexus-cli/SKILL.md` |
|
||
|
||
<!-- gitnexus:end -->
|