imdhemy-jekyll-theme 1.4.0 → 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: 3cb7114b109be9daf9d9e72e0d0305088f175e3a10028a8ac0c46a4141158341
4
- data.tar.gz: 8dccf5c62b3b3e216542c12548170f3441ef730829395a88bcdbde6d55397290
3
+ metadata.gz: 8c2766f041feb77f44c69b2775ad3232f72925dd1bff3e7906f9c2f093115c6e
4
+ data.tar.gz: 8275b2d6b417f38d58932cb29303972b04d236351749a6050e217c272a74016f
5
5
  SHA512:
6
- metadata.gz: 2950f521c2af9398134e24c5726055c922a30e6a9f15bce09618fa2afa45597ee90c1389d0400ae16ecf7f56228bc914eb6eefe8a0e4ae5b825eceae1508d84a
7
- data.tar.gz: 2f176cdba50a9d7dda2843025ae99d3cae93ac8f1a23b8352e0abf5406b37fe9e5216ab78deb2df83aaee1849bec3b13450e833a0179dc453b00bceedcbc95c2
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">
@@ -5,9 +5,11 @@
5
5
  {% if site.theme_search.enabled == false %}
6
6
  {% assign search_enabled = false %}
7
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" %}
8
10
  <!-- begin logo -->
9
11
  <div class="site-header__brand">
10
- <a href="{{ site.baseurl }}/" class="site-logo">
12
+ <a href="{{ site.baseurl }}/" class="site-logo" aria-label="{{ site.title }} home">
11
13
  {{ site.title }}
12
14
  </a>
13
15
  </div>
@@ -30,7 +32,7 @@
30
32
  {% endif %}
31
33
  <li class="site-nav-list__item">
32
34
  <a href="{{ site.baseurl }}{{ nav_page.url }}"
33
- 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 %}>
34
36
  {{ nav_page.title }}
35
37
  </a>
36
38
  </li>
@@ -43,9 +45,16 @@
43
45
  {% endif %}
44
46
 
45
47
  <div class="site-header__mobile-toggle-wrap">
46
- <button type="button" class="site-header__toggle" data-target="#mobile-nav" aria-controls="mobile-nav"
47
- aria-expanded="false" aria-label="Toggle navigation menu">
48
- <ion-icon name="menu-outline"></ion-icon>
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>
49
58
  </button>
50
59
  </div>
51
60
  <!-- end right part -->
@@ -53,7 +62,8 @@
53
62
  <!-- begin mobile nav -->
54
63
  <nav id="mobile-nav"
55
64
  class="site-mobile-nav is-hidden"
56
- aria-label="Mobile navigation">
65
+ aria-label="Mobile navigation"
66
+ hidden>
57
67
  <div class="site-mobile-nav__inner">
58
68
  {% if search_enabled %}
59
69
  {% include site-search.html variant="mobile" %}
@@ -73,7 +83,7 @@
73
83
  {% endif %}
74
84
  <li class="site-mobile-nav__item">
75
85
  <a href="{{ site.baseurl }}{{ nav_page.url }}"
76
- 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 %}>
77
87
  {{ nav_page.title }}
78
88
  </a>
79
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 %}
@@ -19,8 +19,10 @@
19
19
  {% assign input_id = "site-search-input-" | append: variant %}
20
20
  {% assign panel_id = "site-search-panel-" | append: variant %}
21
21
  {% assign status_id = "site-search-status-" | append: variant %}
22
+ {% assign results_label = site.theme_text.search_results_label | default: "Search results" %}
22
23
 
23
24
  <section class="{{ root_class }}"
25
+ aria-label="Site search"
24
26
  data-search-root
25
27
  data-search-url="{{ '/assets/search.json' | relative_url }}"
26
28
  data-search-max-results="{{ max_results }}"
@@ -32,7 +34,7 @@
32
34
  data-search-empty-text="{{ search_empty_text }}"
