diff --git a/src/content/Components/Dock/Dock.jsx b/src/content/Components/Dock/Dock.jsx index 926aeaa9e..fb7f46e74 100644 --- a/src/content/Components/Dock/Dock.jsx +++ b/src/content/Components/Dock/Dock.jsx @@ -5,7 +5,7 @@ import { Children, cloneElement, useEffect, useMemo, useRef, useState } from 're import './Dock.css'; -function DockItem({ children, className = '', onClick, mouseX, spring, distance, magnification, baseItemSize }) { +function DockItem({ children, className = '', onClick, mouseX, spring, distance, magnification, baseItemSize, label }) { const ref = useRef(null); const isHovered = useMotionValue(0); @@ -20,6 +20,13 @@ function DockItem({ children, className = '', onClick, mouseX, spring, distance, const targetSize = useTransform(mouseDistance, [-distance, 0, distance], [baseItemSize, magnification, baseItemSize]); const size = useSpring(targetSize, spring); + const handleKeyDown = e => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + onClick?.(); + } + }; + return ( {Children.map(children, child => cloneElement(child, { isHovered }))} @@ -122,6 +131,7 @@ export default function Dock({ distance={distance} magnification={magnification} baseItemSize={baseItemSize} + label={item.label} > {item.icon} {item.label} diff --git a/src/tailwind/Components/Dock/Dock.jsx b/src/tailwind/Components/Dock/Dock.jsx index 09bcfe2cf..95397a281 100644 --- a/src/tailwind/Components/Dock/Dock.jsx +++ b/src/tailwind/Components/Dock/Dock.jsx @@ -3,7 +3,7 @@ import { motion, useMotionValue, useSpring, useTransform, AnimatePresence } from 'motion/react'; import { Children, cloneElement, useEffect, useMemo, useRef, useState } from 'react'; -function DockItem({ children, className = '', onClick, mouseX, spring, distance, magnification, baseItemSize }) { +function DockItem({ children, className = '', onClick, mouseX, spring, distance, magnification, baseItemSize, label }) { const ref = useRef(null); const isHovered = useMotionValue(0); @@ -18,6 +18,13 @@ function DockItem({ children, className = '', onClick, mouseX, spring, distance, const targetSize = useTransform(mouseDistance, [-distance, 0, distance], [baseItemSize, magnification, baseItemSize]); const size = useSpring(targetSize, spring); + const handleKeyDown = e => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + onClick?.(); + } + }; + return ( isHovered.set(1)} onBlur={() => isHovered.set(0)} onClick={onClick} + onKeyDown={handleKeyDown} className={`relative inline-flex items-center justify-center rounded-full bg-[#120F17] border-neutral-700 border-2 shadow-md ${className}`} tabIndex={0} role="button" aria-haspopup="true" + aria-label={label} > {Children.map(children, child => cloneElement(child, { isHovered }))} @@ -120,6 +129,7 @@ export default function Dock({ distance={distance} magnification={magnification} baseItemSize={baseItemSize} + label={item.label} > {item.icon} {item.label} diff --git a/src/ts-default/Components/Dock/Dock.tsx b/src/ts-default/Components/Dock/Dock.tsx index 7f04f5bd8..6d460aec6 100644 --- a/src/ts-default/Components/Dock/Dock.tsx +++ b/src/ts-default/Components/Dock/Dock.tsx @@ -40,6 +40,7 @@ type DockItemProps = { distance: number; baseItemSize: number; magnification: number; + label?: React.ReactNode; }; function DockItem({ @@ -50,7 +51,8 @@ function DockItem({ spring, distance, magnification, - baseItemSize + baseItemSize, + label }: DockItemProps) { const ref = useRef(null); const isHovered = useMotionValue(0); @@ -66,6 +68,13 @@ function DockItem({ const targetSize = useTransform(mouseDistance, [-distance, 0, distance], [baseItemSize, magnification, baseItemSize]); const size = useSpring(targetSize, spring); + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + onClick?.(); + } + }; + return ( isHovered.set(1)} onBlur={() => isHovered.set(0)} onClick={onClick} + onKeyDown={handleKeyDown} className={`dock-item ${className}`} tabIndex={0} role="button" aria-haspopup="true" + aria-label={typeof label === 'string' ? label : undefined} > {Children.map(children, child => React.isValidElement(child) @@ -184,6 +195,7 @@ export default function Dock({ distance={distance} magnification={magnification} baseItemSize={baseItemSize} + label={item.label} > {item.icon} {item.label} diff --git a/src/ts-tailwind/Components/Dock/Dock.tsx b/src/ts-tailwind/Components/Dock/Dock.tsx index b2b7e4ab3..4f477d0ac 100644 --- a/src/ts-tailwind/Components/Dock/Dock.tsx +++ b/src/ts-tailwind/Components/Dock/Dock.tsx @@ -38,6 +38,7 @@ type DockItemProps = { distance: number; baseItemSize: number; magnification: number; + label?: React.ReactNode; }; function DockItem({ @@ -48,7 +49,8 @@ function DockItem({ spring, distance, magnification, - baseItemSize + baseItemSize, + label }: DockItemProps) { const ref = useRef(null); const isHovered = useMotionValue(0); @@ -64,6 +66,13 @@ function DockItem({ const targetSize = useTransform(mouseDistance, [-distance, 0, distance], [baseItemSize, magnification, baseItemSize]); const size = useSpring(targetSize, spring); + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + onClick?.(); + } + }; + return ( isHovered.set(1)} onBlur={() => isHovered.set(0)} onClick={onClick} + onKeyDown={handleKeyDown} className={`relative inline-flex items-center justify-center rounded-full bg-[#120F17] border-neutral-700 border-2 shadow-md ${className}`} tabIndex={0} role="button" aria-haspopup="true" + aria-label={typeof label === 'string' ? label : undefined} > {Children.map(children, child => React.isValidElement(child) @@ -179,6 +190,7 @@ export default function Dock({ distance={distance} magnification={magnification} baseItemSize={baseItemSize} + label={item.label} > {item.icon} {item.label}