Browse Source

Profile settings

master
Nuša Pukšič 6 months ago committed by buttercat1791
parent
commit
1fd2bea1c4
  1. 12
      src/lib/a/nav/ANavbar.svelte
  2. 25
      src/lib/a/primitives/AThemeToggleMini.svelte
  3. 6
      src/lib/a/reader/ATechToggle.svelte
  4. 14
      src/lib/components/util/Profile.svelte
  5. 2
      src/lib/stores/themeStore.ts
  6. 19
      src/routes/profile/+page.svelte

12
src/lib/a/nav/ANavbar.svelte

@ -11,7 +11,6 @@
import Profile from "$components/util/Profile.svelte"; import Profile from "$components/util/Profile.svelte";
import { ChevronDownOutline } from "flowbite-svelte-icons"; import { ChevronDownOutline } from "flowbite-svelte-icons";
import { AThemeToggleMini } from "$lib/a";
let menu2 = [ let menu2 = [
{ name: 'Publications', href: '/', help: 'Browse publications' }, { name: 'Publications', href: '/', help: 'Browse publications' },
@ -29,12 +28,12 @@
</script> </script>
<Navbar id="navi" class="fixed start-0 top-0 z-50 flex flex-row bg-primary-50 dark:bg-primary-800" <Navbar id="navi" class="fixed start-0 top-0 z-50 flex flex-row bg-primary-50 dark:bg-primary-1000"
navContainerClass="flex-row items-center !p-0"> navContainerClass="flex-row items-center !p-0">
<NavBrand href="/"> <NavBrand href="/">
<div class="flex flex-col"> <div class="flex flex-col">
<h1 class="text-2xl font-bold mb-0">Alexandria</h1> <h1 class="text-2xl font-bold mb-0 dark:text-primary-100 hover:dark:text-highlight">Alexandria</h1>
<p class="text-xs font-semibold tracking-wide max-sm:max-w-[11rem] mb-0">READ THE ORIGINAL. MAKE CONNECTIONS. CULTIVATE KNOWLEDGE.</p> <p class="text-xs font-semibold tracking-wide max-sm:max-w-[11rem] mb-0 dark:text-primary-200 ">READ THE ORIGINAL. MAKE CONNECTIONS. CULTIVATE KNOWLEDGE.</p>
</div> </div>
</NavBrand> </NavBrand>
<div class="flex md:order-2"> <div class="flex md:order-2">
@ -53,9 +52,6 @@
</a> </a>
{/snippet} {/snippet}
</MegaMenu> </MegaMenu>
<NavLi> <DarkMode />
<AThemeToggleMini />
</NavLi>
<DarkMode />
</NavUl> </NavUl>
</Navbar> </Navbar>

25
src/lib/a/primitives/AThemeToggleMini.svelte

@ -1,19 +1,28 @@
<script lang="ts"> <script lang="ts">
import { ChevronDownOutline } from "flowbite-svelte-icons"; import { ChevronDownOutline } from "flowbite-svelte-icons";
import { Dropdown, DropdownGroup, NavLi, Radio } from "flowbite-svelte"; import { Button, Dropdown, DropdownGroup, Radio } from "flowbite-svelte";
import { onMount } from "svelte";
import { setTheme, theme as themeStore } from "$lib/stores/themeStore";
let theme = $state('papyrus'); // e.g. 'ocean' or '' for default let theme = $state<string>("light");
const apply = () => document.documentElement.setAttribute('data-theme', theme);
$effect(apply); onMount(() => {
return themeStore.subscribe((v) => (theme = String(v)));
});
// Persist and apply whenever the selection changes
$effect(() => {
setTheme(theme);
});
</script> </script>
<NavLi> <Button>
Theme {theme}<ChevronDownOutline class="text-primary-800 ms-2 inline h-6 w-6 dark:text-white" /> Theme {theme}<ChevronDownOutline class="ms-2 inline h-6 w-6" />
</NavLi> </Button>
<Dropdown simple class="w-44"> <Dropdown simple class="w-44">
<DropdownGroup class="space-y-3 p-3"> <DropdownGroup class="space-y-3 p-3">
<li> <li>
<Radio name="group1" bind:group={theme} value="papyrus">Papyrus</Radio> <Radio name="group1" bind:group={theme} value="light">Light</Radio>
</li> </li>
<li> <li>
<Radio name="group1" bind:group={theme} value="ocean">Ocean</Radio> <Radio name="group1" bind:group={theme} value="ocean">Ocean</Radio>

6
src/lib/a/reader/ATechToggle.svelte

@ -1,11 +1,11 @@
<script lang="ts"> <script lang="ts">
import { showTech } from '$lib/stores/techStore.ts'; import { showTech } from '$lib/stores/techStore.ts';
import { Toggle } from "flowbite-svelte"; import { Toggle, P } from "flowbite-svelte";
let label = 'Show technical details'; let label = 'Show technical details';
$: checked = $showTech; $: checked = $showTech;
</script> </script>
<div class="inline-flex items-center gap-2 select-none"> <div class="inline-flex items-center gap-2 select-none my-3">
<Toggle {checked} ontoggle={() => $showTech = checked} aria-label={label} /> <Toggle {checked} ontoggle={() => $showTech = checked} aria-label={label} />
<span class="text-sm">{label}</span> <P class="text-sm">{label}</P>
</div> </div>

14
src/lib/components/util/Profile.svelte

@ -2,7 +2,7 @@
import CopyToClipboard from "$components/util/CopyToClipboard.svelte"; import CopyToClipboard from "$components/util/CopyToClipboard.svelte";
import NetworkStatus from "$components/NetworkStatus.svelte"; import NetworkStatus from "$components/NetworkStatus.svelte";
import { loginWithAmber, loginWithExtension, loginWithNpub, logoutUser, userStore } from "$lib/stores/userStore"; import { loginWithAmber, loginWithExtension, loginWithNpub, logoutUser, userStore } from "$lib/stores/userStore";
import { Avatar, Dropdown, DropdownGroup, DropdownHeader, DropdownItem } from "flowbite-svelte"; import { Avatar, Dropdown, DropdownGroup, DropdownHeader, DropdownItem, P } from "flowbite-svelte";
import { Book, Globe, Loader, Smartphone } from "@lucide/svelte"; import { Book, Globe, Loader, Smartphone } from "@lucide/svelte";
import { get } from "svelte/store"; import { get } from "svelte/store";
import { goto } from "$app/navigation"; import { goto } from "$app/navigation";
@ -414,16 +414,14 @@
</span> </span>
</DropdownItem> </DropdownItem>
{#if result} {#if result}
<DropdownHeader> <DropdownHeader class="flex gap-3">
<div <P class="text-xs">
class="absolute right-0 top-10 z-50 bg-gray-100 p-3 rounded text-sm break-words whitespace-pre-line max-w-lg shadow-lg border border-gray-300" {result}
> </P>
{result}
<button <button
class="ml-2 text-gray-500 hover:text-gray-700" class="inline ml-2 text-gray-500 hover:text-gray-700"
onclick={() => (result = null)}>✖</button onclick={() => (result = null)}>✖</button
> >
</div>
</DropdownHeader> </DropdownHeader>
{/if} {/if}
</DropdownGroup> </DropdownGroup>

2
src/lib/stores/themeStore.ts

@ -1,6 +1,6 @@
import { writable } from 'svelte/store'; import { writable } from 'svelte/store';
const KEY = 'theme'; const KEY = 'alexandria/theme';
const initial = const initial =
(typeof localStorage !== 'undefined' && localStorage.getItem(KEY)) || (typeof localStorage !== 'undefined' && localStorage.getItem(KEY)) ||

19
src/routes/profile/+page.svelte

@ -1,11 +1,13 @@
<script lang="ts"> <script lang="ts">
import { AAlert, AProfilePreview } from "$lib/a"; import { AAlert, AProfilePreview, AThemeToggleMini } from "$lib/a";
import CommentBox from "$lib/components/CommentBox.svelte"; import CommentBox from "$lib/components/CommentBox.svelte";
import CommentViewer from "$lib/components/CommentViewer.svelte"; import CommentViewer from "$lib/components/CommentViewer.svelte";
import { userStore } from "$lib/stores/userStore"; import { userStore } from "$lib/stores/userStore";
import { getUserMetadata } from "$lib/utils/nostrUtils"; import { getUserMetadata } from "$lib/utils/nostrUtils";
import type { NDKEvent } from "$lib/utils/nostrUtils"; import type { NDKEvent } from "$lib/utils/nostrUtils";
import { getNdkContext } from "$lib/ndk.ts"; import { getNdkContext } from "$lib/ndk.ts";
import { Heading } from "flowbite-svelte";
import ATechToggle from "$lib/a/reader/ATechToggle.svelte";
// State // State
let user = $state($userStore); let user = $state($userStore);
@ -82,6 +84,21 @@
<div class="flex flex-col w-full max-w-5xl my-6 px-4 mx-auto gap-6"> <div class="flex flex-col w-full max-w-5xl my-6 px-4 mx-auto gap-6">
<AProfilePreview user={user} profile={profile} loading={loading} error={error} isOwn={!!user?.signedIn && (!profileEvent?.pubkey || profileEvent.pubkey === user.pubkey)} /> <AProfilePreview user={user} profile={profile} loading={loading} error={error} isOwn={!!user?.signedIn && (!profileEvent?.pubkey || profileEvent.pubkey === user.pubkey)} />
<div class="mt-6">
<Heading tag="h3" class="h-leather mb-4">
Settings
</Heading>
<!-- Theme and tech settings -->
<ul>
<li>
<ATechToggle />
</li>
<li>
<AThemeToggleMini />
</li>
</ul>
</div>
{#if profileEvent} {#if profileEvent}
<div class="main-leather flex flex-col space-y-6"> <div class="main-leather flex flex-col space-y-6">
<CommentViewer event={profileEvent} /> <CommentViewer event={profileEvent} />

Loading…
Cancel
Save