33
35
  data-search-error-text="{{ search_error_text }}">
34
36
  <form class="site-search__form" role="search" action="{{ '/assets/search.json' | relative_url }}" onsubmit="return false;">
35
- <label class="site-search__label" for="{{ input_id }}">Search</label>
37
+ <label class="site-search__label" for="{{ input_id }}">Search site content</label>
36
38
  <div class="site-search__field-wrap">
37
39
  <ion-icon class="site-search__icon" name="search-outline" aria-hidden="true"></ion-icon>
38
40
  <input id="{{ input_id }}"
@@ -44,6 +46,8 @@
44
46
  spellcheck="false"
45
47
  aria-controls="{{ panel_id }}"
46
48
  aria-expanded="false"
49
+ aria-haspopup="list"
50
+ aria-autocomplete="list"
47
51
  aria-describedby="{{ status_id }}"
48
52
  data-search-input>
49
53
  <button type="button"
@@ -59,8 +63,12 @@
59
63
  </div>
60
64
  </form>
61
65
 
62
- <div id="{{ panel_id }}" class="site-search__panel" data-search-panel hidden>
63
- <p id="{{ status_id }}" class="site-search__status" data-search-status>{{ search_idle_text }}</p>
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>
64
72
  <ul class="site-search__results" data-search-results></ul>
65
73
  </div>
66
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;
@@ -96,11 +91,14 @@
96
91
  display: inline-flex;
97
92
  align-items: center;
98
93
  justify-content: center;
99
- padding: 0.35rem;
94
+ min-width: 2.75rem;
95
+ min-height: 2.75rem;
96
+ padding: 0.5rem;
100
97
  border: 0;
101
98
  border-radius: 0.5rem;
102
99
  background: transparent;
103
100
  line-height: 1;
101
+ color: var(--color-text);
104
102
  }
105
103
 
106
104
  .site-header__toggle ion-icon[name="menu-outline"],
@@ -111,7 +109,18 @@
111
109
 
112
110
  .site-header__toggle:focus-visible,
113
111
  .nav-link:focus-visible,
114
- .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 {
115
124
  outline: 3px solid color-mix(in srgb, var(--color-brand) 35%, transparent);
116
125
  outline-offset: 2px;
117
126
  }
@@ -167,7 +176,7 @@
167
176
 
