responsive app menu

This commit is contained in:
metacryst
2025-10-29 16:03:47 -05:00
parent 6d46875546
commit 0e36cd30cc
8 changed files with 104 additions and 76 deletions

View File

@@ -34,16 +34,6 @@ func main() {
} }
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// Keeps server from crashing if a request fails
// defer func() {
// if r := recover(); r != nil {
// log.Error().
// Interface("panic_reason", r).
// Bytes("stack_trace", debug.Stack()).
// Msg("panic in http goroutine")
// }
// }()
if(loggedIn(w, r)) { if(loggedIn(w, r)) {
log.Info().Msg("logged") log.Info().Msg("logged")
if isWebSocketRequest(r) { if isWebSocketRequest(r) {
@@ -106,7 +96,8 @@ func handleSite(w http.ResponseWriter, r *http.Request) {
handlers.HandleLogout(w, r) handlers.HandleLogout(w, r)
return return
} }
if strings.HasPrefix(r.URL.Path, "/_") { if strings.Contains(r.URL.Path, "/_") {
log.Debug().Msg("this is what it is")
handleAsset(w, r) handleAsset(w, r)
return return
} }
@@ -117,8 +108,10 @@ func handleSite(w http.ResponseWriter, r *http.Request) {
func serveSiteFiles(w http.ResponseWriter, r *http.Request) { func serveSiteFiles(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path path := r.URL.Path
if path == "/" { if(strings.Contains(path, "75820185")) {
_, after, _ := strings.Cut(path, "75820185")
path = after
} else {
// Required for sign in / sign out redirect to work properly // Required for sign in / sign out redirect to work properly
w.Header().Set("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate") w.Header().Set("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate")
w.Header().Set("Pragma", "no-cache") w.Header().Set("Pragma", "no-cache")
@@ -126,8 +119,6 @@ func serveSiteFiles(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Surrogate-Control", "no-store") w.Header().Set("Surrogate-Control", "no-store")
path = "/index.html" path = "/index.html"
} else if !strings.Contains(path, ".") {
path = filepath.Join("/pages", path) + ".html"
} }
filePath := filepath.Join("../ui/site", path) filePath := filepath.Join("../ui/site", path)
@@ -136,8 +127,8 @@ func serveSiteFiles(w http.ResponseWriter, r *http.Request) {
} }
func handleAsset(w http.ResponseWriter, r *http.Request) { func handleAsset(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path _, after, _ := strings.Cut(r.URL.Path, "/_")
filePath := filepath.Join("../ui", path) filePath := filepath.Join("../ui", "/_" + after)
log.Debug().Msgf("serving asset: %s", filePath) log.Debug().Msgf("serving asset: %s", filePath)
http.ServeFile(w, r, filePath) http.ServeFile(w, r, filePath)
} }

View File

@@ -1,3 +1,9 @@
/* $ NAVIGATION */
window.navigateTo = function(url) {
window.history.pushState({}, '', url);
}
/* $ SELECTOR */ /* $ SELECTOR */
HTMLElement.prototype.$ = function(selector) { HTMLElement.prototype.$ = function(selector) {
@@ -761,6 +767,5 @@ HTMLElement.prototype.attr = function(attributes) {
for (const [key, value] of Object.entries(attributes)) { for (const [key, value] of Object.entries(attributes)) {
this.setAttribute(key, value); this.setAttribute(key, value);
} }
console.log(this)
return this; return this;
}; };

View File

@@ -1,3 +1,7 @@
css(`
`)
class Market extends Shadow { class Market extends Shadow {
render() { render() {
@@ -11,6 +15,7 @@ class Market extends Shadow {
.border("1px solid var(--accent)") .border("1px solid var(--accent)")
.outline("none") .outline("none")
.color("var(--accent)") .color("var(--accent)")
.borderRadius(10, px)
button("Search") button("Search")
}) })
.x(50, vw).y(5, vh) .x(50, vw).y(5, vh)

View File

@@ -3,7 +3,7 @@ css(`
color: var(--tan); color: var(--tan);
transform: translateX(-50%); transform: translateX(-50%);
transition: transform .3s; transition: transform .3s;
display: flex; gap: 2em; position: fixed; left: 50vw; bottom: 3em; display: flex; gap: 2em; position: fixed; left: 50vw; bottom: 2em;
} }
app-menu.minimized { app-menu.minimized {
@@ -37,17 +37,64 @@ css(`
text-decoration: underline; text-decoration: underline;
transform: translateY(-10%) transform: translateY(-10%)
} }
#divider.minimized {
display: none;
}
`) `)
registerShadow( registerShadow(
class AppMenu extends Shadow { class AppMenu extends Shadow {
selected;
constructor(selected) {
super()
this.selected = selected
}
render() { render() {
VStack(() => {
HStack(() => {
p("Forum") p("Forum")
p("Messages") p("Messages")
p("Market") p("Market")
})
.justifyContent("center")
.gap("1.5em")
img("_/images/divider.svg", "40vw")
.attr({
"id": "divider",
})
})
.gap("0.5em")
if(this.selected) {
this.styleMinimized()
} }
}
styleMaximized() {
$$("app-menu p").forEach((el) => {
el.classList.remove("selected")
})
this.classList.remove("minimized")
$("#divider").style.display = ""
}
styleMinimized() {
$$("app-menu p").forEach((el) => {
if(el.innerText !== this.selected) {
el.classList.remove("selected")
} else {
el.classList.add("selected")
}
})
this.classList.add("minimized")
$("#divider").style.display = "none"
}
connectedCallback() { connectedCallback() {
Array.from(this.querySelectorAll("p")).forEach((el) => { Array.from(this.querySelectorAll("p")).forEach((el) => {
@@ -60,22 +107,18 @@ class AppMenu extends Shadow {
if(!target.matches("app-menu p")) { if(!target.matches("app-menu p")) {
return return
} }
$$("app-menu p").forEach((el) => {
if(el.innerText !== target.innerText) {
el.classList.remove("selected")
}
})
target.classList.remove("touched") target.classList.remove("touched")
if(target.classList.contains("selected")) { if(target.classList.contains("selected")) {
target.classList.remove("selected") this.selected = ""
$("app-menu").classList.remove("minimized") this.styleMaximized(target)
$("#divider").classList.remove("minimized") window.navigateTo("/")
$("app-window").close() $("app-window").close()
} else { } else {
target.classList.add("selected") this.selected = target.innerText
$("app-menu").classList.add("minimized") this.styleMinimized(target)
$("#divider").classList.add("minimized") window.navigateTo("/app/" + target.innerText.toLowerCase())
$("app-window").open(target.innerText) $("app-window").open(target.innerText)
} }
}) })

View File

@@ -5,6 +5,11 @@ import "../apps/Market.js"
class AppWindow extends Shadow { class AppWindow extends Shadow {
app; app;
constructor(app) {
super()
this.app = app
}
render() { render() {
ZStack(() => { ZStack(() => {
console.log("happening") console.log("happening")

View File

@@ -4,12 +4,6 @@ import "./ProfileButton.js"
import "./InputBox.js" import "./InputBox.js"
import "./Sidebar.js" import "./Sidebar.js"
css(`
#divider.minimized {
display: none;
}
`)
class Home extends Shadow { class Home extends Shadow {
render() { render() {
@@ -23,7 +17,24 @@ class Home extends Shadow {
.backgroundPosition("48% 65%") .backgroundPosition("48% 65%")
.backgroundRepeat("no-repeat") .backgroundRepeat("no-repeat")
switch(window.location.pathname) {
case "/":
AppWindow() AppWindow()
AppMenu()
break
case "/app/forum":
AppWindow("Forum")
AppMenu("Forum")
break;
case "/app/messages":
AppWindow("Messages")
AppMenu("Messages")
break;
case "/app/market":
AppWindow("Market")
AppMenu("Market")
break;
}
ProfileButton() ProfileButton()
.zIndex(1) .zIndex(1)
@@ -44,15 +55,6 @@ class Home extends Shadow {
.background("var(--tan)") .background("var(--tan)")
.color("var(--red)") .color("var(--red)")
.borderRadius(5, px) .borderRadius(5, px)
AppMenu()
img("_/images/divider.svg", "40vw")
.attr({"id": "divider"})
.position("fixed")
.bottom("2em")
.left("50vw")
.transform("translateX(-50%)")
}) })
} }

View File

@@ -3,10 +3,10 @@
<head> <head>
<title>Hyperia</title> <title>Hyperia</title>
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="_/icons/logo.svg"> <link rel="icon" href="/_/icons/logo.svg">
<link rel="stylesheet" href="_/code/shared.css"> <link rel="stylesheet" href="/_/code/shared.css">
<script src="_/code/quill.js"></script> <script src="/_/code/quill.js"></script>
<script type="module" src="index.js"></script> <script type="module" src="75820185/index.js"></script>
</head> </head>
<body style="margin: 0px"> <body style="margin: 0px">
</body> </body>

View File

@@ -1,23 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hyperia</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="_/icons/logo.svg">
<link rel="stylesheet" href="_/code/shared.css">
<script src="_/code/quill.js"></script>
<script type="module">
import "./components/ProfileButton.js"
import "./components/InputBox.js"
import "./components/Sidebar.js"
import ConnectionHandler from "./ws/ConnectionHandler.js"
window.ConnectionHandler = new ConnectionHandler()
</script>
</head>
<body>
<profile-button style="z-index: 1; cursor: default; position: fixed; top: 5.5vh; right: 4.5vw"></profile-button>
<input-box></input-box>
<side-bar></side-bar>
</body>
</html>