Files
VoiceStudio/frontend/package.json
T
86b30ece98 feat(ui): back Button/Badge/Progress/Segmented with shadcn (prop APIs preserved) (#799)
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>
2026-06-30 21:31:49 +05:30

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"
}
}