Navigation navigationdockfloatingshortcutsmacos
Quick Jump Dock
Floating macOS inspired dock navigation featuring hover scale expansion, tooltips, and fast route shortcuts.
Preview
Usage
Copy the full block below to use this component with its imports.
astro
---
import { QuickJumpDock } from 'astro-component-kit';
---
<QuickJumpDock items={[{ label: 'Home', href: '/', icon: 'home' }, { label: 'Docs', href: '/docs', icon: 'file' }, { label: 'Settings', href: '/settings', icon: 'settings' }]} /> ---
import { QuickJumpDock } from 'astro-component-kit';
---
<QuickJumpDock items={[{ label: 'Home', href: '/', icon: 'home' }, { label: 'Docs', href: '/docs', icon: 'file' }, { label: 'Settings', href: '/settings', icon: 'settings' }]} /> Manual Installation
If you are not using the npm package, create a new file src/components/lib/QuickJumpDock.astro and paste the following code:
astro
---
/**
* QuickJumpDock — Floating desktop navigation dock bar with hover magnification and tooltips.
*
* @param {Array<{label: string, icon: string, href: string}>} items - List of dock actions.
*/
interface Props {
items?: Array<{ label: string; icon: string; href: string }>;
}
const {
items = [
{
label: 'Home',
href: '/',
icon: `<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>`,
},
{
label: 'Components',
href: '/docs/glass-button',
icon: `<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M3 9h18"/><path d="M9 21V9"/></svg>`,
},
{
label: 'Sections',
href: '/sections',
icon: `<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="7" height="9" x="3" y="3" rx="1"/><rect width="7" height="5" x="14" y="3" rx="1"/><rect width="7" height="9" x="14" y="12" rx="1"/><rect width="7" height="5" x="3" y="16" rx="1"/></svg>`,
},
{
label: 'Search',
href: '#search',
icon: `<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>`,
},
{
label: 'GitHub',
href: 'https://github.com/konstantinWDK/astro-components',
icon: `<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"/></svg>`,
},
],
} = Astro.props;
---
<nav class="quick-dock" aria-label="Quick dock navigation" data-dock>
{items.map((item) => (
<a href={item.href} class="quick-dock__item" aria-label={item.label}>
<span class="quick-dock__tooltip" aria-hidden="true">{item.label}</span>
<span class="quick-dock__icon" set:html={item.icon} />
</a>
))}
</nav>
<style>
.quick-dock {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
background: rgba(14, 14, 18, 0.85);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: var(--r-full, 9999px);
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.quick-dock__item {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 42px;
height: 42px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
color: var(--c-text-2, #a3a3a3);
text-decoration: none;
transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), background 0.2s ease, color 0.2s ease;
}
.quick-dock__item:hover {
transform: translateY(-8px) scale(1.15);
background: rgba(184, 134, 11, 0.2);
border-color: rgba(184, 134, 11, 0.4);
color: var(--c-primary-light, #d4a017);
}
.quick-dock__icon {
display: flex;
align-items: center;
justify-content: center;
}
.quick-dock__tooltip {
position: absolute;
bottom: calc(100% + 12px);
padding: 4px 10px;
background: #000000;
color: #ffffff;
font-family: var(--font-sans, system-ui, sans-serif);
font-size: 0.72rem;
font-weight: 700;
border-radius: 6px;
border: 1px solid rgba(255, 255, 255, 0.15);
white-space: nowrap;
opacity: 0;
pointer-events: none;
transform: translateY(6px);
transition: opacity 0.2s ease, transform 0.2s ease;
}
.quick-dock__tooltip::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border-width: 4px;
border-style: solid;
border-color: #000 transparent transparent transparent;
}
.quick-dock__item:hover .quick-dock__tooltip {
opacity: 1;
transform: translateY(0);
}
</style> ---
/**
* QuickJumpDock — Floating desktop navigation dock bar with hover magnification and tooltips.
*
* @param {Array<{label: string, icon: string, href: string}>} items - List of dock actions.
*/
interface Props {
items?: Array<{ label: string; icon: string; href: string }>;
}
const {
items = [
{
label: 'Home',
href: '/',
icon: `<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>`,
},
{
label: 'Components',
href: '/docs/glass-button',
icon: `<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M3 9h18"/><path d="M9 21V9"/></svg>`,
},
{
label: 'Sections',
href: '/sections',
icon: `<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="7" height="9" x="3" y="3" rx="1"/><rect width="7" height="5" x="14" y="3" rx="1"/><rect width="7" height="9" x="14" y="12" rx="1"/><rect width="7" height="5" x="3" y="16" rx="1"/></svg>`,
},
{
label: 'Search',
href: '#search',
icon: `<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>`,
},
{
label: 'GitHub',
href: 'https://github.com/konstantinWDK/astro-components',
icon: `<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"/></svg>`,
},
],
} = Astro.props;
---
<nav class="quick-dock" aria-label="Quick dock navigation" data-dock>
{items.map((item) => (
<a href={item.href} class="quick-dock__item" aria-label={item.label}>
<span class="quick-dock__tooltip" aria-hidden="true">{item.label}</span>
<span class="quick-dock__icon" set:html={item.icon} />
</a>
))}
</nav>
<style>
.quick-dock {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
background: rgba(14, 14, 18, 0.85);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: var(--r-full, 9999px);
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.quick-dock__item {
position: relative;
display: flex;
align-items: center;
justify-content: center;
width: 42px;
height: 42px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
color: var(--c-text-2, #a3a3a3);
text-decoration: none;
transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), background 0.2s ease, color 0.2s ease;
}
.quick-dock__item:hover {
transform: translateY(-8px) scale(1.15);
background: rgba(184, 134, 11, 0.2);
border-color: rgba(184, 134, 11, 0.4);
color: var(--c-primary-light, #d4a017);
}
.quick-dock__icon {
display: flex;
align-items: center;
justify-content: center;
}
.quick-dock__tooltip {
position: absolute;
bottom: calc(100% + 12px);
padding: 4px 10px;
background: #000000;
color: #ffffff;
font-family: var(--font-sans, system-ui, sans-serif);
font-size: 0.72rem;
font-weight: 700;
border-radius: 6px;
border: 1px solid rgba(255, 255, 255, 0.15);
white-space: nowrap;
opacity: 0;
pointer-events: none;
transform: translateY(6px);
transition: opacity 0.2s ease, transform 0.2s ease;
}
.quick-dock__tooltip::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border-width: 4px;
border-style: solid;
border-color: #000 transparent transparent transparent;
}
.quick-dock__item:hover .quick-dock__tooltip {
opacity: 1;
transform: translateY(0);
}
</style>
Quick Info
- Category
- Navigation
- Filename
QuickJumpDock.astro- Dependencies
- None — pure Astro + CSS
- Tags
- navigationdockfloatingshortcutsmacos