Files
千羽and千羽 57b1eff1d4 feat(ui): v8 — theme color, unified controls, motion, virtual lists (#7816)
Unify the visual and interaction rules on top of the v7 redesign.

- Theme color #F97315 for --action-* and --ring; dark mode uses #EA580C
  with white text, toned-down mode colors and translucent soft fills
- Buttons mapped to three sizes (28 / 32 / 36); inputs, selects and
  search fields share fieldClass; self-drawn checkbox and radio
- HoverTip replaces title on about 100 icon buttons; it stays closed
  when a closing menu returns focus to its trigger
- Install tailwindcss-animate so menu, popover, dialog and tooltip
  enter/exit animations take effect; sliding segment thumb and tab
  underline
- Remove the command palette and the header prompt entry; provider card
  primary actions become icon buttons
- Virtualize the session list and the Skills discovery list; optimistic
  toggles for MCP and Skills with a 300ms delayed disabled state
- Toasts drawn unstyled with status-colored icons and de-duplicated
- Windows: hide the system title bar and use in-app window controls;
  macOS: brand row under the traffic lights
- Focus rings only for keyboard users
- Skills discovery and the prompt list show the last result from a
  local cache and refresh in the background
- Drop the trailing ellipsis from 36 dialog-opening labels
- Provider list fills the main area

Co-authored-by: 千羽 <qyinter@users.noreply.github.com>
2026-10-03 23:28:59 +08:00

34 lines
999 B
TypeScript

import { act, render, screen } from "@testing-library/react";
import { afterEach, describe, expect, it } from "vitest";
import { HoverTip } from "@/components/ui/hover-tip";
function renderTip() {
render(
<HoverTip content="更多操作">
<button type="button" aria-label="更多">
⋯
</button>
</HoverTip>,
);
return screen.getByRole("button", { name: "更多" });
}
describe("HoverTip", () => {
afterEach(() => {
delete document.documentElement.dataset.keyboard;
});
it("stays closed when focus returns to the trigger without the keyboard (menu closed by click)", () => {
const button = renderTip();
act(() => button.focus());
expect(screen.queryByRole("tooltip")).not.toBeInTheDocument();
});
it("opens on keyboard focus", () => {
const button = renderTip();
document.documentElement.dataset.keyboard = "";
act(() => button.focus());
expect(screen.getByRole("tooltip")).toHaveTextContent("更多操作");
});
});