# Dependencies
node_modules/

# Build output
dist/
*.tsbuildinfo

# Environment
.env
.env.local
.env.*.local

# Lefthook per-developer overrides (not shared; see lefthook.yml for shared hooks)
lefthook-local.yml

# OS
.DS_Store
Thumbs.db

# Docs media — served from CDN, not committed.
# Regenerate with scripts/generate-{catalog,template}-previews.ts then upload
# with `bun run upload:docs-images`. Add explicit negations below for any
# non-generated assets (logos, svgs) that should stay in the repo.
docs/images/

videos/

# IDE
.vscode/
.idea/
*.swp
*.swo

# Test
coverage/
.debug/

# Producer regression test failures (generated debugging artifacts).
# RECURSIVE (`**`) so a failures/ dump at ANY fixture depth is ignored — the
# old non-recursive `tests/*/failures/` + `tests/distributed/*/failures/` rules
# only matched one level deep, so a nested fixture like
# `tests/hdr-regression/hdr-pq/failures/` could still get committed.
packages/producer/tests/**/failures/
packages/producer/tests/parity/fixtures/hyperframe.runtime.iife.js

# Player perf test results (generated each run, attached as CI artifact)
packages/player/tests/perf/results/

# Rendered output (not test fixtures — those use git LFS)
output/
renders/
!packages/producer/tests/*/output/
!packages/producer/tests/distributed/*/output/
# Source dir that the renders/ output rule accidentally shadows (its files are
# tracked; without this, pre-commit's format re-stage fails on them).
!packages/studio/src/components/renders/

# Composition source media (large binaries)
compositions/**/*.mp4
compositions/**/*.mov
compositions/**/*.MOV

# npm pack artifacts
*.tgz

# Logs
*.log
npm-debug.log*

# Temporary
tmp/
.tmp/

# Generated files
packages/core/src/generated/*
!packages/core/src/generated/position-edits-render-inline.ts
!packages/core/src/generated/position-edits-render-inline.test.ts
packages/producer/src/services/fontData.generated.ts

# Plan documents (working artifacts, not committed)
docs/plans/

# Local proof / test artifacts
qa-artifacts/
my-video/
# Studio project state (hf-id backups, per-file state) — always runtime-generated,
# never committed. Broadened from .hyperframes/backup/ after preview-generated state
# leaked into a fixture commit.
.hyperframes/
examples/*
# Tracked OSS examples — negations override the blanket `examples/*` ignore.
!examples/aws-lambda
!examples/aws-lambda/**
!examples/k8s-jobs
!examples/k8s-jobs/**
!examples/gcp-cloud-run
!examples/gcp-cloud-run/**
# …but never the local smoke run's build/render artifacts.
examples/gcp-cloud-run/scripts/gcp-smoke-artifacts/
packages/studio/data/

.desloppify/
.worktrees/

# Playwright MCP browser cache
.playwright-mcp/

# Installed skills (user-specific)
.agents/
.claude/skills/
skills-lock.json

# Skills from other PRs (not managed here)
skills/hyperframes-animation-map/
skills/hyperframes-contrast/

# Capture outputs
captures/
# Legacy test captures at repo root (use captures/ instead)
*-capture/
*-demo/
*-ad/
*-tour/
*-brand/

# Local regression-test and video project scratch directories.
# These hold per-site captures, compositions, narration audio, rendered MP4s.
cursor-tests/
basecamp-video/
launch-video*/
!skills/launch-video/
ab-test/
compositions/
video-6-2-patched/
claude-design-hyperframes-video/
# Per-site video work at the repo root (huly-*, raycast-*, etc.)
# Anything under videos/ is already covered above, but agents sometimes write
# project dirs to the repo root when iterating. Catch the common per-brand
# patterns and any *-demo-N variants the *-demo/ rule above misses.
huly-*/
raycast-*/
*-demo-*/
test-runs/
test-outputs/

# Claude Code worktrees + superpowers docs
.claude/worktrees/
.claude/
docs/superpowers/
.worktrees
hyperframes-bench/
tmp/
# Studio-generated preview thumbnails
.thumbnails/

# Local editor settings
.zed/
