01펼쳐지는 전체 폭 메가 패널
상단 행의 큰 메뉴에 마우스를 올리면 화면 폭만큼 넓은 패널이 내려오고, 안에는 카테고리 열 세 개와 강조 카드 한 장이 함께 보입니다.
쓰임제품군이 세 개 이상인 쇼핑몰·SaaS 상단 내비
:hovergrid-template-columnsaria-expanded

<main class="stage">
<div class="fwp is-demo" id="root">
<header class="fwp__bar">
<span class="fwp__brand">선물 상자</span>
<nav class="fwp__nav" aria-label="주 메뉴">
<a class="fwp__link" href="#">전체</a>
<button class="fwp__trigger" id="trigger" type="button" aria-controls="panel">선물
<svg class="fwp__caret" viewBox="0 0 256 256" width="16" height="16" aria-hidden="true"><g fill="currentColor"><path d="m208 96l-80 80l-80-80Z" opacity=".2"/><path d="M215.39 92.94A8 8 0 0 0 208 88H48a8 8 0 0 0-5.66 13.66l80 80a8 8 0 0 0 11.32 0l80-80a8 8 0 0 0 1.73-8.72M128 164.69L67.31 104h121.38Z"/></g></svg>
</button>
<a class="fwp__link" href="#">가구</a>
<a class="fwp__link" href="#">도움말</a>
</nav>
</header>
<div class="fwp__hints" aria-hidden="true"><span></span><span></span></div>
<div class="fwp__panel" id="panel">
<div class="fwp__grid">
<section class="fwp__col">
<h3>계절 선물</h3>
<ul><li>설년 세트</li><li>여름 보냉</li><li>겨울 담요</li></ul>
</section>
<section class="fwp__col">
<h3>가격대</h3>
<ul><li>2만 원대</li><li>5만 원대</li><li>10만 원 이상</li></ul>
</section>
<section class="fwp__col">
<h3>받는 사람</h3>
<ul><li>가족</li><li>직장 동료</li><li>친구</li></ul>
</section>
<aside class="fwp__promo">
<span class="fwp__promo-label">이번 주 추천</span>
<strong class="fwp__promo-title">여름 보냉 세트</strong>
<a class="fwp__promo-link" href="#">자세히 보기
<svg viewBox="0 0 256 256" width="16" height="16" aria-hidden="true"><g fill="currentColor"><path d="M192 64v104L88 64Z" opacity=".2"/><path d="M192 56H88a8 8 0 0 0-5.66 13.66L128.69 116l-70.35 70.34a8 8 0 0 0 11.32 11.32L140 127.31l46.34 46.35A8 8 0 0 0 200 168V64a8 8 0 0 0-8-8m-8 92.69l-38.34-38.34L107.31 72H184Z"/></g></svg>
</a>
</aside>
</div>
</div>
</div>
</main>@use "../../../../site/static/demo-tokens" as *;
$duration: $dur-loop;
$easing: $ease-spring;
$color: $subject-blue;
@include stage($stage-paper);
// 패널이 아래로 열리는 드롭다운 — 무대 중앙 정렬 대신 뿌리를 상단에 붙인다
.stage { align-items: flex-start; }
$ink-70: rgba(23, 20, 26, .7);
$ink-55: rgba(23, 20, 26, .55);
$ink-14: rgba(23, 20, 26, .14);
$ink-08: rgba(23, 20, 26, .08);
.fwp {
position: relative;
width: 100%;
}
.fwp__bar {
position: relative;
z-index: 3;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
gap: $sp-2;
height: 44px;
padding: 0 $sp-4;
background: $stage-paper;
border-bottom: 1px solid $ink-14;
}
.fwp__brand {
font-size: 14px;
font-weight: 700;
line-height: 20px;
color: $subject-ink;
}
.fwp__nav {
display: flex;
align-items: center;
gap: $sp-3;
}
.fwp__link {
font-size: 12px;
line-height: 18px;
color: $ink-70;
text-decoration: none;
transition: color $dur-quick $easing;
}
.fwp__link:hover { color: $subject-ink; }
.fwp__trigger {
box-sizing: border-box;
display: inline-flex;
align-items: center;
gap: $sp-1;
padding: $sp-1 $sp-2;
border: 0;
border-radius: $r-control;
background: transparent;
font-family: -apple-system, "Segoe UI", "Noto Sans KR", sans-serif;
font-size: 12px;
font-weight: 700;
line-height: 18px;
color: $subject-ink;
cursor: pointer;
transition: background-color $dur-quick $easing;
}
.fwp__trigger:hover { background: rgba(47, 109, 246, .12); }
.fwp__trigger:focus-visible { outline: 2px solid $color; outline-offset: -2px; }
.fwp__caret { display: block; transition: transform $dur-quick $ease-spring; }
.fwp__trigger[aria-expanded="true"] .fwp__caret { transform: rotate(180deg); }
// 본문 흉내 — 패널이 열리면 이 위를 덮는다
.fwp__hints {
display: grid;
gap: $sp-2;
margin: $sp-4 $sp-4 0;
}
.fwp__hints span {
display: block;
height: 8px;
border-radius: $r-xs;
background: $ink-08;
}
.fwp__hints span:last-child { width: 62%; }
.fwp__panel {
position: absolute;
left: 0;
right: 0;
top: 45px;
z-index: 2;
box-sizing: border-box;
padding: $sp-4;
background: $stage-paper;
border-radius: 0 0 $r-card $r-card;
box-shadow: $shadow-raised;
opacity: 0;
visibility: hidden;
transform: translateY(-6px);
transition: opacity $dur-quick $easing, transform $dur-quick $easing, visibility 0s linear $dur-quick;
}
.fwp:not(.is-demo).is-open .fwp__panel {
opacity: 1;
visibility: visible;
transform: translateY(0);
transition: opacity $dur-quick $easing, transform $dur-quick $easing, visibility 0s;
}
.fwp__grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1.2fr;
column-gap: $sp-6;
align-items: start;
}
.fwp__col h3 {
margin: 0 0 $sp-2;
font-size: 12px;
font-weight: 700;
line-height: 16px;
color: $subject-ink;
}
.fwp__col ul {
margin: 0;
padding: 0;
list-style: none;
}
.fwp__col li {
font-size: 11px;
line-height: 22px;
color: $ink-70;
}
.fwp__col li:hover { color: $subject-ink; }
.fwp__promo {
box-sizing: border-box;
align-self: stretch;
display: flex;
flex-direction: column;
justify-content: center;
gap: $sp-1;
padding: $sp-3;
border-radius: $r-sm;
background: $subject-blue;
color: #ffffff;
}
.fwp__promo-label {
font-size: 10px;
font-weight: 700;
line-height: 13px;
color: rgba(255, 255, 255, .8);
}
.fwp__promo-title {
font-size: 13px;
font-weight: 700;
line-height: 17px;
color: #ffffff;
}
.fwp__promo-link {
display: inline-flex;
align-items: center;
gap: $sp-1;
width: fit-content;
font-size: 11px;
line-height: 15px;
color: $subject-cream;
text-decoration: underline;
text-underline-offset: 4px;
}
.fwp__promo-link:hover { color: #ffffff; }
.fwp__promo-link svg { display: block; }
// ── 자동 루프 (2s) ────────────────────────────────────
// 0-8% 닫힘 → 8-12% 패널 등장 + 열 항목 stagger → 75-78.5% 닫힘(짧게) → 90% 안에 원 상태
// 열 항목은 $duration 전체를 주기로 하는 애니메이션에 delay 만 얹어 시차를 낸다 —
// 매 사이클마다 패널이 다시 열릴 때 항목이 다시 떠오른다
.fwp.is-demo .fwp__panel {
visibility: visible;
animation-name: fwp-panel;
animation-duration: $duration;
animation-timing-function: $easing;
animation-iteration-count: infinite;
animation-fill-mode: backwards;
}
.fwp.is-demo .fwp__caret {
animation-name: fwp-caret;
animation-duration: $duration;
animation-timing-function: $easing;
animation-iteration-count: infinite;
animation-fill-mode: backwards;
}
.fwp.is-demo .fwp__grid > * {
animation-name: fwp-item;
animation-duration: $duration;
animation-timing-function: $easing;
animation-iteration-count: infinite;
animation-fill-mode: backwards;
}
.fwp.is-demo .fwp__grid > :nth-child(1) { animation-delay: 240ms; }
.fwp.is-demo .fwp__grid > :nth-child(2) { animation-delay: 300ms; }
.fwp.is-demo .fwp__grid > :nth-child(3) { animation-delay: 360ms; }
.fwp.is-demo .fwp__grid > :nth-child(4) { animation-delay: 420ms; }
// 패널이 열려 있는 동안 화면이 죽지 않게 — 카드 링크의 화살표가 천천히 오른위로 쉰다.
// 열림·닫힘 컷 사이의 긴 유지 구간을 채우는 연속 동작 (움직인프레임 5→보강)
.fwp.is-demo .fwp__promo-link svg {
animation-name: fwp-nudge;
animation-duration: 640ms;
animation-timing-function: ease-in-out;
animation-iteration-count: infinite;
}
@keyframes fwp-nudge {
0%, 100% { transform: translate(0, 0); }
50% { transform: translate(2px, -2px); }
}
@keyframes fwp-panel {
0%, 8.4% { opacity: 0; transform: translateY(-6px); clip-path: inset(0 0 100% 0); }
8.5%, 74% { opacity: 1; transform: translateY(0); clip-path: inset(0 0 0 0); }
86%, 100% { opacity: 1; transform: translateY(0); clip-path: inset(100% 0 0 0); }
}
@keyframes fwp-caret {
0%, 8.4% { transform: rotate(0deg); }
8.5%, 74% { transform: rotate(180deg); }
86%, 100% { transform: rotate(0deg); }
}
@keyframes fwp-item {
0% { opacity: 0; transform: translateY(8px); }
4%, 100% { opacity: 1; transform: translateY(0); }
}
@media (max-width: 340px) {
.fwp__bar { height: 32px; padding: 0 $sp-2; }
.fwp__brand { font-size: 12px; line-height: 16px; }
.fwp__nav { gap: $sp-2; }
.fwp__link { font-size: 11px; line-height: 16px; }
.fwp__trigger { padding: 0 $sp-1; font-size: 11px; line-height: 16px; }
.fwp__hints { gap: $sp-1; margin: $sp-2 $sp-2 0; }
.fwp__hints span { height: 6px; }
.fwp__panel { top: 33px; padding: $sp-2; }
.fwp__grid { grid-template-columns: 1fr 1fr; gap: $sp-2; }
.fwp__col h3 { margin-bottom: 0; font-size: 10px; line-height: 13px; }
.fwp__col li { font-size: 10px; line-height: 14px; }
.fwp__promo { padding: $sp-1; }
.fwp__promo-label { font-size: 9px; line-height: 12px; }
.fwp__promo-title { font-size: 10px; line-height: 13px; }
.fwp__promo-link { font-size: 9px; line-height: 12px; }
}
@media (prefers-reduced-motion: reduce) {
.fwp.is-demo .fwp__panel,
.fwp.is-demo .fwp__caret,
.fwp.is-demo .fwp__promo-link svg,
.fwp.is-demo .fwp__grid > * { animation: none !important; }
.fwp.is-demo .fwp__panel { opacity: 1; visibility: visible; transform: none; }
}html, body {
margin: 0;
overflow: hidden;
}
.stage {
box-sizing: border-box;
min-height: 100vh;
display: grid;
place-items: center;
margin: 0;
background: #ffffff;
font-family: -apple-system, "Segoe UI", "Noto Sans KR", sans-serif;
padding: clamp(8px, 4vw, 24px);
}
.stage {
align-items: flex-start;
}
.fwp {
position: relative;
width: 100%;
}
.fwp__bar {
position: relative;
z-index: 3;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
height: 44px;
padding: 0 16px;
background: #ffffff;
border-bottom: 1px solid rgba(23, 20, 26, 0.14);
}
.fwp__brand {
font-size: 14px;
font-weight: 700;
line-height: 20px;
color: #17141a;
}
.fwp__nav {
display: flex;
align-items: center;
gap: 12px;
}
.fwp__link {
font-size: 12px;
line-height: 18px;
color: rgba(23, 20, 26, 0.7);
text-decoration: none;
transition: color 220ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
.fwp__link:hover {
color: #17141a;
}
.fwp__trigger {
box-sizing: border-box;
display: inline-flex;
align-items: center;
gap: 4px;
padding: 4px 8px;
border: 0;
border-radius: 12px;
background: transparent;
font-family: -apple-system, "Segoe UI", "Noto Sans KR", sans-serif;
font-size: 12px;
font-weight: 700;
line-height: 18px;
color: #17141a;
cursor: pointer;
transition: background-color 220ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
.fwp__trigger:hover {
background: rgba(47, 109, 246, 0.12);
}
.fwp__trigger:focus-visible {
outline: 2px solid #2f6df6;
outline-offset: -2px;
}
.fwp__caret {
display: block;
transition: transform 220ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
.fwp__trigger[aria-expanded=true] .fwp__caret {
transform: rotate(180deg);
}
.fwp__hints {
display: grid;
gap: 8px;
margin: 16px 16px 0;
}
.fwp__hints span {
display: block;
height: 8px;
border-radius: 4px;
background: rgba(23, 20, 26, 0.08);
}
.fwp__hints span:last-child {
width: 62%;
}
.fwp__panel {
position: absolute;
left: 0;
right: 0;
top: 45px;
z-index: 2;
box-sizing: border-box;
padding: 16px;
background: #ffffff;
border-radius: 0 0 16px 16px;
box-shadow: 0 14px 24px rgba(23, 20, 26, 0.32);
opacity: 0;
visibility: hidden;
transform: translateY(-6px);
transition: opacity 220ms cubic-bezier(0.2, 0.8, 0.2, 1), transform 220ms cubic-bezier(0.2, 0.8, 0.2, 1), visibility 0s linear 220ms;
}
.fwp:not(.is-demo).is-open .fwp__panel {
opacity: 1;
visibility: visible;
transform: translateY(0);
transition: opacity 220ms cubic-bezier(0.2, 0.8, 0.2, 1), transform 220ms cubic-bezier(0.2, 0.8, 0.2, 1), visibility 0s;
}
.fwp__grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1.2fr;
column-gap: 24px;
align-items: start;
}
.fwp__col h3 {
margin: 0 0 8px;
font-size: 12px;
font-weight: 700;
line-height: 16px;
color: #17141a;
}
.fwp__col ul {
margin: 0;
padding: 0;
list-style: none;
}
.fwp__col li {
font-size: 11px;
line-height: 22px;
color: rgba(23, 20, 26, 0.7);
}
.fwp__col li:hover {
color: #17141a;
}
.fwp__promo {
box-sizing: border-box;
align-self: stretch;
display: flex;
flex-direction: column;
justify-content: center;
gap: 4px;
padding: 12px;
border-radius: 8px;
background: #2f6df6;
color: #ffffff;
}
.fwp__promo-label {
font-size: 10px;
font-weight: 700;
line-height: 13px;
color: rgba(255, 255, 255, 0.8);
}
.fwp__promo-title {
font-size: 13px;
font-weight: 700;
line-height: 17px;
color: #ffffff;
}
.fwp__promo-link {
display: inline-flex;
align-items: center;
gap: 4px;
width: fit-content;
font-size: 11px;
line-height: 15px;
color: #fff7e6;
text-decoration: underline;
text-underline-offset: 4px;
}
.fwp__promo-link:hover {
color: #ffffff;
}
.fwp__promo-link svg {
display: block;
}
.fwp.is-demo .fwp__panel {
visibility: visible;
animation-name: fwp-panel;
animation-duration: 2s;
animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1);
animation-iteration-count: infinite;
animation-fill-mode: backwards;
}
.fwp.is-demo .fwp__caret {
animation-name: fwp-caret;
animation-duration: 2s;
animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1);
animation-iteration-count: infinite;
animation-fill-mode: backwards;
}
.fwp.is-demo .fwp__grid > * {
animation-name: fwp-item;
animation-duration: 2s;
animation-timing-function: cubic-bezier(0.2, 0.8, 0.2, 1);
animation-iteration-count: infinite;
animation-fill-mode: backwards;
}
.fwp.is-demo .fwp__grid > :nth-child(1) {
animation-delay: 240ms;
}
.fwp.is-demo .fwp__grid > :nth-child(2) {
animation-delay: 300ms;
}
.fwp.is-demo .fwp__grid > :nth-child(3) {
animation-delay: 360ms;
}
.fwp.is-demo .fwp__grid > :nth-child(4) {
animation-delay: 420ms;
}
.fwp.is-demo .fwp__promo-link svg {
animation-name: fwp-nudge;
animation-duration: 640ms;
animation-timing-function: ease-in-out;
animation-iteration-count: infinite;
}
@keyframes fwp-nudge {
0%, 100% {
transform: translate(0, 0);
}
50% {
transform: translate(2px, -2px);
}
}
@keyframes fwp-panel {
0%, 8.4% {
opacity: 0;
transform: translateY(-6px);
clip-path: inset(0 0 100% 0);
}
8.5%, 74% {
opacity: 1;
transform: translateY(0);
clip-path: inset(0 0 0 0);
}
86%, 100% {
opacity: 1;
transform: translateY(0);
clip-path: inset(100% 0 0 0);
}
}
@keyframes fwp-caret {
0%, 8.4% {
transform: rotate(0deg);
}
8.5%, 74% {
transform: rotate(180deg);
}
86%, 100% {
transform: rotate(0deg);
}
}
@keyframes fwp-item {
0% {
opacity: 0;
transform: translateY(8px);
}
4%, 100% {
opacity: 1;
transform: translateY(0);
}
}
@media (max-width: 340px) {
.fwp__bar {
height: 32px;
padding: 0 8px;
}
.fwp__brand {
font-size: 12px;
line-height: 16px;
}
.fwp__nav {
gap: 8px;
}
.fwp__link {
font-size: 11px;
line-height: 16px;
}
.fwp__trigger {
padding: 0 4px;
font-size: 11px;
line-height: 16px;
}
.fwp__hints {
gap: 4px;
margin: 8px 8px 0;
}
.fwp__hints span {
height: 6px;
}
.fwp__panel {
top: 33px;
padding: 8px;
}
.fwp__grid {
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.fwp__col h3 {
margin-bottom: 0;
font-size: 10px;
line-height: 13px;
}
.fwp__col li {
font-size: 10px;
line-height: 14px;
}
.fwp__promo {
padding: 4px;
}
.fwp__promo-label {
font-size: 9px;
line-height: 12px;
}
.fwp__promo-title {
font-size: 10px;
line-height: 13px;
}
.fwp__promo-link {
font-size: 9px;
line-height: 12px;
}
}
@media (prefers-reduced-motion: reduce) {
.fwp.is-demo .fwp__panel,
.fwp.is-demo .fwp__caret,
.fwp.is-demo .fwp__promo-link svg,
.fwp.is-demo .fwp__grid > * {
animation: none !important;
}
.fwp.is-demo .fwp__panel {
opacity: 1;
visibility: visible;
transform: none;
}
}var root = document.getElementById('root');
var trigger = document.getElementById('trigger');
trigger.setAttribute('aria-haspopup', 'true');
trigger.setAttribute('aria-expanded', 'false');
function stopDemo() { root.classList.remove('is-demo'); }
function open() { stopDemo(); root.classList.add('is-open'); trigger.setAttribute('aria-expanded', 'true'); }
function close() { stopDemo(); root.classList.remove('is-open'); trigger.setAttribute('aria-expanded', 'false'); }
trigger.addEventListener('mouseenter', open);
trigger.addEventListener('focus', open);
trigger.addEventListener('click', function () { root.classList.contains('is-open') ? close() : open(); });
root.addEventListener('mouseleave', close);
document.addEventListener('keydown', function (e) { if (e.key === 'Escape') close(); });
document.addEventListener('pointerdown', stopDemo, { once: true });
document.addEventListener('keydown', stopDemo, { once: true });import { useState } from "react";
import type { CSSProperties } from "react";
import styles from "./FullwideHoverPanel.module.scss";
export type FullwideHoverPanelLabels = {
navLabel: string;
brand: string;
navAll: string;
trigger: string;
navFurniture: string;
navHelp: string;
colSeasonal: string;
colPrice: string;
colRecipient: string;
itemsSeasonal: string[];
itemsPrice: string[];
itemsRecipient: string[];
pickLabel: string;
pickTitle: string;
pickLink: string;
};
export type FullwideHoverPanelProps = {
labels?: FullwideHoverPanelLabels;
duration?: number;
easing?: string;
color?: string;
};
type Vars = CSSProperties & { "--duration"?: string; "--easing"?: string; "--color"?: string };
type KeyEvt = { key: string };
const DEFAULT_LABELS: FullwideHoverPanelLabels = {
navLabel: "Main menu",
brand: "Gift Box",
navAll: "All",
trigger: "Gifts",
navFurniture: "Furniture",
navHelp: "Help",
colSeasonal: "Seasonal",
colPrice: "Price range",
colRecipient: "Recipient",
itemsSeasonal: ["New Year set", "Summer cooler", "Winter blanket"],
itemsPrice: ["$20 range", "$50 range", "$100 and up"],
itemsRecipient: ["Family", "Coworkers", "Friends"],
pickLabel: "This week's pick",
pickTitle: "Cooler gift set",
pickLink: "See details",
};
function CaretDown() {
return (
<svg viewBox="0 0 256 256" width="16" height="16" aria-hidden="true">
<g fill="currentColor">
<path d="m208 96l-80 80l-80-80Z" opacity=".2" />
<path d="M215.39 92.94A8 8 0 0 0 208 88H48a8 8 0 0 0-5.66 13.66l80 80a8 8 0 0 0 11.32 0l80-80a8 8 0 0 0 1.73-8.72M128 164.69L67.31 104h121.38Z" />
</g>
</svg>
);
}
function ArrowUpRight() {
return (
<svg viewBox="0 0 256 256" width="16" height="16" aria-hidden="true">
<g fill="currentColor">
<path d="M192 64v104L88 64Z" opacity=".2" />
<path d="M192 56H88a8 8 0 0 0-5.66 13.66L128.69 116l-70.35 70.34a8 8 0 0 0 11.32 11.32L140 127.31l46.34 46.35A8 8 0 0 0 200 168V64a8 8 0 0 0-8-8m-8 92.69l-38.34-38.34L107.31 72H184Z" />
</g>
</svg>
);
}
export default function FullwideHoverPanel({
labels = DEFAULT_LABELS,
duration = 2000,
easing = "cubic-bezier(.2,.8,.2,1)",
color = "#2f6df6",
}: FullwideHoverPanelProps) {
const [live, setLive] = useState(true);
const [open, setOpen] = useState(false);
function wake() {
setLive(false);
}
function show() {
wake();
setOpen(true);
}
function hide() {
wake();
setOpen(false);
}
const vars: Vars = { "--duration": `${duration}ms`, "--easing": easing, "--color": color };
const cols = [
{ title: labels.colSeasonal, items: labels.itemsSeasonal },
{ title: labels.colPrice, items: labels.itemsPrice },
{ title: labels.colRecipient, items: labels.itemsRecipient },
];
return (
<div
className={[styles.fwp, live ? styles.isDemo : "", open ? styles.isOpen : ""].join(" ")}
style={vars}
onMouseLeave={hide}
onPointerDownCapture={wake}
onKeyDownCapture={wake}
onKeyDown={(e: KeyEvt) => {
if (e.key === "Escape") hide();
}}
>
<header className={styles.fwpBar}>
<span className={styles.fwpBrand}>{labels.brand}</span>
<nav className={styles.fwpNav} aria-label={labels.navLabel}>
<a className={styles.fwpLink} href="#">{labels.navAll}</a>
<button
type="button"
className={styles.fwpTrigger}
aria-expanded={open}
aria-haspopup="true"
onMouseEnter={show}
onFocus={show}
onClick={() => (open ? hide() : show())}
>
{labels.trigger}
<span className={styles.fwpCaret}>
<CaretDown />
</span>
</button>
<a className={styles.fwpLink} href="#">{labels.navFurniture}</a>
<a className={styles.fwpLink} href="#">{labels.navHelp}</a>
</nav>
</header>
<div className={styles.fwpHints} aria-hidden="true">
<span />
<span />
</div>
<div className={styles.fwpPanel}>
<div className={styles.fwpGrid}>
{cols.map((c) => (
<section className={styles.fwpCol} key={c.title}>
<h3>{c.title}</h3>
<ul>
{c.items.map((it) => (
<li key={it}>{it}</li>
))}
</ul>
</section>
))}
<aside className={styles.fwpPromo}>
<span className={styles.fwpPromoLabel}>{labels.pickLabel}</span>
<strong className={styles.fwpPromoTitle}>{labels.pickTitle}</strong>
<a className={styles.fwpPromoLink} href="#">
{labels.pickLink}
<ArrowUpRight />
</a>
</aside>
</div>
</div>
</div>
);
}01 펼쳐지는 전체 폭 메가 패널 — 측정 누적면적 12.979% · 움직인 프레임 18/23GODRICH 원작 · zip 에 SCSS·React 포함 · 메가 메뉴 ui 9종 — 링크 나열이 아니라 사이트 지도
이 데모가 속한 글
메가 메뉴 ui 9종 — 링크 나열이 아니라 사이트 지도메가 메뉴 ui 는 상단 내비의 항목 하나에서 화면 폭만큼 넓은 패널이 열려 사이트 전체 구조를 한눈에 보여 주는 메뉴입니다. 여기 모은 아홉 개는 그 패널뿐 아니라 다단 전개·스크롤 축소·모바일 전환·검색·알림까지 이 글의 데모 전부 보기

