דילוג לתוכן
uiify

Item

שורת רשימה שמשלבת מדיה בתחילתה ותוכן עם מטא-נתונים ופעולה.

דפדפנים
Chrome 123+Firefox 121+Safari 17.5+
שכבה
0
מגבלת פריסה כפויה
0 ms
מגבלת Axe
0
תואם SSR
כן
חוזה מפורסם
סביבת בדיקות

מגרש ניסויים

  • פרויקט אטלס
    פרויקט פרטי · עודכן לפני שעתיים
  • השקה ברבעון השלישי
    משותף עם 4 אנשים · עודכן אתמול
  • Mina Chen
    Design · Updated today
  • Sam Rivera
    Engineering · Updated yesterday
import { Avatar, Button, Item, ItemActions, ItemContent, ItemMedia, ItemMetadata } from "@gunkin/uiify";

export default function Example() {
  return (
    <ul className="">
      <Item className="">
        <ItemMedia className="">
          <Avatar
            className=""
            aria-hidden="true"
            fallback="MC"
            name="Mina Chen"
            size="sm"
            slotProps={{ image: { className: "" } }}
          />
        </ItemMedia>
        <ItemContent className="">
          <Button as="span" className="" variant="link">
            Mina Chen
          </Button>
        </ItemContent>
        <ItemMetadata className="">Design · Updated today</ItemMetadata>
        <ItemActions className="">
          <Button className="" disabled size="sm" type="button" variant="outline">
            Email
          </Button>
        </ItemActions>
      </Item>
      <Item className="">
        <ItemMedia className="">
          <Avatar
            className=""
            aria-hidden="true"
            fallback="SR"
            name="Sam Rivera"
            size="sm"
            slotProps={{ image: { className: "" } }}
          />
        </ItemMedia>
        <ItemContent className="">
          <Button as="span" className="" variant="link">
            Sam Rivera
          </Button>
        </ItemContent>
        <ItemMetadata className="">Engineering · Updated yesterday</ItemMetadata>
        <ItemActions className="">
          <Button className="" disabled size="sm" type="button" variant="outline">
            Email
          </Button>
        </ItemActions>
      </Item>
    </ul>
  );
}
@layer components {
  [data-uiify-item] {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    grid-template-rows: auto auto;
    align-items: center;
    gap: 0.25rem 0.875rem;
    min-inline-size: 0;
    padding-block: 1rem;
    padding-inline: 0.75rem;
  }

  [data-uiify-item-media] {
    display: inline-flex;
    grid-column: 1;
    grid-row: 1 / span 2;
    flex: none;
    align-items: center;
    justify-content: center;
  }

  [data-uiify-item-content] {
    display: grid;
    grid-column: 2;
    grid-row: 1;
    min-inline-size: 0;
    gap: 0.25rem;
    overflow-wrap: anywhere;
  }

  [data-uiify-item-content] > [data-uiify-button] {
    justify-self: start;
  }

  [data-uiify-item-metadata] {
    grid-column: 2;
    grid-row: 2;
    color: var(--muted-foreground);
    font-size: var(--text-sm);
  }

  [data-uiify-item-actions] {
    display: inline-flex;
    grid-column: 3;
    grid-row: 1 / span 2;
    align-items: center;
    justify-self: end;
    gap: 0.5rem;
  }

  @media (width <= 28rem) {
    [data-uiify-item] {
      grid-template-columns: auto minmax(0, 1fr);
      align-items: start;
      column-gap: 0.75rem;
    }

    [data-uiify-item-actions] {
      grid-column: 2;
      grid-row: 3;
      justify-self: start;
    }
  }
}
import { Avatar, Button, Item, ItemActions, ItemContent, ItemMedia, ItemMetadata } from "@gunkin/uiify";

