Navigation
Installation
Run the following command
npx vibes@latest add navigation
Usage
import { Navigation } from '@/vibes/soul/primitives/navigation';const navigationLinks = [ { label: 'Shop All', href: '#', }]function Usage() { return ( <Navigation accountHref="#" cartHref="#" links={navigationLinks} logo="SOUL" searchHref="#" /> );}
API Reference
NavigationProps
Prop | Type | Default |
---|---|---|
className | string | |
isFloating | boolean | false |
accountHref* | string | |
cartCount | Streamable <number | null> | |
cartHref* | string | |
links* | ||
linksPosition | 'center' | 'left' | 'right' | 'center' |
locales | Locale[] | |
activeLocaleId | string | |
localeAction | LocaleAction | |
currencies | Currency[] | |
activeCurrencyId | Streamable<string | undefined> | |
currencyAction | CurrencyAction | |
logo* | Streamable <string | { src: string; alt: string } | null> | |
logoWidth | number | 200 |
logoHeight | number | 40 |
logoHref | string | '/' |
logoLabel | string | 'Home' |
mobileLogo | Streamable <string | { src: string; alt: string } | null> | |
mobileLogoWidth | number | 100 |
mobileLogoHeight | number | `40 |
searchHref* | string | |
searchParamName | string | 'query' |
searchAction | SearchAction<S> | |
searchCtaLabel | string | |
searchInputPlaceholder | string | |
cartLabel | string | 'Cart' |
accountLabel | string | 'Profile' |
openSearchPopupLabel | string | 'Open search popup' |
searchLabel | string | 'Search' |
mobileMenuTriggerLabel | string | 'Toggle navigation' |
Actions
You can find the type defintions for the actions below.
type Action<State, Payload> = ( state: Awaited<State>, payload: Awaited<Payload>,) => State | Promise<State>;type LocaleAction = Action<SubmissionResult | null, FormData>;type CurrencyAction = Action<SubmissionResult | null, FormData>;type SearchAction<S extends SearchResult> = Action< { searchResults: S[] | null; lastResult: SubmissionResult | null; emptyStateTitle?: string; emptyStateSubtitle?: string; }, FormData>;
This component uses Confom to handle form submissions. Refer to the Conform docs for more details.
Locale
Prop | Type | Default |
---|---|---|
id* | string | |
label* | string |
Currency
Prop | Type | Default |
---|---|---|
id* | string | |
label* | string |
CSS Variables
This component supports various CSS variables for theming. Here's a comprehensive list.
:root { --nav-focus: var(--primary); --nav-background: var(--background); --nav-floating-border: color-mix(in oklab, var(--foreground) 10%, transparent); --nav-link-text: var(--foreground); --nav-link-text-hover: var(--foreground); --nav-link-background: transparent; --nav-link-background-hover: var(--contrast-100); --nav-link-font-family: var(--font-family-body); --nav-group-text: var(--foreground); --nav-group-text-hover: var(--foreground); --nav-group-background: transparent; --nav-group-background-hover: var(--contrast-100); --nav-group-font-family: var(--font-family-body); --nav-sub-link-text: var(--contrast-500); --nav-sub-link-text-hover: var(--foreground); --nav-sub-link-background: transparent; --nav-sub-link-background-hover: var(--contrast-100); --nav-sub-link-font-family: var(--font-family-body); --nav-button-icon: var(--foreground); --nav-button-icon-hover: var(--foreground); --nav-button-background: var(--background); --nav-button-background-hover: var(--contrast-100); --nav-menu-background: var(--background); --nav-menu-border: color-mix(in oklab, var(--foreground) 5%, transparent); --nav-mobile-background: var(--background); --nav-mobile-divider: var(--contrast-100); --nav-mobile-button-icon: var(--foreground); --nav-mobile-link-text: var(--foreground); --nav-mobile-link-text-hover: var(--foreground); --nav-mobile-link-background: transparent; --nav-mobile-link-background-hover: var(--contrast-100); --nav-mobile-link-font-family: var(--font-family-body); --nav-mobile-sub-link-text: var(--contrast-500); --nav-mobile-sub-link-text-hover: var(--foreground); --nav-mobile-sub-link-background: transparent; --nav-mobile-sub-link-background-hover: var(--contrast-100); --nav-mobile-sub-link-font-family: var(--font-family-body); --nav-search-background: var(--background); --nav-search-border: color-mix(in oklab, var(--foreground) 5%, transparent); --nav-search-divider: color-mix(in oklab, var(--foreground) 5%, transparent); --nav-search-icon: var(--contrast-500); --nav-search-empty-title: var(--foreground); --nav-search-empty-subtitle: var(--contrast-500); --nav-search-result-title: var(--foreground); --nav-search-result-title-font-family: var(--font-family-mono); --nav-search-result-link-text: var(--foreground); --nav-search-result-link-text-hover: var(--foreground); --nav-search-result-link-background: var(--background); --nav-search-result-link-background-hover: var(--contrast-100); --nav-search-result-link-font-family: var(--font-family-body); --nav-cart-count-text: var(--background); --nav-cart-count-background: var(--foreground); --nav-locale-background: var(--background); --nav-locale-link-text: var(--contrast-400); --nav-locale-link-text-hover: var(--foreground); --nav-locale-link-text-selected: var(--foreground); --nav-locale-link-background: transparent; --nav-locale-link-background-hover: var(--contrast-100); --nav-locale-link-font-family: var(--font-family-body);}