Implemented Dark Mode and revised Nav Bar
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
[
|
[
|
||||||
{ "name": "Home", "path": "/" },
|
{ "name": "Home", "path": "/" },
|
||||||
{ "name": "Exams", "path": "/exams.html" },
|
{ "name": "Exams", "path": "/exams.html" },
|
||||||
{ "name": "Net Check-Ins", "path": "/net/index.html" },
|
{ "name": "Net Check-Ins", "path": "/net/" },
|
||||||
{ "name": "Meshtastic", "path": "/mesh/index.html" },
|
{ "name": "Meshtastic", "path": "/mesh/" },
|
||||||
{ "name": "History", "path": "/history.html" }
|
{ "name": "History", "path": "/history.html" }
|
||||||
]
|
]
|
||||||
|
55
index.html
55
index.html
@@ -1,12 +1,16 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en" class="dark">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>BYU-Idaho Amateur Radio Society</title>
|
<title>BYU-Idaho Amateur Radio Society</title>
|
||||||
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@3.4.1/base.min.css" rel="stylesheet">
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
|
|
||||||
<script src="https://cdn.tailwindcss.com"></script>
|
<script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
<script>
|
||||||
|
tailwind.config = {
|
||||||
|
darkMode: 'class'
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
|
||||||
<script>
|
<script>
|
||||||
// Dark mode persistence
|
// Dark mode persistence
|
||||||
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
||||||
@@ -30,24 +34,45 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<!-- Navbar -->
|
<!-- Navbar -->
|
||||||
<nav class="accent-bg text-white px-4 py-3 flex justify-between items-center shadow-md">
|
<nav class="accent-bg text-white px-4 py-3 shadow-md" x-data="{ open: false }">
|
||||||
<a href="/" class="text-xl font-semibold">BYUIARS</a>
|
<div class="flex flex-wrap items-center justify-between">
|
||||||
<ul class="flex space-x-4">
|
<a href="/" class="text-xl font-semibold mr-4">BYUIARS</a>
|
||||||
|
<button @click="open = !open" class="sm:hidden text-white ml-auto focus:outline-none">
|
||||||
|
<svg x-show="!open" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||||
|
</svg>
|
||||||
|
<svg x-show="open" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<div class="hidden sm:flex flex-grow justify-center space-x-4">
|
||||||
<template x-for="page in pages" :key="page.path">
|
<template x-for="page in pages" :key="page.path">
|
||||||
<li>
|
<a :href="page.path" :class="{ 'font-bold underline': currentPath === page.path }" class="hover:opacity-80 transition">
|
||||||
<a :href="page.path"
|
|
||||||
:class="{ 'font-bold underline': currentPath === page.path }"
|
|
||||||
class="hover:opacity-80 transition">
|
|
||||||
<span x-text="page.name"></span>
|
<span x-text="page.name"></span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
|
||||||
</template>
|
</template>
|
||||||
</ul>
|
</div>
|
||||||
<!-- Dark mode toggle -->
|
<div class="hidden sm:flex ml-auto">
|
||||||
<button @click="toggleDarkMode" class="ml-4 text-white focus:outline-none" title="Toggle dark mode">
|
<button @click="toggleDarkMode" class="ml-4 text-white focus:outline-none" title="Toggle dark mode">
|
||||||
<svg x-show="!darkMode" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m8.66-8.66h-1M4.34 12H3m15.36 6.36l-.71-.71M6.34 6.34l-.71-.71m12.02 0l-.71.71M6.34 17.66l-.71.71M12 5a7 7 0 100 14 7 7 0 000-14z" /></svg>
|
<svg x-show="!darkMode" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
<svg x-show="darkMode" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12.79A9 9 0 1111.21 3a7 7 0 009.79 9.79z" /></svg>
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m8.66-8.66h-1M4.34 12H3m15.36 6.36l-.71-.71M6.34 6.34l-.71-.71m12.02 0l-.71.71M6.34 17.66l-.71.71M12 5a7 7 0 100 14 7 7 0 000-14z" />
|
||||||
|
</svg>
|
||||||
|
<svg x-show="darkMode" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12.79A9 9 0 1111.21 3a7 7 0 009.79 9.79z" />
|
||||||
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div x-show="open" class="sm:hidden mt-2 space-y-2">
|
||||||
|
<template x-for="page in pages" :key="page.path">
|
||||||
|
<a :href="page.path" :class="{ 'font-bold underline': currentPath === page.path }" class="block px-2 py-1 hover:bg-white/10">
|
||||||
|
<span x-text="page.name"></span>
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
<button @click="toggleDarkMode" class="w-full text-left px-2 py-1 text-white hover:bg-white/10" title="Toggle dark mode">
|
||||||
|
<span x-text="darkMode ? '☀️ Light Mode' : '🌙 Dark Mode'"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<!-- Main Content -->
|
<!-- Main Content -->
|
||||||
|
132
mesh/index.html
Normal file
132
mesh/index.html
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Mesh Project – BYUIARS</title>
|
||||||
|
<script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
<script>
|
||||||
|
tailwind.config = {
|
||||||
|
darkMode: 'class'
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
||||||
|
document.documentElement.classList.add('dark')
|
||||||
|
} else {
|
||||||
|
document.documentElement.classList.remove('dark')
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
|
||||||
|
<style>
|
||||||
|
.accent-bg { background-color: #006eb6; }
|
||||||
|
.banner-bg { background-color: #a2daff; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="bg-white dark:bg-gray-900 text-gray-800 dark:text-gray-100 min-h-screen flex flex-col" x-data="appData()" x-init="init()">
|
||||||
|
|
||||||
|
<!-- Banner -->
|
||||||
|
<template x-if="banner.title && banner.content">
|
||||||
|
<div class="w-full banner-bg text-black text-center py-2 px-4">
|
||||||
|
<strong x-text="banner.title"></strong>: <span x-text="banner.content"></span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<!-- Navbar -->
|
||||||
|
<nav class="accent-bg text-white px-4 py-3 shadow-md" x-data="{ open: false }">
|
||||||
|
<div class="flex flex-wrap items-center justify-between">
|
||||||
|
<a href="/" class="text-xl font-semibold mr-4">BYUIARS</a>
|
||||||
|
<button @click="open = !open" class="sm:hidden text-white ml-auto focus:outline-none">
|
||||||
|
<svg x-show="!open" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||||
|
</svg>
|
||||||
|
<svg x-show="open" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<div class="hidden sm:flex flex-grow justify-center space-x-4">
|
||||||
|
<template x-for="page in pages" :key="page.path">
|
||||||
|
<a :href="page.path" :class="{ 'font-bold underline': currentPath === page.path }" class="hover:opacity-80 transition">
|
||||||
|
<span x-text="page.name"></span>
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<div class="hidden sm:flex ml-auto">
|
||||||
|
<button @click="toggleDarkMode" class="ml-4 text-white focus:outline-none" title="Toggle dark mode">
|
||||||
|
<svg x-show="!darkMode" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m8.66-8.66h-1M4.34 12H3m15.36 6.36l-.71-.71M6.34 6.34l-.71-.71m12.02 0l-.71.71M6.34 17.66l-.71.71M12 5a7 7 0 100 14 7 7 0 000-14z" />
|
||||||
|
</svg>
|
||||||
|
<svg x-show="darkMode" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12.79A9 9 0 1111.21 3a7 7 0 009.79 9.79z" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div x-show="open" class="sm:hidden mt-2 space-y-2">
|
||||||
|
<template x-for="page in pages" :key="page.path">
|
||||||
|
<a :href="page.path" :class="{ 'font-bold underline': currentPath === page.path }" class="block px-2 py-1 hover:bg-white/10">
|
||||||
|
<span x-text="page.name"></span>
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
<button @click="toggleDarkMode" class="w-full text-left px-2 py-1 text-white hover:bg-white/10" title="Toggle dark mode">
|
||||||
|
<span x-text="darkMode ? '☀️ Light Mode' : '🌙 Dark Mode'"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main class="flex-grow p-6">
|
||||||
|
<h1 class="text-3xl font-bold mb-4">Rexburg Meshtastic Network</h1>
|
||||||
|
|
||||||
|
<p class="mb-4">
|
||||||
|
The BYUIARS-sponsored Rexburg Meshtastic network is a low-power, long-range mesh radio network using LoRa devices to support off-grid communication. It is open to community participation and ideal for emergency scenarios and experimentation.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold mt-6 mb-2">Current Node Map</h2>
|
||||||
|
<div class="aspect-w-16 aspect-h-9 mb-4">
|
||||||
|
<iframe
|
||||||
|
src="https://www.google.com/maps/d/embed?mid=YOUR_MYMAPS_ID_HERE"
|
||||||
|
width="100%"
|
||||||
|
height="480"
|
||||||
|
class="w-full rounded shadow-md"
|
||||||
|
loading="lazy"
|
||||||
|
allowfullscreen>
|
||||||
|
</iframe>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 class="text-xl font-semibold mt-6 mb-2">How to Get Involved</h2>
|
||||||
|
<ul class="list-disc pl-6 space-y-2">
|
||||||
|
<li>Purchase a supported LoRa radio (we recommend the TTGO T-Beam v1.1)</li>
|
||||||
|
<li>Flash the latest <a href="https://meshtastic.org/" class="text-blue-400 underline">Meshtastic firmware</a></li>
|
||||||
|
<li>Join our <a href="https://discord.gg/YOUR_DISCORD_INVITE" class="text-blue-400 underline">Discord</a> to get help, share your setup, and connect</li>
|
||||||
|
<li>Place your node on the map by submitting your info</li>
|
||||||
|
</ul>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="accent-bg text-white text-center py-4">
|
||||||
|
© <span x-text="new Date().getFullYear()"></span> BYU-Idaho Amateur Radio Society. All rights reserved.
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function appData() {
|
||||||
|
return {
|
||||||
|
darkMode: document.documentElement.classList.contains('dark'),
|
||||||
|
currentPath: window.location.pathname,
|
||||||
|
banner: { title: '', content: '' },
|
||||||
|
pages: [],
|
||||||
|
async init() {
|
||||||
|
const navResp = await fetch('/assets/pages.json');
|
||||||
|
this.pages = await navResp.json();
|
||||||
|
|
||||||
|
const bannerResp = await fetch('/assets/banner.json');
|
||||||
|
this.banner = await bannerResp.json();
|
||||||
|
},
|
||||||
|
toggleDarkMode() {
|
||||||
|
this.darkMode = !this.darkMode;
|
||||||
|
document.documentElement.classList.toggle('dark');
|
||||||
|
localStorage.theme = this.darkMode ? 'dark' : 'light';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
146
net/index.html
Normal file
146
net/index.html
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Net Check-Ins – BYUIARS</title>
|
||||||
|
<script src="https://cdn.tailwindcss.com"></script>
|
||||||
|
<script>
|
||||||
|
tailwind.config = {
|
||||||
|
darkMode: 'class'
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
||||||
|
document.documentElement.classList.add('dark')
|
||||||
|
} else {
|
||||||
|
document.documentElement.classList.remove('dark')
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
|
||||||
|
<style>
|
||||||
|
.accent-bg { background-color: #006eb6; }
|
||||||
|
.banner-bg { background-color: #a2daff; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="bg-white dark:bg-gray-900 text-gray-800 dark:text-gray-100 min-h-screen flex flex-col" x-data="appData()" x-init="init()">
|
||||||
|
|
||||||
|
<!-- Banner -->
|
||||||
|
<template x-if="banner.title && banner.content">
|
||||||
|
<div class="w-full banner-bg text-black text-center py-2 px-4">
|
||||||
|
<strong x-text="banner.title"></strong>: <span x-text="banner.content"></span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<!-- Navbar -->
|
||||||
|
<nav class="accent-bg text-white px-4 py-3 shadow-md" x-data="{ open: false }">
|
||||||
|
<div class="flex flex-wrap items-center justify-between">
|
||||||
|
<a href="/" class="text-xl font-semibold mr-4">BYUIARS</a>
|
||||||
|
<button @click="open = !open" class="sm:hidden text-white ml-auto focus:outline-none">
|
||||||
|
<svg x-show="!open" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
||||||
|
</svg>
|
||||||
|
<svg x-show="open" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<div class="hidden sm:flex flex-grow justify-center space-x-4">
|
||||||
|
<template x-for="page in pages" :key="page.path">
|
||||||
|
<a :href="page.path" :class="{ 'font-bold underline': currentPath === page.path }" class="hover:opacity-80 transition">
|
||||||
|
<span x-text="page.name"></span>
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<div class="hidden sm:flex ml-auto">
|
||||||
|
<button @click="toggleDarkMode" class="ml-4 text-white focus:outline-none" title="Toggle dark mode">
|
||||||
|
<svg x-show="!darkMode" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m8.66-8.66h-1M4.34 12H3m15.36 6.36l-.71-.71M6.34 6.34l-.71-.71m12.02 0l-.71.71M6.34 17.66l-.71.71M12 5a7 7 0 100 14 7 7 0 000-14z" />
|
||||||
|
</svg>
|
||||||
|
<svg x-show="darkMode" xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12.79A9 9 0 1111.21 3a7 7 0 009.79 9.79z" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div x-show="open" class="sm:hidden mt-2 space-y-2">
|
||||||
|
<template x-for="page in pages" :key="page.path">
|
||||||
|
<a :href="page.path" :class="{ 'font-bold underline': currentPath === page.path }" class="block px-2 py-1 hover:bg-white/10">
|
||||||
|
<span x-text="page.name"></span>
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
<button @click="toggleDarkMode" class="w-full text-left px-2 py-1 text-white hover:bg-white/10" title="Toggle dark mode">
|
||||||
|
<span x-text="darkMode ? '☀️ Light Mode' : '🌙 Dark Mode'"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<main class="flex-grow p-6">
|
||||||
|
<h1 class="text-3xl font-bold mb-4">Weekly Net Check-Ins</h1>
|
||||||
|
|
||||||
|
<div x-data="netStats()" x-init="load()">
|
||||||
|
<template x-if="weekly.length">
|
||||||
|
<div class="mb-6">
|
||||||
|
<h2 class="text-xl font-semibold mb-2">Check-Ins Per Week</h2>
|
||||||
|
<ul class="space-y-1">
|
||||||
|
<template x-for="week in weekly" :key="week.date">
|
||||||
|
<li>
|
||||||
|
<span x-text="week.date"></span>: <strong x-text="week.count"></strong> check-ins
|
||||||
|
</li>
|
||||||
|
</template>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template x-if="callsigns.length">
|
||||||
|
<div>
|
||||||
|
<h2 class="text-xl font-semibold mb-2">Callsigns That Have Checked In</h2>
|
||||||
|
<ul class="columns-2 sm:columns-3 md:columns-4">
|
||||||
|
<template x-for="call in callsigns" :key="call">
|
||||||
|
<li x-text="call"></li>
|
||||||
|
</template>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="accent-bg text-white text-center py-4">
|
||||||
|
© <span x-text="new Date().getFullYear()"></span> BYU-Idaho Amateur Radio Society. All rights reserved.
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function appData() {
|
||||||
|
return {
|
||||||
|
darkMode: document.documentElement.classList.contains('dark'),
|
||||||
|
currentPath: window.location.pathname,
|
||||||
|
banner: { title: '', content: '' },
|
||||||
|
pages: [],
|
||||||
|
async init() {
|
||||||
|
const navResp = await fetch('/assets/pages.json');
|
||||||
|
this.pages = await navResp.json();
|
||||||
|
|
||||||
|
const bannerResp = await fetch('/assets/banner.json');
|
||||||
|
this.banner = await bannerResp.json();
|
||||||
|
},
|
||||||
|
toggleDarkMode() {
|
||||||
|
this.darkMode = !this.darkMode;
|
||||||
|
document.documentElement.classList.toggle('dark');
|
||||||
|
localStorage.theme = this.darkMode ? 'dark' : 'light';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function netStats() {
|
||||||
|
return {
|
||||||
|
weekly: [],
|
||||||
|
callsigns: [],
|
||||||
|
async load() {
|
||||||
|
const data = await fetch('/net/net.json').then(res => res.json());
|
||||||
|
this.weekly = data.weekly || [];
|
||||||
|
this.callsigns = data.callsigns || [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
18
net/net.json
Normal file
18
net/net.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"weekly": [
|
||||||
|
{ "date": "2025-06-06", "count": 12 },
|
||||||
|
{ "date": "2025-06-13", "count": 15 },
|
||||||
|
{ "date": "2025-06-20", "count": 9 },
|
||||||
|
{ "date": "2025-06-27", "count": 17 }
|
||||||
|
],
|
||||||
|
"callsigns": [
|
||||||
|
"KD7XYZ",
|
||||||
|
"N0CALL",
|
||||||
|
"KI7ABC",
|
||||||
|
"W7BYU",
|
||||||
|
"KJ7DEF",
|
||||||
|
"KA6TST",
|
||||||
|
"W1RAD",
|
||||||
|
"KN7HAM"
|
||||||
|
]
|
||||||
|
}
|
Reference in New Issue
Block a user