דילוג לתוכן
uiify

Field

מעטפת לתווית, לפקד ולהודעת שגיאה.

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

מגרש ניסויים

Field

ברירת מחדל

Your display name

Invalid

Password

Use at least eight characters.

Message

Up to 500 characters.

מושבת

Read only

import { Field } from "@gunkin/uiify";

export default function Example() {
  return (
    <Field.Root className="" id="email" required>
      <Field.Label className="" fieldId="email" required>
        Email
      </Field.Label>
      <Field.Control className="" fieldId="email" required as="input" type="email" />
      <Field.Description className="" fieldId="email">
        We will only use this for account notices.
      </Field.Description>
      <Field.Error className="" fieldId="email">
        Enter a valid email address.
      </Field.Error>
    </Field.Root>
  );
}
/* Text fields — Input and Textarea share the same surface. Invalid state keys
   off the [data-invalid] attribute the components emit. Textarea autosize uses
   the native field-sizing (Chrome 123+) when the component sets data-autosize. */

@layer components {
  :where([data-uiify-input], [data-uiify-textarea]) {
    display: block;
    inline-size: 100%;
    max-inline-size: 24rem;
    padding-block: var(--space-sm);
    padding-inline: var(--space-md);
    border: var(--border-width) solid var(--input);
    border-radius: var(--radius-md);
    background-color: var(--card);
    color: var(--foreground);
    font-size: var(--uiify-control-text);
    line-height: var(--leading-normal);
    transition: var(--transition-colors);
  }

  :where([data-uiify-input], [data-uiify-textarea])::placeholder {
    color: var(--muted-foreground);
  }

  :where([data-uiify-input], [data-uiify-textarea]):focus-visible {
    border-color: var(--primary);
  }

  :where([data-uiify-input], [data-uiify-textarea]):disabled,
  :where([data-uiify-input], [data-uiify-textarea])[data-disabled] {
    opacity: 0.5;
    cursor: not-allowed;
  }

  :where([data-uiify-input], [data-uiify-textarea])[data-invalid],
  :where([data-uiify-input], [data-uiify-textarea]):user-invalid {
    border-color: var(--destructive);
  }

  :where([data-uiify-input], [data-uiify-textarea])[data-invalid]:focus-visible {
    outline-color: var(--destructive);
  }

  /* Input is a pill sized like Button: --control-md tall and base text. Textarea keeps its own
     rounded rectangle. */
  [data-uiify-input] {
    box-sizing: border-box;
    block-size: var(--uiify-control-size, var(--control-md));
    padding-block: 0;
    padding-inline: var(--space-lg);
    border-radius: var(--radius-full);
    font-size: var(--uiify-control-font, var(--text-base));
  }

  [data-uiify-textarea] {
    min-block-size: 4lh;
    resize: block;
  }

  [data-uiify-textarea][data-autosize] {
    field-sizing: content;
    resize: none;
  }

  [data-uiify-field] {
    display: grid;
    gap: var(--space-sm);
    inline-size: 100%;
    max-inline-size: 24rem;
  }

  [data-uiify-field] [data-part="label"] {
    color: var(--foreground);
    font-size: var(--text-sm);
    font-weight: var(--weight-medium);
    line-height: var(--leading-normal);
  }

  [data-uiify-field] [data-part="label"][data-required]::after {
    content: " *";
    color: var(--destructive);
  }

  [data-uiify-field] [data-part="description"] {
    margin: 0;
    color: var(--muted-foreground);
    font-size: var(--text-xs);
    line-height: var(--leading-normal);
  }

  [data-uiify-field] [data-part="error"] {
    margin: 0;
    color: var(--destructive);
    font-size: var(--text-xs);
    line-height: var(--leading-normal);
  }

  /* Shared presence fade when an error message is mounted. */
  @media (prefers-reduced-motion: no-preference) {
    [data-uiify-field] [data-part="error"] {
      transition: opacity var(--duration-fast) var(--ease-out);
    }

    @starting-style {
      [data-uiify-field] [data-part="error"] {
        opacity: 0;
      }
    }
  }
}
import { Field } from "@gunkin/uiify";

