Accordion
אוסף מקטעים מתקפלים המבוססים על אלמנטי details מובנים.
- דפדפנים
- Chrome 123+Firefox 121+Safari 17.5+
- שכבה
- 0
- גודל חבילה דחוסה
- 826 B
- מגבלת פריסה כפויה
- 0 ms
- מגבלת Axe
- 0
- תואם SSR
- כן
- מבוסס על
- elements/details
- חוזה מפורסם
- סביבת בדיקות
מגרש ניסויים
import { Accordion } from "@gunkin/uiify";
export default function Example() {
return (
<Accordion
className=""
id="faq"
type="single"
defaultValue="shipping"
slotProps={{
item: { className: "" },
trigger: { className: "" },
panel: { className: "" },
}}
items={[
{ value: "shipping", label: "Shipping", panel: <>Ships in 2–3 days.</> },
{ value: "returns", label: "Returns", panel: <>Returns are accepted for 30 days.</> },
]}
/>
);
}/* Accordion — built on native <details>/<summary>. Item is the <details>,
trigger the <summary>, content a div. A rotating chevron tracks open state.
[data-part] selectors keep the public anatomy independent from consumer classes. */
@layer components {
:where([data-uiify-accordion]) {
inline-size: 100%;
border: var(--border-width) solid var(--border);
border-radius: var(--radius-xl);
overflow: hidden;
}
[data-uiify-accordion] > [data-part="item"] {
border-block-end: var(--border-width) solid var(--border);
}
[data-uiify-accordion] > [data-part="item"]:last-child {
border-block-end: none;
}
[data-uiify-accordion] [data-part="trigger"] {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-md);
padding: var(--space-lg);
font-size: var(--text-sm);
line-height: var(--leading-normal);
font-weight: var(--weight-medium);
cursor: pointer;
list-style: none;
}
[data-uiify-accordion] [data-part="trigger"]::-webkit-details-marker {
display: none;
}
[data-uiify-accordion] [data-part="trigger"]:hover {
background-color: var(--secondary);
}
[data-uiify-accordion] [data-part="trigger"]:focus-visible {
outline: none;
box-shadow: inset 0 0 0 var(--ring-width) color-mix(in oklch, var(--ring) 20%, transparent);
}
/* Chevron. */
[data-uiify-accordion] [data-part="trigger"]::after {
content: "+";
display: grid;
place-items: center;
inline-size: 1.5rem;
block-size: 1.5rem;
flex: 0 0 1.5rem;
color: var(--muted-foreground);
font:
1.25rem/1 ui-monospace,
monospace;
transition: rotate var(--duration-fast) var(--ease-out);
}
[data-uiify-accordion] [data-part="item"][open] > [data-part="trigger"]::after {
content: "−";
}
[data-uiify-accordion] [data-part="item"][open] > [data-part="trigger"] {
color: var(--primary);
}
[data-uiify-accordion] {
interpolate-size: allow-keywords;
}
[data-uiify-accordion] > [data-part="item"]::details-content {
block-size: 0;
overflow: clip;
}
[data-uiify-accordion] > [data-part="item"][open]::details-content {
block-size: auto;
}
/* Shared presence timing; block-size only interpolates where the block above applies. */
@media (prefers-reduced-motion: no-preference) {
[data-uiify-accordion] > [data-part="item"]::details-content {
opacity: 0;
transition:
opacity var(--duration-fast) var(--ease-out),
block-size var(--duration-fast) var(--ease-out),
content-visibility var(--duration-fast) allow-discrete;
}
[data-uiify-accordion] > [data-part="item"][open]::details-content {
opacity: 1;
}
}
[data-uiify-accordion] [data-part="panel"] {
padding-block: 0 var(--space-lg);
padding-inline: var(--space-lg);
color: var(--muted-foreground);
font-size: var(--text-sm);
line-height: var(--leading-normal);
}
}import { Accordion } from "@gunkin/uiify";
export default function Example() {
return (
<Accordion
className="
[inline-size:100%] border-[length:var(--border-width)] border-solid border-border rounded-xl overflow-hidden
[interpolate-size:allow-keywords]
"
id="faq"
type="single"
defaultValue="shipping"
slotProps={{
item: {
className: "[border-block-end:var(--border-width)_solid_var(--border)] " + "last:[border-block-end:none]",
},
trigger: {
className:
"flex items-center justify-between gap-md p-lg text-sm " +
"[line-height:var(--leading-normal)] font-[number:var(--weight-medium)] " +
"cursor-pointer list-none [&::-webkit-details-marker]:hidden hover:bg-secondary " +
"focus-visible:[outline:none] " +
"focus-visible:[box-shadow:inset_0_0_0_var(--ring-width)_color-mix(in_oklch,_var(--ring)_20%,_transparent)]",
},
panel: {
className:
"[padding-block:0_var(--space-lg)] px-lg text-muted-foreground text-sm " +
"[line-height:var(--leading-normal)]",
},
}}
items={[
{ value: "shipping", label: "Shipping", panel: <>Ships in 2–3 days.</> },
{ value: "returns", label: "Returns", panel: <>Returns are accepted for 30 days.</> },
]}
/>
);
}API
Accordion
| מאפיין | טיפוס | ברירת מחדל | תיאור |
|---|---|---|---|
id* | string | — | מזהה השורש וקבוצת details המובנית במצב single. |
items* | readonly AccordionItem[] | — | כל פריט הוא { value, label, panel?, disabled? }. |
type | "single" | "multiple" | "single" | קובע אם פריט אחד או כמה יכולים להיות פתוחים בו-זמנית. |
defaultValue | string | readonly string[] | undefined | — | הפריטים הפתוחים בהצגה הראשונה. אינו מבוקר, ולכן נשמר גם ללא JavaScript. |
className | string | — | המחלקה המוחלת על שורש האקורדיון. |
slotProps | AccordionSlotProps | — | מאפיינים מובנים לפריט, לאלמנט הפתיחה וללוח שנוצרים; ניתן למקד משבצות חוזרות בפריט לפי ערכו. |
מקלדת
| מקש | פעולה |
|---|---|
| Enter / Space | פתיחה או סגירה של מקטע |
| Tab | מעבר בין מפעילים |
נגישות
אוסף מובנה של <details>/<summary>. המצב המורחב ניתן לקריאה ללא JS.
נקודות חיבור לעיצוב
data-state