From c190d6f1b56948b4dc93f93dbc474d48dacd1a22 Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Tue, 5 May 2026 11:38:36 -0400 Subject: [PATCH] feat(headless): add cssVars utility and Tooltip primitive --- packages/headless/package.json | 4 + .../headless/src/primitives/tooltip/README.md | 115 ++++++ .../headless/src/primitives/tooltip/index.ts | 10 + .../src/primitives/tooltip/tooltip.test.tsx | 309 ++++++++++++++++ .../src/primitives/tooltip/tooltip.tsx | 333 ++++++++++++++++++ packages/headless/src/utils/css-vars.test.ts | 269 ++++++++++++++ packages/headless/src/utils/css-vars.ts | 76 ++++ packages/headless/src/utils/index.ts | 1 + packages/headless/vite.config.ts | 1 + 9 files changed, 1118 insertions(+) create mode 100644 packages/headless/src/primitives/tooltip/README.md create mode 100644 packages/headless/src/primitives/tooltip/index.ts create mode 100644 packages/headless/src/primitives/tooltip/tooltip.test.tsx create mode 100644 packages/headless/src/primitives/tooltip/tooltip.tsx create mode 100644 packages/headless/src/utils/css-vars.test.ts create mode 100644 packages/headless/src/utils/css-vars.ts diff --git a/packages/headless/package.json b/packages/headless/package.json index 8080f593513..3c3e24d0d99 100644 --- a/packages/headless/package.json +++ b/packages/headless/package.json @@ -12,6 +12,10 @@ "import": "./dist/primitives/tabs/index.js", "types": "./dist/primitives/tabs/index.d.ts" }, + "./tooltip": { + "import": "./dist/primitives/tooltip/index.js", + "types": "./dist/primitives/tooltip/index.d.ts" + }, "./dialog": { "import": "./dist/primitives/dialog/index.js", "types": "./dist/primitives/dialog/index.d.ts" diff --git a/packages/headless/src/primitives/tooltip/README.md b/packages/headless/src/primitives/tooltip/README.md new file mode 100644 index 00000000000..41cca266d07 --- /dev/null +++ b/packages/headless/src/primitives/tooltip/README.md @@ -0,0 +1,115 @@ +# Tooltip + +A floating label that appears on hover or focus. Non-interactive, used for supplementary descriptions. No focus trapping — tooltips never receive focus. + +## When to Use + +- Describing icon buttons, truncated text, or any element that benefits from a short label. +- When the content is display-only (no interactive elements inside). +- Prefer Tooltip over Popover when the content is a simple text label that should appear on hover/focus and disappear immediately. + +## Usage + +```tsx +import { Tooltip } from '@/primitives/tooltip'; + + + + + + + + Settings + + + +; +``` + +### Controlled + +```tsx +const [open, setOpen] = useState(false); + + + {/* ... */} +; +``` + +### Custom Delay + +```tsx + + {/* Opens after 500ms hover, closes 100ms after leaving */} + +``` + +## Parts + +| Part | Default Element | Description | +| -------------------- | --------------- | ------------------------------------------------ | +| `Tooltip` | — | Root context provider | +| `Tooltip.Trigger` | `