// Button contrast harness (TASK-site-button-contrast-20260928). // Renders sample buttons against the real built CSS in headless Chrome, light // and dark, and prints text / background / opacity / contrast per sample. // Not a repo dependency: uses the machine's global playwright-core + Chrome. // // Usage: // mkdir -p /tmp/btn && cp frontend/.next/static/chunks/*.css /tmp/btn/ # or download staging's CSS: // for c in $(curl -s https://staging.jyotisha.chat/login | grep -o '/_next/static/chunks/[^"]*\.css' | sort -u); do curl -s "https://staging.jyotisha.chat$c" -o /tmp/btn/$(basename $c); done // node docs/testing/button-contrast-harness.cjs /tmp/btn // // Only copy a *fresh* build's CSS: a stale .next once hid a live fix during // the 2026-09-28 scan. Update `base` / `V` below if button.tsx classes change. const { chromium } = require(process.env.PLAYWRIGHT_CORE || "/usr/local/lib/node_modules/playwright-core"); const fs = require("fs"), path = require("path"); const dir = process.argv[2]; const cssFiles = fs.readdirSync(dir).filter(f => f.endsWith(".css")); const base = "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-[background-color,border-color,color,box-shadow,transform] duration-150 ease-out outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:scale-[0.96] disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 h-11 gap-2 px-4"; const V = { default: "bg-primary text-primary-foreground hover:bg-primary/80", outline: "border-border bg-background hover:bg-muted hover:text-foreground", ghost: "hover:bg-muted hover:text-foreground" }; const samples = [ ["Button 默认(实心)", ``], ["Button 默认 · 禁用", ``], ["Button 描边", ``], ["Button 描边 · 禁用", ``], [".button-primary", ``], [".button-primary · 禁用", ``], [".danger-primary", ``], [".danger-primary · 禁用", ``], [".button-secondary", ``], ["输入框发送键", `