vanilla-jui 1.3.9 → 1.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/index.umd.js +1 -1
  3. package/dist/style.css +1 -1
  4. package/package.json +3 -2
  5. package/src/components/accordion.js +373 -0
  6. package/src/components/components.js +0 -0
  7. package/src/components/drop.js +437 -0
  8. package/src/components/flow.js +1133 -0
  9. package/src/components/form.js +585 -0
  10. package/src/components/icons.js +83 -0
  11. package/src/components/menu.js +422 -0
  12. package/src/components/modal.js +1174 -0
  13. package/src/components/offcanvas.js +332 -0
  14. package/src/components/pagination.js +536 -0
  15. package/src/components/parabola.js +295 -0
  16. package/src/components/sticky.js +271 -0
  17. package/src/components/swiper.js +1123 -0
  18. package/src/components/tabs.js +746 -0
  19. package/src/components/theme.js +353 -0
  20. package/src/components/toast.js +329 -0
  21. package/src/components/toc.js +226 -0
  22. package/src/components/tooltip.js +86 -0
  23. package/src/components/validator.js +586 -0
  24. package/src/core/Component.js +248 -0
  25. package/src/css/accordion.css +72 -0
  26. package/src/css/animation.css +177 -0
  27. package/src/css/avatar.css +62 -0
  28. package/src/css/badge.css +66 -0
  29. package/src/css/breadcrumb.css +106 -0
  30. package/src/css/button.css +296 -0
  31. package/src/css/card.css +151 -0
  32. package/src/css/color.css +1163 -0
  33. package/src/css/color_p3.css +1172 -0
  34. package/src/css/components.css +26 -0
  35. package/src/css/content.css +716 -0
  36. package/src/css/divider.css +9 -0
  37. package/src/css/drop.css +28 -0
  38. package/src/css/flow.css +86 -0
  39. package/src/css/font.css +23 -0
  40. package/src/css/form.css +919 -0
  41. package/src/css/gradient.css +224 -0
  42. package/src/css/icon.css +63 -0
  43. package/src/css/index.css +12 -0
  44. package/src/css/layout.css +782 -0
  45. package/src/css/loading.css +38 -0
  46. package/src/css/menu.css +564 -0
  47. package/src/css/modal.css +94 -0
  48. package/src/css/offcanvas.css +104 -0
  49. package/src/css/pagination.css +25 -0
  50. package/src/css/popup.css +69 -0
  51. package/src/css/skeleton.css +76 -0
  52. package/src/css/status.css +56 -0
  53. package/src/css/swiper.css +160 -0
  54. package/src/css/table.css +52 -0
  55. package/src/css/tabs.css +95 -0
  56. package/src/css/tag.css +97 -0
  57. package/src/css/theme-palette.css +59 -0
  58. package/src/css/tip.css +84 -0
  59. package/src/css/toast.css +154 -0
  60. package/src/css/toc.css +38 -0
  61. package/src/css/tokens.css +1295 -0
  62. package/src/css/toolbar.css +115 -0
  63. package/src/css/tooltip.css +19 -0
  64. package/src/icons/index.js +30 -0
  65. package/src/index.js +45 -0
  66. package/src/locales/index.js +45 -0
  67. package/src/locales/index.min.js +1 -0
  68. package/src/utilities/browser.js +111 -0
  69. package/src/utilities/cache.js +159 -0
  70. package/src/utilities/core.js +502 -0
  71. package/src/utilities/debug.js +103 -0
  72. package/src/utilities/dom.js +313 -0
  73. package/src/utilities/events.js +69 -0
  74. package/src/utilities/http.js +30 -0
  75. package/src/utilities/legacy-dom.js +179 -0
  76. package/src/utilities/storage.js +46 -0
