imdhemy-jekyll-theme 1.3.1 → 1.5.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: 845bdb2101f37d892526822d4f1c02095273edc124f76233250c59e41cd27076
4
- data.tar.gz: 978d04a00788d5689721b15c12ed14ee31e3459cf74394fdb4529a271196300c
3
+ metadata.gz: 8c2766f041feb77f44c69b2775ad3232f72925dd1bff3e7906f9c2f093115c6e
4
+ data.tar.gz: 8275b2d6b417f38d58932cb29303972b04d236351749a6050e217c272a74016f
5
5
  SHA512:
6
- metadata.gz: 71a11c8d9f14ab2557e7493c4da6526221f5ad88188bebbaa6f670d705880c4986cfb5372ac63ec80877fba35747851475e2c1946b23fc2a369c411b05fc6f9b
7
- data.tar.gz: a27341ad92998af3c41012b145555228614449b374a1603b8f3d5eeca2e7078c22bf1d38527ef53ccae703e4e7c982046ed7e99398ce596357937e53d99b5d45
6
+ metadata.gz: ec06e5d0fdbca089ccc979dbec4d13d1f648ccf4c14521e21fdf053f528a228def6a9224b2c09ce46846a8daf679926a829a02f6d4e69bff0e9b4a6e3b3e06e8
7
+ data.tar.gz: 9a4b39872b6cc2e27ad53f04aad39e510777da81fc809ab8233468ba30a15859e0b9254a5e0600b554ce884050c895f287190fc2009dcb352902066a0f44b0bc
data/README.md CHANGED
@@ -6,6 +6,13 @@ Jekyll theme for my personal website: [imdhemy.com](https://imdhemy.com).
6
6
 
7
7
  All documentation lives in the [`docs/`](./docs) directory.
8
8
 
9
+ The theme also ships with a reusable SEO foundation:
10
+
11
+ - canonical URLs
12
+ - layout-aware meta descriptions and social previews
13
+ - JSON-LD for home, posts, breadcrumbs, and collection pages
14
+ - configurable robots and social image defaults
15
+
9
16
  - [Documentation Home](./docs/README.md)
10
17
  - [Getting Started](./docs/getting-started.md)
11
18
  - [Configuration Reference](./docs/configuration.md)
@@ -1,9 +1,20 @@
1
+ {% assign archive_type = page.type | default: page.collection %}
2
+ {% assign archive_label = 'archive' %}
3
+ {% if archive_type == 'tag' or archive_type == 'tags' %}
4
+ {% assign archive_label = 'tag' %}
5
+ {% elsif archive_type == 'category' or archive_type == 'categories' %}
6
+ {% assign archive_label = 'category' %}
7
+ {% endif %}
8
+ {% assign archive_description = page.description %}
9
+ {% if archive_description == nil or archive_description == empty %}
10
+ {% capture archive_description %}Browse all posts filed under {{ archive_label }} {{ page.title }}.{% endcapture %}
11
+ {% endif %}
1
12
  <section class="page-header-wrap page-header-wrap--archive">
2
13
  <div class="page-header-wrap__container">
3
14
  <div class="page-header page-header--archive page-header--archive-hub">
4
15
  <div class="page-header__layout page-header__layout--stacked">
5
16
  <h1 class="page-header__title page-header__title--centered">{{ page.title }}</h1>
6
- <p class="page-header__description page-header__description--centered">Check out the <a
17
+ <p class="page-header__description page-header__description--centered">{{ archive_description }} Check out the <a
7
18
  class="archive-header__blog-link"
8
19
  href="{{ site.baseurl }}/blog">blog</a> for all
9
20
  posts.</p>
@@ -13,7 +13,7 @@
13
13
  aria-controls="comments-panel"
14
14
  data-comments-toggle>
15
15
  <span class="comments-collapsible__copy">
16
- <span class="comments-shell__heading">{{ comments_heading }}</span>
16
+ <span class="comments-shell__heading" role="heading" aria-level="2">{{ comments_heading }}</span>
17
17
  <span class="comments-collapsible__hint">{{ comments_toggle_hint }}</span>
18
18
  </span>
19
19
  <span class="comments-collapsible__icon-wrap" aria-hidden="true">
@@ -1,22 +1,21 @@
1
1
  <header class="site-header" id="main-header">
2
2
  <div class="site-header__container">
3
3
  <div class="site-header__inner">
4
+ {% assign search_enabled = true %}
5
+ {% if site.theme_search.enabled == false %}
6
+ {% assign search_enabled = false %}
7
+ {% endif %}
8
+ {% assign open_menu_label = site.theme_text.open_menu_label | default: "Open navigation menu" %}
9
+ {% assign close_menu_label = site.theme_text.close_menu_label | default: "Close navigation menu" %}
4
10
  <!-- begin logo -->
5
11
  <div class="site-header__brand">
6
- <a href="{{ site.baseurl }}/" class="site-logo">
12
+ <a href="{{ site.baseurl }}/" class="site-logo" aria-label="{{ site.title }} home">
7
13
  {{ site.title }}
8
14
  </a>
9
15
  </div>
10
16
  <!-- end logo -->
11
17
  <!-- begin right part -->
12
18
  <div class="site-header__actions">
13
- <div class="site-header__mobile-toggle-wrap">
14
- <button type="button" class="site-header__toggle" data-target="#mobile-nav" aria-controls="mobile-nav"
15
- aria-expanded="false" aria-label="Toggle navigation menu">
16
- <ion-icon name="menu-outline"></ion-icon>
17
- </button>
18
- </div>
19
-
20
19
  <nav class="site-header__desktop-nav" aria-label="Primary navigation">
21
20
  <ul class="site-nav-list">
22
21
  {% assign current_path = page.url | default: "/" | split: "?" | first | replace: "index.html", "" | replace: ".html", "" %}
@@ -33,20 +32,42 @@
33
32
  {% endif %}
34
33
  <li class="site-nav-list__item">
35
34
  <a href="{{ site.baseurl }}{{ nav_page.url }}"
36
- class="nav-link{% if is_active %} is-active{% endif %}">
35
+ class="nav-link{% if is_active %} is-active{% endif %}"{% if is_active %} aria-current="page"{% endif %}>
37
36
  {{ nav_page.title }}
38
37
  </a>
39
38
  </li>
40
39
  {% endfor %}
41
40
  </ul>
42
41
  </nav>
42
+
43
+ {% if search_enabled %}
44
+ {% include site-search.html variant="desktop" %}
45
+ {% endif %}
46
+
47
+ <div class="site-header__mobile-toggle-wrap">
48
+ <button type="button"
49
+ class="site-header__toggle"
50
+ data-target="#mobile-nav"
51
+ data-open-label="{{ open_menu_label }}"
52
+ data-close-label="{{ close_menu_label }}"
53
+ aria-controls="mobile-nav"
54
+ aria-expanded="false"
55
+ aria-label="{{ open_menu_label }}">
56
+ <ion-icon name="menu-outline" aria-hidden="true"></ion-icon>
57
+ <span class="sr-only">{{ open_menu_label }}</span>
58
+ </button>
59
+ </div>
43
60
  <!-- end right part -->
44
61
  </div>
45
62
  <!-- begin mobile nav -->
46
63
  <nav id="mobile-nav"
47
64
  class="site-mobile-nav is-hidden"
48
- aria-label="Mobile navigation">
65
+ aria-label="Mobile navigation"
66
+ hidden>
49
67
  <div class="site-mobile-nav__inner">
68
+ {% if search_enabled %}
69
+ {% include site-search.html variant="mobile" %}
70
+ {% endif %}
50
71
  <ul class="site-mobile-nav__list">
51
72
  {% assign current_path = page.url | default: "/" | split: "?" | first | replace: "index.html", "" | replace: ".html", "" %}
52
73
  {% assign current_norm = current_path | append: "/" | replace: "//", "/" %}
@@ -62,7 +83,7 @@
62
83
  {% endif %}
63
84
  <li class="site-mobile-nav__item">
64
85
  <a href="{{ site.baseurl }}{{ nav_page.url }}"
65
- class="site-mobile-nav__link nav-link{% if is_active %} is-active{% endif %}">
86
+ class="site-mobile-nav__link nav-link{% if is_active %} is-active{% endif %}"{% if is_active %} aria-current="page"{% endif %}>
66
87
  {{ nav_page.title }}
67
88
  </a>
68
89
  </li>
@@ -3,16 +3,18 @@
3
3
  <nav class="pagination-nav" aria-label="Pagination">
4
4
  {% if paginator.previous_page %}
5
5
  <a class="pagination-link"
6
- href="{{ paginator.previous_page_path | relative_url }}">Prev</a>
6
+ href="{{ paginator.previous_page_path | relative_url }}"
7
+ rel="prev">Prev</a>
7
8
  {% else %}
8
- <span class="pagination-link is-disabled">Previous</span>
9
+ <span class="pagination-link is-disabled" aria-disabled="true">Previous</span>
9
10
  {% endif %}
10
11
 
11
12
  {% if paginator.next_page %}
12
13
  <a class="pagination-link"
13
- href="{{ paginator.next_page_path | relative_url }}">Next</a>
14
+ href="{{ paginator.next_page_path | relative_url }}"
15
+ rel="next">Next</a>
14
16
  {% else %}
15
- <span class="pagination-link is-disabled">Next</span>
17
+ <span class="pagination-link is-disabled" aria-disabled="true">Next</span>
16
18
  {% endif %}
17
19
  </nav>
18
20
  </section>
@@ -1,7 +1,7 @@
1
1
  {% assign read_minutes = page.content | number_of_words | divided_by: 200 | at_least: 1 %}
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
- <a class="post-back-link" href="{{ site.baseurl }}/blog">&larr; {{ back_to_posts_label }}</a>
4
+ <a class="post-back-link" href="{{ site.baseurl }}/blog" aria-label="{{ back_to_posts_label }}">&larr; {{ back_to_posts_label }}</a>
5
5
  <h1 class="post-title">{{ page.title }}</h1>
6
6
  {% include post-meta.html date=page.date reading_minutes=read_minutes class_name="post-header__meta post-meta" %}
7
7
  <div class="post-header__tags">
@@ -4,7 +4,9 @@
4
4
  <!-- thumbnail -->
5
5
  {% if post.image %}
6
6
  <a href="{{ site.baseurl }}{{ post.url }}"
7
- class="post-card__image">
7
+ class="post-card__image"
8
+ aria-hidden="true"
9
+ tabindex="-1">
8
10
  <img src="{{ site.baseurl }}{{ post.image }}"
9
11
  class="post-card__image-el"
10
12
  alt="{{ post.image_alt | default: post.title }}"/>
@@ -25,6 +27,6 @@
25
27
  {% include post-meta.html date=post.date reading_minutes=reading_minutes class_name="post-card__meta post-meta" %}
26
28
  {% assign tags = post.tags %}
27
29
  {% include post-tags.html %}
28
- <a class="post-card__read-link" href="{{ site.baseurl }}{{ post.url }}">{{ read_article_label }} &rarr;</a>
30
+ <a class="post-card__read-link" href="{{ site.baseurl }}{{ post.url }}" aria-label="{{ read_article_label }}: {{ post.title }}">{{ read_article_label }} &rarr;</a>
29
31
  </div>
30
32
  </article>
@@ -73,7 +73,7 @@
73
73
  <div class="post-series series-collapsible is-open" data-series-collapsible>
74
74
  <div class="post-series__header">
75
75
  <div class="post-series__heading-wrap">
76
- <span class="post-series__heading">{{ series_name }}</span>
76
+ <h2 class="post-series__heading">{{ series_name }}</h2>
77
77
  <span class="post-series__summary">{{ series_count }} {{ series_part_word }}</span>
78
78
  </div>
79
79
  <button class="series-collapsible__toggle"
@@ -125,6 +125,7 @@
125
125
  <li class="post-series__overflow-item">
126
126
  <button class="post-series__overflow-toggle"
127
127
  type="button"
128
+ aria-expanded="false"
128
129
  aria-controls="{{ list_id }}"
129
130
  data-series-overflow-group="middle"
130
131
  data-series-overflow-toggle>
@@ -141,6 +142,7 @@
141
142
  <li class="post-series__overflow-item">
142
143
  <button class="post-series__overflow-toggle"
143
144
  type="button"
145
+ aria-expanded="false"
144
146
  aria-controls="{{ list_id }}"
145
147
  data-series-overflow-group="before"
146
148
  data-series-overflow-toggle>
@@ -157,6 +159,7 @@
157
159
  <li class="post-series__overflow-item">
158
160
  <button class="post-series__overflow-toggle"
159
161
  type="button"
162
+ aria-expanded="false"
160
163
  aria-controls="{{ list_id }}"
161
164
  data-series-overflow-group="after"
162
165
  data-series-overflow-toggle>
@@ -175,7 +178,7 @@
175
178
  <li class="{{ item_class }}"{% if is_overflow_item %} data-series-overflow-item data-series-overflow-group="{{ overflow_group }}" hidden{% endif %}>
176
179
  {% if post.url == page.url %}
177
180
  <span class="post-series__link"
178
- aria-current="true">
181
+ aria-current="step">
179
182
  <span class="post-series__index" aria-hidden="true">{{ forloop.index }}</span>
180
183
  <span class="post-series__title">{{ post.title }}</span>
181
184
  </span>
@@ -0,0 +1,105 @@
1
+ {% assign canonical_url = page.url | replace: 'index.html', '' | absolute_url %}
2
+ {% assign site_name = site.title | default: '' %}
3
+ {% assign title_separator = site.theme_seo.title_separator | default: '|' %}
4
+ {% assign raw_page_title = page.seo_title | default: page.title %}
5
+ {% if raw_page_title == nil or raw_page_title == empty %}
6
+ {% if page.layout == 'blog' %}
7
+ {% assign raw_page_title = 'Blog' %}
8
+ {% elsif page.layout == 'archive' %}
9
+ {% assign raw_page_title = 'Archive' %}
10
+ {% else %}
11
+ {% assign raw_page_title = site_name %}
12
+ {% endif %}
13
+ {% endif %}
14
+ {% if raw_page_title and raw_page_title != site_name %}
15
+ {% capture meta_title %}{{ raw_page_title | strip }} {{ title_separator }} {{ site_name | strip }}{% endcapture %}
16
+ {% else %}
17
+ {% assign meta_title = site_name %}
18
+ {% endif %}
19
+ {% assign meta_title = meta_title | normalize_whitespace | strip %}
20
+ {% assign meta_description = page.description %}
21
+ {% if meta_description == nil or meta_description == empty %}
22
+ {% if page.layout == 'blog' %}
23
+ {% capture meta_description %}Browse the latest posts, notes, and writing from {{ site_name }}.{% endcapture %}
24
+ {% elsif page.layout == 'archive' %}
25
+ {% assign archive_type = page.type | default: page.collection | default: 'archive' %}
26
+ {% capture meta_description %}Browse posts in the {{ archive_type }} archive for {{ page.title }}.{% endcapture %}
27
+ {% elsif page.layout == 'page' or page.layout == 'post' %}
28
+ {% assign meta_description = page.excerpt | default: site.description %}
29
+ {% else %}
30
+ {% assign meta_description = site.description %}
31
+ {% endif %}
32
+ {% endif %}
33
+ {% assign meta_description = meta_description | strip_html | normalize_whitespace | truncate: 160 | escape %}
34
+ {% assign meta_author = page.author | default: site.author.name | default: site.theme_seo.name %}
35
+ {% assign seo_locale = page.locale | default: site.theme_seo.locale | default: site.locale | default: 'en_US' %}
36
+ {% assign default_image = site.theme_seo.default_image | default: site.social_image | default: site.favicon %}
37
+ {% assign meta_image = page.image | default: default_image %}
38
+ {% if meta_image %}
39
+ {% assign meta_image_url = meta_image | absolute_url %}
40
+ {% endif %}
41
+ {% assign twitter_card = 'summary' %}
42
+ {% if meta_image_url %}
43
+ {% assign twitter_card = 'summary_large_image' %}
44
+ {% endif %}
45
+ {% assign robots_content = page.robots | default: site.theme_seo.robots_default | default: 'index, follow' %}
46
+ {% if page.noindex %}
47
+ {% assign robots_content = 'noindex, follow' %}
48
+ {% endif %}
49
+ {% assign og_type = 'website' %}
50
+ {% if page.layout == 'post' %}
51
+ {% assign og_type = 'article' %}
52
+ {% endif %}
53
+ <title>{{ meta_title }}</title>
54
+ <meta name="description" content="{{ meta_description }}">
55
+ <meta name="author" content="{{ meta_author | escape }}">
56
+ <meta name="robots" content="{{ robots_content }}">
57
+ <link rel="canonical" href="{{ canonical_url }}">
58
+ {% if paginator.previous_page %}
59
+ <link rel="prev" href="{{ paginator.previous_page_path | absolute_url }}">
60
+ {% endif %}
61
+ {% if paginator.next_page %}
62
+ <link rel="next" href="{{ paginator.next_page_path | absolute_url }}">
63
+ {% endif %}
64
+ {% if page.keywords %}
65
+ <meta name="keywords" content="{{ page.keywords | join: ', ' | escape }}">
66
+ {% endif %}
67
+ <meta property="og:title" content="{{ meta_title }}">
68
+ <meta property="og:description" content="{{ meta_description }}">
69
+ <meta property="og:url" content="{{ canonical_url }}">
70
+ <meta property="og:site_name" content="{{ site_name | escape }}">
71
+ <meta property="og:locale" content="{{ seo_locale }}">
72
+ <meta property="og:type" content="{{ og_type }}">
73
+ {% if meta_image_url %}
74
+ <meta property="og:image" content="{{ meta_image_url }}">
75
+ {% if page.image_alt or site.theme_seo.default_image_alt %}
76
+ <meta property="og:image:alt" content="{{ page.image_alt | default: site.theme_seo.default_image_alt | escape }}">
77
+ {% endif %}
78
+ {% endif %}
79
+ {% if page.layout == 'post' %}
80
+ {% assign article_published = page.date | default: page.created_at %}
81
+ {% assign article_modified = page.last_modified_at | default: page.updated_at | default: article_published %}
82
+ {% if article_published %}
83
+ <meta property="article:published_time" content="{{ article_published | date_to_xmlschema }}">
84
+ {% endif %}
85
+ {% if article_modified %}
86
+ <meta property="article:modified_time" content="{{ article_modified | date_to_xmlschema }}">
87
+ {% endif %}
88
+ {% if meta_author %}
89
+ <meta property="article:author" content="{{ meta_author | escape }}">
90
+ {% endif %}
91
+ {% if page.tags %}
92
+ {% for tag in page.tags limit: 6 %}
93
+ <meta property="article:tag" content="{{ tag | escape }}">
94
+ {% endfor %}
95
+ {% endif %}
96
+ {% endif %}
97
+ <meta name="twitter:card" content="{{ twitter_card }}">
98
+ <meta name="twitter:title" content="{{ meta_title }}">
99
+ <meta name="twitter:description" content="{{ meta_description }}">
100
+ {% if site.theme_seo.twitter_site %}
101
+ <meta name="twitter:site" content="{{ site.theme_seo.twitter_site }}">
102
+ {% endif %}
103
+ {% if meta_image_url %}
104
+ <meta name="twitter:image" content="{{ meta_image_url }}">
105
+ {% endif %}
@@ -0,0 +1,74 @@
1
+ {% assign search_placeholder = site.theme_text.search_placeholder | default: "Search" %}
2
+ {% assign search_clear_label = site.theme_text.search_clear_label | default: "Clear search" %}
3
+ {% assign search_submit_label = site.theme_text.search_submit_label | default: "Search site content" %}
4
+ {% assign search_idle_text = site.theme_text.search_idle_text | default: "Start typing to search the site." %}
5
+ {% assign search_too_short_text = site.theme_text.search_too_short_text | default: "Type at least %d characters to search." %}
6
+ {% assign search_loading_text = site.theme_text.search_loading_text | default: "Loading search index..." %}
7
+ {% assign search_empty_text = site.theme_text.search_empty_text | default: "No results found." %}
8
+ {% assign search_error_text = site.theme_text.search_error_text | default: "Search is unavailable right now." %}
9
+ {% assign variant = include.variant | default: "desktop" %}
10
+ {% assign max_results = site.theme_search.max_results | default: 8 %}
11
+ {% assign min_query_length = site.theme_search.min_query_length | default: 2 %}
12
+ {% assign content_preview_length = site.theme_search.content_preview_length | default: 140 %}
13
+ {% assign root_class = "site-search" %}
14
+ {% if variant == "mobile" %}
15
+ {% assign root_class = root_class | append: " site-search--mobile" %}
16
+ {% else %}
17
+ {% assign root_class = root_class | append: " site-search--desktop" %}
18
+ {% endif %}
19
+ {% assign input_id = "site-search-input-" | append: variant %}
20
+ {% assign panel_id = "site-search-panel-" | append: variant %}
21
+ {% assign status_id = "site-search-status-" | append: variant %}
22
+ {% assign results_label = site.theme_text.search_results_label | default: "Search results" %}
23
+
24
+ <section class="{{ root_class }}"
25
+ aria-label="Site search"
26
+ data-search-root
27
+ data-search-url="{{ '/assets/search.json' | relative_url }}"
28
+ data-search-max-results="{{ max_results }}"
29
+ data-search-min-query-length="{{ min_query_length }}"
30
+ data-search-content-preview-length="{{ content_preview_length }}"
31
+ data-search-idle-text="{{ search_idle_text }}"
32
+ data-search-too-short-text="{{ search_too_short_text }}"
33
+ data-search-loading-text="{{ search_loading_text }}"
34
+ data-search-empty-text="{{ search_empty_text }}"
35
+ data-search-error-text="{{ search_error_text }}">
36
+ <form class="site-search__form" role="search" action="{{ '/assets/search.json' | relative_url }}" onsubmit="return false;">
37
+ <label class="site-search__label" for="{{ input_id }}">Search site content</label>
38
+ <div class="site-search__field-wrap">
39
+ <ion-icon class="site-search__icon" name="search-outline" aria-hidden="true"></ion-icon>
40
+ <input id="{{ input_id }}"
41
+ class="site-search__input"
42
+ type="search"
43
+ name="q"
44
+ placeholder="{{ search_placeholder }}"
45
+ autocomplete="off"
46
+ spellcheck="false"
47
+ aria-controls="{{ panel_id }}"
48
+ aria-expanded="false"
49
+ aria-haspopup="list"
50
+ aria-autocomplete="list"
51
+ aria-describedby="{{ status_id }}"
52
+ data-search-input>
53
+ <button type="button"
54
+ class="site-search__clear"
55
+ aria-label="{{ search_clear_label }}"
56
+ data-search-clear
57
+ hidden>
58
+ <span aria-hidden="true">Clear</span>
59
+ </button>
60
+ <button type="submit" class="site-search__submit" aria-label="{{ search_submit_label }}">
61
+ <ion-icon name="search-outline" aria-hidden="true"></ion-icon>
62
+ </button>
63
+ </div>
64
+ </form>
65
+
66
+ <div id="{{ panel_id }}"
67
+ class="site-search__panel"
68
+ aria-label="{{ results_label }}"
69
+ data-search-panel
70
+ hidden>
71
+ <p id="{{ status_id }}" class="site-search__status" role="status" aria-live="polite" data-search-status>{{ search_idle_text }}</p>
72
+ <ul class="site-search__results" data-search-results></ul>
73
+ </div>
74
+ </section>
@@ -0,0 +1,119 @@
1
+ {% assign canonical_url = page.url | replace: 'index.html', '' | absolute_url %}
2
+ {% assign meta_description = page.description | default: page.excerpt | default: site.description | strip_html | normalize_whitespace | truncate: 160 %}
3
+ {% assign site_name = site.title | default: '' %}
4
+ {% assign seo_type = site.theme_seo.type | default: 'Person' %}
5
+ {% assign seo_name = site.theme_seo.name | default: site.author.name | default: site_name %}
6
+ {% assign default_image = site.theme_seo.default_image | default: site.social_image | default: site.favicon %}
7
+ {% assign meta_image = page.image | default: default_image %}
8
+ {% if meta_image %}
9
+ {% assign meta_image_url = meta_image | absolute_url %}
10
+ {% endif %}
11
+ {% assign publisher_logo = site.theme_seo.logo | default: site.favicon %}
12
+ {% if publisher_logo %}
13
+ {% assign publisher_logo_url = publisher_logo | absolute_url %}
14
+ {% endif %}
15
+ {% assign article_published = page.date | default: page.created_at %}
16
+ {% assign article_modified = page.last_modified_at | default: page.updated_at | default: article_published %}
17
+ {% assign breadcrumb_blog_label = site.theme_text.blog_breadcrumb_label | default: 'Blog' %}
18
+ {% capture search_term_placeholder %}{% raw %}{search_term_string}{% endraw %}{% endcapture %}
19
+ {% capture search_target %}{{ site.url }}{{ site.baseurl }}/blog/?q={{ search_term_placeholder }}{% endcapture %}
20
+ {% assign breadcrumb_items = '' | split: '' %}
21
+ {% assign breadcrumb_home = '{"@type":"ListItem","position":1,"name":"Home","item":"' | append: site.url | append: site.baseurl | append: '/"}' %}
22
+ {% assign breadcrumb_items = breadcrumb_items | push: breadcrumb_home %}
23
+ {% assign current_position = 2 %}
24
+ {% if page.layout == 'blog' %}
25
+ {% capture current_item %}{"@type":"ListItem","position":{{ current_position }},"name":"{{ page.title | default: breadcrumb_blog_label | escape }}","item":"{{ canonical_url }}"}{% endcapture %}
26
+ {% assign breadcrumb_items = breadcrumb_items | push: current_item %}
27
+ {% elsif page.layout == 'archive' %}
28
+ {% capture blog_item %}{"@type":"ListItem","position":{{ current_position }},"name":"{{ breadcrumb_blog_label | escape }}","item":"{{ '/blog' | absolute_url }}"}{% endcapture %}
29
+ {% assign breadcrumb_items = breadcrumb_items | push: blog_item %}
30
+ {% assign current_position = current_position | plus: 1 %}
31
+ {% capture current_item %}{"@type":"ListItem","position":{{ current_position }},"name":"{{ page.title | escape }}","item":"{{ canonical_url }}"}{% endcapture %}
32
+ {% assign breadcrumb_items = breadcrumb_items | push: current_item %}
33
+ {% elsif page.layout == 'post' %}
34
+ {% capture blog_item %}{"@type":"ListItem","position":{{ current_position }},"name":"{{ breadcrumb_blog_label | escape }}","item":"{{ '/blog' | absolute_url }}"}{% endcapture %}
35
+ {% assign breadcrumb_items = breadcrumb_items | push: blog_item %}
36
+ {% assign current_position = current_position | plus: 1 %}
37
+ {% capture current_item %}{"@type":"ListItem","position":{{ current_position }},"name":"{{ page.title | escape }}","item":"{{ canonical_url }}"}{% endcapture %}
38
+ {% assign breadcrumb_items = breadcrumb_items | push: current_item %}
39
+ {% elsif page.title %}
40
+ {% capture current_item %}{"@type":"ListItem","position":{{ current_position }},"name":"{{ page.title | escape }}","item":"{{ canonical_url }}"}{% endcapture %}
41
+ {% assign breadcrumb_items = breadcrumb_items | push: current_item %}
42
+ {% endif %}
43
+ {% if page.layout == 'home' or page.url == '/' %}
44
+ <script type="application/ld+json">
45
+ {
46
+ "@context": "https://schema.org",
47
+ "@type": "WebSite",
48
+ "name": {{ site_name | jsonify }},
49
+ "url": {{ site.url | append: site.baseurl | append: '/' | jsonify }},
50
+ "description": {{ meta_description | jsonify }},
51
+ {% if site.theme_search.enabled != false %}
52
+ "potentialAction": {
53
+ "@type": "SearchAction",
54
+ "target": {{ search_target | jsonify }},
55
+ "query-input": "required name=search_term_string"
56
+ },
57
+ {% endif %}
58
+ "publisher": {
59
+ "@type": {{ seo_type | jsonify }},
60
+ "name": {{ seo_name | jsonify }}{% if publisher_logo_url %},
61
+ "logo": {
62
+ "@type": "ImageObject",
63
+ "url": {{ publisher_logo_url | jsonify }}
64
+ }{% endif %}{% if site.theme_seo.same_as %},
65
+ "sameAs": {{ site.theme_seo.same_as | jsonify }}{% endif %}
66
+ }
67
+ }
68
+ </script>
69
+ {% endif %}
70
+ {% if page.layout == 'post' %}
71
+ <script type="application/ld+json">
72
+ {
73
+ "@context": "https://schema.org",
74
+ "@type": "BlogPosting",
75
+ "headline": {{ page.title | jsonify }},
76
+ "description": {{ meta_description | jsonify }},
77
+ "url": {{ canonical_url | jsonify }},
78
+ "mainEntityOfPage": {
79
+ "@type": "WebPage",
80
+ "@id": {{ canonical_url | jsonify }}
81
+ }{% if meta_image_url %},
82
+ "image": [{{ meta_image_url | jsonify }}]{% endif %}{% if article_published %},
83
+ "datePublished": {{ article_published | date_to_xmlschema | jsonify }}{% endif %}{% if article_modified %},
84
+ "dateModified": {{ article_modified | date_to_xmlschema | jsonify }}{% endif %},
85
+ "author": {
86
+ "@type": {{ seo_type | jsonify }},
87
+ "name": {{ seo_name | jsonify }}
88
+ },
89
+ "publisher": {
90
+ "@type": {{ seo_type | jsonify }},
91
+ "name": {{ seo_name | jsonify }}{% if publisher_logo_url %},
92
+ "logo": {
93
+ "@type": "ImageObject",
94
+ "url": {{ publisher_logo_url | jsonify }}
95
+ }{% endif %}
96
+ }
97
+ }
98
+ </script>
99
+ {% endif %}
100
+ {% if page.layout == 'blog' or page.layout == 'archive' %}
101
+ <script type="application/ld+json">
102
+ {
103
+ "@context": "https://schema.org",
104
+ "@type": "CollectionPage",
105
+ "name": {{ page.title | default: breadcrumb_blog_label | jsonify }},
106
+ "description": {{ meta_description | jsonify }},
107
+ "url": {{ canonical_url | jsonify }}
108
+ }
109
+ </script>
110
+ {% endif %}
111
+ {% if site.theme_seo.enable_breadcrumbs != false and breadcrumb_items.size > 1 %}
112
+ <script type="application/ld+json">
113
+ {
114
+ "@context": "https://schema.org",
115
+ "@type": "BreadcrumbList",
116
+ "itemListElement": [{{ breadcrumb_items | join: ',' }}]
117
+ }
118
+ </script>
119
+ {% endif %}
@@ -1,6 +1,12 @@
1
1
  ---
2
2
  layout: default
3
3
  ---
4
+ {% if page.description == nil or page.description == empty %}
5
+ {% assign archive_type = page.type | default: page.collection | default: 'archive' %}
6
+ {% capture page_description %}Browse posts in the {{ archive_type }} archive for {{ page.title }}.{% endcapture %}
7
+ {% else %}
8
+ {% assign page_description = page.description %}
9
+ {% endif %}
4
10
  <article class="archive-hub">
5
11
  {% include archive-header.html %}
6
12
 
data/_layouts/blog.html CHANGED
@@ -1,6 +1,11 @@
1
1
  ---
2
2
  layout: default
3
3
  ---
4
+ {% if page.description == nil or page.description == empty %}
5
+ {% assign page_description = "Browse the latest posts, notes, and writing from " | append: site.title | append: "." %}
6
+ {% else %}
7
+ {% assign page_description = page.description %}
8
+ {% endif %}
4
9
  <article class="blog-hub">
5
10
  {% include page-header.html %}
6
11
 
@@ -1,40 +1,17 @@
1
1
  <!doctype html>
2
- <html lang="en">
2
+ <html lang="{{ page.lang | default: site.lang | default: 'en' }}">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport"
6
6
  content="width=device-width, initial-scale=1.0">
7
7
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
8
- <title>{% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %}</title>
9
- <meta name="description"
10
- content="{{ page.excerpt | default: site.description | strip_html | normalize_whitespace | truncate: 160 | escape }}">
11
-
8
+ {% include seo-meta.html %}
12
9
 
13
10
  <link rel="preconnect" href="https://fonts.googleapis.com">
14
11
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
- <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&display=swap"
16
- rel="stylesheet">
17
12
  <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&family=Source+Serif+4:opsz,wght@8..60,400;8..60,500;8..60,700&display=swap"
18
13
  rel="stylesheet">
19
- <style>
20
- :root {
21
- --color-bg: {{ site.theme_style.background | default: "#eef4ff" }};
22
- --color-surface: {{ site.theme_style.surface | default: "#ffffff" }};
23
- --color-text: {{ site.theme_style.text | default: "#0f172a" }};
24
- --color-muted: {{ site.theme_style.muted | default: "#475569" }};
25
- --color-border: {{ site.theme_style.border | default: "#c9d8f2" }};
26
- --color-brand: {{ site.theme_style.accent | default: "#3b82f6" }};
27
- --color-brand-strong: {{ site.theme_style.accent_strong | default: "#2563eb" }};
28
- --color-brand-soft: {{ site.theme_style.accent_soft | default: "#dbeafe" }};
29
- --color-brand-surface: {{ site.theme_style.accent_surface | default: "#eff6ff" }};
30
- --color-success: {{ site.theme_style.success | default: "#16a34a" }};
31
- --color-info: {{ site.theme_style.info | default: "#2563eb" }};
32
- --color-warning: {{ site.theme_style.warning | default: "#d97706" }};
33
- --color-danger: {{ site.theme_style.danger | default: "#dc2626" }};
34
- }
35
- </style>
36
14
 
37
- <link rel="canonical" href="{{ page.url | replace:'index.html', '' | absolute_url }}">
38
15
  <link rel="stylesheet" href="{{ '/assets/css/main.css?v=' | append: site.github.build_revision | relative_url }}">
39
16
  {% if site.favicon %}
40
17
  <link rel="icon" type="image/png" href="{{ site.favicon | relative_url }}">
@@ -43,16 +20,14 @@
43
20
  {% include math.html %}
44
21
  {% endif %}
45
22
 
46
- {% if page.layout == 'post' %}
47
- {% include social-media-meta.html %}
48
- {% endif %}
23
+ {% include structured-data.html %}
49
24
 
50
25
  </head>
51
26
  <body class="theme-body">
52
27
  <a class="skip-link" href="#main-content">Skip to content</a>
53
28
  <div class="theme-shell">
54
29
  {% include header.html %}
55
- <main id="main-content">
30
+ <main id="main-content" tabindex="-1">
56
31
  {{ content }}
57
32
  </main>
58
33
  {% include footer.html %}
data/_layouts/page.html CHANGED
@@ -1,6 +1,11 @@
1
1
  ---
2
2
  layout: default
3
3
  ---
4
+ {% if page.description == nil or page.description == empty %}
5
+ {% assign page_description = page.excerpt | default: site.description | strip_html | normalize_whitespace | truncate: 160 %}
6
+ {% else %}
7
+ {% assign page_description = page.description %}
8
+ {% endif %}
4
9
  <article class="page-article">
5
10
  <header class="page-article__header">
6
11
  <div class="page-article__header-layout">
data/_layouts/post.html CHANGED
@@ -1,6 +1,11 @@
1
1
  ---
2
2
  layout: default
3
3
  ---
4
+ {% if page.description == nil or page.description == empty %}
5
+ {% assign page_description = page.excerpt | default: site.description | strip_html | normalize_whitespace | truncate: 160 %}
6
+ {% else %}
7
+ {% assign page_description = page.description %}
8
+ {% endif %}
4
9
  {% if site.theme_features.reading_progress != false %}
5
10
  {% include reading-progress.html %}
6
11
  {% endif %}
@@ -1,20 +1,3 @@
1
- :root {
2
- --color-bg: #eef4ff;
3
- --color-surface: #ffffff;
4
- --color-text: #0f172a;
5
- --color-muted: #475569;
6
- --color-border: #c9d8f2;
7
- --color-brand: #3b82f6;
8
- --color-brand-strong: #2563eb;
9
- --color-brand-soft: #dbeafe;
10
- --color-brand-surface: #eff6ff;
11
- --color-success: #16a34a;
12
- --color-info: #2563eb;
13
- --color-warning: #d97706;
14
- --color-danger: #dc2626;
15
- --color-shadow: rgba(17, 24, 39, 0.08);
16
- }
17
-
18
1
  .theme-body {
19
2
  margin: 0;
20
3
  color: var(--color-text);
@@ -28,6 +11,18 @@
28
11
  min-height: 100vh;
29
12
  }
30
13
 
14
+ .sr-only {
15
+ position: absolute;
16
+ width: 1px;
17
+ height: 1px;
18
+ padding: 0;
19
+ margin: -1px;
20
+ overflow: hidden;
21
+ clip: rect(0, 0, 0, 0);
22
+ white-space: nowrap;
23
+ border: 0;
24
+ }
25
+
31
26
  .skip-link {
32
27
  position: absolute;
33
28
  top: -999px;
@@ -71,6 +66,7 @@
71
66
  .site-header__inner {
72
67
  display: flex;
73
68
  align-items: center;
69
+ gap: 1rem;
74
70
  padding: 1.25rem 0;
75
71
  }
76
72
 
@@ -79,6 +75,13 @@
79
75
  flex: 1 1 0;
80
76
  }
81
77
 
78
+ .site-header__actions {
79
+ display: flex;
80
+ align-items: center;
81
+ justify-content: flex-end;
82
+ gap: 0.75rem;
83
+ }
84
+
82
85
  .site-header__mobile-toggle-wrap {
83
86
  display: flex;
84
87
  justify-content: flex-end;
@@ -88,11 +91,14 @@
88
91
  display: inline-flex;
89
92
  align-items: center;
90
93
  justify-content: center;
91
- padding: 0.35rem;
94
+ min-width: 2.75rem;
95
+ min-height: 2.75rem;
96
+ padding: 0.5rem;
92
97
  border: 0;
93
98
  border-radius: 0.5rem;
94
99
  background: transparent;
95
100
  line-height: 1;
101
+ color: var(--color-text);
96
102
  }
97
103
 
98
104
  .site-header__toggle ion-icon[name="menu-outline"],
@@ -103,7 +109,18 @@
103
109
 
104
110
  .site-header__toggle:focus-visible,
105
111
  .nav-link:focus-visible,
106
- .primary-button:focus-visible {
112
+ .primary-button:focus-visible,
113
+ .secondary-button:focus-visible,
114
+ .site-logo:focus-visible,
115
+ .post-back-link:focus-visible,
116
+ .post-card__title-link:focus-visible,
117
+ .post-card__read-link:focus-visible,
118
+ .tag-pill:focus-visible,
119
+ .pagination-link:focus-visible,
120
+ .archive-header__blog-link:focus-visible,
121
+ .post-series__link:focus-visible,
122
+ .post-navigation__item:focus-visible,
123
+ .related-posts__item:focus-visible {
107
124
  outline: 3px solid color-mix(in srgb, var(--color-brand) 35%, transparent);
108
125
  outline-offset: 2px;
109
126
  }
@@ -119,6 +136,182 @@
119
136
  display: none;
120
137
  }
121
138
 
139
+ .site-search {
140
+ position: relative;
141
+ }
142
+
143
+ .site-search--desktop {
144
+ display: none;
145
+ }
146
+
147
+ .site-search__label {
148
+ position: absolute;
149
+ width: 1px;
150
+ height: 1px;
151
+ padding: 0;
152
+ margin: -1px;
153
+ overflow: hidden;
154
+ clip: rect(0, 0, 0, 0);
155
+ white-space: nowrap;
156
+ border: 0;
157
+ }
158
+
159
+ .site-search__form {
160
+ margin: 0;
161
+ }
162
+
163
+ .site-search__field-wrap {
164
+ position: relative;
165
+ display: flex;
166
+ align-items: center;
167
+ }
168
+
169
+ .site-search__icon {
170
+ position: absolute;
171
+ left: 0.9rem;
172
+ font-size: 1rem;
173
+ color: var(--color-muted);
174
+ pointer-events: none;
175
+ }
176
+
177
+ .site-search__input {
178
+ width: 100%;
179
+ min-height: 2.875rem;
180
+ padding: 0.7rem 6rem 0.7rem 2.55rem;
181
+ border: 1px solid color-mix(in srgb, var(--color-border) 85%, #ffffff 15%);
182
+ border-radius: 999px;
183
+ font: inherit;
184
+ color: var(--color-text);
185
+ background: color-mix(in srgb, var(--color-surface) 90%, var(--color-brand-soft) 10%);
186
+ transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;
187
+ }
188
+
189
+ .site-search__input::placeholder {
190
+ color: color-mix(in srgb, var(--color-muted) 72%, #ffffff 28%);
191
+ }
192
+
193
+ .site-search__input:focus {
194
+ background: var(--color-surface);
195
+ }
196
+
197
+ .site-search__input:focus-visible,
198
+ .site-search__result-link:focus-visible,
199
+ .site-search__clear:focus-visible,
200
+ .site-search__submit:focus-visible {
201
+ outline: 3px solid color-mix(in srgb, var(--color-brand) 35%, transparent);
202
+ outline-offset: 2px;
203
+ }
204
+
205
+ .site-search__clear,
206
+ .site-search__submit {
207
+ position: absolute;
208
+ top: 50%;
209
+ transform: translateY(-50%);
210
+ min-width: 2.25rem;
211
+ min-height: 2.25rem;
212
+ border: 0;
213
+ border-radius: 999px;
214
+ font: inherit;
215
+ font-size: 0.82rem;
216
+ font-weight: 700;
217
+ line-height: 1;
218
+ color: var(--color-brand);
219
+ background: transparent;
220
+ }
221
+
222
+ .site-search__clear {
223
+ right: 2.95rem;
224
+ }
225
+
226
+ .site-search__submit {
227
+ right: 0.5rem;
228
+ padding: 0.45rem 0.7rem;
229
+ color: var(--color-brand-strong);
230
+ background: color-mix(in srgb, var(--color-brand-soft) 80%, #ffffff 20%);
231
+ }
232
+
233
+ .site-search__submit:hover,
234
+ .site-search__submit:active,
235
+ .site-search__clear:hover,
236
+ .site-search__clear:active {
237
+ color: var(--color-brand-strong);
238
+ }
239
+
240
+ .site-search__panel {
241
+ position: absolute;
242
+ top: calc(100% + 0.65rem);
243
+ left: 0;
244
+ z-index: 30;
245
+ width: min(100vw - 2rem, 32rem);
246
+ padding: 0.8rem;
247
+ border: 1px solid color-mix(in srgb, var(--color-border) 85%, #ffffff 15%);
248
+ border-radius: 1rem;
249
+ background: color-mix(in srgb, var(--color-surface) 97%, var(--color-brand-soft) 3%);
250
+ box-shadow: 0 20px 50px -35px rgba(15, 23, 42, 0.55);
251
+ }
252
+
253
+ .site-search__status {
254
+ margin-bottom: 0.35rem;
255
+ font-size: 0.9rem;
256
+ color: var(--color-muted);
257
+ }
258
+
259
+ .site-search__results {
260
+ display: flex;
261
+ flex-direction: column;
262
+ gap: 0.55rem;
263
+ margin: 0;
264
+ padding: 0;
265
+ list-style: none;
266
+ }
267
+
268
+ .site-search__result-item {
269
+ margin: 0;
270
+ }
271
+
272
+ .site-search__result-link {
273
+ display: flex;
274
+ flex-direction: column;
275
+ gap: 0.25rem;
276
+ padding: 0.85rem 0.95rem;
277
+ border: 1px solid transparent;
278
+ border-radius: 0.85rem;
279
+ background: color-mix(in srgb, var(--color-brand-soft) 30%, #ffffff 70%);
280
+ transition: border-color 0.2s ease, background-color 0.2s ease;
281
+ }
282
+
283
+ .site-search__result-link:hover,
284
+ .site-search__result-link:active {
285
+ border-color: color-mix(in srgb, var(--color-brand) 24%, transparent);
286
+ background: color-mix(in srgb, var(--color-brand-soft) 45%, #ffffff 55%);
287
+ }
288
+
289
+ .site-search__result-title {
290
+ font-weight: 700;
291
+ color: var(--color-text);
292
+ }
293
+
294
+ .site-search__result-meta {
295
+ font-size: 0.82rem;
296
+ color: var(--color-brand-strong);
297
+ }
298
+
299
+ .site-search__result-snippet {
300
+ font-size: 0.92rem;
301
+ line-height: 1.55;
302
+ color: var(--color-muted);
303
+ }
304
+
305
+ .site-search--mobile {
306
+ margin-bottom: 1rem;
307
+ }
308
+
309
+ .site-search--mobile .site-search__panel {
310
+ position: static;
311
+ width: 100%;
312
+ margin-top: 0.65rem;
313
+ }
314
+
122
315
  .site-nav-list {
123
316
  display: flex;
124
317
  align-items: center;
@@ -132,7 +325,7 @@
132
325
  .nav-link {
133
326
  position: relative;
134
327
  display: inline-block;
135
- padding: 0.5rem;
328
+ padding: 0.65rem 0.5rem;
136
329
  font-size: 1rem;
137
330
  font-weight: 600;
138
331
  color: var(--color-text);
@@ -182,7 +375,7 @@
182
375
  .site-mobile-nav__list {
183
376
  display: flex;
184
377
  flex-direction: column;
185
- align-items: center;
378
+ align-items: stretch;
186
379
  margin: 0;
187
380
  padding: 0;
188
381
  }
@@ -387,6 +580,11 @@
387
580
  transform: translateY(-1px);
388
581
  }
389
582
 
583
+ .post-card:focus-within {
584
+ border-color: color-mix(in srgb, var(--color-brand) 38%, var(--color-border) 62%);
585
+ box-shadow: 0 15px 35px -24px var(--color-shadow);
586
+ }
587
+
390
588
  .post-card__image {
391
589
  position: relative;
392
590
  display: block;
@@ -644,6 +842,8 @@
644
842
  display: flex;
645
843
  align-items: center;
646
844
  justify-content: center;
845
+ min-width: 2.5rem;
846
+ min-height: 2.5rem;
647
847
  padding: 0;
648
848
  border: 0;
649
849
  background: transparent;
@@ -652,7 +852,7 @@
652
852
 
653
853
  .post-series__heading {
654
854
  display: block;
655
- margin-bottom: 0.1rem;
855
+ margin: 0 0 0.1rem;
656
856
  font-size: clamp(1.02rem, 1.6vw, 1.2rem);
657
857
  font-weight: 700;
658
858
  line-height: 1.3;
@@ -775,6 +975,7 @@
775
975
  margin: 0;
776
976
  border: 0;
777
977
  border-top: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
978
+ min-height: 2.75rem;
778
979
  padding: 0.72rem 0.95rem 0.78rem;
779
980
  color: var(--color-brand-strong);
780
981
  background: color-mix(in srgb, var(--color-brand-soft) 12%, #fff 88%);
@@ -861,6 +1062,7 @@
861
1062
  align-items: center;
862
1063
  justify-content: space-between;
863
1064
  width: 100%;
1065
+ min-height: 2.75rem;
864
1066
  padding: 0;
865
1067
  border: 0;
866
1068
  background: transparent;
@@ -1151,7 +1353,8 @@
1151
1353
 
1152
1354
  .pagination-link {
1153
1355
  display: inline-block;
1154
- padding: 0.5rem 0;
1356
+ min-height: 2.75rem;
1357
+ padding: 0.7rem 0;
1155
1358
  border-bottom: 2px solid transparent;
1156
1359
  font-weight: 600;
1157
1360
  }
@@ -1213,6 +1416,31 @@
1213
1416
  transform: translateY(-1px);
1214
1417
  }
1215
1418
 
1419
+ @media (prefers-reduced-motion: reduce) {
1420
+ .site-header,
1421
+ .site-search__input,
1422
+ .site-search__result-link,
1423
+ .nav-link,
1424
+ .primary-button,
1425
+ .secondary-button,
1426
+ .post-card,
1427
+ .post-card__image-el,
1428
+ .series-collapsible__icon,
1429
+ .comments-collapsible__icon,
1430
+ .post-navigation__item,
1431
+ .related-posts__item {
1432
+ transition: none;
1433
+ }
1434
+
1435
+ .primary-button:hover,
1436
+ .post-card:hover,
1437
+ .post-navigation__item:hover,
1438
+ .related-posts__item:hover,
1439
+ .post-card__image:hover .post-card__image-el {
1440
+ transform: none;
1441
+ }
1442
+ }
1443
+
1216
1444
  .post-navigation__item--next {
1217
1445
  text-align: right;
1218
1446
  }
@@ -1742,6 +1970,10 @@
1742
1970
  padding: 1.5rem 0;
1743
1971
  }
1744
1972
 
1973
+ .site-header__actions {
1974
+ gap: 1rem;
1975
+ }
1976
+
1745
1977
  .site-header__mobile-toggle-wrap {
1746
1978
  display: none;
1747
1979
  }
@@ -1751,6 +1983,16 @@
1751
1983
  justify-content: flex-end;
1752
1984
  }
1753
1985
 
1986
+ .site-search--desktop {
1987
+ display: block;
1988
+ flex: 0 1 19rem;
1989
+ }
1990
+
1991
+ .site-search--desktop .site-search__panel {
1992
+ left: auto;
1993
+ right: 0;
1994
+ }
1995
+
1754
1996
  .site-mobile-nav {
1755
1997
  display: none;
1756
1998
  }
data/assets/css/main.scss CHANGED
@@ -5,3 +5,20 @@ sitemap: false
5
5
 
6
6
  @charset "utf-8";
7
7
  @use "style";
8
+
9
+ :root {
10
+ --color-bg: {{ site.theme_style.background | default: "#eef4ff" }};
11
+ --color-surface: {{ site.theme_style.surface | default: "#ffffff" }};
12
+ --color-text: {{ site.theme_style.text | default: "#0f172a" }};
13
+ --color-muted: {{ site.theme_style.muted | default: "#475569" }};
14
+ --color-border: {{ site.theme_style.border | default: "#c9d8f2" }};
15
+ --color-brand: {{ site.theme_style.accent | default: "#3b82f6" }};
16
+ --color-brand-strong: {{ site.theme_style.accent_strong | default: "#2563eb" }};
17
+ --color-brand-soft: {{ site.theme_style.accent_soft | default: "#dbeafe" }};
18
+ --color-brand-surface: {{ site.theme_style.accent_surface | default: "#eff6ff" }};
19
+ --color-success: {{ site.theme_style.success | default: "#16a34a" }};
20
+ --color-info: {{ site.theme_style.info | default: "#2563eb" }};
21
+ --color-warning: {{ site.theme_style.warning | default: "#d97706" }};
22
+ --color-danger: {{ site.theme_style.danger | default: "#dc2626" }};
23
+ --color-shadow: rgba(17, 24, 39, 0.08);
24
+ }
@@ -1 +1 @@
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()})();
1
+ (function(){"use strict";let R;const It=()=>{if(typeof window>"u")return new Map;if(!R){const t=window;t.Ionicons=t.Ionicons||{},R=t.Ionicons.map=t.Ionicons.map||new Map}return R},qt=t=>{Object.keys(t).forEach(e=>{tt(e,t[e]);const n=e.replace(/([a-z0-9]|(?=[A-Z]))([A-Z0-9])/g,"$1-$2").toLowerCase();e!==n&&tt(n,t[e])})},tt=(t,e)=>{const n=It(),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.`)},Ot="ionicons",T={hydratedSelectorName:"hydrated",lazyLoad:!1,updatable:!0};var Pt=Object.defineProperty,zt=(t,e)=>{for(var n in e)Pt(t,n,{get:e[n],enumerable:!0})},S=t=>{if(t.__stencil__getHostRef)return t.__stencil__getHostRef()},Ht=(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},et=(t,e)=>e in t,C=(t,e)=>(0,console.error)(t,e),M=new Map,jt="slot-fb{display:contents}slot-fb[hidden]{display:none}",nt="http://www.w3.org/1999/xlink",v=typeof window<"u"?window:{},Ut=v.HTMLElement||class{},m={$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)},Rt=t=>Promise.resolve(t),st=(()=>{try{return new CSSStyleSheet,typeof new CSSStyleSheet().replaceSync=="function"}catch{}return!1})(),B=!1,ot=[],it=[],Bt=(t,e)=>n=>{t.push(n),B||(B=!0,m.raf(at))},rt=t=>{for(let e=0;e<t.length;e++)try{t[e](performance.now())}catch(n){C(n)}t.length=0},at=()=>{rt(ot),rt(it),(B=ot.length>0)&&m.raf(at)},D=t=>Rt().then(t),Dt=Bt(it),Wt=t=>{const e=new URL(t,m.$resourcesUrl$);return e.origin!==v.location.origin?e.href:e.pathname},W=t=>(t=typeof t,t==="object"||t==="function");function Xt(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 Zt=t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Ft={};zt(Ft,{err:()=>ct,map:()=>Gt,ok:()=>X,unwrap:()=>Yt,unwrapErr:()=>Kt});var X=t=>({isOk:!0,isErr:!1,value:t}),ct=t=>({isOk:!1,isErr:!0,value:t});function Gt(t,e){if(t.isOk){const n=e(t.value);return n instanceof Promise?n.then(s=>X(s)):X(n)}if(t.isErr){const n=t.value;return ct(n)}throw"should never get here"}var Yt=t=>{if(t.isOk)return t.value;throw t.value},Kt=t=>{if(t.isErr)return t.value;throw t.value};function hn(t){}var I;function Qt(t){var e;const n=this.attachShadow({mode:"open"});I===void 0&&(I=(e=void 0)!=null?e:null),I&&n.adoptedStyleSheets.push(I)}var x=(t,e="")=>()=>{},k=new WeakMap,Jt=(t,e,n)=>{let s=M.get(t);st&&n?(s=s||new CSSStyleSheet,typeof s=="string"?s=e:s.replaceSync(e)):s=e,M.set(t,s)},Nt=(t,e,n)=>{var s;const o=lt(e),i=M.get(o);if(!v.document)return o;if(t=t.nodeType===11?t:v.document,i)if(typeof i=="string"){t=t.head||t;let a=k.get(t),r;if(a||k.set(t,a=new Set),!a.has(o)){{r=v.document.createElement("style"),r.innerHTML=i;const l=(s=m.$nonce$)!=null?s:Xt(v.document);if(l!=null&&r.setAttribute("nonce",l),!(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(st){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+=jt),a&&a.add(o)}}else t.adoptedStyleSheets.includes(i)||t.adoptedStyleSheets.push(i);return o},Vt=t=>{const e=t.$cmpMeta$,n=t.$hostElement$,s=e.$flags$,o=x("attachStyles",e.$tagName$),i=Nt(n.shadowRoot?n.shadowRoot:n.getRootNode(),e);s&10&&(n["s-sc"]=i,n.classList.add(i+"-h")),o()},lt=(t,e)=>"sc-"+t.$tagName$,q=(t,e,...n)=>{let s=null,o=null,i=!1,a=!1;const r=[],l=d=>{for(let u=0;u<d.length;u++)s=d[u],Array.isArray(s)?l(s):s!=null&&typeof s!="boolean"&&((i=typeof t!="function"&&!W(s))&&(s=String(s)),i&&a?r[r.length-1].$text$+=s:r.push(i?Z(null,s):s),a=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(u=>d[u]).join(" "))}}const c=Z(t,null);return c.$attrs$=e,r.length>0&&(c.$children$=r),c.$key$=o,c},Z=(t,e)=>{const n={$flags$:0,$tag$:t,$text$:e,$elm$:null,$children$:null};return n.$attrs$=null,n.$key$=null,n},dt={},te=t=>t&&t.$tag$===dt,F=t=>{const e=Zt(t);return new RegExp(`(^|[^@]|@(?!supports\\s+selector\\s*\\([^{]*?${e}))(${e}\\b)`,"g")};F("::slotted"),F(":host"),F(":host-context");var ut=(t,e,n)=>t!=null&&!W(t)?e&4?t==="false"?!1:t===""||!!t:e&1?String(t):t:t,ee=(t,e,n)=>{const s=m.ce(e,n);return t.dispatchEvent(s),s},ft=(t,e,n,s,o,i,a)=>{if(n===s)return;let r=et(t,e),l=e.toLowerCase();if(e==="class"){const c=t.classList,d=ht(n);let u=ht(s);c.remove(...d.filter(f=>f&&!u.includes(f))),c.add(...u.filter(f=>f&&!d.includes(f)))}else if(e==="style"){for(const c in n)(!s||s[c]==null)&&(c.includes("-")?t.style.removeProperty(c):t.style[c]="");for(const c in s)(!n||s[c]!==n[c])&&(c.includes("-")?t.style.setProperty(c,s[c]):t.style[c]=s[c])}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):et(v,l)?e=l.slice(2):e=l[2]+e.slice(3),n||s){const c=e.endsWith(pt);e=e.replace(se,""),n&&m.rel(t,e,n,c),s&&m.ael(t,e,s,c)}}else{const c=W(s);if(r||c&&s!==null)try{if(t.tagName.includes("-"))t[e]!==s&&(t[e]=s);else{const u=s??"";e==="list"?r=!1:(n==null||t[e]!=u)&&(typeof t.__lookupSetter__(e)=="function"?t[e]=u:t.setAttribute(e,u))}}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(nt,e):t.removeAttribute(e)):(!r||i&4||o)&&!c&&t.nodeType===1&&(s=s===!0?"":s,d?t.setAttributeNS(nt,e,s):t.setAttribute(e,s))}},ne=/\s/,ht=t=>(typeof t=="object"&&t&&"baseVal"in t&&(t=t.baseVal),!t||typeof t!="string"?[]:t.split(ne)),pt="Capture",se=new RegExp(pt+"$"),gt=(t,e,n,s)=>{const o=e.$elm$.nodeType===11&&e.$elm$.host?e.$elm$.host:e.$elm$,i=t&&t.$attrs$||{},a=e.$attrs$||{};for(const r of $t(Object.keys(i)))r in a||ft(o,r,i[r],void 0,n,e.$flags$);for(const r of $t(Object.keys(a)))ft(o,r,i[r],a[r],n,e.$flags$)};function $t(t){return t.includes("ref")?[...t.filter(e=>e!=="ref"),"ref"]:t}var G,vt=!1,O=(t,e,n)=>{const s=e.$children$[n];let o=0,i,a;if(s.$text$!==null)i=s.$elm$=v.document.createTextNode(s.$text$);else{if(!v.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$=v.document.createElement(s.$tag$),gt(null,s,vt),s.$children$)for(o=0;o<s.$children$.length;++o)a=O(t,s,o),a&&i.appendChild(a)}return i["s-hn"]=G,i},yt=(t,e,n,s,o,i)=>{let a=t,r;for(a.shadowRoot&&a.tagName===G&&(a=a.shadowRoot);o<=i;++o)s[o]&&(r=O(null,n,o),r&&(s[o].$elm$=r,z(a,r,e)))},mt=(t,e,n)=>{for(let s=e;s<=n;++s){const o=t[s];if(o){const i=o.$elm$;wt(o),i&&i.remove()}}},oe=(t,e,n,s,o=!1)=>{let i=0,a=0,r=0,l=0,c=e.length-1,d=e[0],u=e[c],f=s.length-1,h=s[0],g=s[f],$,p;for(;i<=c&&a<=f;)if(d==null)d=e[++i];else if(u==null)u=e[--c];else if(h==null)h=s[++a];else if(g==null)g=s[--f];else if(P(d,h,o))E(d,h,o),d=e[++i],h=s[++a];else if(P(u,g,o))E(u,g,o),u=e[--c],g=s[--f];else if(P(d,g,o))E(d,g,o),z(t,d.$elm$,u.$elm$.nextSibling),d=e[++i],g=s[--f];else if(P(u,h,o))E(u,h,o),z(t,u.$elm$,d.$elm$),u=e[--c],h=s[++a];else{for(r=-1,l=i;l<=c;++l)if(e[l]&&e[l].$key$!==null&&e[l].$key$===h.$key$){r=l;break}r>=0?(p=e[r],p.$tag$!==h.$tag$?$=O(e&&e[a],n,r):(E(p,h,o),e[r]=void 0,$=p.$elm$),h=s[++a]):($=O(e&&e[a],n,a),h=s[++a]),$&&z(d.$elm$.parentNode,$,d.$elm$)}i>c?yt(t,s[f+1]==null?null:s[f+1].$elm$,n,s,a,f):a>f&&mt(e,i,c)},P=(t,e,n=!1)=>t.$tag$===e.$tag$?n?(n&&!t.$key$&&e.$key$&&(t.$key$=e.$key$),!0):t.$key$===e.$key$:!1,E=(t,e,n=!1)=>{const s=e.$elm$=t.$elm$,o=t.$children$,i=e.$children$,a=e.$text$;a===null?(gt(t,e,vt),o!==null&&i!==null?oe(s,o,e,i,n):i!==null?(t.$text$!==null&&(s.textContent=""),yt(s,null,e,i,0,i.length-1)):!n&&T.updatable&&o!==null&&mt(o,0,o.length-1)):t.$text$!==a&&(s.data=a)},wt=t=>{t.$attrs$&&t.$attrs$.ref&&t.$attrs$.ref(null),t.$children$&&t.$children$.map(wt)},z=(t,e,n)=>t?.insertBefore(e,n),ie=(t,e,n=!1)=>{const s=t.$hostElement$,o=t.$cmpMeta$,i=t.$vnode$||Z(null,null),r=te(e)?e:q(null,null,e);if(G=s.tagName,o.$attrsToReflect$&&(r.$attrs$=r.$attrs$||{},o.$attrsToReflect$.map(([l,c])=>r.$attrs$[c]=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,E(i,r,n)},St=(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()}))}},Y=(t,e)=>{if(t.$flags$|=16,t.$flags$&4){t.$flags$|=512;return}return St(t,t.$ancestorComponent$),Dt(()=>re(t,e))},re=(t,e)=>{const n=t.$hostElement$,s=x("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=A(o,"componentWillLoad",void 0,n):i=A(o,"componentWillUpdate",void 0,n),i=xt(i,()=>A(o,"componentWillRender",void 0,n)),s(),xt(i,()=>ce(t,o,e))},xt=(t,e)=>ae(t)?t.then(e).catch(n=>{console.error(n),e()}):e(),ae=t=>t instanceof Promise||t&&t.then&&typeof t.then=="function",ce=async(t,e,n)=>{var s;const o=t.$hostElement$,i=x("update",t.$cmpMeta$.$tagName$),a=o["s-rc"];n&&Vt(t);const r=x("render",t.$cmpMeta$.$tagName$);le(t,e,o,n),a&&(a.map(l=>l()),o["s-rc"]=void 0),r(),i();{const l=(s=o["s-p"])!=null?s:[],c=()=>de(t);l.length===0?c():(Promise.all(l).then(c),t.$flags$|=4,l.length=0)}},le=(t,e,n,s)=>{try{e=e.render(),t.$flags$&=-17,t.$flags$|=2,ie(t,e,s)}catch(o){C(o,t.$hostElement$)}return null},de=t=>{const e=t.$cmpMeta$.$tagName$,n=t.$hostElement$,s=x("postUpdate",e),o=n,i=t.$ancestorComponent$;A(o,"componentDidRender",void 0,n),t.$flags$&64?(A(o,"componentDidUpdate",void 0,n),s()):(t.$flags$|=64,fe(n),A(o,"componentDidLoad",void 0,n),s(),t.$onReadyResolve$(n),i||ue()),t.$onRenderResolve$&&(t.$onRenderResolve$(),t.$onRenderResolve$=void 0),t.$flags$&512&&D(()=>Y(t,!1)),t.$flags$&=-517},ue=t=>{D(()=>ee(v,"appload",{detail:{namespace:Ot}}))},A=(t,e,n,s)=>{if(t&&t[e])try{return t[e](n)}catch(o){C(o,s)}},fe=t=>{var e;return t.classList.add((e=T.hydratedSelectorName)!=null?e:"hydrated")},he=(t,e)=>S(t).$instanceValues$.get(e),bt=(t,e,n,s)=>{const o=S(t),i=t,a=o.$instanceValues$.get(e),r=o.$flags$,l=i;n=ut(n,s.$members$[e][0]);const c=Number.isNaN(a)&&Number.isNaN(n);if(n!==a&&!c){o.$instanceValues$.set(e,n);{if(s.$watchers$&&r&128){const u=s.$watchers$[e];u&&u.map(f=>{try{l[f](n,a,e)}catch(h){C(h,i)}})}if((r&18)===2){if(l.componentShouldUpdate&&l.componentShouldUpdate(n,a,e)===!1)return;Y(o,!1)}}}},pe=(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 a=Object.entries((s=e.$members$)!=null?s:{});a.map(([r,[l]])=>{if(l&31||l&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):he(this,r)},configurable:!0,enumerable:!0}),Object.defineProperty(i,r,{set(u){const f=S(this);if(d){const h=l&32?this[r]:f.$hostElement$[r];typeof h>"u"&&f.$instanceValues$.get(r)?u=f.$instanceValues$.get(r):!f.$instanceValues$.get(r)&&h&&f.$instanceValues$.set(r,h),d.apply(this,[ut(u,l)]),u=l&32?this[r]:f.$hostElement$[r],bt(this,r,u,e);return}{bt(this,r,u,e);return}}})}});{const r=new Map;i.attributeChangedCallback=function(l,c,d){m.jmp(()=>{var u;const f=r.get(l);if(!(this.hasOwnProperty(f)&&T.lazyLoad)){if(i.hasOwnProperty(f)&&typeof this[f]=="number"&&this[f]==d)return;if(f==null){const g=S(this),$=g?.$flags$;if($&&!($&8)&&$&128&&d!==c){const y=this,b=(u=e.$watchers$)==null?void 0:u[l];b?.forEach(Mt=>{y[Mt]!=null&&y[Mt].call(y,d,c,l)})}return}}const h=Object.getOwnPropertyDescriptor(i,f);d=d===null&&typeof this[f]=="boolean"?!1:d,d!==this[f]&&(!h.get||h.set)&&(this[f]=d)})},t.observedAttributes=Array.from(new Set([...Object.keys((o=e.$watchers$)!=null?o:{}),...a.filter(([l,c])=>c[0]&15).map(([l,c])=>{var d;const u=c[1]||l;return r.set(u,l),c[0]&512&&((d=e.$attrsToReflect$)==null||d.push([l,u])),u})]))}}return t},kt=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=lt(n);if(!M.has(l)){const c=x("registerStyles",n.$tagName$);Jt(l,r,!!(n.$flags$&1)),c()}}}const i=e.$ancestorComponent$,a=()=>Y(e,!0);i&&i["s-rc"]?i["s-rc"].push(a):a()},ge=(t,e)=>{},$e=t=>{{const e=S(t),n=e.$cmpMeta$,s=x("connectedCallback",n.$tagName$);if(e.$flags$&1)e?.$lazyInstance$||e?.$onReadyPromise$&&e.$onReadyPromise$.then(()=>ge());else{e.$flags$|=1;{let o=t;for(;o=o.parentNode||o.host;)if(o["s-p"]){St(e,e.$ancestorComponent$=o);break}}n.$members$&&Object.entries(n.$members$).map(([o,[i]])=>{if(i&31&&t.hasOwnProperty(o)){const a=t[o];delete t[o],t[o]=a}}),T.initializeNextTick?D(()=>kt(t,e,n)):kt(t,e,n)}s()}},ve=async t=>{S(t),k.has(t)&&k.delete(t),t.shadowRoot&&k.has(t.shadowRoot)&&k.delete(t.shadowRoot)},ye=(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(){Ht(this,n)},connectedCallback(){this.__hasHostListenerAttached||(S(this),this.__hasHostListenerAttached=!0),$e(this),s&&s.call(this)},disconnectedCallback(){ve(this),o&&o.call(this)},__attachShadow(){if(!this.shadowRoot)Qt.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$,pe(t,n)};let K;const me=()=>{if(typeof window>"u")return new Map;if(!K){const t=window;t.Ionicons=t.Ionicons||{},K=t.Ionicons.map=t.Ionicons.map||new Map}return K},we=t=>{let e=Q(t.src);return e||(e=Et(t.name,t.icon,t.mode,t.ios,t.md),e?Se(e,t):t.icon&&(e=Q(t.icon),e||(e=Q(t.icon[t.mode]),e))?e:null)},Se=(t,e)=>{const n=me().get(t);if(n)return n;try{return Wt(`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)}},Et=(t,e,n,s,o)=>(n=(n&&j(n))==="ios"?"ios":"md",s&&n==="ios"?t=j(s):o&&n==="md"?t=j(o):(!t&&e&&!At(e)&&(t=e),H(t)&&(t=j(t))),!H(t)||t.trim()===""||t.replace(/[a-z]|-|\d/gi,"")!==""?null:t),Q=t=>H(t)&&(t=t.trim(),At(t))?t:null,At=t=>t.length>0&&/(\/|\.)/.test(t),H=t=>typeof t=="string",j=t=>t.toLowerCase(),xe=(t,e=[])=>{const n={};return e.forEach(s=>{t.hasAttribute(s)&&(t.getAttribute(s)!==null&&(n[s]=t.getAttribute(s)),t.removeAttribute(s))}),n},be=t=>t&&t.dir!==""?t.dir.toLowerCase()==="rtl":document?.dir.toLowerCase()==="rtl",ke=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()),_t(n))return e.innerHTML}return""},_t=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(H(n)&&n.toLowerCase().indexOf("on")===0)return!1}for(let e=0;e<t.childNodes.length;e++)if(!_t(t.childNodes[e]))return!1}return!0},Ee=t=>t.startsWith("data:image/svg+xml"),Ae=t=>t.indexOf(";utf8,")!==-1,_=new Map,Lt=new Map;let J;function N(t){return _.set(t,""),""}const _e=(t,e)=>{const n=Lt.get(t);return n||(typeof fetch<"u"&&typeof document<"u"?Ee(t)&&Ae(t)?Promise.resolve(Le(t)):Te(t,e):Promise.resolve(N(t)))};function Le(t){J||(J=new DOMParser);const n=J.parseFromString(t,"text/html").querySelector("svg");if(n)return _.set(t,n.outerHTML),n.outerHTML;throw new Error(`Could not parse svg from ${t}`)}function Te(t,e){const n=fetch(t).then(s=>s.text().then(o=>{o&&e!==!1&&(o=ke(o));const i=o||"";return _.set(t,i),i}).catch(()=>N(t))).catch(()=>N(t));return Lt.set(t,n),n}const Ce=":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)}",Me=ye(class extends Ut{constructor(){super(),this.__registerHost(),this.__attachShadow(),this.iconName=null,this.inheritedAttributes={},this.didLoadIcon=!1,this.isVisible=!1,this.mode=Ie(),this.lazy=!1,this.sanitize=!0}componentWillLoad(){this.inheritedAttributes=xe(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(a=>{a[0].isIntersecting&&(i.disconnect(),this.io=void 0,s())},{rootMargin:n});i.observe(e)}loadIcon(){if(this.isVisible){const e=we(this);e&&(_.has(e)?this.svgContent=_.get(e):_e(e,this.sanitize).then(()=>this.svgContent=_.get(e)),this.didLoadIcon=!0)}this.iconName=Et(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",a=n?(n.includes("arrow")||n.includes("chevron"))&&e!==!1:!1,r=e||a;return q(dt,Object.assign({key:"0578c899781ca145dd8205acd9670af39b57cf2e",role:"img",class:Object.assign(Object.assign({[i]:!0},qe(this.color)),{[`icon-${this.size}`]:!!this.size,"flip-rtl":r,"icon-rtl":r&&be(o)})},s),this.svgContent?q("div",{class:"icon-inner",innerHTML:this.svgContent}):q("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 Ce}},[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"]}]),Ie=()=>typeof document<"u"&&document.documentElement.getAttribute("mode")||"md",qe=t=>t?{"ion-color":!0,[`ion-color-${t}`]:!0}:null;function Oe(){if(typeof customElements>"u")return;["ion-icon"].forEach(e=>{e==="ion-icon"&&(customElements.get(e)||customElements.define(e,Me))})}const Pe=Oe,ze="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>",He="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>",je="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>",Ue="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>",Re="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>",Be="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>",De="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>",We="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' class='ionicon'><path d='M221.09 64a157.09 157.09 0 1 0 157.09 157.09A157.1 157.1 0 0 0 221.09 64Z' stroke-miterlimit='10' class='ionicon-fill-none ionicon-stroke-width'/><path d='M338.29 338.29 448 448' stroke-linecap='round' stroke-miterlimit='10' class='ionicon-fill-none ionicon-stroke-width'/></svg>",Xe="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>",Ze="menu-outline",Fe="close",Ge=()=>{const t=document.querySelector(".site-header__toggle");if(!t)return;const e=document.querySelector(t.dataset.target);if(!e)return;const n=t.querySelector(".sr-only"),s=t.dataset.openLabel||"Open navigation menu",o=t.dataset.closeLabel||"Close navigation menu",i=r=>{t.setAttribute("aria-expanded",r?"true":"false"),t.setAttribute("aria-label",r?o:s),n&&(n.textContent=r?o:s);const l=t.querySelector("ion-icon");l&&(l.name=r?Fe:Ze),e.hidden=!r,e.classList.toggle("is-hidden",!r)},a=()=>{e.hidden||i(!1)};i(!1),t.addEventListener("click",()=>{const l=!(t.getAttribute("aria-expanded")==="true");if(i(l),l){const c=e.querySelector('a, button, input, [tabindex]:not([tabindex="-1"])');c&&c.focus();return}t.focus()}),document.addEventListener("click",r=>{const l=e.contains(r.target),c=t.contains(r.target);!l&&!c&&a()}),document.addEventListener("keydown",r=>{if(r.key==="Escape"){const l=!e.hidden;a(),l&&t.focus()}})},Ye={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"},Ke=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(Ye)){const o=t.dataset[`giscus${n.charAt(0).toUpperCase()}${n.slice(1)}`];o&&e.setAttribute(s,o)}t.append(e),t.dataset.giscusLoaded="true"},Qe=()=>{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 a=!(n.getAttribute("aria-expanded")==="true");n.setAttribute("aria-expanded",a?"true":"false"),e.classList.toggle("is-open",a),s.hidden=!a,a&&Ke(o)})})},Je=()=>{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})},Ne=()=>{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 a=n.getAttribute("aria-expanded")==="true";e.classList.toggle("is-open",a),s.hidden=!a};o(),n.addEventListener("click",()=>{const a=n.getAttribute("aria-expanded")==="true";n.setAttribute("aria-expanded",a?"false":"true"),o()});const i=e.querySelectorAll("[data-series-overflow-toggle]");i.length&&i.forEach(a=>{a.addEventListener("click",()=>{const r=a.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}),a.setAttribute("aria-expanded","true"),a.hidden=!0})})})},Ve=()=>{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,a=window.scrollY,r=Math.max(o-i,1),c=Math.min(Math.max(a-s,0),r)/r*100;t.style.transform=`scaleX(${c/100})`};n(),window.addEventListener("scroll",n,{passive:!0}),window.addEventListener("resize",n)},tn="[data-search-root]";let U;const w=t=>(t||"").toString().normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9\s-]/g," ").replace(/\s+/g," ").trim(),en=t=>w(t).split(" ").filter(e=>e.length>0),nn=t=>[...new Set(en(t))],sn=(t,e)=>{const n=t.date?Date.parse(t.date):0,s=e.date?Date.parse(e.date):0;return Number.isNaN(n)||Number.isNaN(s)?0:s-n},on=t=>{const e=t.title||"",n=t.content||"",s=Array.isArray(t.tags)?t.tags:[],o=Array.isArray(t.categories)?t.categories:[];return{...t,title:e,content:n,tags:s,categories:o,normalizedTitle:w(e),normalizedContent:w(n),normalizedTags:s.map(w).filter(Boolean),normalizedCategories:o.map(w).filter(Boolean)}},rn=async t=>(U||(U=fetch(t,{headers:{Accept:"application/json"}}).then(e=>{if(!e.ok)throw new Error(`Search index request failed with ${e.status}`);return e.json()}).then(e=>e.map(on)).catch(e=>{throw U=void 0,e})),U),an=(t,e,n)=>{let s=0;t.normalizedTitle.includes(e)&&(s+=140),t.normalizedContent.includes(e)&&(s+=30),n.forEach(i=>{t.normalizedTitle.includes(i)&&(s+=60),t.normalizedTags.some(a=>a.includes(i))&&(s+=30),t.normalizedCategories.some(a=>a.includes(i))&&(s+=18),t.normalizedContent.includes(i)&&(s+=10)});const o=n.filter(i=>t.normalizedTitle.includes(i)||t.normalizedTags.some(a=>a.includes(i))||t.normalizedCategories.some(a=>a.includes(i))||t.normalizedContent.includes(i)).length;return o===0?0:(o===n.length&&(s+=24),t.type==="post"&&(s+=4),s)},cn=(t,e,n)=>{const s=w(e),o=nn(e);return!s||o.length===0?[]:t.map(i=>({searchDocument:i,score:an(i,s,o)})).filter(i=>i.score>0).sort((i,a)=>a.score-i.score||sn(i.searchDocument,a.searchDocument)).slice(0,n).map(i=>i.searchDocument)},ln=(t,e,n)=>{const s=t.replace(/\s+/g," ").trim();if(!s)return"";const o=w(e),a=w(s).indexOf(o);if(a===-1)return s.length>n?`${s.slice(0,n).trimEnd()}...`:s;const r=Math.max(a-Math.floor(n/3),0),l=Math.min(r+n,s.length),c=r>0?"...":"",d=l<s.length?"...":"";return`${c}${s.slice(r,l).trim()}${d}`},dn=t=>{const e=[];return t.type&&e.push(t.type==="post"?"Post":"Page"),t.tags.length>0&&e.push(t.tags.slice(0,2).join(", ")),e.join(" • ")},Tt=(t,e,n,s)=>{const o=t.querySelector("[data-search-results]"),i=t.querySelector("[data-search-status]");o.innerHTML="",i.textContent=s,e.forEach(a=>{const r=window.document.createElement("li");r.className="site-search__result-item";const l=window.document.createElement("a");l.className="site-search__result-link",l.href=a.url;const c=window.document.createElement("span");c.className="site-search__result-title",c.textContent=a.title,l.append(c);const d=dn(a);if(d){const h=window.document.createElement("span");h.className="site-search__result-meta",h.textContent=d,l.append(h)}const u=Number(t.dataset.searchContentPreviewLength||"140"),f=ln(a.content,n,u);if(f){const h=window.document.createElement("span");h.className="site-search__result-snippet",h.textContent=f,l.append(h)}r.append(l),o.append(r)})},Ct=t=>{const e=t.querySelector("[data-search-panel]"),n=t.querySelector("[data-search-input]");e.hidden=!1,n.setAttribute("aria-expanded","true"),e.setAttribute("aria-hidden","false")},L=t=>{const e=t.querySelector("[data-search-panel]"),n=t.querySelector("[data-search-input]");e.hidden=!0,n.setAttribute("aria-expanded","false"),e.setAttribute("aria-hidden","true")},V=(t,e)=>{const n=[...t.querySelectorAll(".site-search__result-link")];if(n.length===0)return;const s=n.findIndex(i=>i===window.document.activeElement),o=s===-1?e>0?0:n.length-1:(s+e+n.length)%n.length;n[o].focus()},un=t=>{const e=t.querySelector("[data-search-input]"),n=t.querySelector("[data-search-clear]"),s=t.querySelector(".site-search__form"),o=t.dataset.searchUrl,i=Number(t.dataset.searchMaxResults||"8"),a=Number(t.dataset.searchMinQueryLength||"2"),r=t.dataset.searchIdleText||"Start typing to search the site.",l=t.dataset.searchTooShortText||"Type at least %d characters to search.",c=t.dataset.searchLoadingText||"Loading search index...",d=t.dataset.searchEmptyText||"No results found.",u=t.dataset.searchErrorText||"Search is unavailable right now.",f=p=>{const y=t.querySelector("[data-search-status]");y.textContent=p},h=()=>{t.querySelector("[data-search-results]").innerHTML=""},g=()=>{n.hidden=e.value.length===0},$=async()=>{const p=e.value.trim();if(g(),p.length===0){h(),f(r),L(t);return}if(Ct(t),p.length<a){h(),f(l.replace("%d",`${a}`));return}f(c);try{const y=await rn(o),b=cn(y,p,i);if(b.length===0){Tt(t,[],p,d);return}Tt(t,b,p,`${b.length} result${b.length===1?"":"s"} for "${p}"`)}catch{h(),f(u)}};e.addEventListener("focus",()=>{e.value.trim().length>0&&$()}),e.addEventListener("input",()=>{$()}),e.addEventListener("keydown",p=>{p.key==="ArrowDown"&&(p.preventDefault(),t.querySelector(".site-search__result-link")&&Ct(t),V(t,1)),p.key==="Escape"&&L(t)}),t.addEventListener("keydown",p=>{if(p.key==="Escape"&&(L(t),e.focus()),p.key==="ArrowDown"&&p.target.matches(".site-search__result-link")&&(p.preventDefault(),V(t,1)),p.key==="ArrowUp"&&p.target.matches(".site-search__result-link")){if(p.preventDefault(),p.target===t.querySelector(".site-search__result-link")){e.focus();return}V(t,-1)}}),n.addEventListener("click",()=>{e.value="",g(),h(),f(r),L(t),e.focus()}),s.addEventListener("submit",p=>{p.preventDefault();const y=t.querySelector(".site-search__result-link");if(y){window.location.assign(y.href);return}$()}),window.document.addEventListener("click",p=>{t.contains(p.target)||L(t)}),L(t)},fn=()=>{const t=window.document.querySelectorAll(tn);t.length!==0&&t.forEach(un)};qt({"chevron-down-outline":ze,close:He,"logo-github":je,"logo-linkedin":Ue,"logo-twitter":Re,"logo-youtube":Be,"menu-outline":De,"search-outline":We,"time-outline":Xe}),Pe(),Ge(),Qe(),Je(),Ne(),Ve(),fn()})();
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.3.1
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mohamad Eldhemy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-03-11 00:00:00.000000000 Z
11
+ date: 2026-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -95,8 +95,11 @@ files:
95
95
  - _includes/post-tags.html
96
96
  - _includes/reading-progress.html
97
97
  - _includes/related-posts.html
98
+ - _includes/seo-meta.html
99
+ - _includes/site-search.html
98
100
  - _includes/social-media-meta.html
99
101
  - _includes/social.html
102
+ - _includes/structured-data.html
100
103
  - _includes/testimonials.html
101
104
  - _layouts/archive.html
102
105
  - _layouts/blog.html