Compare commits
8 commits
22e93f6f32
...
c4049313d4
| Author | SHA1 | Date | |
|---|---|---|---|
| c4049313d4 | |||
| 9412c03ad1 | |||
| 1a33523337 | |||
| 0ee3983aed | |||
| d5a868499f | |||
| ecec515114 | |||
| a27d153d21 | |||
| d753070526 |
19 changed files with 589 additions and 49 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -1,2 +1,2 @@
|
||||||
bake/
|
bake/
|
||||||
www/css/
|
.sass-cache/
|
||||||
|
|
|
||||||
85
flake.nix
85
flake.nix
|
|
@ -1,38 +1,77 @@
|
||||||
# Template: https://nixos-and-flakes.thiscute.world/development/intro
|
|
||||||
{
|
{
|
||||||
description = "Dev Shell for dobutterfliescry.net";
|
description = "cry64's dobutterfliescry.net";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
|
systems.url = "github:nix-systems/default";
|
||||||
|
|
||||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
|
||||||
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
|
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = {
|
outputs = {
|
||||||
|
self,
|
||||||
nixpkgs,
|
nixpkgs,
|
||||||
nixpkgs-unstable,
|
nixpkgs-unstable,
|
||||||
...
|
...
|
||||||
}: let
|
} @ inputs: let
|
||||||
system = "x86_64-linux";
|
systems = import inputs.systems;
|
||||||
pkgs = import nixpkgs {
|
|
||||||
inherit system;
|
mkPkgs = pkgs: system:
|
||||||
};
|
import pkgs {
|
||||||
pkgs-unstable = import nixpkgs-unstable {
|
inherit system;
|
||||||
inherit system;
|
allowUnfree = false;
|
||||||
};
|
allowBroken = false;
|
||||||
|
overlays = builtins.attrValues self.overlays or {};
|
||||||
|
};
|
||||||
|
|
||||||
|
forAllSystems = f:
|
||||||
|
nixpkgs.lib.genAttrs systems (system:
|
||||||
|
f system (mkPkgs nixpkgs system) (mkPkgs nixpkgs-unstable system));
|
||||||
in {
|
in {
|
||||||
devShells."${system}".default = pkgs.mkShell {
|
overlays.default = self: super: {
|
||||||
packages = [
|
dobutterfliescry-net = super.stdenv.mkDerivation {
|
||||||
# dev local server
|
name = "dobutterfliescry.net";
|
||||||
pkgs.simple-http-server
|
src = self;
|
||||||
|
nativeBuildInputs = [super.makeWrapper];
|
||||||
# scss->css transpilation
|
installPhase = ''
|
||||||
# pkgs.sass seems broken on Nix currently, use pkgs.dark-sass instead
|
mkdir -p $out
|
||||||
pkgs.dart-sass
|
cp -r $src/www $out/
|
||||||
# image baking (from .svg)
|
'';
|
||||||
pkgs.imagemagick
|
};
|
||||||
];
|
|
||||||
|
|
||||||
shell = "${pkgs.bash}/bin/bash";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
checks = self.packages;
|
||||||
|
packages = forAllSystems (system: pkgs: upkgs: rec {
|
||||||
|
default = dobutterfliescry-net;
|
||||||
|
dobutterfliescry-net = pkgs.dobutterfliescry-net;
|
||||||
|
});
|
||||||
|
|
||||||
|
devShells = forAllSystems (system: pkgs: upkgs: let
|
||||||
|
devPackages = with pkgs; [
|
||||||
|
# dev local server
|
||||||
|
simple-http-server
|
||||||
|
|
||||||
|
# css baking
|
||||||
|
ruby.devEnv
|
||||||
|
rubyPackages_3_3.sass
|
||||||
|
# image baking (from .svg)
|
||||||
|
imagemagick
|
||||||
|
];
|
||||||
|
in {
|
||||||
|
default = pkgs.mkShell {
|
||||||
|
packages = devPackages;
|
||||||
|
shell = "${pkgs.bash}/bin/bash";
|
||||||
|
};
|
||||||
|
|
||||||
|
fhs =
|
||||||
|
(pkgs.buildFHSEnv
|
||||||
|
(pkgs.appimageTools.defaultFhsEnvArgs
|
||||||
|
// {
|
||||||
|
name = "dobutterfliescry.net-fhs";
|
||||||
|
targetPkgs = devPackages;
|
||||||
|
runScript = "bash";
|
||||||
|
extraOutputsToInstall = ["dev"];
|
||||||
|
})).env;
|
||||||
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
53
palette.theme
Normal file
53
palette.theme
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
# REF: https://github.com/rose-pine/fish/blob/main/themes/Ros%C3%A9%20Pine%20Moon.theme
|
||||||
|
|
||||||
|
# syntax highlighting variables
|
||||||
|
# https://fishshell.com/docs/current/interactive.html#syntax-highlighting-variables
|
||||||
|
fish_color_normal e0def4
|
||||||
|
fish_color_command c4a7e7
|
||||||
|
fish_color_keyword 9ccfd8
|
||||||
|
fish_color_quote f6c177
|
||||||
|
fish_color_redirection 3e8fb0
|
||||||
|
fish_color_end 908caa
|
||||||
|
fish_color_error eb6f92
|
||||||
|
fish_color_param ea9a97
|
||||||
|
fish_color_comment 908caa
|
||||||
|
# fish_color_match --background=brblue
|
||||||
|
fish_color_selection --reverse
|
||||||
|
# fish_color_history_current --bold
|
||||||
|
fish_color_operator e0def4
|
||||||
|
fish_color_escape 3e8fb0
|
||||||
|
fish_color_autosuggestion 908caa
|
||||||
|
fish_color_cwd ea9a97
|
||||||
|
# fish_color_cwd_root red
|
||||||
|
fish_color_user f6c177
|
||||||
|
fish_color_host 9ccfd8
|
||||||
|
fish_color_host_remote c4a7e7
|
||||||
|
fish_color_cancel e0def4
|
||||||
|
fish_color_search_match --background=232136
|
||||||
|
fish_color_valid_path
|
||||||
|
|
||||||
|
# pager color variables
|
||||||
|
# https://fishshell.com/docs/current/interactive.html#pager-color-variables
|
||||||
|
fish_pager_color_progress ea9a97
|
||||||
|
fish_pager_color_background --background=2a273f
|
||||||
|
fish_pager_color_prefix 9ccfd8
|
||||||
|
fish_pager_color_completion 908caa
|
||||||
|
fish_pager_color_description 908caa
|
||||||
|
fish_pager_color_secondary_background
|
||||||
|
fish_pager_color_secondary_prefix
|
||||||
|
fish_pager_color_secondary_completion
|
||||||
|
fish_pager_color_secondary_description
|
||||||
|
fish_pager_color_selected_background --background=393552
|
||||||
|
fish_pager_color_selected_prefix 9ccfd8
|
||||||
|
fish_pager_color_selected_completion e0def4
|
||||||
|
fish_pager_color_selected_description e0def4
|
||||||
|
|
||||||
|
# custom color variables
|
||||||
|
fish_color_subtle 908caa
|
||||||
|
fish_color_text e0def4
|
||||||
|
fish_color_love eb6f92
|
||||||
|
fish_color_gold f6c177
|
||||||
|
fish_color_rose ea9a97
|
||||||
|
fish_color_pine 3e8fb0
|
||||||
|
fish_color_foam 9ccfd8
|
||||||
|
fish_color_iris c4a7e7
|
||||||
8
serve
8
serve
|
|
@ -4,7 +4,7 @@
|
||||||
# | sass
|
# | sass
|
||||||
|
|
||||||
# ===== Configuration ===== #
|
# ===== Configuration ===== #
|
||||||
ADDR="127.0.01" # bind address
|
ADDR="127.0.0.1" # bind address
|
||||||
PORT="8000" # bind port
|
PORT="8000" # bind port
|
||||||
WEBROOT="www" # root web directory
|
WEBROOT="www" # root web directory
|
||||||
USE_INDEX=true
|
USE_INDEX=true
|
||||||
|
|
@ -32,7 +32,7 @@ function watch_scss {
|
||||||
}
|
}
|
||||||
|
|
||||||
function host {
|
function host {
|
||||||
local args=$@
|
local args=( "$@" )
|
||||||
# Apply Flags
|
# Apply Flags
|
||||||
if [[ "$NO_CACHE" == true ]]; then
|
if [[ "$NO_CACHE" == true ]]; then
|
||||||
args+=("--nocache")
|
args+=("--nocache")
|
||||||
|
|
@ -44,7 +44,7 @@ function host {
|
||||||
# Apply Options
|
# Apply Options
|
||||||
args+=(--ip "$ADDR" --port "$PORT")
|
args+=(--ip "$ADDR" --port "$PORT")
|
||||||
|
|
||||||
simple-http-server $args $@ -- "$WEBROOT"
|
simple-http-server "${args[@]}" "$@" -- "$WEBROOT"
|
||||||
}
|
}
|
||||||
|
|
||||||
trap cleanup EXIT
|
trap cleanup EXIT
|
||||||
|
|
@ -56,4 +56,4 @@ watch_scss &
|
||||||
SASS_PID=$!
|
SASS_PID=$!
|
||||||
|
|
||||||
# host dev server
|
# host dev server
|
||||||
host ${SRV_ARGS[@]}
|
host "${SRV_ARGS[@]}"
|
||||||
|
|
|
||||||
72
www/css-old/typing-long.css
Normal file
72
www/css-old/typing-long.css
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
background-color: #0e0d14;
|
||||||
|
}
|
||||||
|
|
||||||
|
.centered {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0 0 0 0;
|
||||||
|
margin: auto;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.heading {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 2em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ffc0cb; /* #ac4aed */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =========================================================== *
|
||||||
|
* Type Writer Effect *
|
||||||
|
/* =========================================================== */
|
||||||
|
|
||||||
|
#typing-wrapper {
|
||||||
|
margin: auto auto;
|
||||||
|
width: 13ch; /* prompt + command + cursor length */
|
||||||
|
text-align: start;
|
||||||
|
|
||||||
|
border: 0.5ch solid #ffc0cb; /* #ac4aed */
|
||||||
|
padding: 20px;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-content: center;
|
||||||
|
align-items: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
#typing-prompt {
|
||||||
|
width: 12ch; /* prompt + command length */
|
||||||
|
animation: typing 3s steps(10), cursor-blink 0.6s steps(1, start) 3s infinite alternate;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
border-right: 1ch solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
#typing-result {
|
||||||
|
/* "3.8s" means the result is shown 0.8s after typing ends */
|
||||||
|
animation: unhide 1s 3.8s forwards;
|
||||||
|
visibility: hidden;
|
||||||
|
white-space: pre-wrap; /* preserve linebreaks */
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes typing {
|
||||||
|
from {
|
||||||
|
width: 5ch /* ignore prompt width */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes cursor-blink {
|
||||||
|
50% {
|
||||||
|
border-color: transparent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes unhide {
|
||||||
|
to {
|
||||||
|
visibility: visible
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -26,6 +26,7 @@ html, body {
|
||||||
#typing-wrapper {
|
#typing-wrapper {
|
||||||
margin: auto auto;
|
margin: auto auto;
|
||||||
width: 39ch; /* prompt + command + cursor length */
|
width: 39ch; /* prompt + command + cursor length */
|
||||||
|
height: 10ch;
|
||||||
text-align: start;
|
text-align: start;
|
||||||
|
|
||||||
border: 0.5ch solid #ffc0cb; /* #ac4aed */
|
border: 0.5ch solid #ffc0cb; /* #ac4aed */
|
||||||
|
|
@ -33,7 +34,7 @@ html, body {
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: center;
|
justify-content: start;
|
||||||
align-content: center;
|
align-content: center;
|
||||||
align-items: start;
|
align-items: start;
|
||||||
}
|
}
|
||||||
|
|
@ -44,13 +45,14 @@ html, body {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
border-right: 1ch solid;
|
border-right: 1ch solid;
|
||||||
|
margin-bottom: 0.5ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
#typing-result {
|
#typing-result {
|
||||||
/* "3.8s" means the result is shown 0.8s after typing ends */
|
/* "1.8s" means the result is shown 1.8s after typing ends */
|
||||||
animation: unhide 1s 3.8s forwards;
|
animation: unhide 1s 4.8s forwards;
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
white-space: pre-wrap; /* preserve linebreaks */
|
/* white-space: pre-wrap; /* preserve linebreaks */ */
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes typing {
|
@keyframes typing {
|
||||||
114
www/css-old/typing2.css
Normal file
114
www/css-old/typing2.css
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
background-color: #0e0d14;
|
||||||
|
}
|
||||||
|
|
||||||
|
.centered {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0 0 0 0;
|
||||||
|
margin: auto;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.heading {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 2em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ffc0cb; /* #ac4aed */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =========================================================== *
|
||||||
|
* Type Writer Effect *
|
||||||
|
/* =========================================================== */
|
||||||
|
|
||||||
|
#typing-wrapper {
|
||||||
|
margin: auto auto;
|
||||||
|
width: 71ch; /* prompt + command + cursor length */
|
||||||
|
height: 21ch;
|
||||||
|
text-align: start;
|
||||||
|
|
||||||
|
border: 0.5ch solid #ffc0cb; /* #ac4aed */
|
||||||
|
padding: 20px;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: start;
|
||||||
|
align-content: center;
|
||||||
|
align-items: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
#typing-prompt {
|
||||||
|
width: 10ch; /* prompt + command length */
|
||||||
|
animation: kfs-typing 0.5s steps(4), kfs-cursor-blink 1.2s steps(1, start) 0.6s forwards;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
border-right: 1ch solid;
|
||||||
|
margin-bottom: 0.5ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
#typing-result {
|
||||||
|
/* "4.8s" means the result is shown 1.8s after typing ends */
|
||||||
|
animation: unhide 1s 1.8s forwards;
|
||||||
|
visibility: hidden;
|
||||||
|
white-space: nowrap; /* preserve linebreaks */
|
||||||
|
}
|
||||||
|
|
||||||
|
#typing-prompt-segfault {
|
||||||
|
width: 47ch; /* prompt + command length */
|
||||||
|
/* animation: kfs-typing-segfault 3s steps(36) 2.6s, cursor-blink 0.6s steps(1, start) 3s infinite alternate; */
|
||||||
|
animation: kfs-typing-segfault 3s steps(36) 4s forwards, cursor-blink-segfault 0.6s steps(1, start) 7.1s infinite alternate;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
border-right: 1ch solid;
|
||||||
|
margin-bottom: 0.5ch;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
#typing-result-segfault {
|
||||||
|
/* "4.8s" means the result is shown 1.8s after typing ends */
|
||||||
|
animation: unhide 1s 8.3s forwards;
|
||||||
|
visibility: hidden;
|
||||||
|
white-space: nowrap; /* preserve linebreaks */
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes kfs-typing {
|
||||||
|
from {
|
||||||
|
width: 6ch; /* ignore prompt width */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes kfs-typing-segfault {
|
||||||
|
from {
|
||||||
|
width: 11ch; /* ignore prompt width */
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes kfs-cursor-blink {
|
||||||
|
from {
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
border-color: currentColor;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes cursor-blink-segfault {
|
||||||
|
50% {
|
||||||
|
border-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes unhide {
|
||||||
|
to {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
80
www/css/tty_intro.css
Normal file
80
www/css/tty_intro.css
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
/* background */
|
||||||
|
/* text */
|
||||||
|
/* #ac4aed */
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
background-color: #0e0d14; }
|
||||||
|
|
||||||
|
.centered {
|
||||||
|
position: absolute;
|
||||||
|
inset: 0 0 0 0;
|
||||||
|
margin: auto;
|
||||||
|
display: flex; }
|
||||||
|
|
||||||
|
.heading {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 2em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ffc0cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* =========================================================== *
|
||||||
|
* Type Writer Effect *
|
||||||
|
/* =========================================================== */
|
||||||
|
/* ==================
|
||||||
|
* Graphical Container
|
||||||
|
*/
|
||||||
|
/* ==================
|
||||||
|
* TTY Prompt
|
||||||
|
*/
|
||||||
|
@keyframes cursor-blink {
|
||||||
|
50% {
|
||||||
|
border-color: transparent; } }
|
||||||
|
/* =====================
|
||||||
|
* TTY Output
|
||||||
|
*/
|
||||||
|
@keyframes unhide-result {
|
||||||
|
to {
|
||||||
|
visibility: visible; } }
|
||||||
|
/* =========================
|
||||||
|
* Intended Public Interface
|
||||||
|
*/
|
||||||
|
.typing-wrapper-2ch-36ch {
|
||||||
|
margin: auto auto;
|
||||||
|
width: 39ch;
|
||||||
|
text-align: start;
|
||||||
|
|
||||||
|
border: 0.5ch solid #ffc0cb;
|
||||||
|
padding: 20px;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-content: center;
|
||||||
|
align-items: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.typing-prompt-2ch-36ch-3s-0_6s {
|
||||||
|
width: 38ch;
|
||||||
|
/* XXX: fix scss leaves typing as a function! */
|
||||||
|
animation: kfs-typing-2ch 3s steps(36ch), cursor-blink 0.6s steps(1, start) 3s infinite alternate;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
border-right: 1ch solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.typing-result-3s-0_8s {
|
||||||
|
animation: unhide-result 1s 3.8s forwards;
|
||||||
|
visibility: hidden;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XXX: NAME CHANGED TO GENERIC */
|
||||||
|
@keyframes kfs-typing-2ch {
|
||||||
|
from {
|
||||||
|
width: 2ch /* ignore prompt width */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*# sourceMappingURL=tty_intro.css.map */
|
||||||
7
www/css/tty_intro.css.map
Normal file
7
www/css/tty_intro.css.map
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"mappings": "AAAqB,gBAAgB;AAChB,gBAAgB;AAAE,aAAa;AAEpD,UAAW;EACT,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,CAAC;EACT,gBAAgB,EANN,OAAO;;AASnB,SAAU;EACR,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,OAAO;EACd,MAAM,EAAE,IAAI;EAEZ,OAAO,EAAE,IAAI;;AAGf,QAAS;EACP,WAAW,EAAE,SAAS;EACtB,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,IAAI;EACjB,KAAK,EApBK,OAAO;;ACDnB;;iEAEiE;AAsBjE;;GAEG;AAsBH;;GAEG;AA2BH,uBAIC;EAHC,GAAI;IACF,YAAY,EAAE,WAAW;AAI7B;;GAEG;AAcH,wBAIC;EAHC,EAAG;IACD,UAAU,EAAE,OAAO;AAIvB;;GAEG;AA/ED,wBAAmD;EAEjD,MAAM,EAAE,SAAS;EACjB,KAAK,EAAE,IAAoC;EAG3C,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;EACtB,eAAe,EAAE,MAAM;EACvB,aAAa,EAAE,MAAM;EACrB,WAAW,EAAE,KAAK;EAClB,UAAU,EAAE,KAAK;EAGjB,0CAA0C;EAC1C,MAAM,EAAE,mBAAmB;EAC3B,OAAO,EAAE,IAAI;;AAUf,+BAAqG;EACnG,KAAK,EAAE,IAA8B;EACrC,YAAY,EAAE,SAAS;EAGvB,WAAW,EAAE,MAAM;EACnB,QAAQ,EAAE,MAAM;EAGhB,SAAS,EACP,mFAC8E;;AAwBlF,sBAAkE;EAChE,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,QAAQ;EAGrB,SAAS,EACP,8BAA4D",
|
||||||
|
"sources": ["../scss/_base.scss","../scss/_tty.scss"],
|
||||||
|
"names": [],
|
||||||
|
"file": "tty_intro.css"
|
||||||
|
}
|
||||||
2
www/hown/README.md
Normal file
2
www/hown/README.md
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
# Html With Nix (HOWN/hown)
|
||||||
|
Hown is a system for static html/css compilation with the NixExpr language.
|
||||||
6
www/hown/default.nix
Normal file
6
www/hown/default.nix
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
{mix, ...} @ inputs:
|
||||||
|
mix.newMixture inputs (mixture: {
|
||||||
|
includes.public = [
|
||||||
|
./tty.nix
|
||||||
|
];
|
||||||
|
})
|
||||||
8
www/hown/index.html
Normal file
8
www/hown/index.html
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<!-->
|
||||||
|
{Text, mkTypingEffect, ...}:
|
||||||
|
mkTypingEffect {
|
||||||
|
head = Text "$ Do butterflies cry when they're sad?";
|
||||||
|
body = Text "Segmentation fault (core dumped)";
|
||||||
|
}
|
||||||
|
<-->
|
||||||
|
|
||||||
100
www/hown/tty.nix
Normal file
100
www/hown/tty.nix
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
# XXX: TODO: The howl.Div, howl.Text, ... types implement
|
||||||
|
# XXX: TODO: the HtmlTag' typeclass, which in turn implements
|
||||||
|
# XXX: TODO: a morphism to the nt.String type. This makes compiling
|
||||||
|
# XXX: TODO: to html super duper simple!!
|
||||||
|
{
|
||||||
|
nt,
|
||||||
|
howl,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit
|
||||||
|
(nt)
|
||||||
|
projectOnto
|
||||||
|
;
|
||||||
|
|
||||||
|
inherit
|
||||||
|
(howl)
|
||||||
|
# HTML
|
||||||
|
Div
|
||||||
|
Text
|
||||||
|
# CSS
|
||||||
|
StyleClass
|
||||||
|
StyleSheet
|
||||||
|
ContinuousAnimation
|
||||||
|
DiscreteAnimation
|
||||||
|
;
|
||||||
|
in {
|
||||||
|
typing = StyleSheet {
|
||||||
|
include = [./tty.css];
|
||||||
|
|
||||||
|
classes = {
|
||||||
|
typing-wrapper = null;
|
||||||
|
typing-prompt = promptLength: commandLength: duration: period:
|
||||||
|
StyleClass {
|
||||||
|
width = promptLength + commandLength; # ignore cursor
|
||||||
|
border.right = "TODO"; # cursor
|
||||||
|
|
||||||
|
# hide what the animation hasn't shown yet
|
||||||
|
whitespace = "nowrap";
|
||||||
|
overflow = "hidden";
|
||||||
|
|
||||||
|
# run typing animation then start cursor blink
|
||||||
|
animations = [
|
||||||
|
(DiscreteAnimation {
|
||||||
|
inherit duration;
|
||||||
|
keyframes = {
|
||||||
|
"0"
|
||||||
|
};
|
||||||
|
})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
typing-result = typingDuration: delay:
|
||||||
|
StyleClass {
|
||||||
|
visibility = "hidden";
|
||||||
|
whitespace = "pre-wrap"; # preserve linebreaks
|
||||||
|
|
||||||
|
# show result once typing duration + delay is over
|
||||||
|
animations = [
|
||||||
|
(ContinuousAnimation {
|
||||||
|
name = "unhide-result";
|
||||||
|
duration = 1; # animation-duration
|
||||||
|
# timingFn = ; # animation-timing-function
|
||||||
|
delay = typingDuration + delay; # animation-delay
|
||||||
|
# animation-iteration-count
|
||||||
|
direction = "forwards"; # animation-direction
|
||||||
|
# animation-fill-mode
|
||||||
|
# animation-play-state
|
||||||
|
keyframes = {
|
||||||
|
"100" = {
|
||||||
|
visibility = "visible";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mkTypingEffect = decl': let
|
||||||
|
decl =
|
||||||
|
decl'
|
||||||
|
|> projectOnto
|
||||||
|
{
|
||||||
|
head = "";
|
||||||
|
body = "";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
Div {
|
||||||
|
id = "typing-wrapper";
|
||||||
|
content = [
|
||||||
|
(Div {
|
||||||
|
id = "typing-prompt";
|
||||||
|
content = Text decl.head;
|
||||||
|
})
|
||||||
|
(Div {
|
||||||
|
id = "typing-result";
|
||||||
|
content = Text decl.body;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
21
www/index-old.html
Normal file
21
www/index-old.html
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link rel="stylesheet" href="css-old/typing.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="centered heading">
|
||||||
|
<div id="typing-wrapper">
|
||||||
|
|
||||||
|
<div id="typing-prompt">
|
||||||
|
$ do butterflies cry when they're sad?
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="typing-result">
|
||||||
|
Segmentation fault (core dumped)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<link rel="stylesheet" href="css/typing.css">
|
<link rel="stylesheet" href="css/tty_intro.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="centered heading">
|
<div class="centered heading">
|
||||||
<div id="typing-wrapper">
|
<div id="typing-wrapper-2ch-36ch">
|
||||||
|
|
||||||
<div id="typing-prompt">
|
<div id="typing-prompt-2ch-36ch-3s-0_6s">
|
||||||
$ Do butterflies cry when they're sad?
|
$ Do butterflies cry when they're sad?
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="typing-result">
|
<div id="typing-result-3s-0_8s">
|
||||||
Segmentation fault (core dumped)
|
Segmentation fault (core dumped)
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,35 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<link rel="stylesheet" href="css/typing.css">
|
<link rel="stylesheet" href="css-old/typing2.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="centered heading">
|
<div class="centered heading">
|
||||||
<div id="typing-wrapper">
|
<div id="typing-wrapper">
|
||||||
|
|
||||||
<div id="typing-prompt">
|
<div id="typing-prompt">
|
||||||
grub> boot
|
<span style="color: #9ccfd8;">grub></span> <span style="color: #c4a7e7;">boot</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="typing-result">
|
<div id="typing-result" style="color: #f6c177;">
|
||||||
ERROR: Root device mounted successfully, but /sbin/init does not exist.
|
ERROR: Root device mounted successfully, but /sbin/init does not exist.<br/><br/>
|
||||||
|
|
||||||
Bailing out, you are on your own.
|
<i style="color: #eb6f92;">Bailing out, you are on your own.</i><br/>
|
||||||
Good luck
|
<i style="color: #eb6f92;">Good luck</i><br/><br/>
|
||||||
|
|
||||||
sh: can't access tty; job control turned off
|
sh: can't access tty; job control turned off<br/><br/>
|
||||||
[rootfs ]#
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="typing-prompt-segfault">
|
||||||
|
<span style="color: #9ccfd8;">[rootfs ]#</span>
|
||||||
|
<span style="color: #c4a7e7;">do butterflies cry when they're sad?</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="typing-result-segfault">
|
||||||
|
<i style="color: #eb6f92;">Segmentation fault (core dumped)</i>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,25 @@
|
||||||
* Type Writer Effect *
|
* Type Writer Effect *
|
||||||
/* =========================================================== */
|
/* =========================================================== */
|
||||||
|
|
||||||
@use 'base';
|
/// Replace `$search` with `$replace` in `$string`
|
||||||
|
/// @author Kitty Giraudel
|
||||||
|
/// @param {String} $string - Initial string
|
||||||
|
/// @param {String} $search - Substring to replace
|
||||||
|
/// @param {String} $replace ('') - New value
|
||||||
|
/// @return {String} - Updated string
|
||||||
|
@function str-replace($string, $search, $replace: '') {
|
||||||
|
$index: str-index($string, $search);
|
||||||
|
|
||||||
|
@if $index {
|
||||||
|
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
|
||||||
|
}
|
||||||
|
|
||||||
|
@return $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
@function sanitize-int($int) {
|
||||||
|
@return str-replace(#{$int}, '.', '_')
|
||||||
|
}
|
||||||
|
|
||||||
/* ==================
|
/* ==================
|
||||||
* Graphical Container
|
* Graphical Container
|
||||||
|
|
@ -21,7 +39,9 @@
|
||||||
align-items: start;
|
align-items: start;
|
||||||
text-align: start;
|
text-align: start;
|
||||||
|
|
||||||
border: 0.5ch solid base.$color-txt;
|
// XXX: TODO: for some reason this causes an error??
|
||||||
|
/* border: 0.5ch solid base.$color-txt; */
|
||||||
|
border: 0.5ch solid #ffc0cb;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -30,7 +50,9 @@
|
||||||
* TTY Prompt
|
* TTY Prompt
|
||||||
*/
|
*/
|
||||||
@mixin typing-prompt($prompt-width, $command-width, $typing-duration, $blink-period) {
|
@mixin typing-prompt($prompt-width, $command-width, $typing-duration, $blink-period) {
|
||||||
.typing-prompt-#{$prompt-width}-#{$command-width}-#{$typing-duration}-#{$blink-period} {
|
// XXX: TODO: relearn SCSS cause the thing below will break whenever an input is given as a float
|
||||||
|
// XXX: TODO: (period character interpretted as sub-attribute)
|
||||||
|
.typing-prompt-#{$prompt-width}-#{$command-width}-#{$typing-duration}-#{sanitize-int($blink-period)} {
|
||||||
width: $prompt-width + $command-width; // ignore cursor (right border)
|
width: $prompt-width + $command-width; // ignore cursor (right border)
|
||||||
border-right: 1ch solid; // cursor
|
border-right: 1ch solid; // cursor
|
||||||
|
|
||||||
|
|
@ -40,7 +62,7 @@
|
||||||
|
|
||||||
// typing animation then start cursor blink
|
// typing animation then start cursor blink
|
||||||
animation:
|
animation:
|
||||||
typing $typing-duration steps($command-width),
|
typing($prompt-width) $typing-duration steps($command-width),
|
||||||
cursor-blink $blink-period steps(1, start) $typing-duration infinite alternate;
|
cursor-blink $blink-period steps(1, start) $typing-duration infinite alternate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -63,7 +85,9 @@
|
||||||
* TTY Output
|
* TTY Output
|
||||||
*/
|
*/
|
||||||
@mixin typing-result($typing-duration, $reveal-delay) {
|
@mixin typing-result($typing-duration, $reveal-delay) {
|
||||||
.typing-result-#{$typing-duration}-#{$reveal-delay} {
|
// XXX: TODO: relearn SCSS cause the thing below will break whenever an input is given as a float
|
||||||
|
// XXX: TODO: (period character interpretted as sub-attribute)
|
||||||
|
.typing-result-#{$typing-duration}-#{sanitize-int($reveal-delay)} {
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
white-space: pre-wrap; // preserve linebreaks
|
white-space: pre-wrap; // preserve linebreaks
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
@import "base";
|
||||||
@import "tty";
|
@import "tty";
|
||||||
@include tty(2ch, 36ch, 3s, 0.6s, 0.8s);
|
@include tty(2ch, 36ch, 3s, 0.6s, 0.8s);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue