diff --git a/.github/workflows/run.yml b/.github/workflows/run.yml index 2b554206..c102b775 100644 --- a/.github/workflows/run.yml +++ b/.github/workflows/run.yml @@ -1,33 +1,161 @@ -name: Build and deploy Jekyll site to GitHub Pages +name: Build and Deploy Cypherpunks Taiwan V2.0 on: push: branches: - master + pull_request: + branches: + - master + +# Sets permissions of the GITHUB_TOKEN +permissions: + contents: write + pages: write + id-token: write + +# Allow only one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true jobs: - build-and-deploy: - runs-on: ubuntu-22.04 - permissions: - contents: write + build: + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Set up Ruby + - name: Checkout repository + uses: actions/checkout@v4 + + # Setup Node.js for Tailwind CSS + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install Node dependencies + run: npm ci || npm install + + - name: Build Tailwind CSS + run: npm run css:build + + # Setup Ruby for Jekyll + - name: Setup Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: '3.0' + ruby-version: '3.2' bundler-cache: true - - name: Install dependencies + + - name: Install Ruby dependencies run: | - bundle config unset deployment - sudo gem install bundler:2.2.15 - bundle install - bundle add kramdown-parser-gfm - bundle install - - name: Build site - run: bundle exec jekyll build + bundle config set --local path 'vendor/bundle' + bundle install --jobs 4 --retry 3 + + - name: Build Jekyll site + run: | + # Check if this is a project page (repo name != owner.github.io) + REPO_NAME="${GITHUB_REPOSITORY#*/}" + OWNER="${GITHUB_REPOSITORY_OWNER}" + if [[ "$REPO_NAME" != "${OWNER}.github.io" ]]; then + echo "Building for project page: baseurl=/${REPO_NAME}" + bundle exec jekyll build --baseurl "/${REPO_NAME}" + else + echo "Building for user/org page: no baseurl" + bundle exec jekyll build + fi + env: + JEKYLL_ENV: production + + - name: Build Pagefind search index + run: npx pagefind --site _site --output-path _site/pagefind + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./_site + + deploy: + if: github.ref == 'refs/heads/master' + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 + id: deployment + uses: actions/deploy-pages@v4 + + # Quality Checks (run on PRs) + quality-check: + if: github.event_name == 'pull_request' + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: github-pages + path: _site + + - name: Extract artifact + run: | + cd _site + tar -xvf artifact.tar + rm artifact.tar + + # Link Checker + - name: Check links + uses: lycheeverse/lychee-action@v1 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./_site \ No newline at end of file + args: --verbose --no-progress --accept 999 './_site/**/*.html' + fail: false + + # HTML Validation + - name: Setup Node.js for html-validate + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install html-validate + run: npm install -g html-validate + + - name: Validate HTML + run: | + html-validate --config .htmlvalidate.json "_site/**/*.html" || true + continue-on-error: true + + # Accessibility Check + - name: Install pa11y + run: npm install -g pa11y-ci + + - name: Run accessibility check + run: | + pa11y-ci --config .pa11yci.json || true + continue-on-error: true + + # Image Compression (run on PRs with image changes) + compress-images: + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Compress Images + id: compress + uses: calibreapp/image-actions@main + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} + compressOnly: true + ignorePaths: 'node_modules/**,vendor/**,_site/**' + continue-on-error: true + + - name: Create image compression summary + if: steps.compress.outputs.markdown != '' + run: | + echo "## Image Compression Results" >> $GITHUB_STEP_SUMMARY + echo "${{ steps.compress.outputs.markdown }}" >> $GITHUB_STEP_SUMMARY diff --git a/.htmlvalidate.json b/.htmlvalidate.json new file mode 100644 index 00000000..953c93f8 --- /dev/null +++ b/.htmlvalidate.json @@ -0,0 +1,22 @@ +{ + "extends": ["html-validate:recommended"], + "rules": { + "no-trailing-whitespace": "off", + "void-style": "off", + "prefer-native-element": "off", + "no-inline-style": "off", + "require-sri": "off", + "script-type": "off", + "attribute-allowed-values": "off", + "element-permitted-content": "warn", + "no-unknown-elements": "warn", + "wcag/h30": "warn", + "wcag/h32": "warn", + "wcag/h36": "warn", + "wcag/h37": "warn", + "wcag/h67": "warn" + }, + "transform": { + "^.*\\.html$": "html-validate:plain" + } +} diff --git a/.pa11yci.json b/.pa11yci.json new file mode 100644 index 00000000..e4a81340 --- /dev/null +++ b/.pa11yci.json @@ -0,0 +1,18 @@ +{ + "defaults": { + "timeout": 30000, + "wait": 500, + "standard": "WCAG2AA", + "runners": ["axe"], + "chromeLaunchConfig": { + "args": ["--no-sandbox", "--disable-setuid-sandbox"] + } + }, + "urls": [ + "http://localhost:4000/", + "http://localhost:4000/blog/", + "http://localhost:4000/tags/", + "http://localhost:4000/categories/", + "http://localhost:4000/archive/" + ] +} diff --git a/Gemfile b/Gemfile index 9313e6ce..a7644a94 100644 --- a/Gemfile +++ b/Gemfile @@ -1,12 +1,26 @@ # frozen_string_literal: true source "https://rubygems.org" -gemspec +# Jekyll 4.x +gem "jekyll", "~> 4.3" + +# Jekyll plugins group :jekyll_plugins do - gem "jekyll-feed", "~> 0.6" - gem "jekyll-sitemap" - gem "jekyll-paginate" - gem "jekyll-seo-tag" + gem "jekyll-feed", "~> 0.17" + gem "jekyll-sitemap", "~> 1.4" + gem "jekyll-paginate", "~> 1.1" + gem "jekyll-seo-tag", "~> 2.8" + gem "kramdown-parser-gfm", "~> 1.1" +end + +# Performance +gem "webrick", "~> 1.8" # Required for Ruby 3.0+ + +# Windows specific +platforms :mingw, :x64_mingw, :mswin, :jruby do + gem "tzinfo", ">= 1", "< 3" + gem "tzinfo-data" end +gem "wdm", "~> 0.1", :platforms => [:mingw, :x64_mingw, :mswin] diff --git a/Gemfile.lock b/Gemfile.lock index 77c71038..6c9d3cf4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,89 +1,249 @@ -PATH - remote: . - specs: - bulma-clean-theme (0.5.7) - jekyll (~> 3.8) - jekyll-feed (~> 0.11) - jekyll-paginate (~> 1.1) - jekyll-seo-tag (~> 2.5) - jekyll-sitemap (~> 1.2) - kramdown (>= 1.17, < 3.0) - rouge (~> 3.3) - GEM remote: https://rubygems.org/ specs: - addressable (2.8.1) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.8) + public_suffix (>= 2.0.2, < 8.0) + base64 (0.3.0) + bigdecimal (3.3.1) colorator (1.1.0) - concurrent-ruby (1.1.8) - em-websocket (0.5.2) + concurrent-ruby (1.3.5) + csv (3.3.5) + em-websocket (0.5.3) eventmachine (>= 0.12.9) - http_parser.rb (~> 0.6.0) + http_parser.rb (~> 0) eventmachine (1.2.7) - ffi (1.15.0) + ffi (1.17.2) + ffi (1.17.2-aarch64-linux-gnu) + ffi (1.17.2-aarch64-linux-musl) + ffi (1.17.2-arm-linux-gnu) + ffi (1.17.2-arm-linux-musl) + ffi (1.17.2-arm64-darwin) + ffi (1.17.2-x86-linux-gnu) + ffi (1.17.2-x86-linux-musl) + ffi (1.17.2-x86_64-darwin) + ffi (1.17.2-x86_64-linux-gnu) + ffi (1.17.2-x86_64-linux-musl) forwardable-extended (2.6.0) - http_parser.rb (0.6.0) - i18n (0.9.5) + google-protobuf (4.33.2) + bigdecimal + rake (>= 13) + google-protobuf (4.33.2-aarch64-linux-gnu) + bigdecimal + rake (>= 13) + google-protobuf (4.33.2-aarch64-linux-musl) + bigdecimal + rake (>= 13) + google-protobuf (4.33.2-arm64-darwin) + bigdecimal + rake (>= 13) + google-protobuf (4.33.2-x86-linux-gnu) + bigdecimal + rake (>= 13) + google-protobuf (4.33.2-x86-linux-musl) + bigdecimal + rake (>= 13) + google-protobuf (4.33.2-x86_64-darwin) + bigdecimal + rake (>= 13) + google-protobuf (4.33.2-x86_64-linux-gnu) + bigdecimal + rake (>= 13) + google-protobuf (4.33.2-x86_64-linux-musl) + bigdecimal + rake (>= 13) + http_parser.rb (0.8.0) + i18n (1.14.7) concurrent-ruby (~> 1.0) - jekyll (3.9.1) + jekyll (4.4.1) addressable (~> 2.4) + base64 (~> 0.2) colorator (~> 1.0) + csv (~> 3.0) em-websocket (~> 0.5) - i18n (~> 0.7) - jekyll-sass-converter (~> 1.0) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) jekyll-watch (~> 2.0) - kramdown (>= 1.17, < 3) + json (~> 2.6) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) liquid (~> 4.0) - mercenary (~> 0.3.3) + mercenary (~> 0.3, >= 0.3.6) pathutil (~> 0.9) - rouge (>= 1.7, < 4) + rouge (>= 3.0, < 5.0) safe_yaml (~> 1.0) - jekyll-feed (0.15.1) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-feed (0.17.0) jekyll (>= 3.7, < 5.0) jekyll-paginate (1.1.0) - jekyll-sass-converter (1.5.2) - sass (~> 3.4) - jekyll-seo-tag (2.7.1) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) + jekyll-seo-tag (2.8.0) jekyll (>= 3.8, < 5.0) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - kramdown (2.4.0) - rexml - liquid (4.0.3) - listen (3.5.1) + json (2.18.0) + kramdown (2.5.1) + rexml (>= 3.3.9) + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.3.6) + mercenary (0.4.0) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (5.0.0) - rake (12.3.3) - rb-fsevent (0.10.4) - rb-inotify (0.10.1) + public_suffix (7.0.0) + rake (13.3.1) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.2.5) - rouge (3.26.0) + rexml (3.4.4) + rouge (4.6.1) safe_yaml (1.0.5) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) + sass-embedded (1.96.0) + google-protobuf (~> 4.31) + rake (>= 13) + sass-embedded (1.96.0-aarch64-linux-android) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-aarch64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-aarch64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-arm-linux-androideabi) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-arm-linux-gnueabihf) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-arm-linux-musleabihf) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-arm64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-riscv64-linux-android) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-riscv64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-riscv64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-x86_64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-x86_64-linux-android) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-x86_64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.96.0-x86_64-linux-musl) + google-protobuf (~> 4.31) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + unicode-display_width (2.6.0) + webrick (1.9.2) PLATFORMS + aarch64-linux-android + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-androideabi + arm-linux-gnu + arm-linux-gnueabihf + arm-linux-musl + arm-linux-musleabihf + arm64-darwin + riscv64-linux-android + riscv64-linux-gnu + riscv64-linux-musl ruby + x86-linux-gnu + x86-linux-musl + x86_64-darwin + x86_64-linux-android + x86_64-linux-gnu + x86_64-linux-musl DEPENDENCIES - bulma-clean-theme! - bundler (~> 2.0) - jekyll-feed (~> 0.6) - jekyll-paginate - jekyll-seo-tag - jekyll-sitemap - rake (~> 12.0) + jekyll (~> 4.3) + jekyll-feed (~> 0.17) + jekyll-paginate (~> 1.1) + jekyll-seo-tag (~> 2.8) + jekyll-sitemap (~> 1.4) + kramdown-parser-gfm (~> 1.1) + tzinfo (>= 1, < 3) + tzinfo-data + wdm (~> 0.1) + webrick (~> 1.8) + +CHECKSUMS + addressable (2.8.8) sha256=7c13b8f9536cf6364c03b9d417c19986019e28f7c00ac8132da4eb0fe393b057 + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b + bigdecimal (3.3.1) sha256=eaa01e228be54c4f9f53bf3cc34fe3d5e845c31963e7fcc5bedb05a4e7d52218 + colorator (1.1.0) sha256=e2f85daf57af47d740db2a32191d1bdfb0f6503a0dfbc8327d0c9154d5ddfc38 + concurrent-ruby (1.3.5) sha256=813b3e37aca6df2a21a3b9f1d497f8cbab24a2b94cab325bffe65ee0f6cbebc6 + csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f + em-websocket (0.5.3) sha256=f56a92bde4e6cb879256d58ee31f124181f68f8887bd14d53d5d9a292758c6a8 + eventmachine (1.2.7) sha256=994016e42aa041477ba9cff45cbe50de2047f25dd418eba003e84f0d16560972 + ffi (1.17.2) sha256=297235842e5947cc3036ebe64077584bff583cd7a4e94e9a02fdec399ef46da6 + ffi (1.17.2-aarch64-linux-gnu) sha256=c910bd3cae70b76690418cce4572b7f6c208d271f323d692a067d59116211a1a + ffi (1.17.2-aarch64-linux-musl) sha256=69e6556b091d45df83e6c3b19d3c54177c206910965155a6ec98de5e893c7b7c + ffi (1.17.2-arm-linux-gnu) sha256=d4a438f2b40224ae42ec72f293b3ebe0ba2159f7d1bd47f8417e6af2f68dbaa5 + ffi (1.17.2-arm-linux-musl) sha256=977dfb7f3a6381206dbda9bc441d9e1f9366bf189a634559c3b7c182c497aaa3 + ffi (1.17.2-arm64-darwin) sha256=54dd9789be1d30157782b8de42d8f887a3c3c345293b57ffb6b45b4d1165f813 + ffi (1.17.2-x86-linux-gnu) sha256=95d8f9ebea23c39888e2ab85a02c98f54acb2f4e79b829250d7267ce741dc7b0 + ffi (1.17.2-x86-linux-musl) sha256=41741449bab2b9530f42a47baa5c26263925306fad0ac2d60887f51af2e3b24c + ffi (1.17.2-x86_64-darwin) sha256=981f2d4e32ea03712beb26e55e972797c2c5a7b0257955d8667ba58f2da6440e + ffi (1.17.2-x86_64-linux-gnu) sha256=05d2026fc9dbb7cfd21a5934559f16293815b7ce0314846fee2ac8efbdb823ea + ffi (1.17.2-x86_64-linux-musl) sha256=97c0eb3981414309285a64dc4d466bd149e981c279a56371ef811395d68cb95c + forwardable-extended (2.6.0) sha256=1bec948c469bbddfadeb3bd90eb8c85f6e627a412a3e852acfd7eaedbac3ec97 + google-protobuf (4.33.2) sha256=748150d6c642fd655ef39efa23ecf2abe6d616020039a6d1c1764be1da530315 + google-protobuf (4.33.2-aarch64-linux-gnu) sha256=822b2dcb707e94e652cd994642c31035935fca021adfac6164772c511eb7acd4 + google-protobuf (4.33.2-aarch64-linux-musl) sha256=c4b64428183cfd1953ec8c37beec1036668c8ec0865cfb0b18df21181ca397ee + google-protobuf (4.33.2-arm64-darwin) sha256=6d0ac185fed18768e5f16338455b1e4b7c38a97fc46f352e709f7a3007b64e1d + google-protobuf (4.33.2-x86-linux-gnu) sha256=82612c425d7a0b0f8f299d8e595a367984fcd22a155b8ac5861eea0e76ca1a93 + google-protobuf (4.33.2-x86-linux-musl) sha256=cc7e322228967c230f3b9c47a76de4e59fb47001900f4cbdf9056d1de92199ab + google-protobuf (4.33.2-x86_64-darwin) sha256=87cde586234674562cf099e2b708a65e376e2d39b0f0f48281f4b4ea182b47f8 + google-protobuf (4.33.2-x86_64-linux-gnu) sha256=73cba041477afcac92ff383fcbdec195ea28d96b994876d1deaa944d18f91786 + google-protobuf (4.33.2-x86_64-linux-musl) sha256=97cdf4f772c5540f9274603b00f1474ed5e6e2238b1d8b1585e77f941a36bd2c + http_parser.rb (0.8.0) sha256=5a0932f1fa82ce08a8516a2685d5a86031c000560f89946913c555a0697544be + i18n (1.14.7) sha256=ceba573f8138ff2c0915427f1fc5bdf4aa3ab8ae88c8ce255eb3ecf0a11a5d0f + jekyll (4.4.1) sha256=4c1144d857a5b2b80d45b8cf5138289579a9f8136aadfa6dd684b31fe2bc18c1 + jekyll-feed (0.17.0) sha256=689aab16c877949bb9e7a5c436de6278318a51ecb974792232fd94d8b3acfcc3 + jekyll-paginate (1.1.0) sha256=880aadf4b02529a93541d508c5cbb744f014cbfc071d0263a31f25ec9066eb64 + jekyll-sass-converter (3.1.0) sha256=83925d84f1d134410c11d0c6643b0093e82e3a3cf127e90757a85294a3862443 + jekyll-seo-tag (2.8.0) sha256=3f2ed1916d56f14ebfa38e24acde9b7c946df70cb183af2cb5f0598f21ae6818 + jekyll-sitemap (1.4.0) sha256=0de08c5debc185ea5a8f980e1025c7cd3f8e0c35c8b6ef592f15c46235cf4218 + jekyll-watch (2.2.1) sha256=bc44ed43f5e0a552836245a54dbff3ea7421ecc2856707e8a1ee203a8387a7e1 + json (2.18.0) sha256=b10506aee4183f5cf49e0efc48073d7b75843ce3782c68dbeb763351c08fd505 + kramdown (2.5.1) sha256=87bbb6abd9d3cebe4fc1f33e367c392b4500e6f8fa19dd61c0972cf4afe7368c + kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 + liquid (4.0.4) sha256=4fcfebb1a045e47918388dbb7a0925e7c3893e58d2bd6c3b3c73ec17a2d8fdb3 + listen (3.9.0) sha256=db9e4424e0e5834480385197c139cb6b0ae0ef28cc13310cfd1ca78377d59c67 + mercenary (0.4.0) sha256=b25a1e4a59adca88665e08e24acf0af30da5b5d859f7d8f38fba52c28f405138 + pathutil (0.16.2) sha256=e43b74365631cab4f6d5e4228f812927efc9cb2c71e62976edcb252ee948d589 + public_suffix (7.0.0) sha256=f7090b5beb0e56f9f10d79eed4d5fbe551b3b425da65877e075dad47a6a1b095 + rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c + rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe + rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rouge (4.6.1) sha256=5075346d5797d6864be93f7adc75a16047a7dbfa572c63c502419ffa582c77de + safe_yaml (1.0.5) sha256=a6ac2d64b7eb027bdeeca1851fe7e7af0d668e133e8a88066a0c6f7087d9f848 + sass-embedded (1.96.0) sha256=a124de2a3451827dcf936bd54918265e414da623f1671c14f268d7cbdab56504 + sass-embedded (1.96.0-aarch64-linux-android) sha256=1c15e27ee6170ea54daa079de961869bf2f4d68a3796bf9a1661629323a0b026 + sass-embedded (1.96.0-aarch64-linux-gnu) sha256=b3cc3f96b2d2989c38f8c6dfdb438c8aa1a3a319f3e92ce2b013c03fa104e50c + sass-embedded (1.96.0-aarch64-linux-musl) sha256=e3d1a743b83b75a04d5c62e5d1ff53a7da4db5beb847900c046e47246e7a8714 + sass-embedded (1.96.0-arm-linux-androideabi) sha256=3cfba81f918956b88120fdd121c333833b3dcb5d0713e237d6e87fdfeb27ee77 + sass-embedded (1.96.0-arm-linux-gnueabihf) sha256=834704287fd696745c8bd2e87f49c917584abb1465bfc2ece3eb75b6b197336f + sass-embedded (1.96.0-arm-linux-musleabihf) sha256=6e1065e177982cae929797930b64e290f1bb9ee70a38cd3d7a9a747858f5ff4d + sass-embedded (1.96.0-arm64-darwin) sha256=c267a0c41d0e0ae2fcdf3b4afad5498599f5401c7d0d4a04a0b3379cde5eff20 + sass-embedded (1.96.0-riscv64-linux-android) sha256=6f634ce97fcfba4a8af86cca0872043d68001682dc55e3e173af470f00543153 + sass-embedded (1.96.0-riscv64-linux-gnu) sha256=8eec6915c1433ddbd99e978b35b0710030ae25c37b45dec1bc1ca67408abd1b9 + sass-embedded (1.96.0-riscv64-linux-musl) sha256=74f407df2d3ff0bfb03d1b6bcbb7bf9387f8cf18b93170f8c0017dd0057cc91a + sass-embedded (1.96.0-x86_64-darwin) sha256=eaa06f87663641bc9848e949abfa33ade83373417339c772f34b32f1533903fb + sass-embedded (1.96.0-x86_64-linux-android) sha256=e99d58e8df3bac29026b16606d7de46910e4228098f81da0313b98575506c363 + sass-embedded (1.96.0-x86_64-linux-gnu) sha256=e505697c06504ed687786f97024b94131c9a76bd92a61c8f10352a62c785c1b4 + sass-embedded (1.96.0-x86_64-linux-musl) sha256=881620de159faf68f46db7a289193c61e35443163fdac7f789023e26e7bd6570 + terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91 + unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 BUNDLED WITH - 2.2.15 + 4.0.1 diff --git a/_config.test.yml b/_config.test.yml new file mode 100644 index 00000000..4fbbf63a --- /dev/null +++ b/_config.test.yml @@ -0,0 +1,8 @@ +# ============================================= +# Test Environment Configuration Override +# For deployment to: awesome-doge.github.io/cypherpunks-core.github.io +# ============================================= + +# Override baseurl for project page deployment +baseurl: "/cypherpunks-core.github.io" +url: "https://awesome-doge.github.io" diff --git a/_data/navigation.yml b/_data/navigation.yml index 4e430170..98705308 100644 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -1,31 +1,57 @@ -- name: '資源' - link: /# +# V2.2 導航優化版 - 精簡分組設計 +# 使用 section 屬性實現視覺分組 + +- name: 'Blog' + link: /blog/ + +- name: '資源中心' + link: /resources/ dropdown: - - name: 比特幣 | Bitcoin + - name: '核心技術' + section: true + - name: Bitcoin 比特幣 link: /markdown/resources/resources-bitcoin/ - - name: 閃電網路 | Lightning network + - name: Lightning Network link: /markdown/resources/resources-ln/ - - name: 區塊隱私 | Blockchain privacy - link: /markdown/resources/resources-blockchain-privacy/ - - name: Schnorr 簽名 | Schnorr Signature + - name: Taproot & Schnorr link: /markdown/resources/resources-schnorr-signature/ - - name: 以太坊 | Ethereum - link: /markdown/resources/resources-ethereum/ - + - name: '進階主題' + section: true + - name: Layer 2 技術 + link: /markdown/resources/resources-bitcoin-layer2/ + - name: 隱私技術 + link: /markdown/resources/resources-blockchain-privacy/ + - name: Nostr 協議 + link: /markdown/resources/resources-nostr/ + - name: '開發者' + section: true + - name: 開發者工具箱 + link: /markdown/resources/resources-developer-tools/ + - name: 自託管指南 + link: /markdown/resources/resources-self-custody/ + +- name: '書籍' + link: /markdown/products/ + - name: '知識庫' - link: /# + link: /markdown/knowledge/glossary/ dropdown: - - name: 比特幣 | Bitcoin + - name: 術語詞彙表 + link: /markdown/knowledge/glossary/ + - name: Cypherpunk 歷史 + link: /markdown/resources/resources-cypherpunk-history/ + - name: Bitcoin 百科 link: /markdown/knowledge/knowledge-bitcoin/ - - name: 以太坊 | Ethereum + - name: Ethereum 百科 link: /markdown/knowledge/knowledge-ethereum/ -- name: '書籍 & 論文' - link: /markdown/products/ -- name: 衛星計畫 - link: /markdown/SatelliteProject/ -- name: Blog - link: /blog/ -- name: '關於' + +- name: '社群' link: /markdown/about/ -- name: '分類' - link: /classification \ No newline at end of file + dropdown: + - name: 關於我們 + link: /markdown/about/ + - name: 衛星計畫 + link: /markdown/SatelliteProject/ + - name: GitHub + link: https://github.com/cypherpunks-core + external: true diff --git a/_includes/admonition.html b/_includes/admonition.html new file mode 100644 index 00000000..870739c1 --- /dev/null +++ b/_includes/admonition.html @@ -0,0 +1,66 @@ +{% comment %} +Admonition Component - 警告區塊組件 + +Usage: +{% include admonition.html type="note" title="注意" content="這是一個注意事項。" %} +{% include admonition.html type="tip" title="提示" content="這是一個有用的提示。" %} +{% include admonition.html type="warning" title="警告" content="請注意這個警告。" %} +{% include admonition.html type="danger" title="危險" content="這是危險操作!" %} +{% include admonition.html type="info" title="資訊" content="這是一些資訊。" %} + +Parameters: +- type: note | tip | warning | danger | info (default: note) +- title: The title text (optional, will use default if not provided) +- content: The content text (required) +{% endcomment %} + +{% assign admon_type = include.type | default: "note" %} +{% assign admon_title = include.title %} + +{% if admon_title == nil %} + {% case admon_type %} + {% when "note" %} + {% assign admon_title = "注意" %} + {% when "tip" %} + {% assign admon_title = "提示" %} + {% when "warning" %} + {% assign admon_title = "警告" %} + {% when "danger" %} + {% assign admon_title = "危險" %} + {% when "info" %} + {% assign admon_title = "資訊" %} + {% else %} + {% assign admon_title = "注意" %} + {% endcase %} +{% endif %} + +
+
+ {% case admon_type %} + {% when "note" %} + + + + {% when "tip" %} + + + + {% when "warning" %} + + + + {% when "danger" %} + + + + {% when "info" %} + + + + {% endcase %} + {{ admon_title }} +
+
+ {{ include.content | markdownify }} +
+
diff --git a/_includes/comments.html b/_includes/comments.html new file mode 100644 index 00000000..26d131ec --- /dev/null +++ b/_includes/comments.html @@ -0,0 +1,52 @@ + +{% if site.comments.provider == 'giscus' %} +
+ +
+ + + + +{% else %} + +
+

+ 留言系統尚未設置 +

+

+ 請在 _config.yml 中配置 Giscus +

+
+{% endif %} diff --git a/_includes/footer.html b/_includes/footer.html index 83476c01..d44c03c1 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,20 +1,177 @@ -