1
0
mirror of https://github.com/cotes2020/jekyll-theme-chirpy.git synced 2025-12-18 21:53:26 +00:00

Compare commits

..

34 Commits

Author SHA1 Message Date
dependabot[bot]
eece0370b8 build(deps-dev): bump the dev-deps group across 1 directory with 9 updates
Updates the requirements on [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core), [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env), [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli), [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional), [eslint](https://github.com/eslint/eslint), [globals](https://github.com/sindresorhus/globals), [rollup](https://github.com/rollup/rollup), [semantic-release](https://github.com/semantic-release/semantic-release) and [stylelint](https://github.com/stylelint/stylelint) to permit the latest version.

Updates `@babel/core` to 7.28.5
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.28.5/packages/babel-core)

Updates `@babel/preset-env` to 7.28.5
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.28.5/packages/babel-preset-env)

Updates `@commitlint/cli` to 20.2.0
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.2.0/@commitlint/cli)

Updates `@commitlint/config-conventional` to 20.2.0
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.2.0/@commitlint/config-conventional)

Updates `eslint` to 9.39.1
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v9.38.0...v9.39.1)

Updates `globals` to 16.5.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v16.4.0...v16.5.0)

Updates `rollup` to 4.53.3
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.5...v4.53.3)

Updates `semantic-release` to 25.0.2
- [Release notes](https://github.com/semantic-release/semantic-release/releases)
- [Commits](https://github.com/semantic-release/semantic-release/compare/v25.0.1...v25.0.2)

Updates `stylelint` to 16.26.1
- [Release notes](https://github.com/stylelint/stylelint/releases)
- [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint/compare/16.25.0...16.26.1)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-version: 7.28.5
  dependency-type: direct:development
  dependency-group: dev-deps
- dependency-name: "@babel/preset-env"
  dependency-version: 7.28.5
  dependency-type: direct:development
  dependency-group: dev-deps
- dependency-name: "@commitlint/cli"
  dependency-version: 20.2.0
  dependency-type: direct:development
  dependency-group: dev-deps
- dependency-name: "@commitlint/config-conventional"
  dependency-version: 20.2.0
  dependency-type: direct:development
  dependency-group: dev-deps
- dependency-name: eslint
  dependency-version: 9.39.1
  dependency-type: direct:development
  dependency-group: dev-deps
- dependency-name: globals
  dependency-version: 16.5.0
  dependency-type: direct:development
  dependency-group: dev-deps
- dependency-name: rollup
  dependency-version: 4.53.3
  dependency-type: direct:development
  dependency-group: dev-deps
- dependency-name: semantic-release
  dependency-version: 25.0.2
  dependency-type: direct:development
  dependency-group: dev-deps
- dependency-name: stylelint
  dependency-version: 16.26.1
  dependency-type: direct:development
  dependency-group: dev-deps
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-08 19:07:11 +00:00
Jason Raveling
d2db439c16 feat: add support for fediverse:creator meta tag (#2593) 2025-11-17 14:19:16 +08:00
semantic-release-bot
cecfc4237f Merge branch 'production' 2025-10-26 21:49:28 +00:00
semantic-release-bot
525c2888c5 chore(release): 7.4.1
## [7.4.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.4.0...v7.4.1) (2025-10-26)

### Bug Fixes

* avoid duplicate base URL for homepage preview images ([#2568](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2568)) ([66bf232](66bf232951))
2025-10-26 21:49:12 +00:00
Cotes Chung
4950edc75e Merge branch 'master' into production 2025-10-27 05:48:01 +08:00
Cotes
66bf232951 fix: avoid duplicate base URL for homepage preview images (#2568) 2025-10-27 05:39:39 +08:00
Cotes Chung
37377a43e0 Revert "refactor: avoid converting media‘s relative paths to absolute paths (#2552)"
This reverts commit b3d7db3cda.
2025-10-27 05:16:47 +08:00
semantic-release-bot
7f35d8e550 Merge branch 'production' 2025-10-19 23:15:56 +00:00
semantic-release-bot
18ab8fcfdf chore(release): 7.4.0
## [7.4.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.3.1...v7.4.0) (2025-10-19)

### Features

* add support for embed spotify ([#2515](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2515)) ([cda62e2](cda62e28d1))
* **i18n:** add Danish locale ([#2410](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2410)) ([f5802b8](f5802b8a8a))
* **i18n:** add locale files for some rtl languages ([#2415](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2415)) ([18c48b4](18c48b4c49))

### Bug Fixes

* avoid unconfigured social options in sidebar ([#2507](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2507)) ([5f8ec7f](5f8ec7ffd3))
* correct GoatCounter pageviews extraction ([#2420](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2420)) ([c706799](c706799f9b))
* resolve discrepancy in lqip between post and main page ([#2453](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2453)) ([1bac96a](1bac96a8e1))
* restore blurry animation for homepage LQIP ([#2551](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2551)) ([221ca9f](221ca9f52b))
* **search:** restore full-text search for posts with description ([#2557](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2557)) ([604528e](604528e3ce))
2025-10-19 23:15:40 +00:00
Cotes Chung
078cf86f79 Merge branch 'master' into production 2025-10-20 07:13:19 +08:00
Cotes Chung
45cb428b01 build(deps): upgrade dependencies 2025-10-20 07:11:29 +08:00
Cotes Chung
3578111ecd refactor: resolve various StyleLint warnings 2025-10-20 06:47:30 +08:00
Cotes Chung
022b963403 build(dev-deps): upgrade dependencies 2025-10-20 06:47:29 +08:00
Cotes
aa832c29de refactor: update favicon files and documentation (#2558) 2025-10-20 02:55:43 +08:00
Cotes
604528e3ce fix(search): restore full-text search for posts with description (#2557) 2025-10-20 02:24:40 +08:00
Cotes
b3d7db3cda refactor: avoid converting media‘s relative paths to absolute paths (#2552) 2025-10-17 00:02:12 +08:00
dependabot[bot]
ee6839516e build(deps): bump the gh-actions group across 1 directory with 5 updates (#2550)
Bumps the gh-actions group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [actions/checkout](https://github.com/actions/checkout) | `4` | `5` |
| [actions/setup-node](https://github.com/actions/setup-node) | `4` | `5` |
| [github/codeql-action](https://github.com/github/codeql-action) | `3` | `4` |
| [actions/github-script](https://github.com/actions/github-script) | `7` | `8` |
| [actions/stale](https://github.com/actions/stale) | `9` | `10` |



Updates `actions/checkout` from 4 to 5
- [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/v4...v5)

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

Updates `github/codeql-action` from 3 to 4
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3...v4)

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

Updates `actions/stale` from 9 to 10
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v9...v10)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: gh-actions
- dependency-name: actions/setup-node
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: gh-actions
- dependency-name: github/codeql-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: gh-actions
- dependency-name: actions/github-script
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: gh-actions
- dependency-name: actions/stale
  dependency-version: '10'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: gh-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-14 05:23:24 +08:00
Cotes Chung
a385ffabff chore: improve ESLint config 2025-10-14 04:54:48 +08:00
Cotes Chung
f51641b541 chore: remove deprecated URL 2025-10-14 04:53:51 +08:00
Cotes
221ca9f52b fix: restore blurry animation for homepage LQIP (#2551) 2025-10-14 04:36:02 +08:00
Alexander Fuks
4d6c788b9c docs: update timezone picker reference (#2518) 2025-09-08 23:48:19 +04:00
Alexander Fuks
cda62e28d1 feat: add support for embed spotify (#2515) 2025-09-08 23:45:20 +04:00
Jason Raveling
5f8ec7ffd3 fix: avoid unconfigured social options in sidebar (#2507) 2025-08-31 21:51:01 +08:00
Cotes Chung
eaf5e57449 ci: change filter script to ESM format
Because `"type": "module"` was added to `package.json`
2025-07-31 03:37:32 +08:00
Cotes Chung
29bf95e9c7 style: change css color functions to use modern notation
- `rgba()` → `rgb()`
2025-07-27 21:42:49 +08:00
Cotes Chung
648398c63c ci: migrate eslint and stylelint from codacy to gh-actions 2025-07-27 21:42:49 +08:00
Cotes Chung
b855e8b6b4 style: unify quote style in rollup config 2025-07-27 00:55:54 +08:00
Cotes Chung
49519d13e5 chore: complete ESLint v9 configuration 2025-07-27 00:53:58 +08:00
semantic-release-bot
8bf72fc234 Merge branch 'production' 2025-07-26 12:25:02 +00:00
semantic-release-bot
c0e4756200 chore(release): 7.3.1
## [7.3.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.3.0...v7.3.1) (2025-07-26)

### Bug Fixes

* escape special JSON characters in search results ([#2481](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2481)) ([7615d72](7615d72e93))
2025-07-26 12:24:47 +00:00
Cotes Chung
81886b11c0 Merge branch 'hotfix/7.3.1' into production 2025-07-26 20:23:38 +08:00
Cotes Chung
7615d72e93 fix: escape special JSON characters in search results (#2481)
Also restore full-text search
2025-07-26 20:22:30 +08:00
Josh Wickham
1bac96a8e1 fix: resolve discrepancy in lqip between post and main page (#2453) 2025-06-27 23:58:10 +08:00
Alexander Fuks
c706799f9b fix: correct GoatCounter pageviews extraction (#2420) 2025-06-01 04:51:43 +08:00
57 changed files with 403 additions and 233 deletions

1
.github/FUNDING.yml vendored
View File

@@ -1,2 +1 @@
ko_fi: coteschung ko_fi: coteschung
custom: https://sponsor.cotes.page

View File

@@ -14,14 +14,14 @@ jobs:
pull-requests: write pull-requests: write
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- uses: ruby/setup-ruby@v1 - uses: ruby/setup-ruby@v1
with: with:
ruby-version: 3.3 ruby-version: 3.3
bundler-cache: true bundler-cache: true
- uses: actions/setup-node@v4 - uses: actions/setup-node@v5
with: with:
node-version: lts/* node-version: lts/*

View File

@@ -31,7 +31,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
with: with:
fetch-depth: 0 # for posts's lastmod fetch-depth: 0 # for posts's lastmod
@@ -42,7 +42,7 @@ jobs:
bundler-cache: true bundler-cache: true
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4 uses: actions/setup-node@v5
with: with:
node-version: lts/* node-version: lts/*

View File

@@ -24,11 +24,11 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v5
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@v3 uses: github/codeql-action/init@v4
with: with:
languages: "${{ matrix.language }}" languages: "${{ matrix.language }}"
config-file: .github/codeql/codeql-config.yml config-file: .github/codeql/codeql-config.yml
@@ -36,9 +36,9 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
# If this step fails, then you should remove it and run the build manually (see below) # If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild - name: Autobuild
uses: github/codeql-action/autobuild@v3 uses: github/codeql-action/autobuild@v4
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3 uses: github/codeql-action/analyze@v4
with: with:
category: "/language:${{ matrix.language }}" category: "/language:${{ matrix.language }}"

View File

@@ -11,5 +11,5 @@ jobs:
commitlint: commitlint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- uses: wagoid/commitlint-github-action@v6 - uses: wagoid/commitlint-github-action@v6

30
.github/workflows/lint-js.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Lint JS
on:
push:
paths:
- "_javascript/**/*.js"
- ".github/workflows/scripts/**/*.js"
- "*.js"
pull_request:
paths:
- "_javascript/**/*.js"
- ".github/workflows/scripts/*.js"
- "*.js"
jobs:
lint-js:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: lts/*
- name: Install Dependencies
run: npm i
- name: Lint JS
run: npm run lint:js

26
.github/workflows/lint-scss.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: Lint SCSS
on:
push:
paths:
- "_sass/**/*.scss"
pull_request:
paths:
- "_sass/**/*.scss"
jobs:
lint-scss:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: lts/*
- name: Install Dependencies
run: npm i
- name: Lint SCSS
run: npm run lint:scss

View File

@@ -13,13 +13,13 @@ jobs:
steps: steps:
- name: Checkout Code - name: Checkout Code
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Check PR Content - name: Check PR Content
id: intercept id: intercept
uses: actions/github-script@v7 uses: actions/github-script@v8
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | script: |
const script = require('.github/workflows/scripts/pr-filter.js'); const { default: filter } = await import('${{ github.workspace }}/.github/workflows/scripts/pr-filter.js');
await script({ github, context, core }); await filter({ github, context, core });

View File

@@ -9,7 +9,7 @@ function hasDescription(markdown) {
); );
} }
module.exports = async ({ github, context, core }) => { export default async ({ github, context, core }) => {
const pr = context.payload.pull_request; const pr = context.payload.pull_request;
const body = pr.body === null ? '' : pr.body; const body = pr.body === null ? '' : pr.body;
const markdown = body.replace(/<!--[\s\S]*?-->/g, ''); const markdown = body.replace(/<!--[\s\S]*?-->/g, '');

View File

@@ -20,7 +20,7 @@ jobs:
stale: stale:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v9 - uses: actions/stale@v10
with: with:
# 60 days before marking issues/PRs stale # 60 days before marking issues/PRs stale
days-before-close: -1 # does not close automatically days-before-close: -1 # does not close automatically

View File

@@ -8,8 +8,6 @@
"property-no-vendor-prefix": null, "property-no-vendor-prefix": null,
"selector-no-vendor-prefix": null, "selector-no-vendor-prefix": null,
"value-no-vendor-prefix": null, "value-no-vendor-prefix": null,
"color-function-notation": "legacy",
"alpha-value-notation": "number",
"selector-not-notation": "simple", "selector-not-notation": "simple",
"color-hex-length": "long", "color-hex-length": "long",
"declaration-block-single-line-max-declarations": 3, "declaration-block-single-line-max-declarations": 3,

View File

@@ -8,7 +8,7 @@ theme: jekyll-theme-chirpy
# otherwise, the layout language will use the default value of 'en'. # otherwise, the layout language will use the default value of 'en'.
lang: en lang: en
# Change to your timezone https://kevinnovak.github.io/Time-Zone-Picker # Change to your timezone https://zones.arilyn.cc
timezone: Asia/Shanghai timezone: Asia/Shanghai
# jekyll-seo-tag settings https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md # jekyll-seo-tag settings https://github.com/jekyll/jekyll-seo-tag/blob/master/docs/usage.md
@@ -36,6 +36,7 @@ social:
# It will be displayed as the default author of the posts and the copyright owner in the Footer # It will be displayed as the default author of the posts and the copyright owner in the Footer
name: your_full_name name: your_full_name
email: example@domain.com # change to your email address email: example@domain.com # change to your email address
fediverse_handle: "@you@domain.com" # change to your fediverse handle or leave empty
links: links:
# The first element serves as the copyright owner's link # The first element serves as the copyright owner's link
- https://twitter.com/username # change to your Twitter homepage - https://twitter.com/username # change to your Twitter homepage

View File

@@ -20,24 +20,24 @@ webfonts: https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Sour
# Libraries # Libraries
toc: toc:
css: https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css css: https://cdn.jsdelivr.net/npm/tocbot@4.36.4/dist/tocbot.min.css
js: https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.js js: https://cdn.jsdelivr.net/npm/tocbot@4.36.4/dist/tocbot.min.js
fontawesome: fontawesome:
css: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css css: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@7.1.0/css/all.min.css
search: 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.10.0/dest/simple-jekyll-search.min.js
mermaid: mermaid:
js: https://cdn.jsdelivr.net/npm/mermaid@11.4.0/dist/mermaid.min.js js: https://cdn.jsdelivr.net/npm/mermaid@11.12.0/dist/mermaid.min.js
dayjs: dayjs:
js: js:
common: https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js common: https://cdn.jsdelivr.net/npm/dayjs@1.11.18/dayjs.min.js
locale: https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/:LOCALE.js locale: https://cdn.jsdelivr.net/npm/dayjs@1.11.18/locale/:LOCALE.js
relativeTime: https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js relativeTime: https://cdn.jsdelivr.net/npm/dayjs@1.11.18/plugin/relativeTime.js
localizedFormat: https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js localizedFormat: https://cdn.jsdelivr.net/npm/dayjs@1.11.18/plugin/localizedFormat.js
glightbox: glightbox:
css: https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css css: https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css

View File

@@ -9,7 +9,7 @@
{% endunless %} {% endunless %}
<p> <p>
<audio class="embed-audio" controls> <audio class="embed-audio file" controls>
{% assign extension = src | split: '.' | last %} {% assign extension = src | split: '.' | last %}
{% assign types = extension | concat: types %} {% assign types = extension | concat: types %}

View File

@@ -0,0 +1,22 @@
{% assign size = 352 %}
{% assign theme = '' %}
{% if include.compact %}
{% assign size = 152 %}
{% endif %}
{% if include.dark %}
{% assign theme = '?theme=0' %}
{% endif %}
<iframe
class="embed-audio spotify"
src="https://open.spotify.com/embed/track/{{ include.id | append: theme }}"
height="{{ size }}"
frameBorder="0"
allowfullscreen=""
allowtransparency="true"
allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture"
loading="lazy"
>
</iframe>

View File

@@ -5,15 +5,10 @@
{% capture favicon_path %}{{ '/assets/img/favicons' | relative_url }}{% endcapture %} {% capture favicon_path %}{{ '/assets/img/favicons' | relative_url }}{% endcapture %}
<link rel="icon" type="image/png" href="{{ favicon_path }}/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/svg+xml" href="{{ favicon_path }}/favicon.svg">
<link rel="shortcut icon" href="{{ favicon_path }}/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="{{ favicon_path }}/apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="{{ favicon_path }}/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="{{ favicon_path }}/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="{{ favicon_path }}/favicon-16x16.png">
{% if site.pwa.enabled %} {% if site.pwa.enabled %}
<link rel="manifest" href="{{ favicon_path }}/site.webmanifest"> <link rel="manifest" href="{{ favicon_path }}/site.webmanifest">
{% endif %} {% endif %}
<link rel="shortcut icon" href="{{ favicon_path }}/favicon.ico">
<meta name="apple-mobile-web-app-title" content="{{ site.title }}">
<meta name="application-name" content="{{ site.title }}">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-config" content="{{ favicon_path }}/browserconfig.xml">
<meta name="theme-color" content="#ffffff">

View File

@@ -50,6 +50,11 @@
{{ seo_tags }} {{ seo_tags }}
{%- if site.social.fediverse_handle %}
<!-- Fediverse handle/creator -->
<meta name="fediverse:creator" content="{{ site.social.fediverse_handle }}">
{% endif %}
<title> <title>
{%- unless page.layout == 'home' -%} {%- unless page.layout == 'home' -%}
{{ page.title | append: ' | ' }} {{ page.title | append: ' | ' }}
@@ -70,7 +75,7 @@
<!-- Bootstrap --> <!-- Bootstrap -->
{% unless jekyll.environment == 'production' %} {% unless jekyll.environment == 'production' %}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.6/dist/css/bootstrap.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css">
{% endunless %} {% endunless %}
<!-- Theme style --> <!-- Theme style -->

View File

@@ -10,7 +10,7 @@
fetch(url) fetch(url)
.then((response) => response.json()) .then((response) => response.json())
.then((data) => { .then((data) => {
const count = data.count.replace(/\s/g, ''); const count = data.count.replace(/\D/g, '');
pv.innerText = new Intl.NumberFormat().format(count); pv.innerText = new Intl.NumberFormat().format(count);
}) })
.catch((error) => { .catch((error) => {

View File

@@ -1,25 +0,0 @@
{%- comment -%}
Get post description or generate it from the post content.
{%- endcomment -%}
{%- assign max_length = include.max_length | default: 200 -%}
{%- capture description -%}
{%- if post.description -%}
{{- post.description -}}
{%- else -%}
{% comment %}
Remove the line number of the code snippet.
{% endcomment %}
{% assign content = post.content %}
{% if content contains '<td class="rouge-gutter gl"><pre class="lineno">' %}
{% assign content = content | replace: '<td class="rouge-gutter gl"><pre class="lineno">', '<!-- <td class="rouge-gutter gl"><pre class="lineno">'%}
{% assign content = content | replace: '</td><td class="rouge-code">', '</td> --><td class="rouge-code">' %}
{% endif %}
{{- content | markdownify | strip_html | newline_to_br | replace: '<br />', ' ' | strip_newlines -}}
{%- endif -%}
{%- endcapture -%}
{{- description | strip | truncate: max_length | escape -}}

View File

@@ -0,0 +1,39 @@
{%- comment -%}
Get the post's description or body content.
Arguments:
full_text: If true, return the full content. Default is false.
max_length: The maximum length of the returned content. Default is 200.
{%- endcomment -%}
{%- if post.description and include.full_text != true -%}
{{- post.description -}}
{%- else -%}
{%- comment -%} Remove the line numbers from the code snippet. {%- endcomment -%}
{%- assign content = post.content -%}
{%- if content contains '<td class="rouge-gutter gl"><pre class="lineno">' -%}
{%- assign content = content
| replace: '<td class="rouge-gutter gl"><pre class="lineno">',
'<!-- <td class="rouge-gutter gl"><pre class="lineno">'
-%}
{%- assign content = content | replace: '</td><td class="rouge-code">', '</td> --><td class="rouge-code">' -%}
{%- endif -%}
{%- assign content = content
| markdownify
| strip_html
| newline_to_br
| replace: '<br />', ' '
| strip_newlines
| strip
-%}
{%- unless include.full_text -%}
{%- assign max_length = include.max_length | default: 200 -%}
{%- assign content = content | truncate: max_length -%}
{%- endunless -%}
{{- content -}}
{%- endif -%}

View File

@@ -163,7 +163,7 @@
{% if page.layout == 'home' %} {% if page.layout == 'home' %}
<!-- create the image wrapper --> <!-- create the image wrapper -->
{% assign _wrapper_start = '<div class="preview-img ' | append: _class | append: '">' %} {% assign _wrapper_start = '<div class="preview-img ' | append: _wrapper_class | append: '">' %}
{% assign _img_content = _img_content | append: _wrapper_start %} {% assign _img_content = _img_content | append: _wrapper_start %}
{% assign _right = _right | prepend: '></div' %} {% assign _right = _right | prepend: '></div' %}

View File

@@ -82,7 +82,7 @@
{% include datetime.html date=post.date lang=include.lang %} {% include datetime.html date=post.date lang=include.lang %}
<h4 class="pt-0 my-2">{{ post.title }}</h4> <h4 class="pt-0 my-2">{{ post.title }}</h4>
<div class="text-muted"> <div class="text-muted">
<p>{% include post-description.html %}</p> <p>{% include post-summary.html %}</p>
</div> </div>
</div> </div>
</a> </a>

View File

@@ -52,13 +52,21 @@
{% endunless %} {% endunless %}
{% for entry in site.data.contact %} {% for entry in site.data.contact %}
{%- assign url = null -%}
{% case entry.type %} {% case entry.type %}
{% when 'github', 'twitter' %} {% when 'github', 'twitter' %}
{%- unless site[entry.type].username -%}
{%- continue -%}
{%- endunless -%}
{%- capture url -%} {%- capture url -%}
https://{{ entry.type }}.com/{{ site[entry.type].username }} https://{{ entry.type }}.com/{{ site[entry.type].username }}
{%- endcapture -%} {%- endcapture -%}
{% when 'email' %} {% when 'email' %}
{% assign email = site.social.email | split: '@' %} {%- unless site.social.email -%}
{%- continue -%}
{%- endunless -%}
{%- assign email = site.social.email | split: '@' -%}
{%- capture url -%} {%- capture url -%}
javascript:location.href = 'mailto:' + ['{{ email[0] }}','{{ email[1] }}'].join('@') javascript:location.href = 'mailto:' + ['{{ email[0] }}','{{ email[1] }}'].join('@')
{%- endcapture -%} {%- endcapture -%}

View File

@@ -25,7 +25,7 @@ layout: compress
<div class="row flex-grow-1"> <div class="row flex-grow-1">
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"> <main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
{% if layout.refactor or layout.layout == 'default' %} {% if layout.layout == 'default' %}
{% include refactor-content.html content=content lang=lang %} {% include refactor-content.html content=content lang=lang %}
{% else %} {% else %}
{{ content }} {{ content }}

View File

@@ -1,6 +1,5 @@
--- ---
layout: default layout: default
refactor: true
--- ---
{% include lang.html %} {% include lang.html %}
@@ -55,20 +54,39 @@ refactor: true
{% if post.image %} {% if post.image %}
{% assign src = post.image.path | default: post.image %} {% assign src = post.image.path | default: post.image %}
{% unless src contains '//' %}
{% assign src = post.media_subpath | append: '/' | append: src | replace: '//', '/' %} {% if post.media_subpath %}
{% endunless %} {% unless src contains '://' %}
{% assign src = post.media_subpath
| append: '/'
| append: src
| replace: '///', '/'
| replace: '//', '/'
%}
{% endunless %}
{% endif %}
{% if post.image.lqip %}
{% assign lqip = post.image.lqip %}
{% if post.media_subpath %}
{% unless lqip contains 'data:' %}
{% assign lqip = post.media_subpath
| append: '/'
| append: lqip
| replace: '///', '/'
| replace: '//', '/'
%}
{% endunless %}
{% endif %}
{% assign lqip_attr = 'lqip="' | append: lqip | append: '"' %}
{% endif %}
{% assign alt = post.image.alt | xml_escape | default: 'Preview Image' %} {% assign alt = post.image.alt | xml_escape | default: 'Preview Image' %}
{% assign lqip = null %}
{% if post.image.lqip %}
{% capture lqip %}lqip="{{ post.image.lqip }}"{% endcapture %}
{% endif %}
<div class="col-md-5"> <div class="col-md-5">
<img src="{{ src }}" alt="{{ alt }}" {{ lqip }}> <img src="{{ src }}" alt="{{ alt }}" {{ lqip_attr }}>
</div> </div>
{% assign card_body_col = '7' %} {% assign card_body_col = '7' %}
@@ -79,7 +97,7 @@ refactor: true
<h1 class="card-title my-2 mt-md-0">{{ post.title }}</h1> <h1 class="card-title my-2 mt-md-0">{{ post.title }}</h1>
<div class="card-text content mt-0 mb-3"> <div class="card-text content mt-0 mb-3">
<p>{% include post-description.html %}</p> <p>{% include post-summary.html %}</p>
</div> </div>
<div class="post-meta flex-grow-1 d-flex align-items-end"> <div class="post-meta flex-grow-1 d-flex align-items-end">

View File

@@ -1,6 +1,5 @@
--- ---
layout: default layout: default
refactor: true
panel_includes: panel_includes:
- toc - toc
tail_includes: tail_includes:

View File

@@ -256,11 +256,9 @@ For normal images:
``` ```
{: .nolineno } {: .nolineno }
### Video ### Social Media Platforms
#### Social Media Platform You can embed video/audio from social media platforms with the following syntax:
You can embed videos from social media platforms with the following syntax:
```liquid ```liquid
{% include embed/{Platform}.html id='{ID}' %} {% include embed/{Platform}.html id='{ID}' %}
@@ -268,15 +266,21 @@ You can embed videos from social media platforms with the following syntax:
Where `Platform` is the lowercase of the platform name, and `ID` is the video ID. Where `Platform` is the lowercase of the platform name, and `ID` is the video ID.
The following table shows how to get the two parameters we need in a given video URL, and you can also know the currently supported video platforms. The following table shows how to get the two parameters we need in a given video/audio URL, and you can also know the currently supported video platforms.
| Video URL | Platform | ID | | Video URL | Platform | ID |
| -------------------------------------------------------------------------------------------------- | ---------- | :------------- | | -------------------------------------------------------------------------------------------------------------------------- | ---------- | :----------------------- |
| [https://www.**youtube**.com/watch?v=**H-B46URT4mg**](https://www.youtube.com/watch?v=H-B46URT4mg) | `youtube` | `H-B46URT4mg` | | [https://www.**youtube**.com/watch?v=**H-B46URT4mg**](https://www.youtube.com/watch?v=H-B46URT4mg) | `youtube` | `H-B46URT4mg` |
| [https://www.**twitch**.tv/videos/**1634779211**](https://www.twitch.tv/videos/1634779211) | `twitch` | `1634779211` | | [https://www.**twitch**.tv/videos/**1634779211**](https://www.twitch.tv/videos/1634779211) | `twitch` | `1634779211` |
| [https://www.**bilibili**.com/video/**BV1Q44y1B7Wf**](https://www.bilibili.com/video/BV1Q44y1B7Wf) | `bilibili` | `BV1Q44y1B7Wf` | | [https://www.**bilibili**.com/video/**BV1Q44y1B7Wf**](https://www.bilibili.com/video/BV1Q44y1B7Wf) | `bilibili` | `BV1Q44y1B7Wf` |
| [https://www.open.**spotify**.com/track/**3OuMIIFP5TxM8tLXMWYPGV**](https://open.spotify.com/track/3OuMIIFP5TxM8tLXMWYPGV) | `spotify` | `3OuMIIFP5TxM8tLXMWYPGV` |
#### Video Files Spotify supports some additional parameters:
- `compact` - to display compact player instead (ex. `{% include embed/spotify.html id='3OuMIIFP5TxM8tLXMWYPGV' compact=1 %}`);
- `dark` - to force dark theme (ex. `{% include embed/spotify.html id='3OuMIIFP5TxM8tLXMWYPGV' dark=1 %}`).
### Video Files
If you want to embed a video file directly, use the following syntax: If you want to embed a video file directly, use the following syntax:
@@ -310,7 +314,7 @@ Consider an example using all of the above:
%} %}
``` ```
### Audios ### Audio Files
If you want to embed an audio file directly, use the following syntax: If you want to embed an audio file directly, use the following syntax:

View File

@@ -10,25 +10,26 @@ The [favicons](https://www.favicon-generator.org/about/) of [**Chirpy**](https:/
## Generate the favicon ## Generate the favicon
Prepare a square image (PNG, JPG, or SVG) with a size of 512x512 or more, and then go to the online tool [**Real Favicon Generator**](https://realfavicongenerator.net/) and click the button <kbd>Select your Favicon image</kbd> to upload your image file. Prepare a square image (PNG, JPG, or SVG) with a size of 512x512 or more, and then go to the online tool [**Real Favicon Generator**](https://realfavicongenerator.net/) and click the button <kbd>Pick your favicon image</kbd> to upload your image file.
In the next step, the webpage will show all usage scenarios. You can keep the default options, scroll to the bottom of the page, and click the button <kbd>Generate your Favicons and HTML code</kbd> to generate the favicon. In the next step, the webpage will show all usage scenarios. You can keep the default options, scroll to the bottom of the page, and click the button <kbd>Next →</kbd> to generate the favicon.
## Download & Replace ## Download & Replace
Download the generated package, unzip and delete the following two from the extracted files: Download the generated package, unzip and delete the following file(s) from the extracted files:
- `browserconfig.xml`{: .filepath}
- `site.webmanifest`{: .filepath} - `site.webmanifest`{: .filepath}
And then copy the remaining image files (`.PNG`{: .filepath} and `.ICO`{: .filepath}) to cover the original files in the directory `assets/img/favicons/`{: .filepath} of your Jekyll site. If your Jekyll site doesn't have this directory yet, just create one. And then copy the remaining image files (`.PNG`{: .filepath}, `.ICO`{: .filepath} and `.SVG`{: .filepath}) to cover the original files in the directory `assets/img/favicons/`{: .filepath} of your Jekyll site. If your Jekyll site doesn't have this directory yet, just create one.
The following table will help you understand the changes to the favicon files: The following table will help you understand the changes to the favicon files:
| File(s) | From Online Tool | From Chirpy | | File(s) | From Online Tool | From Chirpy |
|---------------------|:---------------------------------:|:-----------:| | ------- | :--------------: | :---------: |
| `*.PNG` | | ✗ | | `*.PNG` || ✗ |
| `*.ICO` | | ✗ | | `*.ICO` || ✗ |
| `*.SVG` | ✓ | ✗ |
<!-- markdownlint-disable-next-line --> <!-- markdownlint-disable-next-line -->
> ✓ means keep, ✗ means delete. > ✓ means keep, ✗ means delete.

View File

@@ -103,7 +103,7 @@ main {
width: 100%; width: 100%;
height: 100%; height: 100%;
position: absolute; position: absolute;
background-color: var(--card-hovor-bg); background-color: var(--card-hover-bg);
opacity: 0; opacity: 0;
transition: opacity 0.35s ease-in-out; transition: opacity 0.35s ease-in-out;
} }
@@ -314,7 +314,14 @@ main {
.embed-audio { .embed-audio {
width: 100%; width: 100%;
display: block;
&.file {
display: block;
}
&.spotify {
border-radius: 14px;
}
@extend %img-caption; @extend %img-caption;
} }
@@ -349,7 +356,7 @@ main {
} }
.disabled { .disabled {
color: rgb(206, 196, 196); color: rgb(206 196 196);
pointer-events: auto; pointer-events: auto;
cursor: not-allowed; cursor: not-allowed;
} }

View File

@@ -24,7 +24,6 @@
margin-bottom: 0; margin-bottom: 0;
font-size: v.$code-font-size; font-size: v.$code-font-size;
line-height: 1.4rem; line-height: 1.4rem;
word-wrap: normal; /* Fixed Safari overflow-x */
} }
table { table {
@@ -66,7 +65,7 @@ code {
&.highlighter-rouge { &.highlighter-rouge {
font-size: v.$code-font-size; font-size: v.$code-font-size;
padding: 3px 5px; padding: 3px 5px;
word-break: break-word; overflow-wrap: break-word;
border-radius: v.$radius-sm; border-radius: v.$radius-sm;
background-color: var(--inline-code-bg); background-color: var(--inline-code-bg);
} }
@@ -243,7 +242,7 @@ div {
} }
&:not([timeout]):hover { &:not([timeout]):hover {
background-color: rgba(128, 128, 128, 0.37); background-color: rgb(128 128 128 / 37%);
i { i {
color: white; color: white;

View File

@@ -26,9 +26,7 @@
} }
} }
& { font-size: 1rem + (5 - $i) * $size-factor;
font-size: 1rem + (5 - $i) * $size-factor;
}
} @else { } @else {
font-size: 1.05rem; font-size: 1.05rem;
} }
@@ -238,7 +236,7 @@ main {
border-spacing: 0; border-spacing: 0;
thead { thead {
border-bottom: solid 2px rgba(210, 215, 217, 0.75); border-bottom: solid 2px rgb(210 215 217 / 75%);
th { th {
@extend %table-cell; @extend %table-cell;

View File

@@ -41,7 +41,7 @@
border-radius: 0.5rem; border-radius: 0.5rem;
-webkit-backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px); backdrop-filter: blur(10px);
background-color: rgba(255, 255, 255, 0.5); background-color: rgb(255 255 255 / 50%);
color: #1b1b1eba; color: #1b1b1eba;
position: fixed; position: fixed;
left: 50%; left: 50%;

View File

@@ -134,9 +134,6 @@
.page-link { .page-link {
color: var(--btn-patinator-text-color); color: var(--btn-patinator-text-color);
padding: 0 0.6rem; padding: 0 0.6rem;
display: -webkit-box;
-webkit-box-pack: center;
-webkit-box-align: center;
border-radius: 0.5rem; border-radius: 0.5rem;
border: 0; border: 0;
background-color: inherit; background-color: inherit;
@@ -160,7 +157,7 @@
cursor: not-allowed; cursor: not-allowed;
.page-link { .page-link {
color: rgba(108, 117, 125, 0.57); color: rgb(108 117 125 / 57%);
} }
} }
} /* .page-item */ } /* .page-item */

View File

@@ -2,33 +2,33 @@
color-scheme: dark; color-scheme: dark;
/* Framework color */ /* Framework color */
--main-bg: rgb(27, 27, 30); --main-bg: rgb(27 27 30);
--mask-bg: rgb(68, 69, 70); --mask-bg: rgb(68 69 70);
--main-border-color: rgb(44, 45, 45); --main-border-color: rgb(44 45 45);
/* Common color */ /* Common color */
--text-color: rgb(175, 176, 177); --text-color: rgb(175 176 177);
--text-muted-color: #868686; --text-muted-color: #868686;
--text-muted-highlight-color: #aeaeae; --text-muted-highlight-color: #aeaeae;
--heading-color: #cccccc; --heading-color: #cccccc;
--label-color: #a7a7a7; --label-color: #a7a7a7;
--blockquote-border-color: rgb(66, 66, 66); --blockquote-border-color: rgb(66 66 66);
--blockquote-text-color: #868686; --blockquote-text-color: #868686;
--link-color: rgb(138, 180, 248); --link-color: rgb(138 180 248);
--link-underline-color: rgb(82, 108, 150); --link-underline-color: rgb(82 108 150);
--button-bg: #1e1e1e; --button-bg: #1e1e1e;
--btn-border-color: #2e2f31; --btn-border-color: #2e2f31;
--btn-backtotop-color: var(--text-color); --btn-backtotop-color: var(--text-color);
--btn-backtotop-border-color: #212122; --btn-backtotop-border-color: #212122;
--card-header-bg: #292929; --card-header-bg: #292929;
--checkbox-color: rgb(118, 120, 121); --checkbox-color: rgb(118 120 121);
--checkbox-checked-color: var(--link-color); --checkbox-checked-color: var(--link-color);
--img-bg: radial-gradient(circle, rgb(22, 22, 24) 0%, rgb(32, 32, 32) 100%); --img-bg: radial-gradient(circle, rgb(22 22 24) 0%, rgb(32 32 32) 100%);
--shimmer-bg: linear-gradient( --shimmer-bg: linear-gradient(
90deg, 90deg,
rgba(255, 255, 255, 0) 0%, rgb(255 255 255 / 0%) 0%,
rgba(58, 55, 55, 0.4) 50%, rgb(58 55 55 / 40%) 50%,
rgba(255, 255, 255, 0) 100% rgb(255 255 255 / 0%) 100%
); );
/* Sidebar */ /* Sidebar */
@@ -37,65 +37,65 @@
--sidebar-bg: #1e1e1e; --sidebar-bg: #1e1e1e;
--sidebar-border-color: #292929; --sidebar-border-color: #292929;
--sidebar-muted-color: #868686; --sidebar-muted-color: #868686;
--sidebar-active-color: rgb(255, 255, 255, 0.95); --sidebar-active-color: rgb(255 255 255 / 95%);
--sidebar-hover-bg: #262626; --sidebar-hover-bg: #262626;
--sidebar-btn-bg: #232328; --sidebar-btn-bg: #232328;
--sidebar-btn-color: #787878; --sidebar-btn-color: #787878;
--avatar-border-color: rgb(206, 206, 206, 0.9); --avatar-border-color: rgb(206 206 206 / 90%);
/* Topbar */ /* Topbar */
--topbar-bg: rgb(27, 27, 30, 0.64); --topbar-bg: rgb(27 27 30 / 64%);
--topbar-text-color: var(--text-color); --topbar-text-color: var(--text-color);
--search-border-color: rgb(55, 55, 55); --search-border-color: rgb(55 55 55);
--search-icon-color: rgb(100, 102, 105); --search-icon-color: rgb(100 102 105);
--input-focus-border-color: rgb(112, 114, 115); --input-focus-border-color: rgb(112 114 115);
/* Home page */ /* Home page */
--post-list-text-color: rgb(175, 176, 177); --post-list-text-color: rgb(175 176 177);
--btn-patinator-text-color: var(--text-color); --btn-patinator-text-color: var(--text-color);
--btn-paginator-hover-color: #2e2e2e; --btn-paginator-hover-color: #2e2e2e;
/* Posts */ /* Posts */
--toc-highlight: rgb(116, 178, 243); --toc-highlight: rgb(116 178 243);
--toc-popup-border-color: #373737; --toc-popup-border-color: #373737;
--tag-hover: rgb(43, 56, 62); --tag-hover: rgb(43 56 62);
--tb-odd-bg: #252526; /* odd rows of the posts' table */ --tb-odd-bg: #252526; /* odd rows of the posts' table */
--tb-even-bg: rgb(31, 31, 34); /* even rows of the posts' table */ --tb-even-bg: rgb(31 31 34); /* even rows of the posts' table */
--tb-border-color: var(--tb-odd-bg); --tb-border-color: var(--tb-odd-bg);
--footnote-target-bg: rgb(63, 81, 181); --footnote-target-bg: rgb(63 81 181);
--btn-share-color: #6c757d; --btn-share-color: #6c757d;
--btn-share-hover-color: #bfc1ca; --btn-share-hover-color: #bfc1ca;
--card-bg: #1e1e1e; --card-bg: #1e1e1e;
--card-hovor-bg: #464d51; --card-hover-bg: #464d51;
--card-shadow: rgb(21, 21, 21, 0.72) 0 6px 18px 0, --card-shadow: rgb(21 21 21 / 72%) 0 6px 18px 0,
rgb(137, 135, 135, 0.24) 0 0 0 1px; rgb(137 135 135 / 24%) 0 0 0 1px;
--kbd-wrap-color: #6a6a6a; --kbd-wrap-color: #6a6a6a;
--kbd-text-color: #d3d3d3; --kbd-text-color: #d3d3d3;
--kbd-bg-color: #242424; --kbd-bg-color: #242424;
--prompt-text-color: rgb(216, 212, 212, 0.75); --prompt-text-color: rgb(216 212 212 / 75%);
--prompt-tip-bg: rgb(22, 60, 36, 0.64); --prompt-tip-bg: rgb(22 60 36 / 64%);
--prompt-tip-icon-color: rgb(15, 164, 15, 0.81); --prompt-tip-icon-color: rgb(15 164 15 / 81%);
--prompt-info-bg: rgb(7, 59, 104, 0.8); --prompt-info-bg: rgb(7 59 104 / 80%);
--prompt-info-icon-color: #0075d1; --prompt-info-icon-color: #0075d1;
--prompt-warning-bg: rgb(90, 69, 3, 0.88); --prompt-warning-bg: rgb(90 69 3 / 88%);
--prompt-warning-icon-color: rgb(255, 165, 0, 0.8); --prompt-warning-icon-color: rgb(255 165 0 / 80%);
--prompt-danger-bg: rgb(86, 28, 8, 0.8); --prompt-danger-bg: rgb(86 28 8 / 80%);
--prompt-danger-icon-color: #cd0202; --prompt-danger-icon-color: #cd0202;
/* Tags */ /* Tags */
--tag-border: rgb(59, 79, 88); --tag-border: rgb(59 79 88);
--tag-shadow: rgb(32, 33, 33); --tag-shadow: rgb(32 33 33);
--dash-color: rgb(63, 65, 68); --dash-color: rgb(63 65 68);
--search-tag-bg: #292828; --search-tag-bg: #292828;
/* Categories */ /* Categories */
--categories-border: rgb(64, 66, 69, 0.5); --categories-border: rgb(64 66 69 / 50%);
--categories-hover-bg: rgb(73, 75, 76); --categories-hover-bg: rgb(73 75 76);
--categories-icon-hover-color: white; --categories-icon-hover-color: white;
/* Archive */ /* Archive */
--timeline-node-bg: rgb(150, 152, 156); --timeline-node-bg: rgb(150 152 156);
--timeline-color: rgb(63, 65, 68); --timeline-color: rgb(63 65 68);
--timeline-year-dot-color: var(--timeline-color); --timeline-year-dot-color: var(--timeline-color);
/* Code highlight colors */ /* Code highlight colors */
@@ -103,7 +103,7 @@
--highlight-bg-color: #151515; --highlight-bg-color: #151515;
--highlighter-rouge-color: #c9def1; --highlighter-rouge-color: #c9def1;
--highlight-lineno-color: #808080; --highlight-lineno-color: #808080;
--inline-code-bg: rgba(255, 255, 255, 0.05); --inline-code-bg: rgb(255 255 255 / 5%);
--code-color: #b0b0b0; --code-color: #b0b0b0;
--code-header-text-color: #6a6a6a; --code-header-text-color: #6a6a6a;
--code-header-muted-color: #353535; --code-header-muted-color: #353535;
@@ -141,11 +141,11 @@
#archives li:nth-child(odd) { #archives li:nth-child(odd) {
background-image: linear-gradient( background-image: linear-gradient(
to left, to left,
rgb(26, 26, 30), rgb(26 26 30),
rgb(39, 39, 45), rgb(39 39 45),
rgb(39, 39, 45), rgb(39 39 45),
rgb(39, 39, 45), rgb(39 39 45),
rgb(26, 26, 30) rgb(26 26 30)
); );
} }

View File

@@ -20,34 +20,30 @@
--btn-backtotop-border-color: #f1f1f1; --btn-backtotop-border-color: #f1f1f1;
--checkbox-color: #c5c5c5; --checkbox-color: #c5c5c5;
--checkbox-checked-color: #07a8f7; --checkbox-checked-color: #07a8f7;
--img-bg: radial-gradient( --img-bg: radial-gradient(circle, rgb(255 255 255) 0%, rgb(239 239 239) 100%);
circle,
rgb(255, 255, 255) 0%,
rgb(239, 239, 239) 100%
);
--shimmer-bg: linear-gradient( --shimmer-bg: linear-gradient(
90deg, 90deg,
rgba(250, 250, 250, 0) 0%, rgb(250 250 250 / 0%) 0%,
rgba(232, 230, 230, 1) 50%, rgb(232 230 230 / 100%) 50%,
rgba(250, 250, 250, 0) 100% rgb(250 250 250 / 0%) 100%
); );
/* Sidebar */ /* Sidebar */
--site-title-color: rgb(113, 113, 113); --site-title-color: rgb(113 113 113);
--site-subtitle-color: #717171; --site-subtitle-color: #717171;
--sidebar-bg: #f6f8fa; --sidebar-bg: #f6f8fa;
--sidebar-border-color: #efefef; --sidebar-border-color: #efefef;
--sidebar-muted-color: #545454; --sidebar-muted-color: #545454;
--sidebar-active-color: #1d1d1d; --sidebar-active-color: #1d1d1d;
--sidebar-hover-bg: rgb(223, 233, 241, 0.64); --sidebar-hover-bg: rgb(223 233 241 / 64%);
--sidebar-btn-bg: white; --sidebar-btn-bg: white;
--sidebar-btn-color: #8e8e8e; --sidebar-btn-color: #8e8e8e;
--avatar-border-color: white; --avatar-border-color: white;
/* Topbar */ /* Topbar */
--topbar-bg: rgb(255, 255, 255, 0.7); --topbar-bg: rgb(255 255 255 / 70%);
--topbar-text-color: rgb(78, 78, 78); --topbar-text-color: rgb(78 78 78);
--search-border-color: rgb(240, 240, 240); --search-border-color: rgb(240 240 240);
--search-icon-color: #c2c6cc; --search-icon-color: #c2c6cc;
--input-focus-border-color: #b8b8b8; --input-focus-border-color: #b8b8b8;
@@ -62,9 +58,9 @@
--btn-share-color: gray; --btn-share-color: gray;
--btn-share-hover-color: #0d6efd; --btn-share-hover-color: #0d6efd;
--card-bg: white; --card-bg: white;
--card-hovor-bg: #e2e2e2; --card-hover-bg: #e2e2e2;
--card-shadow: rgb(104, 104, 104, 0.05) 0 2px 6px 0, --card-shadow: rgb(104 104 104 / 5%) 0 2px 6px 0,
rgba(211, 209, 209, 0.15) 0 0 0 1px; rgb(211 209 209 / 15%) 0 0 0 1px;
--footnote-target-bg: lightcyan; --footnote-target-bg: lightcyan;
--tb-odd-bg: #fbfcfd; --tb-odd-bg: #fbfcfd;
--tb-border-color: #eaeaea; --tb-border-color: #eaeaea;
@@ -72,29 +68,29 @@
--kbd-wrap-color: #bdbdbd; --kbd-wrap-color: #bdbdbd;
--kbd-text-color: var(--text-color); --kbd-text-color: var(--text-color);
--kbd-bg-color: white; --kbd-bg-color: white;
--prompt-text-color: rgb(46, 46, 46, 0.77); --prompt-text-color: rgb(46 46 46 / 77%);
--prompt-tip-bg: rgb(123, 247, 144, 0.2); --prompt-tip-bg: rgb(123 247 144 / 20%);
--prompt-tip-icon-color: #03b303; --prompt-tip-icon-color: #03b303;
--prompt-info-bg: #e1f5fe; --prompt-info-bg: #e1f5fe;
--prompt-info-icon-color: #0070cb; --prompt-info-icon-color: #0070cb;
--prompt-warning-bg: rgb(255, 243, 205); --prompt-warning-bg: rgb(255 243 205);
--prompt-warning-icon-color: #ef9c03; --prompt-warning-icon-color: #ef9c03;
--prompt-danger-bg: rgb(248, 215, 218, 0.56); --prompt-danger-bg: rgb(248 215 218 / 56%);
--prompt-danger-icon-color: #df3c30; --prompt-danger-icon-color: #df3c30;
/* Tags */ /* Tags */
--tag-border: #dee2e6; --tag-border: #dee2e6;
--tag-shadow: var(--btn-border-color); --tag-shadow: var(--btn-border-color);
--tag-hover: rgb(222, 226, 230); --tag-hover: rgb(222 226 230);
--search-tag-bg: #f8f9fa; --search-tag-bg: #f8f9fa;
/* Categories */ /* Categories */
--categories-border: rgba(0, 0, 0, 0.125); --categories-border: rgb(0 0 0 / 12.5%);
--categories-hover-bg: var(--btn-border-color); --categories-hover-bg: var(--btn-border-color);
--categories-icon-hover-color: darkslategray; --categories-icon-hover-color: darkslategray;
/* Archive */ /* Archive */
--timeline-color: rgba(0, 0, 0, 0.075); --timeline-color: rgb(0 0 0 / 7.5%);
--timeline-node-bg: #c2c6cc; --timeline-node-bg: #c2c6cc;
--timeline-year-dot-color: #ffffff; --timeline-year-dot-color: #ffffff;
@@ -103,7 +99,7 @@
--highlight-bg-color: #f6f8fa; --highlight-bg-color: #f6f8fa;
--highlighter-rouge-color: #3f596f; --highlighter-rouge-color: #3f596f;
--highlight-lineno-color: #9e9e9e; --highlight-lineno-color: #9e9e9e;
--inline-code-bg: rgba(25, 25, 28, 0.05); --inline-code-bg: rgb(25 25 28 / 5%);
--code-color: #3a3a3a; --code-color: #3a3a3a;
--code-header-text-color: #a3a3a3; --code-header-text-color: #a3a3a3;
--code-header-muted-color: #e5e5e5; --code-header-muted-color: #e5e5e5;
@@ -111,7 +107,7 @@
--clipboard-checked-color: #43c743; --clipboard-checked-color: #43c743;
[class^='prompt-'] { [class^='prompt-'] {
--link-underline-color: rgb(219, 216, 216); --link-underline-color: rgb(219 216 216);
} }
.dark { .dark {

View File

@@ -45,7 +45,7 @@ permalink: /feed.xml
{% endfor %} {% endfor %}
{% endif %} {% endif %}
<summary>{% include post-description.html max_length=400 %}</summary> <summary>{% include post-summary.html max_length=400 %}</summary>
</entry> </entry>
{% endfor %} {% endfor %}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

BIN
assets/img/favicons/apple-touch-icon.png Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1,13 +0,0 @@
---
layout: compress
---
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="{{ '/assets/img/favicons/mstile-150x150.png' | relative_url }}" />
<TileColor>#da532c</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

BIN
assets/img/favicons/favicon.ico Normal file → Executable file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

10
assets/img/favicons/site.webmanifest Normal file → Executable file
View File

@@ -10,15 +10,17 @@ layout: compress
"description": "{{ site.description }}", "description": "{{ site.description }}",
"icons": [ "icons": [
{ {
"src": "{{ favicon_path }}/android-chrome-192x192.png", "src": "{{ favicon_path }}/web-app-manifest-192x192.png",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "{{ favicon_path }}/android-chrome-512x512.png", "src": "{{ favicon_path }}/web-app-manifest-512x512.png",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png" "type": "image/png",
}], "purpose": "maskable"
}
],
"start_url": "{{ '/index.html' | relative_url }}", "start_url": "{{ '/index.html' | relative_url }}",
"theme_color": "#2a1e6b", "theme_color": "#2a1e6b",
"background_color": "#ffffff", "background_color": "#ffffff",

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

View File

@@ -5,16 +5,14 @@ swcache: true
[ [
{% for post in site.posts %} {% for post in site.posts %}
{%- capture description -%}
{% include post-description.html %}
{%- endcapture -%}
{ {
"title": {{ post.title | jsonify }}, "title": {{ post.title | jsonify }},
"url": {{ post.url | relative_url | jsonify }}, "url": {{ post.url | relative_url | jsonify }},
"categories": {{ post.categories | join: ', ' | jsonify }}, "categories": {{ post.categories | join: ', ' | jsonify }},
"tags": {{ post.tags | join: ', ' | jsonify }}, "tags": {{ post.tags | join: ', ' | jsonify }},
"date": "{{ post.date }}", "date": {{ post.date | jsonify }},
"content": "{{ description }}" {% capture content -%}{% include post-summary.html full_text=true %}{%- endcapture -%}
"content": {{ content | jsonify }}
}{% unless forloop.last %},{% endunless %} }{% unless forloop.last %},{% endunless %}
{% endfor %} {% endfor %}
] ]

View File

@@ -1,5 +1,33 @@
# Changelog # Changelog
## [7.4.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.4.0...v7.4.1) (2025-10-26)
### Bug Fixes
* avoid duplicate base URL for homepage preview images ([#2568](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2568)) ([66bf232](https://github.com/cotes2020/jekyll-theme-chirpy/commit/66bf232951fbe752821b623dc1e7e4e2824c15bf))
## [7.4.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.3.1...v7.4.0) (2025-10-19)
### Features
* add support for embed spotify ([#2515](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2515)) ([cda62e2](https://github.com/cotes2020/jekyll-theme-chirpy/commit/cda62e28d1b71ce4018301aacf93532230aa2b3b))
* **i18n:** add Danish locale ([#2410](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2410)) ([f5802b8](https://github.com/cotes2020/jekyll-theme-chirpy/commit/f5802b8a8a4fb94cd51a484e438f6ba2ba8d62c9))
* **i18n:** add locale files for some rtl languages ([#2415](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2415)) ([18c48b4](https://github.com/cotes2020/jekyll-theme-chirpy/commit/18c48b4c49f896eeeeb52a8de1dca715add70c6a))
### Bug Fixes
* avoid unconfigured social options in sidebar ([#2507](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2507)) ([5f8ec7f](https://github.com/cotes2020/jekyll-theme-chirpy/commit/5f8ec7ffd3b23998bad48c110e809576fe5daf80))
* correct GoatCounter pageviews extraction ([#2420](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2420)) ([c706799](https://github.com/cotes2020/jekyll-theme-chirpy/commit/c706799f9b2e724dee9a3b891dea72dfa587929e))
* resolve discrepancy in lqip between post and main page ([#2453](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2453)) ([1bac96a](https://github.com/cotes2020/jekyll-theme-chirpy/commit/1bac96a8e1ae23a7a48f2b7d249bfbfd5d9bfe50))
* restore blurry animation for homepage LQIP ([#2551](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2551)) ([221ca9f](https://github.com/cotes2020/jekyll-theme-chirpy/commit/221ca9f52b55b103900832f3c03ad2ecc4415bcc))
* **search:** restore full-text search for posts with description ([#2557](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2557)) ([604528e](https://github.com/cotes2020/jekyll-theme-chirpy/commit/604528e3ce11ec0278e83f41105ed5949362bb54))
## [7.3.1](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.3.0...v7.3.1) (2025-07-26)
### Bug Fixes
* escape special JSON characters in search results ([#2481](https://github.com/cotes2020/jekyll-theme-chirpy/issues/2481)) ([7615d72](https://github.com/cotes2020/jekyll-theme-chirpy/commit/7615d72e9300a1514ef2fc8ec941ab2974ba7eb4))
## [7.3.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.2.4...v7.3.0) (2025-05-18) ## [7.3.0](https://github.com/cotes2020/jekyll-theme-chirpy/compare/v7.2.4...v7.3.0) (2025-05-18)
### Features ### Features

View File

@@ -1,5 +1,35 @@
export default [ import { defineConfig, globalIgnores } from 'eslint/config';
import js from '@eslint/js';
import globals from 'globals';
export default defineConfig([
globalIgnores(['assets/*', 'node_modules/*', '_site/*']),
js.configs.recommended,
{ {
files: ['_javascript/**/*.js'] rules: {
semi: ['error', 'always'],
quotes: ['error', 'single']
},
languageOptions: {
globals: {
...globals.browser,
...globals.node
}
}
},
{
files: ['_javascript/**/*.js'],
languageOptions: {
globals: {
...globals.serviceworker,
ClipboardJS: 'readonly',
GLightbox: 'readonly',
Theme: 'readonly',
dayjs: 'readonly',
mermaid: 'readonly',
tocbot: 'readonly',
swconf: 'readonly'
}
}
} }
]; ]);

View File

@@ -2,7 +2,7 @@
Gem::Specification.new do |spec| Gem::Specification.new do |spec|
spec.name = "jekyll-theme-chirpy" spec.name = "jekyll-theme-chirpy"
spec.version = "7.3.0" spec.version = "7.4.1"
spec.authors = ["Cotes Chung"] spec.authors = ["Cotes Chung"]
spec.email = ["cotes.chung@gmail.com"] spec.email = ["cotes.chung@gmail.com"]

View File

@@ -1,6 +1,6 @@
{ {
"name": "jekyll-theme-chirpy", "name": "jekyll-theme-chirpy",
"version": "7.3.0", "version": "7.4.1",
"description": "A minimal, responsive, and feature-rich Jekyll theme for technical writing.", "description": "A minimal, responsive, and feature-rich Jekyll theme for technical writing.",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -13,41 +13,45 @@
"url": "https://github.com/cotes2020/jekyll-theme-chirpy/issues" "url": "https://github.com/cotes2020/jekyll-theme-chirpy/issues"
}, },
"homepage": "https://github.com/cotes2020/jekyll-theme-chirpy/", "homepage": "https://github.com/cotes2020/jekyll-theme-chirpy/",
"type": "module",
"scripts": { "scripts": {
"build": "concurrently npm:build:*", "build": "concurrently npm:build:*",
"build:css": "node purgecss.js", "build:css": "node purgecss.js",
"build:js": "rollup -c --bundleConfigAsCjs --environment BUILD:production", "build:js": "rollup -c --bundleConfigAsCjs --environment BUILD:production",
"watch:js": "rollup -c --bundleConfigAsCjs -w", "watch:js": "rollup -c --bundleConfigAsCjs -w",
"lint:js": "eslint",
"lint:scss": "stylelint _sass/**/*.scss", "lint:scss": "stylelint _sass/**/*.scss",
"lint:fix:scss": "npm run lint:scss -- --fix", "lint:fix:scss": "npm run lint:scss -- --fix",
"test": "npm run lint:scss", "test": "npm run lint:js && npm run lint:scss",
"prepare": "husky" "prepare": "husky"
}, },
"dependencies": { "dependencies": {
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",
"bootstrap": "^5.3.6" "bootstrap": "^5.3.8"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.27.1", "@babel/core": "^7.28.5",
"@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-properties": "^7.27.1",
"@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-methods": "^7.27.1",
"@babel/preset-env": "^7.27.2", "@babel/preset-env": "^7.28.5",
"@commitlint/cli": "^19.8.1", "@commitlint/cli": "^20.2.0",
"@commitlint/config-conventional": "^19.8.1", "@commitlint/config-conventional": "^20.2.0",
"@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-babel": "^6.1.0",
"@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-terser": "^0.4.4",
"@semantic-release/changelog": "^6.0.3", "@semantic-release/changelog": "^6.0.3",
"@semantic-release/exec": "^7.1.0", "@semantic-release/exec": "^7.1.0",
"@semantic-release/git": "^10.0.1", "@semantic-release/git": "^10.0.1",
"concurrently": "^9.1.2", "concurrently": "^9.2.1",
"conventional-changelog-conventionalcommits": "^8.0.0", "conventional-changelog-conventionalcommits": "^9.1.0",
"eslint": "^9.39.1",
"globals": "^16.5.0",
"husky": "^9.1.7", "husky": "^9.1.7",
"purgecss": "^7.0.2", "purgecss": "^7.0.2",
"rollup": "^4.41.0", "rollup": "^4.53.3",
"semantic-release": "^24.2.4", "semantic-release": "^25.0.2",
"stylelint": "^16.19.1", "stylelint": "^16.26.1",
"stylelint-config-standard-scss": "^15.0.1" "stylelint-config-standard-scss": "^16.0.0"
}, },
"prettier": { "prettier": {
"trailingComma": "none" "trailingComma": "none"

View File

@@ -1,5 +1,6 @@
const fs = require('fs').promises; import { promises as fs } from 'fs';
const { PurgeCSS } = require('purgecss'); import { PurgeCSS } from 'purgecss';
const DIST_PATH = '_sass/vendors'; const DIST_PATH = '_sass/vendors';
const output = `${DIST_PATH}/_bootstrap.scss`; const output = `${DIST_PATH}/_bootstrap.scss`;

View File

@@ -11,7 +11,7 @@ const DIST = 'assets/js/dist';
const banner = `/*! const banner = `/*!
* ${pkg.name} v${pkg.version} | © ${pkg.since} ${pkg.author} | ${pkg.license} Licensed | ${pkg.homepage} * ${pkg.name} v${pkg.version} | © ${pkg.since} ${pkg.author} | ${pkg.license} Licensed | ${pkg.homepage}
*/`; */`;
const frontmatter = `---\npermalink: /:basename\n---\n`; const frontmatter = '---\npermalink: /:basename\n---\n';
const isProd = process.env.BUILD === 'production'; const isProd = process.env.BUILD === 'production';
let hasWatched = false; let hasWatched = false;