@@ -0,0 +1,919 @@
1
+ @layer form {
2
+
3
+ .j-form,
4
+ .j-form .form-item,
5
+ .j-form .form-item .item-label {
6
+ display: flex;
7
+ }
8
+
9
+ .j-form.is-vertical {
10
+ flex-direction: column;
11
+ gap: var(--form-gap-vertical, var(--s2));
12
+ }
13
+
14
+ .j-form.is-horizontal {
15
+ flex-direction: row;
16
+ gap: var(--form-gap-horizontal, var(--s2));
17
+ }
18
+
19
+ .j-form .form-item {
20
+ gap: var(--form-label-gap, var(--space));
21
+ margin: 0;
22
+ }
23
+
24
+ .j-form.is-item-vertical .form-item {
25
+ flex-direction: column;
26
+ }
27
+
28
+ .j-form.is-item-horizontal .form-item {
29
+ flex-direction: row;
30
+ }
31
+
32
+ .j-form .form-item .item-label {
33
+ color: var(--form-item-label-color, var(--ui-fg-muted));
34
+ font-size: var(--form-item-label-size, var(--font-size-sm));
35
+ }
36
+
37
+ .j-form .form-item .item-label,
38
+ .j-form .form-item .form-control {
39
+ gap: var(--form-label-gap, var(--space));
40
+ }
41
+
42
+ .j-form.is-horizontal .form-item .item-label {
43
+ align-items: center;
44
+ height: var(--horizontal-form-label-height, var(--el-height-md));
45
+ }
46
+
47
+ label.is-required::after {
48
+ content: '*';
49
+ color: var(--required-color, var(--state-danger));
50
+ }
51
+
52
+ .j-form .form-item .form-control {
53
+ display: flex;
54
+ flex-direction: column;
55
+ margin: 0;
56
+ }
57
+
58
+ .j-form .form-item .form-control .help-block {
59
+ font-size: var(--form-help-block-font-size, var(--font-size-sm));
60
+ color: var(--form-help-block-color, var(--ui-fg-soft));
61
+ margin: 0;
62
+ }
63
+
64
+ .j-form .form-item .form-control .help-block.is-invalid {
65
+ color: var(--state-danger);
66
+ }
67
+
68
+ .j-form .form-buttons {
69
+ display: flex;
70
+ gap: var(--form-buttons-gap, var(--s2));
71
+ margin: 0;
72
+ }
73
+
74
+ /* input */
75
+ .j-input:not([type='checkbox']) {
76
+ display: block;
77
+ padding: var(--input-padding, calc(var(--space) * 1.5) var(--s2));
78
+ border-width: var(--input-border-width, 1px);
79
+ border-style: var(--input-border-style, solid);
80
+ border-color: var(--input-border-color, var(--ui-input-border));
81
+ border-radius: var(--input-border-radius, var(--radius-md));
82
+ height: var(--input-height, var(--el-height-md));
83
+ line-height: var(--input-line-height, var(--line-height));
84
+ box-shadow: var(--input-box-shadow, var(--shadow-sm));
85
+ background-color: inherit;
86
+ color: inherit;
87
+ }
88
+
89
+ .j-input:not([type='file']) {
90
+ font-size: var(--input-font-size, var(--font-size-md));
91
+ }
92
+
93
+ .j-input.is-sm {
94
+ height: var(--input-height-sm, var(--el-height-sm));
95
+ font-size: var(--input-font-size-sm, var(--font-size-sm, 0.75rem));
96
+ line-height: var(--input-line-height-sm, var(--line-height-self));
97
+ }
98
+
99
+ .j-input.is-lg {
100
+ height: var(--input-height-lg, var(--el-height-lg));
101
+ font-size: var(--input-font-size-lg, var(--font-size-lg, 1rem));
102
+ line-height: var(--input-line-height-lg, var(--line-height));
103
+ }
104
+
105
+ /* type file */
106
+ .j-input[type='file'] {
107
+ appearance: none;
108
+ background-clip: padding-box;
109
+ overflow: hidden;
110
+ cursor: pointer;
111
+ }
112
+
113
+ .j-input[type='file'] {
114
+ font-size: var(--font-size-sm);
115
+ }
116
+
117
+ .j-input[type='file']::file-selector-button,
118
+ html.j-font-sm .j-input[type='file']::file-selector-button {
119
+ appearance: none;
120
+ border-width: 0;
121
+ border-inline-end-width: 1px;
122
+ border-radius: 0;
123
+ margin: calc(var(--space) * -2);
124
+ margin-inline-end: var(--s2);
125
+ padding: var(--s2);
126
+ border-color: var(--input-border-color, var(--ui-input-border));
127
+ background-color: var(--ui-surface-subtle);
128
+ font-size: var(--font-size-sm, 0.75rem);
129
+ }
130
+
131
+ html.j-font-md .j-input[type='file']::file-selector-button {
132
+ margin-inline-end: calc(var(--space) * 2.75);
133
+ padding: calc(var(--space) * 2.75);
134
+ }
135
+
136
+ /* input style */
137
+ .j-input.is-line:not([type='checkbox']) {
138
+ border-top-color: transparent;
139
+ border-left-color: transparent;
140
+ border-right-color: transparent;
141
+ padding-left: 0;
142
+ padding-right: 0;
143
+ }
144
+
145
+ .j-input.is-ghost:not([type='checkbox']) {
146
+ border-color: transparent;
147
+ background-color: var(--tone-subtle);
148
+ }
149
+
150
+ .j-input.is-blank:not([type='checkbox']) {
151
+ border-color: transparent;
152
+ padding-left: 0;
153
+ padding-right: 0;
154
+ }
155
+
156
+ /* input validate */
157
+ .j-input.is-valid,
158
+ .j-input.is-invalid,
159
+ .j-select.is-valid,
160
+ .j-select.is-invalid,
161
+ .j-textarea.is-valid,
162
+ .j-textarea.is-invalid {
163
+ padding-right: calc(1.4285714286em + 0.875rem);
164
+ background-repeat: no-repeat;
165
+ background-position: right calc(0.3571428572em + 0.21875rem) center;
166
+ background-size: calc(0.7142857143em + 0.4375rem) calc(0.7142857143em + 0.4375rem);
167
+ }
168
+
169
+ .j-input.is-valid,
170
+ .j-select.is-valid,
171
+ .j-textarea.is-valid {
172
+ border-color: var(--form-valid-border-color, var(--state-success));
173
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%232fb344' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='20 6 9 17 4 12'%3e%3c/polyline%3e%3c/svg%3e");
174
+ }
175
+
176
+ .j-input.is-invalid,
177
+ .j-select.is-invalid,
178
+ .j-textarea.is-invalid {
179
+ border-color: var(--form-invalid-border-color, var(--state-danger));
180
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23d63939' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cline x1='18' y1='6' x2='6' y2='18'%3e%3c/line%3e%3cline x1='6' y1='6' x2='18' y2='18'%3e%3c/line%3e%3c/svg%3e");
181
+ }
182
+
183
+ /* type color */
184
+ .j-input[type='color'] {
185
+ --input-padding: var(--space);
186
+ }
187
+
188
+ /* type radio */
189
+ .j-radio {
190
+ display: flex;
191
+ /* gap: var(--radio-gap); */
192
+ flex-wrap: wrap;
193
+ }
194
+
195
+ .j-radio.is-vertical {
196
+ flex-direction: column;
197
+ /* --radio-gap: var(--s3); */
198
+ }
199
+
200
+ .j-radio,
201
+ .j-radio.is-horizontal {
202
+ flex-direction: row;
203
+ /* --radio-gap: var(--s4); */
204
+ }
205
+
206
+ .j-radio label {
207
+ display: flex;
208
+ align-items: center;
209
+ gap: var(--radio-label-gap, var(--s2));
210
+ font-size: var(--font-size-md);
211
+ padding: calc(var(--space)*2);
212
+ border-radius: var(--radius-md);
213
+ }
214
+
215
+ .j-radio label:not(:has(input[type='radio']:disabled)):hover {
216
+ background-color: var(--ui-surface-hover);
217
+ }
218
+
219
+ .j-radio label input[type='radio'] {
220
+ appearance: none;
221
+ width: 1rem;
222
+ height: 1rem;
223
+ border-radius: 50%;
224
+ border-width: var(--input-border-width, 1px);
225
+ border-style: var(--input-border-style, solid);
226
+ border-color: var(--input-border-color, var(--ui-input-border));
227
+ background-color: var(--ui-bg);
228
+ cursor: pointer;
229
+ position: relative;
230
+ margin: 0;
231
+ }
232
+
233
+ .j-radio label input[type='radio']:checked {
234
+ border-color: var(--tone-solid);
235
+ background-color: var(--tone-solid);
236
+ }
237
+
238
+ .j-radio label input[type='radio']:focus-visible {
239
+ outline: 2px solid var(--ui-input-focus-border);
240
+ outline-offset: 2px;
241
+ }
242
+
243
+ .j-radio label input[type='radio']:before {
244
+ content: '';
245
+ position: absolute;
246
+ width: 6px;
247
+ height: 6px;
248
+ border-radius: 50%;
249
+ background-color: var(--ui-bg);
250
+ top: 50%;
251
+ left: 50%;
252
+ transform: translate(-50%, -50%) scale(0);
253
+ transition: transform 0.1s cubic-bezier(0.165, 0.84, 0.44, 1);
254
+ }
255
+
256
+ .j-radio label input[type='radio']:checked::before {
257
+ transform: translate(-50%, -50%) scale(1);
258
+ }
259
+
260
+ .j-radio label:has(input[type='radio']:disabled) {
261
+ cursor: not-allowed;
262
+ opacity: var(--opacity-disabled);
263
+ color: var(--ui-disabled-fg);
264
+ }
265
+
266
+ .j-radio label input[type='radio']:disabled {
267
+ background-color: var(--ui-disabled-bg);
268
+ border-color: var(--ui-border);
269
+ cursor: not-allowed;
270
+ }
271
+
272
+ .j-radio.is-group {
273
+ gap: 0;
274
+ flex-wrap: nowrap;
275
+ }
276
+
277
+ .j-radio.is-group input[type='radio'] {
278
+ clip: rect(0 0 0 0);
279
+ clip-path: inset(100%);
280
+ height: 1px;
281
+ overflow: hidden;
282
+ position: absolute;
283
+ white-space: nowrap;
284
+ width: 1px;
285
+ }
286
+
287
+ .j-radio.is-group label span.radio-text {
288
+ cursor: pointer;
289
+ background-color: var(--ui-bg);
290
+ padding: var(--radio-group-padding, calc(var(--space) * 1.5) var(--s3));
291
+ height: var(--el-height-md);
292
+ line-height: var(--line-height);
293
+ position: relative;
294
+ box-shadow: 0 0 0 0.0625em var(--ui-input-border);
295
+ text-align: center;
296
+ user-select: none;
297
+ display: flex;
298
+ justify-content: center;
299
+ align-items: center;
300
+ }
301
+
302
+ .j-radio.is-group label:not(:first-child) span.radio-text {
303
+ margin-left: 1px;
304
+ }
305
+
306
+ .j-radio.is-group input[type='radio']:checked+span.radio-text {
307
+ box-shadow: 0 0 0 0.0625em var(--tone-solid);
308
+ background-color: var(--tone-solid);
309
+ z-index: 1;
310
+ color: var(--tone-fg);
311
+ }
312
+
313
+ .j-radio.is-group label:first-child span {
314
+ border-radius: var(--radius-md) 0 0 var(--radius-md);
315
+ }
316
+
317
+ .j-radio.is-group label:last-child span {
318
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
319
+ }
320
+
321
+ .j-radio.is-group.is-sm label {
322
+ font-size: var(--font-size-sm);
323
+ }
324
+
325
+ .j-radio.is-group.is-sm label span.radio-text {
326
+ --radio-group-padding: var(--space) var(--s2);
327
+ height: var(--el-height-sm);
328
+ }
329
+
330
+ .j-radio.is-group label {
331
+ font-size: var(--font-size-md);
332
+ padding: 0;
333
+ }
334
+
335
+ .j-radio.is-group.is-lg label {
336
+ font-size: var(--font-size-lg);
337
+ }
338
+
339
+ .j-radio.is-group.is-lg label span.radio-text {
340
+ --radio-group-padding: var(--s3) var(--s4);
341
+ height: var(--el-height-lg);
342
+ }
343
+
344
+ /* type checkbox */
345
+ .j-checkbox {
346
+ display: flex;
347
+ /* gap: var(--checkbox-gap); */
348
+ flex-wrap: wrap;
349
+ margin: 0;
350
+ }
351
+
352
+ .j-checkbox.is-vertical {
353
+ flex-direction: column;
354
+ /* --checkbox-gap: var(--s3); */
355
+ }
356
+
357
+ .j-checkbox,
358
+ .j-checkbox.is-horizontal {
359
+ flex-direction: row;
360
+ /* --checkbox-gap: var(--s4); */
361
+ }
362
+
363
+ .j-checkbox label {
364
+ display: flex;
365
+ align-items: center;
366
+ gap: var(--checkbox-label-gap, var(--s2));
367
+ font-size: var(--checkbox-label-font-size, var(--font-size-md));
368
+ height: var(--el-height-md);
369
+ padding: calc(var(--space)*2);
370
+ border-radius: var(--checkbox-label-border-radius, var(--radius-md));
371
+ }
372
+
373
+ .j-radio label,
374
+ .j-checkbox label {
375
+ width: fit-content;
376
+ }
377
+
378
+ .j-checkbox label:not(:has(input[type='checkbox']:disabled)):hover {
379
+ background-color: var(--checkbox-hover-bg-color, var(--ui-surface-hover));
380
+ }
381
+
382
+ .j-checkbox input[type='checkbox'] {
383
+ appearance: none;
384
+ width: 1rem;
385
+ height: 1rem;
386
+ aspect-ratio: 1/1;
387
+ border-width: var(--input-border-width, 1px);
388
+ border-style: var(--input-border-style, solid);
389
+ border-color: var(--input-border-color, var(--ui-input-border));
390
+ border-radius: var(--input-border-radius, var(--radius-md));
391
+ cursor: pointer;
392
+ position: relative;
393
+ margin: 0;
394
+ }
395
+
396
+ .j-checkbox input[type='checkbox']:checked {
397
+ border-color: transparent;
398
+ border-radius: var(--radius-md);
399
+ background-color: var(--tone-solid);
400
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");
401
+ background-repeat: no-repeat;
402
+ background-position: center;
403
+ background-size: contain;
404
+ print-color-adjust: exact;
405
+ }
406
+
407
+ .j-theme-yellow .j-checkbox input[type='checkbox']:checked,
408
+ .j-theme-mint .j-checkbox input[type='checkbox']:checked,
409
+ .j-theme-lime .j-checkbox input[type='checkbox']:checked,
410
+ .dark.j-theme-gray .j-checkbox input[type='checkbox']:checked,
411
+ .dark.j-theme-olive .j-checkbox input[type='checkbox']:checked {
412
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' width='16' height='16'%3e%3cpath fill='none' stroke='%23000000' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8.5l2.5 2.5l5.5 -5.5'/%3e%3c/svg%3e");
413
+ }
414
+
415
+ /* switch checkbox */
416
+ .j-switch.is-default {
417
+ position: relative;
418
+ }
419
+
420
+ .j-switch.is-default.is-sm {
421
+ width: 1.75rem;
422
+ height: var(--switch-height-sm, calc(var(--space, 0 0.25rem) * 4));
423
+ }
424
+
425
+ .j-switch.is-default.is-md {
426
+ width: 2.625rem;
427
+ height: var(--switch-height-md, calc(var(--space, 0 0.25rem) * 6));
428
+ }
429
+
430
+ .j-switch.is-default.is-lg {
431
+ width: 3.5rem;
432
+ height: var(--switch-height-lg, calc(var(--space, 0 0.25rem) * 8));
433
+ }
434
+
435
+ .j-switch.is-default input[type='checkbox'] {
436
+ width: 0;
437
+ height: 0;
438
+ opacity: 0;
439
+ }
440
+
441
+ .j-switch.is-default .switch-slider {
442
+ position: absolute;
443
+ cursor: pointer;
444
+ inset: 0;
445
+ border-radius: 50px;
446
+ background-color: var(--ui-border);
447
+ transition: all 0.3s ease;
448
+ }
449
+
450
+ .j-switch.is-default .switch-slider:after {
451
+ content: '';
452
+ position: absolute;
453
+ border-radius: 50%;
454
+ background-color: #fff;
455
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
456
+ transition: all 0.3s ease;
457
+ }
458
+
459
+ .j-switch.is-default.is-sm .switch-slider:after {
460
+ left: 0.125rem;
461
+ bottom: 0.125rem;
462
+ width: 0.75rem;
463
+ height: 0.75rem;
464
+ }
465
+
466
+ .j-switch.is-default.is-md .switch-slider:after {
467
+ left: 0.1875rem;
468
+ bottom: 0.1875rem;
469
+ width: 1.125rem;
470
+ height: 1.125rem;
471
+ }
472
+
473
+ .j-switch.is-default.is-lg .switch-slider:after {
474
+ left: 0.25rem;
475
+ bottom: 0.25rem;
476
+ width: 1.5rem;
477
+ height: 1.5rem;
478
+ }
479
+
480
+ .j-switch.is-default input[type='checkbox']:checked+.switch-slider {
481
+ background-color: var(--tone-solid);
482
+ }
483
+
484
+ .j-switch.is-default.is-sm input[type='checkbox']:checked+.switch-slider:after {
485
+ transform: translateX(0.75rem);
486
+ }
487
+
488
+ .j-switch.is-default.is-md input[type='checkbox']:checked+.switch-slider:after {
489
+ transform: translateX(1.125rem);
490
+ }
491
+
492
+ .j-switch.is-default.is-lg input[type='checkbox']:checked+.switch-slider:after {
493
+ transform: translateX(1.5rem);
494
+ }
495
+
496
+ .j-theme-gray .j-switch.is-default input[type='checkbox']:checked+.switch-slider:after {
497
+ background-color: var(--ui-bg);
498
+ }
499
+
500
+ .j-theme-olive .j-switch.is-default input[type='checkbox']:checked+.switch-slider:after {
501
+ background-color: var(--ui-bg);
502
+ }
503
+
504
+ .j-switch.is-default .switch-slider:hover {
505
+ opacity: var(--opacity-hover, 0.9);
506
+ }
507
+
508
+ .j-switch.is-line {
509
+ position: relative;
510
+ display: inline-block;
511
+ }
512
+
513
+ .j-switch.is-line.is-sm {
514
+ width: 1.75rem;
515
+ height: calc(var(--space, 0 0.25rem) * 4);
516
+ }
517
+
518
+ .j-switch.is-line.is-md {
519
+ width: 2.625rem;
520
+ height: calc(var(--space, 0 0.25rem) * 6);
521
+ }
522
+
523
+ .j-switch.is-line.is-lg {
524
+ width: 3.5rem;
525
+ height: calc(var(--space, 0 0.25rem) * 8);
526
+ }
527
+
528
+ .j-switch.is-line input[type='checkbox'] {
529
+ opacity: 0;
530
+ width: 0;
531
+ height: 0;
532
+ }
533
+
534
+ .j-switch.is-line .switch-slider {
535
+ position: absolute;
536
+ cursor: pointer;
537
+ inset: 0;
538
+ border: 1px solid var(--input-border-color, var(--ui-input-border));
539
+ border-radius: 50px;
540
+ transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
541
+ }
542
+
543
+ .j-switch.is-line.is-md .switch-slider,
544
+ .j-switch.is-line.is-lg .switch-slider {
545
+ border-width: 2px;
546
+ }
547
+
548
+ .j-switch.is-line .switch-slider:before {
549
+ content: '';
550
+ position: absolute;
551
+ background-color: var(--ui-input-border);
552
+ border-radius: inherit;
553
+ transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1);
554
+ }
555
+
556
+ .j-switch.is-line.is-sm .switch-slider:before {
557
+ left: 0.125rem;
558
+ bottom: 0.125rem;
559
+ width: 0.625rem;
560
+ height: 0.625rem;
561
+ }
562
+
563
+ .j-switch.is-line.is-md .switch-slider:before {
564
+ left: 0.125rem;
565
+ bottom: 0.125rem;
566
+ width: 1rem;
567
+ height: 1rem;
568
+ }
569
+
570
+ .j-switch.is-line.is-lg .switch-slider:before {
571
+ left: 0.1875rem;
572
+ bottom: 0.1875rem;
573
+ width: 1.375rem;
574
+ height: 1.375rem;
575
+ }
576
+
577
+ .j-switch.is-line input:checked+.switch-slider {
578
+ box-shadow: 0 0 8px var(--tone-solid);
579
+ border-color: var(--tone-solid);
580
+ }
581
+
582
+ .j-switch.is-line input:checked+.switch-slider:before {
583
+ background-color: var(--tone-solid);
584
+ }
585
+
586
+ .j-switch.is-line.is-sm input:checked+.switch-slider:before {
587
+ transform: translateX(0.75rem);
588
+ }
589
+
590
+ .j-switch.is-line.is-md input:checked+.switch-slider:before {
591
+ transform: translateX(1.125rem);
592
+ }
593
+
594
+ .j-switch.is-line.is-lg input:checked+.switch-slider:before {
595
+ transform: translateX(1.5rem);
596
+ }
597
+
598
+ /* select */
599
+ select.j-select {
600
+ padding: var(--input-padding, calc(var(--space) * 1.5) calc(var(--space) * 1.5));
601
+ border-width: var(--input-border-width, 1px);
602
+ border-style: var(--input-border-style, solid);
603
+ border-color: var(--input-border-color, var(--ui-input-border));
604
+ border-radius: var(--input-border-radius, var(--radius-md));
605
+ height: var(--input-height, var(--el-height-md));
606
+ line-height: var(--input-line-height, var(--line-height));
607
+ box-shadow: var(--input-box-shadow, var(--shadow-sm));
608
+ background-color: var(--input-background-color, inherit);
609
+ font-size: var(--input-font-size, var(--font-size-md));
610
+ }
611
+
612
+ select.j-select.is-sm {
613
+ --input-height: var(--el-height-sm);
614
+ --input-padding: var(--space) var(--space);
615
+ --input-font-size: var(--font-size-sm);
616
+ }
617
+
618
+ select.j-select.is-lg {
619
+ --input-height: var(--el-height-lg);
620
+ --input-padding: var(--s2) var(--s2);
621
+ --input-font-size: var(--font-size-lg);
622
+ }
623
+
624
+
625
+
626
+ /* textarea */
627
+ textarea.j-textarea {
628
+ min-height: var(--textarea-min-height, calc(var(--space) * 18));
629
+ border-width: var(--input-border-width, 1px);
630
+ border-style: var(--input-border-style, solid);
631
+ border-color: var(--input-border-color, var(--ui-input-border));
632
+ border-radius: var(--input-border-radius, var(--radius-md));
633
+ background-color: var(--input-background-color, var(--ui-bg));
634
+ color: var(--input-color, var(--ui-input-color));
635
+ resize: vertical;
636
+ padding: var(--textarea-padding, var(--s2));
637
+ font-family: inherit;
638
+ font-size: var(--textarea-font-size, var(--font-size-md));
639
+ line-height: var(--textarea-line-height, var(--line-height));
640
+ box-shadow: var(--textarea-box-shadow, var(--shadow-sm));
641
+ }
642
+
643
+ textarea.j-textarea:focus {
644
+ border-color: transparent;
645
+ }
646
+
647
+ textarea.j-textarea:disabled {
648
+ background-color: var(--ui-disabled-bg);
649
+ color: var(--ui-disabled-fg);
650
+ cursor: not-allowed;
651
+ }
652
+
653
+ .j-form.is-vertical input.j-input:not([type='checkbox']):not([type='radio']),
654
+ .j-form.is-vertical select.j-select,
655
+ .j-form.is-vertical textarea.j-textarea {
656
+ width: 100%;
657
+ }
658
+
659
+ /* input group */
660
+ .input-group {
661
+ position: relative;
662
+ display: flex;
663
+ flex-wrap: wrap;
664
+ align-items: stretch;
665
+ width: 100%;
666
+ }
667
+
668
+ .input-group>input.j-input,
669
+ .input-group>select.j-select {
670
+ position: relative;
671
+ flex: 1 1 auto;
672
+ width: 1%;
673
+ min-width: 0;
674
+ letter-spacing: 0.4px;
675
+ }
676
+
677
+ .input-group>.el-addon>.j-button {
678
+ position: relative;
679
+ border-color: var(--input-border-color, var(--ui-input-border));
680
+ }
681
+
682
+ .input-group>.el-addon>.is-text {
683
+ display: flex;
684
+ align-items: center;
685
+ white-space: nowrap;
686
+ font-size: var(--font-size, 0.875rem);
687
+ line-height: var(--line-height, 1.25rem);
688
+ color: var(--ui-fg-muted);
689
+ background-color: var(--input-group-text-addon-background, var(--ui-bg-muted));
690
+ padding: var(--input-group-text-addon-padding, 0.5rem 0.75rem);
691
+ height: var(--button-height, var(--el-height-md));
692
+ border-width: var(--border-width, 1px);
693
+ border-style: var(--border-style, solid);
694
+ border-color: var(--input-border-color, var(--ui-input-border));
695
+ border-radius: var(--button-border-radius, var(--radius-md));
696
+ box-shadow: var(--shadow-sm);
697
+ user-select: none;
698
+ }
699
+
700
+ .input-group>.el-addon>.is-text.icon-close {
701
+ width: var(--button-height, var(--el-height-md));
702
+ }
703
+
704
+ .input-group>*:not(:first-child) {
705
+ margin-left: -1px;
706
+ }
707
+
708
+ .input-group>input.j-input:not(:first-child),
709
+ .input-group>select.j-select:not(:first-child),
710
+ .input-group> :not(select.j-select)+.el-addon:not(:first-child)>.is-text {
711
+ border-left-color: transparent;
712
+ }
713
+
714
+ .input-group>input.j-input:not(:first-child),
715
+ .input-group>select.j-select:not(:first-child),
716
+ .input-group>*:not(:first-child)>*,
717
+ .input-group>*:not(:first-child)>.is-text {
718
+ border-top-left-radius: 0;
719
+ border-bottom-left-radius: 0;
720
+ }
721
+
722
+ .input-group>input.j-input:not(:last-child),
723
+ .input-group>select.j-select:not(:last-child),
724
+ .input-group>*:not(:last-child)>*,
725
+ .input-group>*:not(:last-child)>.is-text {
726
+ border-top-right-radius: 0;
727
+ border-bottom-right-radius: 0;
728
+ }
729
+
730
+ .input-group select.j-select:focus {
731
+ border-color: transparent;
732
+ z-index: 1;
733
+ }
734
+
735
+ /* input inner group */
736
+ .input-inner-group {
737
+ position: relative;
738
+ }
739
+
740
+ .input-inner-group>input.j-input {
741
+ width: 100%;
742
+ letter-spacing: 0.4px;
743
+ }
744
+
745
+ .input-inner-group>input.j-input:not(:last-child) {
746
+ padding-right: var(--el-height-md);
747
+ }
748
+
749
+ .input-inner-group>input.j-input:not(:first-child) {
750
+ padding-left: var(--el-height-md);
751
+ }
752
+
753
+ .input-inner-group>.el-addon {
754
+ position: absolute;
755
+ top: 0;
756
+ bottom: 0;
757
+ left: 0;
758
+ display: flex;
759
+ align-items: center;
760
+ justify-content: center;
761
+ min-width: var(--el-height-md);
762
+ color: var(--ui-fg-subtle);
763
+ font-size: 0.875em;
764
+ }
765
+
766
+ .input-inner-group>.el-addon:last-child {
767
+ right: 0;
768
+ left: auto;
769
+ }
770
+
771
+ .input-inner-group>.el-addon:first-child.is-text:has(.j-button:not(.is-icon)) {
772
+ left: var(--space);
773
+ }
774
+
775
+ .input-inner-group>.el-addon:last-child.is-text:has(.j-button:not(.is-icon)) {
776
+ right: var(--space);
777
+ }
778
+
779
+ .input-inner-group>.el-addon>svg {
780
+ width: var(--font-size-xl);
781
+ height: var(--font-size-xl);
782
+ }
783
+
784
+ .input-inner-group>.el-addon>.el-text {
785
+ color: currentColor;
786
+ }
787
+
788
+ .input-inner-group>.el-addon.is-text {
789
+ color: var(--ui-fg);
790
+ display: flex;
791
+ gap: var(--space);
792
+ }
793
+
794
+ /* status active */
795
+ .input-group>.el-addon>.j-button:not(:disabled):active {
796
+ transform: none;
797
+ outline: var(--input-focus-outline, 2px solid var(--tone-solid));
798
+ border-color: transparent;
799
+ z-index: 2;
800
+ }
801
+
802
+ /* status focus */
803
+ select.j-select:focus-visible,
804
+ .j-input:focus-within {
805
+ outline: var(--input-focus-outline, 2px solid var(--tone-solid));
806
+ border-color: transparent;
807
+ box-shadow: var(--input-focus-shadow, none);
808
+ }
809
+
810
+ .j-input.is-valid:focus-within,
811
+ .j-select.is-valid:focus-within {
812
+ border-color: transparent;
813
+ outline-color: var(--form-valid-border-color, var(--state-success));
814
+ }
815
+
816
+ .j-input.is-invalid:focus-within,
817
+ .j-select.is-invalid:focus-within {
818
+ border-color: transparent;
819
+ outline-color: var(--form-invalid-border-color, var(--state-danger));
820
+ }
821
+
822
+ .input-group>.j-input:focus-within {
823
+ z-index: 2;
824
+ }
825
+
826
+ .j-textarea:focus-within {
827
+ outline: var(--textarea-focus-outline, 2px solid var(--tone-solid));
828
+ border-color: transparent;
829
+ }
830
+
831
+ .j-radio label input[type='radio']:focus-within {
832
+ border-color: transparent;
833
+ outline-offset: 1px;
834
+ }
835
+
836
+ .j-checkbox input[type='checkbox']:focus-within {
837
+ border-color: var(--tone-solid);
838
+ outline-offset: 1px;
839
+ }
840
+
841
+ /* status readonly */
842
+ .j-input:not([type='file']):not(.is-line):not(.is-blank)[readonly] {
843
+ background-color: var(--input-readonly-background, var(--ui-surface-active));
844
+ }
845
+
846
+ .j-textarea[readonly] {
847
+ background-color: var(--ui-surface-active);
848
+ }
849
+
850
+ /* status disabled */
851
+ .j-input:disabled,
852
+ .j-textarea:disabled {
853
+ opacity: var(--input-disabled-opacity, var(--opacity-disabled));
854
+ }
855
+
856
+ .j-input:disabled:not(.is-line):not(.is-ghost):not(.is-blank) {
857
+ background-color: var(--ui-disabled-bg);
858
+ border-color: var(--ui-border);
859
+ }
860
+
861
+ .j-textarea[disabled] {
862
+ background-color: var(--ui-disabled-bg);
863
+ }
864
+
865
+ /* radio disabled */
866
+ .j-radio label:has(input[type='radio']:disabled) {
867
+ cursor: not-allowed;
868
+ opacity: var(--opacity-disabled);
869
+ color: var(--ui-disabled-fg);
870
+ }
871
+
872
+ .j-radio label input[type='radio']:disabled {
873
+ background-color: var(--ui-disabled-bg);
874
+ border-color: var(--ui-border);
875
+ }
876
+
877
+ .j-radio.is-group label input[type='radio']:disabled+.radio-text {
878
+ cursor: not-allowed;
879
+ background-color: var(--ui-disabled-bg);
880
+ opacity: var(--opacity-disabled);
881
+ color: var(--ui-disabled-fg);
882
+ }
883
+
884
+ /* checkbox disabled */
885
+ .j-checkbox label:has(input[type='checkbox']:disabled) {
886
+ cursor: not-allowed;
887
+ opacity: var(--opacity-disabled);
888
+ color: var(--ui-disabled-fg);
889
+ }
890
+
891
+ .j-checkbox label input[type='checkbox']:disabled {
892
+ background-color: var(--ui-disabled-bg);
893
+ border-color: var(--ui-border);
894
+ }
895
+
896
+ /* switch disabled */
897
+ .j-switch.is-default:has(input[type='checkbox']:disabled),
898
+ .j-switch.is-line:has(input[type='checkbox']:disabled) {
899
+ opacity: var(--opacity-disabled);
900
+ cursor: not-allowed;
901
+ }
902
+
903
+ .j-switch.is-default:has(input[type='checkbox']:disabled) .switch-slider,
904
+ .j-switch.is-line:has(input[type='checkbox']:disabled) .switch-slider {
905
+ cursor: not-allowed;
906
+ }
907
+
908
+ .j-switch.is-default:has(input[type='checkbox']:disabled) .switch-slider:before,
909
+ .j-switch.is-line:has(input[type='checkbox']:disabled) .switch-slider:before {
910
+ background-color: var(--ui-border);
911
+ }
912
+
913
+ /* status placeholder shown */
914
+ /* input.j-input[type='file']:valid, */
915
+ /* select.j-select:valid, */
916
+ input.j-input:not([type='file']):not(:placeholder-shown) {
917
+ background-color: var(--tone-subtle);
918
+ }
919
+ }