@amelharrak/eldo-ui 1.0.1

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 (134) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/css/eldo.css +11683 -0
  4. package/dist/css/eldo.css.map +1 -0
  5. package/dist/css/eldo.min.css +1 -0
  6. package/dist/index.cjs +2 -0
  7. package/dist/index.cjs.map +1 -0
  8. package/dist/index.mjs +64 -0
  9. package/dist/index.mjs.map +1 -0
  10. package/dist/types/__tests__/Alert.test.d.ts +1 -0
  11. package/dist/types/__tests__/Button.test.d.ts +1 -0
  12. package/dist/types/__tests__/Modal.test.d.ts +1 -0
  13. package/dist/types/components/Accordion.d.ts +15 -0
  14. package/dist/types/components/Alert.d.ts +15 -0
  15. package/dist/types/components/Avatar.d.ts +10 -0
  16. package/dist/types/components/Badge.d.ts +7 -0
  17. package/dist/types/components/Box.d.ts +27 -0
  18. package/dist/types/components/Breadcrumb.d.ts +15 -0
  19. package/dist/types/components/Button.d.ts +16 -0
  20. package/dist/types/components/ButtonGroup.d.ts +7 -0
  21. package/dist/types/components/Card.d.ts +15 -0
  22. package/dist/types/components/Carousel.d.ts +21 -0
  23. package/dist/types/components/Checkbox.d.ts +10 -0
  24. package/dist/types/components/Col.d.ts +12 -0
  25. package/dist/types/components/Collapse.d.ts +12 -0
  26. package/dist/types/components/Container.d.ts +8 -0
  27. package/dist/types/components/Dropdown.d.ts +19 -0
  28. package/dist/types/components/FileUpload.d.ts +13 -0
  29. package/dist/types/components/Input.d.ts +20 -0
  30. package/dist/types/components/InputOTP.d.ts +13 -0
  31. package/dist/types/components/ListGroup.d.ts +20 -0
  32. package/dist/types/components/Modal.d.ts +13 -0
  33. package/dist/types/components/Navbar.d.ts +17 -0
  34. package/dist/types/components/NumberInput.d.ts +15 -0
  35. package/dist/types/components/Offcanvas.d.ts +15 -0
  36. package/dist/types/components/Pagination.d.ts +14 -0
  37. package/dist/types/components/Popover.d.ts +14 -0
  38. package/dist/types/components/Progress.d.ts +11 -0
  39. package/dist/types/components/Radio.d.ts +11 -0
  40. package/dist/types/components/Row.d.ts +7 -0
  41. package/dist/types/components/Scrollspy.d.ts +13 -0
  42. package/dist/types/components/Select.d.ts +16 -0
  43. package/dist/types/components/Slider.d.ts +16 -0
  44. package/dist/types/components/Sonner.d.ts +21 -0
  45. package/dist/types/components/Spinner.d.ts +11 -0
  46. package/dist/types/components/Stat.d.ts +24 -0
  47. package/dist/types/components/Switch.d.ts +14 -0
  48. package/dist/types/components/Tabs.d.ts +20 -0
  49. package/dist/types/components/Text.d.ts +13 -0
  50. package/dist/types/components/Timeline.d.ts +41 -0
  51. package/dist/types/components/Toast.d.ts +17 -0
  52. package/dist/types/components/Tooltip.d.ts +12 -0
  53. package/dist/types/index.d.ts +40 -0
  54. package/package.json +106 -0
  55. package/setup.js +260 -0
  56. package/src/scss/abstracts/_functions.scss +19 -0
  57. package/src/scss/abstracts/_mixins.scss +33 -0
  58. package/src/scss/abstracts/_variables.scss +119 -0
  59. package/src/scss/base/_reset.scss +24 -0
  60. package/src/scss/base/_transitions.scss +10 -0
  61. package/src/scss/base/_typography.scss +50 -0
  62. package/src/scss/components/_accordion.scss +238 -0
  63. package/src/scss/components/_alert.scss +85 -0
  64. package/src/scss/components/_alerts.scss +137 -0
  65. package/src/scss/components/_avatar.scss +184 -0
  66. package/src/scss/components/_badge.scss +70 -0
  67. package/src/scss/components/_blockquote.scss +41 -0
  68. package/src/scss/components/_breadcrumb.scss +39 -0
  69. package/src/scss/components/_button-group.scss +43 -0
  70. package/src/scss/components/_button.scss +92 -0
  71. package/src/scss/components/_buttons.scss +66 -0
  72. package/src/scss/components/_calendar.scss +520 -0
  73. package/src/scss/components/_card.scss +52 -0
  74. package/src/scss/components/_cards.scss +123 -0
  75. package/src/scss/components/_carousel.scss +490 -0
  76. package/src/scss/components/_charts.scss +29 -0
  77. package/src/scss/components/_checkbox.scss +194 -0
  78. package/src/scss/components/_code.scss +70 -0
  79. package/src/scss/components/_collapse.scss +13 -0
  80. package/src/scss/components/_combobox.scss +239 -0
  81. package/src/scss/components/_date-picker.scss +102 -0
  82. package/src/scss/components/_divider.scss +55 -0
  83. package/src/scss/components/_dropdown.scss +122 -0
  84. package/src/scss/components/_file-upload.scss +233 -0
  85. package/src/scss/components/_floating-labels.scss +247 -0
  86. package/src/scss/components/_form-select.scss +49 -0
  87. package/src/scss/components/_forms.scss +41 -0
  88. package/src/scss/components/_index.scss +7 -0
  89. package/src/scss/components/_input-otp.scss +338 -0
  90. package/src/scss/components/_list-group.scss +95 -0
  91. package/src/scss/components/_modal.scss +166 -0
  92. package/src/scss/components/_nav.scss +175 -0
  93. package/src/scss/components/_navbar.scss +228 -0
  94. package/src/scss/components/_number-input.scss +67 -0
  95. package/src/scss/components/_offcanvas.scss +123 -0
  96. package/src/scss/components/_pagination.scss +64 -0
  97. package/src/scss/components/_placeholders.scss +52 -0
  98. package/src/scss/components/_popovers.scss +69 -0
  99. package/src/scss/components/_progress.scss +90 -0
  100. package/src/scss/components/_range.scss +82 -0
  101. package/src/scss/components/_scrollspy.scss +239 -0
  102. package/src/scss/components/_skeleton.scss +108 -0
  103. package/src/scss/components/_slider.scss +95 -0
  104. package/src/scss/components/_snippet.scss +79 -0
  105. package/src/scss/components/_spinners.scss +137 -0
  106. package/src/scss/components/_stat.scss +42 -0
  107. package/src/scss/components/_stepper.scss +104 -0
  108. package/src/scss/components/_switch.scss +57 -0
  109. package/src/scss/components/_table.scss +109 -0
  110. package/src/scss/components/_tag.scss +60 -0
  111. package/src/scss/components/_tags-input.scss +60 -0
  112. package/src/scss/components/_timeline.scss +238 -0
  113. package/src/scss/components/_toasts.scss +75 -0
  114. package/src/scss/components/_tooltips.scss +50 -0
  115. package/src/scss/components/_tree-view.scss +72 -0
  116. package/src/scss/components/_user.scss +26 -0
  117. package/src/scss/docs/_examples.scss +148 -0
  118. package/src/scss/docs/_layout.scss +251 -0
  119. package/src/scss/docs/_search.scss +141 -0
  120. package/src/scss/eldo.scss +74 -0
  121. package/src/scss/layout/_container.scss +37 -0
  122. package/src/scss/layout/_grid.scss +49 -0
  123. package/src/scss/pages/_landing-config.scss +135 -0
  124. package/src/scss/pages/_landing-features-enhanced.scss +165 -0
  125. package/src/scss/pages/_landing-hero-enhanced.scss +427 -0
  126. package/src/scss/pages/_landing-setup.scss +264 -0
  127. package/src/scss/pages/_landing.scss +1828 -0
  128. package/src/scss/utilities/_api.scss +66 -0
  129. package/src/scss/utilities/_colors.scss +32 -0
  130. package/src/scss/utilities/_display.scss +70 -0
  131. package/src/scss/utilities/_glass.scss +32 -0
  132. package/src/scss/utilities/_helpers.scss +16 -0
  133. package/src/scss/utilities/_map.scss +224 -0
  134. package/src/scss/utilities/_spacing.scss +58 -0
