@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,520 @@
1
+ @use "sass:color";
2
+ @use "../abstracts/variables" as *;
3
+
4
+ .calendar {
5
+ width: 300px;
6
+ max-width: 100%;
7
+ padding: 1rem;
8
+ background-color: #fff;
9
+ border-radius: $border-radius-lg;
10
+ box-shadow: $box-shadow-sm;
11
+ display: inline-block;
12
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
13
+ overflow: hidden;
14
+
15
+ .calendar-header {
16
+ display: flex;
17
+ align-items: center;
18
+ justify-content: space-between;
19
+ margin-bottom: 1rem;
20
+
21
+ .calendar-title {
22
+ font-weight: $font-weight-bold;
23
+ font-size: 1rem;
24
+ color: $dark;
25
+ flex: 1;
26
+ text-align: center;
27
+ white-space: nowrap;
28
+ overflow: hidden;
29
+ text-overflow: ellipsis;
30
+ }
31
+
32
+ .calendar-nav-btn {
33
+ background: transparent;
34
+ border: none;
35
+ color: $gray-600;
36
+ padding: 0.5rem;
37
+ cursor: pointer;
38
+ border-radius: $border-radius;
39
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
40
+ font-size: 1.25rem;
41
+ line-height: 1;
42
+ width: 2rem;
43
+ height: 2rem;
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+
48
+ &:hover {
49
+ background-color: $gray-100;
50
+ color: $dark;
51
+ transform: scale(1.1);
52
+ }
53
+
54
+ &:active {
55
+ transform: scale(0.95);
56
+ }
57
+ }
58
+ }
59
+
60
+ .calendar-grid {
61
+ display: grid;
62
+ grid-template-columns: repeat(7, 1fr);
63
+ gap: 0.25rem;
64
+ text-align: center;
65
+ }
66
+
67
+ .calendar-week-day {
68
+ font-size: 0.75rem;
69
+ color: $gray-500;
70
+ text-transform: uppercase;
71
+ font-weight: $font-weight-semibold;
72
+ margin-bottom: 0.5rem;
73
+ padding: 0.25rem 0;
74
+ }
75
+
76
+ .calendar-cell {
77
+ width: 2.25rem;
78
+ height: 2.25rem;
79
+ display: flex;
80
+ align-items: center;
81
+ justify-content: center;
82
+ font-size: 0.875rem;
83
+ border-radius: $border-radius;
84
+ cursor: pointer;
85
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
86
+ color: $body-color;
87
+ position: relative;
88
+ overflow: visible;
89
+
90
+ &:hover:not(.disabled):not(.selected):not(.in-range) {
91
+ background-color: $gray-100;
92
+ transform: scale(1.05);
93
+ }
94
+
95
+ &.selected,
96
+ &.range-start,
97
+ &.range-end {
98
+ background-color: $primary;
99
+ color: #fff;
100
+ font-weight: $font-weight-semibold;
101
+ box-shadow: 0 4px 6px -1px rgba($primary, 0.4);
102
+ border-radius: $border-radius;
103
+ transform: scale(1.05);
104
+ }
105
+
106
+ &.range-start {
107
+ border-top-right-radius: 0;
108
+ border-bottom-right-radius: 0;
109
+ }
110
+
111
+ &.range-end {
112
+ border-top-left-radius: 0;
113
+ border-bottom-left-radius: 0;
114
+ }
115
+
116
+ &.in-range:not(.range-start):not(.range-end) {
117
+ background-color: color.scale($primary, $lightness: 85%);
118
+ color: color.scale($primary, $lightness: -20%);
119
+ border-radius: 0;
120
+ }
121
+
122
+ &.today {
123
+ border: 2px solid $primary;
124
+ font-weight: $font-weight-semibold;
125
+
126
+ &::after {
127
+ content: '';
128
+ position: absolute;
129
+ bottom: 2px;
130
+ left: 50%;
131
+ transform: translateX(-50%);
132
+ width: 4px;
133
+ height: 4px;
134
+ background-color: $primary;
135
+ border-radius: 50%;
136
+ }
137
+ }
138
+
139
+ &.weekend {
140
+ color: $danger;
141
+ }
142
+
143
+ &.disabled {
144
+ color: $gray-300;
145
+ cursor: not-allowed;
146
+ pointer-events: none;
147
+ text-decoration: line-through;
148
+ }
149
+
150
+ &.outside-month {
151
+ color: $gray-400;
152
+ opacity: 0.5;
153
+ }
154
+
155
+ &.multi-selected {
156
+ background-color: $success;
157
+ color: #fff;
158
+ font-weight: $font-weight-semibold;
159
+ box-shadow: 0 2px 4px rgba($success, 0.3);
160
+ }
161
+
162
+ // Event indicators
163
+ &.has-event {
164
+ position: relative;
165
+
166
+ &::before {
167
+ content: '';
168
+ position: absolute;
169
+ bottom: 3px;
170
+ left: 50%;
171
+ transform: translateX(-50%);
172
+ width: 4px;
173
+ height: 4px;
174
+ background-color: $primary;
175
+ border-radius: 50%;
176
+ }
177
+
178
+ &.has-multiple-events::before {
179
+ width: 6px;
180
+ height: 6px;
181
+ }
182
+ }
183
+
184
+ .event-dot {
185
+ position: absolute;
186
+ bottom: 3px;
187
+ width: 4px;
188
+ height: 4px;
189
+ border-radius: 50%;
190
+
191
+ &.event-primary {
192
+ background-color: $primary;
193
+ }
194
+
195
+ &.event-success {
196
+ background-color: $success;
197
+ }
198
+
199
+ &.event-danger {
200
+ background-color: $danger;
201
+ }
202
+
203
+ &.event-warning {
204
+ background-color: $warning;
205
+ }
206
+
207
+ &.event-info {
208
+ background-color: $info;
209
+ }
210
+ }
211
+ }
212
+
213
+ // Event list in calendar
214
+ .calendar-events {
215
+ margin-top: 1rem;
216
+ padding-top: 1rem;
217
+ border-top: 1px solid $gray-200;
218
+ max-height: 250px;
219
+ overflow-y: auto;
220
+ overflow-x: hidden;
221
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
222
+
223
+ &.collapsed {
224
+ max-height: 0;
225
+ padding-top: 0;
226
+ margin-top: 0;
227
+ border-top: none;
228
+ opacity: 0;
229
+ }
230
+
231
+ .events-header {
232
+ display: flex;
233
+ justify-content: space-between;
234
+ align-items: center;
235
+ margin-bottom: 0.75rem;
236
+ padding: 0 0.25rem;
237
+
238
+ h6 {
239
+ margin: 0;
240
+ font-size: 0.875rem;
241
+ font-weight: $font-weight-bold;
242
+ color: $dark;
243
+ white-space: nowrap;
244
+ overflow: hidden;
245
+ text-overflow: ellipsis;
246
+ }
247
+
248
+ button {
249
+ flex-shrink: 0;
250
+ white-space: nowrap;
251
+ }
252
+ }
253
+
254
+ .event-item {
255
+ display: flex;
256
+ align-items: center;
257
+ gap: 0.75rem;
258
+ padding: 0.75rem;
259
+ margin-bottom: 0.5rem;
260
+ border-radius: $border-radius;
261
+ background-color: #fff;
262
+ border: 1px solid $gray-200;
263
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
264
+ cursor: pointer;
265
+
266
+ &:hover {
267
+ background-color: $gray-50;
268
+ border-color: $gray-300;
269
+ transform: translateX(4px);
270
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
271
+ }
272
+
273
+ &:active {
274
+ transform: translateX(2px);
275
+ }
276
+
277
+ .event-color {
278
+ width: 10px;
279
+ height: 10px;
280
+ border-radius: 50%;
281
+ flex-shrink: 0;
282
+ box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.05);
283
+ }
284
+
285
+ .event-details {
286
+ flex: 1;
287
+ min-width: 0;
288
+
289
+ .event-title {
290
+ font-size: 0.875rem;
291
+ font-weight: $font-weight-semibold;
292
+ color: $dark;
293
+ margin: 0 0 0.25rem 0;
294
+ white-space: nowrap;
295
+ overflow: hidden;
296
+ text-overflow: ellipsis;
297
+ }
298
+
299
+ .event-time {
300
+ font-size: 0.75rem;
301
+ color: $gray-600;
302
+ margin: 0;
303
+ }
304
+ }
305
+ }
306
+ }
307
+ }
308
+
309
+ // Compact Variant
310
+ .calendar-compact {
311
+ width: 240px;
312
+ padding: 0.75rem;
313
+
314
+ .calendar-header {
315
+ margin-bottom: 0.75rem;
316
+
317
+ .calendar-title {
318
+ font-size: 0.875rem;
319
+ }
320
+
321
+ .calendar-nav-btn {
322
+ padding: 0.25rem;
323
+ width: 1.5rem;
324
+ height: 1.5rem;
325
+ font-size: 1rem;
326
+ }
327
+ }
328
+
329
+ .calendar-cell {
330
+ width: 1.75rem;
331
+ height: 1.75rem;
332
+ font-size: 0.75rem;
333
+ }
334
+
335
+ .calendar-week-day {
336
+ font-size: 0.625rem;
337
+ margin-bottom: 0.25rem;
338
+ }
339
+ }
340
+
341
+ // Card Variant
342
+ .calendar-card {
343
+ box-shadow: $box-shadow;
344
+ border: 1px solid $gray-200;
345
+ padding: 1.5rem;
346
+
347
+ &:hover {
348
+ box-shadow: $box-shadow-lg;
349
+ transform: translateY(-2px);
350
+ }
351
+
352
+ .calendar-header {
353
+ padding-bottom: 1rem;
354
+ border-bottom: 1px solid $gray-200;
355
+ margin-bottom: 1rem;
356
+ }
357
+ }
358
+
359
+ // Inline Variant
360
+ .calendar-inline {
361
+ width: 100%;
362
+ max-width: 100%;
363
+ box-shadow: none;
364
+ border: 1px solid $gray-300;
365
+ border-radius: $border-radius;
366
+
367
+ .calendar-grid {
368
+ gap: 0.5rem;
369
+ }
370
+
371
+ .calendar-cell {
372
+ width: 100%;
373
+ height: 2.5rem;
374
+ }
375
+ }
376
+
377
+ // Date Picker
378
+ .date-picker {
379
+ position: relative;
380
+ display: inline-block;
381
+
382
+ .date-picker-input-group {
383
+ position: relative;
384
+ display: flex;
385
+ align-items: center;
386
+
387
+ .form-control {
388
+ padding-right: 2.5rem;
389
+ }
390
+
391
+ .date-picker-icon {
392
+ position: absolute;
393
+ right: 0.75rem;
394
+ pointer-events: none;
395
+ font-size: 1.25rem;
396
+ color: $gray-500;
397
+ }
398
+ }
399
+
400
+ .date-picker-popover {
401
+ position: absolute;
402
+ top: calc(100% + 0.5rem);
403
+ left: 0;
404
+ z-index: 1050;
405
+ display: none;
406
+ background: #fff;
407
+ border-radius: $border-radius-lg;
408
+ box-shadow: $box-shadow-lg;
409
+ padding: 0.5rem;
410
+
411
+ &.show {
412
+ display: block;
413
+ animation: fadeInDown 0.3s cubic-bezier(0.4, 0, 0.2, 1);
414
+ }
415
+
416
+ // Make calendar compact in date picker
417
+ .calendar {
418
+ width: 260px;
419
+ padding: 0.75rem;
420
+ box-shadow: none;
421
+
422
+ .calendar-header {
423
+ margin-bottom: 0.75rem;
424
+
425
+ .calendar-title {
426
+ font-size: 0.9rem;
427
+ }
428
+
429
+ .calendar-nav-btn {
430
+ width: 1.75rem;
431
+ height: 1.75rem;
432
+ font-size: 1.1rem;
433
+ }
434
+ }
435
+
436
+ .calendar-cell {
437
+ width: 2rem;
438
+ height: 2rem;
439
+ font-size: 0.8rem;
440
+ }
441
+
442
+ .calendar-week-day {
443
+ font-size: 0.7rem;
444
+ margin-bottom: 0.4rem;
445
+ }
446
+ }
447
+ }
448
+ }
449
+
450
+ @keyframes fadeInDown {
451
+ from {
452
+ opacity: 0;
453
+ transform: translateY(-10px);
454
+ }
455
+
456
+ to {
457
+ opacity: 1;
458
+ transform: translateY(0);
459
+ }
460
+ }
461
+
462
+ // Time Input
463
+ .time-input {
464
+ display: inline-flex;
465
+ align-items: center;
466
+ gap: 0.5rem;
467
+ padding: 0.5rem 1rem;
468
+ background-color: $gray-100;
469
+ border-radius: $border-radius;
470
+ border: 1px solid $gray-300;
471
+ transition: all 0.2s;
472
+
473
+ &:focus-within {
474
+ border-color: $primary;
475
+ box-shadow: 0 0 0 0.25rem rgba($primary, 0.25);
476
+ background-color: #fff;
477
+ }
478
+
479
+ input {
480
+ width: 3rem;
481
+ text-align: center;
482
+ border: none;
483
+ background: transparent;
484
+ font-size: 1.25rem;
485
+ font-weight: $font-weight-semibold;
486
+ color: $dark;
487
+ outline: none;
488
+
489
+ &::-webkit-inner-spin-button,
490
+ &::-webkit-outer-spin-button {
491
+ opacity: 1;
492
+ }
493
+ }
494
+
495
+ .time-separator {
496
+ font-size: 1.5rem;
497
+ font-weight: $font-weight-bold;
498
+ color: $gray-400;
499
+ }
500
+
501
+ .time-period {
502
+ padding: 0.25rem 0.75rem;
503
+ background-color: $primary;
504
+ color: #fff;
505
+ border-radius: $border-radius;
506
+ font-size: 0.875rem;
507
+ font-weight: $font-weight-semibold;
508
+ cursor: pointer;
509
+ transition: all 0.2s;
510
+
511
+ &:hover {
512
+ background-color: color.scale($primary, $lightness: -10%);
513
+ transform: scale(1.05);
514
+ }
515
+
516
+ &:active {
517
+ transform: scale(0.95);
518
+ }
519
+ }
520
+ }
@@ -0,0 +1,52 @@
1
+ // Card component styles
2
+ // Can be imported individually: @use 'eldo-ui/scss/components/card';
3
+
4
+ .card {
5
+ position: relative;
6
+ display: flex;
7
+ flex-direction: column;
8
+ min-width: 0;
9
+ word-wrap: break-word;
10
+ background-color: #fff;
11
+ background-clip: border-box;
12
+ border: 1px solid #e2e8f0;
13
+ border-radius: 0.5rem;
14
+
15
+ &.card-hoverable {
16
+ transition: all 0.3s ease;
17
+
18
+ &:hover {
19
+ transform: translateY(-4px);
20
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1);
21
+ }
22
+ }
23
+ }
24
+
25
+ .card-body {
26
+ flex: 1 1 auto;
27
+ padding: 1.5rem;
28
+ }
29
+
30
+ .card-title {
31
+ margin-bottom: 0.75rem;
32
+ font-size: 1.25rem;
33
+ font-weight: 600;
34
+ }
35
+
36
+ .card-text {
37
+ margin-bottom: 0;
38
+ color: #64748b;
39
+ }
40
+
41
+ .card-header {
42
+ padding: 1rem 1.5rem;
43
+ margin-bottom: 0;
44
+ background-color: #f8fafc;
45
+ border-bottom: 1px solid #e2e8f0;
46
+ }
47
+
48
+ .card-footer {
49
+ padding: 1rem 1.5rem;
50
+ background-color: #f8fafc;
51
+ border-top: 1px solid #e2e8f0;
52
+ }
@@ -0,0 +1,123 @@
1
+ @use "../abstracts/variables" as *;
2
+
3
+ .card {
4
+ position: relative;
5
+ display: flex;
6
+ flex-direction: column;
7
+ min-width: 0;
8
+ word-wrap: break-word;
9
+ background-color: #fff;
10
+ background-clip: border-box;
11
+ border: 1px solid rgba(0, 0, 0, 0.125);
12
+ border-radius: $border-radius;
13
+ box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
14
+
15
+ // CSS Optimization
16
+ container-type: inline-size;
17
+ content-visibility: auto;
18
+ contain-intrinsic-size: 0 100px;
19
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
20
+
21
+ &.card-interactive:hover {
22
+ transform: translateY(-5px);
23
+ box-shadow: $box-shadow-lg;
24
+ border-color: rgba($primary, 0.3);
25
+ cursor: pointer;
26
+ }
27
+ }
28
+
29
+ .card-body {
30
+ flex: 1 1 auto;
31
+ padding: 1rem;
32
+ }
33
+
34
+ .card-title {
35
+ margin-bottom: 0.5rem;
36
+ font-size: 1.25rem;
37
+ }
38
+
39
+ .card-subtitle {
40
+ margin-top: -0.25rem;
41
+ margin-bottom: 1rem;
42
+ color: var(--e-secondary);
43
+ }
44
+
45
+ .card-text {
46
+ &:last-child {
47
+ margin-bottom: 0;
48
+ }
49
+ }
50
+
51
+ .card-header {
52
+ padding: 0.5rem 1rem;
53
+ margin-bottom: 0;
54
+ background-color: rgba(0, 0, 0, 0.03);
55
+ border-bottom: 1px solid rgba(0, 0, 0, 0.125);
56
+
57
+ &:first-child {
58
+ border-radius: calc(#{$border-radius} - 1px) calc(#{$border-radius} - 1px) 0 0;
59
+ }
60
+ }
61
+
62
+ .card-footer {
63
+ padding: 0.75rem 1.25rem;
64
+ background-color: rgba(0, 0, 0, 0.01);
65
+ border-top: 1px solid rgba(0, 0, 0, 0.08);
66
+
67
+ &:last-child {
68
+ border-radius: 0 0 calc(#{$border-radius} - 1px) calc(#{$border-radius} - 1px);
69
+ }
70
+ }
71
+
72
+ // Images
73
+ .card-img,
74
+ .card-img-top,
75
+ .card-img-bottom {
76
+ width: 100%;
77
+ }
78
+
79
+ .card-img-top {
80
+ border-top-left-radius: calc(#{$border-radius} - 1px);
81
+ border-top-right-radius: calc(#{$border-radius} - 1px);
82
+ }
83
+
84
+ .card-img-bottom {
85
+ border-bottom-right-radius: calc(#{$border-radius} - 1px);
86
+ border-bottom-left-radius: calc(#{$border-radius} - 1px);
87
+ }
88
+
89
+ .card-img-overlay {
90
+ position: absolute;
91
+ top: 0;
92
+ right: 0;
93
+ bottom: 0;
94
+ left: 0;
95
+ padding: 1rem;
96
+ border-radius: calc(#{$border-radius} - 1px);
97
+ background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.6) 100%);
98
+ color: #fff;
99
+ display: flex;
100
+ flex-direction: column;
101
+ justify-content: flex-end;
102
+ }
103
+
104
+ // Horizontal variation
105
+ .card-horizontal {
106
+ @media (min-width: 768px) {
107
+ flex-direction: row;
108
+
109
+ .card-img-top,
110
+ .card-img-bottom,
111
+ .card-img {
112
+ width: 35%;
113
+ object-fit: cover;
114
+ border-radius: calc(#{$border-radius} - 1px) 0 0 calc(#{$border-radius} - 1px);
115
+ }
116
+
117
+ .card-body {
118
+ display: flex;
119
+ flex-direction: column;
120
+ justify-content: center;
121
+ }
122
+ }
123
+ }