export default function Example() {
  return (
    <ul
      className="
        grid [inline-size:min(100%,_42rem)] m-0 py-2 px-3 border border-border rounded-md list-none bg-card
        text-foreground shadow-popover
        [&>[data-uiify-item]+[data-uiify-item]]:[border-block-start:1px_solid_var(--border)]
      "
    >
      <Item
        className="
          grid grid-cols-[auto_minmax(0,_1fr)_auto] grid-rows-[auto_auto] items-center gap-[0.25rem_0.875rem] min-w-0
          py-4 px-3 max-[28rem]:grid-cols-[auto_minmax(0,_1fr)] max-[28rem]:items-start max-[28rem]:gap-x-3
        "
      >
        <ItemMedia className="inline-flex col-[1] row-[1_/_span_2] shrink-0 items-center justify-center">
          <Avatar
            className="
              inline-grid place-items-center overflow-clip rounded-[var(--radius-full)] bg-muted text-muted-foreground
              font-[number:var(--weight-medium)] leading-none [vertical-align:middle] data-[size=sm]:[inline-size:2rem]
              data-[size=sm]:[block-size:2rem] data-[size=sm]:text-xs
              [&:is(:not([data-size]),[data-size=md])]:[inline-size:2.5rem]
              [&:is(:not([data-size]),[data-size=md])]:[block-size:2.5rem]
              [&:is(:not([data-size]),[data-size=md])]:text-sm data-[size=lg]:[inline-size:3rem]
              data-[size=lg]:[block-size:3rem] data-[size=lg]:text-base
            "
            aria-hidden="true"
            fallback="MC"
            name="Mina Chen"
            size="sm"
            slotProps={{ image: { className: "block [inline-size:100%] [block-size:100%] object-cover" } }}
          />
        </ItemMedia>
        <ItemContent className="grid col-[2] row-[1] min-w-0 gap-1 [overflow-wrap:anywhere]">
          <Button
            as="span"
            className={
              "relative isolate inline-flex items-center justify-center gap-1.5 min-h-10 py-px border-transparent bg" +
              "-clip-padding text-base font-medium leading-6 cursor-pointer [transition:var(--transition-colors)] fo" +
              "cus-visible:[box-shadow:0_0_0_var(--ring-width)_color-mix(in_oklch,_var(--ring)_20%,_transparent)] di" +
              "sabled:opacity-50 disabled:cursor-not-allowed data-[disabled]:opacity-50 data-[disabled]:cursor-not-a" +
              "llowed [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:[--uiify-button-rim:rgb(255_25" +
              "5_255_/_20%)] [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:[--uiify-button-wash:rg" +
              "b(255_255_255_/_15%)] [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:border-transpar" +
              "ent [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:bg-primary [&:is([data-selected]," +
              "[aria-pressed=true],[aria-current=page])]:text-primary-foreground [:checked+&]:[--uiify-button-rim:rg" +
              "b(255_255_255_/_20%)] [:checked+&]:[--uiify-button-wash:rgb(255_255_255_/_15%)] [:checked+&]:border-t" +
              "ransparent [:checked+&]:bg-primary [:checked+&]:text-primary-foreground [@media_(any-hover:_hover)_an" +
              "d_(any-pointer:_fine)]:[&:is([data-selected],[aria-pressed=true],[aria-current=page]):hover:not(:disa" +
              "bled,[data-disabled])]:[background-color:color-mix(in_oklch,_var(--primary)_88%,_var(--primary-foregr" +
              "ound))] [@media_(any-hover:_hover)_and_(any-pointer:_fine)]:[:checked:not(:disabled)+&:hover]:[backgr" +
              "ound-color:color-mix(in_oklch,_var(--primary)_88%,_var(--primary-foreground))] min-w-0 px-0 border-0 " +
              "border-none rounded-none bg-transparent text-primary underline [text-underline-offset:0.2em] before:c" +
              "ontent-none after:content-none [&:is(a)]:underline-offset-4 hover:bg-transparent focus-visible:[outli" +
              "ne:2px_solid_var(--ring)] focus-visible:[outline-offset:3px] justify-self-start"
            }
            variant="link"
          >
            Mina Chen
          </Button>
        </ItemContent>
        <ItemMetadata className="col-[2] row-[2] text-muted-foreground text-sm">Design · Updated today</ItemMetadata>
        <ItemActions
          className="
            inline-flex col-[3] row-[1_/_span_2] items-center justify-self-end gap-2 max-[28rem]:col-[2]
            max-[28rem]:row-[3] max-[28rem]:justify-self-start
          "
        >
          <Button
            className={
              "relative isolate inline-flex items-center justify-center gap-1.5 min-h-10 min-w-10 px-5 py-px border-" +
              "[length:var(--border-width)] border-solid border-transparent rounded-full bg-clip-padding text-base f" +
              "ont-medium leading-6 no-underline cursor-pointer [transition:var(--transition-colors)] focus-visible:" +
              "[outline:none] focus-visible:[box-shadow:0_0_0_var(--ring-width)_color-mix(in_oklch,_var(--ring)_20%," +
              "_transparent)] disabled:opacity-50 disabled:cursor-not-allowed data-[disabled]:opacity-50 data-[disab" +
              "led]:cursor-not-allowed [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:[--uiify-butt" +
              "on-rim:rgb(255_255_255_/_20%)] [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:[--uii" +
              "fy-button-wash:rgb(255_255_255_/_15%)] [&:is([data-selected],[aria-pressed=true],[aria-current=page])" +
              "]:border-transparent [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:bg-primary [&:is" +
              "([data-selected],[aria-pressed=true],[aria-current=page])]:text-primary-foreground [:checked+&]:[--ui" +
              "ify-button-rim:rgb(255_255_255_/_20%)] [:checked+&]:[--uiify-button-wash:rgb(255_255_255_/_15%)] [:ch" +
              "ecked+&]:border-transparent [:checked+&]:bg-primary [:checked+&]:text-primary-foreground [@media_(any" +
              "-hover:_hover)_and_(any-pointer:_fine)]:[&:is([data-selected],[aria-pressed=true],[aria-current=page]" +
              "):hover:not(:disabled,[data-disabled])]:[background-color:color-mix(in_oklch,_var(--primary)_88%,_var" +
              "(--primary-foreground))] [@media_(any-hover:_hover)_and_(any-pointer:_fine)]:[:checked:not(:disabled)" +
              "+&:hover]:[background-color:color-mix(in_oklch,_var(--primary)_88%,_var(--primary-foreground))] [--ui" +
              "ify-button-rim:color-mix(in_oklch,_var(--foreground)_25%,_transparent)] [border-color:color-mix(in_ok" +
              "lch,_var(--foreground)_20%,_transparent)] bg-transparent text-foreground before:content-none after:[i" +
              "nset:calc(-1_*_var(--border-width))] after:[padding:var(--border-width)] hover:[&:not(:disabled,[data" +
              "-disabled])]:[background-color:color-mix(in_oklch,_var(--foreground)_10%,_transparent)] active:[&:not" +
              "(:disabled,[data-disabled])]:[background-color:color-mix(in_oklch,_var(--foreground)_16%,_transparent" +
              ")]"
            }
            disabled
            size="sm"
            type="button"
            variant="outline"
          >
            Email
          </Button>
        </ItemActions>
      </Item>
      <Item
        className="
          grid grid-cols-[auto_minmax(0,_1fr)_auto] grid-rows-[auto_auto] items-center gap-[0.25rem_0.875rem] min-w-0
          py-4 px-3 max-[28rem]:grid-cols-[auto_minmax(0,_1fr)] max-[28rem]:items-start max-[28rem]:gap-x-3
        "
      >
        <ItemMedia className="inline-flex col-[1] row-[1_/_span_2] shrink-0 items-center justify-center">
          <Avatar
            className="
              inline-grid place-items-center overflow-clip rounded-[var(--radius-full)] bg-muted text-muted-foreground
              font-[number:var(--weight-medium)] leading-none [vertical-align:middle] data-[size=sm]:[inline-size:2rem]
              data-[size=sm]:[block-size:2rem] data-[size=sm]:text-xs
              [&:is(:not([data-size]),[data-size=md])]:[inline-size:2.5rem]
              [&:is(:not([data-size]),[data-size=md])]:[block-size:2.5rem]
              [&:is(:not([data-size]),[data-size=md])]:text-sm data-[size=lg]:[inline-size:3rem]
              data-[size=lg]:[block-size:3rem] data-[size=lg]:text-base
            "
            aria-hidden="true"
            fallback="SR"
            name="Sam Rivera"
            size="sm"
            slotProps={{ image: { className: "block [inline-size:100%] [block-size:100%] object-cover" } }}
          />
        </ItemMedia>
        <ItemContent className="grid col-[2] row-[1] min-w-0 gap-1 [overflow-wrap:anywhere]">
          <Button
            as="span"
            className={
              "relative isolate inline-flex items-center justify-center gap-1.5 min-h-10 py-px border-transparent bg" +
              "-clip-padding text-base font-medium leading-6 cursor-pointer [transition:var(--transition-colors)] fo" +
              "cus-visible:[box-shadow:0_0_0_var(--ring-width)_color-mix(in_oklch,_var(--ring)_20%,_transparent)] di" +
              "sabled:opacity-50 disabled:cursor-not-allowed data-[disabled]:opacity-50 data-[disabled]:cursor-not-a" +
              "llowed [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:[--uiify-button-rim:rgb(255_25" +
              "5_255_/_20%)] [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:[--uiify-button-wash:rg" +
              "b(255_255_255_/_15%)] [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:border-transpar" +
              "ent [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:bg-primary [&:is([data-selected]," +
              "[aria-pressed=true],[aria-current=page])]:text-primary-foreground [:checked+&]:[--uiify-button-rim:rg" +
              "b(255_255_255_/_20%)] [:checked+&]:[--uiify-button-wash:rgb(255_255_255_/_15%)] [:checked+&]:border-t" +
              "ransparent [:checked+&]:bg-primary [:checked+&]:text-primary-foreground [@media_(any-hover:_hover)_an" +
              "d_(any-pointer:_fine)]:[&:is([data-selected],[aria-pressed=true],[aria-current=page]):hover:not(:disa" +
              "bled,[data-disabled])]:[background-color:color-mix(in_oklch,_var(--primary)_88%,_var(--primary-foregr" +
              "ound))] [@media_(any-hover:_hover)_and_(any-pointer:_fine)]:[:checked:not(:disabled)+&:hover]:[backgr" +
              "ound-color:color-mix(in_oklch,_var(--primary)_88%,_var(--primary-foreground))] min-w-0 px-0 border-0 " +
              "border-none rounded-none bg-transparent text-primary underline [text-underline-offset:0.2em] before:c" +
              "ontent-none after:content-none [&:is(a)]:underline-offset-4 hover:bg-transparent focus-visible:[outli" +
              "ne:2px_solid_var(--ring)] focus-visible:[outline-offset:3px] justify-self-start"
            }
            variant="link"
          >
            Sam Rivera
          </Button>
        </ItemContent>
        <ItemMetadata className="col-[2] row-[2] text-muted-foreground text-sm">
          Engineering · Updated yesterday
        </ItemMetadata>
        <ItemActions
          className="
            inline-flex col-[3] row-[1_/_span_2] items-center justify-self-end gap-2 max-[28rem]:col-[2]
            max-[28rem]:row-[3] max-[28rem]:justify-self-start
          "
        >
          <Button
            className={
              "relative isolate inline-flex items-center justify-center gap-1.5 min-h-10 min-w-10 px-5 py-px border-" +
              "[length:var(--border-width)] border-solid border-transparent rounded-full bg-clip-padding text-base f" +
              "ont-medium leading-6 no-underline cursor-pointer [transition:var(--transition-colors)] focus-visible:" +
              "[outline:none] focus-visible:[box-shadow:0_0_0_var(--ring-width)_color-mix(in_oklch,_var(--ring)_20%," +
              "_transparent)] disabled:opacity-50 disabled:cursor-not-allowed data-[disabled]:opacity-50 data-[disab" +
              "led]:cursor-not-allowed [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:[--uiify-butt" +
              "on-rim:rgb(255_255_255_/_20%)] [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:[--uii" +
              "fy-button-wash:rgb(255_255_255_/_15%)] [&:is([data-selected],[aria-pressed=true],[aria-current=page])" +
              "]:border-transparent [&:is([data-selected],[aria-pressed=true],[aria-current=page])]:bg-primary [&:is" +
              "([data-selected],[aria-pressed=true],[aria-current=page])]:text-primary-foreground [:checked+&]:[--ui" +
              "ify-button-rim:rgb(255_255_255_/_20%)] [:checked+&]:[--uiify-button-wash:rgb(255_255_255_/_15%)] [:ch" +
              "ecked+&]:border-transparent [:checked+&]:bg-primary [:checked+&]:text-primary-foreground [@media_(any" +
              "-hover:_hover)_and_(any-pointer:_fine)]:[&:is([data-selected],[aria-pressed=true],[aria-current=page]" +
              "):hover:not(:disabled,[data-disabled])]:[background-color:color-mix(in_oklch,_var(--primary)_88%,_var" +
              "(--primary-foreground))] [@media_(any-hover:_hover)_and_(any-pointer:_fine)]:[:checked:not(:disabled)" +
              "+&:hover]:[background-color:color-mix(in_oklch,_var(--primary)_88%,_var(--primary-foreground))] [--ui" +
              "ify-button-rim:color-mix(in_oklch,_var(--foreground)_25%,_transparent)] [border-color:color-mix(in_ok" +
              "lch,_var(--foreground)_20%,_transparent)] bg-transparent text-foreground before:content-none after:[i" +
              "nset:calc(-1_*_var(--border-width))] after:[padding:var(--border-width)] hover:[&:not(:disabled,[data" +
              "-disabled])]:[background-color:color-mix(in_oklch,_var(--foreground)_10%,_transparent)] active:[&:not" +
              "(:disabled,[data-disabled])]:[background-color:color-mix(in_oklch,_var(--foreground)_16%,_transparent" +
              ")]"
            }
            disabled
            size="sm"
            type="button"
            variant="outline"
          >
            Email
          </Button>
        </ItemActions>
      </Item>
    </ul>
  );
}

