Add navbar

This commit is contained in:
2026-05-25 15:44:27 -05:00
parent def69c430a
commit e60a4c4d57
15 changed files with 308 additions and 129 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 39 KiB

BIN
public/gwaa_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1,5 +1,14 @@
<script setup>
<script>
import { defineComponent } from "vue";
import { RouterView } from "vue-router";
import NavBar from "@/components/NavBar.vue";
export default defineComponent({
components: {
NavBar,
}
});
</script>
<template>
@@ -8,6 +17,8 @@ import { RouterView } from "vue-router";
</div>
</header>
<NavBar />
<RouterView />
</template>

View File

@@ -1,4 +1,4 @@
#app {
.mw-60 {
max-width: 60rem;
margin: 0 auto;
}
@@ -8,8 +8,11 @@
margin: 0 auto;
}
.center {
.block {
display: block;
}
.center {
margin: 0 auto;
}

View File

@@ -0,0 +1,22 @@
<script>
import { defineComponent } from "vue";
import settingsDisplay from "@/data/settings-display.yaml";
export default defineComponent({
props: {
generator: "",
},
computed: {
display() {
return settingsDisplay.randomizer_generator[this.generator];
}
},
});
</script>
<template>
<span v-if="display">
{{ display }}
</span>
</template>

View File

@@ -109,7 +109,7 @@ export default defineComponent({
</div>
</div>
<div v-else>
<img class="center" src="/bludormspinbig.gif" />
<img class="block center" src="/bludormspinbig.gif" />
</div>
</div>
</template>

99
src/components/NavBar.vue Normal file
View File

@@ -0,0 +1,99 @@
<script>
import { defineComponent } from "vue";
import { Collapse } from "bootstrap";
export default defineComponent({
data() {
return {
navbar: null,
};
},
async mounted() {
this.navbar = Collapse.getOrCreateInstance(this.$refs.navbar, {toggle: false});
},
methods: {
collapse() {
this.navbar.hide();
},
},
});
</script>
<template>
<nav class="navbar navbar-expand-sm bg-dark-subtle pt-1 px-2">
<div class="container-fluid px-1">
<a class="navbar-brand ps-1 py-0 me-2">
<img class="brand-logo" src="/gwaa_logo.png" />
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle Navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div id="navbar" class="collapse navbar-collapse" ref="navbar">
<ul class="navbar-nav center">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Seed
</a>
<ul class="dropdown-menu">
<li>
<router-link to="/generate" class="dropdown-item" @click="collapse">
Base Randomizer
</router-link>
</li>
<li>
<router-link to="/generate/beta" class="dropdown-item" @click="collapse">
Beta Randomizer
</router-link>
</li>
<li>
<router-link to="/generate/apr2025" class="dropdown-item" @click="collapse">
April 2025 Randomizer
</router-link>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Multiworld
</a>
<ul class="dropdown-menu">
<li>
<router-link to="/multiworld" class="dropdown-item" @click="collapse">
Base Randomizer
</router-link>
</li>
<li>
<router-link to="/multiworld/beta" class="dropdown-item" @click="collapse">
Beta Randomizer
</router-link>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Mystery
</a>
<ul class="dropdown-menu">
<li>
<router-link to="/mystery" class="dropdown-item" @click="collapse">
Base Randomizer
</router-link>
</li>
<li>
<router-link to="/mystery/beta" class="dropdown-item" @click="collapse">
Beta Randomizer
</router-link>
</li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</template>
<style>
.brand-logo {
height: 28px;
}
</style>

View File

@@ -291,7 +291,7 @@ export default defineComponent({
</div>
</div>
<div v-else>
<img class="center" src="/bludormspinbig.gif" />
<img class="block center" src="/bludormspinbig.gif" />
</div>
</div>
<div v-if="patch && spoiler && show_spoiler" class="mw-60">

View File

@@ -27,6 +27,9 @@ export default defineComponent({
this.selected = newValue;
await this.updateLocalForage();
},
async generator(newValue, oldValue) {
await this.loadSaved(true);
},
},
computed: {
settings() {
@@ -47,17 +50,7 @@ export default defineComponent({
},
async mounted() {
this.$refs.tips?.forEach(el => new Tooltip(el));
if (this.settings) {
const saved = await localforage.getItem(`${this.prefix}setting_${this.name}`) ?? this.settings.default;
if (this.modelValue) {
this.selected = this.modelValue;
} else if (this.settings.values[saved]) {
this.selected = saved;
} else {
this.selected = this.settings.default;
}
this.change();
}
await this.loadSaved(false);
},
methods: {
async change() {
@@ -67,6 +60,19 @@ export default defineComponent({
async updateLocalForage() {
await localforage.setItem(`${this.prefix}setting_${this.name}`, this.selected);
},
async loadSaved(override) {
if (this.settings) {
const saved = await localforage.getItem(`${this.prefix}setting_${this.name}`) ?? this.settings.default;
if (this.modelValue && !override) {
this.selected = this.modelValue;
} else if (this.settings.values[saved]) {
this.selected = saved;
} else {
this.selected = this.settings.default;
}
this.change();
}
},
},
});
</script>

View File

@@ -53,7 +53,19 @@ export default defineComponent({
this.$emit("update:modelValue", this.set);
},
deep: true,
},
async generator(newValue, oldValue) {
for (const setting of Object.keys(this.set)) {
if (setting == "player_name") {
continue;
}
if (!(setting in this.settings)) {
delete this.set[setting];
}
}
this.$refs.preset.settingChanged(this.set);
},
},
methods: {
...mapActions(usePresetStore, ["fetchLocalPresets"]),

View File

@@ -1,3 +1,7 @@
randomizer_generator:
beta: Beta Randomizer
apr2025: April 2025 Special Randomizer
pikit: Special Pikit Randomizer
randomizer:
apr2025: April 2025 Special Randomizer
pikit: Special Pikit Randomizer

View File

@@ -4,10 +4,12 @@ import { defineComponent } from "vue";
import axios from "axios";
import SettingPicker from "@/components/SettingPicker.vue";
import GeneratorName from "@/components/GeneratorName.vue";
export default defineComponent({
components: {
SettingPicker,
GeneratorName,
},
data() {
return {
@@ -41,9 +43,11 @@ export default defineComponent({
</script>
<template>
<div class="mw-60">
<div class="card content-div m-3">
<div class="card-header">
Generate Seed
<GeneratorName generator="apr2025" class="float-right" />
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
@@ -77,4 +81,5 @@ export default defineComponent({
</div>
</div>
</div>
</div>
</template>

View File

@@ -6,10 +6,12 @@ import localforage from "localforage";
import { Tab } from "bootstrap";
import SettingsPage from "@/components/SettingsPage.vue";
import GeneratorName from "@/components/GeneratorName.vue";
export default defineComponent({
components: {
SettingsPage,
GeneratorName,
},
props: {
prefix: null,
@@ -24,14 +26,25 @@ export default defineComponent({
async mounted() {
document.title = "ALttPR Multiworld"
await new Promise(r => setTimeout(r, 100));
for (var i = 0; i < this.worldCount; i++) {
this.worlds[i].player_name = await localforage.getItem(`${this.prefix}world_${i + 1}_setting_player_name`);
new Tab(this.$refs.tabs[i]);
}
await new Promise(r => setTimeout(r, 100));
await this.loadPlayerNames();
},
watch: {
async generator(oldValue, newValue) {
await this.loadPlayerNames();
},
},
methods: {
async loadPlayerNames() {
for (var i = 0; i < this.worldCount; i++) {
this.worlds[i].player_name = await localforage.getItem(`${this.prefix}world_${i + 1}_setting_player_name`);
}
},
async addWorld() {
const newname = await localforage.getItem(`${this.prefix}world_${this.worldCount + 1}_setting_player_name`);
this.worlds.push({player_name: newname});
@@ -82,9 +95,11 @@ export default defineComponent({
</script>
<template>
<div class="mw-60">
<div class="card content-div m-3">
<div class="card-header">
Generate Multiworld
<GeneratorName :generator="generator" class="float-right" />
</div>
<ul class="nav nav-tabs ps-3 pt-3 pe-3">
<li v-for="(n, idx) in worldCount" class="nav-item" role="presentation">
@@ -138,6 +153,7 @@ export default defineComponent({
</div>
</div>
</div>
</div>
</template>
<style>

View File

@@ -10,9 +10,12 @@ import generatorSettings from "@/data/generator-settings.yaml";
import VueMarkdown from "vue-markdown-render";
import GeneratorName from "@/components/GeneratorName.vue";
export default defineComponent({
components: {
VueMarkdown,
GeneratorName,
},
props: {
prefix: null,
@@ -135,11 +138,12 @@ export default defineComponent({
<div class="card content-div m-3">
<div class="card-header">
Generate Mystery Seed
<GeneratorName :generator="generator" class="float-right" />
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
Upload Mystery YAML:
<a class="example-yaml-link" href="/sample_mystery.yaml">(example)</a>
<a class="float-right" href="/sample_mystery.yaml">(example)</a>
<div class="input-group mt-2 mb-2">
<input id="yaml-input" class="form-control" type="file" accept=".yaml,.yml" @change="uploadYaml($event.target.files[0], true)" />
</div>
@@ -164,11 +168,3 @@ export default defineComponent({
</div>
</div>
</template>
<style>
.example-yaml-link {
position: absolute;
right: 0;
padding-right: var(--bs-list-group-item-padding-x);
}
</style>

View File

@@ -5,10 +5,12 @@ import axios from "axios";
import { Modal } from "bootstrap";
import SettingsPage from "@/components/SettingsPage.vue";
import GeneratorName from "@/components/GeneratorName.vue";
export default defineComponent({
components: {
SettingsPage,
GeneratorName,
},
props: {
prefix: null,
@@ -45,9 +47,11 @@ export default defineComponent({
</script>
<template>
<div class="mw-60">
<div class="card content-div m-3">
<div class="card-header">
Generate Seed
<GeneratorName :generator="generator" class="float-right" />
</div>
<div id="settings" class="accordion accordion-flush">
<SettingsPage v-model="set" :generator="generator" :prefix="prefix" />
@@ -65,4 +69,5 @@ export default defineComponent({
</div>
</div>
</div>
</div>
</template>