VITE_BUILD_TARGET env var switches between Chrome Extension and PWA:
| Command | Target | Output | Notes |
|---|---|---|---|
pnpm dev |
Web (PWA) | dev server :3102 | --host enabled, CORS open |
pnpm dev:extension |
Chrome Extension | CRXJS dev reload | HMR for side panel |
pnpm dev:web |
Web (PWA) | same as pnpm dev |
explicit alias |
pnpm build |
Both | dist-web/ + dist-extension/ |
runs tsc -b first |
pnpm build:extension |
Extension only | dist-extension/ |
|
pnpm build:web |
Web only | dist-web/ |
pnpm install # uses pnpm (not npm/yarn)
pnpm dev:extension # for Chrome side panel
pnpm lint # ESLint flat config (ts, tsx only)- No test framework — no vitest, jest, or playwright configured.
tailwind.config.jsis stale — Tailwind CSS v4 config is insrc/index.cssvia@themedirectives.
Config tsconfig.app.json enables non-obvious strict flags:
verbatimModuleSyntax— must useimport typefor type-only imports (already standard in codebase).erasableSyntaxOnly— no enums; useconstobjects +as constor union types instead.noUnusedLocals,noUnusedParameters— bothtrue.
| Layer | Location | Detail |
|---|---|---|
| Entry (React) | src/main.tsx → App.tsx |
Mounts #root |
| Entry (SW) | src/background.ts |
Chrome service worker, side panel toggle |
| State | src/store/useStore.ts |
Zustand with persist middleware |
| Storage | Zustand persist | chrome.storage.local in extension, localStorage fallback in web |
| DnD | src/store/DnDProvider.tsx + src/hooks/useDnD.ts |
Custom implementation (no dnd-kit) |
| Auth | src/lib/firebase.ts + src/hooks/useAuth.ts |
Firebase auth, env vars required |
| CSS | src/index.css |
Tailwind v4 @import "tailwindcss" + custom @theme tokens + glass utilities |
| Styling helper | src/utils/utils.ts |
cn() via clsx + tailwind-merge |
Storage key: list-dock-storage (with versioned migration in Zustand persist).
pnpm release— interactive wizard (bumps version inpackage.json+manifest.json, commits, tags, pushes).- GitHub Action on
v*tag: runspnpm build, zipsdist-extension/, creates release.
PWA auto-deploys to GitHub Pages on pushes to main.
Auth requires .env with these vars (copy .env.example):
VITE_FIREBASE_API_KEY
VITE_FIREBASE_AUTH_DOMAIN
VITE_FIREBASE_PROJECT_ID
VITE_FIREBASE_STORAGE_BUCKET
VITE_FIREBASE_MESSAGING_SENDER_ID
VITE_FIREBASE_APP_ID
.env is gitignored but the dev file exists with live values.
- Font: Space Mono (loaded from Google Fonts via
index.html) - Glassmorphism UI:
glass,glass-bottom-only,glass-top-onlyutility classes inindex.css - Lightweight icon: Lucide React
- Annotations: Framer Motion