Compare commits

..

2 commits

Author SHA1 Message Date
047fc545ae add moderator list, create guild link 2026-06-04 11:16:55 +02:00
50c0c7d865 add ColorThemeSelect 2026-03-21 13:13:21 +01:00
10 changed files with 131 additions and 9 deletions

View file

@ -1,7 +1,7 @@
{ {
"name": "@yusurko/vigil", "name": "@yusurko/vigil",
"private": true, "private": true,
"version": "0.1.0-dev62", "version": "0.1.0-dev74",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite dev", "dev": "vite dev",

View file

@ -4,7 +4,7 @@ let { narrow = false, small = false, children } : { narrow?: boolean, small ?: b
</script> </script>
<div class="centered" class:narrow={narrow} class:small={small}> <div class="centered" class:narrow={narrow} class:small={small}>
{@render children () } {@render children() }
</div> </div>
<style> <style>

View file

@ -0,0 +1,59 @@
<script lang="ts">
import { getColorThemeCode, setColorThemeCode } from "./globals.svelte";
let color_values = [
{name: "Default"},
{name: "Rei"},
{name: "Ai"},
{name: "Aqua"},
{name: "Neru"},
{name: "Gumi"},
{name: "Emu"},
{name: "Spacegray"},
{name: "Haku"},
{name: "Miku"},
{name: "Defoko"},
{name: "Kaito"},
{name: "Meiko"},
{name: "WhatsApp"},
{name: "Teto"},
{name: "Ruby"}
];
// NOT AFFILIATED with the following:
// Oshi No Ko right holders, TwinDrill, Crypton Future Media or Meta Platforms!!
let { value = $bindable(0) } = $props();
$effect(() => {
if (+value !== getColorThemeCode()) {
setColorThemeCode(value);
}
})
</script>
<ul class="grid">
{#each color_values as {name: cname}, cval}
<li>
<label>
<input type="radio" name="color_theme" value={cval} checked={value == cval} onclick={() => {
value = cval;
}} />
<span class="color-nugget" style:--color={`var(--c${+cval}-accent)`}></span>
<span>{cname}</span>
</label>
</li>
{/each}
</ul>
<style>
.color-nugget {
display: inline-block;
height: 1em;
width: 1em;
border-radius: 1em;
background-color: var(--color);
border: 1px solid var(--color, var(--border));
}
</style>

View file

@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import { RiCompassLine, RiHome2Line, RiSettings2Line, RiShieldStarLine, RiUserLine } from 'svelte-remixicon'; import { RiCompassLine, RiHome2Line, RiSettings2Line, RiShieldStarLine, RiAddBoxLine, RiUserLine } from 'svelte-remixicon';
import MenuLink from './MenuLink.svelte'; import MenuLink from './MenuLink.svelte';
let { user = null } = $props(); let { user = null } = $props();
@ -11,6 +11,9 @@
<MenuLink href="/settings" icon={RiSettings2Line} label="Settings" /> <MenuLink href="/settings" icon={RiSettings2Line} label="Settings" />
{#if user} {#if user}
<MenuLink href="/@{user.username}" icon={RiUserLine} label="My profile" /> <MenuLink href="/@{user.username}" icon={RiUserLine} label="My profile" />
{#if true}
<MenuLink href="/createguild" icon={RiAddBoxLine} label="Create guild" />
{/if}
{#if user.badges && user.badges.indexOf('administrator') >= 0} {#if user.badges && user.badges.indexOf('administrator') >= 0}
<MenuLink href="/admin/" icon={RiShieldStarLine} label="Administration" /> <MenuLink href="/admin/" icon={RiShieldStarLine} label="Administration" />
{/if} {/if}

View file

@ -0,0 +1,33 @@
<script lang="ts">
import { RiShieldStarLine } from "svelte-remixicon";
import AsideCard from "./AsideCard.svelte";
import Centered from "./Centered.svelte";
import { getMe } from "./globals.svelte";
import Wip from "./Wip.svelte";
let { guildName, mods } = $props();
let me = getMe();
</script>
{#if me && mods}
{#if mods.banned}
<Centered>Moderator list is hidden because you are banned.</Centered>
{:else if mods.unmoderated}
<Centered>+{guildName} is currently unmoderated</Centered>
{:else}
<AsideCard title={`Moderators of +${guildName}`}>
<ul>
{#each mods.has as mod}
<li>
@{mod.username}
{#if mod.is_owner}
<span><RiShieldStarLine/> <small>Owner</small></span>
{/if}
</li>
{/each}
</ul>
</AsideCard>
{/if}
{/if}

View file

@ -65,6 +65,10 @@ export function getColorThemeCode (): number {
return health.color_theme; return health.color_theme;
} }
export function setColorThemeCode(value: number) {
health.color_theme = value;
}
export function isLoaded(): boolean { export function isLoaded(): boolean {
return health.loaded; return health.loaded;
} }

View file

@ -1,12 +1,15 @@
<script lang="ts"> <script lang="ts">
import type { GuildEntry, PostEntry } from "$lib/backend"; import type { GuildEntry, PostEntry } from "$lib/backend";
import Feed from "$lib/Feed.svelte"; import Feed from "$lib/Feed.svelte";
import { getMe } from "$lib/globals.svelte";
import GuildAbout from "$lib/GuildAbout.svelte"; import GuildAbout from "$lib/GuildAbout.svelte";
import GuildMenu from "$lib/GuildMenu.svelte"; import GuildMenu from "$lib/GuildMenu.svelte";
import ModeratorList from "$lib/ModeratorList.svelte";
import SLayout from "$lib/SLayout.svelte"; import SLayout from "$lib/SLayout.svelte";
let { data } : { data: { guild: GuildEntry , feed: PostEntry[] } } = $props(); let { data } : { data: { guild: GuildEntry , feed: PostEntry[], mods: any } } = $props();
let { guild, feed = [] } = $derived(data); let { guild, feed = [], mods = null } = $derived(data);
let me = getMe();
</script> </script>
@ -19,5 +22,9 @@
{#snippet right()} {#snippet right()}
<GuildAbout {guild} /> <GuildAbout {guild} />
{#if me}
<ModeratorList guildName={guild.name} {mods} />
{/if}
{/snippet} {/snippet}
</SLayout> </SLayout>

View file

@ -25,7 +25,14 @@ export async function load(event) {
if (!guild) error(404); if (!guild) error(404);
return { guild, feed }; let mods = null;
const respMods = await backend.withEvent(event).fetch('guild/@' + encodeURIComponent(name) + '/mods');
if (respMods.status === 200) {
const respModsJ = await respMods.json();
mods = respModsJ;
}
return { guild, feed, mods };
} }
catch (e) { catch (e) {
console.error(e); console.error(e);

View file

@ -16,6 +16,6 @@ let { children } = $props();
</ul> </ul>
{/snippet} {/snippet}
{#snippet right()} {#snippet right()}
<button class="primary card">Save</button> <button class="primary card" disabled>Save</button>
{/snippet} {/snippet}
</SLayout> </SLayout>

View file

@ -1,2 +1,11 @@
<script lang="ts">
import ColorThemeSelect from "$lib/ColorThemeSelect.svelte";
import { getColorThemeCode } from "$lib/globals.svelte";
TODO let color_theme = $state(getColorThemeCode());
</script>
<section>
<h2>Color theme</h2>
<ColorThemeSelect bind:value={color_theme} />
</section>