API

Item

מאפייןטיפוסברירת מחדלתיאור
childrenReactNode—מדיה, תוכן ראשי, מטא-נתונים ופעולות אופציונליות.
className / style / ref / native li propsnative li props—המאפיינים, הסגנונות, האירועים וה-ref של פריט הרשימה המובנה מועברים הלאה.
renderReactElement | ((props, state) => ReactElement)—החלפת האלמנט המוצג תוך שימור ההתנהגות וקישורי הנגישות.

ItemMedia

מאפייןטיפוסברירת מחדלתיאור
childrenReactNode—תוכן לחלק תצוגה זה של הפריט.
renderReactElement | ((props, state) => ReactElement)—החלפת האלמנט המוצג תוך שימור ההתנהגות וקישורי הנגישות.

ItemContent

מאפייןטיפוסברירת מחדלתיאור
childrenReactNode—תוכן לחלק תצוגה זה של הפריט.
renderReactElement | ((props, state) => ReactElement)—החלפת האלמנט המוצג תוך שימור ההתנהגות וקישורי הנגישות.

ItemMetadata

מאפייןטיפוסברירת מחדלתיאור
childrenReactNode—תוכן לחלק תצוגה זה של הפריט.
renderReactElement | ((props, state) => ReactElement)—החלפת האלמנט המוצג תוך שימור ההתנהגות וקישורי הנגישות.

ItemActions

מאפייןטיפוסברירת מחדלתיאור
childrenReactNode—תוכן לחלק תצוגה זה של הפריט.
renderReactElement | ((props, state) => ReactElement)—החלפת האלמנט המוצג תוך שימור ההתנהגות וקישורי הנגישות.

מקלדת

מקשפעולה

נגישות

Item מרנדר פריט רשימה; מקמו אותו בתוך ul או ol מובנה. החלקים מיועדים לתצוגה. שמרו על קישורים וכפתורים כפקדים נפרדים; אל תהפכו את כל השורה לקישור או לכפתור אחד. עבור ItemMedia, בחרו טקסט alt משמעותי או alt ריק כאשר המדיה דקורטיבית.

נקודות חיבור לעיצוב

data-uiify-itemdata-uiify-item-mediadata-uiify-item-contentdata-uiify-item-metadatadata-uiify-item-actionsdata-part
דף זה תורגם אוטומטית וטרם נבדק.