import{Field}from"@gunkin/uiify";exportdefaultfunctionExample(){return(<Field.RootclassName=""id="email"required><Field.LabelclassName=""fieldId="email"required> Email</Field.Label><Field.ControlclassName=""fieldId="email"requiredas="input"type="email"/><Field.DescriptionclassName=""fieldId="email"> We will only use this for account notices.</Field.Description><Field.ErrorclassName=""fieldId="email"> Enter a valid email address.</Field.Error></Field.Root>);}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/* 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. */@layercomponents{: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)solidvar(--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:opacityvar(--duration-fast)var(--ease-out);}@starting-style{[data-uiify-field][data-part="error"]{opacity:0;}}}}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import{Field}from"@gunkin/uiify";exportdefaultfunctionExample(){return(<Field.RootclassName="grid gap-sm [inline-size:100%] [max-inline-size:24rem]"id="email"required><Field.LabelclassName={"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.ControlclassName=" 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"requiredas="input"type="email"/><Field.DescriptionclassName="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.ErrorclassName=" 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 מהשרת.
invalid
boolean
false
מסמן את השדה כלא תקין וחושף data-invalid לצורך עיצוב.
required
boolean
false
מסמן את השדה כנדרש וחושף data-required לצורך עיצוב.
disabled
boolean
false
מסמן את השדה כמושבת וחושף data-disabled לצורך עיצוב.
name
string
—
מתקבל לצורך תאימות API; השם שייך לפקד ואינו מוצג על המעטפת.
render
ReactElement | ((props, state) => ReactElement)
—
החלפת האלמנט המוצג תוך שימור ההתנהגות וקישורי הנגישות.
Field.Label
מאפיין
טיפוס
ברירת מחדל
תיאור
className / style / ref / native label props
native label props
—
המאפיינים, הסגנונות, האירועים וה-ref של האלמנט המובנה מועברים הלאה.
fieldId*
string
—
אותו מזהה שניתן ל-Field.Root, שממנו נגזר htmlFor המפנה לפקד.
disabled
boolean
false
מסמן את התווית כמושבתת וחושף data-disabled לצורך עיצוב.
required
boolean
false
מסמן את התווית כנדרשת וחושף data-required לצורך עיצוב.
Field.Control
מאפיין
טיפוס
ברירת מחדל
תיאור
as
ElementType
"div"
ניתן להשתמש ב-input, textarea, select או פקד מותאם אישית. מאפיינים מובנים, מטפלי אירועים, style ו-ref מועברים הלאה.
type / name / autoComplete / minLength / maxLength / pattern / readOnly
native control props
—
אפשרויות הקלט שייכות ל-Field.Control, לרבות type="password". נשמרת ההתנהגות התקנית של אימות ושל FormData.
fieldId*
string
—
אותו מזהה שניתן ל-Field.Root, שממנו נגזרים מזהה הפקד והקישורים שלו באמצעות aria-labelledby ו-aria-describedby.