chore: configure build tooling and dependencies

Set up the foundational build configuration for Mission Control:

Frontend Build (Vite + TypeScript):
- package.json: React 19, TanStack Query, Zustand, Framer Motion
- tsconfig.json: Strict TypeScript with path aliases (@/)
- vite.config.ts: Tailored for Tauri (port 1420, ignores src-tauri)

Styling (Tailwind CSS):
- tailwind.config.ts: Custom surface color palette (zinc-900/800/700)
- postcss.config.js: Tailwind + autoprefixer pipeline
- tailwind.config.js: Generated config (superseded by .ts)

Code Quality:
- eslint.config.js: ESLint 9 flat config with TypeScript + React hooks
- .gitignore: Exclude node_modules, dist, coverage, test artifacts

This establishes the monorepo structure where:
- Frontend lives in src/ and builds to dist/
- Tauri backend lives in src-tauri/ with its own Cargo workspace
This commit is contained in:
teernisse
2026-02-25 16:59:48 -05:00
parent 954067a38b
commit 9cfd471d24
10 changed files with 6023 additions and 1 deletions

37
.gitignore vendored
View File

@@ -1,2 +1,37 @@
# bv (beads viewer) local config and caches
# Dependencies
node_modules/
# Build outputs
dist/
src-tauri/target/
# Local state
.bv/
# IDE
.idea/
.vscode/
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Logs
*.log
npm-debug.log*
# Test artifacts
coverage/
playwright-report/
test-results/
# Environment
.env
.env.local
.env.*.local
# Tauri
src-tauri/WixTools/
src-tauri/NSIS/

26
eslint.config.js Normal file
View File

@@ -0,0 +1,26 @@
import js from "@eslint/js";
import globals from "globals";
import reactHooks from "eslint-plugin-react-hooks";
import tseslint from "typescript-eslint";
export default tseslint.config(
{ ignores: ["dist", "src-tauri"] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ["**/*.{ts,tsx}"],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
plugins: {
"react-hooks": reactHooks,
},
rules: {
...reactHooks.configs.recommended.rules,
"@typescript-eslint/no-unused-vars": [
"error",
{ argsIgnorePattern: "^_" },
],
},
}
);

5786
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

52
package.json Normal file
View File

@@ -0,0 +1,52 @@
{
"name": "mission-control",
"private": true,
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"preview": "vite preview",
"test": "vitest run",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage",
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"tauri": "tauri",
"tauri:dev": "tauri dev",
"tauri:build": "tauri build"
},
"dependencies": {
"@tanstack/react-query": "^5.75.0",
"@tauri-apps/api": "^2.3.0",
"@tauri-apps/plugin-shell": "^2.2.0",
"framer-motion": "^12.0.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"zustand": "^5.0.0"
},
"devDependencies": {
"@eslint/js": "^10.0.1",
"@playwright/test": "^1.58.2",
"@tauri-apps/cli": "^2.3.0",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.2",
"@testing-library/user-event": "^14.6.1",
"@types/react": "^19.0.0",
"@types/react-dom": "^19.0.0",
"@vitejs/plugin-react": "^4.4.0",
"@vitest/coverage-v8": "^4.0.18",
"autoprefixer": "^10.4.21",
"eslint": "^9.21.0",
"eslint-plugin-react-hooks": "^5.1.0",
"globals": "^17.3.0",
"jsdom": "^28.1.0",
"postcss": "^8.5.3",
"tailwindcss": "^3.4.18",
"typescript": "^5.8.0",
"typescript-eslint": "^8.56.1",
"vite": "^6.2.0",
"vitest": "^4.0.18"
}
}

6
postcss.config.js Normal file
View File

@@ -0,0 +1,6 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

31
tailwind.config.js Normal file
View File

@@ -0,0 +1,31 @@
/** @type {import('tailwindcss').Config} */
export default {
darkMode: "class",
content: [
"./index.html",
"./src/**/*.{js,ts,jsx,tsx}",
],
theme: {
extend: {
colors: {
// Mission Control color system (ADHD-friendly)
mc: {
fresh: "#22c55e", // Green - items < 1 day
normal: "#a1a1aa", // Zinc - items 1-2 days
amber: "#f59e0b", // Amber - items 3-6 days
urgent: "#ef4444", // Red - items 7+ days
},
// Dark mode background palette
surface: {
DEFAULT: "#18181b", // Main background
raised: "#27272a", // Cards, dialogs
overlay: "#3f3f46", // Overlays, menus
},
},
animation: {
pulse: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite",
},
},
},
plugins: [],
};

18
tailwind.config.ts Normal file
View File

@@ -0,0 +1,18 @@
import type { Config } from "tailwindcss";
export default {
content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
darkMode: "class",
theme: {
extend: {
colors: {
surface: {
DEFAULT: "#18181b", // zinc-900
raised: "#27272a", // zinc-800
overlay: "#3f3f46", // zinc-700
},
},
},
},
plugins: [],
} satisfies Config;

31
tsconfig.json Normal file
View File

@@ -0,0 +1,31 @@
{
"compilerOptions": {
"target": "ES2022",
"useDefineForClassFields": true,
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
/* Paths */
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}

11
tsconfig.node.json Normal file
View File

@@ -0,0 +1,11 @@
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
"strict": true
},
"include": ["vite.config.ts"]
}

26
vite.config.ts Normal file
View File

@@ -0,0 +1,26 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import path from "path";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
// Vite options tailored for Tauri development
clearScreen: false,
server: {
port: 1420,
strictPort: true,
watch: {
// Tell vite to ignore watching `src-tauri`
ignored: ["**/src-tauri/**"],
},
},
});