imdhemy-jekyll-theme 1.0.0 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68a2421fc01b914158903f38955d459bdadcd29e8daf429cf68db51871921ba8
4
- data.tar.gz: 1ffae175b00a683ef6e42746332ec76ad48784560e5d1b4a0ef886c842bcfe45
3
+ metadata.gz: 6604ba565cd7d0a0cba90e9c97bfaf5a2eccbb1e491465aa8b823eff357436f0
4
+ data.tar.gz: aed98a84999b132d27b2291194b93def3d89e448a391f2d65dfddb8005119ada
5
5
  SHA512:
6
- metadata.gz: d4104d5d88e7915ae5b1648b3987fc5d6b74cd3eb3e29a1fe15928b6a3a27a02d421371455066d3730d144665760fe7cf437f1603c4775b83af0c2483ba5df8a
7
- data.tar.gz: 3095cf8e24b5308c8a0f5578c4179c5cf8e1cd68ab7af867ff3484d9901d43d06f8f5ba9598e3404a09d1154c5d9a09f9573721be71c8604a11a77730f5c1af3
6
+ metadata.gz: 6da70bdee4e9841196ae8dfe68b38470297639fa06b887bd96ea1fb60e177f96c956472faef35cbdd39add43f28a7ef75d97e5540ea30809a1777b9d630bf4bc
7
+ data.tar.gz: 05a4971a0dec0ed809a75ca670474699f6a46dbc491823df25b26948e7ee6673e0918d374f9c9a432f6c1fd1c9f59f6c5647ef7209b630a487abc9e8245212d4
data/README.md CHANGED
@@ -1,134 +1,27 @@
1
1
  # Imdhemy Jekyll Theme
2
2
 
