diff --git a/.github/workflows/gh-jekyll-workflow.yml b/.github/workflows/gh-jekyll-workflow.yml new file mode 100644 index 0000000..d5d3e61 --- /dev/null +++ b/.github/workflows/gh-jekyll-workflow.yml @@ -0,0 +1,71 @@ +# Sample workflow for building and deploying a Jekyll site to GitHub Pages +name: Deploy Jekyll with GitHub Pages dependencies preinstalled + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.4.10' + bundler-cache: true + - name: Build with Jekyll (with custom plugins) + run: bundle exec jekyll build --trace + env: + JEKYLL_ENV: production + - name: Check JavaScript + run: | + node --check assets/js/extra.js + node tests/shop-js-test.js + - name: Check generated HTML and internal links + run: bundle exec htmlproofer ./_site --disable-external + - name: Verify Shop output and source invariants + run: bundle exec ruby tools/verify-site.rb ./_site + - uses: actions/setup-node@v4 + with: + node-version: "22" + - name: Check browser interactions and responsive layout + run: | + THEME_ROOT=$(bundle show pwindows-theme) + npm ci --prefix "$THEME_ROOT/tools/browser" + npm exec --prefix "$THEME_ROOT/tools/browser" -- playwright install --with-deps chromium + BROWSER_SITE=shop SHOP_SITE_DIR="$PWD/_site" npm --prefix "$THEME_ROOT/tools/browser" test + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/site-checks.yml b/.github/workflows/site-checks.yml new file mode 100644 index 0000000..462e7fb --- /dev/null +++ b/.github/workflows/site-checks.yml @@ -0,0 +1,38 @@ +name: Site checks + +on: + pull_request: + push: + branches: [main] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ruby/setup-ruby@v1 + with: + bundler-cache: true + ruby-version: "3.4.10" + - name: Check JavaScript + run: | + node --check assets/js/extra.js + node tests/shop-js-test.js + - name: Build site + run: bundle exec jekyll build + - name: Check generated HTML and internal links + run: bundle exec htmlproofer ./_site --disable-external + - name: Verify Shop output and source invariants + run: bundle exec ruby tools/verify-site.rb ./_site + - uses: actions/setup-node@v4 + with: + node-version: "22" + - name: Check browser interactions and responsive layout + run: | + THEME_ROOT=$(bundle show pwindows-theme) + npm ci --prefix "$THEME_ROOT/tools/browser" + npm exec --prefix "$THEME_ROOT/tools/browser" -- playwright install --with-deps chromium + BROWSER_SITE=shop SHOP_SITE_DIR="$PWD/_site" npm --prefix "$THEME_ROOT/tools/browser" test diff --git a/.gitignore b/.gitignore index ce89292..7579410 100644 --- a/.gitignore +++ b/.gitignore @@ -1,418 +1,5 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates -*.env - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -[Aa][Rr][Mm]64[Ee][Cc]/ -bld/ -[Oo]bj/ -[Oo]ut/ -[Ll]og/ -[Ll]ogs/ - -# Build results on 'Bin' directories -**/[Bb]in/* -# Uncomment if you have tasks that rely on *.refresh files to move binaries -# (https://github.com/github/gitignore/pull/3736) -#!**/[Bb]in/*.refresh - -# Visual Studio 2015/2017 cache/options directory .vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* -*.trx - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Approval Tests result files -*.received.* - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.idb -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -# but not Directory.Build.rsp, as it configures directory-level build defaults -!Directory.Build.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.tlog -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files -*.ncb -*.aps - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -**/.paket/paket.exe -paket-files/ - -# FAKE - F# Make -**/.fake/ - -# CodeRush personal settings -**/.cr/personal - -# Python Tools for Visual Studio (PTVS) -**/__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -#tools/** -#!tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog -MSBuild_Logs/ - -# AWS SAM Build and Temporary Artifacts folder -.aws-sam - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -**/.mfractor/ - -# Local History for Visual Studio -**/.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -**/.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -!.vscode/*.code-snippets - -# Local History for Visual Studio Code -.history/ - -# Built Visual Studio Code Extensions -*.vsix - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp +.jekyll-cache/ +_site/ +.DS_Store +.bundle/ diff --git a/404.html b/404.html new file mode 100644 index 0000000..df92905 --- /dev/null +++ b/404.html @@ -0,0 +1,26 @@ +--- +layout: default +title: Shop page not found +id: shop-not-found +description: The requested PWindows Shop page could not be found. +permalink: /404.html +sitemap: false +robots: noindex, follow +--- + +{% assign shop_strings = site.data.shop_translations[site.active_lang] | default: site.data.shop_translations[site.default_lang] %} +{% assign shop_fallback = false %} +{% unless site.data.shop_translations[site.active_lang] %}{% assign shop_fallback = true %}{% endunless %} +{% include fallback-notice.html show=shop_fallback %} +
+
+

404

+

