x
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
<!-- Text Field -->
<input type="text" name="text_field" id="text_field" class="input" />
<!-- Email Field -->
<input type="email" name="email_field" id="email_field" class="input" />
<!-- Email Field With Multiple -->
<input type="email" name="email_field_with_multiple" id="email_field_with_multiple" multiple="multiple" class="input" />
<!-- Search Field -->
<input type="search" name="search_field" id="search_field" class="input" />
<!-- Integer Field -->
<input type="number" name="integer_field" id="integer_field" min="0" max="30" inputmode="numeric" class="input" />
<!-- Decimal Field -->
<input type="number" name="decimal_field" id="decimal_field" step="0.01" inputmode="decimal" class="input" />
<!-- Date Field -->
<input type="date" name="date_field" id="date_field" class="input" />
<!-- Datetime Field -->
<input class="input" type="datetime-local" name="datetime_field[]" id="datetime_field_" />
<!-- Time Field -->
<input list="predefined_times" class="input" type="time" name="time_field[]" id="time_field_" />
<datalist id="predefined_times"><option value="12:00">12:00</option>
<option value="12:30">12:30</option>
<option value="14:00">14:00</option>
<option value="14:30">14:30</option>
<option value="15:00">15:00</option></datalist>
<!-- File Field -->
<input type="file" name="file_field" id="file_field" accept="image/*" class="input" />
<!-- File Field With Multiple -->
<input type="file" name="file_field_with_multiple" id="file_field_with_multiple" accept="image/*" multiple="multiple" class="input" />
<!-- Autocomplete Field -->
<input type="text" name="autocomplete_field" id="autocomplete_field" list="ice_cream_flavors" class="input" />
<datalist id="ice_cream_flavors"><option value="Chocolate">Chocolate</option>
<option value="Coconut">Coconut</option>
<option value="Mint">Mint</option>
<option value="Strawberry">Strawberry</option>
<option value="Vanilla">Vanilla</option></datalist>
<!-- Color Field -->
<input type="color" name="color_field" id="color_field" list="predefined_colors" class="input" style="--input-block-size: 2.25rem" />
<datalist id="predefined_colors"><option value="#ede9fe">#ede9fe</option>
<option value="#ddd6fe">#ddd6fe</option>
<option value="#c4b5fd">#c4b5fd</option>
<option value="#a78bfa">#a78bfa</option>
<option value="#8b5cf6">#8b5cf6</option></datalist>
<!-- Actor Field -->
<label class="input input--actor flex items-center gap">
<img aria-hidden="true" src="/assets/search-fe0b57ec.svg" width="16" height="16" />
<input type="text" name="actor_field" id="actor_field" />
</label>
<!-- Disabled Field -->
<input type="text" name="disabled_field" id="disabled_field" disabled="disabled" class="input" />
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
<%# Text Field %>
<%= text_field_tag "text_field", nil, class: "input" %>
<%# Email Field %>
<%= email_field_tag "email_field", nil, class: "input" %>
<%# Email Field With Multiple %>
<%= email_field_tag "email_field_with_multiple", nil, multiple: true, class: "input" %>
<%# Search Field %>
<%= search_field_tag "search_field", nil, class: "input" %>
<%# Integer Field %>
<%= number_field_tag "integer_field", nil, min: 0, max: 30, inputmode: :numeric, class: "input" %>
<%# Decimal Field %>
<%= number_field_tag "decimal_field", nil, step: "0.01", inputmode: :decimal, class: "input" %>
<%# Date Field %>
<%= date_field_tag "date_field", nil, class: "input" %>
<%# Datetime Field %>
<%= datetime_field "datetime_field", nil, class: "input" %>
<%# Time Field %>
<%= time_field "time_field", nil, list: "predefined_times", class: "input" %>
<%= tag.datalist options_for_select(["12:00", "12:30", "14:00", "14:30", "15:00"]), id: "predefined_times" %>
<%# File Field %>
<%= file_field_tag "file_field", accept: "image/*", class: "input" %>
<%# File Field With Multiple %>
<%= file_field_tag "file_field_with_multiple", accept: "image/*", multiple: true, class: "input" %>
<%# Autocomplete Field %>
<%= text_field_tag "autocomplete_field", nil, list: "ice_cream_flavors", class: "input" %>
<%= tag.datalist options_for_select(["Chocolate", "Coconut", "Mint", "Strawberry", "Vanilla"]), id: "ice_cream_flavors" %>
<%# Color Field %>
<%= color_field_tag "color_field", nil, list: "predefined_colors", class: "input", style: "--input-block-size: 2.25rem" %>
<%= tag.datalist options_for_select(["#ede9fe", "#ddd6fe", "#c4b5fd", "#a78bfa", "#8b5cf6"]), id: "predefined_colors" %>
<%# Actor Field %>
<label class="input input--actor flex items-center gap">
<%= image_tag "search.svg", size: 16, aria: { hidden: true } %>
<%= text_field_tag "actor_field", nil %>
</label>
<%# Disabled Field %>
<%= text_field_tag "disabled_field", nil, disabled: true, class: "input" %>
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
.input {
appearance: none;
background-color: var(--input-background, transparent);
block-size: var(--input-block-size, auto);
border: 1px solid var(--input-border-color, var(--color-border));
border-radius: var(--input-radius, var(--rounded-md));
box-shadow: var(--input-box-shadow, var(--shadow-xs));
font-size: var(--input-font-size, var(--text-sm));
inline-size: var(--input-inline-size, var(--size-full));
padding: var(--input-padding, .375rem .75rem);
&:is(textarea[rows=auto]) {
field-sizing: content;
max-block-size: calc(.875rem + var(--input-max-rows, 10lh));
min-block-size: calc(.875rem + var(--input-rows, 2lh));
}
&:is(select):not([multiple], [size]) {
background-image: url("select-arrow.svg");
background-position: center right var(--size-2);
background-repeat: no-repeat;
background-size: var(--size-4) auto;
}
&::file-selector-button {
font-weight: var(--font-medium);
}
&:user-invalid {
border-color: var(--color-negative);
}
&:user-invalid ~ .invalid-feedback {
display: flex;
}
&:disabled {
cursor: not-allowed;
opacity: var(--opacity-50);
}
}
.input--actor {
input {
border: 0; inline-size: 100%; outline: 0;
}
img:not([class]) {
filter: var(--input-icon-color, var(--color-filter-text));
}
&:focus-within {
outline: var(--input-outline-size, 2px) solid var(--color-selected-dark);
}
}
.invalid-feedback {
display: none;
}
:is(.checkbox, .radio) {
transform: scale(1.2);
}
:is(.checkbox, .radio, .range) {
accent-color: var(--color-primary);
}
:is(.input, .checkbox, .radio, .range) {
&:focus-visible {
outline: var(--input-outline-size, 2px) solid var(--color-selected-dark);
}
&:focus-visible:user-invalid {
outline: none;
}
.field_with_errors & {
border-color: var(--color-negative);
display: contents;
}
}
Java Script is not required or multiple files are needed, check the notes.