3
- Jekyll theme for my personal website. [imdhemy.com](https://imdhemy.com)
3
+ Jekyll theme for my personal website: [imdhemy.com](https://imdhemy.com).
4
4
 
5
- ## Installation (Recommended: RubyGem)
5
+ ## Documentation
6
6
 
7
- Install the theme as a gem and pin a semantic version.
7
+ All documentation lives in the [`docs/`](./docs) directory.
8
8
 
9
- Add to your site's `Gemfile`:
9
+ - [Documentation Home](./docs/README.md)
10
+ - [Getting Started](./docs/getting-started.md)
11
+ - [Configuration Reference](./docs/configuration.md)
12
+ - [Customization Guide](./docs/customization.md)
13
+ - [Components and Layouts](./docs/components.md)
14
+ - [Content Elements](./docs/content-elements.md)
15
+ - [Upgrade Guide](./UPGRADE.md)
10
16
 
11
- ```ruby
12
- gem "imdhemy-jekyll-theme", "1.0.0"
13
- ```
17
+ ## Example Site
14
18
 
15
- Set the theme in your site's `_config.yml`:
19
+ A complete runnable example is available in [`example/`](./example).
16
20
 
17
- ```yaml
18
- theme: imdhemy-jekyll-theme
19
- ```
21
+ ## Development
20
22
 
21
- Then run:
22
-
23
- ```bash
24
- bundle install
25
- ```
26
-
27
- ## Migrating From `remote_theme`
28
-
29
- If your site currently uses:
30
-
31
- ```yaml
32
- remote_theme: imdhemy/imdhemy-jekyll-theme
33
- ```
34
-
35
- Migrate to the gem flow:
36
-
37
- 1. Remove `remote_theme` from `_config.yml`.
38
- 2. Add `theme: imdhemy-jekyll-theme` to `_config.yml`.
39
- 3. Add `gem "imdhemy-jekyll-theme", "<semantic-version>"` to your `Gemfile`.
40
- 4. Run `bundle install`.
41
-
42
- ## Usage
43
-
44
- You can find examples in the [example](/example) directory.
45
-
46
- ## Customize Theme Copy
47
-
48
- The theme exposes UI text keys so users can control the added content from `_config.yml`.
49
-
50
- ```yaml
51
- theme_text:
52
- hero_kicker: "Personal blog and engineering notes"
53
- hero_cta_label: "Start reading"
54
- hero_secondary_cta_label: "About me"
55
- hero_secondary_cta_url: "/about"
56
- latest_posts_subtitle: "Fresh writing you can read in a few minutes."
57
- read_article_label: "Read article"
58
- back_to_posts_label: "Back to all posts"
59
- previous_article_label: "Previous article"
60
- next_article_label: "Next article"
61
- related_posts_heading: "Keep reading"
62
-
63
- theme_features:
64
- reading_progress: true
65
-
66
- theme_style:
67
- accent: "#3b82f6"
68
- accent_strong: "#2563eb"
69
- accent_soft: "#dbeafe"
70
- accent_surface: "#eff6ff"
71
- success: "#16a34a"
72
- info: "#2563eb"
73
- warning: "#d97706"
74
- danger: "#dc2626"
75
- background: "#eef4ff"
76
- surface: "#ffffff"
77
- text: "#0f172a"
78
- muted: "#475569"
79
- border: "#c9d8f2"
80
- ```
81
-
82
- ## Development Quick Start
83
-
84
- Use this sequence every time you start working on the theme locally.
85
-
86
- ### 1. Prerequisites
87
-
88
- - Ruby 3.3.4 + Bundler
89
- - Node.js 24 + npm
90
-
91
- The project pins runtime versions in:
92
-
93
- - `.ruby-version`
94
- - `.nvmrc`
95
- - `.node-version`
96
- - `.tool-versions`
97
-
98
- ### 2. Install dependencies
99
-
100
- ```bash
101
- bundle install
102
- npm install
103
- ```
104
-
105
- ### 3. Start development
106
-
107
- Run the theme preview and JS watcher together:
108
-
109
- ```bash
110
- npm start
111
- ```
112
-
113
- This runs:
114
-
115
- - `bundle exec rake preview` to serve the example site from `http://127.0.0.1:4000/example/`
116
- - `vite build --watch` to rebuild `assets/js/dist/main.js` on JS changes
117
-
118
- ### 4. Day-to-day workflow
119
-
120
- - Edit layouts/includes/styles in the theme root.
121
- - Edit sample content under `example/` to verify real pages.
122
- - Keep `npm start` running while you work.
123
-
124
- ### 5. Useful standalone commands
125
-
126
- ```bash
127
- npm run rake # Jekyll preview only
128
- npm run js:build # JS production build
129
- npm run js:watch # JS watcher only
130
- ```
23
+ Use the local workflow documented in [Getting Started](./docs/getting-started.md#5-local-development).
131
24
 
132
25
  ## License
133
26
 
134
- The theme is available as open source under the terms of the [MIT License](/LICENSE.txt).
27
+ The theme is available as open source under the terms of the [MIT License](./LICENSE.txt).
@@ -0,0 +1,44 @@
1
+ {% assign comments = site.theme_comments %}
2
+ {% assign comments_heading = site.theme_text.comments_heading | default: "Discussion" %}
3
+ {% assign comments_toggle_hint = site.theme_text.comments_toggle_hint | default: "Open to view reactions and comments" %}
4
+ {% if comments and comments.enabled and comments.provider == "giscus" %}
5
+ {% assign giscus = comments.giscus %}
6
+ {% assign giscus_host = giscus.host | default: "https://giscus.app" %}
7
+ {% if giscus and giscus.repo and giscus.repo_id and giscus.category and giscus.category_id %}
8
+ <section class="comments-shell" id="comments-section" aria-label="{{ comments_heading }}">
9
+ <div class="comments-shell__inner comments-collapsible" data-comments-collapsible>
10
+ <button class="comments-collapsible__toggle"
11
+ type="button"
12
+ aria-expanded="false"
13
+ aria-controls="comments-panel"
14
+ data-comments-toggle>
15
+ <span class="comments-collapsible__copy">
16
+ <span class="comments-shell__heading">{{ comments_heading }}</span>
17
+ <span class="comments-collapsible__hint">{{ comments_toggle_hint }}</span>
18
+ </span>
19
+ <span class="comments-collapsible__icon-wrap" aria-hidden="true">
20
+ <ion-icon class="comments-collapsible__icon" name="chevron-down-outline"></ion-icon>
21
+ </span>
22
+ </button>
23
+ <div class="comments-collapsible__panel" id="comments-panel" data-comments-panel hidden>
24
+ <div class="comments-collapsible__embed"
25
+ data-giscus-mount
26
+ data-giscus-script-src="{{ giscus_host }}/client.js"
27
+ data-giscus-repo="{{ giscus.repo }}"
28
+ data-giscus-repo-id="{{ giscus.repo_id }}"
29
+ data-giscus-category="{{ giscus.category }}"
30
+ data-giscus-category-id="{{ giscus.category_id }}"
31
+ data-giscus-mapping="{{ giscus.mapping | default: "pathname" }}"
32
+ data-giscus-term="{{ giscus.term }}"
33
+ data-giscus-strict="{{ giscus.strict | default: "0" }}"
34
+ data-giscus-reactions-enabled="{{ giscus.reactions_enabled | default: "1" }}"
35
+ data-giscus-emit-metadata="{{ giscus.emit_metadata | default: "0" }}"
36
+ data-giscus-input-position="{{ giscus.input_position | default: "top" }}"
37
+ data-giscus-theme="{{ giscus.theme | default: "preferred_color_scheme" }}"
38
+ data-giscus-lang="{{ giscus.lang | default: "en" }}"
39
+ data-giscus-loading="{{ giscus.loading | default: "lazy" }}"></div>
40
+ </div>
41
+ </div>
42
+ </section>
43
+ {% endif %}
44
+ {% endif %}
@@ -2,12 +2,12 @@
2
2
  {% assign back_to_posts_label = site.theme_text.back_to_posts_label | default: "Back to all posts" %}
3
3
  <div class="post-header">
4
4
  <a class="post-back-link" href="{{ site.baseurl }}/blog">&larr; {{ back_to_posts_label }}</a>
5
- <p class="post-header__meta">{{ page.date | date: "%b %-d, %Y" }} · {{ read_minutes }} min read</p>
6
- <div>
5
+ <h1 class="post-title">{{ page.title }}</h1>
6
+ {% include post-meta.html date=page.date reading_minutes=read_minutes class_name="post-header__meta post-meta" %}
7
+ <div class="post-header__tags">
7
8
  {% assign tags = page.tags %}
8
9
  {% include post-tags.html %}
9
10
  </div>
10
- <h1 class="post-title">{{ page.title }}</h1>
11
11
 
12
12
  {% if page.image %}
13
13
  <div class="post-image-wrap">
@@ -22,4 +22,6 @@
22
22
  {% endif %}
23
23
  </div>
24
24
  {% endif %}
25
+
26
+ {% include post-series.html %}
25
27
  </div>
@@ -12,9 +12,6 @@
12
12
  {% endif %}
13
13
  <!-- content -->
14
14
  <div class="post-card__content">
15
- <p class="post-card__meta">{{ post.date | date: "%b %-d, %Y" }} · {{ reading_minutes }} min read</p>
16
- {% assign tags = post.tags %}
17
- {% include post-tags.html %}
18
15
  <!-- title -->
19
16
  <h2 class="post-card__title">
20
17
  <a class="post-card__title-link"
@@ -25,6 +22,9 @@
25
22
  <div class="post-card__excerpt">
26
23
  {{ post.excerpt | strip_html | truncatewords: 20 }}
27
24
  </div>
25
+ {% include post-meta.html date=post.date reading_minutes=reading_minutes class_name="post-card__meta post-meta" %}
26
+ {% assign tags = post.tags %}
27
+ {% include post-tags.html %}
28
28
  <a class="post-card__read-link" href="{{ site.baseurl }}{{ post.url }}">{{ read_article_label }} &rarr;</a>
29
29
  </div>
30
30
  </article>
@@ -0,0 +1,9 @@
1
+ {% assign meta_class = include.class_name | default: "post-meta" %}
2
+ <p class="{{ meta_class }}">
3
+ <time datetime="{{ include.date | date_to_xmlschema }}">{{ include.date | date: "%b %-d, %Y" }}</time>
4
+ <span class="post-meta__separator" aria-hidden="true">&middot;</span>
5
+ <span class="post-meta__reading-time">
6
+ <ion-icon class="post-meta__icon" name="time-outline" aria-hidden="true"></ion-icon>
7
+ <span>{{ include.reading_minutes }} min read</span>
8
+ </span>
9
+ </p>
@@ -0,0 +1,194 @@
1
+ {% if page.list %}
2
+ {% assign series_name = page.list %}
3
+ {% assign visible_limit = site.theme_features.series_visible_limit | default: 5 %}
4
+ {% assign series_posts = site.posts | where: "list", series_name | sort: "date" %}
5
+ {% assign series_count = series_posts | size %}
6
+ {% assign has_overflow = false %}
7
+ {% assign overflow_count = 0 %}
8
+ {% assign series_toggle_hint = site.theme_text.series_toggle_hint | default: "Collapse to hide series posts" %}
9
+ {% assign series_part_word = "parts" %}
10
+ {% if series_count == 1 %}
11
+ {% assign series_part_word = "part" %}
12
+ {% endif %}
13
+ {% assign series_key = page.url | slugify %}
14
+ {% assign panel_id = "post-series-panel-" | append: series_key %}
15
+ {% assign list_id = "post-series-list-" | append: series_key %}
16
+ {% assign current_position = 0 %}
17
+ {% assign range_mode = "all" %}
18
+ {% assign visible_start = 1 %}
19
+ {% assign visible_end = series_count %}
20
+ {% assign show_edge_start_count = 0 %}
21
+ {% assign show_edge_end_count = 0 %}
22
+ {% assign hidden_before_count = 0 %}
23
+ {% assign hidden_middle_count = 0 %}
24
+ {% assign hidden_after_count = 0 %}
25
+ {% for post in series_posts %}
26
+ {% if post.url == page.url %}
27
+ {% assign current_position = forloop.index %}
28
+ {% endif %}
29
+ {% endfor %}
30
+ {% if series_count > visible_limit %}
31
+ {% assign has_overflow = true %}
32
+ {% assign overflow_count = series_count | minus: visible_limit %}
33
+ {% assign edge_count = visible_limit | divided_by: 2 %}
34
+ {% assign alt_count = visible_limit | minus: edge_count %}
35
+ {% assign end_threshold = series_count | minus: alt_count %}
36
+ {% if current_position <= alt_count %}
37
+ {% assign range_mode = "split" %}
38
+ {% assign show_edge_start_count = alt_count %}
39
+ {% assign show_edge_end_count = edge_count %}
40
+ {% elsif current_position > end_threshold %}
41
+ {% assign range_mode = "split" %}
42
+ {% assign show_edge_end_count = series_count | minus: current_position %}
43
+ {% assign show_edge_end_count = show_edge_end_count | plus: 1 %}
44
+ {% assign show_edge_start_count = visible_limit | minus: show_edge_end_count %}
45
+ {% else %}
46
+ {% assign range_mode = "window" %}
47
+ {% assign visible_start = current_position | minus: edge_count %}
48
+ {% assign visible_end = visible_start | plus: visible_limit %}
49
+ {% assign visible_end = visible_end | minus: 1 %}
50
+ {% if visible_start < 1 %}
51
+ {% assign visible_start = 1 %}
52
+ {% assign visible_end = visible_limit %}
53
+ {% endif %}
54
+ {% if visible_end > series_count %}
55
+ {% assign visible_end = series_count %}
56
+ {% assign visible_start = series_count | minus: visible_limit %}
57
+ {% assign visible_start = visible_start | plus: 1 %}
58
+ {% endif %}
59
+ {% endif %}
60
+ {% endif %}
61
+ {% if has_overflow %}
62
+ {% if range_mode == "split" %}
63
+ {% assign hidden_middle_count = overflow_count %}
64
+ {% elsif range_mode == "window" %}
65
+ {% assign hidden_before_count = visible_start | minus: 1 %}
66
+ {% assign hidden_after_count = series_count | minus: visible_end %}
67
+ {% endif %}
68
+ {% endif %}
69
+ {% assign has_hidden_overflow = false %}
70
+ {% if overflow_count > 0 %}
71
+ {% assign has_hidden_overflow = true %}
72
+ {% endif %}
73
+ <div class="post-series series-collapsible is-open" data-series-collapsible>
74
+ <div class="post-series__header">
75
+ <div class="post-series__heading-wrap">
76
+ <span class="post-series__heading">{{ series_name }}</span>
77
+ <span class="post-series__summary">{{ series_count }} {{ series_part_word }}</span>
78
+ </div>
79
+ <button class="series-collapsible__toggle"
80
+ type="button"
81
+ aria-label="{{ series_toggle_hint }}"
82
+ aria-expanded="true"
83
+ aria-controls="{{ panel_id }}"
84
+ data-series-toggle>
85
+ <span class="series-collapsible__icon-wrap" aria-hidden="true">
86
+ <ion-icon class="series-collapsible__icon" name="chevron-down-outline"></ion-icon>
87
+ </span>
88
+ </button>
89
+ </div>
90
+ <div class="series-collapsible__panel" id="{{ panel_id }}" data-series-panel>
91
+ <ol class="post-series__list" id="{{ list_id }}">
92
+ {% assign overflow_middle_toggle_inserted = false %}
93
+ {% assign overflow_before_toggle_inserted = false %}
94
+ {% assign overflow_after_toggle_inserted = false %}
95
+ {% for post in series_posts %}
96
+ {% assign is_overflow_item = false %}
97
+ {% assign should_hide = false %}
98
+ {% assign overflow_group = "" %}
99
+ {% if has_overflow %}
100
+ {% if range_mode == "split" %}
101
+ {% assign split_end_start = series_count | minus: show_edge_end_count %}
102
+ {% assign split_end_start = split_end_start | plus: 1 %}
103
+ {% if forloop.index > show_edge_start_count and forloop.index < split_end_start %}
104
+ {% assign should_hide = true %}
105
+ {% assign overflow_group = "middle" %}
106
+ {% endif %}
107
+ {% elsif range_mode == "window" %}
108
+ {% if forloop.index < visible_start %}
109
+ {% assign should_hide = true %}
110
+ {% assign overflow_group = "before" %}
111
+ {% elsif forloop.index > visible_end %}
112
+ {% assign should_hide = true %}
113
+ {% assign overflow_group = "after" %}
114
+ {% endif %}
115
+ {% endif %}
116
+ {% endif %}
117
+ {% if should_hide %}
118
+ {% assign is_overflow_item = true %}
119
+ {% endif %}
120
+ {% if has_hidden_overflow and overflow_group == "middle" and overflow_middle_toggle_inserted == false %}
121
+ {% assign middle_label = "other posts" %}
122
+ {% if hidden_middle_count == 1 %}
123
+ {% assign middle_label = "other post" %}
124
+ {% endif %}
125
+ <li class="post-series__overflow-item">
126
+ <button class="post-series__overflow-toggle"
127
+ type="button"
128
+ aria-controls="{{ list_id }}"
129
+ data-series-overflow-group="middle"
130
+ data-series-overflow-toggle>
131
+ &hellip; {{ hidden_middle_count }} {{ middle_label }}
132
+ </button>
133
+ </li>
134
+ {% assign overflow_middle_toggle_inserted = true %}
135
+ {% endif %}
136
+ {% if has_hidden_overflow and overflow_group == "before" and overflow_before_toggle_inserted == false %}
137
+ {% assign before_label = "previous posts" %}
138
+ {% if hidden_before_count == 1 %}
139
+ {% assign before_label = "previous post" %}
140
+ {% endif %}
141
+ <li class="post-series__overflow-item">
142
+ <button class="post-series__overflow-toggle"
143
+ type="button"
144
+ aria-controls="{{ list_id }}"
145
+ data-series-overflow-group="before"
146
+ data-series-overflow-toggle>
147
+ &hellip; {{ hidden_before_count }} {{ before_label }}
148
+ </button>
149
+ </li>
150
+ {% assign overflow_before_toggle_inserted = true %}
151
+ {% endif %}
152
+ {% if has_hidden_overflow and overflow_group == "after" and overflow_after_toggle_inserted == false %}
153
+ {% assign after_label = "next posts" %}
154
+ {% if hidden_after_count == 1 %}
155
+ {% assign after_label = "next post" %}
156
+ {% endif %}
157
+ <li class="post-series__overflow-item">
158
+ <button class="post-series__overflow-toggle"
159
+ type="button"
160
+ aria-controls="{{ list_id }}"
161
+ data-series-overflow-group="after"
162
+ data-series-overflow-toggle>
163
+ &hellip; {{ hidden_after_count }} {{ after_label }}
164
+ </button>
165
+ </li>
166
+ {% assign overflow_after_toggle_inserted = true %}
167
+ {% endif %}
168
+ {% assign item_class = "post-series__item" %}
169
+ {% if post.url == page.url %}
170
+ {% assign item_class = item_class | append: " is-current" %}
171
+ {% endif %}
172
+ {% if is_overflow_item %}
173
+ {% assign item_class = item_class | append: " post-series__item--overflow" %}
174
+ {% endif %}
175
+ <li class="{{ item_class }}"{% if is_overflow_item %} data-series-overflow-item data-series-overflow-group="{{ overflow_group }}" hidden{% endif %}>
176
+ {% if post.url == page.url %}
177
+ <span class="post-series__link"
178
+ aria-current="true">
179
+ <span class="post-series__index" aria-hidden="true">{{ forloop.index }}</span>
180
+ <span class="post-series__title">{{ post.title }}</span>
181
+ </span>
182
+ {% else %}
183
+ <a class="post-series__link"
184
+ href="{{ site.baseurl }}{{ post.url }}">
185
+ <span class="post-series__index" aria-hidden="true">{{ forloop.index }}</span>
186
+ <span class="post-series__title">{{ post.title }}</span>
187
+ </a>
188
+ {% endif %}
189
+ </li>
190
+ {% endfor %}
191
+ </ol>
192
+ </div>
193
+ </div>
194
+ {% endif %}
data/_layouts/post.html CHANGED
@@ -9,6 +9,8 @@ layout: default
9
9
 
10
10
  {% include content.html %}
11
11
 
12
+ {% include giscus-comments.html %}
13
+
12
14
  {% include post-navigation.html %}
13
15
 
14
16
  {% include related-posts.html %}
@@ -396,11 +396,37 @@
396
396
  }
397
397
 
398
398
  .post-card__meta {
399
- margin-bottom: 0.85rem;
400
- font-size: 0.8rem;
401
- font-weight: 600;
402
- letter-spacing: 0.02em;
403
- color: var(--color-muted);
399
+ margin: 0.7rem 0 0.55rem;
400
+ }
401
+
402
+ .post-meta {
403
+ display: inline-flex;
404
+ flex-wrap: wrap;
405
+ align-items: center;
406
+ gap: 0.35rem;
407
+ color: color-mix(in srgb, var(--color-muted) 92%, var(--color-text) 8%);
408
+ font-size: 0.82rem;
409
+ font-weight: 500;
410
+ letter-spacing: 0;
411
+ line-height: 1.35;
412
+ }
413
+
414
+ .post-meta__separator {
415
+ opacity: 0.75;
416
+ }
417
+
418
+ .post-meta__reading-time {
419
+ display: inline-flex;
420
+ align-items: center;
421
+ gap: 0.24rem;
422
+ }
423
+
424
+ .post-meta__icon {
425
+ flex: 0 0 auto;
426
+ width: 0.72rem;
427
+ height: 0.72rem;
428
+ fill: currentColor;
429
+ opacity: 0.82;
404
430
  }
405
431
 
406
432
  .post-tags {
@@ -426,7 +452,7 @@
426
452
  }
427
453
 
428
454
  .post-card__title {
429
- margin-bottom: 1.25rem;
455
+ margin-bottom: 0.85rem;
430
456
  font-family: "Manrope", "Helvetica Neue", Helvetica, Arial, sans-serif;
431
457
  font-size: 1.875rem;
432
458
  font-weight: 900;
@@ -449,6 +475,10 @@
449
475
  color: var(--color-muted);
450
476
  }
451
477
 
478
+ .post-card .post-tags {
479
+ margin-bottom: 0.95rem;
480
+ }
481
+
452
482
  .post-card__read-link {
453
483
  display: inline-block;
454
484
  margin-top: 1rem;
@@ -474,6 +504,15 @@
474
504
  font-weight: 900;
475
505
  }
476
506
 
507
+ .post-header__meta {
508
+ margin: 0 0 0.65rem;
509
+ font-size: 0.86rem;
510
+ }
511
+
512
+ .post-header__tags .post-tags {
513
+ margin-bottom: 1.1rem;
514
+ }
515
+
477
516
  .post-meta-row {
478
517
  display: flex;
479
518
  flex-wrap: wrap;
@@ -530,6 +569,7 @@
530
569
 
531
570
  .post-page .post-header,
532
571
  .post-page .content-shell,
572
+ .post-page .comments-shell__inner,
533
573
  .post-page .post-navigation-shell__inner,
534
574
  .post-page .related-posts-shell__inner {
535
575
  width: min(100% - 2rem, 880px);
@@ -551,19 +591,187 @@
551
591
  font-size: 0.9rem;
552
592
  }
553
593
 
554
- .post-page .post-title {
555
- margin-bottom: 1.2rem;
556
- font-size: clamp(2rem, 4.8vw, 3.25rem);
557
- line-height: 1.15;
558
- letter-spacing: -0.015em;
594
+ .post-series {
595
+ margin-top: 0.85rem;
596
+ margin-bottom: 0.35rem;
597
+ overflow: hidden;
598
+ border: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
599
+ border-radius: 0.8rem;
600
+ background: color-mix(in srgb, var(--color-brand-soft) 10%, var(--color-surface) 90%);
559
601
  }
560
602
 
561
- .post-header__meta {
562
- margin-bottom: 0.75rem;
563
- font-size: 0.8rem;
603
+ .post-series__header {
604
+ display: flex;
605
+ align-items: center;
606
+ justify-content: space-between;
607
+ gap: 0.8rem;
608
+ padding: 0.8rem 0.95rem;
609
+ border-bottom: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
610
+ background: color-mix(in srgb, var(--color-brand-soft) 15%, #fff 85%);
611
+ }
612
+
613
+ .post-series__heading-wrap {
614
+ min-width: 0;
615
+ }
616
+
617
+ .series-collapsible__toggle {
618
+ display: flex;
619
+ align-items: center;
620
+ justify-content: center;
621
+ padding: 0;
622
+ border: 0;
623
+ background: transparent;
624
+ cursor: pointer;
625
+ }
626
+
627
+ .post-series__heading {
628
+ display: block;
629
+ margin-bottom: 0.1rem;
630
+ font-size: clamp(1.02rem, 1.6vw, 1.2rem);
631
+ font-weight: 700;
632
+ line-height: 1.3;
633
+ color: var(--color-text);
634
+ }
635
+
636
+ .post-series__summary {
637
+ display: block;
638
+ color: var(--color-muted);
639
+ font-size: 0.82rem;
564
640
  font-weight: 600;
565
- letter-spacing: 0.02em;
641
+ }
642
+
643
+ .series-collapsible__icon-wrap {
644
+ display: inline-flex;
645
+ align-items: center;
646
+ justify-content: center;
647
+ width: 1.8rem;
648
+ height: 1.8rem;
649
+ border: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
650
+ border-radius: 999px;
651
+ color: var(--color-muted);
652
+ transition: color 0.2s ease, border-color 0.2s ease;
653
+ }
654
+
655
+ .series-collapsible__icon {
656
+ font-size: 0.9rem;
657
+ transition: transform 0.2s ease;
658
+ }
659
+
660
+ .series-collapsible__panel {
661
+ margin-top: 0;
662
+ padding-top: 0;
663
+ }
664
+
665
+ .series-collapsible.is-open .series-collapsible__icon {
666
+ transform: rotate(180deg);
667
+ }
668
+
669
+ .series-collapsible__toggle:hover .series-collapsible__icon-wrap {
670
+ color: var(--color-brand);
671
+ border-color: color-mix(in srgb, var(--color-brand) 48%, var(--color-border) 52%);
672
+ }
673
+
674
+ .series-collapsible__toggle:focus-visible {
675
+ outline: 2px solid color-mix(in srgb, var(--color-brand) 55%, white 45%);
676
+ outline-offset: 0.4rem;
677
+ border-radius: 0.5rem;
678
+ }
679
+
680
+ .post-series__list {
681
+ margin: 0;
682
+ padding: 0;
683
+ list-style: none;
684
+ }
685
+
686
+ .post-series__item {
687
+ border-bottom: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
688
+ }
689
+
690
+ .post-series__link {
691
+ display: flex;
692
+ align-items: center;
693
+ gap: 0.75rem;
694
+ padding: 0.72rem 0.95rem;
695
+ color: var(--color-text);
696
+ font-weight: 500;
697
+ text-decoration: none;
698
+ }
699
+
700
+ .post-series__index {
701
+ display: inline-flex;
702
+ align-items: center;
703
+ justify-content: center;
704
+ flex: 0 0 auto;
705
+ width: 2rem;
706
+ height: 2rem;
707
+ border-radius: 999px;
566
708
  color: var(--color-muted);
709
+ background: color-mix(in srgb, var(--color-border) 58%, #fff 42%);
710
+ font-size: 1.1rem;
711
+ line-height: 1;
712
+ }
713
+
714
+ .post-series__title {
715
+ font-size: clamp(0.98rem, 1.4vw, 1.08rem);
716
+ line-height: 1.45;
717
+ color: var(--color-text);
718
+ }
719
+
720
+ .post-series__item.is-current .post-series__link {
721
+ position: relative;
722
+ background: color-mix(in srgb, var(--color-brand-soft) 24%, #fff 76%);
723
+ }
724
+
725
+ .post-series__item.is-current .post-series__title {
726
+ color: color-mix(in srgb, var(--color-brand-strong) 35%, var(--color-text) 65%);
727
+ font-weight: 800;
728
+ }
729
+
730
+ .post-series__item.is-current .post-series__index {
731
+ color: var(--color-brand-strong);
732
+ background: color-mix(in srgb, var(--color-brand-soft) 40%, #fff 60%);
733
+ border: 1px solid color-mix(in srgb, var(--color-brand) 45%, var(--color-border) 55%);
734
+ }
735
+
736
+ .post-series__item.is-current .post-series__link::before {
737
+ position: absolute;
738
+ top: 0.5rem;
739
+ bottom: 0.5rem;
740
+ left: 0;
741
+ width: 3px;
742
+ border-radius: 0 999px 999px 0;
743
+ background: color-mix(in srgb, var(--color-brand) 82%, #fff 18%);
744
+ content: "";
745
+ }
746
+
747
+ .post-series__overflow-toggle {
748
+ width: 100%;
749
+ margin: 0;
750
+ border: 0;
751
+ border-top: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
752
+ padding: 0.72rem 0.95rem 0.78rem;
753
+ color: var(--color-brand-strong);
754
+ background: color-mix(in srgb, var(--color-brand-soft) 12%, #fff 88%);
755
+ font-size: 0.92rem;
756
+ font-weight: 600;
757
+ text-align: left;
758
+ cursor: pointer;
759
+ }
760
+
761
+ .post-series__overflow-item {
762
+ border-bottom: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
763
+ }
764
+
765
+ .post-series__overflow-toggle:hover {
766
+ color: var(--color-brand);
767
+ background: color-mix(in srgb, var(--color-brand-soft) 20%, #fff 80%);
768
+ }
769
+
770
+ .post-page .post-title {
771
+ margin-bottom: 0.95rem;
772
+ font-size: clamp(2rem, 4.8vw, 3.25rem);
773
+ line-height: 1.15;
774
+ letter-spacing: -0.015em;
567
775
  }
568
776
 
569
777
  .post-page .post-image-wrap {
@@ -591,18 +799,98 @@
591
799
  }
592
800
 
593
801
  .post-page .post-navigation-shell,
594
- .post-page .related-posts-shell {
802
+ .post-page .related-posts-shell,
803
+ .post-page .comments-shell {
595
804
  margin-top: 1rem;
596
805
  }
597
806
 
807
+ .post-page .comments-shell__inner,
598
808
  .post-page .post-navigation-shell__inner,
599
809
  .post-page .related-posts-shell__inner {
810
+ margin-inline: auto;
600
811
  padding: 1.1rem;
601
812
  border: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
602
813
  border-radius: 1rem;
603
814
  background: #fff;
604
815
  }
605
816
 
817
+ .post-page .comments-shell__inner {
818
+ padding: 2rem 2rem 1.8rem;
819
+ }
820
+
821
+ .comments-shell__heading {
822
+ display: block;
823
+ margin-bottom: 0.3rem;
824
+ font-size: 1.3rem;
825
+ font-weight: 800;
826
+ }
827
+
828
+ .comments-collapsible {
829
+ padding-top: 1.15rem;
830
+ padding-bottom: 1.15rem;
831
+ }
832
+
833
+ .comments-collapsible__toggle {
834
+ display: flex;
835
+ align-items: center;
836
+ justify-content: space-between;
837
+ width: 100%;
838
+ padding: 0;
839
+ border: 0;
840
+ background: transparent;
841
+ text-align: left;
842
+ cursor: pointer;
843
+ }
844
+
845
+ .comments-collapsible__copy {
846
+ display: block;
847
+ }
848
+
849
+ .comments-collapsible__hint {
850
+ display: block;
851
+ color: var(--color-muted);
852
+ font-size: 0.9rem;
853
+ font-weight: 600;
854
+ }
855
+
856
+ .comments-collapsible__icon-wrap {
857
+ display: inline-flex;
858
+ align-items: center;
859
+ justify-content: center;
860
+ width: 2rem;
861
+ height: 2rem;
862
+ border: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
863
+ border-radius: 999px;
864
+ color: var(--color-muted);
865
+ transition: color 0.2s ease, border-color 0.2s ease;
866
+ }
867
+
868
+ .comments-collapsible__icon {
869
+ font-size: 1rem;
870
+ transition: transform 0.2s ease;
871
+ }
872
+
873
+ .comments-collapsible__panel {
874
+ margin-top: 0.95rem;
875
+ padding-top: 1rem;
876
+ border-top: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
877
+ }
878
+
879
+ .comments-collapsible.is-open .comments-collapsible__icon {
880
+ transform: rotate(180deg);
881
+ }
882
+
883
+ .comments-collapsible__toggle:hover .comments-collapsible__icon-wrap {
884
+ color: var(--color-brand);
885
+ border-color: color-mix(in srgb, var(--color-brand) 48%, var(--color-border) 52%);
886
+ }
887
+
888
+ .comments-collapsible__toggle:focus-visible {
889
+ outline: 2px solid color-mix(in srgb, var(--color-brand) 55%, white 45%);
890
+ outline-offset: 0.4rem;
891
+ border-radius: 0.5rem;
892
+ }
893
+
606
894
  .post-page .post-navigation {
607
895
  grid-template-columns: repeat(2, minmax(0, 1fr));
608
896
  gap: 0.9rem;
@@ -1476,22 +1764,45 @@
1476
1764
  padding: 1.2rem 1rem 0.95rem;
1477
1765
  }
1478
1766
 
1767
+ .post-series__header,
1768
+ .post-series__link,
1769
+ .post-series__overflow-toggle {
1770
+ padding-left: 0.95rem;
1771
+ padding-right: 0.95rem;
1772
+ }
1773
+
1479
1774
  .post-page .content-shell {
1480
1775
  padding: 1.25rem 1rem 1.1rem;
1481
1776
  }
1482
1777
 
1483
1778
  .post-page .post-header,
1484
1779
  .post-page .content-shell,
1780
+ .post-page .comments-shell__inner,
1485
1781
  .post-page .post-navigation-shell__inner,
1486
1782
  .post-page .related-posts-shell__inner {
1487
1783
  width: min(100% - 2rem, 880px);
1488
1784
  }
1489
1785
 
1786
+ .post-page .comments-shell__inner,
1490
1787
  .post-page .post-navigation-shell__inner,
1491
1788
  .post-page .related-posts-shell__inner {
1492
1789
  padding: 0.9rem;
1493
1790
  }
1494
1791
 
1792
+ .post-page .comments-shell__inner {
1793
+ padding: 1.25rem 1rem 1.1rem;
1794
+ }
1795
+
1796
+ .comments-shell__heading {
1797
+ font-size: 1.16rem;
1798
+ }
1799
+
1800
+ .comments-collapsible__icon-wrap,
1801
+ .series-collapsible__icon-wrap {
1802
+ width: 1.85rem;
1803
+ height: 1.85rem;
1804
+ }
1805
+
1495
1806
  .post-page .post-navigation {
1496
1807
  grid-template-columns: 1fr;
1497
1808
  }
@@ -1 +1 @@
1
- (function(){"use strict";let P;const _t=()=>{if(typeof window>"u")return new Map;if(!P){const t=window;t.Ionicons=t.Ionicons||{},P=t.Ionicons.map=t.Ionicons.map||new Map}return P},Lt=t=>{Object.keys(t).forEach(e=>{K(e,t[e]);const s=e.replace(/([a-z0-9]|(?=[A-Z]))([A-Z0-9])/g,"$1-$2").toLowerCase();e!==s&&K(s,t[e])})},K=(t,e)=>{const s=_t(),n=s.get(t);n===void 0?s.set(t,e):n!==e&&console.warn(`[Ionicons Warning]: Multiple icons were mapped to name "${t}". Ensure that multiple icons are not mapped to the same icon name.`)},Mt="ionicons",x={hydratedSelectorName:"hydrated",lazyLoad:!1,updatable:!0};var It=Object.defineProperty,Ot=(t,e)=>{for(var s in e)It(t,s,{get:e[s],enumerable:!0})},y=t=>{if(t.__stencil__getHostRef)return t.__stencil__getHostRef()},Tt=(t,e)=>{const s={$flags$:0,$hostElement$:t,$cmpMeta$:e,$instanceValues$:new Map};s.$onReadyPromise$=new Promise(o=>s.$onReadyResolve$=o),t["s-p"]=[],t["s-rc"]=[];const n=s;return t.__stencil__getHostRef=()=>n,n},J=(t,e)=>e in t,A=(t,e)=>(0,console.error)(t,e),_=new Map,Ct="slot-fb{display:contents}slot-fb[hidden]{display:none}",Q="http://www.w3.org/1999/xlink",h=typeof window<"u"?window:{},Ht=h.HTMLElement||class{},v={$flags$:0,$resourcesUrl$:"",jmp:t=>t(),raf:t=>requestAnimationFrame(t),ael:(t,e,s,n)=>t.addEventListener(e,s,n),rel:(t,e,s,n)=>t.removeEventListener(e,s,n),ce:(t,e)=>new CustomEvent(t,e)},Pt=t=>Promise.resolve(t),V=(()=>{try{return new CSSStyleSheet,typeof new CSSStyleSheet().replaceSync=="function"}catch{}return!1})(),U=!1,N=[],tt=[],Ut=(t,e)=>s=>{t.push(s),U||(U=!0,v.raf(nt))},et=t=>{for(let e=0;e<t.length;e++)try{t[e](performance.now())}catch(s){A(s)}t.length=0},nt=()=>{et(N),et(tt),(U=N.length>0)&&v.raf(nt)},j=t=>Pt().then(t),jt=Ut(tt),qt=t=>{const e=new URL(t,v.$resourcesUrl$);return e.origin!==h.location.origin?e.href:e.pathname},q=t=>(t=typeof t,t==="object"||t==="function");function zt(t){var e,s,n;return(n=(s=(e=t.head)==null?void 0:e.querySelector('meta[name="csp-nonce"]'))==null?void 0:s.getAttribute("content"))!=null?n:void 0}var Rt=t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Bt={};Ot(Bt,{err:()=>st,map:()=>Dt,ok:()=>z,unwrap:()=>Wt,unwrapErr:()=>Xt});var z=t=>({isOk:!0,isErr:!1,value:t}),st=t=>({isOk:!1,isErr:!0,value:t});function Dt(t,e){if(t.isOk){const s=e(t.value);return s instanceof Promise?s.then(n=>z(n)):z(s)}if(t.isErr){const s=t.value;return st(s)}throw"should never get here"}var Wt=t=>{if(t.isOk)return t.value;throw t.value},Xt=t=>{if(t.isErr)return t.value;throw t.value};function Be(t){}var L;function Zt(t){var e;const s=this.attachShadow({mode:"open"});L===void 0&&(L=(e=void 0)!=null?e:null),L&&s.adoptedStyleSheets.push(L)}var w=(t,e="")=>()=>{},m=new WeakMap,Ft=(t,e,s)=>{let n=_.get(t);V&&s?(n=n||new CSSStyleSheet,typeof n=="string"?n=e:n.replaceSync(e)):n=e,_.set(t,n)},Yt=(t,e,s)=>{var n;const o=ot(e),i=_.get(o);if(!h.document)return o;if(t=t.nodeType===11?t:h.document,i)if(typeof i=="string"){t=t.head||t;let l=m.get(t),r;if(l||m.set(t,l=new Set),!l.has(o)){{r=h.document.createElement("style"),r.innerHTML=i;const a=(n=v.$nonce$)!=null?n:zt(h.document);if(a!=null&&r.setAttribute("nonce",a),!(e.$flags$&1))if(t.nodeName==="HEAD"){const c=t.querySelectorAll("link[rel=preconnect]"),d=c.length>0?c[c.length-1].nextSibling:t.querySelector("style");t.insertBefore(r,d?.parentNode===t?d:null)}else if("host"in t)if(V){const c=new CSSStyleSheet;c.replaceSync(i),t.adoptedStyleSheets.unshift(c)}else{const c=t.querySelector("style");c?c.innerHTML=i+c.innerHTML:t.prepend(r)}else t.append(r);e.$flags$&1&&t.insertBefore(r,null)}e.$flags$&4&&(r.innerHTML+=Ct),l&&l.add(o)}}else t.adoptedStyleSheets.includes(i)||t.adoptedStyleSheets.push(i);return o},Gt=t=>{const e=t.$cmpMeta$,s=t.$hostElement$,n=e.$flags$,o=w("attachStyles",e.$tagName$),i=Yt(s.shadowRoot?s.shadowRoot:s.getRootNode(),e);n&10&&(s["s-sc"]=i,s.classList.add(i+"-h")),o()},ot=(t,e)=>"sc-"+t.$tagName$,M=(t,e,...s)=>{let n=null,o=null,i=!1,l=!1;const r=[],a=d=>{for(let f=0;f<d.length;f++)n=d[f],Array.isArray(n)?a(n):n!=null&&typeof n!="boolean"&&((i=typeof t!="function"&&!q(n))&&(n=String(n)),i&&l?r[r.length-1].$text$+=n:r.push(i?R(null,n):n),l=i)};if(a(s),e){e.key&&(o=e.key);{const d=e.className||e.class;d&&(e.class=typeof d!="object"?d:Object.keys(d).filter(f=>d[f]).join(" "))}}const c=R(t,null);return c.$attrs$=e,r.length>0&&(c.$children$=r),c.$key$=o,c},R=(t,e)=>{const s={$flags$:0,$tag$:t,$text$:e,$elm$:null,$children$:null};return s.$attrs$=null,s.$key$=null,s},it={},Kt=t=>t&&t.$tag$===it,B=t=>{const e=Rt(t);return new RegExp(`(^|[^@]|@(?!supports\\s+selector\\s*\\([^{]*?${e}))(${e}\\b)`,"g")};B("::slotted"),B(":host"),B(":host-context");var rt=(t,e,s)=>t!=null&&!q(t)?e&4?t==="false"?!1:t===""||!!t:e&1?String(t):t:t,Jt=(t,e,s)=>{const n=v.ce(e,s);return t.dispatchEvent(n),n},ct=(t,e,s,n,o,i,l)=>{if(s===n)return;let r=J(t,e),a=e.toLowerCase();if(e==="class"){const c=t.classList,d=lt(s);let f=lt(n);c.remove(...d.filter(u=>u&&!f.includes(u))),c.add(...f.filter(u=>u&&!d.includes(u)))}else if(e==="style"){for(const c in s)(!n||n[c]==null)&&(c.includes("-")?t.style.removeProperty(c):t.style[c]="");for(const c in n)(!s||n[c]!==s[c])&&(c.includes("-")?t.style.setProperty(c,n[c]):t.style[c]=n[c])}else if(e!=="key")if(e==="ref")n&&n(t);else if(!t.__lookupSetter__(e)&&e[0]==="o"&&e[1]==="n"){if(e[2]==="-"?e=e.slice(3):J(h,a)?e=a.slice(2):e=a[2]+e.slice(3),s||n){const c=e.endsWith(at);e=e.replace(Vt,""),s&&v.rel(t,e,s,c),n&&v.ael(t,e,n,c)}}else{const c=q(n);if(r||c&&n!==null)try{if(t.tagName.includes("-"))t[e]!==n&&(t[e]=n);else{const f=n??"";e==="list"?r=!1:(s==null||t[e]!=f)&&(typeof t.__lookupSetter__(e)=="function"?t[e]=f:t.setAttribute(e,f))}}catch{}let d=!1;a!==(a=a.replace(/^xlink\:?/,""))&&(e=a,d=!0),n==null||n===!1?(n!==!1||t.getAttribute(e)==="")&&(d?t.removeAttributeNS(Q,e):t.removeAttribute(e)):(!r||i&4||o)&&!c&&t.nodeType===1&&(n=n===!0?"":n,d?t.setAttributeNS(Q,e,n):t.setAttribute(e,n))}},Qt=/\s/,lt=t=>(typeof t=="object"&&t&&"baseVal"in t&&(t=t.baseVal),!t||typeof t!="string"?[]:t.split(Qt)),at="Capture",Vt=new RegExp(at+"$"),dt=(t,e,s,n)=>{const o=e.$elm$.nodeType===11&&e.$elm$.host?e.$elm$.host:e.$elm$,i=t&&t.$attrs$||{},l=e.$attrs$||{};for(const r of ft(Object.keys(i)))r in l||ct(o,r,i[r],void 0,s,e.$flags$);for(const r of ft(Object.keys(l)))ct(o,r,i[r],l[r],s,e.$flags$)};function ft(t){return t.includes("ref")?[...t.filter(e=>e!=="ref"),"ref"]:t}var D,ut=!1,I=(t,e,s)=>{const n=e.$children$[s];let o=0,i,l;if(n.$text$!==null)i=n.$elm$=h.document.createTextNode(n.$text$);else{if(!h.document)throw new Error("You are trying to render a Stencil component in an environment that doesn't support the DOM. Make sure to populate the [`window`](https://developer.mozilla.org/en-US/docs/Web/API/Window/window) object before rendering a component.");if(i=n.$elm$=h.document.createElement(n.$tag$),dt(null,n,ut),n.$children$)for(o=0;o<n.$children$.length;++o)l=I(t,n,o),l&&i.appendChild(l)}return i["s-hn"]=D,i},$t=(t,e,s,n,o,i)=>{let l=t,r;for(l.shadowRoot&&l.tagName===D&&(l=l.shadowRoot);o<=i;++o)n[o]&&(r=I(null,s,o),r&&(n[o].$elm$=r,T(l,r,e)))},ht=(t,e,s)=>{for(let n=e;n<=s;++n){const o=t[n];if(o){const i=o.$elm$;pt(o),i&&i.remove()}}},Nt=(t,e,s,n,o=!1)=>{let i=0,l=0,r=0,a=0,c=e.length-1,d=e[0],f=e[c],u=n.length-1,$=n[0],p=n[u],g,E;for(;i<=c&&l<=u;)if(d==null)d=e[++i];else if(f==null)f=e[--c];else if($==null)$=n[++l];else if(p==null)p=n[--u];else if(O(d,$,o))S(d,$,o),d=e[++i],$=n[++l];else if(O(f,p,o))S(f,p,o),f=e[--c],p=n[--u];else if(O(d,p,o))S(d,p,o),T(t,d.$elm$,f.$elm$.nextSibling),d=e[++i],p=n[--u];else if(O(f,$,o))S(f,$,o),T(t,f.$elm$,d.$elm$),f=e[--c],$=n[++l];else{for(r=-1,a=i;a<=c;++a)if(e[a]&&e[a].$key$!==null&&e[a].$key$===$.$key$){r=a;break}r>=0?(E=e[r],E.$tag$!==$.$tag$?g=I(e&&e[l],s,r):(S(E,$,o),e[r]=void 0,g=E.$elm$),$=n[++l]):(g=I(e&&e[l],s,l),$=n[++l]),g&&T(d.$elm$.parentNode,g,d.$elm$)}i>c?$t(t,n[u+1]==null?null:n[u+1].$elm$,s,n,l,u):l>u&&ht(e,i,c)},O=(t,e,s=!1)=>t.$tag$===e.$tag$?s?(s&&!t.$key$&&e.$key$&&(t.$key$=e.$key$),!0):t.$key$===e.$key$:!1,S=(t,e,s=!1)=>{const n=e.$elm$=t.$elm$,o=t.$children$,i=e.$children$,l=e.$text$;l===null?(dt(t,e,ut),o!==null&&i!==null?Nt(n,o,e,i,s):i!==null?(t.$text$!==null&&(n.textContent=""),$t(n,null,e,i,0,i.length-1)):!s&&x.updatable&&o!==null&&ht(o,0,o.length-1)):t.$text$!==l&&(n.data=l)},pt=t=>{t.$attrs$&&t.$attrs$.ref&&t.$attrs$.ref(null),t.$children$&&t.$children$.map(pt)},T=(t,e,s)=>t?.insertBefore(e,s),te=(t,e,s=!1)=>{const n=t.$hostElement$,o=t.$cmpMeta$,i=t.$vnode$||R(null,null),r=Kt(e)?e:M(null,null,e);if(D=n.tagName,o.$attrsToReflect$&&(r.$attrs$=r.$attrs$||{},o.$attrsToReflect$.map(([a,c])=>r.$attrs$[c]=n[a])),s&&r.$attrs$)for(const a of Object.keys(r.$attrs$))n.hasAttribute(a)&&!["key","ref","style","class"].includes(a)&&(r.$attrs$[a]=n[a]);r.$tag$=null,r.$flags$|=4,t.$vnode$=r,r.$elm$=i.$elm$=n.shadowRoot||n,S(i,r,s)},gt=(t,e)=>{if(e&&!t.$onRenderResolve$&&e["s-p"]){const s=e["s-p"].push(new Promise(n=>t.$onRenderResolve$=()=>{e["s-p"].splice(s-1,1),n()}))}},W=(t,e)=>{if(t.$flags$|=16,t.$flags$&4){t.$flags$|=512;return}return gt(t,t.$ancestorComponent$),jt(()=>ee(t,e))},ee=(t,e)=>{const s=t.$hostElement$,n=w("scheduleUpdate",t.$cmpMeta$.$tagName$),o=s;if(!o)throw new Error(`Can't render component <${s.tagName.toLowerCase()} /> with invalid Stencil runtime! Make sure this imported component is compiled with a \`externalRuntime: true\` flag. For more information, please refer to https://stenciljs.com/docs/custom-elements#externalruntime`);let i;return e?i=b(o,"componentWillLoad",void 0,s):i=b(o,"componentWillUpdate",void 0,s),i=vt(i,()=>b(o,"componentWillRender",void 0,s)),n(),vt(i,()=>se(t,o,e))},vt=(t,e)=>ne(t)?t.then(e).catch(s=>{console.error(s),e()}):e(),ne=t=>t instanceof Promise||t&&t.then&&typeof t.then=="function",se=async(t,e,s)=>{var n;const o=t.$hostElement$,i=w("update",t.$cmpMeta$.$tagName$),l=o["s-rc"];s&&Gt(t);const r=w("render",t.$cmpMeta$.$tagName$);oe(t,e,o,s),l&&(l.map(a=>a()),o["s-rc"]=void 0),r(),i();{const a=(n=o["s-p"])!=null?n:[],c=()=>ie(t);a.length===0?c():(Promise.all(a).then(c),t.$flags$|=4,a.length=0)}},oe=(t,e,s,n)=>{try{e=e.render(),t.$flags$&=-17,t.$flags$|=2,te(t,e,n)}catch(o){A(o,t.$hostElement$)}return null},ie=t=>{const e=t.$cmpMeta$.$tagName$,s=t.$hostElement$,n=w("postUpdate",e),o=s,i=t.$ancestorComponent$;b(o,"componentDidRender",void 0,s),t.$flags$&64?(b(o,"componentDidUpdate",void 0,s),n()):(t.$flags$|=64,ce(s),b(o,"componentDidLoad",void 0,s),n(),t.$onReadyResolve$(s),i||re()),t.$onRenderResolve$&&(t.$onRenderResolve$(),t.$onRenderResolve$=void 0),t.$flags$&512&&j(()=>W(t,!1)),t.$flags$&=-517},re=t=>{j(()=>Jt(h,"appload",{detail:{namespace:Mt}}))},b=(t,e,s,n)=>{if(t&&t[e])try{return t[e](s)}catch(o){A(o,n)}},ce=t=>{var e;return t.classList.add((e=x.hydratedSelectorName)!=null?e:"hydrated")},le=(t,e)=>y(t).$instanceValues$.get(e),yt=(t,e,s,n)=>{const o=y(t),i=t,l=o.$instanceValues$.get(e),r=o.$flags$,a=i;s=rt(s,n.$members$[e][0]);const c=Number.isNaN(l)&&Number.isNaN(s);if(s!==l&&!c){o.$instanceValues$.set(e,s);{if(n.$watchers$&&r&128){const f=n.$watchers$[e];f&&f.map(u=>{try{a[u](s,l,e)}catch($){A($,i)}})}if((r&18)===2){if(a.componentShouldUpdate&&a.componentShouldUpdate(s,l,e)===!1)return;W(o,!1)}}}},ae=(t,e,s)=>{var n,o;const i=t.prototype;if(e.$members$||e.$watchers$||t.watchers){t.watchers&&!e.$watchers$&&(e.$watchers$=t.watchers);const l=Object.entries((n=e.$members$)!=null?n:{});l.map(([r,[a]])=>{if(a&31||a&32){const{get:c,set:d}=Object.getOwnPropertyDescriptor(i,r)||{};c&&(e.$members$[r][0]|=2048),d&&(e.$members$[r][0]|=4096),Object.defineProperty(i,r,{get(){return c?c.apply(this):le(this,r)},configurable:!0,enumerable:!0}),Object.defineProperty(i,r,{set(f){const u=y(this);if(d){const $=a&32?this[r]:u.$hostElement$[r];typeof $>"u"&&u.$instanceValues$.get(r)?f=u.$instanceValues$.get(r):!u.$instanceValues$.get(r)&&$&&u.$instanceValues$.set(r,$),d.apply(this,[rt(f,a)]),f=a&32?this[r]:u.$hostElement$[r],yt(this,r,f,e);return}{yt(this,r,f,e);return}}})}});{const r=new Map;i.attributeChangedCallback=function(a,c,d){v.jmp(()=>{var f;const u=r.get(a);if(!(this.hasOwnProperty(u)&&x.lazyLoad)){if(i.hasOwnProperty(u)&&typeof this[u]=="number"&&this[u]==d)return;if(u==null){const p=y(this),g=p?.$flags$;if(g&&!(g&8)&&g&128&&d!==c){const G=this,xt=(f=e.$watchers$)==null?void 0:f[a];xt?.forEach(At=>{G[At]!=null&&G[At].call(G,d,c,a)})}return}}const $=Object.getOwnPropertyDescriptor(i,u);d=d===null&&typeof this[u]=="boolean"?!1:d,d!==this[u]&&(!$.get||$.set)&&(this[u]=d)})},t.observedAttributes=Array.from(new Set([...Object.keys((o=e.$watchers$)!=null?o:{}),...l.filter(([a,c])=>c[0]&15).map(([a,c])=>{var d;const f=c[1]||a;return r.set(f,a),c[0]&512&&((d=e.$attrsToReflect$)==null||d.push([a,f])),f})]))}}return t},wt=async(t,e,s,n)=>{let o;if((e.$flags$&32)===0){e.$flags$|=32;{o=t.constructor;const r=t.localName;customElements.whenDefined(r).then(()=>e.$flags$|=128)}if(o&&o.style){let r;typeof o.style=="string"&&(r=o.style);const a=ot(s);if(!_.has(a)){const c=w("registerStyles",s.$tagName$);Ft(a,r,!!(s.$flags$&1)),c()}}}const i=e.$ancestorComponent$,l=()=>W(e,!0);i&&i["s-rc"]?i["s-rc"].push(l):l()},de=(t,e)=>{},fe=t=>{{const e=y(t),s=e.$cmpMeta$,n=w("connectedCallback",s.$tagName$);if(e.$flags$&1)e?.$lazyInstance$||e?.$onReadyPromise$&&e.$onReadyPromise$.then(()=>de());else{e.$flags$|=1;{let o=t;for(;o=o.parentNode||o.host;)if(o["s-p"]){gt(e,e.$ancestorComponent$=o);break}}s.$members$&&Object.entries(s.$members$).map(([o,[i]])=>{if(i&31&&t.hasOwnProperty(o)){const l=t[o];delete t[o],t[o]=l}}),x.initializeNextTick?j(()=>wt(t,e,s)):wt(t,e,s)}n()}},ue=async t=>{y(t),m.has(t)&&m.delete(t),t.shadowRoot&&m.has(t.shadowRoot)&&m.delete(t.shadowRoot)},$e=(t,e)=>{const s={$flags$:e[0],$tagName$:e[1]};s.$members$=e[2],s.$watchers$=t.$watchers$,s.$attrsToReflect$=[];const n=t.prototype.connectedCallback,o=t.prototype.disconnectedCallback;return Object.assign(t.prototype,{__hasHostListenerAttached:!1,__registerHost(){Tt(this,s)},connectedCallback(){this.__hasHostListenerAttached||(y(this),this.__hasHostListenerAttached=!0),fe(this),n&&n.call(this)},disconnectedCallback(){ue(this),o&&o.call(this)},__attachShadow(){if(!this.shadowRoot)Zt.call(this,s);else if(this.shadowRoot.mode!=="open")throw new Error(`Unable to re-use existing shadow root for ${s.$tagName$}! Mode is set to ${this.shadowRoot.mode} but Stencil only supports open shadow roots.`)}}),t.is=s.$tagName$,ae(t,s)};let X;const he=()=>{if(typeof window>"u")return new Map;if(!X){const t=window;t.Ionicons=t.Ionicons||{},X=t.Ionicons.map=t.Ionicons.map||new Map}return X},pe=t=>{let e=Z(t.src);return e||(e=mt(t.name,t.icon,t.mode,t.ios,t.md),e?ge(e,t):t.icon&&(e=Z(t.icon),e||(e=Z(t.icon[t.mode]),e))?e:null)},ge=(t,e)=>{const s=he().get(t);if(s)return s;try{return qt(`svg/${t}.svg`)}catch(n){console.log("e",n),console.warn(`[Ionicons Warning]: Could not load icon with name "${t}". Ensure that the icon is registered using addIcons or that the icon SVG data is passed directly to the icon component.`,e)}},mt=(t,e,s,n,o)=>(s=(s&&H(s))==="ios"?"ios":"md",n&&s==="ios"?t=H(n):o&&s==="md"?t=H(o):(!t&&e&&!St(e)&&(t=e),C(t)&&(t=H(t))),!C(t)||t.trim()===""||t.replace(/[a-z]|-|\d/gi,"")!==""?null:t),Z=t=>C(t)&&(t=t.trim(),St(t))?t:null,St=t=>t.length>0&&/(\/|\.)/.test(t),C=t=>typeof t=="string",H=t=>t.toLowerCase(),ve=(t,e=[])=>{const s={};return e.forEach(n=>{t.hasAttribute(n)&&(t.getAttribute(n)!==null&&(s[n]=t.getAttribute(n)),t.removeAttribute(n))}),s},ye=t=>t&&t.dir!==""?t.dir.toLowerCase()==="rtl":document?.dir.toLowerCase()==="rtl",we=t=>{const e=document.createElement("div");e.innerHTML=t;for(let n=e.childNodes.length-1;n>=0;n--)e.childNodes[n].nodeName.toLowerCase()!=="svg"&&e.removeChild(e.childNodes[n]);const s=e.firstElementChild;if(s&&s.nodeName.toLowerCase()==="svg"){const n=s.getAttribute("class")||"";if(s.setAttribute("class",(n+" s-ion-icon").trim()),bt(s))return e.innerHTML}return""},bt=t=>{if(t.nodeType===1){if(t.nodeName.toLowerCase()==="script")return!1;for(let e=0;e<t.attributes.length;e++){const s=t.attributes[e].name;if(C(s)&&s.toLowerCase().indexOf("on")===0)return!1}for(let e=0;e<t.childNodes.length;e++)if(!bt(t.childNodes[e]))return!1}return!0},me=t=>t.startsWith("data:image/svg+xml"),Se=t=>t.indexOf(";utf8,")!==-1,k=new Map,kt=new Map;let F;function Y(t){return k.set(t,""),""}const be=(t,e)=>{const s=kt.get(t);return s||(typeof fetch<"u"&&typeof document<"u"?me(t)&&Se(t)?Promise.resolve(ke(t)):Ee(t,e):Promise.resolve(Y(t)))};function ke(t){F||(F=new DOMParser);const s=F.parseFromString(t,"text/html").querySelector("svg");if(s)return k.set(t,s.outerHTML),s.outerHTML;throw new Error(`Could not parse svg from ${t}`)}function Ee(t,e){const s=fetch(t).then(n=>n.text().then(o=>{o&&e!==!1&&(o=we(o));const i=o||"";return k.set(t,i),i}).catch(()=>Y(t))).catch(()=>Y(t));return kt.set(t,s),s}const xe=":host{display:inline-block;width:1em;height:1em;contain:strict;fill:currentColor;box-sizing:content-box !important}:host .ionicon{stroke:currentColor}.ionicon-fill-none{fill:none}.ionicon-stroke-width{stroke-width:var(--ionicon-stroke-width, 32px)}.icon-inner,.ionicon,svg{display:block;height:100%;width:100%}@supports (background: -webkit-named-image(i)){:host(.icon-rtl) .icon-inner{transform:scaleX(-1)}}@supports not selector(:dir(rtl)) and selector(:host-context([dir='rtl'])){:host(.icon-rtl) .icon-inner{transform:scaleX(-1)}}:host(.flip-rtl):host-context([dir='rtl']) .icon-inner{transform:scaleX(-1)}@supports selector(:dir(rtl)){:host(.flip-rtl:dir(rtl)) .icon-inner{transform:scaleX(-1)}:host(.flip-rtl:dir(ltr)) .icon-inner{transform:scaleX(1)}}:host(.icon-small){font-size:1.125rem !important}:host(.icon-large){font-size:2rem !important}:host(.ion-color){color:var(--ion-color-base) !important}:host(.ion-color-primary){--ion-color-base:var(--ion-color-primary, #3880ff)}:host(.ion-color-secondary){--ion-color-base:var(--ion-color-secondary, #0cd1e8)}:host(.ion-color-tertiary){--ion-color-base:var(--ion-color-tertiary, #f4a942)}:host(.ion-color-success){--ion-color-base:var(--ion-color-success, #10dc60)}:host(.ion-color-warning){--ion-color-base:var(--ion-color-warning, #ffce00)}:host(.ion-color-danger){--ion-color-base:var(--ion-color-danger, #f14141)}:host(.ion-color-light){--ion-color-base:var(--ion-color-light, #f4f5f8)}:host(.ion-color-medium){--ion-color-base:var(--ion-color-medium, #989aa2)}:host(.ion-color-dark){--ion-color-base:var(--ion-color-dark, #222428)}",Ae=$e(class extends Ht{constructor(){super(),this.__registerHost(),this.__attachShadow(),this.iconName=null,this.inheritedAttributes={},this.didLoadIcon=!1,this.isVisible=!1,this.mode=_e(),this.lazy=!1,this.sanitize=!0}componentWillLoad(){this.inheritedAttributes=ve(this.el,["aria-label"])}connectedCallback(){this.waitUntilVisible(this.el,"50px",()=>{this.isVisible=!0,this.loadIcon()})}componentDidLoad(){this.didLoadIcon||this.loadIcon()}disconnectedCallback(){this.io&&(this.io.disconnect(),this.io=void 0)}waitUntilVisible(e,s,n){if(!!!(this.lazy&&typeof window<"u"&&window.IntersectionObserver))return n();const i=this.io=new window.IntersectionObserver(l=>{l[0].isIntersecting&&(i.disconnect(),this.io=void 0,n())},{rootMargin:s});i.observe(e)}loadIcon(){if(this.isVisible){const e=pe(this);e&&(k.has(e)?this.svgContent=k.get(e):be(e,this.sanitize).then(()=>this.svgContent=k.get(e)),this.didLoadIcon=!0)}this.iconName=mt(this.name,this.icon,this.mode,this.ios,this.md)}render(){const{flipRtl:e,iconName:s,inheritedAttributes:n,el:o}=this,i=this.mode||"md",l=s?(s.includes("arrow")||s.includes("chevron"))&&e!==!1:!1,r=e||l;return M(it,Object.assign({key:"0578c899781ca145dd8205acd9670af39b57cf2e",role:"img",class:Object.assign(Object.assign({[i]:!0},Le(this.color)),{[`icon-${this.size}`]:!!this.size,"flip-rtl":r,"icon-rtl":r&&ye(o)})},n),this.svgContent?M("div",{class:"icon-inner",innerHTML:this.svgContent}):M("div",{class:"icon-inner"}))}static get assetsDirs(){return["svg"]}get el(){return this}static get watchers(){return{name:["loadIcon"],src:["loadIcon"],icon:["loadIcon"],ios:["loadIcon"],md:["loadIcon"]}}static get style(){return xe}},[1,"ion-icon",{mode:[1025],color:[1],ios:[1],md:[1],flipRtl:[4,"flip-rtl"],name:[513],src:[1],icon:[8],size:[1],lazy:[4],sanitize:[4],svgContent:[32],isVisible:[32]},void 0,{name:["loadIcon"],src:["loadIcon"],icon:["loadIcon"],ios:["loadIcon"],md:["loadIcon"]}]),_e=()=>typeof document<"u"&&document.documentElement.getAttribute("mode")||"md",Le=t=>t?{"ion-color":!0,[`ion-color-${t}`]:!0}:null;function Me(){if(typeof customElements>"u")return;["ion-icon"].forEach(e=>{e==="ion-icon"&&(customElements.get(e)||customElements.define(e,Ae))})}const Ie=Me,Oe="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='m289.94 256 95-95A24 24 0 0 0 351 127l-95 95-95-95a24 24 0 0 0-34 34l95 95-95 95a24 24 0 1 0 34 34l95-95 95 95a24 24 0 0 0 34-34Z'/></svg>",Te="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M256 32C132.3 32 32 134.9 32 261.7c0 101.5 64.2 187.5 153.2 217.9a17.6 17.6 0 0 0 3.8.4c8.3 0 11.5-6.1 11.5-11.4 0-5.5-.2-19.9-.3-39.1a102.4 102.4 0 0 1-22.6 2.7c-43.1 0-52.9-33.5-52.9-33.5-10.2-26.5-24.9-33.6-24.9-33.6-19.5-13.7-.1-14.1 1.4-14.1h.1c22.5 2 34.3 23.8 34.3 23.8 11.2 19.6 26.2 25.1 39.6 25.1a63 63 0 0 0 25.6-6c2-14.8 7.8-24.9 14.2-30.7-49.7-5.8-102-25.5-102-113.5 0-25.1 8.7-45.6 23-61.6-2.3-5.8-10-29.2 2.2-60.8a18.6 18.6 0 0 1 5-.5c8.1 0 26.4 3.1 56.6 24.1a208.2 208.2 0 0 1 112.2 0c30.2-21 48.5-24.1 56.6-24.1a18.6 18.6 0 0 1 5 .5c12.2 31.6 4.5 55 2.2 60.8 14.3 16.1 23 36.6 23 61.6 0 88.2-52.4 107.6-102.3 113.3 8 7.1 15.2 21.1 15.2 42.5 0 30.7-.3 55.5-.3 63 0 5.4 3.1 11.5 11.4 11.5a19.4 19.4 0 0 0 4-.4C415.9 449.2 480 363.1 480 261.7 480 134.9 379.7 32 256 32'/></svg>",Ce="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M444.17 32H70.28C49.85 32 32 46.7 32 66.89v374.72C32 461.91 49.85 480 70.28 480h373.78c20.54 0 35.94-18.21 35.94-38.39V66.89C480.12 46.7 464.6 32 444.17 32m-273.3 373.43h-64.18V205.88h64.18ZM141 175.54h-.46c-20.54 0-33.84-15.29-33.84-34.43 0-19.49 13.65-34.42 34.65-34.42s33.85 14.82 34.31 34.42c-.01 19.14-13.31 34.43-34.66 34.43m264.43 229.89h-64.18V296.32c0-26.14-9.34-44-32.56-44-17.74 0-28.24 12-32.91 23.69-1.75 4.2-2.22 9.92-2.22 15.76v113.66h-64.18V205.88h64.18v27.77c9.34-13.3 23.93-32.44 57.88-32.44 42.13 0 74 27.77 74 87.64Z'/></svg>",He="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M496 109.5a201.8 201.8 0 0 1-56.55 15.3 97.5 97.5 0 0 0 43.33-53.6 197.7 197.7 0 0 1-62.56 23.5A99.14 99.14 0 0 0 348.31 64c-54.42 0-98.46 43.4-98.46 96.9a93.2 93.2 0 0 0 2.54 22.1 280.7 280.7 0 0 1-203-101.3A95.7 95.7 0 0 0 36 130.4c0 33.6 17.53 63.3 44 80.7A97.5 97.5 0 0 1 35.22 199v1.2c0 47 34 86.1 79 95a100.8 100.8 0 0 1-25.94 3.4 94.4 94.4 0 0 1-18.51-1.8c12.51 38.5 48.92 66.5 92.05 67.3A199.6 199.6 0 0 1 39.5 405.6a203 203 0 0 1-23.5-1.4A278.7 278.7 0 0 0 166.74 448c181.36 0 280.44-147.7 280.44-275.8 0-4.2-.11-8.4-.31-12.5A198.5 198.5 0 0 0 496 109.5'/></svg>",Pe="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M508.64 148.79c0-45-33.1-81.2-74-81.2C379.24 65 322.74 64 265 64h-18c-57.6 0-114.2 1-169.6 3.6C36.6 67.6 3.5 104 3.5 149 1 184.59-.06 220.19 0 255.79q-.15 53.4 3.4 106.9c0 45 33.1 81.5 73.9 81.5 58.2 2.7 117.9 3.9 178.6 3.8q91.2.3 178.6-3.8c40.9 0 74-36.5 74-81.5 2.4-35.7 3.5-71.3 3.4-107q.34-53.4-3.26-106.9M207 353.89v-196.5l145 98.2Z'/></svg>",Ue="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M80 160h352M80 256h352M80 352h352' stroke-linecap='round' stroke-miterlimit='10' class='ionicon-fill-none ionicon-stroke-width'/></svg>",Et="menu-outline",je="close",qe=()=>{const t=document.querySelector(".site-header__toggle");if(!t)return;const e=document.querySelector(t.dataset.target);if(!e)return;const s=()=>{if(!e.classList.contains("is-hidden")){e.classList.add("is-hidden"),t.setAttribute("aria-expanded","false");const n=t.querySelector("ion-icon");n&&(n.name=Et)}};t.addEventListener("click",()=>{const n=t.getAttribute("aria-expanded")==="true";e.classList.toggle("is-hidden"),t.setAttribute("aria-expanded",n?"false":"true");const o=t.querySelector("ion-icon");o&&(o.name=n?Et:je)}),document.addEventListener("click",n=>{const o=e.contains(n.target),i=t.contains(n.target);!o&&!i&&s()}),document.addEventListener("keydown",n=>{n.key==="Escape"&&s()})},ze=()=>{const t=document.querySelector("#main-header");if(!t)return;const e=()=>{if(window.scrollY>8){t.classList.add("is-scrolled");return}t.classList.remove("is-scrolled")};e(),window.addEventListener("scroll",e,{passive:!0})},Re=()=>{const t=document.querySelector("[data-reading-progress]"),e=document.querySelector(".content");if(!t||!e)return;const s=()=>{const n=e.offsetTop,o=e.offsetHeight,i=window.innerHeight,l=window.scrollY,r=Math.max(o-i,1),c=Math.min(Math.max(l-n,0),r)/r*100;t.style.transform=`scaleX(${c/100})`};s(),window.addEventListener("scroll",s,{passive:!0}),window.addEventListener("resize",s)};Lt({close:Oe,"logo-github":Te,"logo-linkedin":Ce,"logo-twitter":He,"logo-youtube":Pe,"menu-outline":Ue}),Ie(),qe(),ze(),Re()})();
1
+ (function(){"use strict";let H;const Lt=()=>{if(typeof window>"u")return new Map;if(!H){const t=window;t.Ionicons=t.Ionicons||{},H=t.Ionicons.map=t.Ionicons.map||new Map}return H},_t=t=>{Object.keys(t).forEach(e=>{K(e,t[e]);const n=e.replace(/([a-z0-9]|(?=[A-Z]))([A-Z0-9])/g,"$1-$2").toLowerCase();e!==n&&K(n,t[e])})},K=(t,e)=>{const n=Lt(),s=n.get(t);s===void 0?n.set(t,e):s!==e&&console.warn(`[Ionicons Warning]: Multiple icons were mapped to name "${t}". Ensure that multiple icons are not mapped to the same icon name.`)},Mt="ionicons",E={hydratedSelectorName:"hydrated",lazyLoad:!1,updatable:!0};var It=Object.defineProperty,Ot=(t,e)=>{for(var n in e)It(t,n,{get:e[n],enumerable:!0})},y=t=>{if(t.__stencil__getHostRef)return t.__stencil__getHostRef()},Ct=(t,e)=>{const n={$flags$:0,$hostElement$:t,$cmpMeta$:e,$instanceValues$:new Map};n.$onReadyPromise$=new Promise(o=>n.$onReadyResolve$=o),t["s-p"]=[],t["s-rc"]=[];const s=n;return t.__stencil__getHostRef=()=>s,s},J=(t,e)=>e in t,A=(t,e)=>(0,console.error)(t,e),L=new Map,Tt="slot-fb{display:contents}slot-fb[hidden]{display:none}",Q="http://www.w3.org/1999/xlink",h=typeof window<"u"?window:{},Pt=h.HTMLElement||class{},v={$flags$:0,$resourcesUrl$:"",jmp:t=>t(),raf:t=>requestAnimationFrame(t),ael:(t,e,n,s)=>t.addEventListener(e,n,s),rel:(t,e,n,s)=>t.removeEventListener(e,n,s),ce:(t,e)=>new CustomEvent(t,e)},Ht=t=>Promise.resolve(t),V=(()=>{try{return new CSSStyleSheet,typeof new CSSStyleSheet().replaceSync=="function"}catch{}return!1})(),q=!1,N=[],tt=[],qt=(t,e)=>n=>{t.push(n),q||(q=!0,v.raf(nt))},et=t=>{for(let e=0;e<t.length;e++)try{t[e](performance.now())}catch(n){A(n)}t.length=0},nt=()=>{et(N),et(tt),(q=N.length>0)&&v.raf(nt)},j=t=>Ht().then(t),jt=qt(tt),Ut=t=>{const e=new URL(t,v.$resourcesUrl$);return e.origin!==h.location.origin?e.href:e.pathname},U=t=>(t=typeof t,t==="object"||t==="function");function zt(t){var e,n,s;return(s=(n=(e=t.head)==null?void 0:e.querySelector('meta[name="csp-nonce"]'))==null?void 0:n.getAttribute("content"))!=null?s:void 0}var Bt=t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Rt={};Ot(Rt,{err:()=>st,map:()=>Dt,ok:()=>z,unwrap:()=>Wt,unwrapErr:()=>Xt});var z=t=>({isOk:!0,isErr:!1,value:t}),st=t=>({isOk:!1,isErr:!0,value:t});function Dt(t,e){if(t.isOk){const n=e(t.value);return n instanceof Promise?n.then(s=>z(s)):z(n)}if(t.isErr){const n=t.value;return st(n)}throw"should never get here"}var Wt=t=>{if(t.isOk)return t.value;throw t.value},Xt=t=>{if(t.isErr)return t.value;throw t.value};function Fe(t){}var _;function Zt(t){var e;const n=this.attachShadow({mode:"open"});_===void 0&&(_=(e=void 0)!=null?e:null),_&&n.adoptedStyleSheets.push(_)}var w=(t,e="")=>()=>{},m=new WeakMap,Gt=(t,e,n)=>{let s=L.get(t);V&&n?(s=s||new CSSStyleSheet,typeof s=="string"?s=e:s.replaceSync(e)):s=e,L.set(t,s)},Ft=(t,e,n)=>{var s;const o=ot(e),i=L.get(o);if(!h.document)return o;if(t=t.nodeType===11?t:h.document,i)if(typeof i=="string"){t=t.head||t;let c=m.get(t),r;if(c||m.set(t,c=new Set),!c.has(o)){{r=h.document.createElement("style"),r.innerHTML=i;const l=(s=v.$nonce$)!=null?s:zt(h.document);if(l!=null&&r.setAttribute("nonce",l),!(e.$flags$&1))if(t.nodeName==="HEAD"){const a=t.querySelectorAll("link[rel=preconnect]"),d=a.length>0?a[a.length-1].nextSibling:t.querySelector("style");t.insertBefore(r,d?.parentNode===t?d:null)}else if("host"in t)if(V){const a=new CSSStyleSheet;a.replaceSync(i),t.adoptedStyleSheets.unshift(a)}else{const a=t.querySelector("style");a?a.innerHTML=i+a.innerHTML:t.prepend(r)}else t.append(r);e.$flags$&1&&t.insertBefore(r,null)}e.$flags$&4&&(r.innerHTML+=Tt),c&&c.add(o)}}else t.adoptedStyleSheets.includes(i)||t.adoptedStyleSheets.push(i);return o},Yt=t=>{const e=t.$cmpMeta$,n=t.$hostElement$,s=e.$flags$,o=w("attachStyles",e.$tagName$),i=Ft(n.shadowRoot?n.shadowRoot:n.getRootNode(),e);s&10&&(n["s-sc"]=i,n.classList.add(i+"-h")),o()},ot=(t,e)=>"sc-"+t.$tagName$,M=(t,e,...n)=>{let s=null,o=null,i=!1,c=!1;const r=[],l=d=>{for(let f=0;f<d.length;f++)s=d[f],Array.isArray(s)?l(s):s!=null&&typeof s!="boolean"&&((i=typeof t!="function"&&!U(s))&&(s=String(s)),i&&c?r[r.length-1].$text$+=s:r.push(i?B(null,s):s),c=i)};if(l(n),e){e.key&&(o=e.key);{const d=e.className||e.class;d&&(e.class=typeof d!="object"?d:Object.keys(d).filter(f=>d[f]).join(" "))}}const a=B(t,null);return a.$attrs$=e,r.length>0&&(a.$children$=r),a.$key$=o,a},B=(t,e)=>{const n={$flags$:0,$tag$:t,$text$:e,$elm$:null,$children$:null};return n.$attrs$=null,n.$key$=null,n},it={},Kt=t=>t&&t.$tag$===it,R=t=>{const e=Bt(t);return new RegExp(`(^|[^@]|@(?!supports\\s+selector\\s*\\([^{]*?${e}))(${e}\\b)`,"g")};R("::slotted"),R(":host"),R(":host-context");var rt=(t,e,n)=>t!=null&&!U(t)?e&4?t==="false"?!1:t===""||!!t:e&1?String(t):t:t,Jt=(t,e,n)=>{const s=v.ce(e,n);return t.dispatchEvent(s),s},ct=(t,e,n,s,o,i,c)=>{if(n===s)return;let r=J(t,e),l=e.toLowerCase();if(e==="class"){const a=t.classList,d=at(n);let f=at(s);a.remove(...d.filter(u=>u&&!f.includes(u))),a.add(...f.filter(u=>u&&!d.includes(u)))}else if(e==="style"){for(const a in n)(!s||s[a]==null)&&(a.includes("-")?t.style.removeProperty(a):t.style[a]="");for(const a in s)(!n||s[a]!==n[a])&&(a.includes("-")?t.style.setProperty(a,s[a]):t.style[a]=s[a])}else if(e!=="key")if(e==="ref")s&&s(t);else if(!t.__lookupSetter__(e)&&e[0]==="o"&&e[1]==="n"){if(e[2]==="-"?e=e.slice(3):J(h,l)?e=l.slice(2):e=l[2]+e.slice(3),n||s){const a=e.endsWith(lt);e=e.replace(Vt,""),n&&v.rel(t,e,n,a),s&&v.ael(t,e,s,a)}}else{const a=U(s);if(r||a&&s!==null)try{if(t.tagName.includes("-"))t[e]!==s&&(t[e]=s);else{const f=s??"";e==="list"?r=!1:(n==null||t[e]!=f)&&(typeof t.__lookupSetter__(e)=="function"?t[e]=f:t.setAttribute(e,f))}}catch{}let d=!1;l!==(l=l.replace(/^xlink\:?/,""))&&(e=l,d=!0),s==null||s===!1?(s!==!1||t.getAttribute(e)==="")&&(d?t.removeAttributeNS(Q,e):t.removeAttribute(e)):(!r||i&4||o)&&!a&&t.nodeType===1&&(s=s===!0?"":s,d?t.setAttributeNS(Q,e,s):t.setAttribute(e,s))}},Qt=/\s/,at=t=>(typeof t=="object"&&t&&"baseVal"in t&&(t=t.baseVal),!t||typeof t!="string"?[]:t.split(Qt)),lt="Capture",Vt=new RegExp(lt+"$"),dt=(t,e,n,s)=>{const o=e.$elm$.nodeType===11&&e.$elm$.host?e.$elm$.host:e.$elm$,i=t&&t.$attrs$||{},c=e.$attrs$||{};for(const r of ft(Object.keys(i)))r in c||ct(o,r,i[r],void 0,n,e.$flags$);for(const r of ft(Object.keys(c)))ct(o,r,i[r],c[r],n,e.$flags$)};function ft(t){return t.includes("ref")?[...t.filter(e=>e!=="ref"),"ref"]:t}var D,ut=!1,I=(t,e,n)=>{const s=e.$children$[n];let o=0,i,c;if(s.$text$!==null)i=s.$elm$=h.document.createTextNode(s.$text$);else{if(!h.document)throw new Error("You are trying to render a Stencil component in an environment that doesn't support the DOM. Make sure to populate the [`window`](https://developer.mozilla.org/en-US/docs/Web/API/Window/window) object before rendering a component.");if(i=s.$elm$=h.document.createElement(s.$tag$),dt(null,s,ut),s.$children$)for(o=0;o<s.$children$.length;++o)c=I(t,s,o),c&&i.appendChild(c)}return i["s-hn"]=D,i},$t=(t,e,n,s,o,i)=>{let c=t,r;for(c.shadowRoot&&c.tagName===D&&(c=c.shadowRoot);o<=i;++o)s[o]&&(r=I(null,n,o),r&&(s[o].$elm$=r,C(c,r,e)))},ht=(t,e,n)=>{for(let s=e;s<=n;++s){const o=t[s];if(o){const i=o.$elm$;pt(o),i&&i.remove()}}},Nt=(t,e,n,s,o=!1)=>{let i=0,c=0,r=0,l=0,a=e.length-1,d=e[0],f=e[a],u=s.length-1,$=s[0],p=s[u],g,x;for(;i<=a&&c<=u;)if(d==null)d=e[++i];else if(f==null)f=e[--a];else if($==null)$=s[++c];else if(p==null)p=s[--u];else if(O(d,$,o))S(d,$,o),d=e[++i],$=s[++c];else if(O(f,p,o))S(f,p,o),f=e[--a],p=s[--u];else if(O(d,p,o))S(d,p,o),C(t,d.$elm$,f.$elm$.nextSibling),d=e[++i],p=s[--u];else if(O(f,$,o))S(f,$,o),C(t,f.$elm$,d.$elm$),f=e[--a],$=s[++c];else{for(r=-1,l=i;l<=a;++l)if(e[l]&&e[l].$key$!==null&&e[l].$key$===$.$key$){r=l;break}r>=0?(x=e[r],x.$tag$!==$.$tag$?g=I(e&&e[c],n,r):(S(x,$,o),e[r]=void 0,g=x.$elm$),$=s[++c]):(g=I(e&&e[c],n,c),$=s[++c]),g&&C(d.$elm$.parentNode,g,d.$elm$)}i>a?$t(t,s[u+1]==null?null:s[u+1].$elm$,n,s,c,u):c>u&&ht(e,i,a)},O=(t,e,n=!1)=>t.$tag$===e.$tag$?n?(n&&!t.$key$&&e.$key$&&(t.$key$=e.$key$),!0):t.$key$===e.$key$:!1,S=(t,e,n=!1)=>{const s=e.$elm$=t.$elm$,o=t.$children$,i=e.$children$,c=e.$text$;c===null?(dt(t,e,ut),o!==null&&i!==null?Nt(s,o,e,i,n):i!==null?(t.$text$!==null&&(s.textContent=""),$t(s,null,e,i,0,i.length-1)):!n&&E.updatable&&o!==null&&ht(o,0,o.length-1)):t.$text$!==c&&(s.data=c)},pt=t=>{t.$attrs$&&t.$attrs$.ref&&t.$attrs$.ref(null),t.$children$&&t.$children$.map(pt)},C=(t,e,n)=>t?.insertBefore(e,n),te=(t,e,n=!1)=>{const s=t.$hostElement$,o=t.$cmpMeta$,i=t.$vnode$||B(null,null),r=Kt(e)?e:M(null,null,e);if(D=s.tagName,o.$attrsToReflect$&&(r.$attrs$=r.$attrs$||{},o.$attrsToReflect$.map(([l,a])=>r.$attrs$[a]=s[l])),n&&r.$attrs$)for(const l of Object.keys(r.$attrs$))s.hasAttribute(l)&&!["key","ref","style","class"].includes(l)&&(r.$attrs$[l]=s[l]);r.$tag$=null,r.$flags$|=4,t.$vnode$=r,r.$elm$=i.$elm$=s.shadowRoot||s,S(i,r,n)},gt=(t,e)=>{if(e&&!t.$onRenderResolve$&&e["s-p"]){const n=e["s-p"].push(new Promise(s=>t.$onRenderResolve$=()=>{e["s-p"].splice(n-1,1),s()}))}},W=(t,e)=>{if(t.$flags$|=16,t.$flags$&4){t.$flags$|=512;return}return gt(t,t.$ancestorComponent$),jt(()=>ee(t,e))},ee=(t,e)=>{const n=t.$hostElement$,s=w("scheduleUpdate",t.$cmpMeta$.$tagName$),o=n;if(!o)throw new Error(`Can't render component <${n.tagName.toLowerCase()} /> with invalid Stencil runtime! Make sure this imported component is compiled with a \`externalRuntime: true\` flag. For more information, please refer to https://stenciljs.com/docs/custom-elements#externalruntime`);let i;return e?i=b(o,"componentWillLoad",void 0,n):i=b(o,"componentWillUpdate",void 0,n),i=vt(i,()=>b(o,"componentWillRender",void 0,n)),s(),vt(i,()=>se(t,o,e))},vt=(t,e)=>ne(t)?t.then(e).catch(n=>{console.error(n),e()}):e(),ne=t=>t instanceof Promise||t&&t.then&&typeof t.then=="function",se=async(t,e,n)=>{var s;const o=t.$hostElement$,i=w("update",t.$cmpMeta$.$tagName$),c=o["s-rc"];n&&Yt(t);const r=w("render",t.$cmpMeta$.$tagName$);oe(t,e,o,n),c&&(c.map(l=>l()),o["s-rc"]=void 0),r(),i();{const l=(s=o["s-p"])!=null?s:[],a=()=>ie(t);l.length===0?a():(Promise.all(l).then(a),t.$flags$|=4,l.length=0)}},oe=(t,e,n,s)=>{try{e=e.render(),t.$flags$&=-17,t.$flags$|=2,te(t,e,s)}catch(o){A(o,t.$hostElement$)}return null},ie=t=>{const e=t.$cmpMeta$.$tagName$,n=t.$hostElement$,s=w("postUpdate",e),o=n,i=t.$ancestorComponent$;b(o,"componentDidRender",void 0,n),t.$flags$&64?(b(o,"componentDidUpdate",void 0,n),s()):(t.$flags$|=64,ce(n),b(o,"componentDidLoad",void 0,n),s(),t.$onReadyResolve$(n),i||re()),t.$onRenderResolve$&&(t.$onRenderResolve$(),t.$onRenderResolve$=void 0),t.$flags$&512&&j(()=>W(t,!1)),t.$flags$&=-517},re=t=>{j(()=>Jt(h,"appload",{detail:{namespace:Mt}}))},b=(t,e,n,s)=>{if(t&&t[e])try{return t[e](n)}catch(o){A(o,s)}},ce=t=>{var e;return t.classList.add((e=E.hydratedSelectorName)!=null?e:"hydrated")},ae=(t,e)=>y(t).$instanceValues$.get(e),yt=(t,e,n,s)=>{const o=y(t),i=t,c=o.$instanceValues$.get(e),r=o.$flags$,l=i;n=rt(n,s.$members$[e][0]);const a=Number.isNaN(c)&&Number.isNaN(n);if(n!==c&&!a){o.$instanceValues$.set(e,n);{if(s.$watchers$&&r&128){const f=s.$watchers$[e];f&&f.map(u=>{try{l[u](n,c,e)}catch($){A($,i)}})}if((r&18)===2){if(l.componentShouldUpdate&&l.componentShouldUpdate(n,c,e)===!1)return;W(o,!1)}}}},le=(t,e,n)=>{var s,o;const i=t.prototype;if(e.$members$||e.$watchers$||t.watchers){t.watchers&&!e.$watchers$&&(e.$watchers$=t.watchers);const c=Object.entries((s=e.$members$)!=null?s:{});c.map(([r,[l]])=>{if(l&31||l&32){const{get:a,set:d}=Object.getOwnPropertyDescriptor(i,r)||{};a&&(e.$members$[r][0]|=2048),d&&(e.$members$[r][0]|=4096),Object.defineProperty(i,r,{get(){return a?a.apply(this):ae(this,r)},configurable:!0,enumerable:!0}),Object.defineProperty(i,r,{set(f){const u=y(this);if(d){const $=l&32?this[r]:u.$hostElement$[r];typeof $>"u"&&u.$instanceValues$.get(r)?f=u.$instanceValues$.get(r):!u.$instanceValues$.get(r)&&$&&u.$instanceValues$.set(r,$),d.apply(this,[rt(f,l)]),f=l&32?this[r]:u.$hostElement$[r],yt(this,r,f,e);return}{yt(this,r,f,e);return}}})}});{const r=new Map;i.attributeChangedCallback=function(l,a,d){v.jmp(()=>{var f;const u=r.get(l);if(!(this.hasOwnProperty(u)&&E.lazyLoad)){if(i.hasOwnProperty(u)&&typeof this[u]=="number"&&this[u]==d)return;if(u==null){const p=y(this),g=p?.$flags$;if(g&&!(g&8)&&g&128&&d!==a){const Y=this,Et=(f=e.$watchers$)==null?void 0:f[l];Et?.forEach(At=>{Y[At]!=null&&Y[At].call(Y,d,a,l)})}return}}const $=Object.getOwnPropertyDescriptor(i,u);d=d===null&&typeof this[u]=="boolean"?!1:d,d!==this[u]&&(!$.get||$.set)&&(this[u]=d)})},t.observedAttributes=Array.from(new Set([...Object.keys((o=e.$watchers$)!=null?o:{}),...c.filter(([l,a])=>a[0]&15).map(([l,a])=>{var d;const f=a[1]||l;return r.set(f,l),a[0]&512&&((d=e.$attrsToReflect$)==null||d.push([l,f])),f})]))}}return t},wt=async(t,e,n,s)=>{let o;if((e.$flags$&32)===0){e.$flags$|=32;{o=t.constructor;const r=t.localName;customElements.whenDefined(r).then(()=>e.$flags$|=128)}if(o&&o.style){let r;typeof o.style=="string"&&(r=o.style);const l=ot(n);if(!L.has(l)){const a=w("registerStyles",n.$tagName$);Gt(l,r,!!(n.$flags$&1)),a()}}}const i=e.$ancestorComponent$,c=()=>W(e,!0);i&&i["s-rc"]?i["s-rc"].push(c):c()},de=(t,e)=>{},fe=t=>{{const e=y(t),n=e.$cmpMeta$,s=w("connectedCallback",n.$tagName$);if(e.$flags$&1)e?.$lazyInstance$||e?.$onReadyPromise$&&e.$onReadyPromise$.then(()=>de());else{e.$flags$|=1;{let o=t;for(;o=o.parentNode||o.host;)if(o["s-p"]){gt(e,e.$ancestorComponent$=o);break}}n.$members$&&Object.entries(n.$members$).map(([o,[i]])=>{if(i&31&&t.hasOwnProperty(o)){const c=t[o];delete t[o],t[o]=c}}),E.initializeNextTick?j(()=>wt(t,e,n)):wt(t,e,n)}s()}},ue=async t=>{y(t),m.has(t)&&m.delete(t),t.shadowRoot&&m.has(t.shadowRoot)&&m.delete(t.shadowRoot)},$e=(t,e)=>{const n={$flags$:e[0],$tagName$:e[1]};n.$members$=e[2],n.$watchers$=t.$watchers$,n.$attrsToReflect$=[];const s=t.prototype.connectedCallback,o=t.prototype.disconnectedCallback;return Object.assign(t.prototype,{__hasHostListenerAttached:!1,__registerHost(){Ct(this,n)},connectedCallback(){this.__hasHostListenerAttached||(y(this),this.__hasHostListenerAttached=!0),fe(this),s&&s.call(this)},disconnectedCallback(){ue(this),o&&o.call(this)},__attachShadow(){if(!this.shadowRoot)Zt.call(this,n);else if(this.shadowRoot.mode!=="open")throw new Error(`Unable to re-use existing shadow root for ${n.$tagName$}! Mode is set to ${this.shadowRoot.mode} but Stencil only supports open shadow roots.`)}}),t.is=n.$tagName$,le(t,n)};let X;const he=()=>{if(typeof window>"u")return new Map;if(!X){const t=window;t.Ionicons=t.Ionicons||{},X=t.Ionicons.map=t.Ionicons.map||new Map}return X},pe=t=>{let e=Z(t.src);return e||(e=mt(t.name,t.icon,t.mode,t.ios,t.md),e?ge(e,t):t.icon&&(e=Z(t.icon),e||(e=Z(t.icon[t.mode]),e))?e:null)},ge=(t,e)=>{const n=he().get(t);if(n)return n;try{return Ut(`svg/${t}.svg`)}catch(s){console.log("e",s),console.warn(`[Ionicons Warning]: Could not load icon with name "${t}". Ensure that the icon is registered using addIcons or that the icon SVG data is passed directly to the icon component.`,e)}},mt=(t,e,n,s,o)=>(n=(n&&P(n))==="ios"?"ios":"md",s&&n==="ios"?t=P(s):o&&n==="md"?t=P(o):(!t&&e&&!St(e)&&(t=e),T(t)&&(t=P(t))),!T(t)||t.trim()===""||t.replace(/[a-z]|-|\d/gi,"")!==""?null:t),Z=t=>T(t)&&(t=t.trim(),St(t))?t:null,St=t=>t.length>0&&/(\/|\.)/.test(t),T=t=>typeof t=="string",P=t=>t.toLowerCase(),ve=(t,e=[])=>{const n={};return e.forEach(s=>{t.hasAttribute(s)&&(t.getAttribute(s)!==null&&(n[s]=t.getAttribute(s)),t.removeAttribute(s))}),n},ye=t=>t&&t.dir!==""?t.dir.toLowerCase()==="rtl":document?.dir.toLowerCase()==="rtl",we=t=>{const e=document.createElement("div");e.innerHTML=t;for(let s=e.childNodes.length-1;s>=0;s--)e.childNodes[s].nodeName.toLowerCase()!=="svg"&&e.removeChild(e.childNodes[s]);const n=e.firstElementChild;if(n&&n.nodeName.toLowerCase()==="svg"){const s=n.getAttribute("class")||"";if(n.setAttribute("class",(s+" s-ion-icon").trim()),bt(n))return e.innerHTML}return""},bt=t=>{if(t.nodeType===1){if(t.nodeName.toLowerCase()==="script")return!1;for(let e=0;e<t.attributes.length;e++){const n=t.attributes[e].name;if(T(n)&&n.toLowerCase().indexOf("on")===0)return!1}for(let e=0;e<t.childNodes.length;e++)if(!bt(t.childNodes[e]))return!1}return!0},me=t=>t.startsWith("data:image/svg+xml"),Se=t=>t.indexOf(";utf8,")!==-1,k=new Map,kt=new Map;let G;function F(t){return k.set(t,""),""}const be=(t,e)=>{const n=kt.get(t);return n||(typeof fetch<"u"&&typeof document<"u"?me(t)&&Se(t)?Promise.resolve(ke(t)):xe(t,e):Promise.resolve(F(t)))};function ke(t){G||(G=new DOMParser);const n=G.parseFromString(t,"text/html").querySelector("svg");if(n)return k.set(t,n.outerHTML),n.outerHTML;throw new Error(`Could not parse svg from ${t}`)}function xe(t,e){const n=fetch(t).then(s=>s.text().then(o=>{o&&e!==!1&&(o=we(o));const i=o||"";return k.set(t,i),i}).catch(()=>F(t))).catch(()=>F(t));return kt.set(t,n),n}const Ee=":host{display:inline-block;width:1em;height:1em;contain:strict;fill:currentColor;box-sizing:content-box !important}:host .ionicon{stroke:currentColor}.ionicon-fill-none{fill:none}.ionicon-stroke-width{stroke-width:var(--ionicon-stroke-width, 32px)}.icon-inner,.ionicon,svg{display:block;height:100%;width:100%}@supports (background: -webkit-named-image(i)){:host(.icon-rtl) .icon-inner{transform:scaleX(-1)}}@supports not selector(:dir(rtl)) and selector(:host-context([dir='rtl'])){:host(.icon-rtl) .icon-inner{transform:scaleX(-1)}}:host(.flip-rtl):host-context([dir='rtl']) .icon-inner{transform:scaleX(-1)}@supports selector(:dir(rtl)){:host(.flip-rtl:dir(rtl)) .icon-inner{transform:scaleX(-1)}:host(.flip-rtl:dir(ltr)) .icon-inner{transform:scaleX(1)}}:host(.icon-small){font-size:1.125rem !important}:host(.icon-large){font-size:2rem !important}:host(.ion-color){color:var(--ion-color-base) !important}:host(.ion-color-primary){--ion-color-base:var(--ion-color-primary, #3880ff)}:host(.ion-color-secondary){--ion-color-base:var(--ion-color-secondary, #0cd1e8)}:host(.ion-color-tertiary){--ion-color-base:var(--ion-color-tertiary, #f4a942)}:host(.ion-color-success){--ion-color-base:var(--ion-color-success, #10dc60)}:host(.ion-color-warning){--ion-color-base:var(--ion-color-warning, #ffce00)}:host(.ion-color-danger){--ion-color-base:var(--ion-color-danger, #f14141)}:host(.ion-color-light){--ion-color-base:var(--ion-color-light, #f4f5f8)}:host(.ion-color-medium){--ion-color-base:var(--ion-color-medium, #989aa2)}:host(.ion-color-dark){--ion-color-base:var(--ion-color-dark, #222428)}",Ae=$e(class extends Pt{constructor(){super(),this.__registerHost(),this.__attachShadow(),this.iconName=null,this.inheritedAttributes={},this.didLoadIcon=!1,this.isVisible=!1,this.mode=Le(),this.lazy=!1,this.sanitize=!0}componentWillLoad(){this.inheritedAttributes=ve(this.el,["aria-label"])}connectedCallback(){this.waitUntilVisible(this.el,"50px",()=>{this.isVisible=!0,this.loadIcon()})}componentDidLoad(){this.didLoadIcon||this.loadIcon()}disconnectedCallback(){this.io&&(this.io.disconnect(),this.io=void 0)}waitUntilVisible(e,n,s){if(!!!(this.lazy&&typeof window<"u"&&window.IntersectionObserver))return s();const i=this.io=new window.IntersectionObserver(c=>{c[0].isIntersecting&&(i.disconnect(),this.io=void 0,s())},{rootMargin:n});i.observe(e)}loadIcon(){if(this.isVisible){const e=pe(this);e&&(k.has(e)?this.svgContent=k.get(e):be(e,this.sanitize).then(()=>this.svgContent=k.get(e)),this.didLoadIcon=!0)}this.iconName=mt(this.name,this.icon,this.mode,this.ios,this.md)}render(){const{flipRtl:e,iconName:n,inheritedAttributes:s,el:o}=this,i=this.mode||"md",c=n?(n.includes("arrow")||n.includes("chevron"))&&e!==!1:!1,r=e||c;return M(it,Object.assign({key:"0578c899781ca145dd8205acd9670af39b57cf2e",role:"img",class:Object.assign(Object.assign({[i]:!0},_e(this.color)),{[`icon-${this.size}`]:!!this.size,"flip-rtl":r,"icon-rtl":r&&ye(o)})},s),this.svgContent?M("div",{class:"icon-inner",innerHTML:this.svgContent}):M("div",{class:"icon-inner"}))}static get assetsDirs(){return["svg"]}get el(){return this}static get watchers(){return{name:["loadIcon"],src:["loadIcon"],icon:["loadIcon"],ios:["loadIcon"],md:["loadIcon"]}}static get style(){return Ee}},[1,"ion-icon",{mode:[1025],color:[1],ios:[1],md:[1],flipRtl:[4,"flip-rtl"],name:[513],src:[1],icon:[8],size:[1],lazy:[4],sanitize:[4],svgContent:[32],isVisible:[32]},void 0,{name:["loadIcon"],src:["loadIcon"],icon:["loadIcon"],ios:["loadIcon"],md:["loadIcon"]}]),Le=()=>typeof document<"u"&&document.documentElement.getAttribute("mode")||"md",_e=t=>t?{"ion-color":!0,[`ion-color-${t}`]:!0}:null;function Me(){if(typeof customElements>"u")return;["ion-icon"].forEach(e=>{e==="ion-icon"&&(customElements.get(e)||customElements.define(e,Ae))})}const Ie=Me,Oe="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='m112 184 144 144 144-144' stroke-linecap='round' stroke-linejoin='round' stroke-width='48px' class='ionicon-fill-none'/></svg>",Ce="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='m289.94 256 95-95A24 24 0 0 0 351 127l-95 95-95-95a24 24 0 0 0-34 34l95 95-95 95a24 24 0 1 0 34 34l95-95 95 95a24 24 0 0 0 34-34Z'/></svg>",Te="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M256 32C132.3 32 32 134.9 32 261.7c0 101.5 64.2 187.5 153.2 217.9a17.6 17.6 0 0 0 3.8.4c8.3 0 11.5-6.1 11.5-11.4 0-5.5-.2-19.9-.3-39.1a102.4 102.4 0 0 1-22.6 2.7c-43.1 0-52.9-33.5-52.9-33.5-10.2-26.5-24.9-33.6-24.9-33.6-19.5-13.7-.1-14.1 1.4-14.1h.1c22.5 2 34.3 23.8 34.3 23.8 11.2 19.6 26.2 25.1 39.6 25.1a63 63 0 0 0 25.6-6c2-14.8 7.8-24.9 14.2-30.7-49.7-5.8-102-25.5-102-113.5 0-25.1 8.7-45.6 23-61.6-2.3-5.8-10-29.2 2.2-60.8a18.6 18.6 0 0 1 5-.5c8.1 0 26.4 3.1 56.6 24.1a208.2 208.2 0 0 1 112.2 0c30.2-21 48.5-24.1 56.6-24.1a18.6 18.6 0 0 1 5 .5c12.2 31.6 4.5 55 2.2 60.8 14.3 16.1 23 36.6 23 61.6 0 88.2-52.4 107.6-102.3 113.3 8 7.1 15.2 21.1 15.2 42.5 0 30.7-.3 55.5-.3 63 0 5.4 3.1 11.5 11.4 11.5a19.4 19.4 0 0 0 4-.4C415.9 449.2 480 363.1 480 261.7 480 134.9 379.7 32 256 32'/></svg>",Pe="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M444.17 32H70.28C49.85 32 32 46.7 32 66.89v374.72C32 461.91 49.85 480 70.28 480h373.78c20.54 0 35.94-18.21 35.94-38.39V66.89C480.12 46.7 464.6 32 444.17 32m-273.3 373.43h-64.18V205.88h64.18ZM141 175.54h-.46c-20.54 0-33.84-15.29-33.84-34.43 0-19.49 13.65-34.42 34.65-34.42s33.85 14.82 34.31 34.42c-.01 19.14-13.31 34.43-34.66 34.43m264.43 229.89h-64.18V296.32c0-26.14-9.34-44-32.56-44-17.74 0-28.24 12-32.91 23.69-1.75 4.2-2.22 9.92-2.22 15.76v113.66h-64.18V205.88h64.18v27.77c9.34-13.3 23.93-32.44 57.88-32.44 42.13 0 74 27.77 74 87.64Z'/></svg>",He="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M496 109.5a201.8 201.8 0 0 1-56.55 15.3 97.5 97.5 0 0 0 43.33-53.6 197.7 197.7 0 0 1-62.56 23.5A99.14 99.14 0 0 0 348.31 64c-54.42 0-98.46 43.4-98.46 96.9a93.2 93.2 0 0 0 2.54 22.1 280.7 280.7 0 0 1-203-101.3A95.7 95.7 0 0 0 36 130.4c0 33.6 17.53 63.3 44 80.7A97.5 97.5 0 0 1 35.22 199v1.2c0 47 34 86.1 79 95a100.8 100.8 0 0 1-25.94 3.4 94.4 94.4 0 0 1-18.51-1.8c12.51 38.5 48.92 66.5 92.05 67.3A199.6 199.6 0 0 1 39.5 405.6a203 203 0 0 1-23.5-1.4A278.7 278.7 0 0 0 166.74 448c181.36 0 280.44-147.7 280.44-275.8 0-4.2-.11-8.4-.31-12.5A198.5 198.5 0 0 0 496 109.5'/></svg>",qe="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M508.64 148.79c0-45-33.1-81.2-74-81.2C379.24 65 322.74 64 265 64h-18c-57.6 0-114.2 1-169.6 3.6C36.6 67.6 3.5 104 3.5 149 1 184.59-.06 220.19 0 255.79q-.15 53.4 3.4 106.9c0 45 33.1 81.5 73.9 81.5 58.2 2.7 117.9 3.9 178.6 3.8q91.2.3 178.6-3.8c40.9 0 74-36.5 74-81.5 2.4-35.7 3.5-71.3 3.4-107q.34-53.4-3.26-106.9M207 353.89v-196.5l145 98.2Z'/></svg>",je="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M80 160h352M80 256h352M80 352h352' stroke-linecap='round' stroke-miterlimit='10' class='ionicon-fill-none ionicon-stroke-width'/></svg>",Ue="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M256 64C150 64 64 150 64 256s86 192 192 192 192-86 192-192S362 64 256 64Z' stroke-miterlimit='10' class='ionicon-fill-none ionicon-stroke-width'/><path d='M256 128v144h96' stroke-linecap='round' stroke-linejoin='round' class='ionicon-fill-none ionicon-stroke-width'/></svg>",xt="menu-outline",ze="close",Be=()=>{const t=document.querySelector(".site-header__toggle");if(!t)return;const e=document.querySelector(t.dataset.target);if(!e)return;const n=()=>{if(!e.classList.contains("is-hidden")){e.classList.add("is-hidden"),t.setAttribute("aria-expanded","false");const s=t.querySelector("ion-icon");s&&(s.name=xt)}};t.addEventListener("click",()=>{const s=t.getAttribute("aria-expanded")==="true";e.classList.toggle("is-hidden"),t.setAttribute("aria-expanded",s?"false":"true");const o=t.querySelector("ion-icon");o&&(o.name=s?xt:ze)}),document.addEventListener("click",s=>{const o=e.contains(s.target),i=t.contains(s.target);!o&&!i&&n()}),document.addEventListener("keydown",s=>{s.key==="Escape"&&n()})},Re={category:"data-category",categoryId:"data-category-id",emitMetadata:"data-emit-metadata",inputPosition:"data-input-position",lang:"data-lang",loading:"data-loading",mapping:"data-mapping",reactionsEnabled:"data-reactions-enabled",repo:"data-repo",repoId:"data-repo-id",strict:"data-strict",term:"data-term",theme:"data-theme"},De=t=>{if(!t||t.dataset.giscusLoaded==="true")return;const e=document.createElement("script");e.src=t.dataset.giscusScriptSrc||"https://giscus.app/client.js",e.async=!0,e.crossOrigin="anonymous";for(const[n,s]of Object.entries(Re)){const o=t.dataset[`giscus${n.charAt(0).toUpperCase()}${n.slice(1)}`];o&&e.setAttribute(s,o)}t.append(e),t.dataset.giscusLoaded="true"},We=()=>{const t=document.querySelectorAll("[data-comments-collapsible]");t.length&&t.forEach(e=>{const n=e.querySelector("[data-comments-toggle]"),s=e.querySelector("[data-comments-panel]"),o=e.querySelector("[data-giscus-mount]");!n||!s||!o||n.addEventListener("click",()=>{const c=!(n.getAttribute("aria-expanded")==="true");n.setAttribute("aria-expanded",c?"true":"false"),e.classList.toggle("is-open",c),s.hidden=!c,c&&De(o)})})},Xe=()=>{const t=document.querySelector("#main-header");if(!t)return;const e=()=>{if(window.scrollY>8){t.classList.add("is-scrolled");return}t.classList.remove("is-scrolled")};e(),window.addEventListener("scroll",e,{passive:!0})},Ze=()=>{const t=document.querySelectorAll("[data-series-collapsible]");t.length&&t.forEach(e=>{const n=e.querySelector("[data-series-toggle]"),s=e.querySelector("[data-series-panel]");if(!n||!s)return;const o=()=>{const c=n.getAttribute("aria-expanded")==="true";e.classList.toggle("is-open",c),s.hidden=!c};o(),n.addEventListener("click",()=>{const c=n.getAttribute("aria-expanded")==="true";n.setAttribute("aria-expanded",c?"false":"true"),o()});const i=e.querySelectorAll("[data-series-overflow-toggle]");i.length&&i.forEach(c=>{c.addEventListener("click",()=>{const r=c.dataset.seriesOverflowGroup,l=r?`[data-series-overflow-item][data-series-overflow-group="${r}"]`:"[data-series-overflow-item]";e.querySelectorAll(l).forEach(d=>{d.hidden=!1}),c.hidden=!0})})})},Ge=()=>{const t=document.querySelector("[data-reading-progress]"),e=document.querySelector(".content");if(!t||!e)return;const n=()=>{const s=e.offsetTop,o=e.offsetHeight,i=window.innerHeight,c=window.scrollY,r=Math.max(o-i,1),a=Math.min(Math.max(c-s,0),r)/r*100;t.style.transform=`scaleX(${a/100})`};n(),window.addEventListener("scroll",n,{passive:!0}),window.addEventListener("resize",n)};_t({"chevron-down-outline":Oe,close:Ce,"logo-github":Te,"logo-linkedin":Pe,"logo-twitter":He,"logo-youtube":qe,"menu-outline":je,"time-outline":Ue}),Ie(),Be(),We(),Xe(),Ze(),Ge()})();
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imdhemy-jekyll-theme
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mohamad Eldhemy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-08 00:00:00.000000000 Z
11
+ date: 2026-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -79,6 +79,7 @@ files:
79
79
  - _includes/content.html
80
80
  - _includes/contributions.html
81
81
  - _includes/footer.html
82
+ - _includes/giscus-comments.html
82
83
  - _includes/header.html
83
84
  - _includes/hero.html
84
85
  - _includes/latest-posts.html
@@ -87,7 +88,9 @@ files:
87
88
  - _includes/pagination-links.html
88
89
  - _includes/post-header.html
89
90
  - _includes/post-item.html
91
+ - _includes/post-meta.html
90
92
  - _includes/post-navigation.html
93
+ - _includes/post-series.html
91
94
  - _includes/post-tags.html
92
95
  - _includes/reading-progress.html
93
96
  - _includes/related-posts.html