@vanduo-oss/framework 1.2.6 → 1.2.8

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 (54) hide show
  1. package/README.md +39 -5
  2. package/css/components/affix.css +53 -0
  3. package/css/components/bubble.css +165 -0
  4. package/css/components/datepicker.css +216 -0
  5. package/css/components/fab.css +225 -0
  6. package/css/components/flow.css +265 -0
  7. package/css/components/rating.css +112 -0
  8. package/css/components/ripple.css +63 -0
  9. package/css/components/sidenav.css +70 -0
  10. package/css/components/spotlight.css +119 -0
  11. package/css/components/stepper.css +176 -0
  12. package/css/components/suggest.css +119 -0
  13. package/css/components/timeline.css +201 -0
  14. package/css/components/timepicker.css +80 -0
  15. package/css/components/transfer.css +165 -0
  16. package/css/components/tree.css +173 -0
  17. package/css/components/waypoint.css +59 -0
  18. package/css/vanduo.css +17 -0
  19. package/dist/build-info.json +3 -3
  20. package/dist/vanduo.cjs.js +2161 -6
  21. package/dist/vanduo.cjs.js.map +4 -4
  22. package/dist/vanduo.cjs.min.js +5 -5
  23. package/dist/vanduo.cjs.min.js.map +4 -4
  24. package/dist/vanduo.css +1947 -5
  25. package/dist/vanduo.css.map +1 -1
  26. package/dist/vanduo.esm.js +2161 -6
  27. package/dist/vanduo.esm.js.map +4 -4
  28. package/dist/vanduo.esm.min.js +5 -5
  29. package/dist/vanduo.esm.min.js.map +4 -4
  30. package/dist/vanduo.js +2161 -6
  31. package/dist/vanduo.js.map +4 -4
  32. package/dist/vanduo.min.css +2 -2
  33. package/dist/vanduo.min.css.map +1 -1
  34. package/dist/vanduo.min.js +5 -5
  35. package/dist/vanduo.min.js.map +4 -4
  36. package/js/components/affix.js +129 -0
  37. package/js/components/bubble.js +203 -0
  38. package/js/components/datepicker.js +287 -0
  39. package/js/components/flow.js +264 -0
  40. package/js/components/rating.js +160 -0
  41. package/js/components/ripple.js +74 -0
  42. package/js/components/sidenav.js +9 -2
  43. package/js/components/spotlight.js +295 -0
  44. package/js/components/stepper.js +97 -0
  45. package/js/components/suggest.js +219 -0
  46. package/js/components/theme-customizer.js +11 -2
  47. package/js/components/theme-switcher.js +7 -0
  48. package/js/components/timepicker.js +142 -0
  49. package/js/components/transfer.js +206 -0
  50. package/js/components/tree.js +191 -0
  51. package/js/components/validate.js +185 -0
  52. package/js/components/waypoint.js +120 -0
  53. package/js/index.js +16 -0
  54. package/package.json +4 -4
@@ -267,6 +267,76 @@
267
267
  margin-right: var(--sidenav-width-lg);
268
268
  }
269
269
 
270
+ /* ========== Offcanvas Alias ========== */
271
+
272
+ .vd-offcanvas {
273
+ position: fixed;
274
+ top: 0;
275
+ left: 0;
276
+ z-index: var(--sidenav-z-index);
277
+ width: var(--sidenav-width);
278
+ height: 100vh;
279
+ display: flex;
280
+ flex-direction: column;
281
+ background-color: var(--sidenav-bg);
282
+ box-shadow: var(--shadow-lg);
283
+ transform: translateX(-100%);
284
+ transition: var(--sidenav-transition);
285
+ overflow-y: auto;
286
+ overflow-x: hidden;
287
+ }
288
+
289
+ .vd-offcanvas.is-open {
290
+ transform: translateX(0) translateY(0);
291
+ }
292
+
293
+ /* Top direction */
294
+ .vd-sidenav-top,
295
+ .vd-offcanvas-top {
296
+ top: 0;
297
+ left: 0;
298
+ right: 0;
299
+ bottom: auto;
300
+ width: 100%;
301
+ height: auto;
302
+ max-height: 80vh;
303
+ transform: translateY(-100%);
304
+ }
305
+
306
+ .vd-sidenav-top.is-open,
307
+ .vd-offcanvas-top.is-open {
308
+ transform: translateY(0);
309
+ }
310
+
311
+ /* Bottom direction */
312
+ .vd-sidenav-bottom,
313
+ .vd-offcanvas-bottom {
314
+ top: auto;
315
+ left: 0;
316
+ right: 0;
317
+ bottom: 0;
318
+ width: 100%;
319
+ height: auto;
320
+ max-height: 80vh;
321
+ transform: translateY(100%);
322
+ }
323
+
324
+ .vd-sidenav-bottom.is-open,
325
+ .vd-offcanvas-bottom.is-open {
326
+ transform: translateY(0);
327
+ }
328
+
329
+ /* Right alias for offcanvas */
330
+ .vd-offcanvas-right {
331
+ left: auto;
332
+ right: 0;
333
+ transform: translateX(100%);
334
+ }
335
+
336
+ .vd-offcanvas-right.is-open {
337
+ transform: translateX(0);
338
+ }
339
+
270
340
  /* Body Scroll Lock */
