@kendawson-online/vantl 2.0.6 → 2.1.0

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.
package/README.md CHANGED
@@ -1,14 +1,6 @@
1
1
  # Vantl - Vanilla Timeline
2
2
 
3
- Vantl is a lightweight, responsive timeline library created with vanilla Javascript for creating beautiful horizontal and vertical timelines with zero dependencies. Inspired by [timeline](https://github.com/squarechip/timeline) originally created by [squarechip](https://github.com/squarechip) in 2018.
4
-
5
- <table align="center">
6
- <tr>
7
- <td><img src="demo/assets/img/horizontal-screenshot.png" width="650"></td>
8
- </tr>
9
- </table>
10
-
11
- <br/>
3
+ Vantl is a lightweight, responsive timeline library created with vanilla Javascript for creating beautiful horizontal and vertical timelines with zero dependencies. Inspired by [timeline](https://github.com/squarechip/timeline) originally created by [squarechip](https://github.com/squarechip) in 2018. You can load your timeline data via a variety of methods and, you can include multiple timelines on a single page.
12
4
 
13
5
  ## Features
14
6
 
@@ -35,14 +27,14 @@ Load stylesheet and Javascript functions to your document via CDN links:
35
27
  <html>
36
28
  <head>
37
29
  <!-- load stylesheet -->
38
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@kendawson-online/vantl@2/dist/timeline.min.css">
30
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@kendawson-online/vantl@latest/dist/timeline.min.css">
39
31
  </head>
40
32
  <body>
41
33
 
42
34
  <!-- your timeline will go here -->
43
35
 
44
36
  <!-- load functions -->
45
- <script src="https://cdn.jsdelivr.net/npm/@kendawson-online/vantl@2/dist/timeline.min.js"></script>
37
+ <script src="https://cdn.jsdelivr.net/npm/@kendawson-online/vantl@latest/dist/timeline.min.js"></script>
46
38
  </body>
47
39
  </html>
48
40
  ````
@@ -87,7 +79,7 @@ Add one line of code at the bottom to initialize your timeline. It goes after th
87
79
 
88
80
  ````html
89
81
  <!-- load functions -->
90
- <script src="https://cdn.jsdelivr.net/npm/@kendawson-online/vantl@2/dist/timeline.min.js"></script>
82
+ <script src="https://cdn.jsdelivr.net/npm/@kendawson-online/vantl@latest/dist/timeline.min.js"></script>
91
83
 
92
84
  <!-- initialize the timeline -->
93
85
  <script>
@@ -100,7 +92,7 @@ Add one line of code at the bottom to initialize your timeline. It goes after th
100
92
 
101
93
  <br/>
102
94
 
103
- ### <a href="demo/basic-example.html" target="_blank">View A Basic HTML Example (With Source Code)</a> 👀
95
+ ### <a href="https://kendawson.online/vantl/demo/bare-bones-example.html" target="_blank">View A Basic HTML Example (With Source Code)</a> 👀
104
96
 
105
97
  <br/><br/>
106
98
 
@@ -110,7 +102,7 @@ Note: if you're using <a href="https://jquery.com" target="_blank">jQuery</a> in
110
102
 
111
103
  ````html
112
104
  <!-- load functions -->
113
- <script src="https://cdn.jsdelivr.net/npm/@kendawson-online/vantl@2/dist/timeline.min.js"></script>
105
+ <script src="https://cdn.jsdelivr.net/npm/@kendawson-online/vantl@latest/dist/timeline.min.js"></script>
114
106
 
115
107
  <!-- initialize timeline with jQuery -->
116
108
  <script>
@@ -151,11 +143,11 @@ Here are the available data attributes:
151
143
  | `data-mode` | string | `'vertical'` | Layout mode: `'vertical'` or `'horizontal'` |
152
144
  | `data-min-width` | number | `600` | Minimum viewport width (px) to maintain horizontal mode |
153
145
  | `data-max-width` | number | `600` | Maximum viewport width (px) to maintain vertical mode |
154
- | `data-visible-items` | number | `3` | Number of items in horizontal viewport |
155
146
  | `data-move-items` | number | `1` | Items to scroll per navigation click (horizontal) |
156
147
  | `data-start-index` | number | `0` | Initial item index (horizontal mode) |
157
148
  | `data-horizontal-start-position` | string | `'top'` | First item alignment in horizontal layout: `'top'` or `'bottom'` |
158
149
  | `data-vertical-start-position` | string | `'left'` | First item alignment in vertical layout: `'left'` or `'right'` |
150
+ | `data-same-side-nodes` | string|boolean | `false` | If set, forces all nodes to the same side. Accepts `'top'`/`'bottom'` (horizontal) or `'left'`/`'right'` (vertical). Use `data-same-side-nodes="true"` to follow the orientation-specific start position (`data-horizontal-start-position` / `data-vertical-start-position`). |
159
151
  | `data-vertical-trigger` | string | `'15%'` | Scroll trigger distance: percentage or px (e.g., `'20%'` or `'150px'`) |
160
152
  | `data-rtl-mode` | boolean | `false` | Right to left mode: `true` or `false` (only works in horizontal mode and overrides `startIndex` setting) |
161
153
  | `data-node-color` | string | — | Node circle color (hex/rgb/hsl) |
@@ -185,12 +177,11 @@ It's a lightweight text format stored in a file with a `.json` extension. It's e
185
177
  {
186
178
  "timelineName": "Timeline Title",
187
179
  "layoutMode": "horizontal",
188
- "visibleItems": 5,
189
180
  "minWidth": 700,
190
181
  "maxWidth": "",
191
182
  "nodeColor": "",
192
183
  "lineColor": "",
193
- "navColor": "",
184
+ "navColor": ""
194
185
  }
195
186
  ````
196
187
 
@@ -222,9 +213,9 @@ Here are some examples of JSON files you can use as templates to build your own
222
213
 
223
214
  🗓️ **A NOTE ABOUT DATES IN JSON** 🗓️
224
215
 
225
- If there are dates stored in these JSON files (e.g. the `lastupdated` field), they're stored in a special format named ISO 8601. The vanilla timeline app expects dates to be in this format.
216
+ Dates stored in JSON data files (e.g. the `lastupdated` field) are stored in a special format called ISO 8601. The vanilla timeline app expects dates to be in this specific format.
226
217
 
227
- There is a [demo page](demo/time.html) included which displays this date format for you. This page also teaches you how to generate the ISO 8601 timestamp in the developer console of your web browser. Open the [demo/time.html](demo/time.html) file in your browser to see a current ISO 8601 timestamp. You can copy/paste this date string directly into your JSON timelines.
218
+ There is a [demo page](https://kendawson.online/vantl/demo/time.html) which displays dates in this format for you. The page also teaches you how to generate ISO 8601 timestamps in the developer console of your own web browser. Open the [demo/time.html](https://kendawson.online/vantl/demo/time.html) file in a browser to see a current ISO 8601 timestamp. You can copy/paste this date string directly to your JSON timelines.
228
219
 
229
220
  ----
230
221
 
@@ -300,8 +291,7 @@ timeline(document.querySelectorAll('.timeline'), {
300
291
  ```javascript
301
292
  // vanilla Javascript
302
293
  timeline(document.querySelectorAll('.timeline'), {
303
- mode: 'horizontal',
304
- visibleItems: 3,
294
+ mode: 'horizontal'
305
295
  });
306
296
 
307
297
 
@@ -321,11 +311,11 @@ All options can be set via JavaScript API, data attributes, or with JSON config.
321
311
  | `mode` | string | `'vertical'` | Layout mode: `'vertical'` or `'horizontal'` |
322
312
  | `minWidth` | number | `600` | Min viewport width (px) to maintain horizontal mode |
323
313
  | `maxWidth` | number | `600` | Max viewport width (px) to maintain vertical mode |
324
- | `visibleItems` | number | `3` | Number of items in horizontal viewport |
325
314
  | `moveItems` | number | `1` | Items to scroll per navigation click (horizontal) |
326
315
  | `startIndex` | number | `0` | Initial item index (horizontal mode) |
327
316
  | `horizontalStartPosition` | string | `'top'` | First item alignment: `'top'` or `'bottom'` |
328
317
  | `verticalStartPosition` | string | `'left'` | First item alignment: `'left'` or `'right'` |
318
+ | `sameSideNodes` | string|boolean | `false` | Force all nodes to the same side. Accepted literal values: `'top'`, `'bottom'`, `'left'`, `'right'`. Use `true` to follow the orientation-specific start position (`horizontalStartPosition` / `verticalStartPosition`). |
329
319
  | `verticalTrigger` | string | `'15%'` | Scroll trigger distance: percentage or px (e.g., `'20%'` or `'150px'`) |
330
320
  | `rtlMode` | boolean | `false` | Right-to-left mode (horizontal) |
331
321
  | `nodeColor` | string | — | Node circle color (hex/rgb/hsl) |
@@ -353,8 +343,8 @@ Override the auto-detected image path:
353
343
  loadDataFromJson('/data/timeline.json', '#myTimeline');
354
344
 
355
345
  // Clear cache
356
- clearTimelineCache(); // Clear all
357
- clearTimelineCache('timelineId'); // Clear specific
346
+ clearTimelineCache(); // Clear all cached JSON timelines
347
+ clearTimelineCache('/data/my-timeline.json'); // Clear cache for specific JSON URL
358
348
 
359
349
  // Navigate to node (horizontal mode)
360
350
  navigateTimelineToNodeIndex(containerElement, 5);
@@ -371,6 +361,27 @@ closeTimelineModal();
371
361
  - [API Documentation](API-Documentation.md)
372
362
  - [Development Documentation](Development.md)
373
363
 
364
+ <br/>
365
+
366
+ ### Optional SwiperJS add-on (not bundled or supported)
367
+
368
+ - [SwiperJS](https://swiperjs.com) is a third-party library; Vantl only ships an adapter. You must bring Swiper yourself and consult the Swiper docs for setup and features.
369
+ - Resolution order when `useSwiper` is enabled: `options.swiperCdn` (ESM URL) → installed `swiper` package (dynamic import) → `window.Swiper` from a UMD CDN. If none are found, Vanilla Timeline falls back to its built-in carousel controls.
370
+ - Enable with `data-use-swiper="true"` (or boolean `true`) in HTML or `useSwiper: 'true' | 'auto' | true` in JS. Pass Swiper options via `swiperOptions`.
371
+ - Build warning about unresolved `swiper` is expected when you have not installed it; either ignore, mark it external (e.g., `external: ['swiper']`), or install Swiper to silence the warning.
372
+
373
+ UMD CDN example (provides `window.Swiper`):
374
+
375
+ ```html
376
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@12.4.7/swiper-bundle.min.css">
377
+ <script src="https://cdn.jsdelivr.net/npm/swiper@12.4.7/swiper-bundle.min.js"></script>
378
+ <script src="dist/timeline.min.js"></script>
379
+ <script>
380
+ timeline(document.querySelectorAll('.timeline'), { useSwiper: 'auto' });
381
+ // Swiper-specific options: { swiperOptions: { loop: true } }
382
+ </script>
383
+ ```
384
+
374
385
  ## Browser Support
375
386
 
376
387
  - Chrome/Edge (2018+)
@@ -403,6 +414,19 @@ You can report issues and open pull requests on GitHub:
403
414
 
404
415
  [MIT License](LICENSE)
405
416
 
417
+ ---
418
+
419
+ **Note (optional Swiper integration):**
420
+
421
+ You may see a Rollup warning during `npm run build` similar to:
422
+
423
+ ```
424
+ (!) Unresolved dependencies
425
+ swiper (imported by "src/adapters/swiper-adapter.js")
426
+ ```
427
+
428
+ This is expected when Swiper is optional (not installed) because the adapter attempts to load Swiper at runtime via an ESM CDN, dynamic import, or `window.Swiper` (UMD). The build still completes; if you want Rollup to stop warning, add `external: ['swiper']` to `rollup.config.js`, or install `swiper` locally to include it in the bundle.
429
+
406
430
 
407
431
  ## Credits
408
432
 
@@ -0,0 +1,50 @@
1
+ <?xml version="1.0" ?>
2
+
3
+
4
+ <svg width="800px" height="800px" viewBox="0 0 48 48" enable-background="new 0 0 48 48" id="_x3C_Layer_x3E_" version="1.1" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="7.8" height="14"><path fill="none" stroke="#ddd" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M6.8 1L1 7l5.8 6"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="7.8" height="14"><path fill="none" stroke="#ddd" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M1 13l5.8-5.9L1 1"/></svg>
@@ -0,0 +1,29 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
+ <svg height="800px" width="800px" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
4
+ viewBox="0 0 512 512" xml:space="preserve">
5
+ <g transform="translate(1 1)">
6
+ <polygon style="fill:#CCCCCC;" points="272.655,449.207 502.172,449.207 502.172,60.793 272.655,60.793 "/>
7
+ <polygon style="fill:#FFFFFF;" points="7.828,449.207 237.345,449.207 237.345,60.793 7.828,60.793 "/>
8
+ <polygon style="fill:#E2E3E5;" points="34.31,449.207 475.69,449.207 475.69,60.793 34.31,60.793 "/>
9
+ <path style="fill:#E0E0E0;" d="M167.607,198.503c0,22.069-17.655,40.607-40.607,40.607s-39.724-18.538-39.724-40.607
10
+ s17.655-40.607,40.607-40.607S167.607,175.552,167.607,198.503"/>
11
+ <path style="fill:#F0F0F0;" d="M141.124,198.503c0,22.069-12.359,40.607-27.366,40.607s-26.483-18.538-26.483-40.607
12
+ s12.359-40.607,27.366-40.607S141.124,175.552,141.124,198.503"/>
13
+ <g>
14
+ <path style="fill:#B6B6B6;" d="M502.172,458.034H7.828c-5.297,0-8.828-3.531-8.828-8.828V60.793c0-5.297,3.531-8.828,8.828-8.828
15
+ h494.345c5.297,0,8.828,3.531,8.828,8.828v388.414C511,454.503,507.469,458.034,502.172,458.034z M16.655,440.379h476.69V69.621
16
+ H16.655V440.379z"/>
17
+ <path style="fill:#B6B6B6;" d="M127.883,247.055c-27.366,0-49.434-22.069-49.434-49.434s22.069-49.434,49.434-49.434
18
+ s49.434,22.069,49.434,49.434S154.366,247.055,127.883,247.055z M127.883,166.724c-17.655,0-31.779,14.124-31.779,31.779
19
+ s14.124,31.779,31.779,31.779s31.779-14.124,31.779-31.779S144.655,166.724,127.883,166.724z"/>
20
+ <path style="fill:#B6B6B6;" d="M60.793,405.069c-2.648,0-5.297-0.883-7.062-2.648c-3.531-3.531-2.648-8.828,0.883-12.359
21
+ l150.069-132.414c3.531-2.648,8.828-2.648,12.359,0l97.103,97.103c3.531,3.531,3.531,8.828,0,12.359
22
+ c-3.531,3.531-8.828,3.531-12.359,0l-90.924-90.924L66.972,403.303C65.207,404.186,62.559,405.069,60.793,405.069z"/>
23
+ <path style="fill:#B6B6B6;" d="M259.414,321.207c-1.766,0-4.414-0.883-6.179-2.648c-3.531-3.531-3.531-8.828-0.883-12.359
24
+ l92.69-101.517c1.766-1.766,3.531-2.648,6.179-2.648c2.648,0,4.414,0.883,6.179,2.648l105.931,97.103
25
+ c3.531,3.531,3.531,8.828,0.883,12.359c-3.531,3.531-8.828,3.531-12.359,0.883l-98.869-91.807l-86.51,95.338
26
+ C263.828,320.324,262.062,321.207,259.414,321.207z"/>
27
+ </g>
28
+ </g>
29
+ </svg>
@@ -1,2 +1,2 @@
1
- .timeline{--timeline-line-color:#ddd;--timeline-node-color:#ddd;--timeline-node-bg:#fff;--timeline-nav-color:#fff;--timeline-nav-border:#ddd;box-sizing:border-box;overflow-x:hidden;position:relative}.timeline__heading{color:#333;font-size:2rem;font-weight:700;margin:0 0 60px;text-align:center}.timeline *,.timeline :after,.timeline :before{box-sizing:inherit}.timeline:not(.timeline--horizontal):before{background-color:var(--timeline-line-color);bottom:0;content:"";left:50%;margin-left:-2px;position:absolute;top:0;width:4px;z-index:1}.timeline__wrap{overflow:hidden;position:relative;z-index:2}.timeline--horizontal .timeline__wrap{overflow:visible}.timeline__item{font-size:1rem;padding:10px 40px 10px 0;position:relative;width:50%;z-index:2}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__content{display:flex;flex-direction:column;max-height:200px}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__image{flex-shrink:0}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__content>div{display:flex;flex:1;flex-direction:column;min-height:0;overflow:hidden}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__content h3{flex-shrink:0;margin:0 0 6px;text-align:center}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__content p{flex:1;margin-bottom:0;min-height:0;overflow:hidden}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__image{height:auto;margin:0 auto 12px;max-height:100px;object-fit:cover;width:100px}.timeline__item:after{background-color:var(--timeline-node-bg);border:4px solid var(--timeline-node-color);border-radius:50%;content:"";height:20px;position:absolute;right:-10px;top:50%;transform:translateY(-50%);width:20px;z-index:1}.timeline__item.animated{animation-duration:1s;animation-fill-mode:both;opacity:0}.timeline__item.fadeIn{animation-name:fadeIn}.timeline__item--active .timeline__content{box-shadow:0 4px 12px rgba(0,0,0,.15);transform:scale(1.05)}.timeline__item--left{left:0}.timeline__item--right{left:50%;padding:10px 0 10px 40px}.timeline__item--right:after{left:-10px}.timeline__item--right .timeline__content:before{border:10px solid transparent;border-left:none;border-right:12px solid #ccc;left:-12px}.timeline__item--right .timeline__content:after{border:9px solid transparent;border-left:none;border-right:11px solid #fff;left:-10px}.timeline__content{background-color:#fff;border:1px solid #ccc;border-radius:10px;color:#333;display:block;padding:20px;position:relative}.timeline__image{border-radius:8px;display:block;height:auto;margin-bottom:12px;max-width:100%;width:100%}.timeline--horizontal .timeline__image{height:100px;margin:0 auto 8px;object-fit:cover;width:100px}.timeline__content:after,.timeline__content:before{content:"";height:0;position:absolute;top:50%;transform:translateY(-50%);width:0}.timeline__content:before{border-bottom:10px solid transparent;border-left:12px solid #ccc;border-top:10px solid transparent;right:-12px;z-index:1}.timeline__content:after{border-bottom:9px solid transparent;border-left:11px solid #fff;border-top:9px solid transparent;right:-10px;z-index:2}.timeline__content h2{font-size:20px;font-weight:700;margin:0 0 10px}.timeline__content h3{font-size:18px;font-weight:700;margin:0 0 10px}.timeline__content p{font-size:15px;line-height:1.5;margin-bottom:10px}.timeline--horizontal{font-size:0;overflow-x:hidden;overflow-y:visible;padding:0 60px;white-space:nowrap}.timeline--horizontal .timeline-divider{background-color:var(--timeline-line-color);display:block;height:4px;left:40px;position:absolute;right:40px;transform:translateY(-50%);z-index:1}.timeline--horizontal .timeline__items{transition:all .8s;will-change:transform}.timeline--horizontal .timeline__item{display:inline-block;left:0;padding:0 0 40px;position:relative;transition:none;vertical-align:top;white-space:normal;width:200px}.timeline--horizontal .timeline__item .timeline__content{min-height:180px;padding:12px}.timeline--horizontal .timeline__item .timeline__content h3{font-size:18px;font-weight:700;margin:0 0 8px}.timeline--horizontal .timeline__item .timeline__content p{font-size:11px;line-height:1.4;margin-bottom:0}.timeline--horizontal .timeline__item:after{left:50%;right:auto;top:100%;transform:translate(-50%,-50%)}.timeline--horizontal .timeline__item .timeline__item__inner{display:table;height:100%;width:100%}.timeline--horizontal .timeline__item .timeline__content__wrap{display:table-cell;margin:0;padding:0;vertical-align:bottom}.timeline--horizontal .timeline__item .timeline__content:before{border-left:12px solid transparent;border-right:12px solid transparent;border-top:12px solid #ccc;left:50%;right:auto;top:100%;transform:translateX(-50%)}.timeline--horizontal .timeline__item .timeline__content:after{border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid #fff;left:50%;right:auto;top:100%;transform:translateX(-50%)}.timeline--horizontal .timeline__item--bottom{padding:40px 0 0}.timeline--horizontal .timeline__item--bottom:after{top:0}.timeline--horizontal .timeline__item--bottom .timeline__content__wrap{vertical-align:top}.timeline--horizontal .timeline__item--bottom .timeline__content:before{border:12px solid transparent;border-bottom:12px solid #ccc;border-top:none;bottom:100%;top:auto}.timeline--horizontal .timeline__item--bottom .timeline__content:after{border:10px solid transparent;border-bottom:10px solid #fff;border-top:none;bottom:100%;top:auto}.timeline-nav-button{background-color:var(--timeline-nav-color);border:3px solid var(--timeline-nav-border);border-radius:50px;box-shadow:0 2px 4px rgba(0,0,0,.1);box-sizing:border-box;cursor:pointer;display:block;height:40px;outline:none;position:absolute;text-indent:-9999px;top:50%;transform:translateY(-50%);transition:all .3s ease;width:40px;z-index:10}.timeline-nav-button:hover{box-shadow:0 4px 8px rgba(0,0,0,.15);transform:translateY(-50%) scale(1.15)}.timeline-nav-button:disabled{cursor:not-allowed;opacity:.5;pointer-events:none;user-select:none}.timeline-nav-button:before{display:none}.timeline-nav-button svg{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.timeline-nav-button--prev{left:10px}.timeline-nav-button--next{right:10px}.timeline--mobile{padding:0}.timeline--mobile:before{left:10px!important;margin:0!important}.timeline--mobile .timeline__item{left:0;margin-bottom:20px;padding-left:40px;padding-right:0;width:100%}.timeline--mobile .timeline__item .timeline__content{align-items:flex-start;display:flex;flex-direction:row;gap:6px;max-height:100px;padding:12px}.timeline--mobile .timeline__item .timeline__image{border-radius:6px;flex-shrink:0;height:80px;margin:0;object-fit:cover;width:80px}.timeline--mobile .timeline__item .timeline__content>div{flex:1;min-width:0}.timeline--mobile .timeline__item .timeline__content h3{font-size:16px;margin:0 0 6px}.timeline--mobile .timeline__item .timeline__content p{font-size:13px;line-height:1.4;margin:0;overflow:hidden;text-overflow:ellipsis}.timeline--mobile .timeline__item:after{left:2px;margin:0}.timeline--mobile .timeline__item .timeline__content:before{border:12px solid transparent;border-left:none;border-right-color:#ccc;left:-12px}.timeline--mobile .timeline__item .timeline__content:after{border:10px solid transparent;border-left:none;border-right-color:#fff;left:-10px}@keyframes fadeIn{0%{opacity:0;top:70px}to{opacity:1;top:0}}@keyframes liftUp{0%{top:0}to{top:-15px}}.timeline-modal-overlay{background-color:rgba(0,0,0,.85);height:100%;left:0;opacity:0;position:fixed;top:0;transition:opacity .3s ease,visibility .3s ease;visibility:hidden;width:100%;z-index:9998}.timeline-modal-overlay.timeline-modal-show{opacity:1;visibility:visible}.timeline-modal{background-color:#fff;border-radius:12px;box-shadow:0 10px 40px rgba(0,0,0,.3);left:50%;max-height:90vh;max-width:900px;opacity:0;overflow:hidden;position:fixed;top:50%;transform:translate(-50%,-50%) scale(.7);transition:opacity .3s ease,transform .3s ease,visibility .3s ease;visibility:hidden;width:90%;z-index:9999}.timeline-modal.timeline-modal-show{opacity:1;transform:translate(-50%,-50%) scale(1);visibility:visible}.timeline-modal__content{max-height:90vh;overflow-x:hidden;overflow-y:auto;padding:40px 40px 80px}.timeline-modal__content::-webkit-scrollbar{width:8px}.timeline-modal__content::-webkit-scrollbar-track{background:#f1f1f1;border-radius:0 12px 12px 0}.timeline-modal__content::-webkit-scrollbar-thumb{background:#888;border-radius:4px}.timeline-modal__content::-webkit-scrollbar-thumb:hover{background:#555}.timeline-modal__image{border-radius:8px;display:block;height:auto;margin:0 auto 20px;max-width:100%;width:auto}.timeline-modal__title{color:#333;font-size:28px;font-weight:700;margin:0 0 20px}.timeline-modal__text{color:#555;font-size:16px;line-height:1.6}.timeline-modal__text p{margin-bottom:15px}.timeline-modal__divider{border:0;border-top:1px solid #ddd;margin:30px 0}.timeline-modal__close-bottom{background-color:#333;border:none;border-radius:6px;color:#fff;cursor:pointer;display:block;font-size:16px;margin:30px auto 0;padding:12px 40px;transition:background-color .2s ease}.timeline-modal__close-bottom:hover{background-color:#555}.timeline-modal__close{align-items:center;background-color:rgba(0,0,0,.6);border:none;border-radius:50%;color:#fff;cursor:pointer;display:flex;font-size:24px;height:40px;justify-content:center;line-height:1;position:absolute;right:20px;top:20px;transition:background-color .2s ease,transform .2s ease;width:40px}.timeline-modal__close:hover{background-color:rgba(0,0,0,.8);transform:scale(1.1)}.timeline-modal__close:before{content:"×"}.timeline__item{cursor:pointer;transition:transform .2s ease}.timeline__item:hover .timeline__content{box-shadow:0 4px 12px rgba(0,0,0,.15);transform:translateY(-2px)}.timeline__loader-overlay{background-color:#fff;inset:0;position:fixed;z-index:10000}.timeline__loader,.timeline__loader-overlay{align-items:center;display:flex;justify-content:center}.timeline__loader{padding:20px}.timeline__loader-spinner{display:block;height:auto;max-width:100%;object-fit:contain;width:120px}.timeline__error{align-items:center;background-color:#f9f9f9;border:2px solid #e0e0e0;border-radius:12px;display:flex;flex-direction:column;justify-content:center;margin:20px auto;max-width:600px;min-height:300px;padding:60px 20px;text-align:center}.timeline__error-icon{height:auto;margin-bottom:24px;max-width:100%;opacity:.8;width:200px}.timeline__error-title{color:#d32f2f;font-size:24px;font-weight:700;margin:0 0 16px}.timeline__error-message{color:#555;font-size:16px;line-height:1.6;margin:0 0 16px}.timeline__error-solution{background-color:#fff3cd;border:1px solid #ffc107;border-radius:6px;color:#333;font-size:15px;line-height:1.6;margin:0 0 12px;padding:12px 16px}.timeline__error-solution strong{color:#856404}.timeline__error-details{background-color:#f5f5f5;border:1px solid #ddd;border-radius:4px;color:#666;font-family:Courier New,monospace;font-size:13px;line-height:1.5;margin:12px 0 0;max-width:100%;overflow-x:auto;padding:8px 12px}.timeline__error-details strong{color:#333}
1
+ .timeline{--timeline-line-color:#ddd;--timeline-node-color:#ddd;--timeline-node-bg:#fff;--timeline-nav-color:#fff;--timeline-nav-border:#ddd;--timeline-active-outline-color:#000;--timeline-h-node-width:200px;--timeline-h-node-min-height:180px;--timeline-h-image-size:100px;--timeline-h-title-font-size:18px;--timeline-h-text-font-size:11px;--timeline-same-side-gap:20px;box-sizing:border-box;overflow-x:hidden;position:relative}.timeline:not(.timeline--loaded){opacity:0;pointer-events:none;visibility:hidden}.timeline__date{color:#333;font-size:.95rem;font-weight:700;margin-bottom:8px}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__date{text-align:center}.timeline__heading{color:#333;font-size:1.1rem;font-weight:700;margin:0 0 8px}.timeline__title{color:#333;font-size:1.25rem;font-weight:700;margin:0 0 18px;opacity:0;position:relative;text-align:center;transition:opacity .5s ease-in-out,visibility .5s ease-in-out;visibility:hidden;z-index:0}.timeline__title--visible{opacity:1;visibility:visible}.timeline__image{border-radius:4px;display:block;height:auto;margin-bottom:8px;max-width:100%;width:auto}.timeline__summary{-webkit-line-clamp:3;-webkit-box-orient:vertical;color:#555;display:-webkit-box;font-size:.9rem;line-height:1.4;overflow:hidden;text-overflow:ellipsis}.timeline__modal-content{color:#333;display:none;font-size:1rem;line-height:1.6}.timeline__modal-content p{margin-bottom:12px}.timeline__modal-content p:last-child{margin-bottom:0}.timeline *,.timeline :after,.timeline :before{box-sizing:inherit}.timeline:not(.timeline--horizontal):before{background-color:var(--timeline-line-color);bottom:0;content:"";left:50%;margin-left:-2px;position:absolute;top:0;width:4px;z-index:1}.timeline__wrap{overflow:hidden;position:relative;z-index:2}.timeline--horizontal .timeline__wrap{overflow-x:hidden;overflow-y:visible}.timeline__item{font-size:1rem;padding:10px 40px 10px 0;position:relative;width:50%;z-index:2}.timeline--mobile{padding:0}.timeline--mobile:before{left:10px!important;margin:0!important}.timeline--mobile .timeline__item{left:0;margin-bottom:20px;padding-left:40px;padding-right:0;width:100%}.timeline--same-side:not(.timeline--horizontal) .timeline__item{margin-bottom:var(--timeline-same-side-gap)}.timeline--same-side:not(.timeline--horizontal) .timeline__item:last-child{margin-bottom:0}.timeline--mobile .timeline__item:after{left:2px;margin:0;right:auto;transform:translateY(-50%)}.timeline--mobile .timeline__content{align-items:start;background-color:#fff;border:1px solid #ccc;border-radius:10px;column-gap:8px;display:grid;grid-template-columns:60px 70px 5px 1fr;grid-template-rows:auto auto;min-height:auto;padding:8px;position:relative;row-gap:4px}.timeline--mobile .timeline__content.no-summary{align-items:center;column-gap:12px;display:grid;grid-template-columns:80px 110px 5px 1fr;grid-template-rows:auto;row-gap:0}.timeline--mobile .timeline__content.no-image.no-summary{grid-template-columns:110px 1fr}.timeline--mobile .timeline__content.no-summary .timeline__image{grid-column:1;grid-row:1;height:80px;margin:0;object-fit:cover;width:80px}.timeline--mobile .timeline__content.no-summary .timeline__date{align-self:center;grid-column:2;grid-row:1;margin:0;white-space:nowrap}.timeline--mobile .timeline__content.no-summary .timeline__heading{align-self:center;grid-column:4;grid-row:1;line-height:1.2;margin:0}.timeline--mobile .timeline__content:before{border:10px solid transparent;border-left:none;border-right:12px solid #ccc;content:"";height:0;left:-12px;position:absolute;top:50%;transform:translateY(-50%);width:0;z-index:1}.sr-only{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.timeline--mobile .timeline__content:after{border:9px solid transparent;border-left:none;border-right:10px solid #fff;content:"";height:0;left:-10px;position:absolute;top:50%;transform:translateY(-50%);width:0;z-index:2}.timeline--mobile .timeline__image{border-radius:4px;grid-column:1;grid-row:1/span 2;height:60px;margin:0;object-fit:cover;width:60px}.timeline--mobile .timeline__date{align-self:center;color:#333;font-size:.9rem;font-weight:700;grid-column:2;grid-row:1/span 2;padding-right:8px;padding-top:0;white-space:nowrap}.timeline--mobile .timeline__heading{color:#333;font-size:.9rem;font-weight:700;grid-column:4;grid-row:1;line-height:1.2;margin:0;max-width:100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timeline--mobile .timeline__summary{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#555;display:-webkit-box;font-size:.8rem;grid-column:4;grid-row:2;line-height:1.2;min-width:0;overflow:hidden}.timeline--mobile .timeline__heading,.timeline--mobile .timeline__summary{padding-left:6px}.timeline--mobile .timeline__content:not(:has(.timeline__image)){grid-template-columns:70px 5px 1fr}.timeline--mobile .timeline__content:not(:has(.timeline__image)) .timeline__date{align-self:center;grid-column:1;grid-row:1/span 2}.timeline--mobile .timeline__content:not(:has(.timeline__image)) .timeline__heading{grid-column:3;grid-row:1}.timeline--mobile .timeline__content:not(:has(.timeline__image)) .timeline__summary{grid-column:3;grid-row:2}.timeline--mobile .timeline__content.no-image{grid-template-columns:70px 5px 1fr}.timeline--mobile .timeline__content.no-image .timeline__date{align-self:center;grid-column:1;grid-row:1/span 2}.timeline--mobile .timeline__content.no-image .timeline__heading{grid-column:3;grid-row:1}.timeline--mobile .timeline__content.no-image .timeline__summary{grid-column:3;grid-row:2}@media (min-width:768px){.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item{padding:10px 40px 10px 0;width:50%}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item:after{left:auto;right:-10px;transform:translateY(-50%)}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--left{left:0;padding:10px 40px 10px 0}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--right{left:50%;padding:10px 0 10px 40px}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--right:after{left:-10px;right:auto}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--left .timeline__content:before{border-bottom:10px solid transparent;border-left:12px solid #ccc;border-top:10px solid transparent;left:auto;right:-12px;z-index:1}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--left .timeline__content:after{border-bottom:9px solid transparent;border-left:11px solid #fff;border-top:9px solid transparent;left:auto;right:-10px;z-index:2}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--right .timeline__content:before{border:10px solid transparent;border-left:none;border-right:12px solid #ccc;left:-12px;right:auto;z-index:1}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--right .timeline__content:after{border:9px solid transparent;border-left:none;border-right:11px solid #fff;left:-10px;right:auto;z-index:2}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content{display:flex;flex-direction:column;gap:8px;max-height:none;padding:16px;position:relative}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))){align-items:center;column-gap:16px;display:grid;gap:0;grid-template-columns:100px 120px 1fr;padding:16px}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-image.no-summary,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__image)):not(:has(.timeline__summary:not(:empty))){grid-template-columns:120px 1fr}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content .timeline__image{grid-column:1;height:100px;margin:0;object-fit:cover;width:100px}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content .timeline__date{align-self:center;grid-column:2;margin:0;white-space:nowrap}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content .timeline__heading{align-self:center;grid-column:3;line-height:1.2;margin:0}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:after,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:before{content:"";height:0;position:absolute;top:50%;transform:translateY(-50%);width:0}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__image{height:auto;margin-bottom:0;max-width:100%}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__summary{-webkit-line-clamp:3;font-size:.95rem}}@media (min-width:1200px){.timeline--horizontal .timeline__content{align-items:center;display:flex;flex-direction:column;gap:8px;padding:12px;text-align:center}.timeline--horizontal .timeline__date{font-size:.95rem;font-weight:700;order:2}.timeline--horizontal .timeline__heading{font-size:1rem;margin:0;order:3}.timeline--horizontal .timeline__image{height:var(--timeline-h-image-size);margin-bottom:0;object-fit:cover;order:1;width:var(--timeline-h-image-size)}.timeline--horizontal .timeline__summary{-webkit-line-clamp:2;font-size:.85rem;order:4}}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__image{height:auto;margin:0 auto 12px;max-height:100px;object-fit:cover;width:100px}.timeline__item:after{background-color:var(--timeline-node-bg);border:4px solid var(--timeline-node-color);border-radius:50%;content:"";height:20px;position:absolute;right:-10px;top:50%;transform:translateY(-50%);width:20px;z-index:1}.timeline__item.animated{animation-duration:1s;animation-fill-mode:both;opacity:0}.timeline__item.fadeIn{animation-name:fadeIn}.timeline__item--active .timeline__content{border-color:var(--timeline-active-outline-color);box-shadow:0 4px 12px rgba(0,0,0,.15)}.timeline__item--active:after{background-color:var(--timeline-node-color)}.timeline__item--left{left:0}.timeline__item--right{left:50%;padding:10px 0 10px 40px}.timeline__item--right:after{left:-10px}.timeline__item--right .timeline__content:before{border:10px solid transparent;border-left:none;border-right:12px solid #ccc;left:-12px}.timeline__item--right .timeline__content:after{border:9px solid transparent;border-left:none;border-right:11px solid #fff;left:-10px}.timeline__content{background-color:#fff;border:1px solid #ccc;border-radius:10px;color:#333;display:block;padding:20px;position:relative;z-index:2}@media (min-width:768px){.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))){align-items:center;column-gap:16px;display:grid;grid-template-columns:100px 120px 1fr;padding:16px;row-gap:0}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-image.no-summary,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__image)):not(:has(.timeline__summary:not(:empty))){grid-template-columns:120px 1fr}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__image,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__image{grid-column:1;height:100px;margin:0;object-fit:cover;width:100px}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__date,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__date{align-self:center;grid-column:2;margin:0;white-space:nowrap}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__heading,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__heading{align-self:center;grid-column:3;line-height:1.2;margin:0}}.timeline__content:after,.timeline__content:before{content:"";height:0;position:absolute;top:50%;transform:translateY(-50%);width:0}.timeline__content:before{border-bottom:10px solid transparent;border-left:12px solid #ccc;border-top:10px solid transparent;right:-12px;z-index:1}.timeline__content:after{border-bottom:9px solid transparent;border-left:11px solid #fff;border-top:9px solid transparent;right:-10px;z-index:2}.timeline__content h2{font-size:20px;font-weight:700;margin:0 0 10px}.timeline__content h3{font-size:18px;font-weight:700;margin:0 0 10px}.timeline__content p{font-size:15px;line-height:1.5;margin-bottom:10px}.timeline--horizontal{font-size:0;overflow:hidden;padding:0 60px}.timeline--horizontal .timeline__wrap{overflow:hidden;position:relative;white-space:nowrap;z-index:2}.timeline--horizontal .timeline-divider{background-color:var(--timeline-line-color);display:block;height:4px;left:40px;position:absolute;right:40px;transform:translateY(-50%);z-index:1}.timeline--horizontal .timeline__items{transition:all .8s;will-change:transform}.timeline--horizontal .timeline__item{display:inline-block;left:0;padding:0 0 60px;position:relative;transition:none;vertical-align:top;white-space:normal;width:var(--timeline-h-node-width)}.timeline--same-side.timeline--horizontal .timeline__item{margin-right:var(--timeline-same-side-gap)}.timeline--same-side.timeline--horizontal .timeline__item:last-child{margin-right:0}.timeline--same-side.timeline--horizontal .timeline__item--top{padding:0 0 60px;vertical-align:bottom}.timeline--same-side.timeline--horizontal .timeline__item--bottom{padding:60px 0 0;vertical-align:top}.timeline--horizontal .timeline__item .timeline__content{min-height:var(--timeline-h-node-min-height);padding:12px}.timeline--horizontal .timeline__item .timeline__content h3{font-size:var(--timeline-h-title-font-size);font-weight:700;margin:0 0 8px}.timeline--horizontal .timeline__item .timeline__content p{font-size:var(--timeline-h-text-font-size);line-height:1.4;margin-bottom:0}.timeline--horizontal .timeline__item:after{left:50%;right:auto;top:100%;transform:translate(-50%,-50%)}.timeline--same-side.timeline--horizontal .timeline__item--top:after{top:calc(100% - 30px)}.timeline--same-side.timeline--horizontal .timeline__item--bottom:after{top:30px}.timeline--horizontal .timeline__item .timeline__item__inner{display:table;height:100%;width:100%}.timeline--horizontal .timeline__item .timeline__content__wrap{display:table-cell;margin:0;padding:0;vertical-align:bottom}.timeline--horizontal .timeline__item .timeline__content:before{border-left:12px solid transparent;border-right:12px solid transparent;border-top:12px solid #ccc;left:50%;right:auto;top:100%;transform:translateX(-50%)}.timeline--horizontal .timeline__item .timeline__content:after{border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid #fff;left:50%;right:auto;top:100%;transform:translateX(-50%)}.timeline--horizontal .timeline__item--bottom{padding:60px 0 0}.timeline--horizontal .timeline__item--bottom:after{top:0}.timeline--horizontal .timeline__item--bottom .timeline__content__wrap{vertical-align:top}.timeline--horizontal .timeline__item--bottom .timeline__content:before{border:12px solid transparent;border-bottom:12px solid #ccc;border-top:none;bottom:100%;top:auto}.timeline--horizontal .timeline__item--bottom .timeline__content:after{border:10px solid transparent;border-bottom:10px solid #fff;border-top:none;bottom:100%;top:auto}.timeline--horizontal .timeline__item.timeline__item--active .timeline__content:before{border-top-color:var(--timeline-active-outline-color)}.timeline--horizontal .timeline__item.timeline__item--active .timeline__content:after{border-left-width:11px;border-right-width:11px;border-top-width:11px}.timeline--horizontal .timeline__item--bottom.timeline__item--active .timeline__content:before{border-bottom-color:var(--timeline-active-outline-color)}.timeline--horizontal .timeline__item--bottom.timeline__item--active .timeline__content:after{border-bottom-width:11px;border-left-width:11px;border-right-width:11px}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--active.timeline__item--left .timeline__content:before{border-left-color:var(--timeline-active-outline-color)}.timeline--mobile .timeline__item--active .timeline__content:before,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--active.timeline__item--right .timeline__content:before{border-right-color:var(--timeline-active-outline-color)}.timeline-nav-button{background-color:var(--timeline-nav-color);border:3px solid var(--timeline-nav-border);border-radius:50px;box-shadow:0 2px 4px rgba(0,0,0,.1);box-sizing:border-box;cursor:pointer;display:block;height:40px;outline:none;position:absolute;text-indent:-9999px;top:50%;transform:translateY(-50%);transition:all .3s ease;width:40px;z-index:10}.timeline-nav-button:hover{box-shadow:0 4px 8px rgba(0,0,0,.15);transform:translateY(-50%) scale(1.15)}.timeline-nav-button:disabled{cursor:not-allowed;opacity:.5;pointer-events:none;user-select:none}.timeline-nav-button.timeline-nav-button--at-end,.timeline-nav-button.timeline-nav-button--at-start{cursor:not-allowed;opacity:.5}.timeline-nav-button.timeline-nav-button--at-end:hover,.timeline-nav-button.timeline-nav-button--at-start:hover{box-shadow:0 2px 4px rgba(0,0,0,.1);transform:translateY(-50%)}.timeline-nav-button:before{display:none}.timeline-nav-button svg{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.timeline-nav-button--prev{left:10px}.timeline-nav-button--next{right:10px}@keyframes fadeIn{0%{opacity:0;top:70px}to{opacity:1;top:0}}@keyframes liftUp{0%{top:0}to{top:-15px}}.timeline-modal-overlay{background-color:rgba(0,0,0,.85);height:100%;left:0;opacity:0;position:fixed;top:0;transition:opacity .3s ease,visibility .3s ease;visibility:hidden;width:100%;z-index:9998}.timeline-modal-overlay.timeline-modal-show{opacity:1;visibility:visible}.timeline-modal{background-color:#fff;border-radius:0;box-shadow:0 10px 40px rgba(0,0,0,.3);display:flex;flex-direction:column;left:50%;max-height:90vh;max-width:900px;opacity:0;overflow:hidden;position:fixed;top:50%;transform:translate(-50%,-50%) scale(.7);transition:opacity .3s ease,transform .3s ease,visibility .3s ease;visibility:hidden;width:90%;z-index:9999}.timeline-modal.timeline-modal-show{opacity:1;transform:translate(-50%,-50%) scale(1);visibility:visible}.timeline-modal__content{flex:1 1 auto;max-height:90vh;min-height:0;overflow-x:hidden;overflow-y:auto;padding:40px}.timeline-modal__image{border-radius:0;display:block;height:auto;margin:0 auto 20px;max-width:100%;width:auto}.timeline-modal__title{color:#333;font-size:28px;font-weight:700;margin:0 0 20px}.timeline-modal__text{color:#555;font-size:16px;line-height:1.6}.timeline-modal__text p{margin-bottom:15px}.timeline-modal__divider{border:0;border-top:1px solid #ddd;margin:30px 0}.timeline-modal__close-bottom{background-color:#333;border:none;border-radius:0;color:#fff;cursor:pointer;display:inline-block;font-size:16px;padding:12px 40px;transition:background-color .2s ease}.timeline-modal__close-bottom:hover{background-color:#555}.timeline-modal__footer{background:#fff;border-top:1px solid #ddd;flex:0 0 auto;padding:16px 24px;text-align:center}.timeline-modal__close{align-items:center;background-color:rgba(0,0,0,.6);border:none;border-radius:4px;color:#fff;cursor:pointer;display:flex;font-size:24px;height:40px;justify-content:center;line-height:1;position:absolute;right:20px;top:20px;transition:background-color .2s ease,transform .2s ease;width:40px}.timeline-modal__close:hover{background-color:rgba(0,0,0,.8);transform:scale(1.1)}.timeline-modal__close:before{content:"×"}@media (max-width:768px){.timeline-modal{border-radius:0;height:100%;left:0;max-height:100%;max-width:100%;top:0;transform:scale(.95);width:100%}.timeline-modal.timeline-modal-show{transform:scale(1)}.timeline-modal__content{max-height:100%;padding:60px 20px 20px}.timeline-modal__close{background-color:rgba(0,0,0,.7);border-radius:50%;font-size:28px;height:48px;right:10px;top:10px;width:48px}.timeline-modal__close:hover{background-color:rgba(0,0,0,.9)}}.timeline__item{cursor:pointer;transition:transform .2s ease}.timeline__item:hover .timeline__content{box-shadow:0 4px 12px rgba(0,0,0,.15);transform:translateY(-2px)}.timeline--horizontal .timeline__item:hover .timeline__content{transform:none}.timeline__error{align-items:center;background:#fff;border:2px solid #e0e0e0;border-radius:12px;display:flex;flex-direction:column;justify-content:center;margin:20px auto;max-width:600px;padding:24px 16px;text-align:center}.timeline__error-icon{height:auto;margin-bottom:24px;max-width:100%;opacity:.8;width:200px}.timeline.timeline--error .timeline-divider,.timeline.timeline--error .timeline-nav-button,.timeline.timeline--error .timeline__items,.timeline.timeline--error .timeline__wrap,.timeline.timeline--error:before{display:none!important}.timeline__error-title{color:#d32f2f;font-size:24px;font-weight:700;margin:0 0 16px}.timeline__error-message{color:#555;font-size:16px;line-height:1.6;margin:0 0 16px}.timeline__error-solution{background-color:#fff3cd;border:1px solid #ffc107;border-radius:6px;color:#333;font-size:15px;line-height:1.6;margin:0 0 12px;padding:12px 16px}@media (max-width:1024px){.timeline--horizontal{--timeline-h-node-width:180px;--timeline-h-node-min-height:160px;--timeline-h-image-size:90px}}@media (max-width:768px){.timeline--horizontal{--timeline-h-node-width:160px;--timeline-h-node-min-height:140px;--timeline-h-image-size:80px;--timeline-h-title-font-size:16px;--timeline-h-text-font-size:10px}.timeline--horizontal .timeline__summary{display:none}}@media (max-width:640px){.timeline--horizontal{--timeline-h-node-width:140px;--timeline-h-node-min-height:120px;--timeline-h-image-size:70px;--timeline-h-title-font-size:14px;padding:0 40px}.timeline--horizontal .timeline__summary{display:none}}@media (max-width:480px){.timeline--horizontal{--timeline-h-node-width:120px;--timeline-h-node-min-height:100px;--timeline-h-image-size:60px;--timeline-h-title-font-size:13px;padding:0 30px}.timeline--horizontal .timeline__heading{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;font-size:12px;line-height:1.2;margin:0 0 4px;overflow:hidden}.timeline--horizontal .timeline__summary{display:none}}@media (max-width:360px){.timeline--horizontal{--timeline-h-node-width:100px;--timeline-h-node-min-height:90px;--timeline-h-image-size:50px;--timeline-h-title-font-size:11px;padding:0 20px}.timeline--horizontal .timeline__heading{-webkit-line-clamp:1;font-size:11px}}@media (max-width:420px){.timeline--mobile .timeline__summary{display:none}.timeline--mobile .timeline__content{grid-template-columns:60px 70px 1fr}.timeline--mobile .timeline__heading{grid-column:3}}@media (max-width:360px){.timeline--mobile .timeline__image{display:none}.timeline--mobile .timeline__content{grid-template-columns:70px 1fr;grid-template-rows:auto auto}.timeline--mobile .timeline__date{align-self:center;grid-column:1;grid-row:1/span 2}.timeline--mobile .timeline__heading{grid-column:2;grid-row:1}.timeline--mobile .timeline__summary{display:block;grid-column:2;grid-row:2}}@media (max-width:320px){.timeline--mobile .timeline__heading,.timeline--mobile .timeline__image,.timeline--mobile .timeline__summary{display:none}.timeline--mobile .timeline__content{grid-template-columns:1fr;padding:6px}.timeline--mobile .timeline__date{align-self:center;grid-column:1;grid-row:1}}.timeline__error-solution strong{color:#856404}.timeline__error-details{background-color:#f5f5f5;border:1px solid #ddd;border-radius:4px;color:#666;font-family:Courier New,monospace;font-size:13px;line-height:1.5;margin:12px 0 0;max-width:100%;overflow-x:auto;padding:8px 12px}.timeline__error-details strong{color:#333}@media (min-width:768px){.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))){align-items:center;column-gap:16px;display:grid!important;grid-template-columns:100px 120px 1fr;padding:16px;row-gap:0}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-image.no-summary,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__image)):not(:has(.timeline__summary:not(:empty))){grid-template-columns:120px 1fr}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__image,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__image{grid-column:1;height:100px;margin:0;object-fit:cover;width:100px}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__date,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__date{align-self:center;grid-column:2;margin:0;white-space:nowrap}.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__heading,.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__heading{align-self:center;grid-column:3;line-height:1.2;margin:0}}
2
2
  /*# sourceMappingURL=timeline.min.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["timeline.css"],"names":[],"mappings":"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","file":"timeline.min.css","sourcesContent":[".timeline {\n box-sizing: border-box;\n position: relative;\n overflow-x: hidden;\n \n /* CSS Custom Properties for dynamic colors */\n --timeline-line-color: #DDD;\n --timeline-node-color: #DDD;\n --timeline-node-bg: #FFF;\n --timeline-nav-color: #FFF;\n --timeline-nav-border: #DDD;\n}\n\n/* Timeline heading */\n.timeline__heading {\n font-size: 2rem;\n font-weight: 700;\n margin: 0 0 60px;\n text-align: center;\n color: #333;\n}\n\n.timeline *,\n.timeline *::before,\n.timeline *::after {\n box-sizing: inherit;\n}\n\n.timeline:not(.timeline--horizontal)::before {\n background-color: var(--timeline-line-color);\n bottom: 0;\n content: '';\n left: 50%;\n margin-left: -2px;\n position: absolute;\n top: 0;\n width: 4px;\n z-index: 1;\n}\n\n.timeline__wrap {\n overflow: hidden;\n position: relative;\n z-index: 2;\n}\n\n.timeline--horizontal .timeline__wrap {\n overflow: visible;\n}\n\n.timeline__item {\n font-size: 1rem;\n padding: 10px 40px 10px 0;\n position: relative;\n width: 50%;\n z-index: 2;\n}\n\n/* Vertical timeline (not mobile) - side-by-side layout */\n.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__content {\n max-height: 200px;\n display: flex;\n flex-direction: column;\n}\n\n.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__image {\n flex-shrink: 0;\n}\n\n.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__content > div {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__content h3 {\n text-align: center;\n margin: 0 0 6px;\n flex-shrink: 0;\n}\n\n.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__content p {\n margin-bottom: 0;\n overflow: hidden;\n flex: 1;\n min-height: 0;\n}\n\n.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__image {\n width: 100px;\n height: auto;\n max-height: 100px;\n object-fit: cover;\n margin: 0 auto 12px;\n}\n\n.timeline__item::after {\n background-color: var(--timeline-node-bg);\n border: 4px solid var(--timeline-node-color);\n border-radius: 50%;\n content: '';\n height: 20px;\n position: absolute;\n right: -10px;\n transform: translateY(-50%);\n top: 50%;\n width: 20px;\n z-index: 1;\n}\n\n.timeline__item.animated {\n animation-duration: 1s;\n animation-fill-mode: both;\n opacity: 0;\n}\n\n.timeline__item.fadeIn {\n animation-name: fadeIn;\n}\n\n/* Active state for deep linking */\n.timeline__item--active .timeline__content {\n transform: scale(1.05);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n\n.timeline__item--left {\n left: 0;\n}\n\n.timeline__item--right {\n left: 50%;\n padding: 10px 0 10px 40px;\n}\n\n.timeline__item--right::after {\n left: -10px;\n}\n\n.timeline__item--right .timeline__content::before {\n border-bottom: 10px solid transparent;\n border-right: 12px solid #CCC;\n border-left: none;\n border-top: 10px solid transparent;\n left: -12px;\n}\n\n.timeline__item--right .timeline__content::after {\n border-bottom: 9px solid transparent;\n border-right: 11px solid #FFF;\n border-left: none;\n border-top: 9px solid transparent;\n left: -10px;\n}\n\n.timeline__content {\n background-color: #FFF;\n border: 1px solid #CCC;\n border-radius: 10px;\n color: #333;\n display: block;\n padding: 20px;\n position: relative;\n}\n\n/* Image styling - fluid to fit content box */\n.timeline__image {\n width: 100%;\n height: auto;\n max-width: 100%;\n border-radius: 8px;\n margin-bottom: 12px;\n display: block;\n}\n\n/* Horizontal timeline images - square thumbnails */\n.timeline--horizontal .timeline__image {\n width: 100px;\n height: 100px;\n object-fit: cover;\n margin: 0 auto 8px;\n}\n\n.timeline__content::before,\n.timeline__content::after {\n content: '';\n height: 0;\n position: absolute;\n transform: translateY(-50%);\n top: 50%;\n width: 0;\n}\n\n.timeline__content::before {\n border-bottom: 10px solid transparent;\n border-left: 12px solid #CCC;\n border-top: 10px solid transparent;\n right: -12px;\n z-index: 1;\n}\n\n.timeline__content::after {\n border-bottom: 9px solid transparent;\n border-left: 11px solid #FFF;\n border-top: 9px solid transparent;\n right: -10px;\n z-index: 2;\n}\n\n.timeline__content h2 {\n font-size: 20px;\n font-weight: 700;\n margin: 0 0 10px;\n}\n\n.timeline__content h3 {\n font-size: 18px;\n font-weight: 700;\n margin: 0 0 10px;\n}\n\n.timeline__content p {\n font-size: 15px;\n line-height: 1.5;\n margin-bottom: 10px;\n}\n\n.timeline--horizontal {\n font-size: 0;\n padding: 0 60px;\n overflow-x: hidden;\n overflow-y: visible;\n white-space: nowrap;\n}\n\n.timeline--horizontal .timeline-divider {\n background-color: var(--timeline-line-color);\n display: block;\n height: 4px;\n left: 40px;\n position: absolute;\n transform: translateY(-50%);\n right: 40px;\n z-index: 1;\n}\n\n.timeline--horizontal .timeline__items {\n transition: all 0.8s;\n will-change: transform;\n}\n\n.timeline--horizontal .timeline__item {\n display: inline-block;\n left: 0;\n padding: 0 0 40px;\n position: relative;\n transition: none;\n vertical-align: top;\n white-space: normal;\n width: 200px;\n}\n\n.timeline--horizontal .timeline__item .timeline__content {\n padding: 12px;\n min-height: 180px;\n}\n\n.timeline--horizontal .timeline__item .timeline__content h3 {\n font-size: 18px;\n font-weight: 700;\n margin: 0 0 8px;\n}\n\n.timeline--horizontal .timeline__item .timeline__content p {\n font-size: 11px;\n line-height: 1.4;\n margin-bottom: 0;\n}\n\n.timeline--horizontal .timeline__item::after {\n left: 50%;\n right: auto;\n transform: translate(-50%, -50%);\n top: 100%;\n}\n\n.timeline--horizontal .timeline__item .timeline__item__inner {\n display: table;\n height: 100%;\n width: 100%;\n}\n\n.timeline--horizontal .timeline__item .timeline__content__wrap {\n display: table-cell;\n margin: 0;\n padding: 0;\n vertical-align: bottom;\n}\n\n.timeline--horizontal .timeline__item .timeline__content::before {\n border-left: 12px solid transparent;\n border-right: 12px solid transparent;\n border-top: 12px solid #CCC;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n top: 100%;\n}\n\n.timeline--horizontal .timeline__item .timeline__content::after {\n border-left: 10px solid transparent;\n border-right: 10px solid transparent;\n border-top: 10px solid #FFF;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n top: 100%;\n}\n\n.timeline--horizontal .timeline__item--bottom {\n padding: 40px 0 0;\n}\n\n.timeline--horizontal .timeline__item--bottom::after {\n top: 0;\n}\n\n.timeline--horizontal .timeline__item--bottom .timeline__content__wrap {\n vertical-align: top;\n}\n\n.timeline--horizontal .timeline__item--bottom .timeline__content::before {\n border-bottom: 12px solid #CCC;\n border-left: 12px solid transparent;\n border-right: 12px solid transparent;\n border-top: none;\n bottom: 100%;\n top: auto;\n}\n\n.timeline--horizontal .timeline__item--bottom .timeline__content::after {\n border-bottom: 10px solid #FFF;\n border-left: 10px solid transparent;\n border-right: 10px solid transparent;\n border-top: none;\n bottom: 100%;\n top: auto;\n}\n\n.timeline-nav-button {\n background-color: var(--timeline-nav-color);\n border: 3px solid var(--timeline-nav-border);\n border-radius: 50px;\n box-sizing: border-box;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n cursor: pointer;\n display: block;\n height: 40px;\n outline: none;\n position: absolute;\n text-indent: -9999px;\n transform: translateY(-50%);\n top: 50%;\n width: 40px;\n z-index: 10;\n transition: all 0.3s ease;\n}\n\n.timeline-nav-button:hover {\n transform: translateY(-50%) scale(1.15);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.timeline-nav-button:disabled {\n opacity: .5;\n pointer-events: none;\n cursor: not-allowed;\n user-select: none;\n}\n\n.timeline-nav-button::before {\n display: none;\n}\n\n.timeline-nav-button svg {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n}\n\n.timeline-nav-button--prev {\n left: 10px;\n}\n\n.timeline-nav-button--next {\n right: 10px;\n}\n\n.timeline--mobile {\n padding: 0;\n}\n\n.timeline--mobile::before {\n left: 10px !important;\n margin: 0 !important;\n}\n\n.timeline--mobile .timeline__item {\n left: 0;\n padding-left: 40px;\n padding-right: 0;\n width: 100%;\n margin-bottom: 20px;\n}\n\n.timeline--mobile .timeline__item .timeline__content {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n gap: 6px;\n padding: 12px;\n max-height: 100px;\n}\n\n.timeline--mobile .timeline__item .timeline__image {\n width: 80px;\n height: 80px;\n object-fit: cover;\n flex-shrink: 0;\n margin: 0;\n border-radius: 6px;\n}\n\n.timeline--mobile .timeline__item .timeline__content > div {\n flex: 1;\n min-width: 0;\n}\n\n.timeline--mobile .timeline__item .timeline__content h3 {\n font-size: 16px;\n margin: 0 0 6px;\n}\n\n.timeline--mobile .timeline__item .timeline__content p {\n font-size: 13px;\n line-height: 1.4;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.timeline--mobile .timeline__item::after {\n left: 2px;\n margin: 0;\n}\n\n.timeline--mobile .timeline__item .timeline__content::before {\n left: -12px;\n border-bottom: 12px solid transparent;\n border-right: 12px solid #CCC;\n border-left: none;\n border-top: 12px solid transparent;\n}\n\n.timeline--mobile .timeline__item .timeline__content::after {\n left: -10px;\n border-bottom: 10px solid transparent;\n border-right: 10px solid #FFF;\n border-left: none;\n border-top: 10px solid transparent;\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n top: 70px;\n }\n 100% {\n opacity: 1;\n top: 0px;\n }\n}\n\n@keyframes liftUp {\n 0% {\n top: 0px;\n }\n 100% {\n top: -15px;\n }\n}\n\n/* Modal Styles */\n.timeline-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.85);\n z-index: 9998;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.3s ease, visibility 0.3s ease;\n}\n\n.timeline-modal-overlay.timeline-modal-show {\n opacity: 1;\n visibility: visible;\n}\n\n.timeline-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.7);\n width: 90%;\n max-width: 900px;\n max-height: 90vh;\n background-color: #FFF;\n border-radius: 12px;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);\n z-index: 9999;\n opacity: 0;\n visibility: hidden;\n overflow: hidden;\n transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s ease;\n}\n\n.timeline-modal.timeline-modal-show {\n opacity: 1;\n visibility: visible;\n transform: translate(-50%, -50%) scale(1);\n}\n\n.timeline-modal__content {\n padding: 40px 40px 80px 40px;\n max-height: 90vh;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n/* Fix scrollbar overflow on rounded corners */\n.timeline-modal__content::-webkit-scrollbar {\n width: 8px;\n}\n\n.timeline-modal__content::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 0 12px 12px 0;\n}\n\n.timeline-modal__content::-webkit-scrollbar-thumb {\n background: #888;\n border-radius: 4px;\n}\n\n.timeline-modal__content::-webkit-scrollbar-thumb:hover {\n background: #555;\n}\n\n.timeline-modal__image {\n width: auto;\n max-width: 100%;\n height: auto;\n border-radius: 8px;\n margin: 0 auto 20px;\n display: block;\n}\n\n.timeline-modal__title {\n font-size: 28px;\n font-weight: 700;\n margin: 0 0 20px;\n color: #333;\n}\n\n.timeline-modal__text {\n font-size: 16px;\n line-height: 1.6;\n color: #555;\n}\n\n.timeline-modal__text p {\n margin-bottom: 15px;\n}\n\n.timeline-modal__divider {\n border: 0;\n border-top: 1px solid #ddd;\n margin: 30px 0;\n}\n\n.timeline-modal__close-bottom {\n display: block;\n margin: 30px auto 0;\n padding: 12px 40px;\n background-color: #333;\n color: #fff;\n border: none;\n border-radius: 6px;\n font-size: 16px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n}\n\n.timeline-modal__close-bottom:hover {\n background-color: #555;\n}\n\n.timeline-modal__close {\n position: absolute;\n top: 20px;\n right: 20px;\n width: 40px;\n height: 40px;\n background-color: rgba(0, 0, 0, 0.6);\n border: none;\n border-radius: 50%;\n color: #FFF;\n font-size: 24px;\n line-height: 1;\n cursor: pointer;\n transition: background-color 0.2s ease, transform 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.timeline-modal__close:hover {\n background-color: rgba(0, 0, 0, 0.8);\n transform: scale(1.1);\n}\n\n.timeline-modal__close::before {\n content: '×';\n}\n\n/* Make timeline items clickable */\n.timeline__item {\n cursor: pointer;\n transition: transform 0.2s ease;\n}\n\n.timeline__item:hover .timeline__content {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n\n/* Loading spinner styles */\n.timeline__loader-overlay {\n position: fixed;\n inset: 0;\n background-color: #ffffff;\n z-index: 10000;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.timeline__loader {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n}\n\n.timeline__loader-spinner {\n width: 120px;\n max-width: 100%;\n height: auto;\n display: block;\n object-fit: contain;\n}\n\n/* Error display styles */\n.timeline__error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 300px;\n padding: 60px 20px;\n text-align: center;\n background-color: #f9f9f9;\n border: 2px solid #e0e0e0;\n border-radius: 12px;\n margin: 20px auto;\n max-width: 600px;\n}\n\n.timeline__error-icon {\n width: 200px;\n max-width: 100%;\n height: auto;\n margin-bottom: 24px;\n opacity: 0.8;\n}\n\n.timeline__error-title {\n font-size: 24px;\n font-weight: 700;\n margin: 0 0 16px;\n color: #d32f2f;\n}\n\n.timeline__error-message {\n font-size: 16px;\n line-height: 1.6;\n margin: 0 0 16px;\n color: #555;\n}\n\n.timeline__error-solution {\n font-size: 15px;\n line-height: 1.6;\n margin: 0 0 12px;\n color: #333;\n background-color: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 6px;\n padding: 12px 16px;\n}\n\n.timeline__error-solution strong {\n color: #856404;\n}\n\n.timeline__error-details {\n font-size: 13px;\n line-height: 1.5;\n margin: 12px 0 0;\n color: #666;\n font-family: 'Courier New', monospace;\n background-color: #f5f5f5;\n border: 1px solid #ddd;\n border-radius: 4px;\n padding: 8px 12px;\n max-width: 100%;\n overflow-x: auto;\n}\n\n.timeline__error-details strong {\n color: #333;\n}\n"]}
1
+ {"version":3,"sources":["timeline.css"],"names":[],"mappings":"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","file":"timeline.min.css","sourcesContent":[".timeline {\n box-sizing: border-box;\n position: relative;\n overflow-x: hidden;\n \n /* CSS Custom Properties for dynamic colors */\n --timeline-line-color: #DDD;\n --timeline-node-color: #DDD;\n --timeline-node-bg: #FFF;\n --timeline-nav-color: #FFF;\n --timeline-nav-border: #DDD;\n /* Outline color for the active/current item (defaults to black when no nodeColor is configured) */\n --timeline-active-outline-color: #000;\n \n /* CSS Custom Properties for responsive horizontal layout dimensions */\n --timeline-h-node-width: 200px;\n --timeline-h-node-min-height: 180px;\n --timeline-h-image-size: 100px;\n --timeline-h-title-font-size: 18px;\n --timeline-h-text-font-size: 11px;\n\n /* Gap for same-side layouts (applies when sameSideNodes is enabled) */\n --timeline-same-side-gap: 20px;\n}\n\n/* Hide timeline by default to prevent flash of unstyled/incorrectly-styled content.\n The timeline engine will add the .timeline--loaded class after layout is complete,\n and the fade-in will make the transition smooth. */\n.timeline:not(.timeline--loaded) {\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n}\n\n/* Semantic node field styles */\n.timeline__date {\n font-size: 0.95rem;\n font-weight: 700;\n color: #333;\n margin-bottom: 8px;\n}\n\n/* Vertical (non-mobile) cards: center date above the centered image */\n.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__date {\n text-align: center;\n}\n\n.timeline__heading {\n font-size: 1.1rem;\n font-weight: 700;\n margin: 0 0 8px 0;\n color: #333;\n}\n\n/* Page-level timeline title (from JSON timelineName) */\n/* Hidden by default to prevent jump; revealed with timeline fade-in */\n.timeline__title {\n font-size: 1.25rem;\n font-weight: 700;\n margin: 0 0 18px 0;\n color: #333;\n text-align: center;\n position: relative;\n z-index: 0;\n opacity: 0;\n visibility: hidden;\n transition: opacity 500ms ease-in-out, visibility 500ms ease-in-out;\n}\n\n/* Show title when visible class is added by JS */\n.timeline__title--visible {\n opacity: 1;\n visibility: visible;\n}\n\n.timeline__image {\n display: block;\n width: auto;\n height: auto;\n max-width: 100%;\n border-radius: 4px;\n margin-bottom: 8px;\n}\n\n/* Summary truncation with line-clamp (3 lines) */\n.timeline__summary {\n font-size: 0.9rem;\n line-height: 1.4;\n color: #555;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Modal content hidden by default */\n.timeline__modal-content {\n display: none;\n font-size: 1rem;\n line-height: 1.6;\n color: #333;\n}\n\n.timeline__modal-content p {\n margin-bottom: 12px;\n}\n\n.timeline__modal-content p:last-child {\n margin-bottom: 0;\n}\n\n.timeline *,\n.timeline *::before,\n.timeline *::after {\n box-sizing: inherit;\n}\n\n.timeline:not(.timeline--horizontal)::before {\n background-color: var(--timeline-line-color);\n bottom: 0;\n content: '';\n left: 50%;\n margin-left: -2px;\n position: absolute;\n top: 0;\n width: 4px;\n z-index: 1;\n}\n\n.timeline__wrap {\n overflow: hidden;\n position: relative;\n z-index: 2;\n}\n\n.timeline--horizontal .timeline__wrap {\n /* Clip items horizontally (past nav buttons) but allow vertical overflow */\n overflow-x: hidden;\n overflow-y: visible;\n}\n\n.timeline__item {\n font-size: 1rem;\n padding: 10px 40px 10px 0;\n position: relative;\n width: 50%;\n z-index: 2;\n}\n\n/* Mobile layout: vertical timeline, left-aligned, stacked items */\n.timeline--mobile {\n padding: 0;\n}\n\n.timeline--mobile::before {\n left: 10px !important;\n margin: 0 !important;\n}\n\n.timeline--mobile .timeline__item {\n left: 0;\n padding-left: 40px;\n padding-right: 0;\n width: 100%;\n margin-bottom: 20px;\n}\n\n/* Gap between items when same-side vertical layout is active (includes mobile) */\n.timeline--same-side:not(.timeline--horizontal) .timeline__item {\n margin-bottom: var(--timeline-same-side-gap);\n}\n\n.timeline--same-side:not(.timeline--horizontal) .timeline__item:last-child {\n margin-bottom: 0;\n}\n\n.timeline--mobile .timeline__item::after {\n left: 2px;\n margin: 0;\n right: auto;\n transform: translateY(-50%);\n}\n\n.timeline--mobile .timeline__content {\n background-color: #FFF;\n border: 1px solid #CCC;\n border-radius: 10px;\n padding: 8px;\n position: relative;\n display: grid;\n /* columns: image | date | spacer | content */\n grid-template-columns: 60px 70px 5px 1fr;\n grid-template-rows: auto auto;\n column-gap: 8px;\n row-gap: 4px;\n align-items: start;\n min-height: auto;\n}\n\n/* Mobile + no-summary: keep image/date/heading in one row and center-align them */\n.timeline--mobile .timeline__content.no-summary {\n align-items: center;\n column-gap: 12px;\n display: grid;\n /* image | date | spacer | heading */\n grid-template-columns: 80px 110px 5px 1fr;\n grid-template-rows: auto;\n row-gap: 0;\n}\n\n.timeline--mobile .timeline__content.no-image.no-summary {\n grid-template-columns: 110px 1fr;\n}\n\n.timeline--mobile .timeline__content.no-summary .timeline__image {\n grid-column: 1;\n grid-row: 1;\n width: 80px;\n height: 80px;\n margin: 0;\n object-fit: cover;\n}\n\n.timeline--mobile .timeline__content.no-summary .timeline__date {\n grid-column: 2;\n grid-row: 1;\n margin: 0;\n white-space: nowrap;\n align-self: center;\n}\n\n.timeline--mobile .timeline__content.no-summary .timeline__heading {\n grid-column: 4;\n grid-row: 1;\n margin: 0;\n align-self: center;\n line-height: 1.2;\n}\n\n/* Triangle pointers for mobile left-aligned layout */\n.timeline--mobile .timeline__content::before {\n content: '';\n position: absolute;\n height: 0;\n width: 0;\n border-bottom: 10px solid transparent;\n border-right: 12px solid #CCC;\n border-left: none;\n border-top: 10px solid transparent;\n left: -12px;\n top: 50%;\n transform: translateY(-50%);\n z-index: 1;\n}\n\n/* Visually-hidden helper for accessibility (screen-reader only) */\n.sr-only {\n position: absolute !important;\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n\n.timeline--mobile .timeline__content::after {\n content: '';\n position: absolute;\n height: 0;\n width: 0;\n border-bottom: 9px solid transparent;\n border-right: 10px solid #FFF;\n border-left: none;\n border-top: 9px solid transparent;\n left: -10px;\n top: 50%;\n transform: translateY(-50%);\n z-index: 2;\n}\n\n.timeline--mobile .timeline__image {\n width: 60px;\n height: 60px;\n object-fit: cover;\n border-radius: 4px;\n grid-column: 1;\n grid-row: 1 / span 2;\n margin: 0;\n}\n\n.timeline--mobile .timeline__date {\n font-size: 0.9rem;\n font-weight: 700;\n color: #333;\n grid-column: 2;\n grid-row: 1 / span 2;\n white-space: nowrap;\n padding-top: 0;\n align-self: center;\n padding-right: 8px;\n}\n\n.timeline--mobile .timeline__heading {\n font-size: 0.9rem;\n font-weight: 700;\n margin: 0;\n color: #333;\n grid-column: 4;\n grid-row: 1;\n min-width: 0;\n line-height: 1.2;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n\n.timeline--mobile .timeline__summary {\n font-size: 0.8rem;\n line-height: 1.2;\n color: #555;\n -webkit-line-clamp: 2;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n grid-column: 4;\n grid-row: 2;\n min-width: 0;\n}\n\n/* Ensure a small internal gap between the date column and the text column\n so the separation remains visible on narrow screens. */\n.timeline--mobile .timeline__heading,\n.timeline--mobile .timeline__summary {\n padding-left: 6px;\n}\n\n/* Collapse to two+spacer columns when no image is present */\n.timeline--mobile .timeline__content:not(:has(.timeline__image)) {\n /* date | spacer | content */\n grid-template-columns: 70px 5px 1fr;\n}\n\n.timeline--mobile .timeline__content:not(:has(.timeline__image)) .timeline__date {\n grid-column: 1;\n grid-row: 1 / span 2;\n align-self: center;\n}\n\n.timeline--mobile .timeline__content:not(:has(.timeline__image)) .timeline__heading {\n grid-column: 3;\n grid-row: 1;\n}\n\n.timeline--mobile .timeline__content:not(:has(.timeline__image)) .timeline__summary {\n grid-column: 3;\n grid-row: 2;\n}\n\n/* JS fallback: when image is absent, add .no-image to the content element\n Mirror the :has() rules so older browsers work when demo JS adds .no-image */\n.timeline--mobile .timeline__content.no-image {\n /* date | spacer | content */\n grid-template-columns: 70px 5px 1fr;\n}\n.timeline--mobile .timeline__content.no-image .timeline__date {\n grid-column: 1;\n grid-row: 1 / span 2;\n align-self: center;\n}\n.timeline--mobile .timeline__content.no-image .timeline__heading {\n grid-column: 3;\n grid-row: 1;\n}\n.timeline--mobile .timeline__content.no-image .timeline__summary {\n grid-column: 3;\n grid-row: 2;\n}\n\n/* Vertical layout: side-by-side alternating */\n@media (min-width: 768px) {\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item {\n width: 50%;\n padding: 10px 40px 10px 0;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item::after {\n right: -10px;\n left: auto;\n transform: translateY(-50%);\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--left {\n left: 0;\n padding: 10px 40px 10px 0;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--right {\n left: 50%;\n padding: 10px 0 10px 40px;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--right::after {\n left: -10px;\n right: auto;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--left .timeline__content::before {\n border-bottom: 10px solid transparent;\n border-left: 12px solid #CCC;\n border-top: 10px solid transparent;\n right: -12px;\n left: auto;\n z-index: 1;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--left .timeline__content::after {\n border-bottom: 9px solid transparent;\n border-left: 11px solid #FFF;\n border-top: 9px solid transparent;\n right: -10px;\n left: auto;\n z-index: 2;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--right .timeline__content::before {\n border-bottom: 10px solid transparent;\n border-right: 12px solid #CCC;\n border-left: none;\n border-top: 10px solid transparent;\n left: -12px;\n right: auto;\n z-index: 1;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--right .timeline__content::after {\n border-bottom: 9px solid transparent;\n border-right: 11px solid #FFF;\n border-left: none;\n border-top: 9px solid transparent;\n left: -10px;\n right: auto;\n z-index: 2;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content {\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 16px;\n max-height: none;\n position: relative;\n }\n\n /* When there is no summary present, lay out image / date / heading in a single row\n for vertical (desktop) timelines. Use :has() where available and provide a\n JS-friendly fallback using the `.no-summary` class (can be added by script). */\n /* Treat \"no summary\" as: no summary node or summary node is empty/whitespace (JS adds .no-summary fallback too) */\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))),\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary {\n display: grid;\n grid-template-columns: 100px 120px 1fr;\n column-gap: 16px;\n gap: 0;\n align-items: center;\n padding: 16px;\n }\n\n /* If image is absent and no summary, collapse to two columns: [date][heading] */\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__image)):not(:has(.timeline__summary:not(:empty))),\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-image.no-summary {\n grid-template-columns: 120px 1fr;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content .timeline__image {\n grid-column: 1;\n width: 100px;\n height: 100px;\n object-fit: cover;\n margin: 0;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content .timeline__date {\n grid-column: 2;\n margin: 0;\n white-space: nowrap;\n align-self: center;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content .timeline__heading {\n grid-column: 3;\n margin: 0;\n align-self: center;\n line-height: 1.2;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content::before,\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content::after {\n content: '';\n height: 0;\n position: absolute;\n transform: translateY(-50%);\n top: 50%;\n width: 0;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__image {\n max-width: 100%;\n height: auto;\n margin-bottom: 0;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__summary {\n font-size: 0.95rem;\n -webkit-line-clamp: 3;\n }\n}\n\n/* Horizontal layout: carousel with fixed card width */\n@media (min-width: 1200px) {\n .timeline--horizontal .timeline__content {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n gap: 8px;\n padding: 12px;\n }\n\n .timeline--horizontal .timeline__date {\n order: 2;\n font-weight: bold;\n font-size: 0.95rem;\n }\n\n .timeline--horizontal .timeline__heading {\n order: 3;\n font-size: 1rem;\n margin: 0;\n }\n\n .timeline--horizontal .timeline__image {\n order: 1;\n width: var(--timeline-h-image-size);\n height: var(--timeline-h-image-size);\n object-fit: cover;\n margin-bottom: 0;\n }\n\n .timeline--horizontal .timeline__summary {\n order: 4;\n font-size: 0.85rem;\n -webkit-line-clamp: 2;\n }\n}\n\n.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item .timeline__image {\n width: 100px;\n height: auto;\n max-height: 100px;\n object-fit: cover;\n margin: 0 auto 12px;\n}\n\n.timeline__item::after {\n background-color: var(--timeline-node-bg);\n border: 4px solid var(--timeline-node-color);\n border-radius: 50%;\n content: '';\n height: 20px;\n position: absolute;\n right: -10px;\n transform: translateY(-50%);\n top: 50%;\n width: 20px;\n z-index: 1;\n}\n\n.timeline__item.animated {\n animation-duration: 1s;\n animation-fill-mode: both;\n opacity: 0;\n}\n\n.timeline__item.fadeIn {\n animation-name: fadeIn;\n}\n\n/* Active state for current/deep-linked node */\n.timeline__item--active .timeline__content {\n border-color: var(--timeline-active-outline-color);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n\n/* Fill the dot for active node */\n.timeline__item--active::after {\n background-color: var(--timeline-node-color);\n}\n\n.timeline__item--left {\n left: 0;\n}\n\n.timeline__item--right {\n left: 50%;\n padding: 10px 0 10px 40px;\n}\n\n.timeline__item--right::after {\n left: -10px;\n}\n\n.timeline__item--right .timeline__content::before {\n border-bottom: 10px solid transparent;\n border-right: 12px solid #CCC;\n border-left: none;\n border-top: 10px solid transparent;\n left: -12px;\n}\n\n.timeline__item--right .timeline__content::after {\n border-bottom: 9px solid transparent;\n border-right: 11px solid #FFF;\n border-left: none;\n border-top: 9px solid transparent;\n left: -10px;\n}\n\n.timeline__content {\n background-color: #FFF;\n border: 1px solid #CCC;\n border-radius: 10px;\n color: #333;\n display: block;\n padding: 20px;\n position: relative;\n z-index: 2;\n}\n\n/* Vertical (desktop) layout: when summary is absent or empty, lay out items in one row */\n@media (min-width: 768px) {\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))),\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary {\n display: grid;\n grid-template-columns: 100px 120px 1fr;\n column-gap: 16px;\n row-gap: 0;\n align-items: center;\n padding: 16px;\n }\n\n /* No image: collapse to two columns */\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__image)):not(:has(.timeline__summary:not(:empty))),\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-image.no-summary {\n grid-template-columns: 120px 1fr;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__image,\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__image {\n grid-column: 1;\n width: 100px;\n height: 100px;\n object-fit: cover;\n margin: 0;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__date,\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__date {\n grid-column: 2;\n margin: 0;\n white-space: nowrap;\n align-self: center;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__heading,\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__heading {\n grid-column: 3;\n margin: 0;\n align-self: center;\n line-height: 1.2;\n }\n}\n\n/* Image styling handled in responsive sections above */\n\n.timeline__content::before,\n.timeline__content::after {\n content: '';\n height: 0;\n position: absolute;\n transform: translateY(-50%);\n top: 50%;\n width: 0;\n}\n\n.timeline__content::before {\n border-bottom: 10px solid transparent;\n border-left: 12px solid #CCC;\n border-top: 10px solid transparent;\n right: -12px;\n z-index: 1;\n}\n\n.timeline__content::after {\n border-bottom: 9px solid transparent;\n border-left: 11px solid #FFF;\n border-top: 9px solid transparent;\n right: -10px;\n z-index: 2;\n}\n\n.timeline__content h2 {\n font-size: 20px;\n font-weight: 700;\n margin: 0 0 10px;\n}\n\n.timeline__content h3 {\n font-size: 18px;\n font-weight: 700;\n margin: 0 0 10px;\n}\n\n.timeline__content p {\n font-size: 15px;\n line-height: 1.5;\n margin-bottom: 10px;\n}\n\n.timeline--horizontal {\n font-size: 0;\n padding: 0 60px;\n overflow: hidden;\n}\n\n.timeline--horizontal .timeline__wrap {\n overflow: hidden;\n white-space: nowrap;\n position: relative;\n z-index: 2;\n}\n\n.timeline--horizontal .timeline-divider {\n background-color: var(--timeline-line-color);\n display: block;\n height: 4px;\n left: 40px;\n position: absolute;\n transform: translateY(-50%);\n right: 40px;\n z-index: 1;\n}\n\n.timeline--horizontal .timeline__items {\n transition: all 0.8s;\n will-change: transform;\n}\n\n.timeline--horizontal .timeline__item {\n display: inline-block;\n left: 0;\n padding: 0 0 60px;\n position: relative;\n transition: none;\n vertical-align: top;\n white-space: normal;\n width: var(--timeline-h-node-width);\n}\n\n/* Gap between items when same-side horizontal layout is active */\n.timeline--same-side.timeline--horizontal .timeline__item {\n margin-right: var(--timeline-same-side-gap);\n}\n\n.timeline--same-side.timeline--horizontal .timeline__item:last-child {\n margin-right: 0;\n}\n\n/* Same-side top mode: nodes below the timeline */\n.timeline--same-side.timeline--horizontal .timeline__item--top {\n padding: 0 0 60px;\n vertical-align: bottom;\n}\n\n/* Same-side bottom mode: nodes above the timeline */\n.timeline--same-side.timeline--horizontal .timeline__item--bottom {\n padding: 60px 0 0;\n vertical-align: top;\n}\n\n.timeline--horizontal .timeline__item .timeline__content {\n padding: 12px;\n min-height: var(--timeline-h-node-min-height);\n}\n\n.timeline--horizontal .timeline__item .timeline__content h3 {\n font-size: var(--timeline-h-title-font-size);\n font-weight: 700;\n margin: 0 0 8px;\n}\n\n.timeline--horizontal .timeline__item .timeline__content p {\n font-size: var(--timeline-h-text-font-size);\n line-height: 1.4;\n margin-bottom: 0;\n}\n\n.timeline--horizontal .timeline__item::after {\n left: 50%;\n right: auto;\n transform: translate(-50%, -50%);\n top: 100%;\n}\n\n/* Same-side layouts: position dots on the divider line */\n.timeline--same-side.timeline--horizontal .timeline__item--top::after {\n /* Top mode: divider is at bottom of item minus 30px padding zone */\n top: calc(100% - 30px);\n}\n\n.timeline--same-side.timeline--horizontal .timeline__item--bottom::after {\n /* Bottom mode: divider is at 30px from top */\n top: 30px;\n}\n\n.timeline--horizontal .timeline__item .timeline__item__inner {\n display: table;\n height: 100%;\n width: 100%;\n}\n\n.timeline--horizontal .timeline__item .timeline__content__wrap {\n display: table-cell;\n margin: 0;\n padding: 0;\n vertical-align: bottom;\n}\n\n.timeline--horizontal .timeline__item .timeline__content::before {\n border-left: 12px solid transparent;\n border-right: 12px solid transparent;\n border-top: 12px solid #CCC;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n top: 100%;\n}\n\n.timeline--horizontal .timeline__item .timeline__content::after {\n border-left: 10px solid transparent;\n border-right: 10px solid transparent;\n border-top: 10px solid #FFF;\n left: 50%;\n right: auto;\n transform: translateX(-50%);\n top: 100%;\n}\n\n.timeline--horizontal .timeline__item--bottom {\n padding: 60px 0 0;\n}\n\n.timeline--horizontal .timeline__item--bottom::after {\n top: 0;\n}\n\n.timeline--horizontal .timeline__item--bottom .timeline__content__wrap {\n vertical-align: top;\n}\n\n.timeline--horizontal .timeline__item--bottom .timeline__content::before {\n border-bottom: 12px solid #CCC;\n border-left: 12px solid transparent;\n border-right: 12px solid transparent;\n border-top: none;\n bottom: 100%;\n top: auto;\n}\n\n.timeline--horizontal .timeline__item--bottom .timeline__content::after {\n border-bottom: 10px solid #FFF;\n border-left: 10px solid transparent;\n border-right: 10px solid transparent;\n border-top: none;\n bottom: 100%;\n top: auto;\n}\n\n/* Active pointer/arrow outline should match the active outline color */\n.timeline--horizontal .timeline__item.timeline__item--active .timeline__content::before {\n border-top-color: var(--timeline-active-outline-color);\n}\n\n/* Make the active pointer look integrated with the card (avoid a thick \"seam\" line) */\n.timeline--horizontal .timeline__item.timeline__item--active .timeline__content::after {\n border-left-width: 11px;\n border-right-width: 11px;\n border-top-width: 11px;\n}\n\n.timeline--horizontal .timeline__item--bottom.timeline__item--active .timeline__content::before {\n border-bottom-color: var(--timeline-active-outline-color);\n}\n\n.timeline--horizontal .timeline__item--bottom.timeline__item--active .timeline__content::after {\n border-left-width: 11px;\n border-right-width: 11px;\n border-bottom-width: 11px;\n}\n\n.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--active.timeline__item--left .timeline__content::before {\n border-left-color: var(--timeline-active-outline-color);\n}\n\n.timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__item--active.timeline__item--right .timeline__content::before {\n border-right-color: var(--timeline-active-outline-color);\n}\n\n.timeline--mobile .timeline__item--active .timeline__content::before {\n border-right-color: var(--timeline-active-outline-color);\n}\n\n.timeline-nav-button {\n background-color: var(--timeline-nav-color);\n border: 3px solid var(--timeline-nav-border);\n border-radius: 50px;\n box-sizing: border-box;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n cursor: pointer;\n display: block;\n height: 40px;\n outline: none;\n position: absolute;\n text-indent: -9999px;\n transform: translateY(-50%);\n top: 50%;\n width: 40px;\n z-index: 10;\n transition: all 0.3s ease;\n}\n\n.timeline-nav-button:hover {\n transform: translateY(-50%) scale(1.15);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n}\n\n.timeline-nav-button:disabled {\n opacity: .5;\n pointer-events: none;\n cursor: not-allowed;\n user-select: none;\n}\n\n/* Visual disabled state for at-start and at-end classes (no actual disabled attribute) */\n.timeline-nav-button.timeline-nav-button--at-start,\n.timeline-nav-button.timeline-nav-button--at-end {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.timeline-nav-button.timeline-nav-button--at-start:hover,\n.timeline-nav-button.timeline-nav-button--at-end:hover {\n transform: translateY(-50%);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.timeline-nav-button::before {\n display: none;\n}\n\n.timeline-nav-button svg {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n}\n\n.timeline-nav-button--prev {\n left: 10px;\n}\n\n.timeline-nav-button--next {\n right: 10px;\n}\n\n/* Mobile layout styles handled in responsive sections above */\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n top: 70px;\n }\n 100% {\n opacity: 1;\n top: 0px;\n }\n}\n\n@keyframes liftUp {\n 0% {\n top: 0px;\n }\n 100% {\n top: -15px;\n }\n}\n\n/* Modal Styles */\n.timeline-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.85);\n z-index: 9998;\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.3s ease, visibility 0.3s ease;\n}\n\n.timeline-modal-overlay.timeline-modal-show {\n opacity: 1;\n visibility: visible;\n}\n\n.timeline-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.7);\n width: 90%;\n max-width: 900px;\n max-height: 90vh;\n background-color: #FFF;\n border-radius: 0;\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);\n z-index: 9999;\n opacity: 0;\n visibility: hidden;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s ease;\n}\n\n.timeline-modal.timeline-modal-show {\n opacity: 1;\n visibility: visible;\n transform: translate(-50%, -50%) scale(1);\n}\n\n.timeline-modal__content {\n padding: 40px;\n max-height: 90vh;\n overflow-y: auto;\n overflow-x: hidden;\n flex: 1 1 auto;\n min-height: 0;\n}\n\n/* Use user-agent/default scrollbar styling so OS/browser controls decide width */\n\n.timeline-modal__image {\n width: auto;\n max-width: 100%;\n height: auto;\n border-radius: 0;\n margin: 0 auto 20px;\n display: block;\n}\n\n.timeline-modal__title {\n font-size: 28px;\n font-weight: 700;\n margin: 0 0 20px;\n color: #333;\n}\n\n.timeline-modal__text {\n font-size: 16px;\n line-height: 1.6;\n color: #555;\n}\n\n.timeline-modal__text p {\n margin-bottom: 15px;\n}\n\n.timeline-modal__divider {\n border: 0;\n border-top: 1px solid #ddd;\n margin: 30px 0;\n}\n\n.timeline-modal__close-bottom {\n display: inline-block;\n padding: 12px 40px;\n background-color: #333;\n color: #fff;\n border: none;\n border-radius: 0;\n font-size: 16px;\n cursor: pointer;\n transition: background-color 0.2s ease;\n}\n\n.timeline-modal__close-bottom:hover {\n background-color: #555;\n}\n\n.timeline-modal__footer {\n border-top: 1px solid #ddd;\n padding: 16px 24px;\n background: #fff;\n text-align: center;\n flex: 0 0 auto;\n}\n\n.timeline-modal__close {\n position: absolute;\n top: 20px;\n right: 20px;\n width: 40px;\n height: 40px;\n background-color: rgba(0, 0, 0, 0.6);\n border: none;\n border-radius: 4px;\n color: #FFF;\n font-size: 24px;\n line-height: 1;\n cursor: pointer;\n transition: background-color 0.2s ease, transform 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.timeline-modal__close:hover {\n background-color: rgba(0, 0, 0, 0.8);\n transform: scale(1.1);\n}\n\n.timeline-modal__close::before {\n content: '×';\n}\n\n/* Fullscreen modals on small screens (medium and below) */\n@media (max-width: 768px) {\n .timeline-modal {\n width: 100%;\n max-width: 100%;\n height: 100%;\n max-height: 100%;\n top: 0;\n left: 0;\n transform: scale(0.95);\n border-radius: 0;\n }\n \n .timeline-modal.timeline-modal-show {\n transform: scale(1);\n }\n \n .timeline-modal__content {\n max-height: 100%;\n padding: 60px 20px 20px; /* More top padding for close button */\n }\n \n .timeline-modal__close {\n top: 10px;\n right: 10px;\n width: 48px;\n height: 48px;\n font-size: 28px;\n border-radius: 50%;\n background-color: rgba(0, 0, 0, 0.7);\n }\n \n .timeline-modal__close:hover {\n background-color: rgba(0, 0, 0, 0.9);\n }\n}\n\n/* Make timeline items clickable */\n.timeline__item {\n cursor: pointer;\n transition: transform 0.2s ease;\n}\n\n.timeline__item:hover .timeline__content {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n\n/* Horizontal mode: keep hover shadow, but don't translate cards upward.\n This avoids node-1 clipping without impacting divider/dot layout. */\n.timeline--horizontal .timeline__item:hover .timeline__content {\n transform: none;\n}\n\n/* Error UI */\n.timeline__error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 24px 16px;\n border: 2px solid #e0e0e0;\n border-radius: 12px;\n margin: 20px auto;\n max-width: 600px;\n background: #fff;\n}\n\n.timeline__error-icon {\n width: 200px;\n max-width: 100%;\n height: auto;\n margin-bottom: 24px;\n opacity: 0.8;\n}\n\n/* Hide timeline decorations when showing error UI inside the timeline container */\n.timeline.timeline--error::before,\n.timeline.timeline--error .timeline-divider,\n.timeline.timeline--error .timeline-nav-button {\n display: none !important;\n}\n.timeline.timeline--error .timeline__items,\n.timeline.timeline--error .timeline__wrap {\n display: none !important;\n}\n\n.timeline__error-title {\n font-size: 24px;\n font-weight: 700;\n margin: 0 0 16px;\n color: #d32f2f;\n}\n\n.timeline__error-message {\n font-size: 16px;\n line-height: 1.6;\n margin: 0 0 16px;\n color: #555;\n}\n\n.timeline__error-solution {\n font-size: 15px;\n line-height: 1.6;\n margin: 0 0 12px;\n color: #333;\n background-color: #fff3cd;\n border: 1px solid #ffc107;\n border-radius: 6px;\n padding: 12px 16px;\n}\n\n/* Responsive horizontal timeline scaling for smaller screens */\n/* Medium screens (tablets in landscape, small laptops) */\n@media (max-width: 1024px) {\n .timeline--horizontal {\n --timeline-h-node-width: 180px;\n --timeline-h-node-min-height: 160px;\n --timeline-h-image-size: 90px;\n }\n}\n\n/* Small screens (tablets in portrait, large phones in landscape) */\n@media (max-width: 768px) {\n .timeline--horizontal {\n --timeline-h-node-width: 160px;\n --timeline-h-node-min-height: 140px;\n --timeline-h-image-size: 80px;\n --timeline-h-title-font-size: 16px;\n --timeline-h-text-font-size: 10px;\n }\n /* Hide summary text on smaller screens to save space */\n .timeline--horizontal .timeline__summary {\n display: none;\n }\n}\n\n/* Very small screens (phones in landscape) */\n@media (max-width: 640px) {\n .timeline--horizontal {\n --timeline-h-node-width: 140px;\n --timeline-h-node-min-height: 120px;\n --timeline-h-image-size: 70px;\n --timeline-h-title-font-size: 14px;\n padding: 0 40px;\n }\n /* Keep summary hidden */\n .timeline--horizontal .timeline__summary {\n display: none;\n }\n}\n\n/* Extra small screens (small phones in landscape) */\n@media (max-width: 480px) {\n .timeline--horizontal {\n --timeline-h-node-width: 120px;\n --timeline-h-node-min-height: 100px;\n --timeline-h-image-size: 60px;\n --timeline-h-title-font-size: 13px;\n padding: 0 30px;\n }\n /* Show only image and date - hide heading and summary */\n .timeline--horizontal .timeline__heading {\n font-size: 12px;\n margin: 0 0 4px;\n line-height: 1.2;\n -webkit-line-clamp: 2;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n .timeline--horizontal .timeline__summary {\n display: none;\n }\n}\n\n/* Ultra-compact mode for tiny screens */\n@media (max-width: 360px) {\n .timeline--horizontal {\n --timeline-h-node-width: 100px;\n --timeline-h-node-min-height: 90px;\n --timeline-h-image-size: 50px;\n --timeline-h-title-font-size: 11px;\n padding: 0 20px;\n }\n /* Show only image and date */\n .timeline--horizontal .timeline__heading {\n font-size: 11px;\n -webkit-line-clamp: 1;\n }\n}\n\n/* Micro-screen responsive rules (progressive column hiding)\n 1) <=420px: hide summary (keep Image | Date | Heading)\n 2) <=360px: hide image (Date | Heading/Summary)\n 3) <=320px: compact mode - show only date\n*/\n@media (max-width: 420px) {\n .timeline--mobile .timeline__summary {\n display: none;\n }\n .timeline--mobile .timeline__content {\n grid-template-columns: 60px 70px 1fr;\n }\n\n /* On this breakpoint the flexible content column becomes column 3 */\n .timeline--mobile .timeline__heading {\n grid-column: 3;\n }\n}\n\n@media (max-width: 360px) {\n .timeline--mobile .timeline__image {\n display: none;\n }\n .timeline--mobile .timeline__content {\n grid-template-columns: 70px 1fr;\n grid-template-rows: auto auto;\n }\n .timeline--mobile .timeline__date {\n grid-column: 1;\n grid-row: 1 / span 2;\n align-self: center;\n }\n .timeline--mobile .timeline__heading {\n grid-column: 2;\n grid-row: 1;\n }\n .timeline--mobile .timeline__summary {\n display: block;\n grid-column: 2;\n grid-row: 2;\n }\n}\n\n@media (max-width: 320px) {\n .timeline--mobile .timeline__heading,\n .timeline--mobile .timeline__summary,\n .timeline--mobile .timeline__image {\n display: none;\n }\n .timeline--mobile .timeline__content {\n grid-template-columns: 1fr;\n padding: 6px;\n }\n .timeline--mobile .timeline__date {\n grid-column: 1;\n grid-row: 1;\n align-self: center;\n }\n}\n\n.timeline__error-solution strong {\n color: #856404;\n}\n\n.timeline__error-details {\n font-size: 13px;\n line-height: 1.5;\n margin: 12px 0 0;\n color: #666;\n font-family: 'Courier New', monospace;\n background-color: #f5f5f5;\n border: 1px solid #ddd;\n border-radius: 4px;\n padding: 8px 12px;\n max-width: 100%;\n overflow-x: auto;\n}\n\n.timeline__error-details strong {\n color: #333;\n}\n\n/* Final override: ensure vertical no-summary cards stay in a single row (after base .timeline__content rules) */\n@media (min-width: 768px) {\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary,\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) {\n display: grid !important;\n grid-template-columns: 100px 120px 1fr;\n column-gap: 16px;\n row-gap: 0;\n align-items: center;\n padding: 16px;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-image.no-summary,\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__image)):not(:has(.timeline__summary:not(:empty))) {\n grid-template-columns: 120px 1fr;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__image,\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__image {\n grid-column: 1;\n width: 100px;\n height: 100px;\n object-fit: cover;\n margin: 0;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__date,\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__date {\n grid-column: 2;\n margin: 0;\n white-space: nowrap;\n align-self: center;\n }\n\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content.no-summary .timeline__heading,\n .timeline:not(.timeline--horizontal):not(.timeline--mobile) .timeline__content:has(.timeline__heading):not(:has(.timeline__summary:not(:empty))) .timeline__heading {\n grid-column: 3;\n margin: 0;\n align-self: center;\n line-height: 1.2;\n }\n}\n"]}