1
0
mirror of https://github.com/cotes2020/jekyll-theme-chirpy.git synced 2026-06-22 07:48:42 +00:00

Compare commits

..

21 Commits

Author SHA1 Message Date
semantic-release-bot 152093879e chore(release): 7.6.0
## [7.6.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.5.0...v7.6.0) (2026-06-20)

### Features

* add edit this post link ([#2517](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2517)) ([6bd446c](https://github.com/cotes2020/jekyll-theme-chirpy/commit/6bd446ccdedbe37752cf24b1866e1e2dd9cb82c8))
* **theme:** persist user theme preferences ([#2756](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2756)) ([7496dd4](https://github.com/cotes2020/jekyll-theme-chirpy/commit/7496dd41fa053c4636a82027fe3fb3e38357e385))
* **ui:** optimize design of PWA update notification ([#2757](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2757)) ([5cc9dc6](https://github.com/cotes2020/jekyll-theme-chirpy/commit/5cc9dc66acb1eb9213988d3ac6de5cf5adf1a6f6))

### Bug Fixes

* **giscus:** synchronize theme state during lazy loading ([#2742](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2742)) ([ceb2a41](https://github.com/cotes2020/jekyll-theme-chirpy/commit/ceb2a41463cbb6251fa257b640990a8d9717b0bb))
* prevent Firefox from opening blank page on `mailto` links ([#2642](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2642)) ([2685b91](https://github.com/cotes2020/jekyll-theme-chirpy/commit/2685b91957d0207c2d31dab828430c78a2fcc3d0))
* **pwa:** avoid iOS status bar overlapping PWA content ([#2173](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2173)) ([3823212](https://github.com/cotes2020/jekyll-theme-chirpy/commit/38232120b729de653bfb42909a8dad047559438d))

### Improvements

* **ui:** prevent vertical flickering caused by subtitle loading ([2db0535](https://github.com/cotes2020/jekyll-theme-chirpy/commit/2db053553bcf9606fc80c4a86959d0dd25d0446a))
2026-06-20 13:35:41 +00:00
Cotes Chung 0bf1c724d8 Merge branch 'master' into production 2026-06-20 21:30:15 +08:00
Cotes Chung 2ec2036d37 chore(deps): upgrade static assets 2026-06-20 21:29:37 +08:00
Cotes Chung cd1fb15481 ci(deps): bump the gh-actions group across 2 directories with 5 updates
Updates `actions/checkout` from 6 to 7
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v7)

Updates `actions/github-script` from 8 to 9
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v8...v9)

Updates `actions/checkout` from 6 to 7
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v7)

Updates `actions/checkout` from 6 to 7
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v7)

Updates `actions/checkout` from 6 to 7
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v7)

Updates `actions/configure-pages` from 5 to 6
- [Release notes](https://github.com/actions/configure-pages/releases)
- [Commits](https://github.com/actions/configure-pages/compare/v5...v6)

Updates `actions/upload-pages-artifact` from 4 to 5
- [Release notes](https://github.com/actions/upload-pages-artifact/releases)
- [Commits](https://github.com/actions/upload-pages-artifact/compare/v4...v5)

Updates `actions/deploy-pages` from 4 to 5
- [Release notes](https://github.com/actions/deploy-pages/releases)
- [Commits](https://github.com/actions/deploy-pages/compare/v4...v5)
2026-06-20 21:26:10 +08:00
Cotes Chung 9ea9dcf930 chore(deps-dev): update dependencies
@babel/core                                 ^7.29.0  →   ^7.29.7
 @babel/preset-env                           ^7.29.0  →   ^7.29.7
 @commitlint/cli                             ^20.4.4  →   ^21.0.2
 @commitlint/config-conventional             ^20.4.4  →   ^21.0.2
 @eslint/js                                  ^10.0.0  →   ^10.0.1
 @rollup/plugin-babel                         ^7.0.0  →    ^7.1.0
 concurrently                                 ^9.2.1  →   ^10.0.3
 conventional-changelog-conventionalcommits   ^9.3.0  →    ^9.3.1
 eslint                                      ^10.0.3  →   ^10.5.0
 globals                                     ^17.4.0  →   ^17.6.0
 rollup                                      ^4.59.0  →   ^4.62.2
 semantic-release                            ^25.0.3  →   ^25.0.5
 stylelint                                   ^17.4.0  →  ^17.13.0
2026-06-20 21:22:58 +08:00
Cotes Chung 2db053553b perf(ui): prevent vertical flickering caused by subtitle loading 2026-06-20 20:23:58 +08:00
Cotes Chung 18cf79bdac refactor(ui): reduce the size of the 'close' and 'copy' buttons
- The close button in the TOC popup
- The copy button in the code block
2026-06-20 20:23:33 +08:00
Cotes Chung 5cc9dc66ac feat(ui): optimize design of PWA update notification (#2757) 2026-06-20 05:42:07 +08:00
Cotes Chung 7496dd41fa feat(theme): persist user theme preferences (#2756)
- Migrate theme persistence from `sessionStorage` to `localStorage`
- Rename theme HTML attribute to `data-bs-theme` for Bootstrap compatibility
- Trim and compile CSS according to the chosen theme mode
2026-06-17 23:20:12 +08:00
Cotes Chung ceb2a41463 fix(giscus): synchronize theme state during lazy loading (#2742)
Previously, theme switch events were lost if triggered before the
Giscus iframe was fully loaded (e.g., when deferred by lazy loading
or before the client script executed). This resulted in Giscus
rendering with the outdated initial theme once it finally appeared
in the viewport.

This commit handles these edge cases by:
1. Updating the `data-theme` attribute on the Giscus script node
   if the iframe hasn't been created yet.
2. Modifying the `theme` query parameter in the iframe's `src` URL
   if it is currently in a pending/lazy-loading state.
2026-05-23 23:00:48 +08:00
Cotes Chung 38232120b7 fix(pwa): avoid iOS status bar overlapping PWA content (#2173)
Fixes #2173
2026-05-16 14:39:58 +08:00
Cotes Chung fb3aa94c1f chore: remove funding 2026-05-16 14:37:04 +08:00
Cotes Chung 832b24729d refactor(deps): update CDN URLs to follow production best practices (#2740) 2026-05-15 15:38:08 +08:00
Cotes Chung 97a537e692 chore(deps): bump mathjax from 3.2.2 to 4.x 2026-05-15 15:22:19 +08:00
Cotes Chung 1344e90246 docs: update readme 2026-05-15 15:17:06 +08:00
Cotes Chung 2cfb4bba88 chore: update github issue template 2026-05-15 15:01:34 +08:00
Alexander Fuks 6bd446ccde feat: add edit this post link (#2517) 2026-05-06 22:31:32 +08:00
lynkos 2685b91957 fix: prevent Firefox from opening blank page on mailto links (#2642) 2026-04-10 00:29:33 +08:00
Cotes Chung 6245dec754 docs: improve readme 2026-04-04 02:08:24 +08:00
Shen Lin f20ed1c4b1 chore: ignore hidden system files and editor backups (#2704) 2026-03-28 10:44:48 +08:00
semantic-release-bot 9adb7e352b Merge branch 'production' 2026-03-15 20:14:45 +00:00
78 changed files with 825 additions and 338 deletions
-1
View File
@@ -1 +0,0 @@
ko_fi: coteschung
+1 -1
View File
@@ -53,7 +53,7 @@ body:
value: |
- Ruby: <!-- run `ruby -v` -->
- Jekyll: <!-- run `bundle exec jekyll -v` -->
- Chirpy: <!-- run `bundle info jekyll-theme-chirpy` -->
- Chirpy: <!-- run `bundle info --version jekyll-theme-chirpy` -->
validations:
required: true
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: ruby/setup-ruby@v1
with:
+1 -1
View File
@@ -31,7 +31,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
fetch-depth: 0 # for posts's lastmod
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v7
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
+1 -1
View File
@@ -11,5 +11,5 @@ jobs:
commitlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: wagoid/commitlint-github-action@v6
+1 -1
View File
@@ -16,7 +16,7 @@ jobs:
lint-js:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- name: Setup Node.js
uses: actions/setup-node@v6
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
lint-scss:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- name: Setup Node.js
uses: actions/setup-node@v6
+2 -2
View File
@@ -13,11 +13,11 @@ jobs:
steps:
- name: Checkout Code
uses: actions/checkout@v6
uses: actions/checkout@v7
- name: Check PR Content
id: intercept
uses: actions/github-script@v8
uses: actions/github-script@v9
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
+4 -4
View File
@@ -28,7 +28,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
fetch-depth: 0
# submodules: true
@@ -37,7 +37,7 @@ jobs:
- name: Setup Pages
id: pages
uses: actions/configure-pages@v5
uses: actions/configure-pages@v6
- name: Setup Ruby
uses: ruby/setup-ruby@v1
@@ -57,7 +57,7 @@ jobs:
\-\-ignore-urls "/^http:\/\/127.0.0.1/,/^http:\/\/0.0.0.0/,/^http:\/\/localhost/"
- name: Upload site artifact
uses: actions/upload-pages-artifact@v4
uses: actions/upload-pages-artifact@v5
with:
path: "_site${{ steps.pages.outputs.base_path }}"
@@ -70,4 +70,4 @@ jobs:
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v5
+5
View File
@@ -25,3 +25,8 @@ package-lock.json
# Misc
_sass/vendors
assets/js/dist
# Hidden system files
*~
.DS_Store
Thumbs.db
+33 -40
View File
@@ -6,11 +6,11 @@
A minimal, responsive, and feature-rich Jekyll theme for technical writing.
[![CI](https://img.shields.io/github/actions/workflow/status/cotes2020/jekyll-theme-chirpy/ci.yml?logo=github)][ci]&nbsp;
[![Codacy Badge](https://img.shields.io/codacy/grade/4e556876a3c54d5e8f2d2857c4f43894?logo=codacy)][codacy]&nbsp;
[![GitHub license](https://img.shields.io/github/license/cotes2020/jekyll-theme-chirpy?color=goldenrod)][license]&nbsp;
[![Gem Version](https://img.shields.io/gem/v/jekyll-theme-chirpy?&logo=RubyGems&logoColor=ghostwhite&label=gem&color=orange)][gem]&nbsp;
[![Open in Dev Containers](https://img.shields.io/badge/Dev_Containers-Open-deepskyblue?logo=linuxcontainers)][open-container]
[![CI][badge-ci]][ci]&nbsp;
[![Codacy Badge][badge-codacy]][codacy]&nbsp;
[![GitHub license][badge-license]][license]&nbsp;
[![Gem Version][badge-gem]][gem]&nbsp;
[![Open in Dev Containers][badge-open-container]][open-container]
[**Live Demo** →][demo]
@@ -20,54 +20,48 @@
## Features
- Dark Theme
- Localized UI language
- Pinned Posts on Home Page
- Hierarchical Categories
- Trending Tags
- Table of Contents
- Last Modified Date
- Syntax Highlighting
- Mathematical Expressions
- Mermaid Diagrams & Flowcharts
- Dark Mode Images
- Embed Media
- Comment Systems
- Built-in Search
- Atom Feeds
- PWA
- Web Analytics
- SEO & Performance Optimization
- **Design & UX** - Responsive layout, Dark/Light modes, Localized UI language,
and Dark mode images.
- **Content Management** - Pinned posts, Hierarchical categories, Trending tags,
Auto-generated Table of Contents, and Last modified dates.
- **Rich Text Support** - Syntax highlighting, Mathematical expressions, Mermaid
diagrams & flowcharts, and Embedded media.
- **Interactivity & Outreach** - Built-in search, Multiple comment systems, and
Atom feeds.
- **System & Optimization** - PWA support, integrated Web analytics, and
advanced SEO performance.
## Documentation
To learn how to use, develop, and upgrade the project, please refer to the [Wiki][wiki].
To learn how to use, develop, and upgrade the project, please refer to the
[Wiki][wiki].
## Contributing
Contributions (_pull requests_, _issues_, and _discussions_) are what make the open-source community such an amazing place
to learn, inspire, and create. Any contributions you make are greatly appreciated.
For details, see the "[Contributing Guidelines][contribute-guide]".
Contributions (_pull requests_, _issues_, and _discussions_) are what make the
open-source community such an amazing place to learn, inspire, and create. Any
contributions you make are greatly appreciated.
For details, please refer to our [Contributing Guidelines][contribute-guide].
## Credits
### Contributors
This project is built on the [Jekyll][jekyllrb] ecosystem and integrates a
collection of [excellent libraries][lib]. Its avatar and favicon are sourced
from [ClipartMAX][clipartmax].
Thanks to [all the contributors][contributors] involved in the development of the project!
Furthermore, thanks to everyone who contributed to the development of this project!
[![all-contributors](https://contrib.rocks/image?repo=cotes2020/jekyll-theme-chirpy&columns=16)][contributors]
<sub> — Made with [contrib.rocks](https://contrib.rocks)</sub>
### Third-Party Assets
This project is built on the [Jekyll][jekyllrb] ecosystem and some [great libraries][lib], and is developed using [VS Code][vscode] as well as tools provided by [JetBrains][jetbrains] under a non-commercial open-source software license.
The avatar and favicon for the project's website are from [ClipartMAX][clipartmax].
[![all-contributors][contributors-avatar]][contributors]
## License
This project is published under [MIT License][license].
This project is licensed under the [MIT License][license].
[badge-ci]: https://img.shields.io/github/actions/workflow/status/cotes2020/jekyll-theme-chirpy/ci.yml?logo=github
[badge-codacy]: https://img.shields.io/codacy/grade/4e556876a3c54d5e8f2d2857c4f43894?logo=codacy
[badge-license]: https://img.shields.io/github/license/cotes2020/jekyll-theme-chirpy?color=goldenrod
[badge-gem]: https://img.shields.io/gem/v/jekyll-theme-chirpy?&logo=RubyGems&logoColor=ghostwhite&label=gem&color=orange
[badge-open-container]: https://img.shields.io/badge/Dev_Containers-Open-deepskyblue?logo=linuxcontainers
[gem]: https://rubygems.org/gems/jekyll-theme-chirpy
[ci]: https://github.com/cotes2020/jekyll-theme-chirpy/actions/workflows/ci.yml?query=event%3Apush+branch%3Amaster
[codacy]: https://app.codacy.com/gh/cotes2020/jekyll-theme-chirpy/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade
@@ -79,6 +73,5 @@ This project is published under [MIT License][license].
[wiki]: https://github.com/cotes2020/jekyll-theme-chirpy/wiki
[contribute-guide]: https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/docs/CONTRIBUTING.md
[contributors]: https://github.com/cotes2020/jekyll-theme-chirpy/graphs/contributors
[contributors-avatar]: https://contrib.rocks/image?repo=cotes2020/jekyll-theme-chirpy&columns=16&max=112
[lib]: https://github.com/cotes2020/chirpy-static-assets
[vscode]: https://code.visualstudio.com/
[jetbrains]: https://www.jetbrains.com/?from=jekyll-theme-chirpy
+10
View File
@@ -108,6 +108,16 @@ social_preview_image: # string, local or CORS resources
# boolean type, the global switch for TOC in posts.
toc: true
actions:
# Display "Edit this post" action on each post page to encourage contributions.
edit_post:
enabled: false # set to true to display the "Edit this post" action.
url: "" # repository base URL, e.g. https://github.com/cotes2020/jekyll-theme-chirpy/edit/master
# Use dynamic or static URL for the edit link.
# If `static_url` is false, the post's path will be appended to the `url` above as the final edit link.
# Set to true if the URL should remain unchanged, which means each post will share the same edit link.
static_url: false # [ true | false ]
comments:
# Global switch for the post-comment system. Keeping it empty means disabled.
provider: # [disqus | utterances | giscus]
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: عذرا, الرابط التالي غير صالح أو انه يشير إلى صفحة غير موجودة.
notification:
update_found: يتوفر اصدار جديد للمحتوى.
update_found: يتوفر محتوى جديد
update: تحديث
theme:
light: فاتح
dark: داكن
system: النظام
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: دقيقة
prompt: قراءة
edit: حرر هذا المنشور
relate_posts: إقرأ المزيد
share: شارك
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Съжалявам, но на този URL адрес няма налично съдържание.
notification:
update_found: Налична е нова версия на съдържанието.
update_found: Има ново съдържание
update: Обнови
theme:
light: Светла
dark: Тъмна
system: Системна
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: мин
prompt: четиво
edit: Редактирай тази публикация
relate_posts: Още за четене
share: Споделете
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Ho sentim, hem perdut aquesta URL o apunta a alguna cosa que no existeix.
notification:
update_found: Hi ha una nova versió de contingut disponible.
update_found: Hi ha contingut nou disponible
update: Actualitzar
theme:
light: Clar
dark: Fosc
system: Sistema
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: min
prompt: " de lectura"
edit: Edita aquesta entrada
relate_posts: Entrades relacionades
share: Compartir
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Omlouváme se, adresu URL jsme špatně umístili nebo odkazuje na něco, co neexistuje.
notification:
update_found: Je k dispozici nová verze obsahu.
update_found: Je tu nový obsah
update: Aktualizace
theme:
light: Světlý
dark: Tmavý
system: Systém
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: minut
prompt: čtení
edit: Uprav tento příspěvek
relate_posts: Další čtení
share: Sdílet
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Beklager, vi har malpaceret denne URL, eller den peger på et sted, som ikke findes.
notification:
update_found: En ny version af indholdet er fundet!
update_found: Der er nyt indhold
update: Opdater
theme:
light: Lys
dark: Mørk
system: System
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: min
prompt: læsetid
edit: Rediger dette opslag
relate_posts: Læs videre
share: Del
button:
+7 -1
View File
@@ -45,9 +45,14 @@ not_found:
statement: Entschuldigung, dieser Link verweist auf keine vorhandene Ressource.
notification:
update_found: Eine neue Version ist verfügbar.
update_found: Neue Inhalte verfügbar
update: Neue Version
theme:
light: Hell
dark: Dunkel
system: System
# ----- Posts related labels -----
post:
@@ -59,6 +64,7 @@ post:
read_time:
unit: Minuten
prompt: Lesezeit
edit: Diesen Eintrag bearbeiten
relate_posts: Weiterlesen
share: Teilen
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: ސޯރީ، މި ޔޫ.އާރއެލް މަށެވެއްނެ ނުވަތަ އެކަމެއް ނުވެއެވެ.
notification:
update_found: ޔޫ ވާރޝަން ހުރިހާ.
update_found: އައު ކޮންޓެންޓެއް ފެނިއްޖެ
update: އޮޕްޑޭޓް
theme:
light: އަލި
dark: އަނދިރި
system: ސިސްޓަމް
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: މިނެޓް
prompt: އިސްކާރު
edit: މި ޕޯސްޓް އެޑިޓް ކުރު
relate_posts: އެއްޗެހި ފަހުރަށްދަން
share: ސެއާރް
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Συγνώμη, έχουμε τοποθετήσει λάθος αυτήν την διεύθυνση URL ή υποδεικνύει κάτι που δεν υπάρχει.
notification:
update_found: Υπάρχει διαθέσιμη μια νέα έκδοση του περιεχομένου.
update_found: Νέο περιεχόμενο διαθέσιμο
update: Ενημέρωση
theme:
light: Φωτεινό
dark: Σκοτεινό
system: Σύστημα
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: Λεπτά
prompt: διαβάσματος
edit: Επεξεργασία αυτής της δημοσίευσης
relate_posts: Περισσότερα
share: Κοινοποιήστε
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.
notification:
update_found: A new version of content is available.
update_found: New content available
update: Update
theme:
light: Light
dark: Dark
system: System
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: min
prompt: read
edit: Edit this post
relate_posts: Further Reading
share: Share
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Lo sentimos, hemos perdido esa URL o apunta a algo que no existe.
notification:
update_found: Hay una nueva versión de contenido disponible.
update_found: Hay contenido nuevo
update: Actualizar
theme:
light: Claro
dark: Oscuro
system: Sistema
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: min
prompt: " de lectura"
edit: Edita esta entrada
relate_posts: Lecturas adicionales
share: Compartir
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: متأسفیم، لینک زیر معتبر نیست یا به صفحه‌ای که وجود ندارد اشاره می‌کند.
notification:
update_found: نسخه جدیدی از محتوا موجود است.
update_found: محتوای جدیدی پیدا شد
update: به‌روزرسانی
theme:
light: روشن
dark: تیره
system: سیستم
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: "دقیقه "
prompt: " زمان مطالعه"
edit: ویرایش این پست
relate_posts: بیشتر بخوانید
share: اشتراک‌گذاری
button:
+7 -1
View File
@@ -45,9 +45,14 @@ not_found:
statement: Valitettavasti tällä URL-osoitteella ei ole saatavilla sisältöä.
notification:
update_found: Uusi versio sisällöstä on saatavilla.
update_found: Uutta sisältöä löytyi
update: Päivitä
theme:
light: Vaalea
dark: Tumma
system: Järjestelmä
# ----- Posts related labels -----
post:
@@ -59,6 +64,7 @@ post:
read_time:
unit: minuuttia
prompt: lukea
edit: Muokkaa tätä julkaisua
relate_posts: Jatka lukemista
share: Jaa
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Désolé, nous avons égaré cette URL ou elle pointe vers quelque chose qui n'existe pas.
notification:
update_found: Une nouvelle version du contenu est disponible.
update_found: Nouveau contenu trouvé
update: Mise à jour
theme:
light: Clair
dark: Sombre
system: Système
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: min
prompt: lire
edit: Modifier cet article
relate_posts: Autres lectures
share: Partager
button:
+7 -1
View File
@@ -47,9 +47,14 @@ not_found:
statement: Sajnáljuk, az URL-t rosszul helyeztük el, vagy valami nem létezőre mutat.
notification:
update_found: Elérhető a tartalom új verziója.
update_found: Új tartalom található
update: Frissítés
theme:
light: Világos
dark: Sötét
system: Rendszer
# ----- Posts related labels -----
post:
@@ -61,6 +66,7 @@ post:
read_time:
unit: perc
prompt: elolvasni
edit: Szerkesztés
relate_posts: További olvasnivaló
share: Megosztás
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Maaf, kami gagal menemukan URL itu atau memang mengarah ke sesuatu yang tidak ada.
notification:
update_found: Versi konten baru tersedia.
update_found: Konten baru tersedia
update: Perbarui
theme:
light: Terang
dark: Gelap
system: Sistem
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: menit
prompt: baca
edit: Sunting entri ini
relate_posts: Postingan Lainya
share: Bagikan
button:
+7 -1
View File
@@ -45,9 +45,14 @@ not_found:
statement: Ci scusiamo, non è stato possibile trovare l'URL in questione. Potrebbe puntare ad una pagina non esistente.
notification:
update_found: Nuova versione del contenuto disponibile.
update_found: Nuovi contenuti trovati
update: Aggiornamento
theme:
light: Chiaro
dark: Scuro
system: Sistema
# ----- Posts related labels -----
post:
@@ -59,6 +64,7 @@ post:
read_time:
unit: min
prompt: lettura
edit: Modifica questo post
relate_posts: Continua a leggere
share: Condividi
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: このURLは存在しないものを指し示しています。
notification:
update_found: 新しいバージョンが利用可能です。
update_found: 新しいコンテンツがあります
update: 更新
theme:
light: ライト
dark: ダーク
system: システム
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit:
prompt: で読めます
edit: この投稿を編集
relate_posts: さらに読む
share: シェア
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: 해당 URL은 존재하지 않습니다.
notification:
update_found: 버전의 콘텐츠를 사용할 수 있습니다.
update_found: 콘텐츠가 있습니다
update: 업데이트
theme:
light: 라이트
dark: 다크
system: 시스템
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit:
prompt: 읽는 시간
edit: 이 글 편집
relate_posts: 관련된 글
share: 공유하기
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: ببوورە، ئەم بەستەرە نادۆزرێتەوە یان ئاماژە بە شتێک دەکات کە بوونی نییە.
notification:
update_found: وەشانێکی نوێی ناوەڕۆک بەردەستە.
update_found: ناوەڕۆکی نوێ بەردەستە
update: نوێکردنەوە
theme:
light: ڕووناک
dark: تاریک
system: سیستەم
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: خولەک
prompt: خوێندنەوە
edit: ئەم بابەتە دەستکاری بکە
relate_posts: بابەتی پەیوەندیدار
share: بڵاوکردنەوە
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: ဝမ်းနည်းပါသည်၊ ကျွန်ုပ်တို့သည် အဆိုပါ URL ကို မှားယွင်းစွာ နေရာချထားခြင်း သို့မဟုတ် ၎င်းသည် မရှိသောအရာကို ညွှန်ပြနေပါသည်။
notification:
update_found: အကြောင်းအရာဗားရှင်းအသစ်ကို ရနိုင်ပါပြီ။
update_found: အကြောင်းအရာအသစ် တွေ့ရှိပါသည်
update: အပ်ဒိတ်
theme:
light: အလင်း
dark: အမှောင်
system: စနစ်
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: မိနစ်
prompt: ဖတ်ပါမည်
edit: ဤပို့စ်ကို တည်းဖြတ်ပါ
relate_posts: နောက်ထပ်ဖတ်ရန်
share: မျှဝေရန်
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Sorry, we hebben de URL verkeerd geplaatst of hij verwijst naar iets dat niet bestaat.
notification:
update_found: Nieuwe versie van inhoud beschikbaar.
update_found: Nieuwe inhoud gevonden
update: Update
theme:
light: Licht
dark: Donker
system: Systeem
# ----- Posts related labels -----
post:
written_by: Door
@@ -59,6 +64,7 @@ post:
read_time:
unit: min
prompt: lees
edit: Bewerk dit bericht
relate_posts: Verder Lezen
share: Deel
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: بښنه غواړو، دغه URL ناسم دی یا هغه څه ته اشاره کوي چې شتون نه لري.
notification:
update_found: نوې نسخه شتون لري.
update_found: نوې منځپانګه شتون لري
update: تازه
theme:
light: روښانه
dark: تیاره
system: سیستم
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: دقیقې
prompt: لوستل
edit: دغه لیکنه سمول
relate_posts: نوره لوستنه
share: شریکول
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Desculpe, a página não foi encontrada.
notification:
update_found: Uma nova versão do conteúdo está disponível.
update_found: Novo conteúdo encontrado
update: atualização
theme:
light: Claro
dark: Escuro
system: Sistema
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: min
prompt: " de leitura"
edit: Editar esta postagem
relate_posts: Leia também
share: Compartilhar
button:
+7 -1
View File
@@ -45,9 +45,14 @@ not_found:
statement: Извините, мы перепутали URL-адрес или он указывает на что-то несуществующее.
notification:
update_found: Доступна новая версия контента.
update_found: Найден новый контент
update: Обновить
theme:
light: Светлая
dark: Темная
system: Системная
# ----- Posts related labels -----
post:
@@ -59,6 +64,7 @@ post:
read_time:
unit: мин.
prompt: чтения
edit: Редактировать этот пост
relate_posts: Похожие посты
share: Поделиться
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Oprostite, hiperpovezava je neustrezna ali vsebina ne obstajata. #Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.
notification:
update_found: Novejša različica vsebine je na voljo. #A new version of content is available.
update_found: Nova vsebina je na voljo
update: Posodobi #Update
theme:
light: Svetla
dark: Temna
system: Sistemska
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: min
prompt: beri #read
edit: Uredi to objavo #Edit this post
relate_posts: Nadaljnje branje #Further Reading
share: Deli #Share
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Ursäkta, vi har tappat bort den här webbadressen eller så pekar den på något som inte längre finns.
notification:
update_found: Det finns en ny version av innehållet.
update_found: Nytt innehåll hittades
update: Uppdatera sidan
theme:
light: Ljust
dark: Mörkt
system: System
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: min
prompt: läsning
edit: Redigera detta inlägg
relate_posts: Mer läsning
share: Dela
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: ขออภัย เราวาง URL นั้นไว้ผิดที่ หรือมันชี้ไปยังสิ่งที่ไม่มีอยู่
notification:
update_found: มีเวอร์ชันใหม่ของเนื้อหา
update_found: พบเนื้อหาใหม่
update: อัปเดต
theme:
light: สว่าง
dark: มืด
system: ระบบ
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: นาที
prompt: อ่าน
edit: แก้ไขโพสต์นี้
relate_posts: อ่านต่อ
share: แชร์
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Üzgünüz, bu linki yanlış yerleştirdik veya var olmayan bir şeye işaret ediyor.
notification:
update_found: İçeriğin yeni bir sürümü mevcut.
update_found: Yeni içerik bulundu
update: Güncelle
theme:
light: Açık
dark: Koyu
system: Sistem
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: dakikada
prompt: okunabilir
edit: Bu gönderiyi düzenle
relate_posts: Benzer Gönderiler
share: Paylaş
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: Вибачте, це посилання вказує на ресурс, що не існує.
notification:
update_found: Доступна нова версія вмісту.
update_found: Знайдено новий вміст
update: Оновлення
theme:
light: Світла
dark: Темна
system: Системна
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: хвилин
prompt: читання
edit: Редагувати цей пост
relate_posts: Вас також може зацікавити
share: Поділитися
button:
+7 -1
View File
@@ -46,9 +46,14 @@ not_found:
statement: معذرت، یہ URL غلط ہے یا جس چیز کی طرف اشارہ کر رہا ہے وہ موجود نہیں۔
notification:
update_found: نیا مواد دستیاب ہے۔
update_found: نیا مواد مل گیا
update: اپ ڈیٹ
theme:
light: روشن
dark: تاریک
system: سسٹم
# ----- Posts related labels -----
post:
@@ -60,6 +65,7 @@ post:
read_time:
unit: منٹ
prompt: پڑھیں
edit: اس تحریر میں ترمیم کریں
relate_posts: مزید مطالعہ
share: شیئر
button:
+7 -1
View File
@@ -45,9 +45,14 @@ not_found:
statement: Xin lỗi, chúng tôi đã đặt nhầm URL hoặc đường dẫn trỏ đến một trang nào đó không tồn tại.
notification:
update_found: Đã có phiên bản mới của nội dung.
update_found: Đã tìm thấy nội dung mới
update: Cập nhật
theme:
light: Sáng
dark: Tối
system: Hệ thống
# ----- Posts related labels -----
post:
@@ -59,6 +64,7 @@ post:
read_time:
unit: phút
prompt: đọc
edit: Chỉnh sửa bài viết này
relate_posts: Bài viết liên quan
share: Chia sẻ
button:
+7 -1
View File
@@ -45,9 +45,14 @@ not_found:
statement: 抱歉,我们放错了该 URL,或者它指向了不存在的内容。
notification:
update_found: 发现新版本的内容
update_found: 发现新内容
update: 更新
theme:
light: 浅色
dark: 深色
system: 跟随系统
# ----- Posts related labels -----
post:
@@ -59,6 +64,7 @@ post:
read_time:
unit: 分钟
prompt: 阅读
edit: 编辑此文
relate_posts: 相关文章
share: 分享
button:
+7 -1
View File
@@ -45,9 +45,14 @@ not_found:
statement: 抱歉,您可能正在存取一個已被移動的 URL,或者它從未存在。
notification:
update_found: 發現新版本更新。
update_found: 發現新內容
update: 更新
theme:
light: 淺色
dark: 深色
system: 跟隨系統
# ----- Posts related labels -----
post:
@@ -59,6 +64,7 @@ post:
read_time:
unit: 分鐘
prompt: 閱讀
edit: 編輯此文
relate_posts: 相關文章
share: 分享
button:
+18 -15
View File
@@ -19,36 +19,39 @@ webfonts: https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Sour
# Libraries
bootstrap:
css: https://cdn.jsdelivr.net/npm/bootstrap@5/dist/css/bootstrap.min.css
toc:
css: https://cdn.jsdelivr.net/npm/tocbot@4.36.4/dist/tocbot.min.css
js: https://cdn.jsdelivr.net/npm/tocbot@4.36.4/dist/tocbot.min.js
css: https://cdn.jsdelivr.net/npm/tocbot@4/dist/tocbot.min.css
js: https://cdn.jsdelivr.net/npm/tocbot@4/dist/tocbot.min.js
fontawesome:
css: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@7.2.0/css/all.min.css
css: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@7/css/all.min.css
search:
js: https://cdn.jsdelivr.net/npm/simple-jekyll-search@1.10.0/dest/simple-jekyll-search.min.js
js: https://cdn.jsdelivr.net/npm/simple-jekyll-search@1/dest/simple-jekyll-search.min.js
mermaid:
js: https://cdn.jsdelivr.net/npm/mermaid@11.13.0/dist/mermaid.min.js
js: https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js
dayjs:
js:
common: https://cdn.jsdelivr.net/npm/dayjs@1.11.20/dayjs.min.js
locale: https://cdn.jsdelivr.net/npm/dayjs@1.11.20/locale/:LOCALE.js
relativeTime: https://cdn.jsdelivr.net/npm/dayjs@1.11.20/plugin/relativeTime.js
localizedFormat: https://cdn.jsdelivr.net/npm/dayjs@1.11.20/plugin/localizedFormat.js
common: https://cdn.jsdelivr.net/npm/dayjs@1/dayjs.min.js
locale: https://cdn.jsdelivr.net/npm/dayjs@1/locale/:LOCALE.js
relativeTime: https://cdn.jsdelivr.net/npm/dayjs@1/plugin/relativeTime.js
localizedFormat: https://cdn.jsdelivr.net/npm/dayjs@1/plugin/localizedFormat.js
glightbox:
css: https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css
js: https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/js/glightbox.min.js
css: https://cdn.jsdelivr.net/npm/glightbox@3/dist/css/glightbox.min.css
js: https://cdn.jsdelivr.net/npm/glightbox@3/dist/js/glightbox.min.js
lazy-polyfill:
css: https://cdn.jsdelivr.net/npm/loading-attribute-polyfill@2.1.1/dist/loading-attribute-polyfill.min.css
js: https://cdn.jsdelivr.net/npm/loading-attribute-polyfill@2.1.1/dist/loading-attribute-polyfill.umd.min.js
css: https://cdn.jsdelivr.net/npm/loading-attribute-polyfill@2/dist/loading-attribute-polyfill.min.css
js: https://cdn.jsdelivr.net/npm/loading-attribute-polyfill@2/dist/loading-attribute-polyfill.umd.min.js
clipboard:
js: https://cdn.jsdelivr.net/npm/clipboard@2.0.11/dist/clipboard.min.js
js: https://cdn.jsdelivr.net/npm/clipboard@2/dist/clipboard.min.js
mathjax:
js: https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-chtml.js
js: https://cdn.jsdelivr.net/npm/mathjax@4/tex-mml-chtml.js
+2 -2
View File
@@ -19,7 +19,7 @@
{%- comment -%} Auto switch theme {%- endcomment -%}
function reloadDisqus(event) {
if (event.source === window && event.data && event.data.id === Theme.ID) {
if (event.source === window && event.data && event.data.id === Theme.eventId) {
{%- comment -%} Disqus hasn't been loaded {%- endcomment -%}
if (typeof DISQUS === 'undefined') {
return;
@@ -33,7 +33,7 @@
addDisqus();
if (Theme.switchable) {
if (Theme.isToggleable) {
addEventListener('message', reloadDisqus);
}
+17 -7
View File
@@ -1,8 +1,8 @@
<!-- https://giscus.app/ -->
<script>
(function () {
const themeMapper = Theme.getThemeMapper('light', 'dark_dimmed');
const initTheme = themeMapper[Theme.visualState];
const themeMap = Theme.newThemeMap('light', 'dark_dimmed');
const initTheme = themeMap[Theme.resolvedTheme];
let lang = '{{ site.comments.giscus.lang | default: lang }}';
{%- comment -%} https://github.com/giscus/giscus/tree/main/locales {%- endcomment -%}
@@ -37,8 +37,8 @@
$footer.insertAdjacentElement("beforebegin", giscusNode);
addEventListener('message', (event) => {
if (event.source === window && event.data && event.data.id === Theme.ID) {
const newTheme = themeMapper[Theme.visualState];
if (event.source === window && event.data && event.data.id === Theme.eventId) {
const newTheme = themeMap[Theme.resolvedTheme];
const message = {
setConfig: {
@@ -46,9 +46,19 @@
}
};
const giscus =
document.getElementsByClassName('giscus-frame')[0].contentWindow;
giscus.postMessage({ giscus: message }, 'https://giscus.app');
const iframe = document.querySelector('.giscus-frame');
if (!iframe) {
return;
}
if (iframe.classList.contains('giscus-frame--loading')) {
let url = new URL(iframe.src);
url.searchParams.set('theme', newTheme);
iframe.src = url.toString();
}
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
});
})();
+4 -4
View File
@@ -2,8 +2,8 @@
<script>
(function () {
const origin = 'https://utteranc.es';
const themeMapper = Theme.getThemeMapper('github-light', 'github-dark');
const initTheme = themeMapper[Theme.visualState];
const themeMap = Theme.newThemeMap('github-light', 'github-dark');
const initTheme = themeMap[Theme.resolvedTheme];
let script = document.createElement('script');
script.src = 'https://utteranc.es/client.js';
@@ -22,8 +22,8 @@
{%- comment -%}
Credit to <https://github.com/utterance/utterances/issues/170#issuecomment-594036347>
{%- endcomment -%}
if (event.source === window && event.data && event.data.id === Theme.ID) {
newTheme = themeMapper[Theme.visualState];
if (event.source === window && event.data && event.data.id === Theme.eventId) {
newTheme = themeMap[Theme.resolvedTheme];
const message = {
type: 'set-theme',
+1 -3
View File
@@ -2,8 +2,6 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta
name="viewport"
content="width=device-width, user-scalable=no initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
@@ -83,7 +81,7 @@
<!-- Bootstrap -->
{% unless jekyll.environment == 'production' %}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="{{ site.data.origin.cors.bootstrap.css }}">
{% endunless %}
<!-- Theme style -->
-1
View File
@@ -67,7 +67,6 @@
{% if page.math %}
<!-- MathJax -->
<script src="{{ '/assets/js/data/mathjax.js' | relative_url }}"></script>
<script async src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6"></script>
<script id="MathJax-script" async src="{{ site.data.origin[type].mathjax.js | relative_url }}"></script>
{% endif %}
+13 -9
View File
@@ -1,24 +1,28 @@
<aside
id="notification"
class="toast"
class="toast w-auto rounded-5 text-nowrap"
role="alert"
aria-live="assertive"
aria-atomic="true"
data-bs-animation="true"
data-bs-autohide="false"
>
<div class="toast-header">
<div class="d-flex align-items-center">
<div class="toast-body ps-3">
{{- site.data.locales[include.lang].notification.update_found -}}
</div>
<button
type="button"
class="btn-close ms-auto"
class="btn btn-primary btn-sm rounded-2 py-0"
aria-label="Update"
>
{{- site.data.locales[include.lang].notification.update -}}
</button>
<button
type="button"
class="btn-close mx-3 ms-2"
data-bs-dismiss="toast"
aria-label="Close"
></button>
</div>
<div class="toast-body text-center pt-0">
<p class="px-2 mb-3">{{ site.data.locales[include.lang].notification.update_found }}</p>
<button type="button" class="btn btn-primary" aria-label="Update">
{{ site.data.locales[include.lang].notification.update }}
</button>
</div>
</aside>
+23
View File
@@ -0,0 +1,23 @@
<!-- Link to edit the post to contribute. -->
{% assign enabled = site.actions.edit_post.enabled %}
{% assign url = site.actions.edit_post.url %}
{% assign static_url = site.actions.edit_post.static_url %}
{% unless static_url %}
{% assign url = url | append: '/' | append: page.path %}
{% endunless %}
{% if enabled %}
<div class="post-edit">
{% assign edit = site.data.locales[include.lang].post.edit %}
<a
href="{{ url }}"
target="_blank"
rel="noopener"
>
<i class="fa fa-pen fa-fw me-1"></i>
<span>{{ edit }}</span>
</a>
</div>
{% endif %}
+48 -6
View File
@@ -40,11 +40,53 @@
</ul>
</nav>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
{% unless site.theme_mode %}
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
<i class="fas fa-adjust"></i>
</button>
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
{% unless site.theme_mode == 'light' or site.theme_mode == 'dark' %}
{%- capture icon_system -%}
<i class="fa-solid fa-display" data-theme-mode="system"></i>
{%- endcapture -%}
{%- capture icon_light -%}
<i class="fa-regular fa-sun" data-theme-mode="light"></i>
{%- endcapture -%}
{%- capture icon_dark -%}
<i class="fa-regular fa-moon" data-theme-mode="dark"></i>
{%- endcapture -%}
<div class="btn-group dropup">
<button
type="button"
class="btn btn-link nav-link"
aria-label="Switch Mode"
id="mode-toggle"
data-bs-toggle="dropdown"
>
{{- icon_light -}}
{{- icon_dark -}}
{{- icon_system -}}
</button>
<ul class="dropdown-menu rounded-3 mb-1 p-1">
<li>
<button class="dropdown-item d-flex align-items-center" type="button" data-theme-mode="light">
{{- icon_light -}}
{{- site.data.locales[lang].theme.light -}}
</button>
</li>
<li>
<button class="dropdown-item d-flex align-items-center" type="button" data-theme-mode="dark">
{{- icon_dark -}}
{{- site.data.locales[lang].theme.dark -}}
</button>
</li>
<li>
<button class="dropdown-item d-flex align-items-center" type="button" data-theme-mode="system">
{{- icon_system -}}
{{- site.data.locales[lang].theme.system -}}
</button>
</li>
</ul>
</div>
{% if site.data.contact.size > 0 %}
<span class="icon-border"></span>
@@ -68,7 +110,7 @@
{%- endunless -%}
{%- assign email = site.social.email | split: '@' -%}
{%- capture url -%}
javascript:location.href = 'mailto:' + ['{{ email[0] }}','{{ email[1] }}'].join('@')
javascript:void(location.href = 'mailto:' + ['{{ email[0] }}','{{ email[1] }}'].join('@'))
{%- endcapture -%}
{% when 'rss' %}
{% assign url = '/feed.xml' | relative_url %}
+7 -3
View File
@@ -32,17 +32,21 @@ export function imgPopup() {
document.querySelector('.popup.dark') === null
);
if (Theme.visualState === Theme.DARK) {
if (Theme.isDark) {
selector = darkImages;
}
let current = GLightbox({ selector: `${selector}` });
if (hasDualImages && Theme.switchable) {
if (hasDualImages && Theme.isToggleable) {
let reverse = null;
window.addEventListener('message', (event) => {
if (event.source === window && event.data && event.data.id === Theme.ID) {
if (
event.source === window &&
event.data &&
event.data.id === Theme.eventId
) {
[current, reverse] = swapImages(current, reverse);
}
});
+9 -5
View File
@@ -3,10 +3,14 @@
*/
const MERMAID = 'mermaid';
const themeMapper = Theme.getThemeMapper('default', 'dark');
const themeMap = Theme.newThemeMap('default', 'dark');
function refreshTheme(event) {
if (event.source === window && event.data && event.data.id === Theme.ID) {
if (
event.source === window &&
event.data &&
event.data.id === Theme.eventId
) {
// Re-render the SVG <https://github.com/mermaid-js/mermaid/issues/311#issuecomment-332557344>
const mermaidList = document.getElementsByClassName(MERMAID);
@@ -16,7 +20,7 @@ function refreshTheme(event) {
elem.removeAttribute('data-processed');
});
const newTheme = themeMapper[Theme.visualState];
const newTheme = themeMap[Theme.resolvedTheme];
mermaid.initialize({ theme: newTheme });
mermaid.init(null, `.${MERMAID}`);
@@ -43,7 +47,7 @@ export function loadMermaid() {
return;
}
const initTheme = themeMapper[Theme.visualState];
const initTheme = themeMap[Theme.resolvedTheme];
let mermaidConf = {
theme: initTheme
@@ -54,7 +58,7 @@ export function loadMermaid() {
mermaid.initialize(mermaidConf);
if (Theme.switchable) {
if (Theme.isToggleable) {
window.addEventListener('message', refreshTheme);
}
}
+36 -5
View File
@@ -1,15 +1,46 @@
/**
* Add listener for theme mode toggle
* Sets up the mode toggle dropdown, allowing users to switch between light, dark, and system themes.
*
* Dependencies:
* - Theme (${JS_ROOT}/theme.js)
*/
const $toggle = document.getElementById('mode-toggle');
import 'bootstrap/js/src/dropdown.js';
const ACTIVE_CLASS = 'active';
const dropdown = document.querySelector('#mode-toggle + .dropdown-menu');
const activeMode = Theme.isSystemTheme
? Theme.Mode.SYSTEM
: Theme.resolvedTheme;
export function modeWatcher() {
if (!$toggle) {
if (!Theme.isToggleable) {
return;
}
$toggle.addEventListener('click', () => {
Theme.flip();
dropdown.querySelectorAll('.dropdown-item').forEach((option) => {
const mode = option.dataset.themeMode;
if (mode === activeMode) {
option.classList.add(ACTIVE_CLASS);
return;
}
});
dropdown.addEventListener('click', (event) => {
const current = event.target.closest('.dropdown-item');
if (!current) {
return;
}
const lastActive = dropdown.querySelector(`.${ACTIVE_CLASS}`);
if (lastActive === current) {
return;
}
lastActive.classList.remove(ACTIVE_CLASS);
current.classList.add(ACTIVE_CLASS);
Theme.update(current.dataset.themeMode);
});
}
@@ -62,6 +62,7 @@ export class TocMobile {
static showPopup() {
this.lockScroll(true);
$popup.showModal();
$btnClose.blur();
const activeItem = $popup.querySelector('li.is-active-li');
activeItem.scrollIntoView({ block: 'center' });
}
+4 -4
View File
@@ -8,9 +8,9 @@ if ('serviceWorker' in navigator) {
if (register) {
const swUrl = `${baseUrl}/sw.min.js`;
const notification = document.getElementById('notification');
const btnRefresh = notification.querySelector('.toast-body>button');
const popupWindow = Toast.getOrCreateInstance(notification);
const $notification = document.getElementById('notification');
const $btnUpdate = $notification.querySelector('[aria-label="Update"]');
const popupWindow = Toast.getOrCreateInstance($notification);
navigator.serviceWorker.register(swUrl).then((registration) => {
// Restore the update window that was last manually closed by the user
@@ -28,7 +28,7 @@ if ('serviceWorker' in navigator) {
});
});
btnRefresh.addEventListener('click', () => {
$btnUpdate.addEventListener('click', () => {
if (registration.waiting) {
registration.waiting.postMessage('SKIP_WAITING');
}
+107 -89
View File
@@ -1,135 +1,153 @@
/**
* Theme management class
* A utility class that manages the site's theme mode.
*
* To reduce flickering during page load, this script should be loaded synchronously.
* Concepts:
* - Mode: dark, light, or system. The latter follows the operating system's preference.
* - Theme: The actual theme applied to the DOM, either dark or light. Determined by the mode or system preference.
*/
class Theme {
static #modeKey = 'mode';
static #modeAttr = 'data-mode';
static #darkMedia = window.matchMedia('(prefers-color-scheme: dark)');
static switchable = !document.documentElement.hasAttribute(this.#modeAttr);
/** @type {string} LocalStorage key for the selected theme mode. */
static #storageKey = 'theme';
static get DARK() {
return 'dark';
static Mode = Object.freeze({
DARK: 'dark',
LIGHT: 'light',
SYSTEM: 'system'
});
static #root = document.documentElement;
/** @type {MediaQueryList} System dark-mode preference query. */
static #mediaDark = window.matchMedia('(prefers-color-scheme: dark)');
/** @returns {string|null} The theme currently set on the DOM. */
static get #domTheme() {
return this.#root.dataset.bsTheme || null;
}
static get LIGHT() {
return 'light';
/** @returns {string|null} The theme stored on the client. */
static get #storedTheme() {
return localStorage.getItem(this.#storageKey);
}
/** @returns {string} The theme preferred by the operating system. */
static get #systemTheme() {
return this.#prefersDark ? this.Mode.DARK : this.Mode.LIGHT;
}
/** @returns {boolean} Whether the operating system prefers dark mode. */
static get #prefersDark() {
return this.#mediaDark.matches;
}
/**
* @returns {string} Theme mode identifier
*/
static get ID() {
return 'theme-mode';
}
/**
* Gets the current visual state of the theme.
* Applies a theme and optionally persists it as a user preference.
*
* @returns {string} The current visual state, either the mode if it exists,
* or the system dark mode state ('dark' or 'light').
* @param {'light'|'dark'} theme
* @param {{ persist?: boolean, domPersist?: boolean }} [options]
* - `persist`: Whether the theme is persisted in localStorage.
* - `domPersist`: Whether the theme is persisted in data attributes on the DOM.
*/
static get visualState() {
if (this.#hasMode) {
return this.#mode;
} else {
return this.#sysDark ? this.DARK : this.LIGHT;
static #apply(theme, { persist = false, domPersist = false } = {}) {
this.#root.dataset.bsTheme = theme;
if (persist) {
localStorage.setItem(this.#storageKey, theme);
}
if (domPersist || persist) {
this.#root.toggleAttribute('data-theme-persisted', true);
}
}
static get #mode() {
return (
sessionStorage.getItem(this.#modeKey) ||
document.documentElement.getAttribute(this.#modeAttr)
);
/** Removes the stored user preference. */
static #clearStorage() {
localStorage.removeItem(this.#storageKey);
this.#root.toggleAttribute('data-theme-persisted', false);
}
static get #isDarkMode() {
return this.#mode === this.DARK;
/** Broadcasts a theme change event to dependent modules. */
static #notify() {
window.postMessage({ id: this.eventId }, '*');
}
static get #hasMode() {
return this.#mode !== null;
/** @type {boolean} Whether the current page allows theme toggling. */
static isToggleable = this.#domTheme === null;
static eventId = 'theme-updated';
/** @returns {string} Resolved theme, falling back to the system preference. */
static get resolvedTheme() {
return this.#storedTheme || this.#systemTheme;
}
static get #sysDark() {
return this.#darkMedia.matches;
/** @returns {boolean} Whether the theme is determined by the system preference. */
static get isSystemTheme() {
return this.#storedTheme === null;
}
/** @returns {boolean} Whether the resolved theme is dark. */
static get isDark() {
return this.resolvedTheme === this.Mode.DARK;
}
/**
* Maps theme modes to provided values
* @param {string} light Value for light mode
* @param {string} dark Value for dark mode
* @returns {Object} Mapped values
* Creates a mode-indexed value map.
*
* @template T
* @param {T} light Value for light mode.
* @param {T} dark Value for dark mode.
* @returns {{ light: T, dark: T }}
*/
static getThemeMapper(light, dark) {
static newThemeMap(light, dark) {
return {
[this.LIGHT]: light,
[this.DARK]: dark
[this.Mode.LIGHT]: light,
[this.Mode.DARK]: dark
};
}
/**
* Initializes the theme based on system preferences or stored mode
*/
/** Initializes the theme from the stored value or system preference. */
static init() {
if (!this.switchable) {
if (!this.isToggleable) {
this.#clearStorage();
return;
}
this.#darkMedia.addEventListener('change', () => {
const lastMode = this.#mode;
this.#clearMode();
const storedTheme = this.#storedTheme;
if (lastMode !== this.visualState) {
this.#notify();
if (storedTheme) {
this.#apply(storedTheme, { domPersist: true });
} else {
this.#apply(this.#systemTheme);
}
this.#mediaDark.addEventListener('change', () => {
if (this.#storedTheme) {
return;
}
this.#apply(this.#systemTheme);
this.#notify();
});
if (!this.#hasMode) {
return;
}
if (this.#isDarkMode) {
this.#setDark();
} else {
this.#setLight();
}
}
/**
* Flips the current theme mode
* Updates the theme by the specified mode.
*
* @param {'light'|'dark'|'system'} mode
*/
static flip() {
if (this.#hasMode) {
this.#clearMode();
} else {
this.#sysDark ? this.#setLight() : this.#setDark();
static update(mode) {
const newTheme = mode === this.Mode.SYSTEM ? this.#systemTheme : mode;
if (newTheme !== this.resolvedTheme) {
this.#notify();
}
this.#notify();
}
static #setDark() {
document.documentElement.setAttribute(this.#modeAttr, this.DARK);
sessionStorage.setItem(this.#modeKey, this.DARK);
}
this.#apply(newTheme, { persist: mode !== this.Mode.SYSTEM });
static #setLight() {
document.documentElement.setAttribute(this.#modeAttr, this.LIGHT);
sessionStorage.setItem(this.#modeKey, this.LIGHT);
}
static #clearMode() {
document.documentElement.removeAttribute(this.#modeAttr);
sessionStorage.removeItem(this.#modeKey);
}
/**
* Notifies other plugins that the theme mode has changed
*/
static #notify() {
window.postMessage({ id: this.ID }, '*');
if (mode === this.Mode.SYSTEM) {
this.#clearStorage();
}
}
}
+6 -5
View File
@@ -8,12 +8,13 @@ layout: compress
{% include lang.html %}
{% if site.theme_mode %}
{% capture prefer_mode %}data-mode="{{ site.theme_mode }}"{% endcapture %}
{% endif %}
<!-- `site.alt_lang` can specify a language different from the UI -->
<html lang="{{ page.lang | default: site.alt_lang | default: site.lang }}" {{ prefer_mode }}>
<html
lang="{{ page.lang | default: site.alt_lang | default: site.lang }}"
{%- if site.theme_mode == 'light' or site.theme_mode == 'dark' -%}
data-bs-theme="{{ site.theme_mode }}"
{%- endif -%}
>
{% include head.html lang=lang %}
<body>
+16 -13
View File
@@ -113,9 +113,7 @@ script_includes:
<dialog id="toc-popup" class="p-0">
<div class="header d-flex flex-row align-items-center justify-content-between">
<div class="label text-truncate py-2 ms-4">{{- page.title -}}</div>
<button id="toc-popup-close" type="button" class="btn mx-1 my-1 opacity-75">
<i class="fas fa-close"></i>
</button>
<button id="toc-popup-close" type="button" class="btn-close btn-sm mx-3" aria-label="Close"></button>
</div>
<div id="toc-popup-content" class="px-4 py-3 pb-4"></div>
</dialog>
@@ -126,16 +124,21 @@ script_includes:
</div>
<div class="post-tail-wrapper text-muted">
<!-- categories -->
{% if page.categories.size > 0 %}
<div class="post-meta mb-3">
<i class="far fa-folder-open fa-fw me-1"></i>
{% for category in page.categories %}
<a href="{{ site.baseurl }}/categories/{{ category | slugify | url_encode }}/">{{ category }}</a>
{%- unless forloop.last -%},{%- endunless -%}
{% endfor %}
</div>
{% endif %}
<div class="d-flex justify-content-between align-items-center gap-3 mb-3">
<!-- categories -->
{% if page.categories.size > 0 %}
<div class="post-meta">
<i class="far fa-folder-open fa-fw me-1"></i>
{% for category in page.categories %}
<a href="{{ site.baseurl }}/categories/{{ category | slugify | url_encode }}/">{{ category }}</a>
{%- unless forloop.last -%},{%- endunless -%}
{% endfor %}
</div>
{% endif %}
<!-- "Edit this post" link -->
{% include post-edit.html lang=lang %}
</div>
<!-- tags -->
{% if page.tags.size > 0 %}
+6
View File
@@ -1,3 +1,9 @@
@mixin color-scheme($mode) {
@media (prefers-color-scheme: #{$mode}) {
@content;
}
}
@mixin text-ellipsis {
overflow: hidden;
text-overflow: ellipsis;
+6
View File
@@ -28,3 +28,9 @@ $code-icon-width: 1.75rem !default;
$font-family-base: 'Source Sans Pro', 'Microsoft Yahei', sans-serif !default;
$font-family-heading: Lato, 'Microsoft Yahei', sans-serif !default;
/* Theme mode settings */
$theme-attr: 'data-bs-theme'; /* the attribute used to indicate the resolved theme */
$theme-options: light, dark;
$theme: null !default; /* set by Jekyll site configuration */
+28 -20
View File
@@ -1,3 +1,4 @@
@use 'sass:list';
@use '../abstracts/variables' as v;
@use '../abstracts/breakpoints' as bp;
@use '../abstracts/mixins' as mx;
@@ -5,32 +6,36 @@
@use '../themes/light';
@use '../themes/dark';
:root {
font-size: 16px;
$enable-dual: not list.index(v.$theme-options, v.$theme);
$enable-light: v.$theme == light or $enable-dual;
$enable-dark: v.$theme == dark or $enable-dual;
@if $enable-light {
:root[#{v.$theme-attr}='light'] {
@include light.styles;
}
}
html {
@media (prefers-color-scheme: light) {
&:not([data-mode]),
&[data-mode='light'] {
@if $enable-dark {
:root[#{v.$theme-attr}='dark'] {
@include dark.styles;
}
}
@if $enable-dual {
:root:not([#{v.$theme-attr}]) {
@include mx.color-scheme(light) {
@include light.styles;
}
&[data-mode='dark'] {
@include mx.color-scheme(dark) {
@include dark.styles;
}
}
}
@media (prefers-color-scheme: dark) {
&:not([data-mode]),
&[data-mode='dark'] {
@include dark.styles;
}
&[data-mode='light'] {
@include light.styles;
}
}
:root {
font-size: 16px;
@include bp.lg {
overflow-y: scroll;
@@ -369,7 +374,9 @@ main {
box-shadow: none;
border-color: var(--input-focus-border-color) !important;
background: center !important;
transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;
transition:
background-color 0.15s ease-in-out,
border-color 0.15s ease-in-out;
}
.left {
@@ -391,8 +398,9 @@ main {
/* MathJax */
mjx-container {
overflow-y: hidden;
min-width: auto !important;
a {
display: inline-block;
}
}
@media (hover: hover) {
+4 -2
View File
@@ -219,8 +219,9 @@ div {
@extend %rounded;
border: 1px solid transparent;
height: v.$code-header-height;
width: v.$code-header-height;
height: 2rem;
width: 2rem;
margin-right: 0.125rem;
padding: 0;
background-color: inherit;
@@ -234,6 +235,7 @@ div {
}
i {
font-size: 90%;
color: var(--clipboard-checked-color);
}
}
+17 -28
View File
@@ -7,49 +7,41 @@
@-webkit-keyframes popup {
from {
opacity: 0;
bottom: 0;
bottom: 10%;
}
}
@keyframes popup {
from {
opacity: 0;
bottom: 0;
}
}
.toast-header {
background: none;
border-bottom: none;
color: inherit;
}
.toast-body {
font-family: Lato, sans-serif;
line-height: 1.25rem;
button {
font-size: 90%;
min-width: 4rem;
bottom: 10%;
}
}
&.toast {
&.show {
display: block;
min-width: 20rem;
border-radius: 0.5rem;
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
background-color: rgb(255 255 255 / 50%);
color: #1b1b1eba;
position: fixed;
left: 50%;
bottom: 20%;
bottom: 30%;
transform: translateX(-50%);
-webkit-animation: popup 0.8s;
animation: popup 0.8s;
}
.toast-body {
line-height: 1.25rem;
font-family: v.$font-family-heading;
}
button[aria-label='Update'] {
font-size: 0.8rem;
}
.btn-close {
font-size: 0.625rem;
}
}
}
@@ -101,10 +93,7 @@
}
button {
> i {
font-size: 1.25rem;
vertical-align: middle;
}
font-size: 0.75rem;
&:focus-visible {
box-shadow: none;
+97 -9
View File
@@ -17,7 +17,6 @@ $sidebar-display: 'sidebar-display'; /* the attribute for sidebar display */
overflow-y: auto;
width: v.$sidebar-width;
background: var(--sidebar-bg);
border-right: 1px solid var(--sidebar-border-color);
/* Hide scrollbar for IE, Edge and Firefox */
-ms-overflow-style: none; /* IE and Edge */
@@ -76,11 +75,12 @@ $sidebar-display: 'sidebar-display'; /* the attribute for sidebar display */
}
.profile-wrapper {
@include mx.mt-mb(2.5rem);
@extend %clickable-transition;
padding-left: 2.5rem;
padding-right: 1.25rem;
margin-top: 2.5rem;
margin-bottom: 1rem;
width: 100%;
@include bp.lg {
@@ -105,6 +105,8 @@ $sidebar-display: 'sidebar-display'; /* the attribute for sidebar display */
letter-spacing: 0.25px;
margin-top: 1.25rem;
margin-bottom: 0.5rem;
width: -webkit-fit-content;
width: -moz-fit-content;
width: fit-content;
color: var(--site-title-color);
}
@@ -114,6 +116,7 @@ $sidebar-display: 'sidebar-display'; /* the attribute for sidebar display */
color: var(--site-subtitle-color);
margin-top: 0.25rem;
word-spacing: 1px;
height: 3rem;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
@@ -207,7 +210,7 @@ $sidebar-display: 'sidebar-display'; /* the attribute for sidebar display */
}
}
a {
> a {
@extend %button;
@extend %sidebar-link-hover;
@extend %clickable-transition;
@@ -227,13 +230,102 @@ $sidebar-display: 'sidebar-display'; /* the attribute for sidebar display */
#mode-toggle {
@extend %button;
@extend %sidebar-links;
@extend %sidebar-link-hover;
@extend %clickable-transition;
> i {
display: none;
@at-root :root[data-bs-theme='light'][data-theme-persisted]
&[data-theme-mode='light'] {
display: block;
}
@at-root :root[data-bs-theme='dark'][data-theme-persisted]
&[data-theme-mode='dark'] {
display: block;
}
@at-root :root:not([data-theme-persisted]) &[data-theme-mode='system'] {
display: block;
}
}
@-webkit-keyframes menu-pop {
from {
opacity: 0;
translate: 0 0.5rem;
}
to {
opacity: 1;
translate: 0 0;
}
}
@keyframes menu-pop {
from {
opacity: 0;
translate: 0 0.5rem;
}
to {
opacity: 1;
translate: 0 0;
}
}
+ .dropdown-menu {
background-color: var(--menu-bg);
border-color: var(--menu-border-color);
box-shadow: var(--menu-shadow-color) 0 1px 4px;
border-radius: 0.75rem !important;
&.show {
display: flex;
flex-direction: column;
gap: 0.25rem;
left: -0.25rem !important;
-webkit-animation: menu-pop 0.2s ease-out;
animation: menu-pop 0.2s ease-out;
}
.dropdown-item {
border-radius: 0.5rem;
color: var(--sidebar-muted-color);
font-size: 90%;
&.active {
font-weight: 600;
color: var(--menu-active-color);
&::after {
content: '\f00c';
font: var(--fa-font-solid);
font-size: 0.75rem;
color: var(--sidebar-btn-color);
margin-left: auto;
padding-left: 1rem;
}
}
&:active,
&:hover,
&.active {
background-color: var(--menu-highlight-bg);
}
> i {
color: var(--sidebar-btn-color);
margin-right: 0.5rem;
}
}
}
}
.icon-border {
@extend %no-cursor;
@include mx.ml-mr(calc((v.$sb-btn-gap - $btn-border-width) / 2));
@include mx.ml-mr(0.6rem);
background-color: var(--sidebar-btn-color);
content: '';
@@ -241,10 +333,6 @@ $sidebar-display: 'sidebar-display'; /* the attribute for sidebar display */
height: $btn-border-width;
border-radius: 50%;
margin-bottom: $btn-mb;
@include bp.xxxl {
@include mx.ml-mr(calc((v.$sb-btn-gap-lg - $btn-border-width) / 2));
}
}
} /* .sidebar-bottom */
} /* #sidebar */
+10
View File
@@ -148,6 +148,16 @@ header {
}
}
.post-edit {
line-height: 1.2rem;
> a {
&:hover {
@extend %link-hover;
}
}
}
.post-navigation {
@include bp.lt(bp.get(lg)) {
@include mx.pl-pr(0);
+7 -2
View File
@@ -30,6 +30,11 @@
rgb(58 55 55 / 40%) 50%,
rgb(255 255 255 / 0%) 100%
);
--menu-bg: rgb(30 30 30);
--menu-border-color: rgb(77 77 77 / 60%);
--menu-shadow-color: rgb(4 4 4 / 42%);
--menu-active-color: rgb(240 248 255 / 63%);
--menu-highlight-bg: rgb(90 91 92 / 12%);
/* Sidebar */
--site-title-color: #717070;
@@ -67,8 +72,8 @@
--btn-share-hover-color: #bfc1ca;
--card-bg: #1e1e1e;
--card-hover-bg: #464d51;
--card-shadow: rgb(21 21 21 / 72%) 0 6px 18px 0,
rgb(137 135 135 / 24%) 0 0 0 1px;
--card-shadow:
rgb(21 21 21 / 72%) 0 6px 18px 0, rgb(137 135 135 / 24%) 0 0 0 1px;
--kbd-wrap-color: #6a6a6a;
--kbd-text-color: #d3d3d3;
--kbd-bg-color: #242424;
+7 -2
View File
@@ -27,6 +27,11 @@
rgb(232 230 230 / 100%) 50%,
rgb(250 250 250 / 0%) 100%
);
--menu-bg: white;
--menu-border-color: white;
--menu-shadow-color: rgb(0 0 0 / 16%);
--menu-active-color: rgb(91 91 91);
--menu-highlight-bg: rgb(243 244 245 / 50%);
/* Sidebar */
--site-title-color: rgb(113 113 113);
@@ -59,8 +64,8 @@
--btn-share-hover-color: #0d6efd;
--card-bg: white;
--card-hover-bg: #e2e2e2;
--card-shadow: rgb(104 104 104 / 5%) 0 2px 6px 0,
rgb(211 209 209 / 15%) 0 0 0 1px;
--card-shadow:
rgb(104 104 104 / 5%) 0 2px 6px 0, rgb(211 209 209 / 15%) 0 0 0 1px;
--footnote-target-bg: lightcyan;
--tb-odd-bg: #fbfcfd;
--tb-border-color: #eaeaea;
+4
View File
@@ -1,6 +1,10 @@
---
---
@use 'abstracts/variables' with (
$theme: '{{ site.theme_mode }}'
);
/* prettier-ignore */
@use 'main
{%- if jekyll.environment == 'production' -%}
+1 -1
View File
@@ -24,5 +24,5 @@ layout: compress
"start_url": "{{ '/index.html' | relative_url }}",
"theme_color": "#2a1e6b",
"background_color": "#ffffff",
"display": "fullscreen"
"display": "standalone"
}
+18
View File
@@ -1,5 +1,23 @@
# Changelog
## [7.6.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.5.0...v7.6.0) (2026-06-20)
### Features
* add edit this post link ([#2517](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2517)) ([6bd446c](https://github.com/cotes2020/jekyll-theme-chirpy/commit/6bd446ccdedbe37752cf24b1866e1e2dd9cb82c8))
* **theme:** persist user theme preferences ([#2756](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2756)) ([7496dd4](https://github.com/cotes2020/jekyll-theme-chirpy/commit/7496dd41fa053c4636a82027fe3fb3e38357e385))
* **ui:** optimize design of PWA update notification ([#2757](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2757)) ([5cc9dc6](https://github.com/cotes2020/jekyll-theme-chirpy/commit/5cc9dc66acb1eb9213988d3ac6de5cf5adf1a6f6))
### Bug Fixes
* **giscus:** synchronize theme state during lazy loading ([#2742](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2742)) ([ceb2a41](https://github.com/cotes2020/jekyll-theme-chirpy/commit/ceb2a41463cbb6251fa257b640990a8d9717b0bb))
* prevent Firefox from opening blank page on `mailto` links ([#2642](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2642)) ([2685b91](https://github.com/cotes2020/jekyll-theme-chirpy/commit/2685b91957d0207c2d31dab828430c78a2fcc3d0))
* **pwa:** avoid iOS status bar overlapping PWA content ([#2173](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2173)) ([3823212](https://github.com/cotes2020/jekyll-theme-chirpy/commit/38232120b729de653bfb42909a8dad047559438d))
### Improvements
* **ui:** prevent vertical flickering caused by subtitle loading ([2db0535](https://github.com/cotes2020/jekyll-theme-chirpy/commit/2db053553bcf9606fc80c4a86959d0dd25d0446a))
## [7.5.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.4.1...v7.5.0) (2026-03-15)
### Features
+1 -1
View File
@@ -2,7 +2,7 @@
Gem::Specification.new do |spec|
spec.name = "jekyll-theme-chirpy"
spec.version = "7.5.0"
spec.version = "7.6.0"
spec.authors = ["Cotes Chung"]
spec.email = ["cotes.chung@gmail.com"]
+14 -14
View File
@@ -1,6 +1,6 @@
{
"name": "jekyll-theme-chirpy",
"version": "7.5.0",
"version": "7.6.0",
"description": "A minimal, responsive, and feature-rich Jekyll theme for technical writing.",
"repository": {
"type": "git",
@@ -30,28 +30,28 @@
"bootstrap": "^5.3.8"
},
"devDependencies": {
"@babel/core": "^7.29.0",
"@babel/core": "^7.29.7",
"@babel/plugin-transform-class-properties": "^7.28.6",
"@babel/plugin-transform-private-methods": "^7.28.6",
"@babel/preset-env": "^7.29.0",
"@commitlint/cli": "^20.4.4",
"@commitlint/config-conventional": "^20.4.4",
"@eslint/js": "^10.0.0",
"@rollup/plugin-babel": "^7.0.0",
"@babel/preset-env": "^7.29.7",
"@commitlint/cli": "^21.0.2",
"@commitlint/config-conventional": "^21.0.2",
"@eslint/js": "^10.0.1",
"@rollup/plugin-babel": "^7.1.0",
"@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-terser": "^1.0.0",
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/exec": "^7.1.0",
"@semantic-release/git": "^10.0.1",
"concurrently": "^9.2.1",
"conventional-changelog-conventionalcommits": "^9.3.0",
"eslint": "^10.0.3",
"globals": "^17.4.0",
"concurrently": "^10.0.3",
"conventional-changelog-conventionalcommits": "^9.3.1",
"eslint": "^10.5.0",
"globals": "^17.6.0",
"husky": "^9.1.7",
"purgecss": "^8.0.0",
"rollup": "^4.59.0",
"semantic-release": "^25.0.3",
"stylelint": "^17.4.0",
"rollup": "^4.62.2",
"semantic-release": "^25.0.5",
"stylelint": "^17.13.0",
"stylelint-config-standard-scss": "^17.0.0"
},
"prettier": {