Compare commits
4 commits
1ba34be500
...
3e3b3395f6
Author | SHA1 | Date | |
---|---|---|---|
3e3b3395f6 | |||
306c4d4c24 | |||
4cd2c08a4a | |||
6a0c0d7df0 |
42 changed files with 593 additions and 1124 deletions
|
@ -1,26 +1,25 @@
|
|||
name: Static
|
||||
name: Hugo
|
||||
|
||||
on: [push]
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
runs-on: hugo-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: 'recursive'
|
||||
- name: Grab packages
|
||||
run: |
|
||||
apt-get update && \
|
||||
apt-get install --no-install-recommends --no-install-suggests -y jq rsync
|
||||
- name: Test static page
|
||||
run: bash ${{ gitea.workspace }}/bin/test_static_page.sh
|
||||
- name: Deploy to Server
|
||||
uses: easingthemes/ssh-deploy@main
|
||||
env:
|
||||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: 'true'
|
||||
- name: Run build task
|
||||
run: hugo --minify
|
||||
- name: pre-compress
|
||||
run: find ./public/* -type f \( -name '*.html' -o -name '*.js' -o -name '*.css' \) -exec gzip -v -k -f --best {} \;
|
||||
- name: Deploy to Server
|
||||
uses: https://git.myco.systems/mirrors/ssh-deploy@main
|
||||
env:
|
||||
SSH_PRIVATE_KEY: ${{ secrets.RUNNER_SSH_PRIVATE_KEY }}
|
||||
ARGS: "-rlgoDzvc -i --delete"
|
||||
SOURCE: "public/"
|
||||
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
|
||||
|
|
147
.gitignore
vendored
Normal file
147
.gitignore
vendored
Normal file
|
@ -0,0 +1,147 @@
|
|||
# ---> Hugo
|
||||
# Generated files by hugo
|
||||
/public
|
||||
/resources/_gen/
|
||||
/assets/jsconfig.json
|
||||
hugo_stats.json
|
||||
|
||||
# Executable may be added to repository
|
||||
hugo.exe
|
||||
hugo.darwin
|
||||
hugo.linux
|
||||
|
||||
# Temporary lock file while building
|
||||
/.hugo_build.lock
|
||||
|
||||
# ---> Node
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional stylelint cache
|
||||
.stylelintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# vuepress v2.x temp and cache directory
|
||||
.temp
|
||||
.cache
|
||||
|
||||
# Docusaurus cache and generated files
|
||||
.docusaurus
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -1,3 +1,6 @@
|
|||
[submodule "public/icons"]
|
||||
path = public/icons
|
||||
url = https://git.myco.systems/mycosystems/icons.git
|
||||
[submodule "static"]
|
||||
path = static
|
||||
url = https://git.myco.systems/mycosystems/favicons.git
|
||||
|
|
5
Makefile
Normal file
5
Makefile
Normal file
|
@ -0,0 +1,5 @@
|
|||
.PHONY: dev
|
||||
|
||||
dev:
|
||||
hugo server --disableFastRender & \
|
||||
tailwindcss -i ./themes/icbm/src/input.css -o ./themes/icbm/static/css/tailwind.min.css --watch --minify
|
10
README.md
10
README.md
|
@ -1,14 +1,14 @@
|
|||
# myco.systems
|
||||
|
||||
This has been my (brooke) project to start our website from scratch, ~~no external dependancies~~ (Currently using simplex noise and of course the existing JS for the globe). Obviously much harder so far, but a nice learning experience.
|
||||
|
||||
Trying to keep it under 50 MB total, currently the payload sent to the browser is around 10 KiB. Repo size without icons is right at 1.1 MiB ^.^
|
||||
|
||||
~~Update: mostly started from the ground up, got some inspiration from https://codepen.io/prisoner849 and started trying to learn three.js, looks very interesting so far. It's a big mess and I don't expect most of this code to be moved into future releases but I think it looks cool and it's performant enough for the end user.~~
|
||||
|
||||
Update 2: Started from the ground up again, everything has been redone to encourage the usage of static browsers, ie. FREE browser or any modern browser with JS discouraged. Now whenever JS is disabled you will still see the main content and will be able to open all modals but the globe just wont spin. https://codepen.io/thepheer/pen/jvMJMd
|
||||
|
||||
Update 3: Starting from scratch again but this time using hugo and creating a tailwindcss3 theme file. I wanted something that could be easier to maintain so now I want to turn the current style into something we can edit/build using our CMS.
|
||||
|
||||
```
|
||||
git clone https://git.myco.systems/mycosystems/myco.systems.git
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
```
|
||||
npm i
|
||||
```
|
5
archetypes/default.md
Normal file
5
archetypes/default.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
+++
|
||||
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
|
||||
date = {{ .Date }}
|
||||
draft = true
|
||||
+++
|
4
config.toml
Normal file
4
config.toml
Normal file
|
@ -0,0 +1,4 @@
|
|||
baseURL = 'https://example.org/'
|
||||
languageCode = 'en-us'
|
||||
title = 'My New Hugo Site'
|
||||
theme = "icbm"
|
55
package-lock.json
generated
Normal file
55
package-lock.json
generated
Normal file
|
@ -0,0 +1,55 @@
|
|||
{
|
||||
"name": "myco.systems",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"devDependencies": {
|
||||
"prettier": "^3.3.3",
|
||||
"prettier-plugin-go-template": "^0.0.15"
|
||||
}
|
||||
},
|
||||
"node_modules/prettier": {
|
||||
"version": "3.3.3",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
|
||||
"integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"prettier": "bin/prettier.cjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/prettier/prettier?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/prettier-plugin-go-template": {
|
||||
"version": "0.0.15",
|
||||
"resolved": "https://registry.npmjs.org/prettier-plugin-go-template/-/prettier-plugin-go-template-0.0.15.tgz",
|
||||
"integrity": "sha512-WqU92E1NokWYNZ9mLE6ijoRg6LtIGdLMePt2C7UBDjXeDH9okcRI3zRqtnWR4s5AloiqyvZ66jNBAa9tmRY5EQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ulid": "^2.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"prettier": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ulid": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz",
|
||||
"integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"ulid": "bin/cli.js"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
6
package.json
Normal file
6
package.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"devDependencies": {
|
||||
"prettier": "^3.3.3",
|
||||
"prettier-plugin-go-template": "^0.0.15"
|
||||
}
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
Subproject commit 281b2e19f4fc287fe7d0c704bc4e1fb9b0ec7d3d
|
|
@ -1,248 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>The Mycelial Network</title>
|
||||
<a rel="me" href="https://kolektiva.social/@eyess"></a>
|
||||
<a rel="me" href="https://mastodon.social/@brookeee"></a>
|
||||
<link rel="stylesheet" href="./style.css" />
|
||||
<link
|
||||
rel="icon"
|
||||
href="./icons/red-background/favicon.ico"
|
||||
type="image/x-icon"
|
||||
/>
|
||||
<meta
|
||||
name="description"
|
||||
content="MycoSystems is a tech cooperative that utilizes open-source technology to enable individuals from diverse backgrounds to develop sustainable solutions."
|
||||
/>
|
||||
|
||||
<meta property="og:url" content="https://myco.systems/" />
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="The Mycelial Network" />
|
||||
<meta
|
||||
property="og:description"
|
||||
content="Myco.systems is a tech cooperative that utilizes open-source technology to enable individuals from diverse backgrounds to develop sustainable solutions."
|
||||
/>
|
||||
<meta
|
||||
property="og:image"
|
||||
content="https://myco.systems/icons/backgrounds/concrete-shrooms.png"
|
||||
/>
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta property="twitter:domain" content="myco.systems" />
|
||||
<meta property="twitter:url" content="https://myco.systems/" />
|
||||
<meta name="twitter:title" content="The Mycelial Network" />
|
||||
<meta
|
||||
name="twitter:description"
|
||||
content="Myco.systems is a tech cooperative that utilizes open-source technology to enable individuals from diverse backgrounds to develop sustainable solutions."
|
||||
/>
|
||||
<meta
|
||||
name="twitter:image"
|
||||
content="https://myco.systems/icons/backgrounds/concrete-shrooms.png"
|
||||
/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="center-text">
|
||||
<input
|
||||
type="radio"
|
||||
id="tab-links"
|
||||
name="tab"
|
||||
checked
|
||||
style="display: none"
|
||||
/>
|
||||
<input type="radio" id="tab-about" name="tab" style="display: none" />
|
||||
<input type="radio" id="tab-contact" name="tab" style="display: none" />
|
||||
<input type="radio" id="tab-dash" name="tab" style="display: none" />
|
||||
|
||||
<div class="tabs">
|
||||
<label for="tab-links" class="tab">Home</label>
|
||||
<label for="tab-about" class="tab">About</label>
|
||||
<label for="tab-contact" class="tab">Contact</label>
|
||||
<label for="tab-dash" class="tab">Dashboard</label>
|
||||
<a target="_blank" href="https://uptime.myco.systems/" class="tab-link">Uptime <svg class="tab-icon" viewBox="0 0 512 512"><path d="M320 0c-17.7 0-32 14.3-32 32s14.3 32 32 32h82.7L201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L448 109.3V192c0 17.7 14.3 32 32 32s32-14.3 32-32V32c0-17.7-14.3-32-32-32H320zM80 32C35.8 32 0 67.8 0 112V432c0 44.2 35.8 80 80 80H400c44.2 0 80-35.8 80-80V320c0-17.7-14.3-32-32-32s-32 14.3-32 32V432c0 8.8-7.2 16-16 16H80c-8.8 0-16-7.2-16-16V112c0-8.8 7.2-16 16-16H192c17.7 0 32-14.3 32-32s-14.3-32-32-32H80z"/></svg></a>
|
||||
</div>
|
||||
<div id="linksTab" class="tab-content">
|
||||
<p>Hi! It's good to see you \( ‘ o ‘ )/</p>
|
||||
<div class="bullet-text">
|
||||
<ul class="links">
|
||||
<li>
|
||||
<a href="https://myco.systems" target="_blank">Myco.Systems</a>
|
||||
</li>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://coop.myco.systems" target="_blank"
|
||||
>Coop.Myco.Systems</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://web.myco.systems" target="_blank"
|
||||
>Web.Myco.Systems</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://git.myco.systems/explore/repos" target="_blank"
|
||||
>Git.Myco.Systems</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<details class="modal">
|
||||
<summary class="modal__toggle"></summary>
|
||||
<div class="modal__background">
|
||||
<div
|
||||
class="modal__body"
|
||||
tabindex="-1"
|
||||
role="dialog"
|
||||
aria-labelledby="modal__label"
|
||||
aria-live="assertive"
|
||||
aria-modal="true"
|
||||
>
|
||||
<p id="modal__label" class="modal__text">
|
||||
Donations go to making sure we can keep all of our free services
|
||||
running ♡⸜(ˆᗜˆ˵ )⸝♡
|
||||
<br /><br />
|
||||
<b>The following cryptocurrencies are supported:</b>
|
||||
<br /><br />
|
||||
<b class="crypto-name">Monero (XMR):</b
|
||||
><span class="crypto-address"
|
||||
>49r2aeun8DtV5VqZpZSwRpS83WfUWEaLt4NG8HJwwVkbiT1vSsXTXrPFKkKTdc6MPX9iezbTidNPvhGZKCnM1338TfK6Hgi</span
|
||||
>
|
||||
<br />
|
||||
<b class="crypto-name">Litecoin (LTC):</b
|
||||
><span class="crypto-address"
|
||||
>LRAm7h5XENknfYEpbdVsvyGY8D6MiXGTDV</span
|
||||
>
|
||||
<br />
|
||||
<b class="crypto-name">Bitcoin (BTC):</b
|
||||
><span class="crypto-address"
|
||||
>bc1qkv97ajh7f0a72l9rsjd3fmmly5q5uywr06q3x0</span
|
||||
>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<div id="aboutTab" class="tab-content">
|
||||
<p
|
||||
>Welcome to the MycoSystems homepage, we're a tech collective that's
|
||||
trying to make open source hosted services more viable in a broad
|
||||
variety of cases.<br /><br />We build deployments for companies,
|
||||
non-profits, and individuals to expand the reach of open source
|
||||
services.<br /><br />If you're interested in getting our help or just
|
||||
want to chat, send us a message through our contact email on the next
|
||||
tab.</p
|
||||
><br /><br />
|
||||
<p>ദ്ദി ˉ͈̀꒳ˉ͈́ )✧</p>
|
||||
</div>
|
||||
|
||||
<div id="contactTab" class="tab-content">
|
||||
<p>Send us a cool message and we'll get back to you d-(´▽`)-b</p>
|
||||
<ul>
|
||||
<p class="contact-name">contact(at)myco(dot)systems</p
|
||||
><span class="pgp-address"
|
||||
>-----BEGIN PGP PUBLIC KEY BLOCK-----<br />mDMEZcQaFBYJKwYBBAHaRw8BAQdAKjok4wl0tBlYyTj6qw4nu6AqTdU+OGorGE5d8N7bLXW0Ik15Y29TeXN0ZW1zIDxjb250YWN0QG15Y28uc3lzdGVtcz6IkwQTFgoAOxYhBCw75FUiGzj0ZvOJhZ1ZZp3r0s3IBQJlxBoUAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEJ1ZZp3r0s3I38QA/3yK6QODeRsfoGimd1OX3BA/Y1OxKTl2GS7OiyTcRotyAQC905hPTwaAYFbru1W1S8p+zDrWjGJ7jXMevOZlsF9GD7g4BGXEGhQSCisGAQQBl1UBBQEBB0B2d2SSG7eCIrTKA9xO45414eS3THHwX63dkaqbexwHJwMBCAeIeAQYFgoAIBYhBCw75FUiGzj0ZvOJhZ1ZZp3r0s3IBQJlxBoUAhsMAAoJEJ1ZZp3r0s3INzMA/AoCN+h/eG+7ByTsZUAGY6gKsSfQgy86PjijfrusC/3TAQDMNrMjzq2sIZhUZSaK8Q5pzgSFPloqk4QG1FRi4x0zAA===Pg50<br />-----END
|
||||
PGP PUBLIC KEY BLOCK-----</span
|
||||
>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="dashTab" class="tab-content">
|
||||
<p>Check out some of our free services and projects (⌐⊙_⊙)</p>
|
||||
<div class="dashboard bullet-text">
|
||||
<ul class="links">
|
||||
<p>Free Services</p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://paste.myco.systems" target="_blank"
|
||||
>PrivateBin</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://collab.myco.systems" target="_blank"
|
||||
>HedgeDoc</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
<ul>
|
||||
<p>Projects</p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://squattheplanet.com" target="_blank"
|
||||
>Squat The Planet</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://wiki.hemera.network" target="_blank"
|
||||
>Hemera Network</a
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<noscript class="globe-txt">
|
||||
<pre>
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣠⣤⣤⣤⣤⣄⣄⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠤⠖⢒⡿⠿⢿⣿⣿⢿⣿⣧⣾⣿⣾⡻⠟⠿⠿⡓⠁⠈⠫⠑⠓⠐⠢⠤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⠖⠛⠉⠀⠀⠀⠀⡠⠖⠚⣚⠛⠈⠕⠠⡄⣉⢉⡉⠍⢹⣴⣉⠍⠀⣌⠀⢲⠶⡵⡐⡆⠉⠁⠠⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣾⡟⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠐⠿⠓⢠⢄⣭⣬⣵⣷⣶⣶⣮⢍⣟⠉⠉⢎⠙⠟⡖⣑⡀⠈⠁⠀⠀⠀⠀⠀⠀⠠⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⣿⡫⠙⠋⢀⠀⣠⠀⡀⠁⠀⠀⠀⠀⠀⢀⠀⠈⠀⠛⠈⠑⠘⠙⢹⣿⣕⣌⣀⢀⠀⠀⠀⠀⠀⠀⠐⠿⢟⡃⠀⠀⠀⢠⠀⠀⠀⠀⠀⠀⠲⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡶⡿⡉⠙⠒⠶⠪⠂⠱⡿⠾⠊⠀⣠⣤⣖⣖⣶⣴⣆⠀⠀⠀⠈⠠⢠⡠⣀⣠⠈⠉⢛⡓⠉⠠⢀⠁⠄⠀⠀⠀⠀⠁⠀⠀⢀⡦⣕⣒⣽⣥⡆⢤⣄⠸⢼⣿⣷⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⠋⠈⠀⠀⠀⠀⢀⡂⢨⣡⣽⣡⣢⣴⣿⣿⣿⣿⣿⣿⣿⡀⠶⣄⣂⢾⣿⣿⣿⠓⢒⡀⢰⡵⠀⠀⠘⠀⠀⠀⠀⠀⠀⠈⣶⠄⢦⠦⣿⣷⣿⣿⣾⣿⣶⣔⡀⠙⠟⡿⠻⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⡛⠀⠀⠀⠀⠀⢀⣀⡐⠀⣿⣿⣯⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣸⣿⡿⣟⣿⣿⢧⣦⡩⠀⣈⠁⠀⠀⡄⠀⠀⠀⠀⠀⠀⠀⠠⢆⢀⣸⣿⣿⣿⣿⣿⣿⣿⣿⡟⢶⢄⡘⠄⠈⣿⠶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⢿⠏⠀⠀⠀⠀⠀⠀⠠⠀⢑⣴⣶⣿⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣷⠺⢽⣿⣽⣿⣿⣿⣿⣿⣟⠿⠋⠀⠀⠀⠀⠀⠀⠀⠤⠰⠆⢌⠲⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣮⣌⢇⢹⡶⣠⡀⠘⠷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣻⠥⠀⠀⠀⠀⠀⠀⠀⠀⢨⣍⣟⣿⣿⣿⣿⣿⣿⣿⠿⢫⣿⣿⠻⢿⣿⡿⣿⣿⣷⣿⣿⣷⣿⣿⣿⣿⣿⣯⣤⠠⠄⠀⠀⠀⠀⠐⠀⢺⣧⠊⡑⡆⠀⠟⢿⢿⣿⣿⣿⣿⣿⣿⣿⣷⣧⣟⢿⣿⣧⢢⣐⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⠧⠀⠀⠀⠀⠀⣀⣀⢀⣢⣾⣿⣿⣿⣿⣿⣿⣿⣟⣿⣿⣾⣾⣿⠷⠡⡦⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⡉⢛⣗⣄⠀⠀⠀⠀⠀⠀⠀⠈⢍⡥⠀⠁⠀⠀⠀⠒⠽⠿⣿⡿⣿⣿⢿⠒⡹⡛⠚⢿⣿⣶⠟⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⠯⢾⠖⠂⢠⠀⣾⣿⣽⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⣿⣿⣭⣛⠅⡀⢠⡿⠻⡗⣿⣽⣿⣿⣿⣿⣿⣿⣿⣷⣶⣿⣿⣾⣦⣄⡀⡄⡔⣷⣿⣶⣀⣴⡴⣤⣴⣤⣤⢄⠀⠀⠈⠀⠁⠚⠉⠟⠌⠪⡰⣪⡻⣿⡾⣾⣽⣯⠻⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⣴⠿⠻⣟⢁⢎⠀⢻⣮⣿⣿⣿⣿⣿⣿⣿⣿⠀⠈⠁⢅⡙⡙⣟⣹⠣⢿⡂⠆⢾⡶⣄⣹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡷⢿⣽⣿⣿⣿⣿⣿⣿⣿⡿⢶⣵⣿⣶⣿⡆⣀⣠⣠⣄⣀⡬⡳⣹⣿⣿⣿⣿⣗⣪⠫⣌⣾⠑⠄⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⢀⣼⠋⠀⣠⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠲⢒⣴⣵⣧⣂⡈⣌⣈⣇⢂⡀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣽⣿⣿⡻⠪⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⢀⣾⣿⠂⢸⣿⣿⣿⣿⣿⣿⣿⣿⠿⠋⣽⣹⣿⣿⣿⣿⣿⣿⣿⣽⣝⣼⣿⣵⣽⣿⡈⡭⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠄⠓⠂⢂⢀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⣾⣟⣧⣮⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⠀⡀⠀⠀⠇⠂⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⣼⣿⣿⣿⣿⣽⣿⣿⣿⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⢰⡈⢳⣰⡀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⣰⣿⣟⣿⣿⣿⣿⣿⣿⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣏⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡞⣷⣖⢹⣷⠀⠀⠀⠀⠀
|
||||
⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⡯⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠏⠻⠛⡛⢻⡿⣟⣿⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⣿⣿⡾⢋⢆⠀⠀⠀⠀
|
||||
⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⡽⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣯⣿⣿⣿⣿⣽⣿⣿⣿⣿⣿⣿⣾⣿⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⢘⡶⢔⣸⣽⣾⢟⢛⡿⢟⣭⣿⡿⢿⠻⠹⣿⣿⣭⢫⢷⡖⠉⠀⠀⠀⠀
|
||||
⠀⢠⣿⣿⣿⣿⣿⣿⣿⢿⣽⣶⡽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⣿⣿⣿⣿⣿⣿⠚⠹⢿⣿⣿⣿⣿⣿⣿⡿⢿⣿⣿⣿⣿⡚⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡗⣢⢡⢨⢉⠁⠈⠁⠀⠋⠈⠻⠏⢆⠔⢆⣰⢿⣷⡋⠀⠈⢅⠚⠰⠐⠀⠀
|
||||
⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣳⢰⣲⣼⣿⣿⣿⣿⣿⣿⣧⣼⣿⣿⣿⣿⣿⡿⢟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣳⡩⠨⠀⠆⠀⢀⡀⢀⡀⠀⠃⠘⢃⢈⣿⣿⣿⡇⡀⠀⠂⠀⠀⠀⠂⠀
|
||||
⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣽⠿⣌⢿⡿⣿⡟⠻⣿⣿⡿⠿⠏⠋⠙⣻⣿⣿⣿⣿⣮⣦⣠⣼⣿⣿⣿⣇⠀⠀⠾⣗⢰⣁⡙⡿⡭⠀⠀⠀⠀⠀⠀⠁⠀
|
||||
⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⠁⠘⠰⠟⠻⠿⠿⢯⠋⠀⠀⠀⠀⢈⢿⣿⣿⣿⣿⣿⠋⢛⣽⣿⣿⣿⣿⣷⡀⠐⣸⡉⢻⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠢⠻⠟⠈⠀⠙⠁⢉⣿⣿⣿⣿⢿⣿⣿⡿⣷⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⣿⡍⢿⣿⡇⠉⢰⡓⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣿⣿⣿⡿⠿⠃⠀⢻⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇
|
||||
⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣟⠿⣷⣾⠌⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠈⠹⣿⠃⠠⠀⠈⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣽⣿⣿⣿⣷⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠀
|
||||
⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⡕⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⠀
|
||||
⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣭⡻⠸⢾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⠛⠛⡁⠺⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡈⠀
|
||||
⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣽⣿⣿⣿⣿⣿⠀⠀⠀⢼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣝⡿⠟⢿⡏⠉⠂⠀⢠⠀⢠⠀⣠⣄⠀⠀⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠁⠀
|
||||
⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣶⣿⣿⣶⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⡿⠯⢤⠤⠀⠀⢀⣤⣹⣧⠔⡉⠡⠼⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⠀⠀
|
||||
⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⡃⠀⢁⢀⢣⢆⠀⠻⢿⡿⠟⠂⢶⠀⠄⢶⠀⠐⠀⠀⣲⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠄⠀⠀
|
||||
⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⣿⣿⣿⣿⣿⣿⣷⣿⣾⣯⣿⣯⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣽⣿⣽⣯⣷⡠⡀⢠⡘⠥⠀⠉⠂⡈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢿⣿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡇⡀⠉⠀⠁⠁⡤⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⣿⣿⣿⣛⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⡿⠲⠀⠀⠀⠈⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣭⣹⣿⣿⣿⣿⣿⣿⣇⡀⡠⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣻⣶⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣭⣿⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠈⢺⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣿⣮⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⡿⣏⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣟⣿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⡫⠩⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣷⡘⣯⣟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⡛⣿⣿⣿⣯⣿⣿⣯⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣉⡋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣾⣿⣷⣍⠻⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣯⢻⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⡿⣛⣽⣾⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠸⣿⣟⣷⣧⡟⣟⠛⠟⢿⣿⣿⣿⣿⣿⣿⣿⠟⠓⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⡙⣿⣿⣿⣟⣛⡁⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠪⢮⠼⣙⢷⣦⢶⢙⣿⣿⣿⢿⣯⣟⠷⠄⢾⠿⢿⣿⣿⣿⣿⣿⣿⣿⣛⣿⣟⡝⠛⢻⠛⠁⠀⢤⠔⠒⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⠶⡻⡟⠦⠈⠘⠁⠈⠘⠋⠛⠉⠃⠁⠒⠒⠻⢟⠛⠛⠻⢟⡟⣝⠫⣩⠧⠋⠍⠁⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣈⠙⠿⡻⠿⠷⠧⠁⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠂⠀⠀⠠⢄⠀⠄⠈⡀⢀⠠⠄⠀⠁⢀⣀⡿⢓⢉⠀⠠⠜⠫⣷⣶⣦⠄⢫⣤⣤⣠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠁⠀⠀⠀⠠⠌⠒⠤⠤⠀⠁⠹⠛⠻⠯⠃⠉⠃⡀⠍⠉⠁⠈⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
</pre>
|
||||
</noscript>
|
||||
<script src="./simplex.js"></script>
|
||||
<script src="./script.js"></script>
|
||||
</body>
|
||||
</html>
|
103
public/script.js
103
public/script.js
|
@ -1,103 +0,0 @@
|
|||
(function () {
|
||||
"use strict";
|
||||
|
||||
const enc = (x) =>
|
||||
((x & 0x08) << 3) | ((x & 0x70) >> 1) | (x & 0x87) | 0x2800;
|
||||
const row = (x) => String.fromCharCode(...Array.from(x, enc));
|
||||
|
||||
const create = (width, height) =>
|
||||
Array.from(Array(height >> 2), () => new Uint8Array(width >> 1));
|
||||
|
||||
const set = (table, x, y) =>
|
||||
(table[y >> 2][x >> 1] |= 1 << ((y & 3) | ((x & 1) << 2)));
|
||||
|
||||
const render = (table) => table.map(row).join("\n");
|
||||
|
||||
const frame = () => new Promise((resolve) => requestAnimationFrame(resolve));
|
||||
|
||||
const element = (name, options) =>
|
||||
Object.assign(document.createElement(name), options);
|
||||
|
||||
const bayer = (order, x, y) => {
|
||||
let z = 0;
|
||||
for (let i = order; i--; x >>= 1, y >>= 1)
|
||||
z = ((((x & 1) ^ (y & 1)) | (z << 1)) << 1) | (y & 1);
|
||||
return z;
|
||||
};
|
||||
|
||||
const lut = (order) => {
|
||||
const size = 1 << order,
|
||||
area = size * size;
|
||||
const lut = new Float32Array(area);
|
||||
for (let y = 0; y < size; y++)
|
||||
for (let x = 0; x < size; x++)
|
||||
lut[x + y * size] = (bayer(order, x, y) + 0.5) / area;
|
||||
return (x, y) => lut[(x % size) + (y % size) * size];
|
||||
};
|
||||
|
||||
const simplex = new SimplexNoise();
|
||||
const bayer4 = lut(4);
|
||||
|
||||
const fbm = (freq, amp, x, y, z) =>
|
||||
simplex.noise3D(x * (freq *= 2), y * freq, z * freq) * (amp /= 2) +
|
||||
simplex.noise3D(x * (freq *= 2), y * freq, z * freq) * (amp /= 2) +
|
||||
simplex.noise3D(x * (freq *= 2), y * freq, z * freq) * (amp /= 2) +
|
||||
simplex.noise3D(x * (freq *= 2), y * freq, z * freq) * (amp /= 2) +
|
||||
simplex.noise3D(x * (freq *= 2), y * freq, z * freq) * (amp /= 2) +
|
||||
simplex.noise3D(x * (freq *= 2), y * freq, z * freq) * (amp /= 2) +
|
||||
simplex.noise3D(x * (freq *= 2), y * freq, z * freq) * (amp /= 2) +
|
||||
simplex.noise3D(x * (freq *= 2), y * freq, z * freq) * (amp /= 2);
|
||||
|
||||
const texture = (u, v, w) => (2 * (0.5 + 0.5 * fbm(0.5, 1, u, v, w))) % 1;
|
||||
|
||||
const globe = (x, y, u, v, w) => {
|
||||
const d = u * u + v * v;
|
||||
if (d > 1) return false;
|
||||
|
||||
const f = 1 / ((1 - d ** 0.5) ** 0.5 + 1);
|
||||
const t = texture(1e-1 * w + f * u, f * v, 1e-2 * w);
|
||||
return t > bayer4(x, y);
|
||||
};
|
||||
|
||||
const main = async () => {
|
||||
const fillerSize = 100;
|
||||
const filler =
|
||||
"\u28ff".repeat(fillerSize) + "\n\u28ff".repeat(fillerSize - 1);
|
||||
|
||||
const root = element("div", { className: "braille" });
|
||||
const hidden = element("div", { className: "hidden", textContent: filler });
|
||||
const visible = element("div", { className: "visible" });
|
||||
|
||||
root.appendChild(hidden);
|
||||
root.appendChild(visible);
|
||||
document.body.appendChild(root);
|
||||
|
||||
for (; ; await frame()) {
|
||||
const hr = hidden.getBoundingClientRect();
|
||||
const fontWidth = hr.width / fillerSize;
|
||||
const fontHeight = hr.height / fillerSize;
|
||||
|
||||
const rr = root.getBoundingClientRect();
|
||||
const ratio = rr.width / rr.height;
|
||||
const width = (rr.width / fontWidth) << 2;
|
||||
const height = (rr.height / fontHeight) << 3;
|
||||
|
||||
const pixels = create(width, height);
|
||||
const time = 1e-3 * Date.now();
|
||||
|
||||
for (let y = 0; y < height; y++) {
|
||||
const v = (2 * y) / height - 1;
|
||||
for (let x = 0; x < width; x++) {
|
||||
const u = ratio * ((2 * x) / width - 3.3);
|
||||
const shiftedU = u + 1.2;
|
||||
if (globe(x, y, shiftedU, v, time)) set(pixels, x, y);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
visible.textContent = render(pixels);
|
||||
}
|
||||
};
|
||||
|
||||
main();
|
||||
})();
|
|
@ -1,461 +0,0 @@
|
|||
(function () {
|
||||
"use strict";
|
||||
|
||||
var F2 = 0.5 * (Math.sqrt(3.0) - 1.0);
|
||||
var G2 = (3.0 - Math.sqrt(3.0)) / 6.0;
|
||||
var F3 = 1.0 / 3.0;
|
||||
var G3 = 1.0 / 6.0;
|
||||
var F4 = (Math.sqrt(5.0) - 1.0) / 4.0;
|
||||
var G4 = (5.0 - Math.sqrt(5.0)) / 20.0;
|
||||
|
||||
function SimplexNoise(randomOrSeed) {
|
||||
var random;
|
||||
if (typeof randomOrSeed == "function") {
|
||||
random = randomOrSeed;
|
||||
} else if (randomOrSeed) {
|
||||
random = alea(randomOrSeed);
|
||||
} else {
|
||||
random = Math.random;
|
||||
}
|
||||
this.p = buildPermutationTable(random);
|
||||
this.perm = new Uint8Array(512);
|
||||
this.permMod12 = new Uint8Array(512);
|
||||
for (var i = 0; i < 512; i++) {
|
||||
this.perm[i] = this.p[i & 255];
|
||||
this.permMod12[i] = this.perm[i] % 12;
|
||||
}
|
||||
}
|
||||
SimplexNoise.prototype = {
|
||||
grad3: new Float32Array([
|
||||
1, 1, 0, -1, 1, 0, 1, -1, 0,
|
||||
|
||||
-1, -1, 0, 1, 0, 1, -1, 0, 1,
|
||||
|
||||
1, 0, -1, -1, 0, -1, 0, 1, 1,
|
||||
|
||||
0, -1, 1, 0, 1, -1, 0, -1, -1,
|
||||
]),
|
||||
grad4: new Float32Array([
|
||||
0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0, -1, 1, 1, 0, -1, 1,
|
||||
-1, 0, -1, -1, 1, 0, -1, -1, -1, 1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1,
|
||||
0, -1, -1, -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1, 1, 1,
|
||||
0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1, -1, 1, 0, 1, -1, 1, 0, -1,
|
||||
-1, -1, 0, 1, -1, -1, 0, -1, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1,
|
||||
-1, 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0,
|
||||
]),
|
||||
noise2D: function (xin, yin) {
|
||||
var permMod12 = this.permMod12;
|
||||
var perm = this.perm;
|
||||
var grad3 = this.grad3;
|
||||
var n0 = 0;
|
||||
var n1 = 0;
|
||||
var n2 = 0;
|
||||
|
||||
var s = (xin + yin) * F2;
|
||||
var i = Math.floor(xin + s);
|
||||
var j = Math.floor(yin + s);
|
||||
var t = (i + j) * G2;
|
||||
var X0 = i - t;
|
||||
var Y0 = j - t;
|
||||
var x0 = xin - X0;
|
||||
var y0 = yin - Y0;
|
||||
|
||||
var i1, j1;
|
||||
if (x0 > y0) {
|
||||
i1 = 1;
|
||||
j1 = 0;
|
||||
} else {
|
||||
i1 = 0;
|
||||
j1 = 1;
|
||||
}
|
||||
|
||||
var x1 = x0 - i1 + G2;
|
||||
var y1 = y0 - j1 + G2;
|
||||
var x2 = x0 - 1.0 + 2.0 * G2;
|
||||
var y2 = y0 - 1.0 + 2.0 * G2;
|
||||
|
||||
var ii = i & 255;
|
||||
var jj = j & 255;
|
||||
|
||||
var t0 = 0.5 - x0 * x0 - y0 * y0;
|
||||
if (t0 >= 0) {
|
||||
var gi0 = permMod12[ii + perm[jj]] * 3;
|
||||
t0 *= t0;
|
||||
n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0);
|
||||
}
|
||||
var t1 = 0.5 - x1 * x1 - y1 * y1;
|
||||
if (t1 >= 0) {
|
||||
var gi1 = permMod12[ii + i1 + perm[jj + j1]] * 3;
|
||||
t1 *= t1;
|
||||
n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1);
|
||||
}
|
||||
var t2 = 0.5 - x2 * x2 - y2 * y2;
|
||||
if (t2 >= 0) {
|
||||
var gi2 = permMod12[ii + 1 + perm[jj + 1]] * 3;
|
||||
t2 *= t2;
|
||||
n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2);
|
||||
}
|
||||
|
||||
return 70.0 * (n0 + n1 + n2);
|
||||
},
|
||||
|
||||
noise3D: function (xin, yin, zin) {
|
||||
var permMod12 = this.permMod12;
|
||||
var perm = this.perm;
|
||||
var grad3 = this.grad3;
|
||||
var n0, n1, n2, n3;
|
||||
|
||||
var s = (xin + yin + zin) * F3;
|
||||
var i = Math.floor(xin + s);
|
||||
var j = Math.floor(yin + s);
|
||||
var k = Math.floor(zin + s);
|
||||
var t = (i + j + k) * G3;
|
||||
var X0 = i - t;
|
||||
var Y0 = j - t;
|
||||
var Z0 = k - t;
|
||||
var x0 = xin - X0;
|
||||
var y0 = yin - Y0;
|
||||
var z0 = zin - Z0;
|
||||
|
||||
var i1, j1, k1;
|
||||
var i2, j2, k2;
|
||||
if (x0 >= y0) {
|
||||
if (y0 >= z0) {
|
||||
i1 = 1;
|
||||
j1 = 0;
|
||||
k1 = 0;
|
||||
i2 = 1;
|
||||
j2 = 1;
|
||||
k2 = 0;
|
||||
} else if (x0 >= z0) {
|
||||
i1 = 1;
|
||||
j1 = 0;
|
||||
k1 = 0;
|
||||
i2 = 1;
|
||||
j2 = 0;
|
||||
k2 = 1;
|
||||
} else {
|
||||
i1 = 0;
|
||||
j1 = 0;
|
||||
k1 = 1;
|
||||
i2 = 1;
|
||||
j2 = 0;
|
||||
k2 = 1;
|
||||
}
|
||||
} else {
|
||||
if (y0 < z0) {
|
||||
i1 = 0;
|
||||
j1 = 0;
|
||||
k1 = 1;
|
||||
i2 = 0;
|
||||
j2 = 1;
|
||||
k2 = 1;
|
||||
} else if (x0 < z0) {
|
||||
i1 = 0;
|
||||
j1 = 1;
|
||||
k1 = 0;
|
||||
i2 = 0;
|
||||
j2 = 1;
|
||||
k2 = 1;
|
||||
} else {
|
||||
i1 = 0;
|
||||
j1 = 1;
|
||||
k1 = 0;
|
||||
i2 = 1;
|
||||
j2 = 1;
|
||||
k2 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
var x1 = x0 - i1 + G3;
|
||||
var y1 = y0 - j1 + G3;
|
||||
var z1 = z0 - k1 + G3;
|
||||
var x2 = x0 - i2 + 2.0 * G3;
|
||||
var y2 = y0 - j2 + 2.0 * G3;
|
||||
var z2 = z0 - k2 + 2.0 * G3;
|
||||
var x3 = x0 - 1.0 + 3.0 * G3;
|
||||
var y3 = y0 - 1.0 + 3.0 * G3;
|
||||
var z3 = z0 - 1.0 + 3.0 * G3;
|
||||
|
||||
var ii = i & 255;
|
||||
var jj = j & 255;
|
||||
var kk = k & 255;
|
||||
|
||||
var t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;
|
||||
if (t0 < 0) n0 = 0.0;
|
||||
else {
|
||||
var gi0 = permMod12[ii + perm[jj + perm[kk]]] * 3;
|
||||
t0 *= t0;
|
||||
n0 =
|
||||
t0 *
|
||||
t0 *
|
||||
(grad3[gi0] * x0 + grad3[gi0 + 1] * y0 + grad3[gi0 + 2] * z0);
|
||||
}
|
||||
var t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;
|
||||
if (t1 < 0) n1 = 0.0;
|
||||
else {
|
||||
var gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3;
|
||||
t1 *= t1;
|
||||
n1 =
|
||||
t1 *
|
||||
t1 *
|
||||
(grad3[gi1] * x1 + grad3[gi1 + 1] * y1 + grad3[gi1 + 2] * z1);
|
||||
}
|
||||
var t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;
|
||||
if (t2 < 0) n2 = 0.0;
|
||||
else {
|
||||
var gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3;
|
||||
t2 *= t2;
|
||||
n2 =
|
||||
t2 *
|
||||
t2 *
|
||||
(grad3[gi2] * x2 + grad3[gi2 + 1] * y2 + grad3[gi2 + 2] * z2);
|
||||
}
|
||||
var t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;
|
||||
if (t3 < 0) n3 = 0.0;
|
||||
else {
|
||||
var gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3;
|
||||
t3 *= t3;
|
||||
n3 =
|
||||
t3 *
|
||||
t3 *
|
||||
(grad3[gi3] * x3 + grad3[gi3 + 1] * y3 + grad3[gi3 + 2] * z3);
|
||||
}
|
||||
|
||||
return 32.0 * (n0 + n1 + n2 + n3);
|
||||
},
|
||||
|
||||
noise4D: function (x, y, z, w) {
|
||||
var perm = this.perm;
|
||||
var grad4 = this.grad4;
|
||||
|
||||
var n0, n1, n2, n3, n4;
|
||||
|
||||
var s = (x + y + z + w) * F4;
|
||||
var i = Math.floor(x + s);
|
||||
var j = Math.floor(y + s);
|
||||
var k = Math.floor(z + s);
|
||||
var l = Math.floor(w + s);
|
||||
var t = (i + j + k + l) * G4;
|
||||
var X0 = i - t;
|
||||
var Y0 = j - t;
|
||||
var Z0 = k - t;
|
||||
var W0 = l - t;
|
||||
var x0 = x - X0;
|
||||
var y0 = y - Y0;
|
||||
var z0 = z - Z0;
|
||||
var w0 = w - W0;
|
||||
|
||||
var rankx = 0;
|
||||
var ranky = 0;
|
||||
var rankz = 0;
|
||||
var rankw = 0;
|
||||
if (x0 > y0) rankx++;
|
||||
else ranky++;
|
||||
if (x0 > z0) rankx++;
|
||||
else rankz++;
|
||||
if (x0 > w0) rankx++;
|
||||
else rankw++;
|
||||
if (y0 > z0) ranky++;
|
||||
else rankz++;
|
||||
if (y0 > w0) ranky++;
|
||||
else rankw++;
|
||||
if (z0 > w0) rankz++;
|
||||
else rankw++;
|
||||
var i1, j1, k1, l1;
|
||||
var i2, j2, k2, l2;
|
||||
var i3, j3, k3, l3;
|
||||
|
||||
i1 = rankx >= 3 ? 1 : 0;
|
||||
j1 = ranky >= 3 ? 1 : 0;
|
||||
k1 = rankz >= 3 ? 1 : 0;
|
||||
l1 = rankw >= 3 ? 1 : 0;
|
||||
|
||||
i2 = rankx >= 2 ? 1 : 0;
|
||||
j2 = ranky >= 2 ? 1 : 0;
|
||||
k2 = rankz >= 2 ? 1 : 0;
|
||||
l2 = rankw >= 2 ? 1 : 0;
|
||||
|
||||
i3 = rankx >= 1 ? 1 : 0;
|
||||
j3 = ranky >= 1 ? 1 : 0;
|
||||
k3 = rankz >= 1 ? 1 : 0;
|
||||
l3 = rankw >= 1 ? 1 : 0;
|
||||
|
||||
var x1 = x0 - i1 + G4;
|
||||
var y1 = y0 - j1 + G4;
|
||||
var z1 = z0 - k1 + G4;
|
||||
var w1 = w0 - l1 + G4;
|
||||
var x2 = x0 - i2 + 2.0 * G4;
|
||||
var y2 = y0 - j2 + 2.0 * G4;
|
||||
var z2 = z0 - k2 + 2.0 * G4;
|
||||
var w2 = w0 - l2 + 2.0 * G4;
|
||||
var x3 = x0 - i3 + 3.0 * G4;
|
||||
var y3 = y0 - j3 + 3.0 * G4;
|
||||
var z3 = z0 - k3 + 3.0 * G4;
|
||||
var w3 = w0 - l3 + 3.0 * G4;
|
||||
var x4 = x0 - 1.0 + 4.0 * G4;
|
||||
var y4 = y0 - 1.0 + 4.0 * G4;
|
||||
var z4 = z0 - 1.0 + 4.0 * G4;
|
||||
var w4 = w0 - 1.0 + 4.0 * G4;
|
||||
|
||||
var ii = i & 255;
|
||||
var jj = j & 255;
|
||||
var kk = k & 255;
|
||||
var ll = l & 255;
|
||||
|
||||
var t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
|
||||
if (t0 < 0) n0 = 0.0;
|
||||
else {
|
||||
var gi0 = (perm[ii + perm[jj + perm[kk + perm[ll]]]] % 32) * 4;
|
||||
t0 *= t0;
|
||||
n0 =
|
||||
t0 *
|
||||
t0 *
|
||||
(grad4[gi0] * x0 +
|
||||
grad4[gi0 + 1] * y0 +
|
||||
grad4[gi0 + 2] * z0 +
|
||||
grad4[gi0 + 3] * w0);
|
||||
}
|
||||
var t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
|
||||
if (t1 < 0) n1 = 0.0;
|
||||
else {
|
||||
var gi1 =
|
||||
(perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]] % 32) *
|
||||
4;
|
||||
t1 *= t1;
|
||||
n1 =
|
||||
t1 *
|
||||
t1 *
|
||||
(grad4[gi1] * x1 +
|
||||
grad4[gi1 + 1] * y1 +
|
||||
grad4[gi1 + 2] * z1 +
|
||||
grad4[gi1 + 3] * w1);
|
||||
}
|
||||
var t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
|
||||
if (t2 < 0) n2 = 0.0;
|
||||
else {
|
||||
var gi2 =
|
||||
(perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]] % 32) *
|
||||
4;
|
||||
t2 *= t2;
|
||||
n2 =
|
||||
t2 *
|
||||
t2 *
|
||||
(grad4[gi2] * x2 +
|
||||
grad4[gi2 + 1] * y2 +
|
||||
grad4[gi2 + 2] * z2 +
|
||||
grad4[gi2 + 3] * w2);
|
||||
}
|
||||
var t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
|
||||
if (t3 < 0) n3 = 0.0;
|
||||
else {
|
||||
var gi3 =
|
||||
(perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]] % 32) *
|
||||
4;
|
||||
t3 *= t3;
|
||||
n3 =
|
||||
t3 *
|
||||
t3 *
|
||||
(grad4[gi3] * x3 +
|
||||
grad4[gi3 + 1] * y3 +
|
||||
grad4[gi3 + 2] * z3 +
|
||||
grad4[gi3 + 3] * w3);
|
||||
}
|
||||
var t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
|
||||
if (t4 < 0) n4 = 0.0;
|
||||
else {
|
||||
var gi4 =
|
||||
(perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32) * 4;
|
||||
t4 *= t4;
|
||||
n4 =
|
||||
t4 *
|
||||
t4 *
|
||||
(grad4[gi4] * x4 +
|
||||
grad4[gi4 + 1] * y4 +
|
||||
grad4[gi4 + 2] * z4 +
|
||||
grad4[gi4 + 3] * w4);
|
||||
}
|
||||
|
||||
return 27.0 * (n0 + n1 + n2 + n3 + n4);
|
||||
},
|
||||
};
|
||||
|
||||
function buildPermutationTable(random) {
|
||||
var i;
|
||||
var p = new Uint8Array(256);
|
||||
for (i = 0; i < 256; i++) {
|
||||
p[i] = i;
|
||||
}
|
||||
for (i = 0; i < 255; i++) {
|
||||
var r = i + ~~(random() * (256 - i));
|
||||
var aux = p[i];
|
||||
p[i] = p[r];
|
||||
p[r] = aux;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
SimplexNoise._buildPermutationTable = buildPermutationTable;
|
||||
|
||||
function alea() {
|
||||
var s0 = 0;
|
||||
var s1 = 0;
|
||||
var s2 = 0;
|
||||
var c = 1;
|
||||
|
||||
var mash = masher();
|
||||
s0 = mash(" ");
|
||||
s1 = mash(" ");
|
||||
s2 = mash(" ");
|
||||
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
s0 -= mash(arguments[i]);
|
||||
if (s0 < 0) {
|
||||
s0 += 1;
|
||||
}
|
||||
s1 -= mash(arguments[i]);
|
||||
if (s1 < 0) {
|
||||
s1 += 1;
|
||||
}
|
||||
s2 -= mash(arguments[i]);
|
||||
if (s2 < 0) {
|
||||
s2 += 1;
|
||||
}
|
||||
}
|
||||
mash = null;
|
||||
return function () {
|
||||
var t = 2091639 * s0 + c * 2.3283064365386963e-10;
|
||||
s0 = s1;
|
||||
s1 = s2;
|
||||
return (s2 = t - (c = t | 0));
|
||||
};
|
||||
}
|
||||
function masher() {
|
||||
var n = 0xefc8249d;
|
||||
return function (data) {
|
||||
data = data.toString();
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
n += data.charCodeAt(i);
|
||||
var h = 0.02519603282416938 * n;
|
||||
n = h >>> 0;
|
||||
h -= n;
|
||||
h *= n;
|
||||
n = h >>> 0;
|
||||
h -= n;
|
||||
n += h * 0x100000000;
|
||||
}
|
||||
return (n >>> 0) * 2.3283064365386963e-10;
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof define !== "undefined" && define.amd)
|
||||
define(function () {
|
||||
return SimplexNoise;
|
||||
});
|
||||
|
||||
if (typeof exports !== "undefined") exports.SimplexNoise = SimplexNoise;
|
||||
else if (typeof window !== "undefined") window.SimplexNoise = SimplexNoise;
|
||||
|
||||
if (typeof module !== "undefined") {
|
||||
module.exports = SimplexNoise;
|
||||
}
|
||||
})();
|
288
public/style.css
288
public/style.css
|
@ -1,288 +0,0 @@
|
|||
:root {
|
||||
--size: calc(100vmin / 1.618033988749895);
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background: #241917;
|
||||
color: #f3bbae;
|
||||
font-family: Monaco, monospace !important;
|
||||
}
|
||||
|
||||
body,
|
||||
.braille {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-flow: row;
|
||||
}
|
||||
|
||||
.braille {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
width: var(--size);
|
||||
height: var(--size);
|
||||
font: 12px/12px "Iosevka Web", monospace;
|
||||
}
|
||||
|
||||
.braille > * {
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
.braille .hidden {
|
||||
position: fixed;
|
||||
bottom: 100%;
|
||||
right: 100%;
|
||||
}
|
||||
|
||||
.globe-txt {
|
||||
display: flex;
|
||||
position: fixed;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 625px) {
|
||||
.globe-txt {
|
||||
position: fixed;
|
||||
right: 50%;
|
||||
top: 50%;
|
||||
transform: translate(50%, -50%);
|
||||
}
|
||||
}
|
||||
|
||||
.center-text {
|
||||
position: fixed;
|
||||
gap: 25px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
border: 4px solid #f3bbae92;
|
||||
text-align: left;
|
||||
z-index: 10;
|
||||
background-color: #241917;
|
||||
max-width: 35rem;
|
||||
top: 30%;
|
||||
left: 15%;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 625px) {
|
||||
.center-text {
|
||||
left: 15px;
|
||||
right: 15px;
|
||||
margin-left: 0;
|
||||
margin-top: 0;
|
||||
max-width: 100vw;
|
||||
}
|
||||
}
|
||||
|
||||
.tabs {
|
||||
display: flex;
|
||||
overflow-x: auto;
|
||||
white-space: nowrap;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar {
|
||||
height: 3px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: #241917;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: #f3bbae;
|
||||
}
|
||||
|
||||
.tab,
|
||||
.tab-link {
|
||||
cursor: pointer;
|
||||
padding: 4px 15px;
|
||||
border-width: 0 4px 4px 0;
|
||||
border-style: solid;
|
||||
border-color: #f3bbae92;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.tab-link {
|
||||
color: #f3bbae;
|
||||
text-decoration: none;
|
||||
margin-right: 2.5rem;
|
||||
min-width: 4.5rem;
|
||||
}
|
||||
|
||||
.tab-link svg {
|
||||
fill: #f3bbae;
|
||||
width: 12px;
|
||||
}
|
||||
|
||||
.tab-content {
|
||||
word-wrap: break-word;
|
||||
display: none;
|
||||
padding: 20px 20px;
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
.pgp-address {
|
||||
word-wrap: break-word;
|
||||
display: block;
|
||||
font-size: 12px !important;
|
||||
background-color: #241917;
|
||||
color: #fff;
|
||||
border: 4px solid #f3bbae92;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
#linksTab,
|
||||
#contactTab,
|
||||
#dashTab {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#tab-links:checked ~ #linksTab,
|
||||
#tab-contact:checked ~ #contactTab,
|
||||
#tab-about:checked ~ #aboutTab,
|
||||
#tab-dash:checked ~ #dashTab {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.bullet-text {
|
||||
font-size: 14px;
|
||||
text-align: left;
|
||||
z-index: 2;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.tab-content p {
|
||||
color: #f3bbae;
|
||||
font-size: 14px;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
.tab-content a {
|
||||
color: #f3bbae;
|
||||
transition: color 0.1s ease;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.tab-content a[href]:hover {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.visible {
|
||||
z-index: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
ul li::before {
|
||||
content: "-";
|
||||
display: inline-block;
|
||||
width: 1em;
|
||||
}
|
||||
|
||||
.alt-bullet {
|
||||
padding-left: 1rem !important;
|
||||
}
|
||||
|
||||
.modal[open] .modal__toggle {
|
||||
left: calc(50vw + 200px);
|
||||
top: calc(15vh - 5px);
|
||||
position: fixed;
|
||||
z-index: 11;
|
||||
}
|
||||
.modal[open] .modal__toggle:focus {
|
||||
outline: 2px solid #00f;
|
||||
}
|
||||
.modal__toggle::before {
|
||||
content: "Donate";
|
||||
cursor: pointer;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
background-color: #241917;
|
||||
color: #fff;
|
||||
border: 4px solid #f3bbae92;
|
||||
}
|
||||
.modal[open] .modal__toggle::before {
|
||||
content: "✖";
|
||||
color: #fff !important;
|
||||
font-size: 25px;
|
||||
}
|
||||
.modal__toggle {
|
||||
position: relative;
|
||||
list-style: none;
|
||||
font-size: 14px;
|
||||
font-family: Monaco, monospace;
|
||||
text-align: left;
|
||||
z-index: 4;
|
||||
}
|
||||
.modal__toggle::-webkit-details-marker {
|
||||
display: none;
|
||||
}
|
||||
.modal__toggle:hover {
|
||||
cursor: pointer;
|
||||
opacity: 0.8;
|
||||
}
|
||||
.modal__background {
|
||||
background-color: rgba(0, 0, 0, 0.65);
|
||||
display: flex;
|
||||
height: 100vh;
|
||||
justify-content: center;
|
||||
left: 0;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
width: 100vw;
|
||||
z-index: 3;
|
||||
}
|
||||
.modal__body {
|
||||
border: 4px solid #f3bbae92;
|
||||
background: rgba(36, 25, 23, 1);
|
||||
color: #f3bbae;
|
||||
font-size: 1.6rem;
|
||||
font-weight: 600;
|
||||
padding: 20px 20px;
|
||||
position: fixed;
|
||||
text-align: left;
|
||||
top: 15vh;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
width: 80%;
|
||||
max-width: 400px;
|
||||
z-index: 10;
|
||||
word-wrap: break-word;
|
||||
font-family: Monaco, monospace;
|
||||
}
|
||||
|
||||
.modal__text {
|
||||
line-height: 1.6;
|
||||
margin: 0;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.crypto-address {
|
||||
word-wrap: break-word;
|
||||
display: block;
|
||||
font-size: 12px !important;
|
||||
background-color: #241917;
|
||||
color: #fff;
|
||||
border: 4px solid #f3bbae92;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.links {
|
||||
padding-left: 0.85rem;
|
||||
}
|
||||
|
||||
.dashboard {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
1
static
Submodule
1
static
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit ba702a7e28a69a6dc72ed5e7aeae54a85c1bb2f9
|
4
tailwind.config.js
Normal file
4
tailwind.config.js
Normal file
|
@ -0,0 +1,4 @@
|
|||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: ["./themes/icbm/**/*.html"],
|
||||
};
|
21
themes/icbm/LICENSE
Normal file
21
themes/icbm/LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) [year] [fullname]
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
7
themes/icbm/README.md
Normal file
7
themes/icbm/README.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Theme Name
|
||||
|
||||
## Features
|
||||
|
||||
## Installation
|
||||
|
||||
## Configuration
|
5
themes/icbm/archetypes/default.md
Normal file
5
themes/icbm/archetypes/default.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
+++
|
||||
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
|
||||
date = {{ .Date }}
|
||||
draft = true
|
||||
+++
|
22
themes/icbm/assets/css/main.css
Normal file
22
themes/icbm/assets/css/main.css
Normal file
|
@ -0,0 +1,22 @@
|
|||
body {
|
||||
color: #222;
|
||||
font-family: sans-serif;
|
||||
line-height: 1.5;
|
||||
margin: 1rem;
|
||||
max-width: 768px;
|
||||
}
|
||||
|
||||
header {
|
||||
border-bottom: 1px solid #222;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
footer {
|
||||
border-top: 1px solid #222;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #00e;
|
||||
text-decoration: none;
|
||||
}
|
1
themes/icbm/assets/js/main.js
Normal file
1
themes/icbm/assets/js/main.js
Normal file
|
@ -0,0 +1 @@
|
|||
console.log('This site was generated by Hugo.');
|
9
themes/icbm/content/_index.md
Normal file
9
themes/icbm/content/_index.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
+++
|
||||
title = 'Home'
|
||||
date = 2023-01-01T08:00:00-07:00
|
||||
draft = false
|
||||
+++
|
||||
|
||||
Laborum voluptate pariatur ex culpa magna nostrud est incididunt fugiat
|
||||
pariatur do dolor ipsum enim. Consequat tempor do dolor eu. Non id id anim anim
|
||||
excepteur excepteur pariatur nostrud qui irure ullamco.
|
7
themes/icbm/content/posts/_index.md
Normal file
7
themes/icbm/content/posts/_index.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
+++
|
||||
title = 'Posts'
|
||||
date = 2023-01-01T08:30:00-07:00
|
||||
draft = false
|
||||
+++
|
||||
|
||||
Tempor est exercitation ad qui pariatur quis adipisicing aliquip nisi ea consequat ipsum occaecat. Nostrud consequat ullamco laboris fugiat esse esse adipisicing velit laborum ipsum incididunt ut enim. Dolor pariatur nulla quis fugiat dolore excepteur. Aliquip ad quis aliqua enim do consequat.
|
10
themes/icbm/content/posts/post-1.md
Normal file
10
themes/icbm/content/posts/post-1.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
+++
|
||||
title = 'Post 1'
|
||||
date = 2023-01-15T09:00:00-07:00
|
||||
draft = false
|
||||
tags = ['red']
|
||||
+++
|
||||
|
||||
Tempor proident minim aliquip reprehenderit dolor et ad anim Lorem duis sint eiusmod. Labore ut ea duis dolor. Incididunt consectetur proident qui occaecat incididunt do nisi Lorem. Tempor do laborum elit laboris excepteur eiusmod do. Eiusmod nisi excepteur ut amet pariatur adipisicing Lorem.
|
||||
|
||||
Occaecat nulla excepteur dolore excepteur duis eiusmod ullamco officia anim in voluptate ea occaecat officia. Cillum sint esse velit ea officia minim fugiat. Elit ea esse id aliquip pariatur cupidatat id duis minim incididunt ea ea. Anim ut duis sunt nisi. Culpa cillum sit voluptate voluptate eiusmod dolor. Enim nisi Lorem ipsum irure est excepteur voluptate eu in enim nisi. Nostrud ipsum Lorem anim sint labore consequat do.
|
10
themes/icbm/content/posts/post-2.md
Normal file
10
themes/icbm/content/posts/post-2.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
+++
|
||||
title = 'Post 2'
|
||||
date = 2023-02-15T10:00:00-07:00
|
||||
draft = false
|
||||
tags = ['red','green']
|
||||
+++
|
||||
|
||||
Anim eiusmod irure incididunt sint cupidatat. Incididunt irure irure irure nisi ipsum do ut quis fugiat consectetur proident cupidatat incididunt cillum. Dolore voluptate occaecat qui mollit laborum ullamco et. Ipsum laboris officia anim laboris culpa eiusmod ex magna ex cupidatat anim ipsum aute. Mollit aliquip occaecat qui sunt velit ut cupidatat reprehenderit enim sunt laborum. Velit veniam in officia nulla adipisicing ut duis officia.
|
||||
|
||||
Exercitation voluptate irure in irure tempor mollit Lorem nostrud ad officia. Velit id fugiat occaecat do tempor. Sit officia Lorem aliquip eu deserunt consectetur. Aute proident deserunt in nulla aliquip dolore ipsum Lorem ut cupidatat consectetur sit sint laborum. Esse cupidatat sit sint sunt tempor exercitation deserunt. Labore dolor duis laborum est do nisi ut veniam dolor et nostrud nostrud.
|
BIN
themes/icbm/content/posts/post-3/bryce-canyon.jpg
Normal file
BIN
themes/icbm/content/posts/post-3/bryce-canyon.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
12
themes/icbm/content/posts/post-3/index.md
Normal file
12
themes/icbm/content/posts/post-3/index.md
Normal file
|
@ -0,0 +1,12 @@
|
|||
+++
|
||||
title = 'Post 3'
|
||||
date = 2023-03-15T11:00:00-07:00
|
||||
draft = false
|
||||
tags = ['red','green','blue']
|
||||
+++
|
||||
|
||||
Occaecat aliqua consequat laborum ut ex aute aliqua culpa quis irure esse magna dolore quis. Proident fugiat labore eu laboris officia Lorem enim. Ipsum occaecat cillum ut tempor id sint aliqua incididunt nisi incididunt reprehenderit. Voluptate ad minim sint est aute aliquip esse occaecat tempor officia qui sunt. Aute ex ipsum id ut in est velit est laborum incididunt. Aliqua qui id do esse sunt eiusmod id deserunt eu nostrud aute sit ipsum. Deserunt esse cillum Lorem non magna adipisicing mollit amet consequat.
|
||||
|
||||

|
||||
|
||||
Sit excepteur do velit veniam mollit in nostrud laboris incididunt ea. Amet eu cillum ut reprehenderit culpa aliquip labore laborum amet sit sit duis. Laborum id proident nostrud dolore laborum reprehenderit quis mollit nulla amet veniam officia id id. Aliquip in deserunt qui magna duis qui pariatur officia sunt deserunt.
|
23
themes/icbm/hugo.toml
Normal file
23
themes/icbm/hugo.toml
Normal file
|
@ -0,0 +1,23 @@
|
|||
baseURL = 'https://example.org/'
|
||||
languageCode = 'en-US'
|
||||
title = 'My New Hugo Site'
|
||||
|
||||
[[menus.main]]
|
||||
name = 'Home'
|
||||
pageRef = '/'
|
||||
weight = 10
|
||||
|
||||
[[menus.main]]
|
||||
name = 'Posts'
|
||||
pageRef = '/posts'
|
||||
weight = 20
|
||||
|
||||
[[menus.main]]
|
||||
name = 'Tags'
|
||||
pageRef = '/tags'
|
||||
weight = 30
|
||||
|
||||
[module]
|
||||
[module.hugoVersion]
|
||||
extended = false
|
||||
min = "0.116.0"
|
17
themes/icbm/layouts/_default/baseof.html
Normal file
17
themes/icbm/layouts/_default/baseof.html
Normal file
|
@ -0,0 +1,17 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="{{ or site.Language.LanguageCode }}" dir="{{ or site.Language.LanguageDirection `ltr` }}">
|
||||
<head>
|
||||
{{ partial "head.html" . }}
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
{{ partial "header.html" . }}
|
||||
</header>
|
||||
<main>
|
||||
{{ block "main" . }}{{ end }}
|
||||
</main>
|
||||
<footer>
|
||||
{{ partial "footer.html" . }}
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
7
themes/icbm/layouts/_default/home.html
Normal file
7
themes/icbm/layouts/_default/home.html
Normal file
|
@ -0,0 +1,7 @@
|
|||
{{ define "main" }}
|
||||
{{ .Content }}
|
||||
{{ range site.RegularPages }}
|
||||
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
|
||||
{{ .Summary }}
|
||||
{{ end }}
|
||||
{{ end }}
|
8
themes/icbm/layouts/_default/list.html
Normal file
8
themes/icbm/layouts/_default/list.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
{{ define "main" }}
|
||||
<h1>{{ .Title }}</h1>
|
||||
{{ .Content }}
|
||||
{{ range .Pages }}
|
||||
<h2><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></h2>
|
||||
{{ .Summary }}
|
||||
{{ end }}
|
||||
{{ end }}
|
10
themes/icbm/layouts/_default/single.html
Normal file
10
themes/icbm/layouts/_default/single.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
{{ define "main" }}
|
||||
<h1>{{ .Title }}</h1>
|
||||
|
||||
{{ $dateMachine := .Date | time.Format "2006-01-02T15:04:05-07:00" }}
|
||||
{{ $dateHuman := .Date | time.Format ":date_long" }}
|
||||
<time datetime="{{ $dateMachine }}">{{ $dateHuman }}</time>
|
||||
|
||||
{{ .Content }}
|
||||
{{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
|
||||
{{ end }}
|
1
themes/icbm/layouts/partials/footer.html
Normal file
1
themes/icbm/layouts/partials/footer.html
Normal file
|
@ -0,0 +1 @@
|
|||
<p>Copyright {{ now.Year }}. All rights reserved.</p>
|
5
themes/icbm/layouts/partials/head.html
Normal file
5
themes/icbm/layouts/partials/head.html
Normal file
|
@ -0,0 +1,5 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<title>{{ if .IsHome }}{{ site.Title }}{{ else }}{{ printf "%s | %s" .Title site.Title }}{{ end }}</title>
|
||||
{{ partialCached "head/css.html" . }}
|
||||
{{ partialCached "head/js.html" . }}
|
9
themes/icbm/layouts/partials/head/css.html
Normal file
9
themes/icbm/layouts/partials/head/css.html
Normal file
|
@ -0,0 +1,9 @@
|
|||
{{- with resources.Get "css/main.css" }}
|
||||
{{- if eq hugo.Environment "development" }}
|
||||
<link rel="stylesheet" href="{{ .RelPermalink }}">
|
||||
{{- else }}
|
||||
{{- with . | minify | fingerprint }}
|
||||
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
12
themes/icbm/layouts/partials/head/js.html
Normal file
12
themes/icbm/layouts/partials/head/js.html
Normal file
|
@ -0,0 +1,12 @@
|
|||
{{- with resources.Get "js/main.js" }}
|
||||
{{- if eq hugo.Environment "development" }}
|
||||
{{- with . | js.Build }}
|
||||
<script src="{{ .RelPermalink }}"></script>
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- $opts := dict "minify" true }}
|
||||
{{- with . | js.Build $opts | fingerprint }}
|
||||
<script src="{{ .RelPermalink }}" integrity="{{- .Data.Integrity }}" crossorigin="anonymous"></script>
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
2
themes/icbm/layouts/partials/header.html
Normal file
2
themes/icbm/layouts/partials/header.html
Normal file
|
@ -0,0 +1,2 @@
|
|||
<h1>{{ site.Title }}</h1>
|
||||
{{ partial "menu.html" (dict "menuID" "main" "page" .) }}
|
51
themes/icbm/layouts/partials/menu.html
Normal file
51
themes/icbm/layouts/partials/menu.html
Normal file
|
@ -0,0 +1,51 @@
|
|||
{{- /*
|
||||
Renders a menu for the given menu ID.
|
||||
|
||||
@context {page} page The current page.
|
||||
@context {string} menuID The menu ID.
|
||||
|
||||
@example: {{ partial "menu.html" (dict "menuID" "main" "page" .) }}
|
||||
*/}}
|
||||
|
||||
{{- $page := .page }}
|
||||
{{- $menuID := .menuID }}
|
||||
|
||||
{{- with index site.Menus $menuID }}
|
||||
<nav>
|
||||
<ul>
|
||||
{{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
|
||||
</ul>
|
||||
</nav>
|
||||
{{- end }}
|
||||
|
||||
{{- define "partials/inline/menu/walk.html" }}
|
||||
{{- $page := .page }}
|
||||
{{- range .menuEntries }}
|
||||
{{- $attrs := dict "href" .URL }}
|
||||
{{- if $page.IsMenuCurrent .Menu . }}
|
||||
{{- $attrs = merge $attrs (dict "class" "active" "aria-current" "page") }}
|
||||
{{- else if $page.HasMenuCurrent .Menu .}}
|
||||
{{- $attrs = merge $attrs (dict "class" "ancestor" "aria-current" "true") }}
|
||||
{{- end }}
|
||||
{{- $name := .Name }}
|
||||
{{- with .Identifier }}
|
||||
{{- with T . }}
|
||||
{{- $name = . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
<li>
|
||||
<a
|
||||
{{- range $k, $v := $attrs }}
|
||||
{{- with $v }}
|
||||
{{- printf " %s=%q" $k $v | safeHTMLAttr }}
|
||||
{{- end }}
|
||||
{{- end -}}
|
||||
>{{ $name }}</a>
|
||||
{{- with .Children }}
|
||||
<ul>
|
||||
{{- partial "inline/menu/walk.html" (dict "page" $page "menuEntries" .) }}
|
||||
</ul>
|
||||
{{- end }}
|
||||
</li>
|
||||
{{- end }}
|
||||
{{- end }}
|
23
themes/icbm/layouts/partials/terms.html
Normal file
23
themes/icbm/layouts/partials/terms.html
Normal file
|
@ -0,0 +1,23 @@
|
|||
{{- /*
|
||||
For a given taxonomy, renders a list of terms assigned to the page.
|
||||
|
||||
@context {page} page The current page.
|
||||
@context {string} taxonomy The taxonomy.
|
||||
|
||||
@example: {{ partial "terms.html" (dict "taxonomy" "tags" "page" .) }}
|
||||
*/}}
|
||||
|
||||
{{- $page := .page }}
|
||||
{{- $taxonomy := .taxonomy }}
|
||||
|
||||
{{- with $page.GetTerms $taxonomy }}
|
||||
{{- $label := (index . 0).Parent.LinkTitle }}
|
||||
<div>
|
||||
<div>{{ $label }}:</div>
|
||||
<ul>
|
||||
{{- range . }}
|
||||
<li><a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a></li>
|
||||
{{- end }}
|
||||
</ul>
|
||||
</div>
|
||||
{{- end }}
|
37
themes/icbm/src/input.css
Normal file
37
themes/icbm/src/input.css
Normal file
|
@ -0,0 +1,37 @@
|
|||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer utilities {
|
||||
.noselect {
|
||||
-webkit-touch-callout: none; /* iOS Safari */
|
||||
-webkit-user-select: none; /* Safari */
|
||||
-khtml-user-select: none; /* Konqueror HTML */
|
||||
-moz-user-select: none; /* Old versions of Firefox */
|
||||
-ms-user-select: none; /* Internet Explorer/Edge */
|
||||
user-select: none; /* Non-prefixed version, currently
|
||||
supported by Chrome, Edge, Opera and Firefox */
|
||||
}
|
||||
#s::-webkit-scrollbar {
|
||||
width: 10px;
|
||||
}
|
||||
#s::-webkit-scrollbar-track {
|
||||
background-color: white;
|
||||
}
|
||||
#s::-webkit-scrollbar-thumb {
|
||||
background-color: #606060;
|
||||
border-radius: 20px;
|
||||
}
|
||||
#s::-webkit-scrollbar-thumb:hover {
|
||||
background-color: #909090;
|
||||
}
|
||||
#sc::-webkit-scrollbar {
|
||||
width: 10px;
|
||||
}
|
||||
#sc::-webkit-scrollbar-track {
|
||||
background-color: white;
|
||||
}
|
||||
#sc::-webkit-scrollbar-thumb {
|
||||
background-color: #666b7a;
|
||||
}
|
||||
}
|
1
themes/icbm/static/css/tailwind.min.css
vendored
Normal file
1
themes/icbm/static/css/tailwind.min.css
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/*! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.block{display:block}#s::-webkit-scrollbar{width:10px}#s::-webkit-scrollbar-track{background-color:#fff}#s::-webkit-scrollbar-thumb{background-color:#606060;border-radius:20px}#s::-webkit-scrollbar-thumb:hover{background-color:#909090}#sc::-webkit-scrollbar{width:10px}#sc::-webkit-scrollbar-track{background-color:#fff}#sc::-webkit-scrollbar-thumb{background-color:#666b7a}
|
31
themes/icbm/theme.toml
Normal file
31
themes/icbm/theme.toml
Normal file
|
@ -0,0 +1,31 @@
|
|||
name = 'Theme name'
|
||||
license = 'MIT'
|
||||
licenselink = 'https://github.com/owner/repo/LICENSE'
|
||||
description = 'Theme description'
|
||||
|
||||
# The home page of the theme, where the source can be found
|
||||
homepage = 'https://github.com/owner/repo'
|
||||
|
||||
# If you have a running demo of the theme
|
||||
demosite = 'https://owner.github.io/repo'
|
||||
|
||||
# Taxonomy terms
|
||||
tags = ['blog', 'company']
|
||||
features = ['some', 'awesome', 'features']
|
||||
|
||||
# If the theme has multiple authors
|
||||
authors = [
|
||||
{name = 'Name of author', homepage = 'Website of author'},
|
||||
{name = 'Name of author', homepage = 'Website of author'}
|
||||
]
|
||||
|
||||
# If the theme has a single author
|
||||
[author]
|
||||
name = 'Your name'
|
||||
homepage = 'Your website'
|
||||
|
||||
# If porting an existing theme
|
||||
[original]
|
||||
author = 'Name of original author'
|
||||
homepage = 'Website of original author'
|
||||
repo = 'https://github.com/owner/repo'
|
Loading…
Add table
Reference in a new issue