From 21be38a7fda2d7510f6b20a7e76bd6803ba0144c Mon Sep 17 00:00:00 2001 From: Mona Brahmakshatriya Date: Wed, 12 Aug 2026 19:47:40 +0530 Subject: [PATCH 1/2] Add ShadcnStore Design System to Figma resources (#10344) --- apps/v4/content/docs/(root)/figma.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/v4/content/docs/(root)/figma.mdx b/apps/v4/content/docs/(root)/figma.mdx index b8417b71b4f..7d85f068556 100644 --- a/apps/v4/content/docs/(root)/figma.mdx +++ b/apps/v4/content/docs/(root)/figma.mdx @@ -21,3 +21,4 @@ description: Every component recreated in Figma. With customizable props, typogr - [Shadcnblocks.com](https://www.shadcnblocks.com) - A Premium Shadcn Figma UI Kit with components, 500+ pro blocks, shadcn theme variables, light/dark mode and Figma MCP ready. - [Obra shadcn/ui Pro](https://shadcn.obra.studio/products/obra-shadcn-ui-pro) by [Obra Studio](https://obra.studio/) - Focused on designers who need to get work done — the best designer experience for shadcn/ui within Figma. variable consistency with shadcn, plus custom components, Pro blocks, and a design-to-code plugin. - [Shadcn Space](https://shadcnspace.com/figma) - A collection of beautifully designed 320+ blocks, 9+ templates, and 250+ components with a shadcn/ui-compatible Figma kit built for modern React and Next.js workflows. Design, prototype, and ship faster using Figma components that mirror real code architecture and production-ready implementation patterns. +- [Shadcn Design System](https://shadcnstore.com/) by [ShadcnStore](https://x.com/shadcnstore) - A complete Figma UI kit for shadcn/ui with components, variants, design tokens, production-ready blocks and templates. Built for fast workflows and pixel-perfect designer-to-developer handoff. From a85299a9edd2a961e32f01ced86963a852652bd2 Mon Sep 17 00:00:00 2001 From: Devon Govett Date: Wed, 12 Aug 2026 08:18:35 -0700 Subject: [PATCH 2/2] feat: Add HoverCard and update ContextMenu in aria base (#11379) Co-authored-by: shadcn --- .../docs/components/aria/hover-card.mdx | 136 +++++++++++++ .../v4/content/docs/components/aria/meta.json | 1 + apps/v4/examples/__components__/aria.tsx | 24 +++ apps/v4/examples/__components__/index.tsx | 3 + apps/v4/examples/__index__.tsx | 12 ++ apps/v4/examples/aria/hover-card-demo.tsx | 19 ++ apps/v4/examples/aria/hover-card-rtl.tsx | 95 +++++++++ apps/v4/examples/aria/hover-card-sides.tsx | 28 +++ .../aria/message-scroller-visibility.tsx | 10 +- apps/v4/package.json | 4 +- apps/v4/public/r/index.json | 5 + apps/v4/registry/__components__/aria-luma.tsx | 8 + apps/v4/registry/__components__/aria-lyra.tsx | 8 + apps/v4/registry/__components__/aria-maia.tsx | 8 + apps/v4/registry/__components__/aria-mira.tsx | 8 + apps/v4/registry/__components__/aria-nova.tsx | 8 + apps/v4/registry/__components__/aria-rhea.tsx | 8 + apps/v4/registry/__components__/aria-sera.tsx | 8 + apps/v4/registry/__components__/aria-vega.tsx | 8 + apps/v4/registry/__components__/index.tsx | 8 + apps/v4/registry/__index__.tsx | 184 ++++++++++++++++++ .../v4/registry/bases/__components__/aria.tsx | 18 ++ .../registry/bases/__components__/index.tsx | 2 + apps/v4/registry/bases/__index__.tsx | 39 ++++ .../registry/bases/aria/examples/_registry.ts | 12 ++ .../aria/examples/hover-card-example.tsx | 93 +++++++++ apps/v4/registry/bases/aria/internal/sink.tsx | 2 + apps/v4/registry/bases/aria/ui/_registry.ts | 18 ++ .../registry/bases/aria/ui/context-menu.tsx | 74 +------ apps/v4/registry/bases/aria/ui/hover-card.tsx | 44 +++++ apps/v4/registry/styles/style-luma.css | 4 + apps/v4/registry/styles/style-lyra.css | 4 + apps/v4/registry/styles/style-maia.css | 4 + apps/v4/registry/styles/style-mira.css | 4 + apps/v4/registry/styles/style-nova.css | 4 + apps/v4/registry/styles/style-rhea.css | 4 + apps/v4/registry/styles/style-sera.css | 4 + apps/v4/registry/styles/style-vega.css | 4 + pnpm-lock.yaml | 67 +++---- 39 files changed, 883 insertions(+), 111 deletions(-) create mode 100644 apps/v4/content/docs/components/aria/hover-card.mdx create mode 100644 apps/v4/examples/aria/hover-card-demo.tsx create mode 100644 apps/v4/examples/aria/hover-card-rtl.tsx create mode 100644 apps/v4/examples/aria/hover-card-sides.tsx create mode 100644 apps/v4/registry/bases/aria/examples/hover-card-example.tsx create mode 100644 apps/v4/registry/bases/aria/ui/hover-card.tsx diff --git a/apps/v4/content/docs/components/aria/hover-card.mdx b/apps/v4/content/docs/components/aria/hover-card.mdx new file mode 100644 index 00000000000..7c29a4a2d22 --- /dev/null +++ b/apps/v4/content/docs/components/aria/hover-card.mdx @@ -0,0 +1,136 @@ +--- +title: Hover Card +description: A popover that appears on hover, focus, or long press to preview content available behind a link. +base: aria +component: true +links: + doc: https://react-aria.adobe.com/PreviewTrigger + api: https://react-aria.adobe.com/PreviewTrigger#api +--- + + + +## Installation + + + + + Command + Manual + + + +```bash +npx shadcn@latest add hover-card +``` + + + + + + + +Install the following dependencies: + +```bash +npm install react-aria-components +``` + +Copy and paste the following code into your project. + + + +Update the import paths to match your project setup. + + + + + + + +## Usage + +```tsx showLineNumbers +import { HoverCard, HoverCardTrigger } from "@/components/ui/hover-card" +``` + +```tsx showLineNumbers + + + + The React Framework – created and maintained by @vercel. + + +``` + +## Composition + +Use the following composition to build a `HoverCard`: + +```text +HoverCardTrigger +├── Button +└── HoverCard +``` + +## Trigger Delays + +Use `delay` and `closeDelay` on the `HoverCardTrigger` to control when the card +opens and closes. + +```tsx showLineNumbers + + + Content + +``` + +## Positioning + +Use the `placement` prop on `HoverCard` to control placement. + +```tsx showLineNumbers + + + Content + +``` + +## Basic + + + +## Sides + + + +## RTL + +To enable RTL support in shadcn/ui, see the [RTL configuration guide](/docs/rtl). + + + +## API Reference + +See the [React Aria](https://react-aria.adobe.com/PreviewTrigger#api) documentation for more information. diff --git a/apps/v4/content/docs/components/aria/meta.json b/apps/v4/content/docs/components/aria/meta.json index 9ffd5827737..4ee43e7ded8 100644 --- a/apps/v4/content/docs/components/aria/meta.json +++ b/apps/v4/content/docs/components/aria/meta.json @@ -30,6 +30,7 @@ "empty", "field", "form", + "hover-card", "input", "input-group", "input-otp", diff --git a/apps/v4/examples/__components__/aria.tsx b/apps/v4/examples/__components__/aria.tsx index e15dd9b9745..0c90acbace9 100644 --- a/apps/v4/examples/__components__/aria.tsx +++ b/apps/v4/examples/__components__/aria.tsx @@ -1798,6 +1798,30 @@ export const Components: Record = { ) || "file-upload-list" return { default: mod.default || mod[exportName] } }), + "hover-card-demo": React.lazy(async () => { + const mod = await import("@/examples/aria/hover-card-demo") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card-demo" + return { default: mod.default || mod[exportName] } + }), + "hover-card-rtl": React.lazy(async () => { + const mod = await import("@/examples/aria/hover-card-rtl") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card-rtl" + return { default: mod.default || mod[exportName] } + }), + "hover-card-sides": React.lazy(async () => { + const mod = await import("@/examples/aria/hover-card-sides") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card-sides" + return { default: mod.default || mod[exportName] } + }), "input-badge": React.lazy(async () => { const mod = await import("@/examples/aria/input-badge") const exportName = diff --git a/apps/v4/examples/__components__/index.tsx b/apps/v4/examples/__components__/index.tsx index 8a6d81d22c9..7b154c3a4db 100644 --- a/apps/v4/examples/__components__/index.tsx +++ b/apps/v4/examples/__components__/index.tsx @@ -757,6 +757,9 @@ const shards: Record< "field-switch", "field-textarea", "file-upload-list", + "hover-card-demo", + "hover-card-rtl", + "hover-card-sides", "input-badge", "input-basic", "input-button-group", diff --git a/apps/v4/examples/__index__.tsx b/apps/v4/examples/__index__.tsx index 4cba5a10155..b8e55f5b546 100644 --- a/apps/v4/examples/__index__.tsx +++ b/apps/v4/examples/__index__.tsx @@ -2955,6 +2955,18 @@ export const ExamplesIndex: Record> = { name: "file-upload-list", filePath: "examples/aria/file-upload-list.tsx", }, + "hover-card-demo": { + name: "hover-card-demo", + filePath: "examples/aria/hover-card-demo.tsx", + }, + "hover-card-rtl": { + name: "hover-card-rtl", + filePath: "examples/aria/hover-card-rtl.tsx", + }, + "hover-card-sides": { + name: "hover-card-sides", + filePath: "examples/aria/hover-card-sides.tsx", + }, "input-badge": { name: "input-badge", filePath: "examples/aria/input-badge.tsx", diff --git a/apps/v4/examples/aria/hover-card-demo.tsx b/apps/v4/examples/aria/hover-card-demo.tsx new file mode 100644 index 00000000000..65448eeb29f --- /dev/null +++ b/apps/v4/examples/aria/hover-card-demo.tsx @@ -0,0 +1,19 @@ +"use client" + +import { Button } from "@/styles/aria-nova/ui/button" +import { HoverCard, HoverCardTrigger } from "@/styles/aria-nova/ui/hover-card" + +export default function HoverCardDemo() { + return ( + + + +
@nextjs
+
The React Framework – created and maintained by @vercel.
+
+ Joined December 2021 +
+
+
+ ) +} diff --git a/apps/v4/examples/aria/hover-card-rtl.tsx b/apps/v4/examples/aria/hover-card-rtl.tsx new file mode 100644 index 00000000000..79606caba06 --- /dev/null +++ b/apps/v4/examples/aria/hover-card-rtl.tsx @@ -0,0 +1,95 @@ +"use client" + +import { + useTranslation, + type Translations, +} from "@/components/language-selector" +import { Button } from "@/styles/aria-nova/ui-rtl/button" +import { + HoverCard, + HoverCardTrigger, +} from "@/styles/aria-nova/ui-rtl/hover-card" + +const translations: Translations = { + en: { + dir: "ltr", + values: { + name: "Wireless Headphones", + price: "$99.99", + start: "Start", + left: "Left", + top: "Top", + bottom: "Bottom", + right: "Right", + end: "End", + }, + }, + ar: { + dir: "rtl", + values: { + name: "سماعات لاسلكية", + price: "٩٩.٩٩ $", + start: "بداية السطر", + left: "يسار", + top: "أعلى", + bottom: "أسفل", + right: "يمين", + end: "نهاية السطر", + }, + }, + he: { + dir: "rtl", + values: { + name: "אוזניות אלחוטיות", + price: "99.99 $", + start: "תחילת השורה", + left: "שמאל", + top: "למעלה", + bottom: "למטה", + right: "ימין", + end: "סוף השורה", + }, + }, +} + +const physicalSides = ["left", "top", "bottom", "right"] as const +const logicalPlacements = ["start", "end"] as const + +export function HoverCardRtl() { + const { dir, t } = useTranslation(translations, "ar") + + return ( +
+
+ {physicalSides.map((side) => ( + + + +
{t.name}
+
{t.price}
+
+
+ ))} +
+
+ {logicalPlacements.map((placement) => ( + + + +
{t.name}
+
{t.price}
+
+
+ ))} +
+
+ ) +} diff --git a/apps/v4/examples/aria/hover-card-sides.tsx b/apps/v4/examples/aria/hover-card-sides.tsx new file mode 100644 index 00000000000..0d432480b75 --- /dev/null +++ b/apps/v4/examples/aria/hover-card-sides.tsx @@ -0,0 +1,28 @@ +"use client" + +import { Button } from "@/styles/aria-nova/ui/button" +import { HoverCard, HoverCardTrigger } from "@/styles/aria-nova/ui/hover-card" + +const HOVER_CARD_PLACEMENTS = ["left", "top", "bottom", "right"] as const + +export function HoverCardSides() { + return ( +
+ {HOVER_CARD_PLACEMENTS.map((placement) => ( + + + +
+

Hover Card

+

+ This hover card appears on the {placement} side of the trigger. +

+
+
+
+ ))} +
+ ) +} diff --git a/apps/v4/examples/aria/message-scroller-visibility.tsx b/apps/v4/examples/aria/message-scroller-visibility.tsx index beada46c87b..6eaec4e612e 100644 --- a/apps/v4/examples/aria/message-scroller-visibility.tsx +++ b/apps/v4/examples/aria/message-scroller-visibility.tsx @@ -11,6 +11,7 @@ import { CardHeader, CardTitle, } from "@/styles/aria-rhea/ui/card" +import { HoverCard, HoverCardTrigger } from "@/styles/aria-rhea/ui/hover-card" import { Message, MessageContent } from "@/styles/aria-rhea/ui/message" import { MessageScroller, @@ -22,7 +23,6 @@ import { useMessageScroller, useMessageScrollerVisibility, } from "@/styles/aria-rhea/ui/message-scroller" -import { Popover, PopoverTrigger } from "@/styles/aria-rhea/ui/popover" const chat = createChat() .user("Review the incident handoff and tell me what to read first.", { @@ -127,7 +127,7 @@ function TranscriptOutline() { const { currentAnchorId } = useMessageScrollerVisibility() return ( - + - ))} - - + + ) } diff --git a/apps/v4/package.json b/apps/v4/package.json index 7487daf03f3..902b16f3aac 100644 --- a/apps/v4/package.json +++ b/apps/v4/package.json @@ -36,7 +36,7 @@ "@hookform/resolvers": "^3.10.0", "@hugeicons/core-free-icons": "^1.2.1", "@hugeicons/react": "^1.1.1", - "@internationalized/date": "^3.12.2", + "@internationalized/date": "^3.12.3", "@paper-design/shaders-react": "^0.0.72", "@phosphor-icons/react": "^2.1.10", "@remixicon/react": "^4.7.0", @@ -79,7 +79,7 @@ "postcss": "^8.5.1", "radix-ui": "^1.4.3", "react": "19.2.3", - "react-aria-components": "1.19.0", + "react-aria-components": "1.20.0", "react-day-picker": "^9.7.0", "react-dom": "19.2.3", "react-hook-form": "^7.62.0", diff --git a/apps/v4/public/r/index.json b/apps/v4/public/r/index.json index 71cb0349bc3..0345b99ba46 100644 --- a/apps/v4/public/r/index.json +++ b/apps/v4/public/r/index.json @@ -737,6 +737,11 @@ "examples": "https://ui.shadcn.com/code/apps/v4/registry/bases/base/examples/hover-card-example.tsx", "api": "https://base-ui.com/react/components/hover-card.md" }, + "aria": { + "docs": "https://ui.shadcn.com/docs/components/aria/hover-card", + "examples": "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + "api": "https://react-aria.adobe.com/PreviewTrigger#api" + }, "radix": { "docs": "https://ui.shadcn.com/docs/components/radix/hover-card", "examples": "https://ui.shadcn.com/code/apps/v4/registry/bases/radix/examples/hover-card-example.tsx", diff --git a/apps/v4/registry/__components__/aria-luma.tsx b/apps/v4/registry/__components__/aria-luma.tsx index 71e74c891f8..9eeed2763bb 100644 --- a/apps/v4/registry/__components__/aria-luma.tsx +++ b/apps/v4/registry/__components__/aria-luma.tsx @@ -190,6 +190,14 @@ export const Components: Record = { ) || "field" return { default: mod.default || mod[exportName] } }), + "hover-card": React.lazy(async () => { + const mod = await import("@/styles/aria-luma/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), input: React.lazy(async () => { const mod = await import("@/styles/aria-luma/ui/input") const exportName = diff --git a/apps/v4/registry/__components__/aria-lyra.tsx b/apps/v4/registry/__components__/aria-lyra.tsx index 422ba3fc8d3..6fc093364c1 100644 --- a/apps/v4/registry/__components__/aria-lyra.tsx +++ b/apps/v4/registry/__components__/aria-lyra.tsx @@ -190,6 +190,14 @@ export const Components: Record = { ) || "field" return { default: mod.default || mod[exportName] } }), + "hover-card": React.lazy(async () => { + const mod = await import("@/styles/aria-lyra/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), input: React.lazy(async () => { const mod = await import("@/styles/aria-lyra/ui/input") const exportName = diff --git a/apps/v4/registry/__components__/aria-maia.tsx b/apps/v4/registry/__components__/aria-maia.tsx index e20520649ff..7538eac89ef 100644 --- a/apps/v4/registry/__components__/aria-maia.tsx +++ b/apps/v4/registry/__components__/aria-maia.tsx @@ -190,6 +190,14 @@ export const Components: Record = { ) || "field" return { default: mod.default || mod[exportName] } }), + "hover-card": React.lazy(async () => { + const mod = await import("@/styles/aria-maia/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), input: React.lazy(async () => { const mod = await import("@/styles/aria-maia/ui/input") const exportName = diff --git a/apps/v4/registry/__components__/aria-mira.tsx b/apps/v4/registry/__components__/aria-mira.tsx index be587de4c5d..37d4450434f 100644 --- a/apps/v4/registry/__components__/aria-mira.tsx +++ b/apps/v4/registry/__components__/aria-mira.tsx @@ -190,6 +190,14 @@ export const Components: Record = { ) || "field" return { default: mod.default || mod[exportName] } }), + "hover-card": React.lazy(async () => { + const mod = await import("@/styles/aria-mira/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), input: React.lazy(async () => { const mod = await import("@/styles/aria-mira/ui/input") const exportName = diff --git a/apps/v4/registry/__components__/aria-nova.tsx b/apps/v4/registry/__components__/aria-nova.tsx index 612f5f59000..e7227236b1f 100644 --- a/apps/v4/registry/__components__/aria-nova.tsx +++ b/apps/v4/registry/__components__/aria-nova.tsx @@ -190,6 +190,14 @@ export const Components: Record = { ) || "field" return { default: mod.default || mod[exportName] } }), + "hover-card": React.lazy(async () => { + const mod = await import("@/styles/aria-nova/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), input: React.lazy(async () => { const mod = await import("@/styles/aria-nova/ui/input") const exportName = diff --git a/apps/v4/registry/__components__/aria-rhea.tsx b/apps/v4/registry/__components__/aria-rhea.tsx index 4c015d6d8ab..f86631299d1 100644 --- a/apps/v4/registry/__components__/aria-rhea.tsx +++ b/apps/v4/registry/__components__/aria-rhea.tsx @@ -190,6 +190,14 @@ export const Components: Record = { ) || "field" return { default: mod.default || mod[exportName] } }), + "hover-card": React.lazy(async () => { + const mod = await import("@/styles/aria-rhea/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), input: React.lazy(async () => { const mod = await import("@/styles/aria-rhea/ui/input") const exportName = diff --git a/apps/v4/registry/__components__/aria-sera.tsx b/apps/v4/registry/__components__/aria-sera.tsx index c4a6362c7d6..4cfe575dffd 100644 --- a/apps/v4/registry/__components__/aria-sera.tsx +++ b/apps/v4/registry/__components__/aria-sera.tsx @@ -190,6 +190,14 @@ export const Components: Record = { ) || "field" return { default: mod.default || mod[exportName] } }), + "hover-card": React.lazy(async () => { + const mod = await import("@/styles/aria-sera/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), input: React.lazy(async () => { const mod = await import("@/styles/aria-sera/ui/input") const exportName = diff --git a/apps/v4/registry/__components__/aria-vega.tsx b/apps/v4/registry/__components__/aria-vega.tsx index 60a27c9b959..e42e9495148 100644 --- a/apps/v4/registry/__components__/aria-vega.tsx +++ b/apps/v4/registry/__components__/aria-vega.tsx @@ -190,6 +190,14 @@ export const Components: Record = { ) || "field" return { default: mod.default || mod[exportName] } }), + "hover-card": React.lazy(async () => { + const mod = await import("@/styles/aria-vega/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), input: React.lazy(async () => { const mod = await import("@/styles/aria-vega/ui/input") const exportName = diff --git a/apps/v4/registry/__components__/index.tsx b/apps/v4/registry/__components__/index.tsx index b4e0ef3df28..c7f7b4fbeca 100644 --- a/apps/v4/registry/__components__/index.tsx +++ b/apps/v4/registry/__components__/index.tsx @@ -575,6 +575,7 @@ const shards: Record< "dropdown-menu", "empty", "field", + "hover-card", "input", "input-group", "input-otp", @@ -1107,6 +1108,7 @@ const shards: Record< "dropdown-menu", "empty", "field", + "hover-card", "input", "input-group", "input-otp", @@ -1170,6 +1172,7 @@ const shards: Record< "dropdown-menu", "empty", "field", + "hover-card", "input", "input-group", "input-otp", @@ -1233,6 +1236,7 @@ const shards: Record< "dropdown-menu", "empty", "field", + "hover-card", "input", "input-group", "input-otp", @@ -1296,6 +1300,7 @@ const shards: Record< "dropdown-menu", "empty", "field", + "hover-card", "input", "input-group", "input-otp", @@ -1359,6 +1364,7 @@ const shards: Record< "dropdown-menu", "empty", "field", + "hover-card", "input", "input-group", "input-otp", @@ -1422,6 +1428,7 @@ const shards: Record< "dropdown-menu", "empty", "field", + "hover-card", "input", "input-group", "input-otp", @@ -1485,6 +1492,7 @@ const shards: Record< "dropdown-menu", "empty", "field", + "hover-card", "input", "input-group", "input-otp", diff --git a/apps/v4/registry/__index__.tsx b/apps/v4/registry/__index__.tsx index 7f38046dd3f..181cb9a34bc 100644 --- a/apps/v4/registry/__index__.tsx +++ b/apps/v4/registry/__index__.tsx @@ -10202,6 +10202,29 @@ export const Index: Record> = { }, }, }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "styles/aria-nova/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/aria/hover-card", + examples: + "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + api: "https://react-aria.adobe.com/PreviewTrigger#api", + }, + }, + }, input: { name: "input", title: "undefined", @@ -21161,6 +21184,29 @@ export const Index: Record> = { }, }, }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "styles/aria-vega/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/aria/hover-card", + examples: + "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + api: "https://react-aria.adobe.com/PreviewTrigger#api", + }, + }, + }, input: { name: "input", title: "undefined", @@ -22481,6 +22527,29 @@ export const Index: Record> = { }, }, }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "styles/aria-maia/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/aria/hover-card", + examples: + "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + api: "https://react-aria.adobe.com/PreviewTrigger#api", + }, + }, + }, input: { name: "input", title: "undefined", @@ -23801,6 +23870,29 @@ export const Index: Record> = { }, }, }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "styles/aria-lyra/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/aria/hover-card", + examples: + "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + api: "https://react-aria.adobe.com/PreviewTrigger#api", + }, + }, + }, input: { name: "input", title: "undefined", @@ -25121,6 +25213,29 @@ export const Index: Record> = { }, }, }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "styles/aria-mira/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/aria/hover-card", + examples: + "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + api: "https://react-aria.adobe.com/PreviewTrigger#api", + }, + }, + }, input: { name: "input", title: "undefined", @@ -26441,6 +26556,29 @@ export const Index: Record> = { }, }, }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "styles/aria-luma/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/aria/hover-card", + examples: + "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + api: "https://react-aria.adobe.com/PreviewTrigger#api", + }, + }, + }, input: { name: "input", title: "undefined", @@ -27761,6 +27899,29 @@ export const Index: Record> = { }, }, }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "styles/aria-sera/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/aria/hover-card", + examples: + "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + api: "https://react-aria.adobe.com/PreviewTrigger#api", + }, + }, + }, input: { name: "input", title: "undefined", @@ -29081,6 +29242,29 @@ export const Index: Record> = { }, }, }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "styles/aria-rhea/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/aria/hover-card", + examples: + "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + api: "https://react-aria.adobe.com/PreviewTrigger#api", + }, + }, + }, input: { name: "input", title: "undefined", diff --git a/apps/v4/registry/bases/__components__/aria.tsx b/apps/v4/registry/bases/__components__/aria.tsx index 23ec96c4438..409d075ad90 100644 --- a/apps/v4/registry/bases/__components__/aria.tsx +++ b/apps/v4/registry/bases/__components__/aria.tsx @@ -190,6 +190,14 @@ export const Components: Record = { ) || "field" return { default: mod.default || mod[exportName] } }), + "hover-card": React.lazy(async () => { + const mod = await import("@/registry/bases/aria/ui/hover-card") + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card" + return { default: mod.default || mod[exportName] } + }), input: React.lazy(async () => { const mod = await import("@/registry/bases/aria/ui/input") const exportName = @@ -668,6 +676,16 @@ export const Components: Record = { ) || "field-example" return { default: mod.default || mod[exportName] } }), + "hover-card-example": React.lazy(async () => { + const mod = await import( + "@/registry/bases/aria/examples/hover-card-example" + ) + const exportName = + Object.keys(mod).find( + (key) => typeof mod[key] === "function" || typeof mod[key] === "object" + ) || "hover-card-example" + return { default: mod.default || mod[exportName] } + }), "input-example": React.lazy(async () => { const mod = await import("@/registry/bases/aria/examples/input-example") const exportName = diff --git a/apps/v4/registry/bases/__components__/index.tsx b/apps/v4/registry/bases/__components__/index.tsx index 8d29426d6bc..6e1b1a7cfdf 100644 --- a/apps/v4/registry/bases/__components__/index.tsx +++ b/apps/v4/registry/bases/__components__/index.tsx @@ -204,6 +204,7 @@ const shards: Record< "dropdown-menu", "empty", "field", + "hover-card", "input", "input-group", "input-otp", @@ -262,6 +263,7 @@ const shards: Record< "dropdown-menu-example", "empty-example", "field-example", + "hover-card-example", "input-example", "input-group-example", "input-otp-example", diff --git a/apps/v4/registry/bases/__index__.tsx b/apps/v4/registry/bases/__index__.tsx index 401bb9c0a58..ff0373b97e1 100644 --- a/apps/v4/registry/bases/__index__.tsx +++ b/apps/v4/registry/bases/__index__.tsx @@ -4257,6 +4257,29 @@ export const Index: Record> = { }, }, }, + "hover-card": { + name: "hover-card", + title: "undefined", + description: "", + type: "registry:ui", + registryDependencies: undefined, + files: [ + { + path: "registry/bases/aria/ui/hover-card.tsx", + type: "registry:ui", + target: "", + }, + ], + categories: undefined, + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/aria/hover-card", + examples: + "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + api: "https://react-aria.adobe.com/PreviewTrigger#api", + }, + }, + }, input: { name: "input", title: "undefined", @@ -5510,6 +5533,22 @@ export const Index: Record> = { categories: undefined, meta: undefined, }, + "hover-card-example": { + name: "hover-card-example", + title: "Hover Card", + description: "", + type: "registry:example", + registryDependencies: ["button", "dialog", "hover-card", "example"], + files: [ + { + path: "registry/bases/aria/examples/hover-card-example.tsx", + type: "registry:example", + target: "", + }, + ], + categories: undefined, + meta: undefined, + }, "input-example": { name: "input-example", title: "Input", diff --git a/apps/v4/registry/bases/aria/examples/_registry.ts b/apps/v4/registry/bases/aria/examples/_registry.ts index 00782dfbb9c..160dc2a39c4 100644 --- a/apps/v4/registry/bases/aria/examples/_registry.ts +++ b/apps/v4/registry/bases/aria/examples/_registry.ts @@ -358,6 +358,18 @@ export const examples: Registry["items"] = [ }, ], }, + { + name: "hover-card-example", + title: "Hover Card", + type: "registry:example", + registryDependencies: ["button", "dialog", "hover-card", "example"], + files: [ + { + path: "examples/hover-card-example.tsx", + type: "registry:example", + }, + ], + }, { name: "input-example", title: "Input", diff --git a/apps/v4/registry/bases/aria/examples/hover-card-example.tsx b/apps/v4/registry/bases/aria/examples/hover-card-example.tsx new file mode 100644 index 00000000000..2a8321a44f9 --- /dev/null +++ b/apps/v4/registry/bases/aria/examples/hover-card-example.tsx @@ -0,0 +1,93 @@ +"use client" + +import { + Example, + ExampleWrapper, +} from "@/registry/bases/aria/components/example" +import { Button } from "@/registry/bases/aria/ui/button" +import { + Dialog, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/registry/bases/aria/ui/dialog" +import { + HoverCard, + HoverCardTrigger, +} from "@/registry/bases/aria/ui/hover-card" + +export default function HoverCardExample() { + return ( + + + + + ) +} + +const HOVER_CARD_PLACEMENTS = [ + "start", + "left", + "top", + "bottom", + "right", + "end", +] as const + +function HoverCardSides() { + return ( + +
+ {HOVER_CARD_PLACEMENTS.map((placement) => ( + + + +
+

Hover Card

+

+ This hover card appears on the {placement} side of the + trigger. +

+
+
+
+ ))} +
+
+ ) +} + +function HoverCardInDialog() { + return ( + + + + + + Hover Card Example + + Hover over the button below to see the hover card. + + + + + +
+

Hover Card

+

+ This hover card appears inside a dialog. Hover over the button + to see it. +

+
+
+
+
+
+
+ ) +} diff --git a/apps/v4/registry/bases/aria/internal/sink.tsx b/apps/v4/registry/bases/aria/internal/sink.tsx index 51a2dcfd02f..9fb24beba86 100644 --- a/apps/v4/registry/bases/aria/internal/sink.tsx +++ b/apps/v4/registry/bases/aria/internal/sink.tsx @@ -21,6 +21,7 @@ import DrawerExample from "@/registry/bases/aria/examples/drawer-example" import DropdownMenuExample from "@/registry/bases/aria/examples/dropdown-menu-example" import EmptyExample from "@/registry/bases/aria/examples/empty-example" import FieldExample from "@/registry/bases/aria/examples/field-example" +import HoverCardExample from "@/registry/bases/aria/examples/hover-card-example" import InputExample from "@/registry/bases/aria/examples/input-example" import InputGroupExample from "@/registry/bases/aria/examples/input-group-example" import InputOtpExample from "@/registry/bases/aria/examples/input-otp-example" @@ -76,6 +77,7 @@ export default function Page() { + diff --git a/apps/v4/registry/bases/aria/ui/_registry.ts b/apps/v4/registry/bases/aria/ui/_registry.ts index d05be8edf1b..1003a942b0a 100644 --- a/apps/v4/registry/bases/aria/ui/_registry.ts +++ b/apps/v4/registry/bases/aria/ui/_registry.ts @@ -422,6 +422,24 @@ export const ui: Registry["items"] = [ name: "form", type: "registry:ui", }, + { + name: "hover-card", + type: "registry:ui", + files: [ + { + path: "ui/hover-card.tsx", + type: "registry:ui", + }, + ], + meta: { + links: { + docs: "https://ui.shadcn.com/docs/components/aria/hover-card", + examples: + "https://ui.shadcn.com/code/apps/v4/registry/bases/aria/examples/hover-card-example.tsx", + api: "https://react-aria.adobe.com/PreviewTrigger#api", + }, + }, + }, { name: "input", type: "registry:ui", diff --git a/apps/v4/registry/bases/aria/ui/context-menu.tsx b/apps/v4/registry/bases/aria/ui/context-menu.tsx index 765d51542e3..a08b9f05fdb 100644 --- a/apps/v4/registry/bases/aria/ui/context-menu.tsx +++ b/apps/v4/registry/bases/aria/ui/context-menu.tsx @@ -9,15 +9,12 @@ import { Menu as MenuPrimitive, MenuSection as MenuSectionPrimitive, MenuTrigger as MenuTriggerPrimitive, - PopoverContext, Popover as PopoverPrimitive, Separator as SeparatorPrimitive, SubmenuTrigger as SubmenuTriggerPrimitive, type MenuItemProps as MenuItemPrimitiveProps, type MenuSectionProps as MenuSectionPrimitiveProps, - type MenuTriggerProps, } from "react-aria-components" -import { createPortal } from "react-dom" import { cn } from "@/registry/bases/aria/lib/utils" import { IconPlaceholder } from "@/app/(create)/components/icon-placeholder" @@ -64,79 +61,14 @@ function ContextMenu({ } function ContextMenuTrigger({ - children, - className, - onOpenChange, ...props -}: Omit & { - className?: string -}) { - const [position, setPosition] = React.useState<{ - x: number - y: number - } | null>(null) - const positionRef = React.useRef(null) - +}: Omit, "trigger">) { return ( { - if (!isOpen) { - setPosition(null) - onOpenChange?.(false) - } - }} - > - {position && - createPortal( - // Position the popover at the pointer. -
, - document.body - )} -
{ - e.preventDefault() - const wasOpen = position !== null - setPosition({ - y: e.clientY, - x: e.clientX, - }) - if (!wasOpen) { - onOpenChange?.(true) - } - }} - > - - {(ctx) => ( - - {children} - - )} - -
- + /> ) } diff --git a/apps/v4/registry/bases/aria/ui/hover-card.tsx b/apps/v4/registry/bases/aria/ui/hover-card.tsx new file mode 100644 index 00000000000..85bc3fa0ea8 --- /dev/null +++ b/apps/v4/registry/bases/aria/ui/hover-card.tsx @@ -0,0 +1,44 @@ +"use client" + +import { + Popover as PopoverPrimitive, + PreviewTrigger as PreviewTriggerPrimitive, + type PopoverProps as PopoverPrimitiveProps, + type PreviewTriggerProps, +} from "react-aria-components" + +import { cn } from "@/registry/bases/aria/lib/utils" + +function HoverCardTrigger({ children, ...props }: PreviewTriggerProps) { + return ( + + {children} + + ) +} + +function HoverCard({ + className, + placement = "bottom", + offset = 4, + crossOffset = 0, + ...props +}: Omit & { + className?: string +}) { + return ( + + ) +} + +export { HoverCard, HoverCardTrigger } diff --git a/apps/v4/registry/styles/style-luma.css b/apps/v4/registry/styles/style-luma.css index a1e9b9a4ba5..01843e6e3a3 100644 --- a/apps/v4/registry/styles/style-luma.css +++ b/apps/v4/registry/styles/style-luma.css @@ -1722,6 +1722,10 @@ @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/5 dark:ring-foreground/10 flex flex-col gap-4 rounded-3xl p-4 text-sm shadow-lg ring-1 duration-100; } + .cn-hover-card-content-aria { + @apply data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/5 dark:ring-foreground/10 bg-popover text-popover-foreground w-72 rounded-3xl p-4 text-sm shadow-lg ring-1 duration-100; + } + .cn-select-content-aria { @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/5 dark:ring-foreground/10 min-w-36 rounded-3xl shadow-lg ring-1 duration-100; } diff --git a/apps/v4/registry/styles/style-lyra.css b/apps/v4/registry/styles/style-lyra.css index e7d59b3a935..c28a57682e6 100644 --- a/apps/v4/registry/styles/style-lyra.css +++ b/apps/v4/registry/styles/style-lyra.css @@ -1701,6 +1701,10 @@ @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 flex flex-col gap-2.5 rounded-none p-2.5 text-xs shadow-md ring-1 duration-100; } + .cn-hover-card-content-aria { + @apply data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground w-64 rounded-none p-2.5 text-xs/relaxed shadow-md ring-1 duration-100; + } + .cn-select-content-aria { @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-36 rounded-none shadow-md ring-1 duration-100; } diff --git a/apps/v4/registry/styles/style-maia.css b/apps/v4/registry/styles/style-maia.css index 32d50ac6933..e497cee8eab 100644 --- a/apps/v4/registry/styles/style-maia.css +++ b/apps/v4/registry/styles/style-maia.css @@ -1723,6 +1723,10 @@ @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/5 flex flex-col gap-4 rounded-2xl p-4 text-sm shadow-2xl ring-1 duration-100; } + .cn-hover-card-content-aria { + @apply data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/5 bg-popover text-popover-foreground w-72 rounded-2xl p-4 text-sm shadow-2xl ring-1 duration-100; + } + .cn-select-content-aria { @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/5 min-w-36 rounded-2xl shadow-2xl ring-1 duration-100; } diff --git a/apps/v4/registry/styles/style-mira.css b/apps/v4/registry/styles/style-mira.css index f680bac7fdd..9715b05a7e6 100644 --- a/apps/v4/registry/styles/style-mira.css +++ b/apps/v4/registry/styles/style-mira.css @@ -1728,6 +1728,10 @@ @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 flex flex-col gap-4 rounded-lg p-2.5 text-xs shadow-md ring-1 duration-100; } + .cn-hover-card-content-aria { + @apply data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground w-72 rounded-lg p-2.5 text-xs/relaxed shadow-md ring-1 duration-100; + } + .cn-select-content-aria { @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-32 rounded-lg shadow-md ring-1 duration-100; } diff --git a/apps/v4/registry/styles/style-nova.css b/apps/v4/registry/styles/style-nova.css index beb03a2bad6..042b6e77e4e 100644 --- a/apps/v4/registry/styles/style-nova.css +++ b/apps/v4/registry/styles/style-nova.css @@ -1726,6 +1726,10 @@ @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 flex flex-col gap-2.5 rounded-lg p-2.5 text-sm shadow-md ring-1 duration-100; } + .cn-hover-card-content-aria { + @apply data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground w-64 rounded-lg p-2.5 text-sm shadow-md ring-1 duration-100; + } + .cn-select-content-aria { @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-36 rounded-lg shadow-md ring-1 duration-100; } diff --git a/apps/v4/registry/styles/style-rhea.css b/apps/v4/registry/styles/style-rhea.css index b0b0f331310..fe7d6986195 100644 --- a/apps/v4/registry/styles/style-rhea.css +++ b/apps/v4/registry/styles/style-rhea.css @@ -1722,6 +1722,10 @@ @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/5 dark:ring-foreground/10 flex flex-col gap-4 rounded-3xl p-4 text-sm shadow-lg ring-1 duration-100; } + .cn-hover-card-content-aria { + @apply data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/5 dark:ring-foreground/10 bg-popover text-popover-foreground w-72 rounded-3xl p-4 text-sm shadow-lg ring-1 duration-100; + } + .cn-select-content-aria { @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/5 dark:ring-foreground/10 min-w-36 rounded-2xl shadow-lg ring-1 duration-100; } diff --git a/apps/v4/registry/styles/style-sera.css b/apps/v4/registry/styles/style-sera.css index 3f0a1508da9..a390cc8d394 100644 --- a/apps/v4/registry/styles/style-sera.css +++ b/apps/v4/registry/styles/style-sera.css @@ -1713,6 +1713,10 @@ @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 flex flex-col gap-4 rounded-none p-4 text-sm shadow-md ring-1 duration-100; } + .cn-hover-card-content-aria { + @apply data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground w-72 p-4 text-sm shadow-md ring-1 duration-100; + } + .cn-select-content-aria { @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-36 rounded-none shadow-md ring-1 duration-100; } diff --git a/apps/v4/registry/styles/style-vega.css b/apps/v4/registry/styles/style-vega.css index 5621c5d5d76..5ab0121ef72 100644 --- a/apps/v4/registry/styles/style-vega.css +++ b/apps/v4/registry/styles/style-vega.css @@ -1726,6 +1726,10 @@ @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 flex flex-col gap-4 rounded-md p-4 text-sm shadow-md ring-1 duration-100; } + .cn-hover-card-content-aria { + @apply data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground w-64 rounded-lg p-4 text-sm shadow-md ring-1 duration-100; + } + .cn-select-content-aria { @apply bg-popover text-popover-foreground data-entering:animate-in data-exiting:animate-out data-exiting:fade-out-0 data-entering:fade-in-0 data-exiting:zoom-out-95 data-entering:zoom-in-95 data-[placement=bottom]:slide-in-from-top-2 data-[placement=left]:slide-in-from-right-2 data-[placement=right]:slide-in-from-left-2 data-[placement=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-36 rounded-md shadow-md ring-1 duration-100; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43a12846e31..2822eaf146d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -166,8 +166,8 @@ importers: specifier: ^1.1.1 version: 1.1.1(react@19.2.3) '@internationalized/date': - specifier: ^3.12.2 - version: 3.12.2 + specifier: ^3.12.3 + version: 3.12.3 '@paper-design/shaders-react': specifier: ^0.0.72 version: 0.0.72(@types/react@19.2.2)(react@19.2.3) @@ -295,8 +295,8 @@ importers: specifier: 19.2.3 version: 19.2.3 react-aria-components: - specifier: 1.19.0 - version: 1.19.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: 1.20.0 + version: 1.20.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react-day-picker: specifier: ^9.7.0 version: 9.8.1(react@19.2.3) @@ -1989,14 +1989,14 @@ packages: '@types/node': optional: true - '@internationalized/date@3.12.2': - resolution: {integrity: sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==} + '@internationalized/date@3.12.3': + resolution: {integrity: sha512-fuLX+3ZKLsxI73y8b01EG/WjHb6gE6weCqlfawPO27kBWGMh9G1yH6Csv1uU7/cac9H2GHmOMt6CjmuQ1aia4Q==} '@internationalized/number@3.6.7': resolution: {integrity: sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==} - '@internationalized/string@3.2.9': - resolution: {integrity: sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg==} + '@internationalized/string@3.2.10': + resolution: {integrity: sha512-PDx6//vHSpRnHfxqMqto11zQvhsaU74O3mKv2F/0eicGZcl9NLjQmGlbHz/LsJh5tLKp4A4L7ZVTzN1/MmMTvA==} '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} @@ -3453,8 +3453,8 @@ packages: '@radix-ui/rect@1.1.2': resolution: {integrity: sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==} - '@react-types/shared@3.36.0': - resolution: {integrity: sha512-DkP/H0C2YjjS7gZWKNqOmU8a16qHPjQNdzMwmTq9SzplM6Iw0kVMTZ0OIoe6FOgGqa+FwMsE2QbPjh/n3g/jXQ==} + '@react-types/shared@3.36.1': + resolution: {integrity: sha512-AzsuD9OfxTOZMMvTRhlN3oHBwOmFN7tDh27LzqmHt4+uOgPhJT7ZM7/kVs/8/o0WxayMUIk3hBmCFRHv1FUoag==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -8292,14 +8292,14 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-aria-components@1.19.0: - resolution: {integrity: sha512-2smSS5nqJ8cGYMQezuUXveZm7eMyHCqTN6mDpylQBYLYbdF5dxCCuW1DHn1VKLe1DybSfPvX/cZtJlDmvFfn8A==} + react-aria-components@1.20.0: + resolution: {integrity: sha512-BMbpIgoV9aELeBrB0Y120NgoigHb5OdcJwc+4e7uSnbTbamea6lo+gqcc4LAxzMaK3Jf+7LI1oCDE6yANsmxIQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-aria@3.50.0: - resolution: {integrity: sha512-S0Os6QZk33fzUAKu1QLT9afoUaCBt1ZNdoiq0n2YMVgKIdNIQS8zxiZ8O9hYE6QyDkHKjD6q39LQZ+qaSAIgjw==} + react-aria@3.51.0: + resolution: {integrity: sha512-AyWLw0XR38cFPwBu/ErgGaVrc5dupLEKmRlMXTGvFKOtbaGRQ2+yQJkjVhpdHhoRhU4+G+tJDFeHDTS8tK3bfQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -8383,8 +8383,8 @@ packages: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - react-stately@3.48.0: - resolution: {integrity: sha512-ImicSAG+lTotAe5izcs1fz49Zk48w7pDusqYg04WaPhCoej8BJ24soMu3iLXIrsi273s4P1gZrYGrqReMfgEEA==} + react-stately@3.49.0: + resolution: {integrity: sha512-13iNq2KzBrRAzxRc+n53hgROfIistiYY/sPtIhCw1qUB7/kmo+X1xEU2uiS5zcCIrc55AUPwoHqOIIpKWSwB9A==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -11011,7 +11011,7 @@ snapshots: optionalDependencies: '@types/node': 20.19.10 - '@internationalized/date@3.12.2': + '@internationalized/date@3.12.3': dependencies: '@swc/helpers': 0.5.15 @@ -11019,7 +11019,7 @@ snapshots: dependencies: '@swc/helpers': 0.5.15 - '@internationalized/string@3.2.9': + '@internationalized/string@3.2.10': dependencies: '@swc/helpers': 0.5.15 @@ -12523,7 +12523,7 @@ snapshots: '@radix-ui/rect@1.1.2': {} - '@react-types/shared@3.36.0(react@19.2.3)': + '@react-types/shared@3.36.1(react@19.2.3)': dependencies: react: 19.2.3 @@ -18023,29 +18023,30 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-aria-components@1.19.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + react-aria-components@1.20.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@internationalized/date': 3.12.2 - '@react-types/shared': 3.36.0(react@19.2.3) + '@internationalized/date': 3.12.3 + '@internationalized/string': 3.2.10 + '@react-types/shared': 3.36.1(react@19.2.3) '@swc/helpers': 0.5.15 client-only: 0.0.1 react: 19.2.3 - react-aria: 3.50.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react-aria: 3.51.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react-dom: 19.2.3(react@19.2.3) - react-stately: 3.48.0(react@19.2.3) + react-stately: 3.49.0(react@19.2.3) - react-aria@3.50.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + react-aria@3.51.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@internationalized/date': 3.12.2 + '@internationalized/date': 3.12.3 '@internationalized/number': 3.6.7 - '@internationalized/string': 3.2.9 - '@react-types/shared': 3.36.0(react@19.2.3) + '@internationalized/string': 3.2.10 + '@react-types/shared': 3.36.1(react@19.2.3) '@swc/helpers': 0.5.15 aria-hidden: 1.2.6 clsx: 2.1.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - react-stately: 3.48.0(react@19.2.3) + react-stately: 3.49.0(react@19.2.3) use-sync-external-store: 1.6.0(react@19.2.3) react-day-picker@9.8.1(react@19.2.3): @@ -18120,12 +18121,12 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - react-stately@3.48.0(react@19.2.3): + react-stately@3.49.0(react@19.2.3): dependencies: - '@internationalized/date': 3.12.2 + '@internationalized/date': 3.12.3 '@internationalized/number': 3.6.7 - '@internationalized/string': 3.2.9 - '@react-types/shared': 3.36.0(react@19.2.3) + '@internationalized/string': 3.2.10 + '@react-types/shared': 3.36.1(react@19.2.3) '@swc/helpers': 0.5.15 react: 19.2.3 use-sync-external-store: 1.6.0(react@19.2.3)