diff --git a/.github/workflows/gh-jekyll-workflow.yml b/.github/workflows/gh-jekyll-workflow.yml new file mode 100644 index 0000000..e45ab39 --- /dev/null +++ b/.github/workflows/gh-jekyll-workflow.yml @@ -0,0 +1,64 @@ +# 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", "redesign"] + + # 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.3' + bundler-cache: false + - name: Install dependencies + run: bundle install + - 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 + - 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..9bee0dd --- /dev/null +++ b/.github/workflows/site-checks.yml @@ -0,0 +1,31 @@ +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: false + ruby-version: "3.3" + - name: Install dependencies + run: bundle install + - 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 diff --git a/.gitignore b/.gitignore index ce89292..ff744da 100644 --- a/.gitignore +++ b/.gitignore @@ -1,418 +1,4 @@ -## 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 diff --git a/404.html b/404.html new file mode 100644 index 0000000..cec3383 --- /dev/null +++ b/404.html @@ -0,0 +1,22 @@ +--- +layout: default +title: Shop page not found +description: The requested PWindows Shop page could not be found. +permalink: /404.html +sitemap: false +robots: noindex, follow +english_fallback: true +--- + +
+
+

404

+

We could not find that Shop page.

+
+
+ +
+
diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..4ab8121 --- /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" + +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..270fceb --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,295 @@ +GIT + remote: https://github.com/PWindows/website-common.git + revision: dcefd4051816760ed80103a182d5f3f3078a9c25 + 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..a9f33a4 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ -![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 +``` + +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..7b50b1d 100644 --- a/_config.yml +++ b/_config.yml @@ -1,7 +1,58 @@ 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/ + - 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..2afbaa9 --- /dev/null +++ b/_data/shop_translations.yml @@ -0,0 +1,173 @@ +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." + welcome: "Welcome!" + ready: "You’re ready to browse the PCoins shop. Checkout will revalidate your player." + browse: "Browse Coin Bundles" + 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" + 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! ✓" +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: "玩家查询暂不可用,请重试。" + welcome: "欢迎!" + ready: "你现在可以浏览 PCoins 商店。结账时会重新验证玩家。" + browse: "浏览金币组合" + switch_player: "切换玩家" + shop_title: "PCoins 商店" + shop_sub: "购买 PCoins 并在游戏中使用。" + search: "搜索组合" + search_placeholder: "搜索组合……" + categories: "商品分类" + all: "全部" + coins: "金币" + support: "支持" + products: "商品" + 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: "已添加 ✓" +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: "プレイヤー検索を利用できません。もう一度お試しください。" + welcome: "ようこそ!" + ready: "PCoinsショップを閲覧できます。購入時にプレイヤーを再確認します。" + browse: "コインバンドルを見る" + switch_player: "プレイヤーを変更" + shop_title: "PCoinsショップ" + shop_sub: "PCoinsを購入してゲーム内で使用できます。" + search: "バンドルを検索" + search_placeholder: "バンドルを検索…" + categories: "商品カテゴリー" + all: "すべて" + coins: "コイン" + support: "サポート" + products: "商品" + 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: "追加済み ✓" diff --git a/_data/site.yml b/_data/site.yml new file mode 100644 index 0000000..c41ab3c --- /dev/null +++ b/_data/site.yml @@ -0,0 +1,73 @@ +main_url: https://www.pwindows.qzz.io +checkout_endpoint: https://your-worker.example.com/create-checkout +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-cubes + path: /games/sacred-cubes + - 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/_includes/footer.html b/_includes/footer.html new file mode 100644 index 0000000..90cd64d --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,72 @@ +{% 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 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..863015b 100644 --- a/_includes/header.html +++ b/_includes/header.html @@ -1,73 +1,86 @@ - -
+{% 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 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 %} + + - -