diff --git a/.github/workflows/unittests.yaml b/.github/workflows/unittests.yaml
new file mode 100644
index 0000000..1e2ecff
--- /dev/null
+++ b/.github/workflows/unittests.yaml
@@ -0,0 +1,69 @@
+# This is a basic workflow to validate HTML and CSS
+name: HTML and CSS Validation Workflow
+
+# Controls when the workflow will run
+on:
+ # Triggers the workflow on push or pull request events but only for the "main" branch
+ push:
+ branches: [ "main" ]
+ pull_request:
+ branches: [ "main" ]
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# A workflow run is made up of one or more jobs that can run sequentially or in parallel
+jobs:
+ # This workflow contains a single job called "validate_job"
+ validate_job:
+ # The type of runner that the job will run on
+ runs-on: ubuntu-latest
+
+ # Steps represent a sequence of tasks that will be executed as part of the job
+ steps:
+ # Checks out your repository under $GITHUB_WORKSPACE, so your job can access it
+ - uses: actions/checkout@v4
+
+ # Sets up Node.js environment
+ - name: Set up Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: '16'
+
+ # Caching pnpm dependencies
+ - name: Cache pnpm
+ uses: actions/cache@v3
+ with:
+ path: ~/.pnpm-store
+ key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
+ restore-keys: |
+ ${{ runner.os }}-pnpm-
+
+ # Installs HTMLHint and Stylelint using pnpm
+ - name: Install dependencies
+ run: |
+ set -e
+ npm install -g pnpm
+ pnpm install htmlhint stylelint stylelint-config-standard --save-dev
+
+ # Runs HTML validation and logs errors
+ - name: Validate HTML
+ run: |
+ set -e
+ npx htmlhint . 2> html_validation_errors.log || true
+ if [ -s html_validation_errors.log ]; then
+ echo "HTML validation errors found. Check html_validation_errors.log for details."
+ exit 1
+ fi
+
+ # Runs CSS validation and logs errors
+ - name: Validate CSS
+ run: |
+ set -e
+ npx stylelint "**/*.css" 2> css_validation_errors.log || true
+ if [ -s css_validation_errors.log ]; then
+ echo "CSS validation errors found. Check css_validation_errors.log for details."
+ exit 1
+ fi
+
+
+
diff --git a/index.html b/index.html
index 4d3c362..76a9032 100644
--- a/index.html
+++ b/index.html
@@ -12,6 +12,11 @@
Discover hidden places in the world around you
Download Excursion (Coming soon!)
+
diff --git a/node_modules/.bin/node b/node_modules/.bin/node
new file mode 100644
index 0000000..5e4341d
--- /dev/null
+++ b/node_modules/.bin/node
@@ -0,0 +1,12 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*)
+ if command -v cygpath > /dev/null 2>&1; then
+ basedir=`cygpath -w "$basedir"`
+ fi
+ ;;
+esac
+
+exec "$basedir/../node/bin/node" "$@"
diff --git a/node_modules/.bin/node.cmd b/node_modules/.bin/node.cmd
new file mode 100644
index 0000000..fb2c308
--- /dev/null
+++ b/node_modules/.bin/node.cmd
@@ -0,0 +1,9 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+"%dp0%\..\node\bin\node" %*
diff --git a/node_modules/.bin/node.ps1 b/node_modules/.bin/node.ps1
new file mode 100644
index 0000000..99a0aac
--- /dev/null
+++ b/node_modules/.bin/node.ps1
@@ -0,0 +1,16 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+# Support pipeline input
+if ($MyInvocation.ExpectingInput) {
+ $input | & "$basedir/../node/bin/node" $args
+} else {
+ & "$basedir/../node/bin/node" $args
+}
+exit $LASTEXITCODE
diff --git a/node_modules/.ignored/node/README.md b/node_modules/.ignored/node/README.md
new file mode 100644
index 0000000..53a3ea6
--- /dev/null
+++ b/node_modules/.ignored/node/README.md
@@ -0,0 +1,34 @@
+node
+========
+
+Installs a `node` binary into your project, which because `npm` runs scripts with the local `./node_modules/.bin` in the `PATH` ahead of the system copy means you can have a local version of node that is different than your system's, and manage node as a normal dependency.
+
+Warning: don't install this globally with npm 2. `npm@2` immediately removes node, then can't run the scripts that make this work.
+
+Use
+---
+
+```
+npm i node@lts
+```
+
+Use with `npx`
+--------------
+
+```
+npx node@4 myscript.js
+```
+
+This will run `myscript.js` with the latest version of node from the v4 major.
+
+Using the shell auto-fallback of npx, you can even do it like so:
+
+
+```
+node@4 myscript.js
+```
+
+Thanks
+------
+
+Major thanks to Kat Marchán for late-night problem solving, and to CJ Silverio and Maciej Małecki for egging me on way back when I had the idea to package node up this way. It does turn out if you ask "why _not_?!" once in a while something fun happens.
diff --git a/node_modules/.ignored/node/bin/node b/node_modules/.ignored/node/bin/node
new file mode 100644
index 0000000..20efe38
--- /dev/null
+++ b/node_modules/.ignored/node/bin/node
@@ -0,0 +1 @@
+This file intentionally left blank
\ No newline at end of file
diff --git a/node_modules/.ignored/node/bin/node.exe b/node_modules/.ignored/node/bin/node.exe
new file mode 100644
index 0000000..9674b61
Binary files /dev/null and b/node_modules/.ignored/node/bin/node.exe differ
diff --git a/node_modules/.ignored/node/installArchSpecificPackage.js b/node_modules/.ignored/node/installArchSpecificPackage.js
new file mode 100644
index 0000000..e7d4354
--- /dev/null
+++ b/node_modules/.ignored/node/installArchSpecificPackage.js
@@ -0,0 +1 @@
+require('node-bin-setup')("22.17.0", require)
\ No newline at end of file
diff --git a/node_modules/.ignored/node/node_modules/.bin/node b/node_modules/.ignored/node/node_modules/.bin/node
new file mode 100644
index 0000000..957dadd
--- /dev/null
+++ b/node_modules/.ignored/node/node_modules/.bin/node
@@ -0,0 +1,12 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+ *CYGWIN*|*MINGW*|*MSYS*)
+ if command -v cygpath > /dev/null 2>&1; then
+ basedir=`cygpath -w "$basedir"`
+ fi
+ ;;
+esac
+
+exec "$basedir/../node-win-x64/bin/node.exe" "$@"
diff --git a/node_modules/.ignored/node/node_modules/.bin/node.cmd b/node_modules/.ignored/node/node_modules/.bin/node.cmd
new file mode 100644
index 0000000..9c252c0
--- /dev/null
+++ b/node_modules/.ignored/node/node_modules/.bin/node.cmd
@@ -0,0 +1,9 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+"%dp0%\..\node-win-x64\bin\node.exe" %*
diff --git a/node_modules/.ignored/node/node_modules/.bin/node.ps1 b/node_modules/.ignored/node/node_modules/.bin/node.ps1
new file mode 100644
index 0000000..97b073f
--- /dev/null
+++ b/node_modules/.ignored/node/node_modules/.bin/node.ps1
@@ -0,0 +1,16 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+ # Fix case when both the Windows and Linux builds of Node
+ # are installed in the same directory
+ $exe=".exe"
+}
+# Support pipeline input
+if ($MyInvocation.ExpectingInput) {
+ $input | & "$basedir/../node-win-x64/bin/node.exe" $args
+} else {
+ & "$basedir/../node-win-x64/bin/node.exe" $args
+}
+exit $LASTEXITCODE
diff --git a/node_modules/.ignored/node/node_modules/.package-lock.json b/node_modules/.ignored/node/node_modules/.package-lock.json
new file mode 100644
index 0000000..becfdb9
--- /dev/null
+++ b/node_modules/.ignored/node/node_modules/.package-lock.json
@@ -0,0 +1,22 @@
+{
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "node_modules/node-bin-setup": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.4.tgz",
+ "integrity": "sha512-vWNHOne0ZUavArqPP5LJta50+S8R261Fr5SvGul37HbEDcowvLjwdvd0ZeSr0r2lTSrPxl6okq9QUw8BFGiAxA==",
+ "license": "ISC"
+ },
+ "node_modules/node-win-x64": {
+ "version": "22.17.0",
+ "resolved": "https://registry.npmjs.org/node-win-x64/-/node-win-x64-22.17.0.tgz",
+ "integrity": "sha512-aUNP0XzMd1pC0t5SvgaxpxRmecT6583nInTDI82Zu8ujc0cpKvDR/VPCRn/Qy0ve9+MTofUFmxhCS4Zz2FhfTw==",
+ "cpu": "x64",
+ "os": "win32",
+ "bin": {
+ "node": "bin/node.exe"
+ }
+ }
+ }
+}
diff --git a/node_modules/.ignored/node/node_modules/node-bin-setup/.github/dependabot.yml b/node_modules/.ignored/node/node_modules/node-bin-setup/.github/dependabot.yml
new file mode 100644
index 0000000..290ad02
--- /dev/null
+++ b/node_modules/.ignored/node/node_modules/node-bin-setup/.github/dependabot.yml
@@ -0,0 +1,8 @@
+version: 2
+updates:
+- package-ecosystem: npm
+ directory: "/"
+ schedule:
+ interval: daily
+ time: "10:00"
+ open-pull-requests-limit: 10
diff --git a/node_modules/.ignored/node/node_modules/node-bin-setup/index.js b/node_modules/.ignored/node/node_modules/node-bin-setup/index.js
new file mode 100644
index 0000000..0841976
--- /dev/null
+++ b/node_modules/.ignored/node/node_modules/node-bin-setup/index.js
@@ -0,0 +1,58 @@
+var spawn = require('child_process').spawn;
+var path = require('path');
+var fs = require('fs');
+
+function installArchSpecificPackage(version, require) {
+
+ process.env.npm_config_global = 'false';
+ process.env.npm_config_repository = '';
+
+ var platform = process.platform == 'win32' ? 'win' : process.platform;
+ var arch = platform == 'win' && process.arch == 'ia32' ? 'x86' : process.arch;
+ var prefix = (process.platform == 'darwin' && process.arch == 'arm64') ? 'node-bin' : 'node';
+
+ var cp = spawn(platform == 'win' ? 'npm.cmd' : 'npm', ['install', '--no-save', [prefix, platform, arch].join('-') + '@' + version], {
+ stdio: 'inherit',
+ shell: true
+ });
+
+ cp.on('close', function(code) {
+ var pkgJson = require.resolve([prefix, platform, arch].join('-') + '/package.json');
+ var subpkg = JSON.parse(fs.readFileSync(pkgJson, 'utf8'));
+ var executable = subpkg.bin.node;
+ var bin = path.resolve(path.dirname(pkgJson), executable);
+
+ try {
+ fs.mkdirSync(path.resolve(process.cwd(), 'bin'));
+ } catch (e) {
+ if (e.code != 'EEXIST') {
+ throw e;
+ }
+ }
+
+ linkSync(bin, path.resolve(process.cwd(), executable));
+
+ if (platform == 'win') {
+ var pkg = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), 'package.json')));
+ fs.writeFileSync(path.resolve(process.cwd(), 'bin/node'), 'This file intentionally left blank');
+ pkg.bin.node = 'bin/node.exe';
+ fs.writeFileSync(path.resolve(process.cwd(), 'package.json'), JSON.stringify(pkg, null, 2));
+ }
+
+ return process.exit(code);
+
+ });
+}
+
+function linkSync(src, dest) {
+ try {
+ fs.unlinkSync(dest);
+ } catch (e) {
+ if (e.code != 'ENOENT') {
+ throw e;
+ }
+ }
+ return fs.linkSync(src, dest);
+}
+
+module.exports = installArchSpecificPackage;
diff --git a/node_modules/.ignored/node/node_modules/node-bin-setup/package.json b/node_modules/.ignored/node/node_modules/node-bin-setup/package.json
new file mode 100644
index 0000000..fa47cca
--- /dev/null
+++ b/node_modules/.ignored/node/node_modules/node-bin-setup/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "node-bin-setup",
+ "version": "1.1.4",
+ "description": "Internal script used by the node package to install architecture-specific packages",
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/aredridel/node-bin-setup.git"
+ },
+ "author": "Aria Stewart ",
+ "license": "ISC"
+}
diff --git a/node_modules/.ignored/node/node_modules/node-win-x64/bin/node.exe b/node_modules/.ignored/node/node_modules/node-win-x64/bin/node.exe
new file mode 100644
index 0000000..9674b61
Binary files /dev/null and b/node_modules/.ignored/node/node_modules/node-win-x64/bin/node.exe differ
diff --git a/node_modules/.ignored/node/node_modules/node-win-x64/package.json b/node_modules/.ignored/node/node_modules/node-win-x64/package.json
new file mode 100644
index 0000000..fcb7ebe
--- /dev/null
+++ b/node_modules/.ignored/node/node_modules/node-win-x64/package.json
@@ -0,0 +1,17 @@
+{
+ "name": "node-win-x64",
+ "version": "v22.17.0",
+ "description": "node",
+ "bin": {
+ "node": "bin/node.exe"
+ },
+ "files": [
+ "bin/node.exe",
+ "share",
+ "include",
+ "*.md",
+ "LICENSE"
+ ],
+ "os": "win32",
+ "cpu": "x64"
+}
\ No newline at end of file
diff --git a/node_modules/.ignored/node/package.json b/node_modules/.ignored/node/package.json
new file mode 100644
index 0000000..8407534
--- /dev/null
+++ b/node_modules/.ignored/node/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "node",
+ "version": "22.17.0",
+ "description": "node",
+ "main": "index.js",
+ "keywords": [
+ "runtime"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/aredridel/node-bin-gen.git"
+ },
+ "scripts": {
+ "preinstall": "node installArchSpecificPackage"
+ },
+ "bin": {
+ "node": "bin/node.exe"
+ },
+ "dependencies": {
+ "node-bin-setup": "^1.0.0"
+ },
+ "license": "ISC",
+ "author": "",
+ "engines": {
+ "npm": ">=5.0.0"
+ }
+}
\ No newline at end of file
diff --git a/node_modules/.modules.yaml b/node_modules/.modules.yaml
new file mode 100644
index 0000000..487ea20
--- /dev/null
+++ b/node_modules/.modules.yaml
@@ -0,0 +1,22 @@
+hoistPattern:
+ - '*'
+hoistedDependencies: {}
+included:
+ dependencies: true
+ devDependencies: true
+ optionalDependencies: true
+injectedDeps: {}
+layoutVersion: 5
+nodeLinker: isolated
+packageManager: pnpm@9.13.2
+pendingBuilds: []
+prunedAt: Fri, 04 Jul 2025 19:40:41 GMT
+publicHoistPattern:
+ - '*eslint*'
+ - '*prettier*'
+registries:
+ default: https://registry.npmjs.org/
+skipped: []
+storeDir: C:\Users\calmo\AppData\Local\pnpm\store\v3
+virtualStoreDir: C:\Users\calmo\excursion\calimix.github.io\node_modules\.pnpm
+virtualStoreDirMaxLength: 120
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
new file mode 100644
index 0000000..c6285b0
--- /dev/null
+++ b/node_modules/.package-lock.json
@@ -0,0 +1,38 @@
+{
+ "name": "calimix.github.io",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs": {
+ "version": "0.0.0",
+ "license": "ISC"
+ },
+ "node_modules/node": {
+ "version": "22.17.0",
+ "resolved": "https://registry.npmjs.org/node/-/node-22.17.0.tgz",
+ "integrity": "sha512-cDrw3NvGAB1QUWxTEd9mX/vf+mAhe42IwBkQ7T9z2GhIPyNM+I1u32NMu9ZgNE85UDUWmIUL4oe4JylVlwvG2Q==",
+ "hasInstallScript": true,
+ "license": "ISC",
+ "dependencies": {
+ "node-bin-setup": "^1.0.0"
+ },
+ "bin": {
+ "node": "bin/node"
+ },
+ "engines": {
+ "npm": ">=5.0.0"
+ }
+ },
+ "node_modules/node-bin-setup": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.4.tgz",
+ "integrity": "sha512-vWNHOne0ZUavArqPP5LJta50+S8R261Fr5SvGul37HbEDcowvLjwdvd0ZeSr0r2lTSrPxl6okq9QUw8BFGiAxA==",
+ "license": "ISC"
+ },
+ "node_modules/nodejs": {
+ "resolved": "node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs",
+ "link": true
+ }
+ }
+}
diff --git a/node_modules/.pnpm/lock.yaml b/node_modules/.pnpm/lock.yaml
new file mode 100644
index 0000000..19dfe8d
--- /dev/null
+++ b/node_modules/.pnpm/lock.yaml
@@ -0,0 +1,22 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ nodejs:
+ specifier: ^0.0.0
+ version: 0.0.0
+
+packages:
+
+ nodejs@0.0.0:
+ resolution: {integrity: sha512-1V+0HwaB/dhxzidEFc4uJ3k52gLI4B6YBZgJIofjwYCSAkD6CI0me6TDBT2QM2nbGWNxCHcq9/wVynzQYZOhUg==}
+
+snapshots:
+
+ nodejs@0.0.0: {}
diff --git a/node_modules/.pnpm/node-bin-setup@1.1.4/node_modules/node-bin-setup/.github/dependabot.yml b/node_modules/.pnpm/node-bin-setup@1.1.4/node_modules/node-bin-setup/.github/dependabot.yml
new file mode 100644
index 0000000..290ad02
--- /dev/null
+++ b/node_modules/.pnpm/node-bin-setup@1.1.4/node_modules/node-bin-setup/.github/dependabot.yml
@@ -0,0 +1,8 @@
+version: 2
+updates:
+- package-ecosystem: npm
+ directory: "/"
+ schedule:
+ interval: daily
+ time: "10:00"
+ open-pull-requests-limit: 10
diff --git a/node_modules/.pnpm/node-bin-setup@1.1.4/node_modules/node-bin-setup/index.js b/node_modules/.pnpm/node-bin-setup@1.1.4/node_modules/node-bin-setup/index.js
new file mode 100644
index 0000000..0841976
--- /dev/null
+++ b/node_modules/.pnpm/node-bin-setup@1.1.4/node_modules/node-bin-setup/index.js
@@ -0,0 +1,58 @@
+var spawn = require('child_process').spawn;
+var path = require('path');
+var fs = require('fs');
+
+function installArchSpecificPackage(version, require) {
+
+ process.env.npm_config_global = 'false';
+ process.env.npm_config_repository = '';
+
+ var platform = process.platform == 'win32' ? 'win' : process.platform;
+ var arch = platform == 'win' && process.arch == 'ia32' ? 'x86' : process.arch;
+ var prefix = (process.platform == 'darwin' && process.arch == 'arm64') ? 'node-bin' : 'node';
+
+ var cp = spawn(platform == 'win' ? 'npm.cmd' : 'npm', ['install', '--no-save', [prefix, platform, arch].join('-') + '@' + version], {
+ stdio: 'inherit',
+ shell: true
+ });
+
+ cp.on('close', function(code) {
+ var pkgJson = require.resolve([prefix, platform, arch].join('-') + '/package.json');
+ var subpkg = JSON.parse(fs.readFileSync(pkgJson, 'utf8'));
+ var executable = subpkg.bin.node;
+ var bin = path.resolve(path.dirname(pkgJson), executable);
+
+ try {
+ fs.mkdirSync(path.resolve(process.cwd(), 'bin'));
+ } catch (e) {
+ if (e.code != 'EEXIST') {
+ throw e;
+ }
+ }
+
+ linkSync(bin, path.resolve(process.cwd(), executable));
+
+ if (platform == 'win') {
+ var pkg = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), 'package.json')));
+ fs.writeFileSync(path.resolve(process.cwd(), 'bin/node'), 'This file intentionally left blank');
+ pkg.bin.node = 'bin/node.exe';
+ fs.writeFileSync(path.resolve(process.cwd(), 'package.json'), JSON.stringify(pkg, null, 2));
+ }
+
+ return process.exit(code);
+
+ });
+}
+
+function linkSync(src, dest) {
+ try {
+ fs.unlinkSync(dest);
+ } catch (e) {
+ if (e.code != 'ENOENT') {
+ throw e;
+ }
+ }
+ return fs.linkSync(src, dest);
+}
+
+module.exports = installArchSpecificPackage;
diff --git a/node_modules/.pnpm/node-bin-setup@1.1.4/node_modules/node-bin-setup/package.json b/node_modules/.pnpm/node-bin-setup@1.1.4/node_modules/node-bin-setup/package.json
new file mode 100644
index 0000000..fa47cca
--- /dev/null
+++ b/node_modules/.pnpm/node-bin-setup@1.1.4/node_modules/node-bin-setup/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "node-bin-setup",
+ "version": "1.1.4",
+ "description": "Internal script used by the node package to install architecture-specific packages",
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/aredridel/node-bin-setup.git"
+ },
+ "author": "Aria Stewart ",
+ "license": "ISC"
+}
diff --git a/node_modules/.pnpm/node@22.17.0/node_modules/node-bin-setup/.github/dependabot.yml b/node_modules/.pnpm/node@22.17.0/node_modules/node-bin-setup/.github/dependabot.yml
new file mode 100644
index 0000000..290ad02
--- /dev/null
+++ b/node_modules/.pnpm/node@22.17.0/node_modules/node-bin-setup/.github/dependabot.yml
@@ -0,0 +1,8 @@
+version: 2
+updates:
+- package-ecosystem: npm
+ directory: "/"
+ schedule:
+ interval: daily
+ time: "10:00"
+ open-pull-requests-limit: 10
diff --git a/node_modules/.pnpm/node@22.17.0/node_modules/node-bin-setup/index.js b/node_modules/.pnpm/node@22.17.0/node_modules/node-bin-setup/index.js
new file mode 100644
index 0000000..0841976
--- /dev/null
+++ b/node_modules/.pnpm/node@22.17.0/node_modules/node-bin-setup/index.js
@@ -0,0 +1,58 @@
+var spawn = require('child_process').spawn;
+var path = require('path');
+var fs = require('fs');
+
+function installArchSpecificPackage(version, require) {
+
+ process.env.npm_config_global = 'false';
+ process.env.npm_config_repository = '';
+
+ var platform = process.platform == 'win32' ? 'win' : process.platform;
+ var arch = platform == 'win' && process.arch == 'ia32' ? 'x86' : process.arch;
+ var prefix = (process.platform == 'darwin' && process.arch == 'arm64') ? 'node-bin' : 'node';
+
+ var cp = spawn(platform == 'win' ? 'npm.cmd' : 'npm', ['install', '--no-save', [prefix, platform, arch].join('-') + '@' + version], {
+ stdio: 'inherit',
+ shell: true
+ });
+
+ cp.on('close', function(code) {
+ var pkgJson = require.resolve([prefix, platform, arch].join('-') + '/package.json');
+ var subpkg = JSON.parse(fs.readFileSync(pkgJson, 'utf8'));
+ var executable = subpkg.bin.node;
+ var bin = path.resolve(path.dirname(pkgJson), executable);
+
+ try {
+ fs.mkdirSync(path.resolve(process.cwd(), 'bin'));
+ } catch (e) {
+ if (e.code != 'EEXIST') {
+ throw e;
+ }
+ }
+
+ linkSync(bin, path.resolve(process.cwd(), executable));
+
+ if (platform == 'win') {
+ var pkg = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), 'package.json')));
+ fs.writeFileSync(path.resolve(process.cwd(), 'bin/node'), 'This file intentionally left blank');
+ pkg.bin.node = 'bin/node.exe';
+ fs.writeFileSync(path.resolve(process.cwd(), 'package.json'), JSON.stringify(pkg, null, 2));
+ }
+
+ return process.exit(code);
+
+ });
+}
+
+function linkSync(src, dest) {
+ try {
+ fs.unlinkSync(dest);
+ } catch (e) {
+ if (e.code != 'ENOENT') {
+ throw e;
+ }
+ }
+ return fs.linkSync(src, dest);
+}
+
+module.exports = installArchSpecificPackage;
diff --git a/node_modules/.pnpm/node@22.17.0/node_modules/node-bin-setup/package.json b/node_modules/.pnpm/node@22.17.0/node_modules/node-bin-setup/package.json
new file mode 100644
index 0000000..fa47cca
--- /dev/null
+++ b/node_modules/.pnpm/node@22.17.0/node_modules/node-bin-setup/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "node-bin-setup",
+ "version": "1.1.4",
+ "description": "Internal script used by the node package to install architecture-specific packages",
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/aredridel/node-bin-setup.git"
+ },
+ "author": "Aria Stewart ",
+ "license": "ISC"
+}
diff --git a/node_modules/.pnpm/node@22.17.0/node_modules/node/README.md b/node_modules/.pnpm/node@22.17.0/node_modules/node/README.md
new file mode 100644
index 0000000..53a3ea6
--- /dev/null
+++ b/node_modules/.pnpm/node@22.17.0/node_modules/node/README.md
@@ -0,0 +1,34 @@
+node
+========
+
+Installs a `node` binary into your project, which because `npm` runs scripts with the local `./node_modules/.bin` in the `PATH` ahead of the system copy means you can have a local version of node that is different than your system's, and manage node as a normal dependency.
+
+Warning: don't install this globally with npm 2. `npm@2` immediately removes node, then can't run the scripts that make this work.
+
+Use
+---
+
+```
+npm i node@lts
+```
+
+Use with `npx`
+--------------
+
+```
+npx node@4 myscript.js
+```
+
+This will run `myscript.js` with the latest version of node from the v4 major.
+
+Using the shell auto-fallback of npx, you can even do it like so:
+
+
+```
+node@4 myscript.js
+```
+
+Thanks
+------
+
+Major thanks to Kat Marchán for late-night problem solving, and to CJ Silverio and Maciej Małecki for egging me on way back when I had the idea to package node up this way. It does turn out if you ask "why _not_?!" once in a while something fun happens.
diff --git a/node_modules/.pnpm/node@22.17.0/node_modules/node/installArchSpecificPackage.js b/node_modules/.pnpm/node@22.17.0/node_modules/node/installArchSpecificPackage.js
new file mode 100644
index 0000000..e7d4354
--- /dev/null
+++ b/node_modules/.pnpm/node@22.17.0/node_modules/node/installArchSpecificPackage.js
@@ -0,0 +1 @@
+require('node-bin-setup')("22.17.0", require)
\ No newline at end of file
diff --git a/node_modules/.pnpm/node@22.17.0/node_modules/node/package.json b/node_modules/.pnpm/node@22.17.0/node_modules/node/package.json
new file mode 100644
index 0000000..23574f6
--- /dev/null
+++ b/node_modules/.pnpm/node@22.17.0/node_modules/node/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "node",
+ "version": "22.17.0",
+ "description": "node",
+ "main": "index.js",
+ "keywords": [
+ "runtime"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/aredridel/node-bin-gen.git"
+ },
+ "scripts": {
+ "preinstall": "node installArchSpecificPackage"
+ },
+ "bin": {
+ "node": "bin/node"
+ },
+ "dependencies": {
+ "node-bin-setup": "^1.0.0"
+ },
+ "license": "ISC",
+ "author": "",
+ "engines": {
+ "npm": ">=5.0.0"
+ }
+}
\ No newline at end of file
diff --git a/node_modules/.pnpm/node_modules/node-bin-setup/.github/dependabot.yml b/node_modules/.pnpm/node_modules/node-bin-setup/.github/dependabot.yml
new file mode 100644
index 0000000..290ad02
--- /dev/null
+++ b/node_modules/.pnpm/node_modules/node-bin-setup/.github/dependabot.yml
@@ -0,0 +1,8 @@
+version: 2
+updates:
+- package-ecosystem: npm
+ directory: "/"
+ schedule:
+ interval: daily
+ time: "10:00"
+ open-pull-requests-limit: 10
diff --git a/node_modules/.pnpm/node_modules/node-bin-setup/index.js b/node_modules/.pnpm/node_modules/node-bin-setup/index.js
new file mode 100644
index 0000000..0841976
--- /dev/null
+++ b/node_modules/.pnpm/node_modules/node-bin-setup/index.js
@@ -0,0 +1,58 @@
+var spawn = require('child_process').spawn;
+var path = require('path');
+var fs = require('fs');
+
+function installArchSpecificPackage(version, require) {
+
+ process.env.npm_config_global = 'false';
+ process.env.npm_config_repository = '';
+
+ var platform = process.platform == 'win32' ? 'win' : process.platform;
+ var arch = platform == 'win' && process.arch == 'ia32' ? 'x86' : process.arch;
+ var prefix = (process.platform == 'darwin' && process.arch == 'arm64') ? 'node-bin' : 'node';
+
+ var cp = spawn(platform == 'win' ? 'npm.cmd' : 'npm', ['install', '--no-save', [prefix, platform, arch].join('-') + '@' + version], {
+ stdio: 'inherit',
+ shell: true
+ });
+
+ cp.on('close', function(code) {
+ var pkgJson = require.resolve([prefix, platform, arch].join('-') + '/package.json');
+ var subpkg = JSON.parse(fs.readFileSync(pkgJson, 'utf8'));
+ var executable = subpkg.bin.node;
+ var bin = path.resolve(path.dirname(pkgJson), executable);
+
+ try {
+ fs.mkdirSync(path.resolve(process.cwd(), 'bin'));
+ } catch (e) {
+ if (e.code != 'EEXIST') {
+ throw e;
+ }
+ }
+
+ linkSync(bin, path.resolve(process.cwd(), executable));
+
+ if (platform == 'win') {
+ var pkg = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), 'package.json')));
+ fs.writeFileSync(path.resolve(process.cwd(), 'bin/node'), 'This file intentionally left blank');
+ pkg.bin.node = 'bin/node.exe';
+ fs.writeFileSync(path.resolve(process.cwd(), 'package.json'), JSON.stringify(pkg, null, 2));
+ }
+
+ return process.exit(code);
+
+ });
+}
+
+function linkSync(src, dest) {
+ try {
+ fs.unlinkSync(dest);
+ } catch (e) {
+ if (e.code != 'ENOENT') {
+ throw e;
+ }
+ }
+ return fs.linkSync(src, dest);
+}
+
+module.exports = installArchSpecificPackage;
diff --git a/node_modules/.pnpm/node_modules/node-bin-setup/package.json b/node_modules/.pnpm/node_modules/node-bin-setup/package.json
new file mode 100644
index 0000000..fa47cca
--- /dev/null
+++ b/node_modules/.pnpm/node_modules/node-bin-setup/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "node-bin-setup",
+ "version": "1.1.4",
+ "description": "Internal script used by the node package to install architecture-specific packages",
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/aredridel/node-bin-setup.git"
+ },
+ "author": "Aria Stewart ",
+ "license": "ISC"
+}
diff --git a/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/1/getmodule.js b/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/1/getmodule.js
new file mode 100644
index 0000000..acae183
--- /dev/null
+++ b/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/1/getmodule.js
@@ -0,0 +1,4 @@
+var myMoule = require('./singleobject').Hello("dsf");
+
+/* myMoule.setName("lihao__");
+myMoule.sayHello(); */
\ No newline at end of file
diff --git a/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/1/module.js b/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/1/module.js
new file mode 100644
index 0000000..f6c5b4b
--- /dev/null
+++ b/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/1/module.js
@@ -0,0 +1,8 @@
+var name;
+exports.setName = function(tyname){
+ name = tyname;
+};
+
+exports.sayHello = function(){
+ console.log("Hello"+name);
+};
\ No newline at end of file
diff --git a/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/1/singleobject.js b/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/1/singleobject.js
new file mode 100644
index 0000000..3728e5c
--- /dev/null
+++ b/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/1/singleobject.js
@@ -0,0 +1,14 @@
+function Hello(){
+ var name;
+ this.setName=function(tyname){
+ name = tyname;
+
+ }
+ this.sayHello = function(){
+ console.log("Hello"+name);
+ }
+}
+
+module.exports = Hello;
+
+
diff --git a/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/package.json b/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/package.json
new file mode 100644
index 0000000..76f1bf9
--- /dev/null
+++ b/node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "nodejs",
+ "version": "0.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
diff --git a/node_modules/node-bin-setup/.github/dependabot.yml b/node_modules/node-bin-setup/.github/dependabot.yml
new file mode 100644
index 0000000..290ad02
--- /dev/null
+++ b/node_modules/node-bin-setup/.github/dependabot.yml
@@ -0,0 +1,8 @@
+version: 2
+updates:
+- package-ecosystem: npm
+ directory: "/"
+ schedule:
+ interval: daily
+ time: "10:00"
+ open-pull-requests-limit: 10
diff --git a/node_modules/node-bin-setup/index.js b/node_modules/node-bin-setup/index.js
new file mode 100644
index 0000000..0841976
--- /dev/null
+++ b/node_modules/node-bin-setup/index.js
@@ -0,0 +1,58 @@
+var spawn = require('child_process').spawn;
+var path = require('path');
+var fs = require('fs');
+
+function installArchSpecificPackage(version, require) {
+
+ process.env.npm_config_global = 'false';
+ process.env.npm_config_repository = '';
+
+ var platform = process.platform == 'win32' ? 'win' : process.platform;
+ var arch = platform == 'win' && process.arch == 'ia32' ? 'x86' : process.arch;
+ var prefix = (process.platform == 'darwin' && process.arch == 'arm64') ? 'node-bin' : 'node';
+
+ var cp = spawn(platform == 'win' ? 'npm.cmd' : 'npm', ['install', '--no-save', [prefix, platform, arch].join('-') + '@' + version], {
+ stdio: 'inherit',
+ shell: true
+ });
+
+ cp.on('close', function(code) {
+ var pkgJson = require.resolve([prefix, platform, arch].join('-') + '/package.json');
+ var subpkg = JSON.parse(fs.readFileSync(pkgJson, 'utf8'));
+ var executable = subpkg.bin.node;
+ var bin = path.resolve(path.dirname(pkgJson), executable);
+
+ try {
+ fs.mkdirSync(path.resolve(process.cwd(), 'bin'));
+ } catch (e) {
+ if (e.code != 'EEXIST') {
+ throw e;
+ }
+ }
+
+ linkSync(bin, path.resolve(process.cwd(), executable));
+
+ if (platform == 'win') {
+ var pkg = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), 'package.json')));
+ fs.writeFileSync(path.resolve(process.cwd(), 'bin/node'), 'This file intentionally left blank');
+ pkg.bin.node = 'bin/node.exe';
+ fs.writeFileSync(path.resolve(process.cwd(), 'package.json'), JSON.stringify(pkg, null, 2));
+ }
+
+ return process.exit(code);
+
+ });
+}
+
+function linkSync(src, dest) {
+ try {
+ fs.unlinkSync(dest);
+ } catch (e) {
+ if (e.code != 'ENOENT') {
+ throw e;
+ }
+ }
+ return fs.linkSync(src, dest);
+}
+
+module.exports = installArchSpecificPackage;
diff --git a/node_modules/node-bin-setup/package.json b/node_modules/node-bin-setup/package.json
new file mode 100644
index 0000000..fa47cca
--- /dev/null
+++ b/node_modules/node-bin-setup/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "node-bin-setup",
+ "version": "1.1.4",
+ "description": "Internal script used by the node package to install architecture-specific packages",
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/aredridel/node-bin-setup.git"
+ },
+ "author": "Aria Stewart ",
+ "license": "ISC"
+}
diff --git a/node_modules/node/README.md b/node_modules/node/README.md
new file mode 100644
index 0000000..53a3ea6
--- /dev/null
+++ b/node_modules/node/README.md
@@ -0,0 +1,34 @@
+node
+========
+
+Installs a `node` binary into your project, which because `npm` runs scripts with the local `./node_modules/.bin` in the `PATH` ahead of the system copy means you can have a local version of node that is different than your system's, and manage node as a normal dependency.
+
+Warning: don't install this globally with npm 2. `npm@2` immediately removes node, then can't run the scripts that make this work.
+
+Use
+---
+
+```
+npm i node@lts
+```
+
+Use with `npx`
+--------------
+
+```
+npx node@4 myscript.js
+```
+
+This will run `myscript.js` with the latest version of node from the v4 major.
+
+Using the shell auto-fallback of npx, you can even do it like so:
+
+
+```
+node@4 myscript.js
+```
+
+Thanks
+------
+
+Major thanks to Kat Marchán for late-night problem solving, and to CJ Silverio and Maciej Małecki for egging me on way back when I had the idea to package node up this way. It does turn out if you ask "why _not_?!" once in a while something fun happens.
diff --git a/node_modules/node/installArchSpecificPackage.js b/node_modules/node/installArchSpecificPackage.js
new file mode 100644
index 0000000..e7d4354
--- /dev/null
+++ b/node_modules/node/installArchSpecificPackage.js
@@ -0,0 +1 @@
+require('node-bin-setup')("22.17.0", require)
\ No newline at end of file
diff --git a/node_modules/node/package.json b/node_modules/node/package.json
new file mode 100644
index 0000000..23574f6
--- /dev/null
+++ b/node_modules/node/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "node",
+ "version": "22.17.0",
+ "description": "node",
+ "main": "index.js",
+ "keywords": [
+ "runtime"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/aredridel/node-bin-gen.git"
+ },
+ "scripts": {
+ "preinstall": "node installArchSpecificPackage"
+ },
+ "bin": {
+ "node": "bin/node"
+ },
+ "dependencies": {
+ "node-bin-setup": "^1.0.0"
+ },
+ "license": "ISC",
+ "author": "",
+ "engines": {
+ "npm": ">=5.0.0"
+ }
+}
\ No newline at end of file
diff --git a/node_modules/nodejs/1/getmodule.js b/node_modules/nodejs/1/getmodule.js
new file mode 100644
index 0000000..acae183
--- /dev/null
+++ b/node_modules/nodejs/1/getmodule.js
@@ -0,0 +1,4 @@
+var myMoule = require('./singleobject').Hello("dsf");
+
+/* myMoule.setName("lihao__");
+myMoule.sayHello(); */
\ No newline at end of file
diff --git a/node_modules/nodejs/1/module.js b/node_modules/nodejs/1/module.js
new file mode 100644
index 0000000..f6c5b4b
--- /dev/null
+++ b/node_modules/nodejs/1/module.js
@@ -0,0 +1,8 @@
+var name;
+exports.setName = function(tyname){
+ name = tyname;
+};
+
+exports.sayHello = function(){
+ console.log("Hello"+name);
+};
\ No newline at end of file
diff --git a/node_modules/nodejs/1/singleobject.js b/node_modules/nodejs/1/singleobject.js
new file mode 100644
index 0000000..3728e5c
--- /dev/null
+++ b/node_modules/nodejs/1/singleobject.js
@@ -0,0 +1,14 @@
+function Hello(){
+ var name;
+ this.setName=function(tyname){
+ name = tyname;
+
+ }
+ this.sayHello = function(){
+ console.log("Hello"+name);
+ }
+}
+
+module.exports = Hello;
+
+
diff --git a/node_modules/nodejs/package.json b/node_modules/nodejs/package.json
new file mode 100644
index 0000000..76f1bf9
--- /dev/null
+++ b/node_modules/nodejs/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "nodejs",
+ "version": "0.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC"
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..8c015f7
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,47 @@
+{
+ "name": "calimix.github.io",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "calimix.github.io",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "node": "^22.17.0",
+ "nodejs": "^0.0.0"
+ }
+ },
+ "node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs": {
+ "version": "0.0.0",
+ "license": "ISC"
+ },
+ "node_modules/node": {
+ "version": "22.17.0",
+ "resolved": "https://registry.npmjs.org/node/-/node-22.17.0.tgz",
+ "integrity": "sha512-cDrw3NvGAB1QUWxTEd9mX/vf+mAhe42IwBkQ7T9z2GhIPyNM+I1u32NMu9ZgNE85UDUWmIUL4oe4JylVlwvG2Q==",
+ "hasInstallScript": true,
+ "license": "ISC",
+ "dependencies": {
+ "node-bin-setup": "^1.0.0"
+ },
+ "bin": {
+ "node": "bin/node"
+ },
+ "engines": {
+ "npm": ">=5.0.0"
+ }
+ },
+ "node_modules/node-bin-setup": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.4.tgz",
+ "integrity": "sha512-vWNHOne0ZUavArqPP5LJta50+S8R261Fr5SvGul37HbEDcowvLjwdvd0ZeSr0r2lTSrPxl6okq9QUw8BFGiAxA==",
+ "license": "ISC"
+ },
+ "node_modules/nodejs": {
+ "resolved": "node_modules/.pnpm/nodejs@0.0.0/node_modules/nodejs",
+ "link": true
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..3f336c5
--- /dev/null
+++ b/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "calimix.github.io",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "node": "^22.17.0",
+ "nodejs": "^0.0.0"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..19dfe8d
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,22 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ nodejs:
+ specifier: ^0.0.0
+ version: 0.0.0
+
+packages:
+
+ nodejs@0.0.0:
+ resolution: {integrity: sha512-1V+0HwaB/dhxzidEFc4uJ3k52gLI4B6YBZgJIofjwYCSAkD6CI0me6TDBT2QM2nbGWNxCHcq9/wVynzQYZOhUg==}
+
+snapshots:
+
+ nodejs@0.0.0: {}
diff --git a/resources/css/style.css b/resources/css/style.css
index 72336bd..ada1ed8 100644
--- a/resources/css/style.css
+++ b/resources/css/style.css
@@ -3,6 +3,7 @@ body {
text-align: center;
font-family: "Verdana", sans-serif;
color: white;
+ font-size: 18px;
}
.cta {
@@ -25,6 +26,20 @@ p {
color: gray;
}
+.icons {
+ width: 21rem;
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+ background-size: cover;
+ margin: 0 auto;
+}
+
+.icon {
+ width: 50px;
+ height: 50px;
+}
+
footer {
text-align: right;
-}
\ No newline at end of file
+}