export default function Example() {
  return (
    <Field.Root className="grid gap-sm [inline-size:100%] [max-inline-size:24rem]" id="email" required>
      <Field.Label
        className={
          "text-foreground text-sm font-[number:var(--weight-medium)] [line-height:var(--leading-normal)] data-[requ" +
          "ired]:after:content-[\"_*\"] data-[required]:after:text-destructive"
        }
        fieldId="email"
        required
      >
        Email
      </Field.Label>
      <Field.Control
        className="
          focus-visible:[outline:none]
          focus-visible:[box-shadow:0_0_0_var(--ring-width)_color-mix(in_oklch,_var(--ring)_20%,_transparent)] block
          [inline-size:100%] [max-inline-size:24rem] box-border [block-size:var(--control-md)] py-0 px-lg
          border-[length:var(--border-width)] border-solid border-input rounded-full bg-card text-foreground
          [font-size:var(--text-base)] [line-height:var(--leading-normal)] [transition:var(--transition-colors)]
          placeholder:text-muted-foreground focus-visible:border-primary disabled:opacity-50 disabled:cursor-not-allowed
          data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed data-[invalid]:border-destructive
          user-invalid:border-destructive data-[invalid]:focus-visible:outline-destructive
        "
        fieldId="email"
        required
        as="input"
        type="email"
      />
      <Field.Description
        className="m-0 text-muted-foreground text-xs [line-height:var(--leading-normal)]"
        fieldId="email"
      >
        We will only use this for account notices.
      </Field.Description>
      <Field.Error
        className="
          m-0 text-destructive text-xs [line-height:var(--leading-normal)] motion-safe:transition-opacity
          motion-safe:starting:opacity-0
        "
        fieldId="email"
      >
        Enter a valid email address.
      </Field.Error>
    </Field.Root>
  );
}

API

Field.Root

מאפייןטיפוסברירת מחדלתיאור
id*string—מזהה יציב שכל חלק מעביר בחזרה כ-fieldId, כדי שהתווית, הפקד, התיאור והשגיאה יקושרו זה לזה ב-HTML מהשרת.
invalidbooleanfalseמסמן את השדה כלא תקין וחושף data-invalid לצורך עיצוב.
requiredbooleanfalseמסמן את השדה כנדרש וחושף data-required לצורך עיצוב.
disabledbooleanfalseמסמן את השדה כמושבת וחושף data-disabled לצורך עיצוב.
namestring—מתקבל לצורך תאימות API; השם שייך לפקד ואינו מוצג על המעטפת.
renderReactElement | ((props, state) => ReactElement)—החלפת האלמנט המוצג תוך שימור ההתנהגות וקישורי הנגישות.

Field.Label

מאפייןטיפוסברירת מחדלתיאור
className / style / ref / native label propsnative label props—המאפיינים, הסגנונות, האירועים וה-ref של האלמנט המובנה מועברים הלאה.
fieldId*string—אותו מזהה שניתן ל-Field.Root, שממנו נגזר htmlFor המפנה לפקד.
disabledbooleanfalseמסמן את התווית כמושבתת וחושף data-disabled לצורך עיצוב.
requiredbooleanfalseמסמן את התווית כנדרשת וחושף data-required לצורך עיצוב.

Field.Control

מאפייןטיפוסברירת מחדלתיאור
asElementType"div"ניתן להשתמש ב-input, textarea, select או פקד מותאם אישית. מאפיינים מובנים, מטפלי אירועים, style ו-ref מועברים הלאה.
type / name / autoComplete / minLength / maxLength / pattern / readOnlynative control props—אפשרויות הקלט שייכות ל-Field.Control, לרבות type="password". נשמרת ההתנהגות התקנית של אימות ושל FormData.
fieldId*string—אותו מזהה שניתן ל-Field.Root, שממנו נגזרים מזהה הפקד והקישורים שלו באמצעות aria-labelledby ו-aria-describedby.
disabledbooleanfalseמעביר disabled מובנה ל-input, textarea ו-select, וחושף data-disabled.
invalidbooleanfalseמגדיר aria-invalid ומוסיף את הודעת השגיאה ל-aria-describedby של הפקד.
requiredbooleanfalseמעביר required מובנה ל-input, textarea ו-select, ומגדיר aria-required.
renderReactElement | ((props, state) => ReactElement)—החלפת האלמנט המוצג תוך שימור ההתנהגות וקישורי הנגישות.

Field.Description

מאפייןטיפוסברירת מחדלתיאור
className / style / ref / native p propsnative p props—המאפיינים, הסגנונות, האירועים וה-ref של האלמנט המובנה מועברים הלאה.
fieldId*string—אותו מזהה שניתן ל-Field.Root, שממנו נגזר מזהה התיאור שהפקד מפנה אליו.
disabledbooleanfalseמסמן את התיאור כמושבת וחושף data-disabled לצורך עיצוב.

Field.Error

מאפייןטיפוסברירת מחדלתיאור
className / style / ref / native p propsnative p props—המאפיינים, הסגנונות, האירועים וה-ref של האלמנט המובנה מועברים הלאה.
fieldId*string—אותו מזהה שניתן ל-Field.Root, שממנו נגזר מזהה השגיאה שהפקד מפנה אליו כשהוא לא תקין.
invalidbooleanfalseמציג את הודעת השגיאה; החלק אינו מציג דבר כשהערך false.

מקלדת

מקשפעולה
Tabהעברת המיקוד אל הפקד או ממנו
Enter / Spaceהפעלה כשהפקד ממוקד (פקדים דמויי כפתור)

נגישות

משתמש ב-HTML סמנטי ככל האפשר. בדקו את הסימון המרונדר במגרש הניסויים — ARIA נוסף רק כאשר האלמנטים המובנים אינם מספיקים.

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

data-disabled
דף זה תורגם אוטומטית וטרם נבדק.