168
177
  .site-search__input {
169
178
  width: 100%;
170
- min-height: 2.75rem;
179
+ min-height: 2.875rem;
171
180
  padding: 0.7rem 6rem 0.7rem 2.55rem;
172
181
  border: 1px solid color-mix(in srgb, var(--color-border) 85%, #ffffff 15%);
173
182
  border-radius: 999px;
@@ -198,6 +207,8 @@
198
207
  position: absolute;
199
208
  top: 50%;
200
209
  transform: translateY(-50%);
210
+ min-width: 2.25rem;
211
+ min-height: 2.25rem;
201
212
  border: 0;
202
213
  border-radius: 999px;
203
214
  font: inherit;
@@ -314,7 +325,7 @@
314
325
  .nav-link {
315
326
  position: relative;
316
327
  display: inline-block;
317
- padding: 0.5rem;
328
+ padding: 0.65rem 0.5rem;
318
329
  font-size: 1rem;
319
330
  font-weight: 600;
320
331
  color: var(--color-text);
@@ -569,6 +580,11 @@
569
580
  transform: translateY(-1px);
570
581
  }
571
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
+
572
588
  .post-card__image {
573
589
  position: relative;
574
590
  display: block;
@@ -826,6 +842,8 @@
826
842
  display: flex;
827
843
  align-items: center;
828
844
  justify-content: center;
845
+ min-width: 2.5rem;
846
+ min-height: 2.5rem;
829
847
  padding: 0;
830
848
  border: 0;
831
849
  background: transparent;
@@ -834,7 +852,7 @@
834
852
 
835
853
  .post-series__heading {
836
854
  display: block;
837
- margin-bottom: 0.1rem;
855
+ margin: 0 0 0.1rem;
838
856
  font-size: clamp(1.02rem, 1.6vw, 1.2rem);
839
857
  font-weight: 700;
840
858
  line-height: 1.3;
@@ -957,6 +975,7 @@
957
975
  margin: 0;
958
976
  border: 0;
959
977
  border-top: 1px solid color-mix(in srgb, var(--color-border) 84%, #c9d6ff 16%);
978
+ min-height: 2.75rem;
960
979
  padding: 0.72rem 0.95rem 0.78rem;
961
980
  color: var(--color-brand-strong);
962
981
  background: color-mix(in srgb, var(--color-brand-soft) 12%, #fff 88%);
@@ -1043,6 +1062,7 @@
1043
1062
  align-items: center;
1044
1063
  justify-content: space-between;
1045
1064
  width: 100%;
1065
+ min-height: 2.75rem;
1046
1066
  padding: 0;
1047
1067
  border: 0;
1048
1068
  background: transparent;
@@ -1333,7 +1353,8 @@
1333
1353
 
1334
1354
  .pagination-link {
1335
1355
  display: inline-block;
1336
- padding: 0.5rem 0;
1356
+ min-height: 2.75rem;
1357
+ padding: 0.7rem 0;
1337
1358
  border-bottom: 2px solid transparent;
1338
1359
  font-weight: 600;
1339
1360
  }
@@ -1395,6 +1416,31 @@
1395
1416
  transform: translateY(-1px);
1396
1417
  }
1397
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
+
1398
1444
  .post-navigation__item--next {
1399
1445
  text-align: right;
1400
1446
  }
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 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},Ot=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.`)},qt="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{},y={$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,y.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)&&y.raf(at)},D=t=>Rt().then(t),Dt=Bt(it),Wt=t=>{const e=new URL(t,y.$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="")=>()=>{},E=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=E.get(t),r;if(a||E.set(t,a=new Set),!a.has(o)){{r=v.document.createElement("style"),r.innerHTML=i;const l=(s=y.$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$,O=(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=y.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&&y.rel(t,e,n,c),s&&y.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,q=(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=q(t,s,o),a&&i.appendChild(a)}return i["s-hn"]=G,i},mt=(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=q(null,n,o),r&&(s[o].$elm$=r,z(a,r,e)))},yt=(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))b(d,h,o),d=e[++i],h=s[++a];else if(P(u,g,o))b(u,g,o),u=e[--c],g=s[--f];else if(P(d,g,o))b(d,g,o),z(t,d.$elm$,u.$elm$.nextSibling),d=e[++i],g=s[--f];else if(P(u,h,o))b(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$?$=q(e&&e[a],n,r):(b(p,h,o),e[r]=void 0,$=p.$elm$),h=s[++a]):($=q(e&&e[a],n,a),h=s[++a]),$&&z(d.$elm$.parentNode,$,d.$elm$)}i>c?mt(t,s[f+1]==null?null:s[f+1].$elm$,n,s,a,f):a>f&&yt(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,b=(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=""),mt(s,null,e,i,0,i.length-1)):!n&&T.updatable&&o!==null&&yt(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:O(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,b(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:qt}}))},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),kt=(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],kt(this,r,u,e);return}{kt(this,r,u,e);return}}})}});{const r=new Map;i.attributeChangedCallback=function(l,c,d){y.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 m=this,k=(u=e.$watchers$)==null?void 0:u[l];k?.forEach(Mt=>{m[Mt]!=null&&m[Mt].call(m,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},Et=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(()=>Et(t,e,n)):Et(t,e,n)}s()}},ve=async t=>{S(t),E.has(t)&&E.delete(t),t.shadowRoot&&E.has(t.shadowRoot)&&E.delete(t.shadowRoot)},me=(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 ye=()=>{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=bt(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=ye().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)}},bt=(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},ke=t=>t&&t.dir!==""?t.dir.toLowerCase()==="rtl":document?.dir.toLowerCase()==="rtl",Ee=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},be=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"?be(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=Ee(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=me(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=bt(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 O(dt,Object.assign({key:"0578c899781ca145dd8205acd9670af39b57cf2e",role:"img",class:Object.assign(Object.assign({[i]:!0},Oe(this.color)),{[`icon-${this.size}`]:!!this.size,"flip-rtl":r,"icon-rtl":r&&ke(o)})},s),this.svgContent?O("div",{class:"icon-inner",innerHTML:this.svgContent}):O("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",Oe=t=>t?{"ion-color":!0,[`ion-color-${t}`]:!0}:null;function qe(){if(typeof customElements>"u")return;["ion-icon"].forEach(e=>{e==="ion-icon"&&(customElements.get(e)||customElements.define(e,Me))})}const Pe=qe,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>",Tt="menu-outline",Ze="close",Fe=()=>{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=Tt)}};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?Tt: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()})},Ge={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"},Ye=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(Ge)){const o=t.dataset[`giscus${n.charAt(0).toUpperCase()}${n.slice(1)}`];o&&e.setAttribute(s,o)}t.append(e),t.dataset.giscusLoaded="true"},Ke=()=>{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&&Ye(o)})})},Qe=()=>{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})},Je=()=>{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.hidden=!0})})})},Ne=()=>{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)},Ve="[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(),tn=t=>w(t).split(" ").filter(e=>e.length>0),en=t=>[...new Set(tn(t))],nn=(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},sn=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)}},on=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(sn)).catch(e=>{throw U=void 0,e})),U),rn=(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)},an=(t,e,n)=>{const s=w(e),o=en(e);return!s||o.length===0?[]:t.map(i=>({searchDocument:i,score:rn(i,s,o)})).filter(i=>i.score>0).sort((i,a)=>a.score-i.score||nn(i.searchDocument,a.searchDocument)).slice(0,n).map(i=>i.searchDocument)},cn=(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}`},ln=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(" • ")},Ct=(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=ln(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=cn(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)})},dn=t=>{const e=t.querySelector("[data-search-panel]"),n=t.querySelector("[data-search-input]");e.hidden=!1,n.setAttribute("aria-expanded","true")},L=t=>{const e=t.querySelector("[data-search-panel]"),n=t.querySelector("[data-search-input]");e.hidden=!0,n.setAttribute("aria-expanded","false")},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 m=t.querySelector("[data-search-status]");m.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(dn(t),p.length<a){h(),f(l.replace("%d",`${a}`));return}f(c);try{const m=await on(o),k=an(m,p,i);if(k.length===0){Ct(t,[],p,d);return}Ct(t,k,p,`${k.length} result${k.length===1?"":"s"}`)}catch{h(),f(u)}};e.addEventListener("focus",()=>{e.value.trim().length>0&&$()}),e.addEventListener("input",()=>{$()}),e.addEventListener("keydown",p=>{p.key==="ArrowDown"&&(p.preventDefault(),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 m=t.querySelector(".site-search__result-link");if(m){window.location.assign(m.href);return}$()}),window.document.addEventListener("click",p=>{t.contains(p.target)||L(t)})},fn=()=>{const t=window.document.querySelectorAll(Ve);t.length!==0&&t.forEach(un)};Ot({"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(),Fe(),Ke(),Qe(),Je(),Ne(),fn()})();
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.4.0
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-12 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,9 +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
98
99
  - _includes/site-search.html
99
100
  - _includes/social-media-meta.html
100
101
  - _includes/social.html
102
+ - _includes/structured-data.html
101
103
  - _includes/testimonials.html
102
104
  - _layouts/archive.html
103
105
  - _layouts/blog.html