Migrate four OmniVoice UI primitives onto shadcn/ui foundations while keeping their exact legacy prop APIs, so no call site changes. - Button: thin wrapper over src/components/ui/button.tsx. Extends the shadcn CVA with the OmniVoice variants (primary/subtle/softGhost/danger/chip[+Active]/ preset[+Active]/iconBtn[+Active]) + sizes (omniSm/omniMd/chip/preset/iconSm/ iconMd), styled via palette token utilities. Maps variant/size/iconSize/active/ loading/leading/trailing/block/ref. Each variant sets an explicit border (transparent where needed) since the app ships Tailwind without Preflight. - Badge: new src/components/ui/badge.tsx; CVA carries the tones (neutral/brand/ success/warn/danger/info/violet) + xs/sm sizes. Wrapper maps tone->variant and keeps the ui-badge / ui-badge__dot hooks so the Header --pulse animation works. - Progress: new src/components/ui/progress.tsx (on @radix-ui/react-progress) with indicatorClassName + indeterminate support. Wrapper keeps per-tone gradients, sizes, shimmer overlay, and the ui-progress / has-shimmer / is-indeterminate hooks (residual.css keyframes unchanged). - Segmented: new toggle.tsx + toggle-group.tsx (adds @radix-ui/react-toggle). The `seg` toggle variant reproduces the segmented look; wrapper preserves the items/value/onChange/size API. residual.css: drop the obsolete .ui-seg__opt:focus-visible rule (focus now falls through to the global ring). Badge pulse + Progress shimmer/indeterminate rules kept (still needed). Visual baselines: Badge/Progress/Segmented render byte-identical to before; only Button baselines updated (shadcn markup differs in padding/radius, palette- coherent across default/midnight/catppuccin). All gates pass: oxlint, oxfmt, tsc, vite build, vitest (641), test:visual (48), bun install --frozen-lockfile. Co-authored-by: mergetest <test@local> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
91 lines
2.9 KiB
JSON
91 lines
2.9 KiB
JSON
{
|
|
"name": "omnivoice-studio",
|
|
"version": "0.3.8",
|
|
"private": true,
|
|
"license": "AGPL-3.0-only",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"desktop": "tauri dev",
|
|
"build": "vite build",
|
|
"lint": "oxlint",
|
|
"lint:fix": "oxlint --fix",
|
|
"lint:hooks": "eslint .",
|
|
"format": "oxfmt --write",
|
|
"format:check": "oxfmt --check",
|
|
"knip": "knip",
|
|
"typecheck": "tsc --noEmit",
|
|
"typecheck:ci": "tsc --noEmit --checkJs false",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:legacy": "node --experimental-strip-types --no-warnings --test ../tests/frontend/*.test.mjs",
|
|
"preview": "vite preview",
|
|
"tauri": "tauri",
|
|
"e2e": "playwright test",
|
|
"test:visual": "playwright test --config=playwright.visual.config.ts",
|
|
"test:visual:update": "playwright test --config=playwright.visual.config.ts --update-snapshots"
|
|
},
|
|
"dependencies": {
|
|
"@fontsource-variable/inter": "^5.2.8",
|
|
"@fontsource-variable/source-serif-4": "^5.2.9",
|
|
"@fontsource/ibm-plex-mono": "^5.2.7",
|
|
"@radix-ui/react-dialog": "^1.1.17",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.18",
|
|
"@radix-ui/react-progress": "^1.1.10",
|
|
"@radix-ui/react-select": "^2.3.1",
|
|
"@radix-ui/react-slider": "^1.4.1",
|
|
"@radix-ui/react-slot": "^1.3.0",
|
|
"@radix-ui/react-tabs": "^1.1.15",
|
|
"@radix-ui/react-toggle": "^1.1.12",
|
|
"@radix-ui/react-toggle-group": "^1.1.13",
|
|
"@radix-ui/react-tooltip": "^1.2.10",
|
|
"@tailwindcss/vite": "^4.3.1",
|
|
"@tanstack/react-query": "^5.101.0",
|
|
"@tanstack/react-table": "^8.21.3",
|
|
"@tanstack/react-virtual": "^3.14.3",
|
|
"@tauri-apps/plugin-dialog": "^2.7.1",
|
|
"@tauri-apps/plugin-opener": "^2.5.4",
|
|
"@tauri-apps/plugin-process": "^2.3.1",
|
|
"@tauri-apps/plugin-updater": "^2.10.1",
|
|
"@tauri-apps/plugin-window-state": "^2.4.1",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"country-flag-icons": "^1.6.17",
|
|
"i18next": "^26.3.1",
|
|
"i18next-browser-languagedetector": "^8.2.1",
|
|
"lucide-react": "^1.18.0",
|
|
"qrcode": "^1.5.4",
|
|
"react": "^19.2.7",
|
|
"react-dom": "^19.2.7",
|
|
"react-hot-toast": "^2.6.0",
|
|
"react-i18next": "^17.0.8",
|
|
"react-window": "^2.2.7",
|
|
"tailwind-merge": "^3.6.0",
|
|
"tailwindcss": "^4.3.1",
|
|
"tw-animate-css": "^1.4.0",
|
|
"wavesurfer.js": "^7.12.8",
|
|
"zustand": "^5.0.14"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.61.0",
|
|
"@tauri-apps/api": "^2.11.0",
|
|
"@tauri-apps/cli": "^2.11.2",
|
|
"@testing-library/jest-dom": "^6.9.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/react": "^19.2.17",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@vitejs/plugin-react": "^6.0.2",
|
|
"eslint": "^10.5.0",
|
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
"globals": "^17.6.0",
|
|
"jsdom": "^29.1.1",
|
|
"knip": "^6.23.0",
|
|
"oxfmt": "^0.57.0",
|
|
"oxlint": "^1.71.0",
|
|
"playwright-core": "1.61.0",
|
|
"typescript": "^6.0.3",
|
|
"vite": "^8.0.16",
|
|
"vitest": "^4.1.9"
|
|
}
|
|
}
|