271
341
  .body-sidenav-open {
272
342
  overflow: hidden;
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Vanduo Framework - Spotlight (Feature Discovery)
3
+ * Overlay highlight + tooltip tour system
4
+ */
5
+
6
+ :root {
7
+ --spotlight-overlay-bg: rgba(0, 0, 0, 0.5);
8
+ --spotlight-tooltip-bg: var(--card-bg, #fff);
9
+ --spotlight-tooltip-color: var(--text-primary, #212529);
10
+ --spotlight-tooltip-shadow: 0 0.5rem 1.3125rem rgba(0, 0, 0, 0.15);
11
+ --spotlight-tooltip-padding: 1.3125rem; /* 21px - fib */
12
+ --spotlight-tooltip-radius: var(--border-radius, 0.5rem);
13
+ --spotlight-tooltip-max-width: 21rem; /* 336px - fib×16 */
14
+ --spotlight-highlight-padding: 0.5rem; /* 8px - fib */
15
+ --spotlight-z-index: 1080;
16
+ }
17
+
18
+ [data-theme="dark"] {
19
+ --spotlight-tooltip-bg: var(--card-bg, #2d2d44);
20
+ --spotlight-tooltip-shadow: 0 0.5rem 1.3125rem rgba(0, 0, 0, 0.35);
21
+ }
22
+
23
+ @media (prefers-color-scheme: dark) {
24
+ :root:not([data-theme]) {
25
+ --spotlight-tooltip-bg: var(--card-bg, #2d2d44);
26
+ --spotlight-tooltip-shadow: 0 0.5rem 1.3125rem rgba(0, 0, 0, 0.35);
27
+ }
28
+ }
29
+
30
+ /* ========== Overlay ========== */
31
+
32
+ .vd-spotlight-overlay {
33
+ position: fixed;
34
+ top: 0;
35
+ left: 0;
36
+ width: 100vw;
37
+ height: 100vh;
38
+ z-index: var(--spotlight-z-index);
39
+ pointer-events: auto;
40
+ transition: opacity 0.3s ease;
41
+ }
42
+
43
+ /* ========== Tooltip ========== */
44
+
45
+ .vd-spotlight-tooltip {
46
+ position: absolute;
47
+ z-index: calc(var(--spotlight-z-index) + 2);
48
+ background: var(--spotlight-tooltip-bg);
49
+ color: var(--spotlight-tooltip-color);
50
+ padding: var(--spotlight-tooltip-padding);
51
+ border-radius: var(--spotlight-tooltip-radius);
52
+ box-shadow: var(--spotlight-tooltip-shadow);
53
+ max-width: var(--spotlight-tooltip-max-width);
54
+ }
55
+
56
+ .vd-spotlight-title {
57
+ margin: 0 0 0.5rem;
58
+ font-weight: 600;
59
+ font-size: 1.125rem;
60
+ }
61
+
62
+ .vd-spotlight-description {
63
+ margin: 0 0 0.8125rem; /* 13px - fib */
64
+ font-size: 0.875rem;
65
+ line-height: 1.5;
66
+ }
67
+
68
+ /* ========== Footer (nav buttons) ========== */
69
+
70
+ .vd-spotlight-footer {
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: space-between;
74
+ gap: 0.5rem;
75
+ }
76
+
77
+ .vd-spotlight-counter {
78
+ font-size: 0.75rem;
79
+ color: var(--text-muted, #6c757d);
80
+ }
81
+
82
+ .vd-spotlight-actions {
83
+ display: flex;
84
+ gap: 0.3125rem; /* 5px - fib */
85
+ }
86
+
87
+ .vd-spotlight-btn {
88
+ padding: 0.3125rem 0.8125rem; /* 5px 13px - fib */
89
+ border: 1px solid var(--border-color, #dee2e6);
90
+ border-radius: 0.25rem;
91
+ background: transparent;
92
+ cursor: pointer;
93
+ font-size: 0.8125rem;
94
+ transition: background 0.15s ease;
95
+ }
96
+
97
+ .vd-spotlight-btn:hover {
98
+ background: var(--bg-secondary, #f8f9fa);
99
+ }
100
+
101
+ .vd-spotlight-btn-primary {
102
+ background: var(--color-primary, #0d6efd);
103
+ color: #fff;
104
+ border-color: var(--color-primary, #0d6efd);
105
+ }
106
+
107
+ .vd-spotlight-btn-primary:hover {
108
+ background: var(--color-primary-dark, #0b5ed7);
109
+ }
110
+
111
+ /* ========== Highlighted Target ========== */
112
+
113
+ .vd-spotlight-target {
114
+ position: relative;
115
+ z-index: calc(var(--spotlight-z-index) + 1);
116
+ box-shadow: 0 0 0 var(--spotlight-highlight-padding) rgba(13, 110, 253, 0.25),
117
+ 0 0 0 9999px var(--spotlight-overlay-bg);
118
+ border-radius: 0.25rem;
119
+ }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Vanduo Framework - Stepper
3
+ * Multi-step progress indicator with states
4
+ */
5
+
6
+ :root {
7
+ /* Stepper Colors */
8
+ --stepper-active-color: var(--color-primary, #0d6efd);
9
+ --stepper-completed-color: var(--color-success, #198754);
10
+ --stepper-error-color: var(--color-danger, #dc3545);
11
+ --stepper-pending-color: var(--color-gray-400, #ced4da);
12
+ --stepper-text-color: var(--text-primary, #212529);
13
+ --stepper-line-color: var(--border-color, #dee2e6);
14
+
15
+ /* Stepper Dimensions (Fibonacci) */
16
+ --stepper-circle-size: 2.125rem; /* 34px ~ fib */
17
+ --stepper-line-width: 2px;
18
+ --stepper-gap: 0.5rem; /* 8px - fib */
19
+ --stepper-connector-gap: 0.8125rem; /* 13px - fib */
20
+ }
21
+
22
+ [data-theme="dark"] {
23
+ --stepper-pending-color: var(--color-gray-600, #6c757d);
24
+ --stepper-line-color: var(--color-gray-600, #6c757d);
25
+ }
26
+
27
+ @media (prefers-color-scheme: dark) {
28
+ :root:not([data-theme]) {
29
+ --stepper-pending-color: var(--color-gray-600, #6c757d);
30
+ --stepper-line-color: var(--color-gray-600, #6c757d);
31
+ }
32
+ }
33
+
34
+ /* ========== Horizontal (default) ========== */
35
+
36
+ .vd-stepper {
37
+ display: flex;
38
+ align-items: flex-start;
39
+ width: 100%;
40
+ counter-reset: step;
41
+ }
42
+
43
+ .vd-stepper-item {
44
+ display: flex;
45
+ flex-direction: column;
46
+ align-items: center;
47
+ flex: 1;
48
+ position: relative;
49
+ text-align: center;
50
+ }
51
+
52
+ /* Connector line */
53
+ .vd-stepper-item:not(:last-child)::after {
54
+ content: '';
55
+ position: absolute;
56
+ top: calc(var(--stepper-circle-size) / 2);
57
+ left: calc(50% + var(--stepper-circle-size) / 2 + var(--stepper-connector-gap));
58
+ right: calc(-50% + var(--stepper-circle-size) / 2 + var(--stepper-connector-gap));
59
+ height: var(--stepper-line-width);
60
+ background: var(--stepper-line-color);
61
+ z-index: 0;
62
+ }
63
+
64
+ /* Circle indicator */
65
+ .vd-stepper-circle {
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ width: var(--stepper-circle-size);
70
+ height: var(--stepper-circle-size);
71
+ border-radius: 50%;
72
+ border: var(--stepper-line-width) solid var(--stepper-pending-color);
73
+ background: var(--bg-primary, #fff);
74
+ font-weight: 600;
75
+ font-size: 0.875rem;
76
+ z-index: 1;
77
+ transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
78
+ counter-increment: step;
79
+ }
80
+
81
+ .vd-stepper-label {
82
+ margin-top: var(--stepper-gap);
83
+ font-size: 0.8125rem;
84
+ font-weight: 500;
85
+ color: var(--text-muted, #6c757d);
86
+ }
87
+
88
+ .vd-stepper-description {
89
+ font-size: 0.75rem;
90
+ color: var(--text-muted, #6c757d);
91
+ margin-top: 0.125rem;
92
+ }
93
+
94
+ /* ========== States ========== */
95
+
96
+ .vd-stepper-item.is-active .vd-stepper-circle {
97
+ border-color: var(--stepper-active-color);
98
+ background: var(--stepper-active-color);
99
+ color: #fff;
100
+ }
101
+
102
+ .vd-stepper-item.is-active .vd-stepper-label {
103
+ color: var(--stepper-active-color);
104
+ font-weight: 600;
105
+ }
106
+
107
+ .vd-stepper-item.is-completed .vd-stepper-circle {
108
+ border-color: var(--stepper-completed-color);
109
+ background: var(--stepper-completed-color);
110
+ color: #fff;
111
+ }
112
+
113
+ .vd-stepper-item.is-completed::after {
114
+ background: var(--stepper-completed-color);
115
+ }
116
+
117
+ .vd-stepper-item.is-completed .vd-stepper-label {
118
+ color: var(--stepper-text-color);
119
+ }
120
+
121
+ .vd-stepper-item.is-error .vd-stepper-circle {
122
+ border-color: var(--stepper-error-color);
123
+ background: var(--stepper-error-color);
124
+ color: #fff;
125
+ }
126
+
127
+ .vd-stepper-item.is-error .vd-stepper-label {
128
+ color: var(--stepper-error-color);
129
+ }
130
+
131
+ /* ========== Vertical ========== */
132
+
133
+ .vd-stepper-vertical {
134
+ flex-direction: column;
135
+ align-items: flex-start;
136
+ }
137
+
138
+ .vd-stepper-vertical .vd-stepper-item {
139
+ flex-direction: row;
140
+ align-items: flex-start;
141
+ flex: none;
142
+ text-align: left;
143
+ padding-bottom: 1.3125rem; /* 21px - fib */
144
+ }
145
+
146
+ .vd-stepper-vertical .vd-stepper-item:not(:last-child)::after {
147
+ top: calc(var(--stepper-circle-size) + var(--stepper-connector-gap));
148
+ left: calc(var(--stepper-circle-size) / 2);
149
+ right: auto;
150
+ bottom: 0;
151
+ width: var(--stepper-line-width);
152
+ height: auto;
153
+ }
154
+
155
+ .vd-stepper-vertical .vd-stepper-label,
156
+ .vd-stepper-vertical .vd-stepper-description {
157
+ margin-top: 0;
158
+ margin-left: 0.8125rem; /* 13px - fib */
159
+ }
160
+
161
+ .vd-stepper-vertical .vd-stepper-content {
162
+ display: flex;
163
+ flex-direction: column;
164
+ margin-left: 0.8125rem;
165
+ }
166
+
167
+ /* ========== Clickable ========== */
168
+
169
+ .vd-stepper-clickable .vd-stepper-item {
170
+ cursor: pointer;
171
+ }
172
+
173
+ .vd-stepper-clickable .vd-stepper-circle:hover {
174
+ transform: scale(1.1);
175
+ transition: transform 0.15s ease;
176
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Vanduo Framework - Suggest (Autocomplete)
3
+ * Dropdown suggestion list for text inputs
4
+ * Primary: .vd-suggest | Alias: .vd-autocomplete
5
+ */
6
+
7
+ :root {
8
+ /* Suggest Colors */
9
+ --suggest-bg: var(--card-bg, #fff);
10
+ --suggest-border-color: var(--border-color, #dee2e6);
11
+ --suggest-shadow: 0 0.25rem 0.8125rem rgba(0, 0, 0, 0.1); /* 4px 13px - fib */
12
+ --suggest-item-hover-bg: var(--bg-secondary, #f8f9fa);
13
+ --suggest-item-active-bg: var(--color-primary, #0d6efd);
14
+ --suggest-item-active-color: #fff;
15
+ --suggest-highlight-color: var(--color-primary, #0d6efd);
16
+
17
+ /* Suggest Spacing (Fibonacci) */
18
+ --suggest-padding: 0.3125rem 0; /* 5px - fib */
19
+ --suggest-item-padding: 0.5rem 0.8125rem; /* 8px 13px - fib */
20
+ --suggest-max-height: 15rem;
21
+ --suggest-border-radius: var(--border-radius, 0.5rem);
22
+
23
+ /* Suggest Z-index */
24
+ --suggest-z-index: 1050;
25
+ }
26
+
27
+ [data-theme="dark"] {
28
+ --suggest-bg: var(--card-bg, #2d2d44);
29
+ --suggest-border-color: var(--border-color, #3d3d5c);
30
+ --suggest-item-hover-bg: var(--bg-primary, #1a1a2e);
31
+ --suggest-shadow: 0 0.25rem 0.8125rem rgba(0, 0, 0, 0.3);
32
+ }
33
+
34
+ @media (prefers-color-scheme: dark) {
35
+ :root:not([data-theme]) {
36
+ --suggest-bg: var(--card-bg, #2d2d44);
37
+ --suggest-border-color: var(--border-color, #3d3d5c);
38
+ --suggest-item-hover-bg: var(--bg-primary, #1a1a2e);
39
+ --suggest-shadow: 0 0.25rem 0.8125rem rgba(0, 0, 0, 0.3);
40
+ }
41
+ }
42
+
43
+ /* ========== Wrapper ========== */
44
+
45
+ .vd-suggest-wrapper,
46
+ .vd-autocomplete-wrapper {
47
+ position: relative;
48
+ display: inline-block;
49
+ width: 100%;
50
+ }
51
+
52
+ /* ========== Dropdown List ========== */
53
+
54
+ .vd-suggest-list {
55
+ position: absolute;
56
+ top: 100%;
57
+ left: 0;
58
+ right: 0;
59
+ z-index: var(--suggest-z-index);
60
+ margin-top: 2px;
61
+ padding: var(--suggest-padding);
62
+ max-height: var(--suggest-max-height);
63
+ overflow-y: auto;
64
+ background: var(--suggest-bg);
65
+ border: 1px solid var(--suggest-border-color);
66
+ border-radius: var(--suggest-border-radius);
67
+ box-shadow: var(--suggest-shadow);
68
+ list-style: none;
69
+ display: none;
70
+ }
71
+
72
+ .vd-suggest-list.is-open {
73
+ display: block;
74
+ }
75
+
76
+ /* ========== Items ========== */
77
+
78
+ .vd-suggest-item {
79
+ padding: var(--suggest-item-padding);
80
+ cursor: pointer;
81
+ transition: background 0.15s ease;
82
+ font-size: var(--font-size-base, 1rem);
83
+ }
84
+
85
+ .vd-suggest-item:hover,
86
+ .vd-suggest-item.is-highlighted {
87
+ background: var(--suggest-item-hover-bg);
88
+ }
89
+
90
+ .vd-suggest-item.is-active {
91
+ background: var(--suggest-item-active-bg);
92
+ color: var(--suggest-item-active-color);
93
+ }
94
+
95
+ /* Match highlight */
96
+ .vd-suggest-match {
97
+ font-weight: 600;
98
+ color: var(--suggest-highlight-color);
99
+ }
100
+
101
+ .vd-suggest-item.is-active .vd-suggest-match {
102
+ color: inherit;
103
+ }
104
+
105
+ /* ========== No Results ========== */
106
+
107
+ .vd-suggest-empty {
108
+ padding: var(--suggest-item-padding);
109
+ color: var(--text-muted, #6c757d);
110
+ font-style: italic;
111
+ }
112
+
113
+ /* ========== Loading ========== */
114
+
115
+ .vd-suggest-loading {
116
+ padding: var(--suggest-item-padding);
117
+ text-align: center;
118
+ color: var(--text-muted, #6c757d);
119
+ }
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Vanduo Framework - Timeline
3
+ * CSS-only vertical timeline layout
4
+ */
5
+
6
+ :root {
7
+ /* Timeline Colors */
8
+ --timeline-line-color: var(--border-color, #dee2e6);
9
+ --timeline-marker-bg: var(--color-primary, #0d6efd);
10
+ --timeline-marker-color: #fff;
11
+ --timeline-content-bg: var(--card-bg, #fff);
12
+ --timeline-content-border: var(--border-color, #dee2e6);
13
+
14
+ /* Timeline Dimensions (Fibonacci) */
15
+ --timeline-line-width: 2px;
16
+ --timeline-marker-size: 0.8125rem; /* 13px - fib */
17
+ --timeline-marker-size-lg: 2.125rem; /* 34px ~ fib */
18
+ --timeline-spacing: 1.3125rem; /* 21px - fib */
19
+ --timeline-content-padding: 0.8125rem; /* 13px - fib */
20
+ --timeline-border-radius: var(--border-radius, 0.5rem);
21
+ }
22
+
23
+ [data-theme="dark"] {
24
+ --timeline-line-color: var(--color-gray-600, #6c757d);
25
+ --timeline-content-bg: var(--card-bg, #2d2d44);
26
+ --timeline-content-border: var(--border-color, #3d3d5c);
27
+ }
28
+
29
+ @media (prefers-color-scheme: dark) {
30
+ :root:not([data-theme]) {
31
+ --timeline-line-color: var(--color-gray-600, #6c757d);
32
+ --timeline-content-bg: var(--card-bg, #2d2d44);
33
+ --timeline-content-border: var(--border-color, #3d3d5c);
34
+ }
35
+ }
36
+
37
+ /* ========== Base (Vertical Left) ========== */
38
+
39
+ .vd-timeline {
40
+ position: relative;
41
+ padding-left: calc(var(--timeline-marker-size) / 2 + var(--timeline-spacing));
42
+ list-style: none;
43
+ margin: 0;
44
+ }
45
+
46
+ /* Vertical line */
47
+ .vd-timeline::before {
48
+ content: '';
49
+ position: absolute;
50
+ top: 0;
51
+ bottom: 0;
52
+ left: calc(var(--timeline-marker-size) / 2 - var(--timeline-line-width) / 2);
53
+ width: var(--timeline-line-width);
54
+ background: var(--timeline-line-color);
55
+ }
56
+
57
+ /* ========== Item ========== */
58
+
59
+ .vd-timeline-item {
60
+ position: relative;
61
+ padding-bottom: var(--timeline-spacing);
62
+ }
63
+
64
+ .vd-timeline-item:last-child {
65
+ padding-bottom: 0;
66
+ }
67
+
68
+ /* ========== Marker ========== */
69
+
70
+ .vd-timeline-marker {
71
+ position: absolute;
72
+ left: calc(-1 * var(--timeline-spacing) - var(--timeline-marker-size) / 2);
73
+ top: 0.25rem;
74
+ width: var(--timeline-marker-size);
75
+ height: var(--timeline-marker-size);
76
+ border-radius: 50%;
77
+ background: var(--timeline-marker-bg);
78
+ border: 2px solid var(--timeline-content-bg);
79
+ box-shadow: 0 0 0 2px var(--timeline-marker-bg);
80
+ }
81
+
82
+ /* Large marker with icon/text */
83
+ .vd-timeline-marker-lg {
84
+ width: var(--timeline-marker-size-lg);
85
+ height: var(--timeline-marker-size-lg);
86
+ left: calc(-1 * var(--timeline-spacing) - var(--timeline-marker-size-lg) / 2);
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ color: var(--timeline-marker-color);
91
+ font-size: 0.875rem;
92
+ }
93
+
94
+ /* ========== Content ========== */
95
+
96
+ .vd-timeline-content {
97
+ background: var(--timeline-content-bg);
98
+ border: 1px solid var(--timeline-content-border);
99
+ border-radius: var(--timeline-border-radius);
100
+ padding: var(--timeline-content-padding);
101
+ }
102
+
103
+ .vd-timeline-title {
104
+ margin: 0 0 0.3125rem; /* 5px - fib */
105
+ font-weight: 600;
106
+ font-size: 1rem;
107
+ }
108
+
109
+ .vd-timeline-date {
110
+ font-size: 0.75rem;
111
+ color: var(--text-muted, #6c757d);
112
+ margin-bottom: 0.3125rem;
113
+ }
114
+
115
+ .vd-timeline-text {
116
+ margin: 0;
117
+ font-size: 0.875rem;
118
+ }
119
+
120
+ /* ========== Color Variants ========== */
121
+
122
+ .vd-timeline-item.vd-timeline-success .vd-timeline-marker {
123
+ background: var(--color-success, #198754);
124
+ box-shadow: 0 0 0 2px var(--color-success, #198754);
125
+ }
126
+
127
+ .vd-timeline-item.vd-timeline-warning .vd-timeline-marker {
128
+ background: var(--color-warning, #ffc107);
129
+ box-shadow: 0 0 0 2px var(--color-warning, #ffc107);
130
+ }
131
+
132
+ .vd-timeline-item.vd-timeline-danger .vd-timeline-marker {
133
+ background: var(--color-danger, #dc3545);
134
+ box-shadow: 0 0 0 2px var(--color-danger, #dc3545);
135
+ }
136
+
137
+ /* ========== Alternating Mode ========== */
138
+
139
+ .vd-timeline-alternating {
140
+ padding-left: 0;
141
+ }
142
+
143
+ .vd-timeline-alternating::before {
144
+ left: 50%;
145
+ transform: translateX(-50%);
146
+ }
147
+
148
+ .vd-timeline-alternating .vd-timeline-item {
149
+ width: 50%;
150
+ padding-right: var(--timeline-spacing);
151
+ padding-left: 0;
152
+ }
153
+
154
+ .vd-timeline-alternating .vd-timeline-item:nth-child(odd) {
155
+ margin-left: 0;
156
+ text-align: right;
157
+ }
158
+
159
+ .vd-timeline-alternating .vd-timeline-item:nth-child(odd) .vd-timeline-marker {
160
+ left: auto;
161
+ right: calc(-1 * var(--timeline-marker-size) / 2 - 1px);
162
+ }
163
+
164
+ .vd-timeline-alternating .vd-timeline-item:nth-child(even) {
165
+ margin-left: 50%;
166
+ padding-left: var(--timeline-spacing);
167
+ padding-right: 0;
168
+ }
169
+
170
+ .vd-timeline-alternating .vd-timeline-item:nth-child(even) .vd-timeline-marker {
171
+ left: calc(-1 * var(--timeline-marker-size) / 2 - 1px);
172
+ }
173
+
174
+ /* ========== Responsive ========== */
175
+
176
+ @media (max-width: 768px) {
177
+ .vd-timeline-alternating {
178
+ padding-left: calc(var(--timeline-marker-size) / 2 + var(--timeline-spacing));
179
+ }
180
+
181
+ .vd-timeline-alternating::before {
182
+ left: calc(var(--timeline-marker-size) / 2 - var(--timeline-line-width) / 2);
183
+ transform: none;
184
+ }
185
+
186
+ .vd-timeline-alternating .vd-timeline-item,
187
+ .vd-timeline-alternating .vd-timeline-item:nth-child(odd),
188
+ .vd-timeline-alternating .vd-timeline-item:nth-child(even) {
189
+ width: 100%;
190
+ margin-left: 0;
191
+ padding-left: 0;
192
+ padding-right: 0;
193
+ text-align: left;
194
+ }
195
+
196
+ .vd-timeline-alternating .vd-timeline-item:nth-child(odd) .vd-timeline-marker,
197
+ .vd-timeline-alternating .vd-timeline-item:nth-child(even) .vd-timeline-marker {
198
+ left: calc(-1 * var(--timeline-spacing) - var(--timeline-marker-size) / 2);
199
+ right: auto;
200
+ }
201
+ }