From 073cb817d342b0b54cf5ad156435a00c9bb91168 Mon Sep 17 00:00:00 2001 From: naoNao89 <90588855+naoNao89@users.noreply.github.com> Date: Tue, 29 Jul 2025 21:35:33 +0700 Subject: [UI] Fix dialog accessibility and export functionality - Add DialogTitle with VisuallyHidden to CommandDialog and onboarding - Replace YouTube redirect with functional VideoExporter implementation - Create VisuallyHidden component for screen reader accessibility Resolves GitHub issue #477 (export redirecting to YouTube) Fixes console warnings about DialogContent accessibility compliance --- apps/web/src/components/ui/command.tsx | 9 ++++++-- apps/web/src/components/ui/visually-hidden.tsx | 32 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 apps/web/src/components/ui/visually-hidden.tsx (limited to 'apps/web/src/components/ui') diff --git a/apps/web/src/components/ui/command.tsx b/apps/web/src/components/ui/command.tsx index 11b27041..b91cbd3d 100644 --- a/apps/web/src/components/ui/command.tsx +++ b/apps/web/src/components/ui/command.tsx @@ -1,12 +1,14 @@ "use client"; import * as React from "react"; -import { DialogProps } from "@radix-ui/react-dialog"; import { Command as CommandPrimitive } from "cmdk"; import { Search } from "lucide-react"; import { cn } from "../../lib/utils"; -import { Dialog, DialogContent } from "./dialog"; +import { Dialog, DialogContent, DialogTitle } from "./dialog"; +import { VisuallyHidden } from "./visually-hidden"; + +type DialogProps = React.ComponentProps; const Command = React.forwardRef< React.ElementRef, @@ -27,6 +29,9 @@ const CommandDialog = ({ children, ...props }: DialogProps) => { return ( + + Command Menu + {children} diff --git a/apps/web/src/components/ui/visually-hidden.tsx b/apps/web/src/components/ui/visually-hidden.tsx new file mode 100644 index 00000000..7d6fc435 --- /dev/null +++ b/apps/web/src/components/ui/visually-hidden.tsx @@ -0,0 +1,32 @@ +"use client"; + +import * as React from "react"; +import { cn } from "../../lib/utils"; + +/** + * VisuallyHidden component provides content that is accessible to screen readers + * but visually hidden from sighted users. This is useful for providing context + * or labels that are necessary for accessibility but would be redundant visually. + * + * Based on the Radix UI VisuallyHidden primitive pattern. + */ +const VisuallyHidden = React.forwardRef< + HTMLSpanElement, + React.ComponentPropsWithoutRef<"span"> +>(({ className, ...props }, ref) => ( +