@@ -0,0 +1,490 @@
1
+ /**
2
+ * Eldo UI Carousel Component Styles
3
+ * Swiper-inspired design
4
+ */
5
+
6
+ .eldo-carousel {
7
+ position: relative;
8
+ width: 100%;
9
+ overflow: hidden;
10
+ margin-left: auto;
11
+ margin-right: auto;
12
+ list-style: none;
13
+ padding: 0;
14
+ z-index: 1;
15
+
16
+ &:focus {
17
+ outline: 2px solid var(--bs-primary);
18
+ outline-offset: 2px;
19
+ }
20
+ }
21
+
22
+ .carousel-container {
23
+ position: relative;
24
+ width: 100%;
25
+ height: 100%;
26
+ z-index: 1;
27
+ display: flex;
28
+ transition-property: transform;
29
+ box-sizing: content-box;
30
+ overflow: hidden;
31
+ }
32
+
33
+ .carousel-track {
34
+ position: relative;
35
+ width: 100%;
36
+ height: 100%;
37
+ z-index: 1;
38
+ display: flex;
39
+ transition-property: transform;
40
+ box-sizing: content-box;
41
+ cursor: grab;
42
+ user-select: none;
43
+ -webkit-user-select: none;
44
+ -moz-user-select: none;
45
+ -ms-user-select: none;
46
+
47
+ &:active {
48
+ cursor: grabbing;
49
+ }
50
+ }
51
+
52
+ .carousel-slide {
53
+ flex-shrink: 0;
54
+ width: 100%;
55
+ height: 100%;
56
+ position: relative;
57
+ transition-property: transform;
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ }
62
+
63
+ /* Navigation Buttons - Swiper Style */
64
+ /* Navigation Buttons - Enhanced Glassmorphism */
65
+ .carousel-btn {
66
+ position: absolute;
67
+ top: 50%;
68
+ transform: translateY(-50%);
69
+ width: 44px;
70
+ height: 44px;
71
+ margin-top: 0;
72
+ z-index: 10;
73
+ cursor: pointer;
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+
78
+ /* Glass Effect */
79
+ background: rgba(255, 255, 255, 0.25);
80
+ backdrop-filter: blur(8px);
81
+ -webkit-backdrop-filter: blur(8px);
82
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
83
+
84
+ color: white;
85
+ border: none;
86
+ border-radius: 50%;
87
+
88
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
89
+ opacity: 0;
90
+ /* Hidden by default for cleaner interface */
91
+ visibility: hidden;
92
+
93
+ svg {
94
+ width: 24px;
95
+ height: 24px;
96
+ stroke-width: 2.5;
97
+ stroke: currentColor;
98
+ fill: none;
99
+ filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.3));
100
+ /* Icon contrast */
101
+ }
102
+
103
+ /* Hover State */
104
+ &:hover:not(:disabled) {
105
+ background: rgba(255, 255, 255, 0.45);
106
+ transform: translateY(-50%) scale(1.1);
107
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
108
+ opacity: 1;
109
+ }
110
+
111
+ &:active:not(:disabled) {
112
+ transform: translateY(-50%) scale(0.95);
113
+ }
114
+
115
+ &:disabled {
116
+ opacity: 0;
117
+ cursor: default;
118
+ pointer-events: none;
119
+ }
120
+
121
+ &:focus-visible {
122
+ outline: 2px solid white;
123
+ outline-offset: 2px;
124
+ opacity: 1;
125
+ visibility: visible;
126
+ }
127
+ }
128
+
129
+ /* Show buttons on slider hover */
130
+ .eldo-carousel:hover .carousel-btn {
131
+ opacity: 1;
132
+ visibility: visible;
133
+ }
134
+
135
+ .carousel-btn-prev {
136
+ left: 16px;
137
+ right: auto;
138
+ }
139
+
140
+ .carousel-btn-next {
141
+ right: 16px;
142
+ left: auto;
143
+ }
144
+
145
+ /* Light theme adjustments */
146
+ [data-bs-theme="light"] {
147
+ .carousel-btn {
148
+ background: white;
149
+ color: var(--bs-primary);
150
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
151
+
152
+ &:hover:not(:disabled) {
153
+ background: white;
154
+ }
155
+ }
156
+ }
157
+
158
+ /* Pagination - Swiper Style */
159
+ .carousel-pagination {
160
+ position: absolute;
161
+ text-align: center;
162
+ transition: 0.3s opacity;
163
+ transform: translate3d(0, 0, 0);
164
+ z-index: 10;
165
+
166
+ bottom: 10px;
167
+ left: 0;
168
+ width: 100%;
169
+
170
+ display: flex;
171
+ gap: 8px;
172
+ align-items: center;
173
+ justify-content: center;
174
+ }
175
+
176
+ .carousel-dot {
177
+ width: 8px;
178
+ height: 8px;
179
+ display: inline-block;
180
+ border-radius: 50%;
181
+ background: rgba(0, 0, 0, 0.2);
182
+ border: none;
183
+ padding: 0;
184
+ margin: 0;
185
+ cursor: pointer;
186
+
187
+ transition: all 0.3s ease;
188
+
189
+ &:hover {
190
+ background: rgba(0, 0, 0, 0.4);
191
+ }
192
+
193
+ &.active {
194
+ background: var(--bs-primary);
195
+ width: 8px;
196
+ height: 8px;
197
+ border-radius: 50%;
198
+ }
199
+
200
+ &:focus-visible {
201
+ outline: 2px solid var(--bs-primary);
202
+ outline-offset: 2px;
203
+ }
204
+ }
205
+
206
+ [data-bs-theme="light"] .carousel-dot {
207
+ background: rgba(0, 0, 0, 0.2);
208
+
209
+ &:hover {
210
+ background: rgba(0, 0, 0, 0.4);
211
+ }
212
+
213
+ &.active {
214
+ background: var(--bs-primary);
215
+ }
216
+ }
217
+
218
+ /* Responsive adjustments */
219
+ @media (max-width: 768px) {
220
+ .carousel-btn {
221
+ width: 36px;
222
+ height: 36px;
223
+ margin-top: -18px;
224
+
225
+ svg {
226
+ width: 16px;
227
+ height: 16px;
228
+ }
229
+ }
230
+
231
+ .carousel-btn-prev {
232
+ left: 5px;
233
+ }
234
+
235
+ .carousel-btn-next {
236
+ right: 5px;
237
+ }
238
+
239
+ .carousel-pagination {
240
+ bottom: 8px;
241
+ }
242
+
243
+ .carousel-dot {
244
+ width: 6px;
245
+ height: 6px;
246
+
247
+ &.active {
248
+ width: 6px;
249
+ height: 6px;
250
+ }
251
+ }
252
+ }
253
+
254
+ /* Animation classes */
255
+ @keyframes slideIn {
256
+ from {
257
+ opacity: 0;
258
+ transform: translateX(100%);
259
+ }
260
+
261
+ to {
262
+ opacity: 1;
263
+ transform: translateX(0);
264
+ }
265
+ }
266
+
267
+ @keyframes slideOut {
268
+ from {
269
+ opacity: 1;
270
+ transform: translateX(0);
271
+ }
272
+
273
+ to {
274
+ opacity: 0;
275
+ transform: translateX(-100%);
276
+ }
277
+ }
278
+
279
+ /* Loading state */
280
+ .eldo-carousel.loading {
281
+ .carousel-track {
282
+ opacity: 0.5;
283
+ pointer-events: none;
284
+ }
285
+ }
286
+
287
+ /* Fade effect */
288
+ .eldo-carousel.carousel-fade {
289
+ .carousel-slide {
290
+ transition-property: opacity;
291
+ transform: none;
292
+ }
293
+ }
294
+
295
+ /* Cube effect */
296
+ .eldo-carousel.carousel-cube {
297
+ overflow: visible;
298
+
299
+ .carousel-container {
300
+ perspective: 1200px;
301
+ }
302
+
303
+ .carousel-slide {
304
+ pointer-events: none;
305
+ backface-visibility: hidden;
306
+ z-index: 1;
307
+ visibility: hidden;
308
+ transform-origin: 0 0;
309
+ width: 100%;
310
+ height: 100%;
311
+ }
312
+ }
313
+
314
+ /* Vertical Carousel */
315
+ .carousel-vertical {
316
+ height: 100%;
317
+
318
+ .carousel-container {
319
+ flex-direction: column;
320
+ }
321
+
322
+ .carousel-track {
323
+ flex-direction: column;
324
+ }
325
+
326
+ .carousel-pagination {
327
+ right: 10px;
328
+ left: auto;
329
+ top: 50%;
330
+ bottom: auto;
331
+ transform: translateY(-50%);
332
+ flex-direction: column;
333
+ width: auto;
334
+ }
335
+
336
+ .carousel-btn-prev {
337
+ left: 50%;
338
+ top: 10px;
339
+ margin-top: 0;
340
+ transform: translateX(-50%) rotate(90deg);
341
+ right: auto;
342
+ }
343
+
344
+ .carousel-btn-next {
345
+ left: 50%;
346
+ top: auto;
347
+ bottom: 10px;
348
+ margin-top: 0;
349
+ transform: translateX(-50%) rotate(90deg);
350
+ right: auto;
351
+ }
352
+
353
+ .carousel-scrollbar {
354
+ position: absolute;
355
+ right: 3px;
356
+ top: 2%;
357
+ bottom: 2%;
358
+ width: 6px;
359
+ /* Increased width */
360
+ height: 96%;
361
+ z-index: 50;
362
+ }
363
+
364
+ .scrollbar-drag {
365
+ width: 100% !important;
366
+ /* Height will be set by JS */
367
+ }
368
+ }
369
+
370
+ /* Scrollbar */
371
+ .carousel-scrollbar {
372
+ position: absolute;
373
+ left: 2%;
374
+ bottom: 3px;
375
+ width: 96%;
376
+ height: 6px;
377
+ /* Increased height */
378
+ border-radius: 4px;
379
+ background: rgba(0, 0, 0, 0.2);
380
+ /* Increased contrast */
381
+ z-index: 50;
382
+ }
383
+
384
+ .scrollbar-drag {
385
+ height: 100%;
386
+ width: 0;
387
+ position: relative;
388
+ background: var(--bs-primary);
389
+ border-radius: 4px;
390
+ left: 0;
391
+ top: 0;
392
+ cursor: pointer;
393
+ }
394
+
395
+ [data-bs-theme="light"] .carousel-scrollbar {
396
+ background: rgba(0, 0, 0, 0.1);
397
+ }
398
+
399
+ /* Pagination Types */
400
+ .carousel-pagination-fraction {
401
+ background: rgba(0, 0, 0, 0.6);
402
+ /* Darker background */
403
+ padding: 6px 14px;
404
+ border-radius: 20px;
405
+ color: white;
406
+ font-size: 14px;
407
+ width: auto;
408
+ left: auto;
409
+ /* Reset left */
410
+ right: 20px;
411
+ /* Position to right */
412
+ transform: none;
413
+ /* Remove center transform */
414
+ bottom: 20px;
415
+ gap: 4px;
416
+ z-index: 20;
417
+ /* Ensure on top */
418
+ }
419
+
420
+ .carousel-pagination-progress {
421
+ position: absolute;
422
+ bottom: 0;
423
+ left: 0;
424
+ width: 100%;
425
+ height: 4px;
426
+ background: rgba(0, 0, 0, 0.2);
427
+ /* Visible background */
428
+ align-items: flex-start;
429
+ justify-content: flex-start;
430
+ z-index: 20;
431
+
432
+ .progressbar-fill {
433
+ background: var(--bs-primary);
434
+ height: 100%;
435
+ width: 0;
436
+ transition: width 0.3s linear;
437
+ /* Linear for smoother progress update */
438
+ transform-origin: left top;
439
+ }
440
+ }
441
+
442
+ /* Centered Slides */
443
+ .carousel-centered {
444
+ .carousel-slide {
445
+ transition: opacity 0.3s ease, transform 0.3s ease;
446
+ opacity: 0.4;
447
+ transform: scale(0.9);
448
+ }
449
+
450
+ .carousel-slide.active {
451
+ opacity: 1;
452
+ transform: scale(1);
453
+ z-index: 1;
454
+ }
455
+ }
456
+
457
+ /* Autoplay Progress Ring */
458
+ .autoplay-progress {
459
+ position: absolute;
460
+ right: 16px;
461
+ bottom: 16px;
462
+ z-index: 20;
463
+ width: 48px;
464
+ height: 48px;
465
+ display: flex;
466
+ align-items: center;
467
+ justify-content: center;
468
+ font-weight: bold;
469
+ color: var(--bs-primary);
470
+ background: rgba(255, 255, 255, 0.8);
471
+ /* Added background for visibility */
472
+ border-radius: 50%;
473
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
474
+
475
+ svg {
476
+ position: absolute;
477
+ left: 0;
478
+ top: 0;
479
+ z-index: 10;
480
+ width: 100%;
481
+ height: 100%;
482
+ stroke-width: 4px;
483
+ stroke: var(--bs-primary);
484
+ fill: none;
485
+ stroke-dashoffset: calc(125.6 * (1 - var(--progress)));
486
+ stroke-dasharray: 125.6;
487
+ transform: rotate(-90deg);
488
+ pointer-events: none;
489
+ }
490
+ }
@@ -0,0 +1,29 @@
1
+ @use "sass:color";
2
+ @use "../abstracts/variables" as *;
3
+
4
+ // Chart Containers
5
+ // Chart.js handles most styling internally (canvas), but we need responsive containers
6
+
7
+ .chart-container {
8
+ position: relative;
9
+ margin: auto;
10
+ width: 100%;
11
+
12
+ // Explicit heights for different use cases
13
+ &.chart-sm {
14
+ height: 200px;
15
+ }
16
+
17
+ &.chart-md {
18
+ height: 350px;
19
+ }
20
+
21
+ &.chart-lg {
22
+ height: 500px;
23
+ }
24
+
25
+ // Ensure canvas fills container
26
+ canvas {
27
+ max-width: 100%;
28
+ }
29
+ }
@@ -0,0 +1,194 @@
1
+ @use "sass:color";
2
+ @use "../abstracts/variables" as *;
3
+
4
+ .form-check {
5
+ display: block;
6
+ min-height: 1.5rem;
7
+ padding-left: 1.75em;
8
+ margin-bottom: 0.5rem;
9
+
10
+ .form-check-input {
11
+ float: left;
12
+ margin-left: -1.75em;
13
+ }
14
+ }
15
+
16
+ .form-check-input {
17
+ width: 1.25em;
18
+ height: 1.25em;
19
+ margin-top: 0.125em;
20
+ vertical-align: top;
21
+ background-color: #fff;
22
+ background-repeat: no-repeat;
23
+ background-position: center;
24
+ background-size: contain;
25
+ border: 2px solid $gray-300;
26
+ appearance: none;
27
+ print-color-adjust: exact;
28
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
29
+ border-radius: $border-radius-sm;
30
+ cursor: pointer;
31
+ position: relative;
32
+
33
+ // States
34
+ &:hover {
35
+ border-color: $gray-400;
36
+ background-color: $gray-100;
37
+ }
38
+
39
+ &:checked {
40
+ background-color: $primary;
41
+ border-color: $primary;
42
+
43
+ &[type="checkbox"] {
44
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e");
45
+ }
46
+
47
+ &[type="radio"] {
48
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e");
49
+ }
50
+ }
51
+
52
+ // Indeterminate
53
+ &:indeterminate {
54
+ background-color: $primary;
55
+ border-color: $primary;
56
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");
57
+ }
58
+
59
+ &:focus {
60
+ border-color: $primary;
61
+ outline: 0;
62
+ box-shadow: 0 0 0 0.25rem color.scale($primary, $alpha: -85%);
63
+ }
64
+
65
+ &:active {
66
+ transform: scale(0.9);
67
+ }
68
+
69
+ &:checked:active {
70
+ transform: scale(0.9);
71
+ }
72
+
73
+ &:disabled {
74
+ opacity: 0.5;
75
+ cursor: not-allowed;
76
+ }
77
+ }
78
+
79
+ // Radios
80
+ .form-check-input[type="radio"] {
81
+ border-radius: 50%;
82
+ }
83
+
84
+ // Sizes
85
+ .form-check-sm {
86
+ min-height: 1.25rem;
87
+
88
+ .form-check-input {
89
+ width: 1em;
90
+ height: 1em;
91
+ margin-top: 0.15em;
92
+ }
93
+
94
+ .form-check-label {
95
+ font-size: $font-size-sm;
96
+ }
97
+ }
98
+
99
+ .form-check-lg {
100
+ min-height: 1.75rem;
101
+ padding-left: 2em;
102
+
103
+ .form-check-input {
104
+ width: 1.5em;
105
+ height: 1.5em;
106
+ margin-left: -2em;
107
+ margin-top: 0;
108
+ }
109
+
110
+ .form-check-label {
111
+ font-size: 1.125rem;
112
+ }
113
+ }
114
+
115
+ // Card Variant
116
+ .form-check-card {
117
+ display: flex;
118
+ align-items: flex-start;
119
+ padding: 1rem 1.25rem;
120
+ margin-bottom: 0.75rem;
121
+ border: 2px solid $gray-200;
122
+ border-radius: $border-radius-xl;
123
+ cursor: pointer;
124
+ transition: all 0.2s ease;
125
+ background: #fff;
126
+ position: relative;
127
+
128
+ .form-check-input {
129
+ margin: 0.25rem 0.75rem 0 0;
130
+ float: none;
131
+ }
132
+
133
+ .form-check-label {
134
+ margin-bottom: 0;
135
+ flex: 1;
136
+ cursor: pointer;
137
+
138
+ .title {
139
+ display: block;
140
+ font-weight: 600;
141
+ color: $gray-900;
142
+ margin-bottom: 0.125rem;
143
+ }
144
+
145
+ .description {
146
+ display: block;
147
+ font-size: $font-size-sm;
148
+ color: $gray-500;
149
+ }
150
+ }
151
+
152
+ &:hover {
153
+ border-color: $gray-300;
154
+ background-color: $gray-50;
155
+ }
156
+
157
+ &.selected,
158
+ &:has(.form-check-input:checked) {
159
+ border-color: $primary;
160
+ background-color: color.scale($primary, $alpha: -95%);
161
+ }
162
+
163
+ &:has(.form-check-input:focus) {
164
+ box-shadow: 0 0 0 0.25rem color.scale($primary, $alpha: -90%);
165
+ }
166
+
167
+ &:has(.form-check-input:disabled) {
168
+ opacity: 0.6;
169
+ cursor: not-allowed;
170
+ background-color: $gray-100;
171
+ border-color: $gray-200;
172
+ }
173
+ }
174
+
175
+ // Colors Loop
176
+ @each $color, $value in $theme-colors {
177
+ .form-check-input-#{$color} {
178
+ &:checked {
179
+ background-color: $value;
180
+ border-color: $value;
181
+ }
182
+
183
+ &:focus {
184
+ border-color: $value;
185
+ box-shadow: 0 0 0 0.25rem color.scale($value, $alpha: -75%);
186
+ }
187
+ }
188
+ }
189
+
190
+ .form-check-label {
191
+ color: $body-color;
192
+ cursor: pointer;
193
+ vertical-align: middle;
194
+ }