Files
HMDesign/packages/ui/src/theme/navigation-menu.css
T

131 lines
5.8 KiB
CSS

/* Navigation Menu mapping. ui-viz has no Navigation Menu spec, so these are current HM values built from the HM Semantic tokens.
It is for navigation destinations: top-level triggers and links share one text-button look, the current location (Radix
`data-active`) is bold and tinted, and the content / viewport is a floating panel that can hold links with descriptions.
Radix attributes drive the states (data-state, data-active, data-motion). No --hm-dropdown-menu-* token is referenced. */
:root, [data-hm-theme] {
--hm-navigation-menu-height: 34px;
--hm-navigation-menu-padding-x: 12px;
--hm-navigation-menu-gap: 4px;
--hm-navigation-menu-radius: var(--hm-radius-control-md);
--hm-navigation-menu-font-size: 14px;
--hm-navigation-menu-line-height: 20px;
--hm-navigation-menu-font-weight: 500;
--hm-navigation-menu-text: var(--hm-sem-fg-primary);
--hm-navigation-menu-icon-size: 12px;
--hm-navigation-menu-hover-background: var(--accent);
--hm-navigation-menu-hover-text: var(--accent-foreground);
/* Current location: same family as the Tabs / Select highlight (green tint), softer than hover. */
--hm-navigation-menu-active-background: var(--hm-sem-surface-highlight);
--hm-navigation-menu-active-text: var(--hm-sem-action-primary);
--hm-navigation-menu-active-font-weight: 700;
/* Content / viewport surface */
--hm-navigation-menu-background: var(--hm-sem-floating-background);
--hm-navigation-menu-border-width: var(--hm-sem-floating-border-width);
--hm-navigation-menu-border-color: var(--hm-sem-floating-border-color);
--hm-navigation-menu-surface-radius: var(--hm-sem-floating-radius);
--hm-navigation-menu-shadow: var(--hm-sem-floating-shadow);
--hm-navigation-menu-content-padding: 8px;
--hm-navigation-menu-content-min-width: 240px;
/* Link inside the content (destination with an optional description) */
--hm-navigation-menu-item-padding: 8px 12px;
--hm-navigation-menu-item-gap: 2px;
--hm-navigation-menu-item-radius: 2px;
--hm-navigation-menu-description-color: var(--hm-sem-fg-secondary);
--hm-navigation-menu-description-font-size: 12px;
--hm-navigation-menu-description-line-height: 18px;
/* Current HM value for this component only; not a global Disabled rule. */
--hm-navigation-menu-disabled-opacity: 0.6;
}
[data-slot="navigation-menu-list"] {
gap: var(--hm-navigation-menu-gap);
}
/* Top-level trigger and link: the same text-button look. */
[data-slot="navigation-menu-trigger"],
[data-slot="navigation-menu-link"] {
box-sizing: border-box;
align-items: center;
height: var(--hm-navigation-menu-height);
padding: 0 var(--hm-navigation-menu-padding-x);
border-radius: var(--hm-navigation-menu-radius);
background: transparent;
color: var(--hm-navigation-menu-text);
font-size: var(--hm-navigation-menu-font-size);
line-height: var(--hm-navigation-menu-line-height);
font-weight: var(--hm-navigation-menu-font-weight);
text-decoration: none;
cursor: pointer;
}
[data-slot="navigation-menu-trigger"]:hover,
[data-slot="navigation-menu-trigger"]:focus-visible,
[data-slot="navigation-menu-trigger"][data-state="open"],
[data-slot="navigation-menu-link"]:hover,
[data-slot="navigation-menu-link"]:focus-visible {
background: var(--hm-navigation-menu-hover-background);
color: var(--hm-navigation-menu-hover-text);
}
[data-slot="navigation-menu-trigger"]:focus-visible,
[data-slot="navigation-menu-link"]:focus-visible {
box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 50%, transparent);
}
[data-slot="navigation-menu-link"][data-active] {
background: var(--hm-navigation-menu-active-background);
color: var(--hm-navigation-menu-active-text);
font-weight: var(--hm-navigation-menu-active-font-weight);
}
[data-slot="navigation-menu-link"][data-active]:hover,
[data-slot="navigation-menu-link"][data-active]:focus-visible {
background: var(--hm-navigation-menu-hover-background);
}
[data-slot="navigation-menu-trigger"]:disabled {
opacity: var(--hm-navigation-menu-disabled-opacity);
cursor: not-allowed;
}
[data-slot="navigation-menu-trigger-icon"] {
width: var(--hm-navigation-menu-icon-size);
height: var(--hm-navigation-menu-icon-size);
}
/* Floating panel: the viewport carries the surface (viewport mode) or the content does (viewport={false}). */
[data-slot="navigation-menu-viewport"],
[data-viewport="false"] [data-slot="navigation-menu-content"] {
border: var(--hm-navigation-menu-border-width) solid var(--hm-navigation-menu-border-color);
border-radius: var(--hm-navigation-menu-surface-radius);
background: var(--hm-navigation-menu-background);
color: var(--hm-navigation-menu-text);
box-shadow: var(--hm-navigation-menu-shadow);
}
[data-slot="navigation-menu-content"] {
box-sizing: border-box;
min-width: var(--hm-navigation-menu-content-min-width);
padding: var(--hm-navigation-menu-content-padding);
}
[data-slot="navigation-menu-indicator-arrow"] {
background: var(--hm-navigation-menu-border-color);
}
/* Links inside the content are destinations: block items, optional title + description children. */
[data-slot="navigation-menu-content"] [data-slot="navigation-menu-link"] {
height: auto;
flex-direction: column;
align-items: stretch;
gap: var(--hm-navigation-menu-item-gap);
padding: var(--hm-navigation-menu-item-padding);
border-radius: var(--hm-navigation-menu-item-radius);
}
[data-slot="navigation-menu-content"] [data-slot="navigation-menu-link"] [data-description] {
color: var(--hm-navigation-menu-description-color);
font-size: var(--hm-navigation-menu-description-font-size);
line-height: var(--hm-navigation-menu-description-line-height);
font-weight: 400;
}
[data-slot="navigation-menu-content"] [data-slot="navigation-menu-link"]:hover [data-description],
[data-slot="navigation-menu-content"] [data-slot="navigation-menu-link"]:focus-visible [data-description] {
color: inherit;
}