UNPKG

6.34 kBSCSSView Raw
1/**
2 * Form elements
3 * Alternatives input types (Not Checkboxes & Radios)
4 */
5
6// Color
7[type="color"] {
8 // Wrapper
9 @mixin color-wrapper {
10 padding: 0;
11 }
12
13 &::-webkit-color-swatch-wrapper {
14 @include color-wrapper;
15 }
16
17 &::-moz-focus-inner {
18 @include color-wrapper;
19 }
20
21 // Swatch
22 @mixin color-swatch {
23 border: 0;
24 border-radius: calc(var(--border-radius) * 0.5);
25 }
26
27 &::-webkit-color-swatch {
28 @include color-swatch;
29 }
30
31 &::-moz-color-swatch {
32 @include color-swatch;
33 }
34}
35
36// Date & Time
37// :not() are needed to add Specificity and avoid !important on padding
38input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]) {
39 &:is([type="date"], [type="datetime-local"], [type="month"], [type="time"], [type="week"]) {
40 --icon-position: 0.75rem;
41 --icon-width: 1rem;
42 padding-right: calc(var(--icon-width) + var(--icon-position));
43 background-image: var(--icon-date);
44 background-position: center right var(--icon-position);
45 background-size: var(--icon-width) auto;
46 background-repeat: no-repeat;
47 }
48
49 // Time
50 &[type="time"] {
51 background-image: var(--icon-time);
52 }
53}
54
55// Calendar picker
56[type="date"],
57[type="datetime-local"],
58[type="month"],
59[type="time"],
60[type="week"] {
61 &::-webkit-calendar-picker-indicator {
62 width: var(--icon-width);
63 margin-right: calc(var(--icon-width) * -1);
64 margin-left: var(--icon-position);
65 opacity: 0;
66 }
67}
68
69[dir="rtl"]
70 :is([type="date"], [type="datetime-local"], [type="month"], [type="time"], [type="week"]) {
71 text-align: right;
72}
73
74// File
75[type="file"] {
76 --color: var(--muted-color);
77 padding: calc(var(--form-element-spacing-vertical) * 0.5) 0;
78 border: 0;
79 border-radius: 0;
80 background: none;
81
82 @mixin file-selector-button {
83 --background-color: var(--secondary);
84 --border-color: var(--secondary);
85 --color: var(--secondary-inverse);
86 margin-right: calc(var(--spacing) / 2);
87 margin-left: 0;
88 margin-inline-start: 0;
89 margin-inline-end: calc(var(--spacing) / 2);
90 padding: calc(var(--form-element-spacing-vertical) * 0.5)
91 calc(var(--form-element-spacing-horizontal) * 0.5);
92 border: var(--border-width) solid var(--border-color);
93 border-radius: var(--border-radius);
94 outline: none;
95 background-color: var(--background-color);
96 box-shadow: var(--box-shadow);
97 color: var(--color);
98 font-weight: var(--font-weight);
99 font-size: 1rem;
100 line-height: var(--line-height);
101 text-align: center;
102 cursor: pointer;
103
104 @if $enable-transitions {
105 transition: background-color var(--transition),
106 border-color var(--transition), color var(--transition),
107 box-shadow var(--transition);
108 }
109
110 &:is(:hover, :active, :focus) {
111 --background-color: var(--secondary-hover);
112 --border-color: var(--secondary-hover);
113 }
114 }
115
116 &::file-selector-button {
117 @include file-selector-button;
118 }
119
120 &::-webkit-file-upload-button {
121 @include file-selector-button;
122 }
123
124 &::-ms-browse {
125 @include file-selector-button;
126 }
127}
128
129// Range
130[type="range"] {
131 // Config
132 $height-track: 0.25rem;
133 $height-thumb: 1.25rem;
134 $border-thumb: 2px;
135
136 // Styles
137 -webkit-appearance: none;
138 -moz-appearance: none;
139 appearance: none;
140 width: 100%;
141 height: $height-thumb;
142 background: none;
143
144 // Slider Track
145 @mixin slider-track {
146 width: 100%;
147 height: $height-track;
148 border-radius: var(--border-radius);
149 background-color: var(--range-border-color);
150
151 @if $enable-transitions {
152 transition: background-color var(--transition),
153 box-shadow var(--transition);
154 }
155 }
156
157 &::-webkit-slider-runnable-track {
158 @include slider-track;
159 }
160
161 &::-moz-range-track {
162 @include slider-track;
163 }
164
165 &::-ms-track {
166 @include slider-track;
167 }
168
169 // Slider Thumb
170 @mixin slider-thumb {
171 -webkit-appearance: none;
172 width: $height-thumb;
173 height: $height-thumb;
174 margin-top: #{(-($height-thumb * 0.5) + ($height-track * 0.5))};
175 border: $border-thumb solid var(--range-thumb-border-color);
176 border-radius: 50%;
177 background-color: var(--range-thumb-color);
178 cursor: pointer;
179
180 @if $enable-transitions {
181 transition: background-color var(--transition),
182 transform var(--transition);
183 }
184 }
185 &::-webkit-slider-thumb {
186 @include slider-thumb;
187 }
188
189 &::-moz-range-thumb {
190 @include slider-thumb;
191 }
192
193 &::-ms-thumb {
194 @include slider-thumb;
195 }
196
197 &:hover,
198 &:focus {
199 --range-border-color: var(--range-active-border-color);
200 --range-thumb-color: var(--range-thumb-hover-color);
201 }
202
203 &:active {
204 --range-thumb-color: var(--range-thumb-active-color);
205
206 // Slider Thumb
207 &::-webkit-slider-thumb {
208 transform: scale(1.25);
209 }
210
211 &::-moz-range-thumb {
212 transform: scale(1.25);
213 }
214
215 &::-ms-thumb {
216 transform: scale(1.25);
217 }
218 }
219}
220
221// Search
222// :not() are needed to add Specificity and avoid !important on padding
223input:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]) {
224 &[type="search"] {
225 padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem);
226 border-radius: 5rem;
227 background-image: var(--icon-search);
228 background-position: center left 1.125rem;
229 background-size: 1rem auto;
230 background-repeat: no-repeat;
231
232 &[aria-invalid] {
233 @if $enable-important {
234 padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem) !important;
235 }
236 @else {
237 padding-inline-start: calc(var(--form-element-spacing-horizontal) + 1.75rem);
238 }
239 background-position: center left 1.125rem, center right 0.75rem;
240 }
241
242 &[aria-invalid="false"] {
243 background-image: var(--icon-search), var(--icon-valid);
244 }
245
246 &[aria-invalid="true"] {
247 background-image: var(--icon-search), var(--icon-invalid);
248 }
249 }
250}
251
252// Cancel button
253[type="search"] {
254 &::-webkit-search-cancel-button {
255 -webkit-appearance: none;
256 display: none;
257 }
258}
259
260[dir="rtl"] {
261 :where(input) {
262 &:not([type="checkbox"], [type="radio"], [type="range"], [type="file"]) {
263 &[type="search"] {
264 background-position: center right 1.125rem;
265
266 &[aria-invalid] {
267 background-position: center right 1.125rem, center left 0.75rem;
268 }
269 }
270 }
271 }
272}