{{ shop_strings.not_found }}

+
+
+ +
+
diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..c2d4681 --- /dev/null +++ b/Gemfile @@ -0,0 +1,17 @@ +source "https://rubygems.org" + +platform :windows do + gem 'wdm', '>= 0.1.0' +end + +gem "pwindows-theme", git: "https://github.com/PWindows/website-common.git", branch: "main", ref: "51014f5127742ea3556b36dd7df5a8781a1e699b" + +gem "jekyll", "~> 4.4" +gem "webrick" + +group :jekyll_plugins do + gem "jekyll-polyglot" +end + +gem "html-proofer", "~> 5.0" +gem "nokogiri", "~> 1.19" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..05a2b4f --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,296 @@ +GIT + remote: https://github.com/PWindows/website-common.git + revision: 51014f5127742ea3556b36dd7df5a8781a1e699b + ref: 51014f5127742ea3556b36dd7df5a8781a1e699b + branch: main + specs: + pwindows-theme (1.0.0) + jekyll (~> 4.4) + +GEM + remote: https://rubygems.org/ + specs: + Ascii85 (2.0.1) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + afm (1.0.0) + async (2.43.0) + console (~> 1.29) + fiber-annotation + io-event (~> 1.11) + base64 (0.3.0) + benchmark (0.5.0) + bigdecimal (3.3.1) + colorator (1.1.0) + concurrent-ruby (1.3.8) + console (1.37.0) + fiber-annotation + fiber-local (~> 1.1) + json + csv (3.3.6) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + ethon (0.18.0) + ffi (>= 1.15.0) + logger + eventmachine (1.2.7) + ffi (1.17.4-aarch64-linux-gnu) + ffi (1.17.4-aarch64-linux-musl) + ffi (1.17.4-arm-linux-gnu) + ffi (1.17.4-arm-linux-musl) + ffi (1.17.4-arm64-darwin) + ffi (1.17.4-x86_64-darwin) + ffi (1.17.4-x86_64-linux-gnu) + ffi (1.17.4-x86_64-linux-musl) + fiber-annotation (0.2.0) + fiber-local (1.1.0) + fiber-storage + fiber-storage (1.0.1) + forwardable-extended (2.6.0) + google-protobuf (4.35.1) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-aarch64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-aarch64-linux-musl) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-arm64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-x86_64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-x86_64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.1-x86_64-linux-musl) + bigdecimal + rake (~> 13.3) + hashery (2.1.2) + html-proofer (5.2.1) + addressable (~> 2.3) + async (~> 2.1) + benchmark (~> 0.5) + nokogiri (~> 1.13) + pdf-reader (~> 2.11) + rainbow (~> 3.0) + typhoeus (~> 1.3) + yell (~> 2.0) + zeitwerk (~> 2.5) + http_parser.rb (0.8.1) + i18n (1.15.2) + concurrent-ruby (~> 1.0) + io-event (1.19.3) + jekyll (4.4.1) + addressable (~> 2.4) + base64 (~> 0.2) + colorator (~> 1.0) + csv (~> 3.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) + jekyll-watch (~> 2.0) + json (~> 2.6) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (~> 0.3, >= 0.3.6) + pathutil (~> 0.9) + rouge (>= 3.0, < 5.0) + safe_yaml (~> 1.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-polyglot (1.13.0) + jekyll (>= 4.0, >= 3.0) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) + jekyll-watch (2.2.1) + listen (~> 3.0) + json (2.21.1) + kramdown (2.5.2) + rexml (>= 3.4.4) + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.10.0) + logger + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + logger (1.7.0) + mercenary (0.4.0) + nokogiri (1.19.4-aarch64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-aarch64-linux-musl) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-musl) + racc (~> 1.4) + nokogiri (1.19.4-arm64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-musl) + racc (~> 1.4) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + pdf-reader (2.15.1) + Ascii85 (>= 1.0, < 3.0, != 2.0.0) + afm (>= 0.2.1, < 2) + hashery (~> 2.0) + ruby-rc4 + ttfunk + public_suffix (7.0.5) + racc (1.8.1) + rainbow (3.1.1) + rake (13.4.2) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rexml (3.4.4) + rouge (4.7.0) + ruby-rc4 (0.1.5) + safe_yaml (1.0.5) + sass-embedded (1.102.0-aarch64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-aarch64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-arm-linux-gnueabihf) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-arm-linux-musleabihf) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-arm64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-x86_64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-x86_64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.102.0-x86_64-linux-musl) + google-protobuf (~> 4.31) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + ttfunk (1.8.0) + bigdecimal (~> 3.1) + typhoeus (1.6.0) + ethon (>= 0.18.0) + unicode-display_width (2.6.0) + webrick (1.9.2) + yell (2.2.2) + zeitwerk (2.8.2) + +PLATFORMS + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-gnueabihf + arm-linux-musl + arm-linux-musleabihf + arm64-darwin + x86_64-darwin + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + html-proofer (~> 5.0) + jekyll (~> 4.4) + jekyll-polyglot + nokogiri (~> 1.19) + pwindows-theme! + wdm (>= 0.1.0) + webrick + +CHECKSUMS + Ascii85 (2.0.1) sha256=15cb5d941808543cbb9e7e6aea3c8ec3877f154c3461e8b3673e97f7ecedbe5a + addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af + afm (1.0.0) sha256=5bd4d6f6241e7014ef090985ec6f4c3e9745f6de0828ddd58bc1efdd138f4545 + async (2.43.0) sha256=c3a6bd7ebb56a02b19eaa3b8ca26fced4397554bcd8c5d5046be5ee5598c452d + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b + benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c + bigdecimal (3.3.1) sha256=eaa01e228be54c4f9f53bf3cc34fe3d5e845c31963e7fcc5bedb05a4e7d52218 + bundler (4.0.11) sha256=5bcec0fb78302e48d02ee46f10ee6e6942be647ba5b44a6d1ddfda9a240ce785 + colorator (1.1.0) sha256=e2f85daf57af47d740db2a32191d1bdfb0f6503a0dfbc8327d0c9154d5ddfc38 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 + console (1.37.0) sha256=8093b286c2595a063849c098594fee5155ecc7967d36f3aa8cbe7569c8f3efd7 + csv (3.3.6) sha256=aba61e7e507a66f03d45cb1f3c4b6359861c3504038b422962875dce099e4456 + em-websocket (0.5.3) sha256=f56a92bde4e6cb879256d58ee31f124181f68f8887bd14d53d5d9a292758c6a8 + ethon (0.18.0) sha256=b598afc9f30448cb068b850714b7d6948e941476095d04f90a4ac65b8d6efcb2 + eventmachine (1.2.7) sha256=994016e42aa041477ba9cff45cbe50de2047f25dd418eba003e84f0d16560972 + ffi (1.17.4-aarch64-linux-gnu) sha256=b208f06f91ffd8f5e1193da3cae3d2ccfc27fc36fba577baf698d26d91c080df + ffi (1.17.4-aarch64-linux-musl) sha256=9286b7a615f2676245283aef0a0a3b475ae3aae2bb5448baace630bb77b91f39 + ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564 + ffi (1.17.4-arm-linux-musl) sha256=9d4838ded0465bef6e2426935f6bcc93134b6616785a84ffd2a3d82bc3cf6f95 + ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b + ffi (1.17.4-x86_64-darwin) sha256=aa70390523cf3235096cf64962b709b4cfbd5c082a2cb2ae714eb0fe2ccda496 + ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d + ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e + fiber-annotation (0.2.0) sha256=7abfadf1d119f508867d4103bf231c0354d019cc39a5738945dec2edadaf6c03 + fiber-local (1.1.0) sha256=c885f94f210fb9b05737de65d511136ea602e00c5105953748aa0f8793489f06 + fiber-storage (1.0.1) sha256=f48e5b6d8b0be96dac486332b55cee82240057065dc761c1ea692b2e719240e1 + forwardable-extended (2.6.0) sha256=1bec948c469bbddfadeb3bd90eb8c85f6e627a412a3e852acfd7eaedbac3ec97 + google-protobuf (4.35.1) sha256=a3a6471331d918f58dfa4d014a8f6286f0af2cf4840216bde52fcf2ea3fe3726 + google-protobuf (4.35.1-aarch64-linux-gnu) sha256=50ca44d0eeff3f8475e630a1accdd974256f3510694d574e2c9d6119ea8bc9e1 + google-protobuf (4.35.1-aarch64-linux-musl) sha256=d5c65cef6bd6498a9e5ed5f88cf6cf7e341c10b0a005e32137d5d1a2b6e8c18a + google-protobuf (4.35.1-arm64-darwin) sha256=d9c957df04fa89c749fa9a72a7b383eb4296efc9b2303dc6fd6fbe39c698ad6b + google-protobuf (4.35.1-x86_64-darwin) sha256=66b62b4df00931018a692806df66393efa960d6d2b7da69735187249f950d3ee + google-protobuf (4.35.1-x86_64-linux-gnu) sha256=c786439087512a3fbd199e9897d265b855f951d4027e218ea55e858d45969edd + google-protobuf (4.35.1-x86_64-linux-musl) sha256=91890eb0002934a339fdb7d77a147c46b7474b6799db27872b747b905837f744 + hashery (2.1.2) sha256=d239cc2310401903f6b79d458c2bbef5bf74c46f3f974ae9c1061fb74a404862 + html-proofer (5.2.1) sha256=fdd958a7cbf9c3255fb96fe7cfc4e611f64e2706e469488a3326309ad007d2fd + http_parser.rb (0.8.1) sha256=9ae8df145b39aa5398b2f90090d651c67bd8e2ebfe4507c966579f641e11097a + i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 + io-event (1.19.3) sha256=0fe24f0fe334ad39cf61a290131c54f8848184c0d166cea86ffae2d6548339d3 + jekyll (4.4.1) sha256=4c1144d857a5b2b80d45b8cf5138289579a9f8136aadfa6dd684b31fe2bc18c1 + jekyll-polyglot (1.13.0) sha256=a5667e78b587e75b9705d387c6709e5e2237f7e0ddc471afa32094974add8ee4 + jekyll-sass-converter (3.1.0) sha256=83925d84f1d134410c11d0c6643b0093e82e3a3cf127e90757a85294a3862443 + jekyll-watch (2.2.1) sha256=bc44ed43f5e0a552836245a54dbff3ea7421ecc2856707e8a1ee203a8387a7e1 + json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 + kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa + kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 + liquid (4.0.4) sha256=4fcfebb1a045e47918388dbb7a0925e7c3893e58d2bd6c3b3c73ec17a2d8fdb3 + listen (3.10.0) sha256=c6e182db62143aeccc2e1960033bebe7445309c7272061979bb098d03760c9d2 + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + mercenary (0.4.0) sha256=b25a1e4a59adca88665e08e24acf0af30da5b5d859f7d8f38fba52c28f405138 + nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f + nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af + nokogiri (1.19.4-arm-linux-gnu) sha256=a301313e38bb065d68239e79734bcd6f56fb6efaacebde29e9abf2a4735340ca + nokogiri (1.19.4-arm-linux-musl) sha256=588923c101bcfa78869734d247d25b598674323e7f22474fc468f6e5647311eb + nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 + nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 + nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a + nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b + pathutil (0.16.2) sha256=e43b74365631cab4f6d5e4228f812927efc9cb2c71e62976edcb252ee948d589 + pdf-reader (2.15.1) sha256=18c6a986a84a3117fa49f4279fc2de51f5d2399b71833df5d2bccd595c7068ce + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 + pwindows-theme (1.0.0) + racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f + rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a + rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 + rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe + rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rouge (4.7.0) sha256=dba5896715c0325c362e895460a6d350803dbf6427454f49a47500f3193ea739 + ruby-rc4 (0.1.5) sha256=00cc40a39d20b53f5459e7ea006a92cf584e9bc275e2a6f7aa1515510e896c03 + safe_yaml (1.0.5) sha256=a6ac2d64b7eb027bdeeca1851fe7e7af0d668e133e8a88066a0c6f7087d9f848 + sass-embedded (1.102.0-aarch64-linux-gnu) sha256=087f377fa4135a8f67f5f422781b59815e99b8fd3aec335935c50a47c2a205fd + sass-embedded (1.102.0-aarch64-linux-musl) sha256=12bb4091972499241c35304ca11ca2c314764badf1b9933a8d437ba62432b538 + sass-embedded (1.102.0-arm-linux-gnueabihf) sha256=566b1188e4f923366f494a5d95e4e5e03864ae55bae5ea52beb2c30b1b9e2915 + sass-embedded (1.102.0-arm-linux-musleabihf) sha256=1ca396610bf4f4aa8f849b67a9f2720f67d9f3b42651072eafee786aece314cf + sass-embedded (1.102.0-arm64-darwin) sha256=8e18b2dd94b232c2dd73984c579f77bbc1a066028f4675c8989ac34fa40d14dc + sass-embedded (1.102.0-x86_64-darwin) sha256=3e78c6ac5be0ba4236d075bd044a49d0f515d54799f7d6f253c71d325ffedac0 + sass-embedded (1.102.0-x86_64-linux-gnu) sha256=9815b7604123a9a44a65d44d5e58e7af1c7005174b745cda83bad4c9e3760ab3 + sass-embedded (1.102.0-x86_64-linux-musl) sha256=9e3c15eb5d83784adf3b946d4fc5d8a32aed25566a2fee939f25dd1e1d217ddf + terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91 + ttfunk (1.8.0) sha256=a7cbc7e489cc46e979dde04d34b5b9e4f5c8f1ee5fc6b1a7be39b829919d20ca + typhoeus (1.6.0) sha256=bacc41c23e379547e29801dc235cd1699b70b955a1ba3d32b2b877aa844c331d + unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 + yell (2.2.2) sha256=1d166f3cc3b6dc49a59778ea7156ed6d8de794c15106d48ffd6cbb061b9b26bc + zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 + +BUNDLED WITH + 4.0.11 diff --git a/README.md b/README.md index 557efb4..cd61f2d 100644 --- a/README.md +++ b/README.md @@ -1 +1,32 @@ -![Alt](https://repobeats.axiom.co/api/embed/ea9211f2acf2604e8ff8421c89a7f1e3193c77f8.svg "Repobeats analytics image") +# PWindows Shop + +The static Jekyll storefront for [shop.pwindows.qzz.io](https://shop.pwindows.qzz.io). It uses the shared `pwindows-theme` and generates localized routes with `jekyll-polyglot`. + +Player lookup is informational onboarding, not authentication. The checkout service must revalidate player identity and resolve product IDs to server-owned prices. See `tools/production-runbook.md` for the external API, checkout, DNS, and hosting requirements. + +## Local verification + +```sh +bundle exec jekyll build +bundle exec htmlproofer ./_site --disable-external +bundle exec ruby tools/verify-site.rb ./_site +node --check assets/js/extra.js +node tests/shop-js-test.js +``` + +Use Ruby 3.4.10, matching CI. Keep the Ruby executable and gem paths on the same version. The Node suite covers player-session persistence, cart state, focus fallback, and request timeouts; generated HTML is also checked for parser errors. + +Run the shared browser suite after building (Node 22): + +```sh +THEME_ROOT=$(bundle show pwindows-theme) +npm ci --prefix "$THEME_ROOT/tools/browser" +npm exec --prefix "$THEME_ROOT/tools/browser" -- playwright install chromium +BROWSER_SITE=shop SHOP_SITE_DIR="$PWD/_site" npm --prefix "$THEME_ROOT/tools/browser" test +``` + +The browser harness comes from the pinned Git theme checkout. CI installs Chromium and runs it before publishing. It checks actual visibility, keyboard focus, player lookup, cart feedback, currency changes, and responsive layouts. + +Cart updates remain available on the current page when browser storage fails, with a visible warning that navigation may lose them. Player lookup requires successful session persistence before browsing can continue. Lookup and checkout requests time out after 15 seconds and allow a manual retry; they never retry automatically. + +Stripe price IDs, the checkout-worker URL, the undefined product, placeholder imagery, and coming-soon controls are intentional placeholders and must remain unchanged until an approved launch change. diff --git a/_config.yml b/_config.yml index 97d54b2..5daac96 100644 --- a/_config.yml +++ b/_config.yml @@ -1,7 +1,59 @@ title: PWindows Shop -description: Official Store of PWindows +description: Buy PCoins and support the PWindows community. url: "https://shop.pwindows.qzz.io" +theme: pwindows-theme +markdown: kramdown +default_lang: "en-us" +languages: + [ + "en-us", + "en-gb", + "zh-cn", + "es-es", + "fr-fr", + "de-de", + "it-it", + "pt-pt", + "pt-br", + "ja-jp", + "ko-kr", + "ru-ru", + "nl-nl", + "pl-pl", + "sv-se", + "da-dk", + "no-no", + "fi-fi", + "es-mx", + "fr-ca", + "tr-tr", + "ar-sa", + "he-il", + "hi-in", + "th-th", + "vi-vn", + "id-id", + "ms-my", + ] +lang_from_path: true +parallel_localization: false +exclude_from_localization: + - assets + - sitemap.xml + - robots.txt + - CNAME +kramdown: + input: GFM +exclude: + - README.md + - vendor/ + - tools/ + - tests/ + - assets/extra/ collections: products: output: true - permalink: /products/:name \ No newline at end of file + permalink: /products/:name +plugins: + - jekyll-polyglot + - pwindows-theme diff --git a/_data/shop_translations.yml b/_data/shop_translations.yml new file mode 100644 index 0000000..409fc40 --- /dev/null +++ b/_data/shop_translations.yml @@ -0,0 +1,242 @@ +en-us: &en + lookup_title_prefix: "Welcome to the" + lookup_title_shop: "PWindows Shop" + lookup_sub: "Look up your Minecraft player to browse PCoins. This is not an account sign-in." + username: "Minecraft username" + username_placeholder: "Your username..." + enter_shop: "Look up player" + checking: "Checking..." + invalid_username: "Enter a valid Minecraft username." + missing_username: "Please enter your username." + not_joined: "That player has not joined PWindows yet." + join_hint: "Join at play.pwindows.qzz.io first, then come back." + lookup_error: "Player lookup is unavailable. Please try again." + request_timeout: "This is taking too long. Please try again." + player_storage_error: "Your player lookup could not be saved. Allow session storage in your browser, then try again." + cart_storage_warning: "Your cart is available on this page, but could not be saved. Keep this page open to avoid losing it." + promo_storage_warning: "Promo code will be used on this page, but could not be saved." + welcome: "Welcome!" + ready: "You’re ready to browse the PCoins shop. Checkout will revalidate your player." + development_bypass: "Local development browse mode is active. Checkout still requires a validated player lookup." + browse: "Browse Coin Bundles" + coming_soon: "Coming soon" + future_sections: "Future shop sections" + merch_coming_soon: "Merch — Coming Soon" + donate_coming_soon: "Donate — Coming Soon" + switch_player: "Switch player" + shop_title: "PCoins Shop" + shop_sub: "Buy PCoins and spend them in-game." + search: "Search bundles" + search_placeholder: "Search bundles..." + categories: "Product categories" + all: "All" + coins: "Coins" + support: "Support" + products: "Products" + view_product: "View product" + currency: "Currency" + most_popular: "Most Popular" + add_to_cart: "Add to Cart" + any_amount: "Any amount" + support_title: "Support PWindows" + support_description: "Love what we’re building? Help keep the servers alive." + donation_amount: "Donation amount" + add_support: "Add Support to Cart" + no_products: "No products found." + back_to_shop: "Back to Shop" + promo_code: "Promo code" + promo_placeholder: "Promo code (optional)" + apply: "Apply" + added_note: "Added items will appear in your shopping cart." + cart: "Cart" + open_cart: "Open shopping cart" + close_cart: "Close shopping cart" + items: "items" + shopping_cart: "Shopping Cart" + empty_cart: "Your cart is empty." + subtotal: "Subtotal:" + discount: "Discount:" + total: "Total:" + checkout: "Proceed to Checkout" + remove: "Remove" + processing: "Processing..." + checkout_placeholder: "Checkout is coming soon." + donation_invalid: "Enter a donation amount of at least one." + promo_coming_soon: "Promo codes are coming soon." + promo_saved: "Promo code saved for checkout." + added: "Added! ✓" + item_added: "{title} added to cart." + item_removed: "{title} removed from cart." + decrease_quantity: "Decrease {title} quantity" + increase_quantity: "Increase {title} quantity" + quantity_label: "Quantity {quantity}" + lookup_complete: "Player lookup complete. Checkout will revalidate this player." + checkout_requires_player: "Complete a player lookup before checkout." + checkout_error: "Checkout could not start." + shop_home: "PWindows Shop home" + main_website: "PWindows main website" + not_found: "We could not find that Shop page." + return_to_shop: "Return to the Shop" + visit_main_site: "Visit the PWindows website" +zh-cn: + <<: *en + lookup_title_prefix: "欢迎来到" + lookup_title_shop: "PWindows 商店" + lookup_sub: "查询你的 Minecraft 玩家资料以浏览 PCoins。这不是账户登录。" + username: "Minecraft 用户名" + username_placeholder: "你的用户名……" + enter_shop: "查询玩家" + checking: "正在查询……" + invalid_username: "请输入有效的 Minecraft 用户名。" + missing_username: "请输入用户名。" + not_joined: "该玩家尚未加入 PWindows。" + join_hint: "请先加入 play.pwindows.qzz.io,然后返回。" + lookup_error: "玩家查询暂不可用,请重试。" + request_timeout: "请求超时,请重试。" + player_storage_error: "无法保存玩家查询结果。请在浏览器中允许会话存储后重试。" + cart_storage_warning: "购物车可在当前页面使用,但无法保存。请保持此页面打开,以免丢失购物车内容。" + promo_storage_warning: "优惠码将在当前页面使用,但无法保存。" + welcome: "欢迎!" + ready: "你现在可以浏览 PCoins 商店。结账时会重新验证玩家。" + development_bypass: "本地开发浏览模式已启用。结账仍需要经过验证的玩家查询。" + browse: "浏览金币组合" + coming_soon: "即将推出" + future_sections: "未来商店区域" + merch_coming_soon: "周边商品 — 即将推出" + donate_coming_soon: "支持 — 即将推出" + switch_player: "切换玩家" + shop_title: "PCoins 商店" + shop_sub: "购买 PCoins 并在游戏中使用。" + search: "搜索组合" + search_placeholder: "搜索组合……" + categories: "商品分类" + all: "全部" + coins: "金币" + support: "支持" + products: "商品" + view_product: "查看商品" + currency: "货币" + most_popular: "最受欢迎" + add_to_cart: "加入购物车" + any_amount: "任意金额" + support_title: "支持 PWindows" + support_description: "喜欢我们的项目吗?帮助我们维持服务器运行。" + donation_amount: "支持金额" + add_support: "加入支持购物车" + no_products: "未找到商品。" + back_to_shop: "返回商店" + promo_code: "优惠码" + promo_placeholder: "优惠码(可选)" + apply: "应用" + added_note: "已添加的商品会显示在购物车中。" + cart: "购物车" + open_cart: "打开购物车" + close_cart: "关闭购物车" + items: "件商品" + shopping_cart: "购物车" + empty_cart: "购物车为空。" + subtotal: "小计:" + discount: "优惠:" + total: "总计:" + checkout: "前往结账" + remove: "移除" + processing: "处理中……" + checkout_placeholder: "结账功能即将推出。" + donation_invalid: "请输入至少为 1 的支持金额。" + promo_coming_soon: "优惠码功能即将推出。" + promo_saved: "优惠码已保存,将在结账时使用。" + added: "已添加 ✓" + item_added: "已将{title}加入购物车。" + item_removed: "已从购物车移除{title}。" + decrease_quantity: "减少{title}的数量" + increase_quantity: "增加{title}的数量" + quantity_label: "数量 {quantity}" + lookup_complete: "玩家查询完成。结账时会重新验证该玩家。" + checkout_requires_player: "请先完成玩家查询再结账。" + checkout_error: "无法开始结账。" + shop_home: "PWindows 商店首页" + main_website: "PWindows 主网站" + not_found: "找不到该商店页面。" + return_to_shop: "返回商店" + visit_main_site: "访问 PWindows 网站" +ja-jp: + <<: *en + lookup_title_prefix: "ようこそ" + lookup_title_shop: "PWindowsショップへ" + lookup_sub: "Minecraftプレイヤーを検索してPCoinsを閲覧します。これはアカウントへのログインではありません。" + username: "Minecraftユーザー名" + username_placeholder: "ユーザー名…" + enter_shop: "プレイヤーを検索" + checking: "確認中…" + invalid_username: "有効なMinecraftユーザー名を入力してください。" + missing_username: "ユーザー名を入力してください。" + not_joined: "このプレイヤーはまだPWindowsに参加していません。" + join_hint: "先に play.pwindows.qzz.io に参加してから戻ってください。" + lookup_error: "プレイヤー検索を利用できません。もう一度お試しください。" + request_timeout: "処理に時間がかかりすぎています。もう一度お試しください。" + player_storage_error: "プレイヤー検索結果を保存できませんでした。ブラウザーでセッションストレージを許可してから、もう一度お試しください。" + cart_storage_warning: "このページではカートを利用できますが、保存できませんでした。内容を失わないよう、このページを開いたままにしてください。" + promo_storage_warning: "このページではプロモコードを使用しますが、保存できませんでした。" + welcome: "ようこそ!" + ready: "PCoinsショップを閲覧できます。購入時にプレイヤーを再確認します。" + development_bypass: "ローカル開発用の閲覧モードが有効です。購入には引き続き確認済みプレイヤーが必要です。" + browse: "コインバンドルを見る" + coming_soon: "近日公開" + future_sections: "今後のショップ項目" + merch_coming_soon: "グッズ — 近日公開" + donate_coming_soon: "支援 — 近日公開" + switch_player: "プレイヤーを変更" + shop_title: "PCoinsショップ" + shop_sub: "PCoinsを購入してゲーム内で使用できます。" + search: "バンドルを検索" + search_placeholder: "バンドルを検索…" + categories: "商品カテゴリー" + all: "すべて" + coins: "コイン" + support: "サポート" + products: "商品" + view_product: "商品を見る" + currency: "通貨" + most_popular: "人気商品" + add_to_cart: "カートに追加" + any_amount: "任意の金額" + support_title: "PWindowsを支援" + support_description: "私たちの活動を応援して、サーバー運営を支えてください。" + donation_amount: "支援金額" + add_support: "支援をカートに追加" + no_products: "商品が見つかりません。" + back_to_shop: "ショップに戻る" + promo_code: "プロモコード" + promo_placeholder: "プロモコード(任意)" + apply: "適用" + added_note: "追加した商品はショッピングカートに表示されます。" + cart: "カート" + open_cart: "ショッピングカートを開く" + close_cart: "ショッピングカートを閉じる" + items: "点" + shopping_cart: "ショッピングカート" + empty_cart: "カートは空です。" + subtotal: "小計:" + discount: "割引:" + total: "合計:" + checkout: "購入手続きへ" + remove: "削除" + processing: "処理中…" + checkout_placeholder: "購入機能は近日公開予定です。" + donation_invalid: "1以上の支援金額を入力してください。" + promo_coming_soon: "プロモコードは近日公開予定です。" + promo_saved: "プロモコードを購入用に保存しました。" + added: "追加済み ✓" + item_added: "{title}をカートに追加しました。" + item_removed: "{title}をカートから削除しました。" + decrease_quantity: "{title}の数量を減らす" + increase_quantity: "{title}の数量を増やす" + quantity_label: "数量 {quantity}" + lookup_complete: "プレイヤー検索が完了しました。購入時に再確認します。" + checkout_requires_player: "購入前にプレイヤー検索を完了してください。" + checkout_error: "購入手続きを開始できませんでした。" + shop_home: "PWindowsショップ ホーム" + main_website: "PWindowsメインサイト" + not_found: "ショップページが見つかりませんでした。" + return_to_shop: "ショップに戻る" + visit_main_site: "PWindowsサイトを見る" diff --git a/_data/site.yml b/_data/site.yml new file mode 100644 index 0000000..c5be29b --- /dev/null +++ b/_data/site.yml @@ -0,0 +1,74 @@ +main_url: https://www.pwindows.qzz.io +checkout_endpoint: https://your-worker.example.com/create-checkout +checkout_ready: false +checkout_allowed_hosts: + - checkout.stripe.com + +navigation: + - translation_key: about + path: /about + icon: /assets/mojang/svg/icons/book.png + icon_width: 160 + icon_height: 160 + - translation_key: news + path: /articles + icon: /assets/mojang/Invicon_Map.png + icon_width: 16 + icon_height: 16 + - translation_key: staff + path: /staff + icon: /assets/mojang/svg/icons/color-two-players.svg + icon_width: 32 + icon_height: 32 + - translation_key: departments + path: /departments/ + icon: /assets/mojang/svg/icons/color-chest.svg + icon_width: 32 + icon_height: 32 + - translation_key: games + path: /games + icon: /assets/icons/controller.png + icon_width: 22 + icon_height: 20 + +footer_sections: + - translation_key: games + column_class: footer-column-center + path: /games + links: + - translation_key: sacred-remains + path: /games/sacred-remains + - translation_key: obby-of-dominance + path: /games/obby-of-dominance + - translation_key: departments + column_class: footer-column-departments + show_language: true + path: /departments/ + links: + - translation_key: mcd + path: /departments/minecraft + - translation_key: rd + path: /departments/roblox + - translation_key: ud + path: /departments/unity + - translation_key: support + column_class: footer-column-right + show_shop: true + link_key: support + links: + - translation_key: feedback + path: /feedback + - translation_key: sitemap + path: /sitemap + - translation_key: contact + path: /contact + - translation_key: staff + path: /staff + +links: + support: https://discord.pwindows.qzz.io/ + shop: https://shop.pwindows.qzz.io + discord: https://discord.pwindows.qzz.io/ + youtube: https://www.youtube.com/@PWindows + twitter: https://x.com/pwindowsz + site_logo: /assets/PWindows.png diff --git a/_data/site_meta.yml b/_data/site_meta.yml new file mode 100644 index 0000000..7d6d303 --- /dev/null +++ b/_data/site_meta.yml @@ -0,0 +1,35 @@ +en-us: + name: PWindows Shop + tagline: Official PCoins storefront for PWindows + page_titles: + shop-home: Player lookup + shop-products: PCoins Shop + shop-not-found: Shop page not found + descriptions: + shop-home: Look up your Minecraft player to browse PCoins and support PWindows; checkout revalidates player identity. + shop-products: Browse PCoins bundles and support PWindows. + shop-not-found: The requested PWindows Shop page could not be found. + +zh-cn: + name: PWindows 商店 + tagline: PWindows 官方 PCoins 商店 + page_titles: + shop-home: 玩家查询 + shop-products: PCoins 商店 + shop-not-found: 找不到商店页面 + descriptions: + shop-home: 查询你的 Minecraft 玩家资料以浏览 PCoins 并支持 PWindows;结账时会重新验证玩家身份。 + shop-products: 浏览 PCoins 组合并支持 PWindows。 + shop-not-found: 找不到请求的 PWindows 商店页面。 + +ja-jp: + name: PWindowsショップ + tagline: PWindows公式PCoinsストア + page_titles: + shop-home: プレイヤー検索 + shop-products: PCoinsショップ + shop-not-found: ショップページが見つかりません + descriptions: + shop-home: Minecraftプレイヤーを検索してPCoinsを閲覧し、PWindowsを支援できます。購入時にプレイヤーを再確認します。 + shop-products: PCoinsバンドルを閲覧してPWindowsを支援できます。 + shop-not-found: お探しのPWindowsショップページは見つかりませんでした。 diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 0000000..0827cdf --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,75 @@ +{% assign footer_strings = site.data.translations[site.active_lang].site.footer %} +{% assign ui = site.data.ui[site.active_lang] | default: site.data.ui[site.default_lang] %} +{% assign shop_strings = site.data.shop_translations[site.active_lang] | default: site.data.shop_translations[site.default_lang] %} +{% assign shop_language = site.active_lang %} +{% unless site.data.shop_translations[site.active_lang] %}{% assign shop_language = site.default_lang %}{% endunless %} +{% assign main_site_url = site.data.site.main_url %} +{% if site.active_lang != site.default_lang %} + {% capture main_site_url %}{{ site.data.site.main_url }}/{{ site.active_lang }}{% endcapture %} +{% endif %} + + diff --git a/_includes/header.html b/_includes/header.html index ca9a6a7..28a87aa 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -1,73 +1,93 @@ - -
+{% assign header_strings = site.data.translations[site.active_lang].site.header %} +{% assign ui = site.data.ui[site.active_lang] | default: site.data.ui[site.default_lang] %} +{% assign shop_strings = site.data.shop_translations[site.active_lang] | default: site.data.shop_translations[site.default_lang] %} +{% assign shop_language = site.active_lang %} +{% unless site.data.shop_translations[site.active_lang] %}{% assign shop_language = site.default_lang %}{% endunless %} +{% assign main_site_url = site.data.site.main_url %} +{% if site.active_lang != site.default_lang %} + {% capture main_site_url %}{{ site.data.site.main_url }}/{{ site.active_lang }}{% endcapture %} +{% endif %} + + - -