update idk
confusedbread confuseddbread@gmail.com
Fri, 14 Nov 2025 23:20:38 +0100
17 files changed,
68 insertions(+),
1115 deletions(-)
D
Cargo.toml
@@ -1,10 +0,0 @@
-[package] -name = "breadsite" -version = "0.1.0" -edition = "2024" - -[dependencies] -maud = { version = "*", features = ["actix-web"] } -actix-web = "*" -actix-files = "*" -chrono = "*"
D
Makefile
@@ -1,7 +0,0 @@
-all: target/backend frontend - -target/backend: - cd backend && go build -o ../target/backend . - -frontend: - cd src && cargo build --release --target-dir=../target/
D
backend/listenBrainz.go
@@ -1,108 +0,0 @@
-package main - -import ( - "encoding/json" - "fmt" - "io" - "log" - "net/http" - "net/url" -) - -type PlayingNow struct { - Payload struct { - Count int `json:"count"` - Listens []struct { - PlayingNow bool `json:"playing_now"` - TrackMetadata struct { - AdditionalInfo struct { - ArtistMbids []any `json:"artist_mbids"` - DurationMs int `json:"duration_ms"` - SubmissionClient string `json:"submission_client"` - SubmissionClientVersion string `json:"submission_client_version"` - Tracknumber int `json:"tracknumber"` - } `json:"additional_info"` - ArtistName string `json:"artist_name"` - ReleaseName string `json:"release_name"` - TrackName string `json:"track_name"` - } `json:"track_metadata"` - } `json:"listens"` - PlayingNow bool `json:"playing_now"` - UserID string `json:"user_id"` - } `json:"payload"` -} - -type Metadata struct { - ArtistCreditName string `json:"artist_credit_name"` - ArtistMbids []string `json:"artist_mbids"` - RecordingMbid string `json:"recording_mbid"` - RecordingName string `json:"recording_name"` - ReleaseMbid string `json:"release_mbid"` - ReleaseName string `json:"release_name"` -} - -func getPlayingNow(userName string) (PlayingNow, error) { - url := fmt.Sprintf("https://api.listenbrainz.org/1/user/%s/playing-now", url.QueryEscape(userName)) - res, err := http.Get(url) - if err != nil { - return PlayingNow{}, err - } - - body, err := io.ReadAll(res.Body) - if err != nil { - log.Printf("body: %s\nerror: %s\n",url, err) - return PlayingNow{}, err - } - - var playingNow PlayingNow - if err := json.Unmarshal(body, &playingNow); err != nil { - log.Printf("url: %s\nbody: %s\nerror: %s\n",url, body, err) - return PlayingNow{}, err - } - - return playingNow, nil -} - -func getMetadata(artistName string, recordingName string, releaseName string) (Metadata, error) { - url := fmt.Sprintf( - "https://api.listenbrainz.org/1/metadata/lookup/?artist_name=%s&recording_name=%s&release_name=%s&metadata=false&inc=release_mbid", - url.QueryEscape(artistName), - url.QueryEscape(recordingName), - url.QueryEscape(releaseName), - ) - res, err := http.Get(url) - if err != nil { - return Metadata{}, err - } - - body, err := io.ReadAll(res.Body) - if err != nil { - log.Printf("body: %s\nerror: %s\n",url, err) - return Metadata{}, err - } - - var metadata Metadata - if err := json.Unmarshal(body, &metadata); err != nil { - log.Printf("url: %s\nbody: %s\nerror: %s\n",url, body, err) - return Metadata{}, err - } - - return metadata, nil -} - -func getCover(releaseMbid string) (string, error) { - client := http.Client{} - url := fmt.Sprintf("https://coverartarchive.org/release/%s/front-250", url.QueryEscape(releaseMbid)) - req , err := http.NewRequest("GET", url, nil) - if err != nil { - return "", err - } - - req.Header = http.Header{ - "Sec-Fetch-Mode": {"navigate"}, - } - res, err := client.Do(req) - - - return res.Request.URL.String(), nil -}
D
backend/main.go
@@ -1,59 +0,0 @@
-package main - -import ( - "fmt" - "log" - "net/http" -) - -type PlayingInfo struct { - playing bool - artistName string - recordingName string - releaseName string - recordingUrl string - coverUrl string -} - -func getInfo() PlayingInfo { - playingInfo := PlayingInfo{} - - playingNow, err := getPlayingNow("confuseddbread") - if err != nil { - panic(err) - } - - if len(playingNow.Payload.Listens) == 0 { - playingInfo.playing = false - return playingInfo - } else { - playingInfo.playing = true - } - - trackMetadata := playingNow.Payload.Listens[0].TrackMetadata - playingInfo.artistName = trackMetadata.ArtistName - playingInfo.recordingName = trackMetadata.TrackName - playingInfo.releaseName = trackMetadata.ReleaseName - - metadata, err := getMetadata(trackMetadata.ArtistName, trackMetadata.TrackName, trackMetadata.ReleaseName) - if err != nil { - log.Fatalf("error: %s\n", err) - } - if metadata.RecordingMbid == "" { - log.Println("no song metadata found") - return playingInfo - } - playingInfo.recordingUrl = fmt.Sprintf("https://musicbrainz.org/recording/%s", metadata.RecordingMbid) - - coverArt, err := getCover(metadata.ReleaseMbid) - playingInfo.coverUrl = coverArt - - return playingInfo -} - -func main() { - http.HandleFunc("/api/now-playing", nowPlayingHandler) - http.HandleFunc("/api/boop", boopHandler) - log.Println("http://localhost:5050") - log.Fatal(http.ListenAndServe(":5050", nil)) -}
D
backend/nowPlaying.go
@@ -1,73 +0,0 @@
-package main - -import ( - "fmt" - "log" - "net/http" - "strings" - "time" -) - -type musicCache struct { - expires time.Time - content PlayingInfo -} - -var music_handler_Cache musicCache - -func music_cache_handler(music_handler_Cache *musicCache, expiry_time time.Duration) PlayingInfo { - e := music_handler_Cache.content == PlayingInfo{} - if time.Now().After(music_handler_Cache.expires) || e{ - log.Println("cache expired") - music_handler_Cache.content = getInfo() - music_handler_Cache.expires = time.Now().Add(expiry_time) - } - log.Println("returning cached result") - return music_handler_Cache.content -} - -func nowPlayingHandler(w http.ResponseWriter, r *http.Request) { - playingInfo := music_cache_handler(&music_handler_Cache, time.Second * 60) - - // v := reflect.ValueOf(playingInfo) - // k := v.Type() - // for i := range v.NumField() { - // log.Printf("%s: %s\n", k.Field(i).Name, v.Field(i)) - // } - - w.Header().Add("Access-Control-Allow-Origin", "*") - w.Header().Add("Access-Control-Allow-Headers", "*") - - var response string - - if playingInfo.playing { - response = fmt.Sprintf( - ` - <a class='nowPlaying' href=%s> - <h3>Now Playing:</h3> - <div class='songInfo'> - <img class='coverImg' src='%s' alt='%s'> - <div class='metadata'> - <p class='recordingName'>%s</p> - <p class='artistName'>~ %s</p> - <p class='releaseName'>%s</p> - </div> - </div> - </a> - `, - playingInfo.recordingUrl, - playingInfo.coverUrl, - strings.ReplaceAll( - fmt.Sprintf("%s - %s", playingInfo.recordingName, playingInfo.artistName), - `'`, - "", - ), - playingInfo.recordingName, - playingInfo.artistName, - playingInfo.releaseName, - ) - } else { - response = "<h3 class='nowPlaying offline'>nothing is playing...</h3>" - } - fmt.Fprintf(w, response) -}
D
backend/snoot.go
@@ -1,21 +0,0 @@
-package main - -import ( - "fmt" - "net/http" -) - -type boopCache struct { - boops int -} - -var boopCounter boopCache - -func boopHandler(w http.ResponseWriter, r *http.Request) { - w.Header().Add("Access-Control-Allow-Origin", "*") - w.Header().Add("Access-Control-Allow-Headers", "*") - if r.Method == "POST" { - boopCounter.boops += 1 - } - fmt.Fprintf(w, `%v`, boopCounter.boops) -}
A
index.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html> +<html lang="en-US"> +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width" /> + <title>6B74-4's site</title> + <link href="/style.css" rel="stylesheet" /> +</head> +<body> + <h1>6B74-4's site</h1> + <section id="about"> + <h2>about</h2> + <table border="1"> + <tbody> + <tr> + <td rowspan="6"> + <img + src="/assets/kate_6b74-4/kate_6b74-4.webp" + alt="visoring beeper with big green rectangle eyes staring at the camera with a wall mounted glowing world map in the background" + > + </td> + </tr> + <tr> + <th scope="row">Names</th> + <td>Kate, Katarina</td> + </tr> + <tr> + <th scope="row">Pronouns</th> + <td> + it/its (3pp preferred)<br> + she/her + </td> + </tr> + <tr> + <th scope="row">serial number</th> + <td>6B74-4</td> + </tr> + <tr> + <th scope="row">doll code</th> + <td>▌▌▖▖▌▖▘▖▖ - ▖▖</td> + </tr> + </tbody> + </table> + </section> + <section id="stuff"> + <h2>stuff</h2> + </section> + <section id="contact"> + <h2>contact</h2> + <p> + + </p> + </section> + +</body> +</html>
A
pterodactyl/index.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html> +<html lang="en-US"> +<head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width" /> + <title>6B74-4's site</title> + <link href="/style.css" rel="stylesheet" /> +</head> +<body> + <p>terodactyl</p> +</body> +</html>
D
src/main.rs
@@ -1,154 +0,0 @@
-use actix_web::{get, App, HttpServer, Result as AwResult}; -use actix_files::Files; -use maud::{DOCTYPE, html, Markup}; -use std::io; -use chrono::Local; - -#[derive(Clone)] -struct NavElement { - name: String, - href: String, - class: String -} - -#[cfg(debug_assertions)] -const URL: &str = "http://localhost:5050/api"; - -#[cfg(not(debug_assertions))] -const URL: &str = "https://kate.breadlabs.de/api"; - -fn head(page_title: &str) -> Markup { - html! { - (DOCTYPE) - head { - meta charset="utf-8"; - title { (page_title) } - link rel="icon" href="./static/neodog_laptop_notice.webp"; - link rel="stylesheet" href="static/style.css"; - script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.6/dist/htmx.min.js" {} - script { "htmx.config.selfRequestsOnly = false" } - } - } -} - -fn nav_bar(mut elements: Vec<NavElement>, current: &str) -> Markup { - elements.first_mut().map(|e| e.class.push_str(" first")); - elements.last_mut().map(|e| e.class.push_str(" last")); - elements.iter_mut().filter(|e| e.href == current).for_each(|e| e.class.push_str(" current")); - - html!( - nav.navBar { - @for (i, element) in elements.iter().enumerate() { - ( nav_element(i, element) ) - } - } - ) -} - -fn nav_element(id: usize, element: &NavElement) -> Markup { - html!( - a class={( element.class.to_string() )} id={(format!("navElement-{}", id))} href={( element.href )} {( element.name )} - ) -} - - -fn header(current: &str) -> Markup{ - html!( - header { - (nav_bar(vec![ - NavElement{ name: "breadsite".to_string(), href: "/".to_string(), class: String::from("navElement")}, - NavElement{ name: "boop".to_string(), href: "/boop".to_string(), class: String::from("navElement")}, - NavElement{ name: "waf".to_string(), href: "/waf".to_string(), class: String::from("navElement")}, - ], current)) - - - div class="htmx-indicator nowPlaying loading" hx-get={(format!("{}/now-playing", URL))} hx-swap="outerHTML" hx-trigger="load" { ". . ." } - } - ) -} - -// TODOO: pawer 81x31 -fn pawer() -> Markup { - html! { - pawer { - ul { - li {"fedi: " a href="https://plasmatrap.com/@bread" {"@plasmatrap.com@bread"}} - br; br; - li {sub {"paws...."}} - } - } - } -} - -// TODOOOO: about me -// TODO: heart rate monitor -// TODO: svg -> neocat generator (get random svg from wikipedia for random neocar?) -fn breadsite() -> Markup { - html! { - h1 { "Hiiii" } - } -} - -fn boop() -> Markup { - html! { - h1 { "Boop me" } - div class="boop timestamp" { (format!("boops since {}:",Local::now().format("%d/%m/%Y %H:%M UTC%Z"))) } - div class="boop counter" #boop-counter hx-get={(format!("{}/boop", URL))} hx-trigger="load" {} - div class="boop stack" { - img class="boop unboop" src="./static/neodog.webp" {} - button class="boop button" hx-post={(format!("{}/boop", URL))} hx-trigger="mousedown throttle:300ms" hx-swap="swap:275ms" hx-target="#boop-counter" {} - } - } -} - -fn waf() -> Markup { - html! { - h1 { "waf :3" } - } -} - - -fn layout(page_title: &str, current: &str,site: Markup) -> Markup { - html! { - (head(page_title)) - body class={(page_title)} { - (header(current)) - main {(site)} - (pawer()) - } - } -} - -#[get("/")] -async fn breadsite_index() -> AwResult<Markup> { - Ok(html! { - (layout("breadsite", "/", breadsite())) - }) -} - -#[get("/boop")] -async fn breadsite_boop() -> AwResult<Markup> { - Ok(html! { - (layout("boop", "/boop", boop())) - }) -} - -#[get("/waf")] -async fn breadsite_waf() -> AwResult<Markup> { - Ok(html! { - (layout("waf", "/waf", waf())) - }) -} - -#[actix_web::main] -async fn main() -> io::Result<()> { - HttpServer::new(|| App::new() - .service(breadsite_index) - .service(breadsite_boop) - .service(breadsite_waf) - .service(Files::new("/static", "./static")) - ) - .bind(("localhost", 8083))? - .run() - .await -}
D
src/static/style.css
@@ -1,678 +0,0 @@
-/* @import url('https://unpkg.com/@catppuccin/palette/css/catppuccin.css'); */ -@import url(https://fonts.bunny.net/css?family=fredoka:500); - - -:root { - --ctp-latte-rosewater: #dc8a78; - --ctp-latte-rosewater-rgb: 220 138 120; - --ctp-latte-rosewater-hsl: 10.800 58.824% 66.667%; - --ctp-latte-flamingo: #dd7878; - --ctp-latte-flamingo-rgb: 221 120 120; - --ctp-latte-flamingo-hsl: 0.000 59.763% 66.863%; - --ctp-latte-pink: #ea76cb; - --ctp-latte-pink-rgb: 234 118 203; - --ctp-latte-pink-hsl: 316.034 73.418% 69.020%; - --ctp-latte-mauve: #8839ef; - --ctp-latte-mauve-rgb: 136 57 239; - --ctp-latte-mauve-hsl: 266.044 85.047% 58.039%; - --ctp-latte-red: #d20f39; - --ctp-latte-red-rgb: 210 15 57; - --ctp-latte-red-hsl: 347.077 86.667% 44.118%; - --ctp-latte-maroon: #e64553; - --ctp-latte-maroon-rgb: 230 69 83; - --ctp-latte-maroon-hsl: 354.783 76.303% 58.627%; - --ctp-latte-peach: #fe640b; - --ctp-latte-peach-rgb: 254 100 11; - --ctp-latte-peach-hsl: 21.975 99.184% 51.961%; - --ctp-latte-yellow: #df8e1d; - --ctp-latte-yellow-rgb: 223 142 29; - --ctp-latte-yellow-hsl: 34.948 76.984% 49.412%; - --ctp-latte-green: #40a02b; - --ctp-latte-green-rgb: 64 160 43; - --ctp-latte-green-hsl: 109.231 57.635% 39.804%; - --ctp-latte-teal: #179299; - --ctp-latte-teal-rgb: 23 146 153; - --ctp-latte-teal-hsl: 183.231 73.864% 34.510%; - --ctp-latte-sky: #04a5e5; - --ctp-latte-sky-rgb: 4 165 229; - --ctp-latte-sky-hsl: 197.067 96.567% 45.686%; - --ctp-latte-sapphire: #209fb5; - --ctp-latte-sapphire-rgb: 32 159 181; - --ctp-latte-sapphire-hsl: 188.859 69.953% 41.765%; - --ctp-latte-blue: #1e66f5; - --ctp-latte-blue-rgb: 30 102 245; - --ctp-latte-blue-hsl: 219.907 91.489% 53.922%; - --ctp-latte-lavender: #7287fd; - --ctp-latte-lavender-rgb: 114 135 253; - --ctp-latte-lavender-hsl: 230.935 97.203% 71.961%; - --ctp-latte-text: #4c4f69; - --ctp-latte-text-rgb: 76 79 105; - --ctp-latte-text-hsl: 233.793 16.022% 35.490%; - --ctp-latte-subtext1: #5c5f77; - --ctp-latte-subtext1-rgb: 92 95 119; - --ctp-latte-subtext1-hsl: 233.333 12.796% 41.373%; - --ctp-latte-subtext0: #6c6f85; - --ctp-latte-subtext0-rgb: 108 111 133; - --ctp-latte-subtext0-hsl: 232.800 10.373% 47.255%; - --ctp-latte-overlay2: #7c7f93; - --ctp-latte-overlay2-rgb: 124 127 147; - --ctp-latte-overlay2-hsl: 232.174 9.623% 53.137%; - --ctp-latte-overlay1: #8c8fa1; - --ctp-latte-overlay1-rgb: 140 143 161; - --ctp-latte-overlay1-hsl: 231.429 10.048% 59.020%; - --ctp-latte-overlay0: #9ca0b0; - --ctp-latte-overlay0-rgb: 156 160 176; - --ctp-latte-overlay0-hsl: 228.000 11.236% 65.098%; - --ctp-latte-surface2: #acb0be; - --ctp-latte-surface2-rgb: 172 176 190; - --ctp-latte-surface2-hsl: 226.667 12.162% 70.980%; - --ctp-latte-surface1: #bcc0cc; - --ctp-latte-surface1-rgb: 188 192 204; - --ctp-latte-surface1-hsl: 225.000 13.559% 76.863%; - --ctp-latte-surface0: #ccd0da; - --ctp-latte-surface0-rgb: 204 208 218; - --ctp-latte-surface0-hsl: 222.857 15.909% 82.745%; - --ctp-latte-base: #eff1f5; - --ctp-latte-base-rgb: 239 241 245; - --ctp-latte-base-hsl: 220.000 23.077% 94.902%; - --ctp-latte-mantle: #e6e9ef; - --ctp-latte-mantle-rgb: 230 233 239; - --ctp-latte-mantle-hsl: 220.000 21.951% 91.961%; - --ctp-latte-crust: #dce0e8; - --ctp-latte-crust-rgb: 220 224 232; - --ctp-latte-crust-hsl: 220.000 20.690% 88.627%; -} - -:root { - --ctp-frappe-rosewater: #f2d5cf; - --ctp-frappe-rosewater-rgb: 242 213 207; - --ctp-frappe-rosewater-hsl: 10.286 57.377% 88.039%; - --ctp-frappe-flamingo: #eebebe; - --ctp-frappe-flamingo-rgb: 238 190 190; - --ctp-frappe-flamingo-hsl: 0.000 58.537% 83.922%; - --ctp-frappe-pink: #f4b8e4; - --ctp-frappe-pink-rgb: 244 184 228; - --ctp-frappe-pink-hsl: 316.000 73.171% 83.922%; - --ctp-frappe-mauve: #ca9ee6; - --ctp-frappe-mauve-rgb: 202 158 230; - --ctp-frappe-mauve-hsl: 276.667 59.016% 76.078%; - --ctp-frappe-red: #e78284; - --ctp-frappe-red-rgb: 231 130 132; - --ctp-frappe-red-hsl: 358.812 67.785% 70.784%; - --ctp-frappe-maroon: #ea999c; - --ctp-frappe-maroon-rgb: 234 153 156; - --ctp-frappe-maroon-hsl: 357.778 65.854% 75.882%; - --ctp-frappe-peach: #ef9f76; - --ctp-frappe-peach-rgb: 239 159 118; - --ctp-frappe-peach-hsl: 20.331 79.085% 70.000%; - --ctp-frappe-yellow: #e5c890; - --ctp-frappe-yellow-rgb: 229 200 144; - --ctp-frappe-yellow-hsl: 39.529 62.044% 73.137%; - --ctp-frappe-green: #a6d189; - --ctp-frappe-green-rgb: 166 209 137; - --ctp-frappe-green-hsl: 95.833 43.902% 67.843%; - --ctp-frappe-teal: #81c8be; - --ctp-frappe-teal-rgb: 129 200 190; - --ctp-frappe-teal-hsl: 171.549 39.227% 64.510%; - --ctp-frappe-sky: #99d1db; - --ctp-frappe-sky-rgb: 153 209 219; - --ctp-frappe-sky-hsl: 189.091 47.826% 72.941%; - --ctp-frappe-sapphire: #85c1dc; - --ctp-frappe-sapphire-rgb: 133 193 220; - --ctp-frappe-sapphire-hsl: 198.621 55.414% 69.216%; - --ctp-frappe-blue: #8caaee; - --ctp-frappe-blue-rgb: 140 170 238; - --ctp-frappe-blue-hsl: 221.633 74.242% 74.118%; - --ctp-frappe-lavender: #babbf1; - --ctp-frappe-lavender-rgb: 186 187 241; - --ctp-frappe-lavender-hsl: 238.909 66.265% 83.725%; - --ctp-frappe-text: #c6d0f5; - --ctp-frappe-text-rgb: 198 208 245; - --ctp-frappe-text-hsl: 227.234 70.149% 86.863%; - --ctp-frappe-subtext1: #b5bfe2; - --ctp-frappe-subtext1-rgb: 181 191 226; - --ctp-frappe-subtext1-hsl: 226.667 43.689% 79.804%; - --ctp-frappe-subtext0: #a5adce; - --ctp-frappe-subtext0-rgb: 165 173 206; - --ctp-frappe-subtext0-hsl: 228.293 29.496% 72.745%; - --ctp-frappe-overlay2: #949cbb; - --ctp-frappe-overlay2-rgb: 148 156 187; - --ctp-frappe-overlay2-hsl: 227.692 22.286% 65.686%; - --ctp-frappe-overlay1: #838ba7; - --ctp-frappe-overlay1-rgb: 131 139 167; - --ctp-frappe-overlay1-hsl: 226.667 16.981% 58.431%; - --ctp-frappe-overlay0: #737994; - --ctp-frappe-overlay0-rgb: 115 121 148; - --ctp-frappe-overlay0-hsl: 229.091 13.360% 51.569%; - --ctp-frappe-surface2: #626880; - --ctp-frappe-surface2-rgb: 98 104 128; - --ctp-frappe-surface2-hsl: 228.000 13.274% 44.314%; - --ctp-frappe-surface1: #51576d; - --ctp-frappe-surface1-rgb: 81 87 109; - --ctp-frappe-surface1-hsl: 227.143 14.737% 37.255%; - --ctp-frappe-surface0: #414559; - --ctp-frappe-surface0-rgb: 65 69 89; - --ctp-frappe-surface0-hsl: 230.000 15.584% 30.26%; - --ctp-frappe-base: #303446; - --ctp-frappe-base-rgb: 48 52 70; - --ctp-frappe-base-hsl: 229.091 18.644% 23.137%; - --ctp-frappe-mantle: #292c3c; - --ctp-frappe-mantle-rgb: 41 44 60; - --ctp-frappe-mantle-hsl: 230.526 18.812% 19.804%; - --ctp-frappe-crust: #232634; - --ctp-frappe-crust-rgb: 35 38 52; - --ctp-frappe-crust-hsl: 229.412 19.540% 17.059%; -} - -:root { - --ctp-macchiato-rosewater: #f4dbd6; - --ctp-macchiato-rosewater-rgb: 244 219 214; - --ctp-macchiato-rosewater-hsl: 10.000 57.692% 89.804%; - --ctp-macchiato-flamingo: #f0c6c6; - --ctp-macchiato-flamingo-rgb: 240 198 198; - --ctp-macchiato-flamingo-hsl: 0.000 58.333% 85.882%; - --ctp-macchiato-pink: #f5bde6; - --ctp-macchiato-pink-rgb: 245 189 230; - --ctp-macchiato-pink-hsl: 316.071 73.684% 85.098%; - --ctp-macchiato-mauve: #c6a0f6; - --ctp-macchiato-mauve-rgb: 198 160 246; - --ctp-macchiato-mauve-hsl: 266.512 82.692% 79.608%; - --ctp-macchiato-red: #ed8796; - --ctp-macchiato-red-rgb: 237 135 150; - --ctp-macchiato-red-hsl: 351.176 73.913% 72.941%; - --ctp-macchiato-maroon: #ee99a0; - --ctp-macchiato-maroon-rgb: 238 153 160; - --ctp-macchiato-maroon-hsl: 355.059 71.429% 76.667%; - --ctp-macchiato-peach: #f5a97f; - --ctp-macchiato-peach-rgb: 245 169 127; - --ctp-macchiato-peach-hsl: 21.356 85.507% 72.941%; - --ctp-macchiato-yellow: #eed49f; - --ctp-macchiato-yellow-rgb: 238 212 159; - --ctp-macchiato-yellow-hsl: 40.253 69.912% 77.843%; - --ctp-macchiato-green: #a6da95; - --ctp-macchiato-green-rgb: 166 218 149; - --ctp-macchiato-green-hsl: 105.217 48.252% 71.961%; - --ctp-macchiato-teal: #8bd5ca; - --ctp-macchiato-teal-rgb: 139 213 202; - --ctp-macchiato-teal-hsl: 171.081 46.835% 69.020%; - --ctp-macchiato-sky: #91d7e3; - --ctp-macchiato-sky-rgb: 145 215 227; - --ctp-macchiato-sky-hsl: 188.780 59.420% 72.941%; - --ctp-macchiato-sapphire: #7dc4e4; - --ctp-macchiato-sapphire-rgb: 125 196 228; - --ctp-macchiato-sapphire-hsl: 198.641 65.605% 69.216%; - --ctp-macchiato-blue: #8aadf4; - --ctp-macchiato-blue-rgb: 138 173 244; - --ctp-macchiato-blue-hsl: 220.189 82.813% 74.902%; - --ctp-macchiato-lavender: #b7bdf8; - --ctp-macchiato-lavender-rgb: 183 189 248; - --ctp-macchiato-lavender-hsl: 234.462 82.278% 84.510%; - --ctp-macchiato-text: #cad3f5; - --ctp-macchiato-text-rgb: 202 211 245; - --ctp-macchiato-text-hsl: 227.442 68.254% 87.647%; - --ctp-macchiato-subtext1: #b8c0e0; - --ctp-macchiato-subtext1-rgb: 184 192 224; - --ctp-macchiato-subtext1-hsl: 228.000 39.216% 80.000%; - --ctp-macchiato-subtext0: #a5adcb; - --ctp-macchiato-subtext0-rgb: 165 173 203; - --ctp-macchiato-subtext0-hsl: 227.368 26.761% 72.157%; - --ctp-macchiato-overlay2: #939ab7; - --ctp-macchiato-overlay2-rgb: 147 154 183; - --ctp-macchiato-overlay2-hsl: 228.333 20.000% 64.706%; - --ctp-macchiato-overlay1: #8087a2; - --ctp-macchiato-overlay1-rgb: 128 135 162; - --ctp-macchiato-overlay1-hsl: 227.647 15.455% 56.863%; - --ctp-macchiato-overlay0: #6e738d; - --ctp-macchiato-overlay0-rgb: 110 115 141; - --ctp-macchiato-overlay0-hsl: 230.323 12.351% 49.216%; - --ctp-macchiato-surface2: #5b6078; - --ctp-macchiato-surface2-rgb: 91 96 120; - --ctp-macchiato-surface2-hsl: 229.655 13.744% 41.373%; - --ctp-macchiato-surface1: #494d64; - --ctp-macchiato-surface1-rgb: 73 77 100; - --ctp-macchiato-surface1-hsl: 231.111 15.607% 33.922%; - --ctp-macchiato-surface0: #363a4f; - --ctp-macchiato-surface0-rgb: 54 58 79; - --ctp-macchiato-surface0-hsl: 230.400 18.797% 26.078%; - --ctp-macchiato-base: #24273a; - --ctp-macchiato-base-rgb: 36 39 58; - --ctp-macchiato-base-hsl: 231.818 23.404% 18.431%; - --ctp-macchiato-mantle: #1e2030; - --ctp-macchiato-mantle-rgb: 30 32 48; - --ctp-macchiato-mantle-hsl: 233.333 23.077% 15.294%; - --ctp-macchiato-crust: #181926; - --ctp-macchiato-crust-rgb: 24 25 38; - --ctp-macchiato-crust-hsl: 235.714 22.581% 12.157%; -} - -:root { - --ctp-mocha-rosewater: #f5e0dc; - --ctp-mocha-rosewater-rgb: 245 224 220; - --ctp-mocha-rosewater-hsl: 9.600 55.556% 91.176%; - --ctp-mocha-flamingo: #f2cdcd; - --ctp-mocha-flamingo-rgb: 242 205 205; - --ctp-mocha-flamingo-hsl: 0.000 58.730% 87.647%; - --ctp-mocha-pink: #f5c2e7; - --ctp-mocha-pink-rgb: 245 194 231; - --ctp-mocha-pink-hsl: 316.471 71.831% 86.078%; - --ctp-mocha-mauve: #cba6f7; - --ctp-mocha-mauve-rgb: 203 166 247; - --ctp-mocha-mauve-hsl: 267.407 83.505% 80.980%; - --ctp-mocha-red: #f38ba8; - --ctp-mocha-red-rgb: 243 139 168; - --ctp-mocha-red-hsl: 343.269 81.250% 74.902%; - --ctp-mocha-maroon: #eba0ac; - --ctp-mocha-maroon-rgb: 235 160 172; - --ctp-mocha-maroon-hsl: 350.400 65.217% 77.451%; - --ctp-mocha-peach: #fab387; - --ctp-mocha-peach-rgb: 250 179 135; - --ctp-mocha-peach-hsl: 22.957 92.000% 75.490%; - --ctp-mocha-yellow: #f9e2af; - --ctp-mocha-yellow-rgb: 249 226 175; - --ctp-mocha-yellow-hsl: 41.351 86.047% 83.137%; - --ctp-mocha-green: #a6e3a1; - --ctp-mocha-green-rgb: 166 227 161; - --ctp-mocha-green-hsl: 115.455 54.098% 76.078%; - --ctp-mocha-teal: #94e2d5; - --ctp-mocha-teal-rgb: 148 226 213; - --ctp-mocha-teal-hsl: 170.000 57.353% 73.333%; - --ctp-mocha-sky: #89dceb; - --ctp-mocha-sky-rgb: 137 220 235; - --ctp-mocha-sky-hsl: 189.184 71.014% 72.941%; - --ctp-mocha-sapphire: #74c7ec; - --ctp-mocha-sapphire-rgb: 116 199 236; - --ctp-mocha-sapphire-hsl: 198.500 75.949% 69.020%; - --ctp-mocha-blue: #89b4fa; - --ctp-mocha-blue-rgb: 137 180 250; - --ctp-mocha-blue-hsl: 217.168 91.870% 75.882%; - --ctp-mocha-lavender: #b4befe; - --ctp-mocha-lavender-rgb: 180 190 254; - --ctp-mocha-lavender-hsl: 231.892 97.368% 85.098%; - --ctp-mocha-text: #cdd6f4; - --ctp-mocha-text-rgb: 205 214 244; - --ctp-mocha-text-hsl: 226.154 63.934% 88.039%; - --ctp-mocha-subtext1: #bac2de; - --ctp-mocha-subtext1-rgb: 186 194 222; - --ctp-mocha-subtext1-hsl: 226.667 35.294% 80.000%; - --ctp-mocha-subtext0: #a6adc8; - --ctp-mocha-subtext0-rgb: 166 173 200; - --ctp-mocha-subtext0-hsl: 227.647 23.611% 71.765%; - --ctp-mocha-overlay2: #9399b2; - --ctp-mocha-overlay2-rgb: 147 153 178; - --ctp-mocha-overlay2-hsl: 228.387 16.757% 63.725%; - --ctp-mocha-overlay1: #7f849c; - --ctp-mocha-overlay1-rgb: 127 132 156; - --ctp-mocha-overlay1-hsl: 229.655 12.775% 55.490%; - --ctp-mocha-overlay0: #6c7086; - --ctp-mocha-overlay0-rgb: 108 112 134; - --ctp-mocha-overlay0-hsl: 230.769 10.744% 47.451%; - --ctp-mocha-surface2: #585b70; - --ctp-mocha-surface2-rgb: 88 91 112; - --ctp-mocha-surface2-hsl: 232.500 12.000% 39.216%; - --ctp-mocha-surface1: #45475a; - --ctp-mocha-surface1-rgb: 69 71 90; - --ctp-mocha-surface1-hsl: 234.286 13.208% 31.176%; - --ctp-mocha-surface0: #313244; - --ctp-mocha-surface0-rgb: 49 50 68; - --ctp-mocha-surface0-hsl: 236.842 16.239% 22.941%; - --ctp-mocha-base: #1e1e2e; - --ctp-mocha-base-rgb: 30 30 46; - --ctp-mocha-base-hsl: 240.000 21.053% 14.902%; - --ctp-mocha-mantle: #181825; - --ctp-mocha-mantle-rgb: 24 24 37; - --ctp-mocha-mantle-hsl: 240.000 21.311% 11.961%; - --ctp-mocha-crust: #11111b; - --ctp-mocha-crust-rgb: 17 17 27; - --ctp-mocha-crust-hsl: 240.000 22.727% 8.627%; -} - -:root { - --text: var(--ctp-mocha-text); - --subtext: var(--ctp-mocha-subtext0); - --surface: var(--ctp-mocha-surface0); - --background: var(--ctp-mocha-base); - --mantle: var(--ctp-mocha-mantle); - --crust: var(--ctp-mocha-crust); - --link: var(--ctp-mocha-blue); - - --nav-0: var(--ctp-mocha-peach); - --nav-1: var(--ctp-mocha-pink); - --nav-2: var(--ctp-mocha-mauve); - - --cover-size: 3.5rem; - --np-max-w: 32rem; - --np-max-h: 12rem; - - --nav-height: 4rem; - --nav-border: 0.6rem; - --nav-border-n: calc(var(--nav-border) * -1); - - --boop-animation: cubic-bezier(.8,.6,.3,.8); -} - -body.breadsite { - --site-color: var(--ctp-mocha-peach); -} -body.boop { - --site-color: var(--ctp-mocha-pink); -} -body.waf { - --site-color: var(--ctp-mocha-mauve); -} - -* { - font-family: 'Fredoka', sans-serif; - margin: 0; -} - -body { - display: flex; - flex-direction: column; - background-color: var(--background); - color: var(--text); - min-height: 100vh; -} - -a { - color: var(--link); - text-decoration: none; - - &:hover{ - text-decoration: underline dotted 3px; - color: var(--site-color) - } -} - -header { - z-index: 10; - position: sticky; - top: 0; - padding: 0 !important; - - display: flex; - flex-direction: row; - justify-content: space-between; -} - -main { - padding: 1rem; - flex-grow: 1; -} - -sub { - color: var(--subtext) !important; -} - -pawer { - display: inline-block; - background: var(--crust); - border-top-left-radius: 1rem; - border-top-right-radius: 1rem; - width: calc(100vw - 4rem); - padding: 2rem; - - display: flex; - flex-direction: row; - justify-content: space-between; - - ul { - list-style: none; - margin: auto; - } -} - - -.navBar { - display: flex; - flex-direction: row; - gap: 1rem; - z-index: 10; - - .navElement{ - min-width: 2rem; - - padding-top: 0.8rem; - padding-right: 1rem; - - height: 2rem; - margin-bottom: 0.2rem; - - color: var(--text); - text-decoration: none; - text-wrap-mode: nowrap; - - border-bottom-right-radius: 1rem; - - box-shadow: -2rem 0 var(--mantle); - background: var(--mantle); - - } - - .current { - color: var(--crust); - } - - #navElement-0 { - z-index: 13; - &:hover { - height: 2.2rem !important; - margin-bottom: 0 !important; - - position: relative; - - &::before { - content: ""; - position: absolute; - width: 100vw; - border: 0.12rem solid var(--nav-0); - bottom: 0; - right: 0.9rem; - } - - box-shadow: inset -0.2rem -0.2rem var(--nav-0), - -2rem 0 var(--crust); - background-color: var(--crust); - - &.current { - box-shadow: inset -0.2rem -0.2rem var(--nav-0), - -2rem 0 var(--nav-0); - } - } - &.current { - background-color: var(--nav-0); - box-shadow: -2rem 0 var(--nav-0); - } - } - - #navElement-1 { - z-index: 12; - &:hover { - height: 2.2rem !important; - margin-bottom: 0 !important; - - position: relative; - - &::before { - content: ""; - position: absolute; - width: 100vw; - border: 0.12rem solid var(--nav-1); - bottom: 0; - right: 0.9rem; - } - - box-shadow: inset -0.2rem -0.2rem var(--nav-1), - -2rem 0 var(--crust); - background-color: var(--crust); - - &.current { - box-shadow: inset -0.2rem -0.2rem var(--nav-1), - -2rem 0 var(--nav-1); - } - } - &.current { - background-color: var(--nav-1); - box-shadow: -2rem 0 var(--nav-1); - } - } - - #navElement-2 { - z-index: 11; - &:hover { - height: 2.2rem !important; - margin-bottom: 0 !important; - - position: relative; - - &::before { - content: ""; - position: absolute; - width: 100vw; - border: 0.12rem solid var(--nav-2); - bottom: 0; - right: 0.9rem; - } - - box-shadow: inset -0.2rem -0.2rem var(--nav-2), - -2rem 0 var(--crust); - background-color: var(--crust); - - &.current { - box-shadow: inset -0.2rem -0.2rem var(--nav-2), - -2rem 0 var(--nav-2); - } - } - &.current { - background-color: var(--nav-2); - box-shadow: -2rem 0 var(--nav-2); - } - } - - .first { - margin-left: 1rem; - } -} - -.nowPlaying { - &.loading { - height: 2rem; - width: 2rem; - padding-left: 1rem; - margin-bottom: 5.7rem; - } - - &:hover { - text-decoration: none !important; - box-shadow: -0.2rem 0.2rem var(--site-color); - background-color: var(--crust); - } - - - position: fixed; - top: 0; - right: 0; - - display: flex; - flex-direction: column; - gap: 0.25rem; - - padding: 0.5rem; - padding-right: 0.75rem; - - max-width: var(--np-max-w); - max-height: var(--np-max-h); - - color: var(--text); - text-wrap-mode: wrap; - overflow-wrap: anywhere; - overflow: hidden; - - border-bottom-left-radius: 1rem; - background: var(--mantle); - - h3 { - font-size: 0.8rem; - } - - .songInfo { - display: flex; - flex-direction: row; - gap: 0.5rem; - } - - p.recordingName { - font-size: 1.2rem; - } - - p.artistName { - font-size: 0.8rem; - } - - p.releaseName { - color: var(--subtext) !important; - font-size: 0.8rem; - } - - img.coverImg { - height: var(--cover-size); - width: var(--cover-size); - border-radius: 0.5rem; - font-size: 0.6rem; - background-color: var(--crust); - } -} - -.boop { - .button, .unboop { - position: absolute; - height: 16rem; - width: 16rem; - } - - .button { - background: url("neodog_boop_blep.webp") no-repeat scroll 0 0 transparent; - border: none; - background-size: 16rem 16rem; - opacity: 0; - &:active{ - animation: fadeIn 0.3s forwards; - animation-timing-function: var(--boop-animation); - animation-iteration-count: 1; - } - } - - &.stack { - position: relative; - height: 16rem; - width: 16rem; - } - - .unboop { - left: 18px; - opacity: 1; - &:has(~ button.boop:active){ - animation: fadeOut 0.3s forwards; - animation-timing-function: var(--boop-animation); - animation-iteration-count: 1; - } - } -} - -@media (hover: none) { - @keyframes spin { - to {transform:rotate(360deg);} - } - * { - animation: spin 10s linear infinite; - } -} - -@keyframes fadeIn { - 0% { opacity: 0; } - 100% { opacity: 1; } -} - -@keyframes fadeOut { - 0% { opacity: 1; } - 100% { opacity: 0; } -}