Files
hyperframes/registry/components/dropdown-menu/dropdown-menu.html
T

268 lines
10 KiB
HTML
Vendored

<!--
Dropdown Menu - compact menu primitive.
Animate --hf-dropdown-open from 0 to 1 on .hf-ui-dropdown.
Use --hf-dropdown-item-stagger on each item for staged reveals.
-->
<div data-hf-ui-root class="hf-ui-dropdown">
<button
class="hf-ui-dropdown-trigger"
type="button"
aria-expanded="true"
aria-controls="hf-ui-dropdown-menu"
>
Actions
</button>
<div class="hf-ui-dropdown-menu" id="hf-ui-dropdown-menu" role="menu">
<button
class="hf-ui-dropdown-item"
style="--hf-dropdown-item-stagger: 0"
type="button"
role="menuitem"
>
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="m6 12 4 4 8-9" /></svg>
<span>Duplicate</span>
</button>
<button
class="hf-ui-dropdown-item"
style="--hf-dropdown-item-stagger: 1"
type="button"
role="menuitem"
>
<span>Export</span>
</button>
<button
class="hf-ui-dropdown-item"
style="--hf-dropdown-item-stagger: 2"
type="button"
role="menuitem"
>
<span>Archive</span>
</button>
</div>
</div>
<style>
/* hf-ui:tokens:start */
/* prettier-ignore */
[data-hf-ui-root] {
--_hf-ui-accent: var(--hf-ui-accent, #3ce6ac);
--_hf-ui-action: var(--hf-ui-action, #eeeeee);
--_hf-ui-action-contrast: var(--hf-ui-action-contrast, #111111);
--_hf-ui-border: var(--hf-ui-border, #2a2a2a);
--_hf-ui-border-strong: var(--hf-ui-border-strong, #383838);
--_hf-ui-canvas: var(--hf-ui-canvas, #0a0a0a);
--_hf-ui-control-border: var(--hf-ui-control-border, #686868);
--_hf-ui-control-border-hover: var(--hf-ui-control-border-hover, #777777);
--_hf-ui-control-height: var(--hf-ui-control-height, 40px);
--_hf-ui-danger: var(--hf-ui-danger, #ff7878);
--_hf-ui-data-1: var(--hf-ui-data-1, #3ce6ac);
--_hf-ui-data-2: var(--hf-ui-data-2, #63a5ff);
--_hf-ui-data-3: var(--hf-ui-data-3, #e9ab55);
--_hf-ui-data-4: var(--hf-ui-data-4, #a78bfa);
--_hf-ui-data-5: var(--hf-ui-data-5, #ff8a75);
--_hf-ui-duration-drawer-enter: var(--hf-ui-duration-drawer-enter, 360ms);
--_hf-ui-duration-drawer-exit: var(--hf-ui-duration-drawer-exit, 240ms);
--_hf-ui-duration-modal-enter: var(--hf-ui-duration-modal-enter, 280ms);
--_hf-ui-duration-modal-exit: var(--hf-ui-duration-modal-exit, 180ms);
--_hf-ui-duration-overlay-enter: var(--hf-ui-duration-overlay-enter, 210ms);
--_hf-ui-duration-overlay-exit: var(--hf-ui-duration-overlay-exit, 140ms);
--_hf-ui-duration-press: var(--hf-ui-duration-press, 120ms);
--_hf-ui-duration-state: var(--hf-ui-duration-state, 160ms);
--_hf-ui-ease-enter: var(--hf-ui-ease-enter, cubic-bezier(0.32, 0.72, 0, 1));
--_hf-ui-ease-exit: var(--hf-ui-ease-exit, cubic-bezier(0.23, 1, 0.32, 1));
--_hf-ui-ease-response: var(--hf-ui-ease-response, cubic-bezier(0.23, 1, 0.32, 1));
--_hf-ui-font-mono: var(--hf-ui-font-mono, ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace);
--_hf-ui-font-sans: var(--hf-ui-font-sans, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);
--_hf-ui-hit-target: var(--hf-ui-hit-target, 44px);
--_hf-ui-radius-control: var(--hf-ui-radius-control, 5px);
--_hf-ui-radius-overlay: var(--hf-ui-radius-overlay, 10px);
--_hf-ui-radius-surface: var(--hf-ui-radius-surface, 7px);
--_hf-ui-shadow-contact: var(--hf-ui-shadow-contact, 0 8px 18px rgba(0, 0, 0, 0.38));
--_hf-ui-shadow-inset: var(--hf-ui-shadow-inset, inset 0 1px 0 rgba(255, 255, 255, 0.035));
--_hf-ui-shadow-modal: var(--hf-ui-shadow-modal, 0 18px 46px rgba(0, 0, 0, 0.52));
--_hf-ui-space-1: var(--hf-ui-space-1, 4px);
--_hf-ui-space-12: var(--hf-ui-space-12, 48px);
--_hf-ui-space-16: var(--hf-ui-space-16, 64px);
--_hf-ui-space-2: var(--hf-ui-space-2, 8px);
--_hf-ui-space-3: var(--hf-ui-space-3, 12px);
--_hf-ui-space-4: var(--hf-ui-space-4, 16px);
--_hf-ui-space-6: var(--hf-ui-space-6, 24px);
--_hf-ui-space-8: var(--hf-ui-space-8, 32px);
--_hf-ui-surface: var(--hf-ui-surface, #141414);
--_hf-ui-surface-inset: var(--hf-ui-surface-inset, #101010);
--_hf-ui-surface-raised: var(--hf-ui-surface-raised, #1a1a1a);
--_hf-ui-text: var(--hf-ui-text, #e5e5e5);
--_hf-ui-text-faint: var(--hf-ui-text-faint, #7e7e7e);
--_hf-ui-text-muted: var(--hf-ui-text-muted, #929292);
--_hf-ui-text-strong: var(--hf-ui-text-strong, #f3f3f3);
--_hf-ui-warning: var(--hf-ui-warning, #e9ab55);
--_hf-ui-weight-medium: var(--hf-ui-weight-medium, 500);
--_hf-ui-weight-regular: var(--hf-ui-weight-regular, 400);
--_hf-ui-weight-semibold: var(--hf-ui-weight-semibold, 600);
box-sizing: border-box;
color-scheme: dark;
font-family: var(--_hf-ui-font-sans);
}
/* prettier-ignore */
[data-hf-ui-root] *,
[data-hf-ui-root] *::before,
[data-hf-ui-root] *::after {
box-sizing: border-box;
}
/* prettier-ignore */
[data-hf-theme="light"] [data-hf-ui-root],
[data-hf-ui-root][data-hf-theme="light"] {
--_hf-ui-accent: var(--hf-ui-accent, #087a57);
--_hf-ui-action: var(--hf-ui-action, #171717);
--_hf-ui-action-contrast: var(--hf-ui-action-contrast, #ffffff);
--_hf-ui-border: var(--hf-ui-border, #e0dfdb);
--_hf-ui-border-strong: var(--hf-ui-border-strong, #cbc9c3);
--_hf-ui-canvas: var(--hf-ui-canvas, #f6f5f1);
--_hf-ui-control-border: var(--hf-ui-control-border, #888888);
--_hf-ui-control-border-hover: var(--hf-ui-control-border-hover, #6f6e68);
--_hf-ui-danger: var(--hf-ui-danger, #a61b1b);
--_hf-ui-data-1: var(--hf-ui-data-1, #087a57);
--_hf-ui-data-2: var(--hf-ui-data-2, #245ea8);
--_hf-ui-data-3: var(--hf-ui-data-3, #8a4b00);
--_hf-ui-data-4: var(--hf-ui-data-4, #6d3fc0);
--_hf-ui-data-5: var(--hf-ui-data-5, #a83d2d);
--_hf-ui-shadow-contact: var(--hf-ui-shadow-contact, 0 7px 16px rgba(26, 24, 20, 0.13));
--_hf-ui-shadow-inset: var(--hf-ui-shadow-inset, inset 0 1px 0 rgba(255, 255, 255, 0.78));
--_hf-ui-shadow-modal: var(--hf-ui-shadow-modal, 0 18px 46px rgba(26, 24, 20, 0.18));
--_hf-ui-surface: var(--hf-ui-surface, #ffffff);
--_hf-ui-surface-inset: var(--hf-ui-surface-inset, #f0efeb);
--_hf-ui-surface-raised: var(--hf-ui-surface-raised, #ffffff);
--_hf-ui-text: var(--hf-ui-text, #171717);
--_hf-ui-text-faint: var(--hf-ui-text-faint, #6f6e68);
--_hf-ui-text-muted: var(--hf-ui-text-muted, #5f5f5a);
--_hf-ui-text-strong: var(--hf-ui-text-strong, #0a0a0a);
--_hf-ui-warning: var(--hf-ui-warning, #8a4b00);
color-scheme: light;
}
/* prettier-ignore */
[data-hf-ui-root]:focus-visible {
outline: 2px solid var(--_hf-ui-accent);
outline-offset: 3px;
}
/* prettier-ignore */
[data-hf-rendering="true"][data-hf-ui-root],
[data-hf-rendering="true"] [data-hf-ui-root],
[data-hf-rendering="true"][data-hf-ui-root] *,
[data-hf-rendering="true"] [data-hf-ui-root] *,
[data-hf-rendering="true"][data-hf-ui-root]::before,
[data-hf-rendering="true"][data-hf-ui-root]::after,
[data-hf-rendering="true"] [data-hf-ui-root]::before,
[data-hf-rendering="true"] [data-hf-ui-root]::after,
[data-hf-rendering="true"][data-hf-ui-root] *::before,
[data-hf-rendering="true"][data-hf-ui-root] *::after,
[data-hf-rendering="true"] [data-hf-ui-root] *::before,
[data-hf-rendering="true"] [data-hf-ui-root] *::after {
animation-duration: 0s !important;
animation-delay: 0s !important;
transition-duration: 0s !important;
transition-delay: 0s !important;
}
/* prettier-ignore */
@media (prefers-reduced-motion: reduce) {
[data-hf-ui-root],
[data-hf-ui-root] *,
[data-hf-ui-root] *::before,
[data-hf-ui-root] *::after {
animation-duration: 0s !important;
animation-delay: 0s !important;
transition-duration: 0s !important;
transition-delay: 0s !important;
scroll-behavior: auto !important;
}
}
/* hf-ui:tokens:end */
.hf-ui-dropdown {
--hf-dropdown-open: 1;
position: relative;
display: inline-block;
color: var(--_hf-ui-text);
}
.hf-ui-dropdown-trigger {
height: var(--_hf-ui-control-height);
padding: 0 18px;
border: 1px solid var(--_hf-ui-control-border);
border-radius: var(--_hf-ui-radius-control);
background: var(--_hf-ui-surface);
color: inherit;
font: var(--_hf-ui-weight-semibold) 13px/1 var(--_hf-ui-font-sans);
box-shadow: var(--_hf-ui-shadow-inset);
transform: translateY(calc(var(--hf-dropdown-open) * 1px));
}
.hf-ui-dropdown-menu {
position: absolute;
top: calc(100% + 10px);
right: 0;
width: 184px;
padding: var(--_hf-ui-space-2);
border: 1px solid var(--_hf-ui-border-strong);
border-radius: var(--_hf-ui-radius-overlay);
background: var(--_hf-ui-surface-raised);
opacity: var(--hf-dropdown-open);
transform: translateY(calc((1 - var(--hf-dropdown-open)) * -4px))
scale(calc(0.98 + var(--hf-dropdown-open) * 0.02));
transform-origin: top right;
box-shadow: var(--_hf-ui-shadow-contact);
will-change: transform, opacity;
}
.hf-ui-dropdown-item {
display: grid;
grid-template-columns: 18px 1fr;
align-items: center;
gap: var(--_hf-ui-space-2);
width: 100%;
min-height: var(--_hf-ui-control-height);
padding: 0 10px;
border: 0;
border-radius: var(--_hf-ui-radius-control);
background: transparent;
color: var(--_hf-ui-text);
font: var(--_hf-ui-weight-medium) 13px/1 var(--_hf-ui-font-sans);
text-align: left;
opacity: var(--hf-dropdown-open);
transform: translateY(calc((1 - var(--hf-dropdown-open)) * 4px));
}
.hf-ui-dropdown-item svg {
width: 16px;
height: 16px;
fill: none;
stroke: transparent;
stroke-width: 1.5;
stroke-linecap: square;
stroke-linejoin: miter;
}
.hf-ui-dropdown-item:first-child {
background: var(--_hf-ui-surface-inset);
color: var(--_hf-ui-text-strong);
box-shadow: inset 2px 0 0 var(--_hf-ui-accent);
}
.hf-ui-dropdown-item:first-child svg {
stroke: var(--_hf-ui-accent);
}
.hf-ui-dropdown-item:not(:first-child) {
padding-inline-start: 36px;
}
.hf-ui-dropdown-trigger:focus-visible,
.hf-ui-dropdown-item:focus-visible {
outline: 2px solid var(--_hf-ui-accent);
outline-offset: 3px;
}
@media (pointer: coarse) {
.hf-ui-dropdown-trigger,
.hf-ui-dropdown-item {
min-height: var(--_hf-ui-hit-target);
}
}
</style>
<!--
Timeline integration:
tl.to('.hf-ui-dropdown', { '--hf-dropdown-open': 1, duration: 0.21, ease: 'power3.out' }, startTime);
-->